HNに表示: 500ms未満のレイテンシーを持つ音声エージェントをゼロから構築しました
45日前原文(www.ntik.me)
概要
- 世界最大級の消費財企業向けに、音声エージェントの自作パイプラインを構築した体験談
- 市販プラットフォーム(Vapi等)より2倍速い400ms台の応答速度を実現
- 音声エージェントの本質的な難しさと、ターンテイク制御の重要性を解説
- 地理的配置やモデル選定がレイテンシー削減の鍵であることを実証
- 実装例・設計図・GitHubリポジトリも公開
音声エージェント自作記:超低遅延パイプラインの構築と学び
- 半年間、大手消費財企業のために音声エージェントのプロトタイプを開発
- VapiやElevenLabsなどの市販音声エージェントSDKは便利だが、内部の複雑さを隠蔽
- GPT-5.3やClaude 4.6の登場、ElevenLabsの大型資金調達を受け、自作オーケストレーション層に挑戦
- 1日・約100ドルのAPI利用料でVapi相当の機能を2倍速で実現(約400msエンドツーエンド)
- 本稿では、音声エージェントの難易度・ターンテイク制御・STT/LLM/TTSのストリーミング連携・地理/モデル選定による最適化を解説
音声エージェントが難しい理由
- テキストチャット型エージェントはユーザー操作が明確なターン境界を作るため制御が容易
- 音声ではリアルタイムかつ連続的なオーケストレーションが必要
- システムは常に「話しているか、聞いているか」を判定し続ける必要
- 発話終了の検出が困難(間やノイズ、非言語音も多い)
- タイミングの僅かなズレが会話体験を大きく損なう
- 良質な音声エージェントは個々のモデル性能より、全体の協調制御が肝心
ターンテイク制御の基本設計
- 最初にChatGPTでアーキテクチャを反復設計し、頭の中で全体像を構築
- 音声エージェントは本質的に「話しているか/聞いているか」の2状態+2遷移のみ
- ユーザーが話し始めたら即時にエージェントの発話や生成を中断・バッファ削除
- ユーザーが話し終えたら即時応答生成・ストリーミング開始
- このターン検出ループが音声体験の核
VADと事前録音応答による初期実装
- FastAPIサーバー+Twilio WebSocketで8kHz音声ストリーム受信
- Silero VAD(軽量・2MB)で音声区間を検出
- シンプルな状態管理で話し終わり検出時に録音WAV再生、話し始めで即中断
- VADのみでも会話っぽさ・低遅延のベースラインを実現
VAD単独の限界
- 単なる音声検出では「発話完了」の判定が困難
- 間やゆっくり話すユーザーで早すぎる切り替え・割り込みが発生
- 実用的なターンテイクには**音声信号+意味的な判定(STT)**が不可欠
- VAD実装は制御フローの明確化と遅延ベースライン取得には有効
本格パイプラインへの進化:Fluxとリアル音声エージェント
- Deepgram FluxでストリーミングSTT+ターン検出を統合
- Fluxの「ターン開始/終了イベント」をトリガーにパイプラインを制御
- ユーザー発話終了時:
- トランスクリプト+履歴をLLMへ送信
- 最初のトークン到着と同時にTTSへストリーム転送
- TTS音声をTwilioへ即時送信
- **WebSocketの事前確立(TTS用)**で300ms近い遅延削減
- バージイン(割り込み)時も即時キャンセル・音声バッファ削除
- 以上で自然な会話体験・低遅延ストリーミングを実現
地理的配置とレイテンシーの実際
- ローカル(南トルコ)で検証:平均1.7秒の遅延(Vapi比2倍)
- Railway EUリージョンへデプロイ+全サービスEU配置
- 平均遅延690ms(Twilio加味で約790ms)
- 同条件のVapiより50ms高速
- 主観的にも応答性・割り込みの自然さが大幅向上
モデル選定と最適化
- OpenAI gpt-4o-mini利用から、Groq llama-3.3-70bへの切り替えで推論遅延3倍短縮
- **TTFT(First Tokenまでの時間)**が体験の鍵
- ストリーミング必須、逐次パイプラインは会話用途では破綻
成果とまとめ
- 400ms台のエンドツーエンド遅延(電話停止→最初の音節)を実現
- STT→LLM→TTSのストリーミング連携・即時割り込み対応
- VAD単独では不十分、意味的ターン検出が必須
- 地理的配置が最大の遅延要因、全サービスの近接配置が重要
- GitHubリポジトリ: https://github.com/NickTikhonov/shuo
- 著者のXアカウント: https://x.com/nick_tikhonov
付記:技術的ポイントまとめ
- 音声エージェントはターンテイク問題、単なる音声認識問題ではない
- VADのみでは限界、意味的なターン終了判定が不可欠
- 本質は「話す」vs「聞く」の1ループ+2遷移
- バージイン時の即時キャンセル・ターン終了時の即時応答が体験を決定
- STT→LLM→TTSは全てストリーミングで連携、逐次処理は非現実的
- TTFT(First Tokenまでの時間)が最重要
- 地理的配置が最大のレイテンシー要因、全サービスを同一リージョンに配置
- Groqの~80ms TTFTが大きなブレイクスルー
参考リポジトリ・SNS
- GitHub: https://github.com/NickTikhonov/shuo
- X (Twitter): https://x.com/nick_tikhonov