詳細や同意を得るための方法については vrchat_take_agreement.md
を参照願います。
VRChatに対話型 AIシステムを実装するためのリポジトリです。
- Windows 10 64bit
- Python 3.9
- Miniforge3 https://github.com/conda-forge/miniforge
- NVIDIA GeForce RTX Graphics card
- CMake https://cmake.org/download/
VB Cableなどを用いるとVRChat上にマイクを接続する行為を簡単にすることができます。
https://vb-audio.com/Cable/
依存関係をインストールします。
pip3 install torch torchvision torchaudio --extra-index-url https://download.pytorch.org/whl/cu117
pip install git+https://github.com/openai/whisper.git@main
このリポジトリをクローンし、プロジェクトのルートフォルダで次のコマンドを実行してください。
pip install .
OpenAIのAPIKEYをここから取得してください
取得したAPI KEYは data/API_KEY.txt
を作成しその中に書き込んでください。
次のコマンドを実行して、利用するスピーカとマイクを探します。
python -m vrchatbot audio-devices
- output
--- Microphones ---
Index: 0, Name: CABLE Output (VB-Audio Virtual Cable)
Index: 1, Name: ヘッドホン (Oculus Virtual Audio Device)
--- Speakers ---
Index: 0, Name: Name: CABLE Input (VB-Audio Virtual Cable)
Index: 1, Name: ヘッドホン (Oculus Virtual Audio Device)
使用するマイクとスピーカの名前をbotconfig.toml
の中の mic_index_or_name
およびspeaker_index_or_name
にしてしてください。Indexによる指定も可能ですが、よくその値は変更されるため名前による指定が望ましいです。
VRChatに実装する場合は、 マイクにループバックとしてスピーカーの名前を指定し、スピーカーにCABLE Input (VB-Audio Virtual Cable)
といった仮想オーディオインターフェースを指定すると良いでしょう。そしてVRChat上のマイクにCABLE Output (VB-Audio Virtual Cable)
などを指定することによって他のプレイヤーと対話できるようになります。
それでは実行してみましょう!
python -m vrchatbot run
- output
Setting up...
Ready.
Recongnized: <話した声>
Responce: <AIのレスポンス>
...
音声認識を使用せずに、テキストチャットのみも使用できます。
python -m vrchatbot chat
- output
Setting up...
Ready.
人間: こんばんわ
人工知能: 「こんばんわにゃあ」
人間: <入力待ち>
...
言語処理を行わず、音声認識モデルのみを使用することもできます。
python -m vrchatbot recognize
- output
Setting up...
Ready.
ja: 文字認識は始まっています。
ja: このようにして文字を認識できます。
...
このVRChat Botシステムを使用する際の詳細について以下に示します。
次のようなシーケンシャルな処理を行っています。この構造によって、再度音声認識が行われるタイミングはBotが話し終えてからとなります。
graph TD
A["Record Audio (until silence )"]
B[Recognize Speech]
C[Language Model]
D[Text2Speech]
E[Play Sound]
A --> |Audio| B
B --> |Input Text| C
C --> |Responce Text| D
D --> |Speech Data| E
E --> |roop| A
python -m vrchatbot <command> --option
という形式を用いて指定します。
- audio-devices
使用可能なスピーカーおよびマイクの名前を表示します。マイクの一覧にはループバックデバイスとしてスピーカーも表示されます。 - run
Botを起動します。 音声認識、対話、音声合成を行います。 - chat
テキストチャットのみのモードです。Botの受け答えを確認したい場合に用います。 - recognize
音声認識のみのモードです。音声が適切に認識されるかどうかを確認したい場合に用います。
-c
,--config_file_path
botconfig.toml
といった設定ファイルまでのパスを指定することができます。
デフォルトではこのリポジトリ内のbotconfig.toml
を読み込みます。--logdir
会話データや文字起こしをした結果を保存する場所です。デフォルトではこのリポジトリ内のdata/logs
に保存されます。
botconfig.tomlの代表的な設定項目について記述します。クラスの引数に対応している場合はその引数名に対応させる形で新たに追加することができます。
- Note: デフォルトの
botconfig.toml
を複製して使用することを推奨します。 仕様変更に伴ってリモートリポジトリに上書きされる恐れがあるためです。
このレコーダークラスは一定上の音量を検知すると録音をはじめ、行って時間無音を検知すると録音を終了します。
この設定項目はrecorder.pyのRecorderクラスの引数に対応しています。
-
mic_index_or_name
マイクの名前またはインデックスを指定します。これをコメントアウトするとデフォルトのマイクデバイスを使用します。 -
buffer_size
一度に録音する音声のサンプルサイズです。 -
silence_duration_for_stop
このRecorderは一定時間の無音を検知すると録音を終了し、文字起こし処理に移ります。
その際の無音の長さを秒数で指定します。 -
volume_threshold
無音と判別する際のボリューム値です。この値以下の音量は無音と判別されます。
最大値は1.0, 最小値は0.0です。 -
max_recording_duration
一度に録音する最大の長さです。秒数で指定します。Whisperで一度に認識可能な最大の長さは30秒です。
この設定項目はspeech_recognition.pyのSpeechRecongitionクラスの引数に対応しています。
-
model_name
base
やlarge
といった音声認識モデル Whisperのモデルを選択します。選択可能な項目はWhisperのドキュメントを参照願います。 https://github.com/openai/whisper#available-models-and-languages -
device
音声認識モデルを実行するローカルデバイスを指定します。
whisper.DecodingOptions
の引数です。設定可能な項目はWhisperのドキュメントを参照願います。
https://github.com/openai/whisper/blob/main/whisper/decoding.py#L72
OpenAI GPTのAPIと連携をとります。詳細はOpenAI GPTの公式ドキュメントを参照願います。https://beta.openai.com/docs/guides/completion
この設定項目はchatbot.pyのChatBotクラスの引数に対応しています。
-
api_key_file_path
API Keyを保存するファイルまでのパスです。 -
max_tokens
Chat Botのレスポンスの最大トークン数です。 -
free_tokens_for_user
ChatBotユーザーの入力テキストの最大トークン数です。 -
max_receptive_tokens
全ての会話履歴を合わせて、一度に処理可能な最大のトークン数です。 OpenAI のテキストエンジンによってこの最大数は変化します。
https://beta.openai.com/docs/models/overview -
behaviour_prompt
ChatBotの振る舞いを決定します。サンプルの設定ファイルを参考にしてください。 -
human_name
対話システム中の仮の人間の名前です。behaviour_promptの人間の名前と一致させてください。 -
ai_name
対話システム中の仮の人工知能の名前です。behaviour_promptの人工知能の名前と一致させてください。 -
stop
GPTの生成を止める停止ワードです。
これを正しく指定することによってGPTが人工知能側だけの会話文書を生成できるようになります。
この設定項目はtext_speaker.pyのTextSpeakerクラスの引数に対応しています。
- speaker_index_or_name
スピーカーの名前またはインデックスを指定します。これをコメントアウトするとデフォルトのデバイスを使用します。