Stable Diffusion webuiのAPIをJavaScriptから叩く

息子氏のゲーミングPCを拝借して、「Stable Diffusion Web UI Forge」を入れてみた。
APIもPythonからもサクッと使えてすごく楽しい!…だが、クライアントサイドJavaScriptからだと、お馴染みのCORS問題で跳ねらる!

ググった結果、ちゃんと起動オプションが用意されており、下記の2つを設定すればJavaScriptからもAPIが正常に使える様になった。

–cors-allow-origins
許可するIPを(複数ある場合はカンマ区切りで)指定すればOK。
ワイルドカードも使える。
–no-gradio-queue
WebページがWebSocketの代わりにhttpリクエストを使用するようにする。

結論

APIのみ利用の場合

--no-gradio-queue --nowebui --cors-allow-origins *

WebUIとAPIの両方を使う場合

--xformers --no-gradio-queue --listen --api --cors-allow-origins *

参考サイト

KerasモデルがTenserFlow.js用に保存できない問題

Python + TenserFlowで画像分類をやろうと、チュートリアルをシコシコ進めてた。

できあがった、KerasモデルをTenserFlow.js用に保存しようと思ったが、関数「save_keras_model」で下記のエラーが出てしまう….

Exception: Error dumping weights, duplicate weight name kernel

この原因は、まさかのTensertFlow現行版(2.16.1)のバグだった!!
2.15.0にダウングレードしたらすんなり動いた…

Duplicate weight problem #8246

勉強中だから自分のコードが悪いと思ってたぞ、コンチクショー!

Node.jsサーバでCROS対応

Node.jsのオレオレサーバ上のAPIをCROS対応させたくて調べたところ、Expressを使う前提の解説ばかりが出てくる。
めげずに調べたら、全く同じ悩みを持つ方が海外にいらっしゃった。

How to allow CORS with Node.js (without using Express)

これによると、下記の3行をヘッダ情報に追加すりゃ良いって事で、早速試したら問題なく動いた。

'Access-Control-Allow-Origin': '*', /* @dev First, read about security */
'Access-Control-Allow-Methods': 'OPTIONS, POST, GET',
'Access-Control-Max-Age': 2592000, // 30 days

pyttsx3がMacでエラーになる

PythonでText to Speechをやろうと思い「pyttsx3」をインストールしたが、エラーで動かない。
iMac + Python3.11だが、全く同じ問題に直面してた人がいた。

で、そのサイトによると “pyttsx3” ではなく “py3-tts“を入れると良いらしい。

pip install py3-tts

“py3-tts”は”pyttsx3″を動かすのに必要なものが色々追加されたパッケージっぽいので、”pyttsx3″が内包されている。
なので、使い方は”pyttsx3″と同じでOK。

お金とか色々気にせずに翻訳させたい!

Pythonから無料で気兼ねなく翻訳できる方法をいくつか調べてみた。

検証環境

MacBook Pro (16インチ, 2019)
プロセッサ:2.3GHz 8コア Intel Core i9
メモリ:16 GB 2667 MHz DDR4

Argos Translate

  • モデルデータをダウンロード済みならオフラインで動かせる
  • 軽量でレスポンスも早いが、精度はイマイチ
  • 日本語は英語にしか対応してない
  • 商用利用もOK(MIT-License)

FuguMT

解説通りにやっても動かない(モデルデータがダウンロードされない)ので、未検証

NLLB-200

  • モデルデータをダウンロード済みならオフラインで動かせる
  • 多言語対応
  • モデルが複数あるので環境に合ったモノを選べる
  • 商用利用不可(CC-BY-NC 4.0)

M2M-100

  • 上記NLLBのオープンソース版
  • モデルデータをダウンロード済みならオフラインで動かせる
  • 多言語対応
  • モデルが複数あるので環境に合ったモノを選べる
  • NLLB-200より少し精度は落ちる
  • 商用利用もOK(MIT-License)

みんなの自動翻訳@TexTra®

  • APIを叩く形式なので、オンライン環境は必須
  • 100近い言語に対応
  • 利用登録や申請などの面倒な手続き不要
  • 商用利用には、専用のライセンス契約が必要

…という事でインテルマックでも遅くない!オフラインでも動く!中国語対応!商用利用可!無料!と、目的が全て網羅された「M2M-100」を使ってみる。
なお、ラズパイ4でも動くらしいので、「Argos Translate」は再検証の予定!

Argos Translateでオフライン翻訳

Argos Translateを使えば、Pythonでオフライン翻訳ができると聞いたので、早速テストしてみた。

まずはモジュールのインストール

pip install argostranslate

GitのExampleにある様にスクリプト書けば動く。

import argostranslate.package
import argostranslate.translate

from_code = "jp"
to_code = "en"

# Download and install Argos Translate package
argostranslate.package.update_package_index()
available_packages = argostranslate.package.get_available_packages()
package_to_install = next(
    filter(
        lambda x: x.from_code == from_code and x.to_code == to_code, available_packages
    )
)
argostranslate.package.install_from_path(package_to_install.download())

# Translate
translatedText = argostranslate.translate.translate("こんにちは、世界!", from_code, to_code)
print(translatedText)

翻訳用のモデルは初回時にユーザーディレクトリに勝手にダウンロードされるのだが、これだと、いまいちファイルの取り回しがめんどくさい。

そこで、自分でダウンロードして、しかるべき場所に配置・管理する方法を調べてみた。

1.翻訳用のモデルをArgos open techからダウンロード
https://www.argosopentech.com/argospm/index/

2.とりあえず、和英と英和用のものを入手(translate-ja_en-1_1.argosmodel、translate-en_ja-1_1.argosmodel)し、スクリプトと同じ階層に配置

3.配置したモデルを利用する形にExampleスクリプトを改造。

import argostranslate.package
import argostranslate.translate

from_code = "jp"
to_code = "en"

jpen_model = "./translate-ja_en-1_1.argosmodel" #日>英用モデル
enjo_model = "./translate-en_ja-1_1.argosmodel" # 英>日用モデル

argostranslate.package.install_from_path(jpen_model)
argostranslate.package.install_from_path(enjo_model)

# Translate
translatedText = argostranslate.translate.translate("こんにちは、世界!", from_code, to_code)
print(translatedText)

長文の翻訳は厳しいし、実用的とはまだ言えないけど、遊ぶ分には問題ないし、お金を気にぜず使えるのは嬉しい!

GPT4AllをNode.jsから使ってみる

料金を気にしながら、遊び目的でChatGPTを使うのが微妙にストレスだったので、無料&ローカルでも動くGPT4Allを使ってみた。

グラボ非搭載の低スペックPCでも使える軽量チャットAI「GPT4ALL」の使い方まとめ

基本的にこの記事の通りやればサクッと動いた。2017年のインテルiMacでやり取りに数十秒かかるけど、とりあえず遊ぶ分には十分使えそう。

…ならば、Node.jsでも使いたい。

本サイトにTypeScriptから叩くやり方は書いてあったので、それを参考にやってみたら、簡単にできた!

作業環境

macOS Monterey(12.6.5)
Node.js v18.2

Node.jsの設定

  1. npmでGPT4Allをインストール
    npm install gpt4all
  2. とりあえず、簡単なサンプルスクリプトを実行。
    import { GPT4All } from 'gpt4all';
    
    let gpt4all = null;
    const _model = 'gpt4all-lora-quantized';
    
    /*GPT4ALL初期化*/
    const initGPT = async () => {
        gpt4all = new GPT4All(_model, true);
        await gpt4all.init();
        await gpt4all.open();
        console.log(">> GPT Opened");
        askGPT("Hello GPT!")
    }
    
    /*問い合せ実行*/
    const askGPT = async(xQstr) =>{
      console.log(xQstr);
      const xResponse = await gpt4all.prompt(xQstr);
      console.log(">>" + xResponse);
    }
    
    initGPT();

    初回はgpt4allの本体と学習済みモデル(gpt4all-lora-quantized)データがダウンロードされる。4G位あるので恐ろしく時間がかかけど、のんびり待つ。

  3. スクリプトがエラーになる場合、モジュールのimportが機能してない場合が多い。その場合は「package.json」に以下の一行を追加。
    "type":"module"
  4. こんな感じになれば、成功!
     % node sample.js
    >> GPT Opened
    Hello GPT!
    >>Thank you for your input, GPT!
  5. 別の学習済みモデルを利用したければ、ダウンロードして下記ディレクトリに入れ、newする時にモデル名を指定すれば使える。
    /Users/<ユーザー名>/.nomic/

これで、心置きなく、遊べる!!

Nexus5 をルート化してUbuntuを動かす

昔使ってたNexus5が出てきた。今は簡単にRoot化できるっぽいので遊んでみる。

Nexus5をルート化

下記のページ通りにやったら、簡単にできた。
Nexus5で遊ぶ その3: ルート化の準備 | メモ置場のブログ

もし失敗した場合は下記を参照して復旧。
【Nexus5】Nexus Root Toolkitを使ったプレ文鎮からの復旧方法-Gintoki Note

Linuxマシン化

1.必要のアプリをインストール

Linux Deplay で Ubuntuを入れる

下記サイトを参考にイントール。インストールされるUbuntuのヴァージョンは「18.04」。
Linux Deploy を使用して Android フォンに Ubuntu をインストールする方法 – Moyens I/O
LinuxDeployを使用してAndroidにLinuxをインストールする| Linux中毒者

Ubuntu の設定

Shellをzshに変更

下記サイトを参考にシェルをshからzshに変更
Ubuntuのシェルをzshに変更する – Qiita

必須ツールを設定

「nano」と「curl」をインストール

$sudo apt-get install nano

$sudo apt-get install curl

日本語化

下記サイトを参考にUbuntuで日本語を使える様にする。
Ubuntu 18.04 LTSを日本語化する(日本語環境にする) | 突撃なんでもチートシート

Sambaのインストール

下記サイトを参考にSambaをインストール。面倒くさいのでユーザーディレクトリを共有させる。
Sambaサーバーの設定手順(Ubuntu20.04)とWindowsからのアクセス方法 – 水瓶座列車

再起動コマンドはsudoでやらないと失敗する。

$ sudo service smbd restart
$ sudo service nmbd restart

Node.jsの設定

下記サイトを参考にNode.js環境を作成。管理ツールは「n」を利用。
Ubuntu18.04で任意のバージョンのNode.jsをインストールする方法 | トライフィールズ
Ubuntu18.04に最新のNode.jsをインストールする(アップデート方法も) – Pythonと!

「`GLIBC_2.28′ not found」となる場合は「17.9.1」以前のNode.jsを入れる。
nodeのv18を使ったらエラーになった(CentOS7) – ITのプロへ

Pythonの設定

Pythonは2と3が入ってるので、とりあえず、そのまま使ってみる。

M5Stack GRAYでUIFlowのBLE UARTを使う

M5Stack GRAY + UIFLowでも「BLE UART」パネルを使いたい!

前提

  • M5Stack GRAYはBluetooth対応
  • M5Stack GRAY用の最新ファームウェアはUIFlow v.1.9.6
  • UIFlow IDEではDeviceが「Fire」か「Core2」じゃないと「BLE UART」のパネルが出てこない!

手順

  1. M5Stack GRAYのファームウェアをUIFlow_Fire v1.7.5にする。
    ※v1.9.xだと、実行時にエラーが出る
  2. UIFlow IDEのDeviceはFireを選択

M5Stack用ジェスチャーユニットの値

M5Stack用ジェスチャーユニットを購入したが、各ジェスチャーに対応する値がどこにも書いてなかったので、自分で調べた結果のメモ。
販売サイトにはデフォルトジェスチャーとして9つ紹介されているが、その他にも4パターンが検知できる模様。

■無検知
None: 0

■基本動作
Up: 4
Down: 8
Right: 1
Left: 2
Forward: 32
Backward: 16

■回転動作
Clockwise: 64
Anti-Clockwise: 128

■連続動作
Wave: 256
Wave-Slowly-Left-Right: 3
Wave-Slowly-Up-Down: 12
Wave-Slowly-Forward-Backward: 48
Wave-Slowly-Disorder*: 512

*このモーションは検知できなかった。どういう動作を想定しているのか…