Whisper+OpenAIで雑談AI的なものを作ろうとしたメモ
今まで実装中に詰まった部分をまさにつぶやきとしてTwitterに垂れ流していたが、ここ最近その内容をChatGPTに対して打ち込みつつある。
それで作業が以前より捗るようになったので、これを手入力ではなくマイクで入力したら面白いのでは?と思い着手してみた。SF映画のサポートAIみたいなイメージ。
前提
実行環境
- OS: Windows 10 Home 22H2
- win ver: 10.0.19045.2486
- WSL ver: 1.0.3.0
環境メモ
後ほど言及するが動かすだけならLinux環境のほうが断然ラク。
自分の場合後々WhisperのGPU版を使いたかったが、GPUを挿したマシンがwinしか無かったためWSLで頑張った…という経緯。
実装
概要図
mermaid練習がてら。マイク取り込み + 文字起こしによる「私の質問/語りかけ」とそれをOpenAIに投げた返答としての「AIの回答/返事」という構図。
参照先
Whisper Mic
ここ で知った)。
ほぼこちらで行けた(OpenAI API
text-davinci-002
, text-davinci-003
辺りで実行。
実装部
こちらの mic.py
内でWhisperが検出した文章( = predicted_text
)を下記の get_openai_reply
に渡し、合わせて print()
することで会話しているかのようなログが出来上がる――のが理想だったが、まともに会話が成立するパラメータを見つけられなかったためいい感じのキャプチャも貼れず。
# sample settings
prompt_settings: dict = {
"engine": "text-davinci-002",
"max_tokens": 1024,
"n": 1,
"temperature": 0.5,
}
# openai.api_key設定済みのopenai
def make_prompt(prompt_settings: dict, prompt: str):
return openai.Completion.create(**prompt_settings)
def get_openai_reply(prompt: str) -> str:
completions = make_prompt(prompt_settings, prompt=prompt)
return completions["choices"][0]["text"].strip()
実装時メモ
ALSA lib pcm.c:2642:...
ログを止めたい
大量の stack overflowの記事[1] 内の alsa.conf
アプローチではうまくいかなかったため、 with noalsaerr():
アプローチで解決した。
WSL問題
若干沼ったのでメモ。
PS *** > wsl --version
WSLg バージョン: 1.0.47
とのことでWSLgは有効化されていたはずだが、私のWSL環境下だと、 mic.py
をそのまま実行してもWindows側のマイク情報を取得できず待機状態になってしまった。これについてはこちら[2] を参考にPulseAudioを設定したところ挙動が確認できた。
Ubuntuでも実行してみたがこの問題は起こらなかったため、WSL特有のものと思われる。
SpeechRecognition + WSLが面倒そうなので、SoundCardを使うルート[3] もあるかもしれない。
改良メモ
先んじて実現されている記事を見るに、あくまで文脈依存のモデルであることを考えるとキャラ設定や文脈情報を合わせて実行する必要がある模様[4]。
参考記事を元に好きなキャラクター設定ファイル.json(設定3行, セリフ3行程度)を幾つか作成し試してみたが、 "実行回によってはそれっぽくなる" くらいの感覚だった。
もちろんもっと情報を食わせればそれっぽさは上がっていくが、その分APIのトークン消費も激しくなるため注意。
まとめ
現時点ではOpenAPIのトークン単価次第という感覚。
「学習部(キャラ設定部)」と「発話部」を別々に設定可能なキャラBot特化APIが別途公開されたらより効率的になりそうな予感。
Discussion