流沙河鎮

情報技術系のこと書きます。

VOICEVOXとChatGPT(Whisper API)を組み合わせて、「自律的に考える」ずんだもんと会話する(WSL2環境)

概要

kmizuさん作のgpt-voice-chatを使って、Whisper APIとChatGPTにVOICEVOXを統合してずんだもんと音声で会話してみました。同ソフトはまだ概念実証的な段階で、動かすためにはコードを弄りながら調整が必要です。一方でChatGPTによって「魂」を与えられたずんだもんとの会話はとても刺激的で、未来を感じさせるものでした。この体験を多くの人に共有したいので、WSL2環境で動かした時のメモを残しておきます。

どんなことが出来るのか、まずはこちらの動画のデモを見てください。

ここでは以下の流れで「会話」が実現しています。

  1. 私の声がWhisper APIへ入力され、文字起こしが返ってくる
  2. 文字起こし結果がChat GPT APIへ入力され、返答が返ってくる
  3. 返答がVOICEVOX Engine のAPIへ入力され、音声起こしが返ってくる
  4. 音声起こし結果が再生される

図にするとこんなイメージです。

Chat GPTに比べるとWhisperはまだ知られていないかもしれませんが、Open AIが開発した音声認識モデルで、こちらもAPI利用が可能です。
whisperapi.com
調べるとChat GPT + Whisper + VOICEVOXの組み合わせには様々な方々がアプローチしているようです。

この仕組みを色んなものに統合して、生成モデルにキャラクラーの性格をうまいこと色付けすればキャラクターが身近にいる生活を相当なリアリティで再現できそうです。夢の世界が目の前まで来てるなと。本格的に特定のキャラクターに寄せるには独自にチューニングしたモデルを用意する必要がありそうですが、取り急ぎChat GPTでも一人称や語尾などの設定情報を付加することで十分それらしい会話は可能です。
好きなキャラクターに囲まれて暮らす「楽園」を実現するためのパーツは既に出揃っていて、後はどれだけ情熱と工夫を注げるかだけの段階まで来ているように思えます。
元々大好きだったVOICEVOXですが、こういう切り口でも広がりのある世界なのだと再認識しました。何かしら作っていきたい。(GPT統合以外にもクラウド対応とか)

環境

Host OS
$ver
Microsoft Windows [Version 10.0.22621.1413]

(実は今回WSLでVOICEVOX(GUIアプリケーション)を動かすのと、簡単に音声入力/出力を扱うのにWSLgを使うためにWin11に上げました。ただ、VOICEVOX Engineのサーバサイド単体でも動かせるっぽいのでWSLg不要かも...)
github.com

WSL2
$wsl -l -v
  NAME                    STATE           VERSION
* Ubuntu-20.04            Running         2

このUbuntuに以下をインストールしてあります

  • openjdk 17.0.6 2023-01-17
  • sbt 1.8.0(以下を参考にインストール)

sbt Reference Manual — sbt のインストール

  • VOICEVOX Linux 版 0.14.5

手順メモ

gpt-voice-chat/Main.scala at 3944c2d76d285257a642eb7682e028a85e9dd1ff · kmizu/gpt-voice-chat · GitHub

  • VOICEVOX Linux 版を立ち上げておく
  • ChatGPT のAPI Tokenをメモする

以下から確認できます。

  • gpt-voice-chatをcloneしたフォルダ直下に、メモしたAPIキーを記した[api_key.txt]ファイルを作る。
~/gpt-voice-chat$ cat api_key.txt
[API Key]
  • 同じくgpt-voice-chatをcloneしたフォルダ直下に、空ファイル[profile.txt]を作る。(取り敢えず動かす分にはprofile.txt自体不要なので、Main.scalaを弄ってつぶしてもよい)

gpt-voice-chat/Main.scala at master · kmizu/gpt-voice-chat · GitHub

  • wsl側のcurl&VOICEVOXを使用する場合、VOICEVOXTalker.generateVoiceOnWindows()を使ってほしくないので、以下ファイルの分岐から[ || osVersion.contains("wsl")]を消します。(雑)
    val succeed: Boolean = if(os.contains("windows")/* linuxへ流したいので消す*/ || osVersion.contains("wsl") /*ここまで*/) {
      generateVoiceOnWindows(encodedAnswer, output)
    } else if (os.contains("linux")) {
      generateVoiceOnLinux(encodedAnswer, output)
    }

gpt-voice-chat/VOICEVOXTalker.scala at master · kmizu/gpt-voice-chat · GitHub
ホスト側のWindowsで動いているVOICEVOXが使えれば望ましいのですが、以下の事情で利用しませんでした。
・wslからホスト側のWindowslocalhost(VOICEVOX)に何故かcURLが打てない
(【WSL2】WSL2側からホストのlocalhostで立っているAPIサーバーのAPIをcURLで叩く方法 - Qiitaのようにwsl側のIPアドレスを調べてそこへcURL打つようにしたのですが、VOICEVOXから反応がなくタイムアウトしました。アプリ側でlocalhostからしか叩けないようにしている??)
・筆者の不勉強によりWindows側のコマンドラインcURLの仕組みがよく分からない

  • gpt-voice-chatをcloneしたフォルダで以下コマンドを実行。これによってsbtがビルドと実行をやってくれます。
:~/gpt-voice-chat$ sbt "run voicevox"

ダブルクウォートのrun以降でargsを渡せるので、そこでエンジンとしてvoicevoxを指定しています。(voicepeakも選べます)

  • 以下のプロンプトが出てくるので、2のcom.github.kmizu.gpt_voice_chat.Mainを選びます。(Gui版はまだ試してません)
:~/gpt-voice-chat$ sbt "run voicevox"
[info] welcome to sbt 1.8.0 (Eclipse Adoptium Java 17.0.6)
[info] loading project definition from /home/hikitan/gpt-voice-chat/project
[info] loading settings for project root from build.sbt ...
[info] set current project to gpt-voice-chat (in build file:/home/hikitan/gpt-voice-chat/)

Multiple main classes detected. Select one to run:
 [1] com.github.kmizu.gpt_voice_chat.GuiMain
 [2] com.github.kmizu.gpt_voice_chat.Main

Enter number:

  | => root / Compile / selectMainClass 38s

「チャット開始です」が表示されたらマイクから声を吹き込んでみましょう。VOICEVOXから反応が得られたら成功です。

[info] running com.github.kmizu.gpt_voice_chat.Main voicevox
チャット開始です

一先ずここまで来れば後は流れで動かせるのではないでしょうか(詰まった方&もっといいやり方あるよって方はご連絡ください~)

Tips

  • VOICEVOX側のspeaker(話し手)を変えたい場合は、VOICEVOXTalkerのspeakerIdを変えてやればよいです(ずんだもんはspeakerId=1)

gpt-voice-chat/src/main/scala/com/github/kmizu/gpt_voice_chat/VOICEVOXTalker.scala