どのくらい早いのかあまりまとまっていなかったので、調べた。
サマリ
- Realtime APIのLatency (ユーザーの発話終端〜アシスタントの発話始端) は平均1.26秒
Realtime APIの日本語会話における応答速度
- 前提
- 実行環境
- https://github.com/openai/openai-realtime-console
- 上記に修正を加えたものをM2 Macbook Airで検証
- 検証方法
- ユーザーの発話が終了してからクライアントサイドでアシスタントの音声が発話されるまでの時間を計測
- 実行環境
- 結果
- 平均1.26秒 (min: 1.13, max: 1.45, 10 sample)
- 内訳 (推定)
- 往路のネットワーク遅延: 150ms
- VAD (silence_duration_ms の default): 200ms
- speech-to-speech (最初の音声生成まで): 700ms
- 復路のネットワーク遅延: 150ms
- 備考
- system instructionの長さやturn数、通信速度にも依存するので参考程度
- なお、人間側の応答速度は同程度だったが、これは人間が会話行為時に相手とのリズムを合わせる癖があるためである。最短は0.1秒であった
Appendix: ローカルマシンでRealtime APIと同様のものを実現する方法
- 必要なモジュール
- VAD (ターン検出用途): SileroVAD
- ASR: whisper (whisper-large-v3-turbo 等)
- LLM: gemma-2-2b-jpn-it 等
- TTS: edge-tts, Style-Bert-VITS2等
- 完全にRealtime APIと同様のインターフェイスにする場合はwebsocket対応を別途行う必要がある
- 処理時間の目安
- VAD: 200ms
- ASR: 500 ms (リアルタイム処理を行ったときの処理遅延)
- LLM: 500ms (発話可能な1文の出力まで)
- TTS: 200 - 500ms
- 結論
- 相槌等の即時生成機構を考慮しない場合、現状ローカルマシンで日本語の音声対話だと 1400 ms 程度は可能
- 参考実装
-
https://github.com/ggerganov/whisper.cpp/tree/master/examples/talk-llama
- llama.cpp と whisper.cpp と 軽量 tts (edge-tts ライブラリのようなもの, MacのsayコマンドとWinのSpeechSynthesizerに対応) で構築されている
-
https://github.com/ggerganov/whisper.cpp/tree/master/examples/talk-llama
Appendix2: 気持ち良い会話体験のために
上記でも触れたように、人間の会話反応はとても速い。
まず発話の重複が多く、相槌等でのリズム的な応答もある。
速度に関して、リアルな人間に近づけるために重要なのは以下の二点である。
- 会話内容の予測
- 話者交替の予測
- 相槌の予測
会話内容の予測
会話の予測に関しては比較的改善しやすい。発話途中文から複数の会話完了文候補とそれに対する返答をあらかじめ生成し、かつ音声合成し、実際の発話と会話完了文候補との類似度を取ればよい。
上記に関しては以下の論文で詳しく検討されている。
大萩雅也、水本智也、吉川克正.「音声対話における応答速度改善に向けた先読み技術の検討」.言語処理学会 第30回年次大会 発表論文集
話者交替と相槌の予測
京大の井上さんのRealtime Voice Activity Projection (Realtime-VAP)が非常によいので特に言うことはありません (利用される場合はライセンスをよく読みましょう)