💬

Whisper+OpenAIで雑談AI的なものを作ろうとしたメモ

2023/01/16に公開

今まで実装中に詰まった部分をまさにつぶやきとして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

https://github.com/mallorbc/whisper_mic
ほぼこちらで行けた(ここ で知った)。

OpenAI API

https://beta.openai.com/docs/api-reference/introduction
設定パラメータに関しては本家docsや幾つかの記事を参考に、 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が別途公開されたらより効率的になりそうな予感。

他参考記事は注釈に。[5] [6] [7]


脚注
  1. PyAudio working, but spits out error messages each time ↩︎

  2. WSL2+Ubuntu 20.04環境から音声を出力する ↩︎

  3. Add the ability for WSL to have a soundcard driver #7327 ↩︎

  4. slackでずんだもんと話そう!(GPT-3.5によるキャラクター性をもった発話生成) ↩︎

  5. 声をPythonに聴かせて(マイクから入力した声をWhisperに、何度でも認識させよう) ↩︎

  6. 【Python】音声認識ライブラリのSpeechRecognitionでサクッと文字起こし ↩︎

  7. マイク入力をWhisperで音声認識 ↩︎

Discussion