17 ポイント 投稿者 GN⁺ 2025-05-06 | 2件のコメント | WhatsAppで共有
  • ブラウザのマイクを使って、AIと自然な音声会話をリアルタイムで行えるシステム
  • STT → LLM → TTS の流れで、ユーザーの音声をテキストに変換し、AIの応答を再び音声に変換して再生
  • 中核構成要素は FastAPIサーバー、WebSocketストリーミング、Podベースの音声処理モジュール、多様なLLMバックエンド
  • Dockerベースのデプロイ環境が提供され、GPU使用時にはさらに低遅延と性能向上が期待できる
  • ユーザー割り込み検知、モデル切り替え、音声選択など、高度な設定変更が可能な高いカスタマイズ性を提供

リアルタイムAI音声チャット

  • このプロジェクトは、リアルタイム双方向音声会話のために設計されたクライアント・サーバーアーキテクチャ
  • ユーザーはブラウザで話しかけ、AIは応答を音声で返す
  • 割り込み処理、部分的なテキスト応答表示、多様なTTS選択が可能

主な動作フロー

  1. 音声入力: ブラウザでユーザーの音声をキャプチャ
  2. ストリーミング送信: オーディオチャンクをWebSocket経由でPythonバックエンドへ送信
  3. 音声認識: RealtimeSTT が音声をテキストに変換
  4. LLM処理: テキストをLLMに渡して応答を生成
  5. 音声変換: RealtimeTTS が応答テキストを音声に変換
  6. 応答再生: 生成された音声をブラウザへ再度ストリーミング
  7. 割り込み検知: ユーザーの割り込み発話を自動検知して処理

主な機能

  • リアルタイム音声会話 および 部分文字起こし/応答プレビュー
  • 低遅延のためのオーディオチャンクベースのストリーミング
  • 静的/動的無音検知(turn detection) をサポート
  • 多様なLLMバックエンド: Ollamaを標準採用、OpenAIも選択可能
  • 複数のTTSエンジンをサポート: Kokoro, Coqui, Orpheus
  • Webインターフェースを提供: Web Audio APIベースのVanilla JS UI
  • Docker Composeベースのデプロイを提供

技術スタック

  • バックエンド: Python 3.x, FastAPI
  • フロントエンド: HTML, CSS, JavaScript (Web Audio API)
  • 通信: WebSockets
  • コンテナ化: Docker, Docker Compose
  • AI/MLライブラリ:
    • RealtimeSTT, RealtimeTTS, transformers, torch, torchaudio
    • ollama, openai
  • オーディオ処理: numpy, scipy

システム要件と推奨事項

  • OS: LinuxでのDocker利用を推奨 (GPU統合に有利)
  • Python 3.9+, CUDA 12.1以上対応のNVIDIA GPU を推奨
  • Docker使用時はNVIDIA Container Toolkitが必須
  • 必要に応じてOllamaまたはOpenAI API Keyの設定が必要

インストール方法

オプションA: Dockerインストール (推奨)

  1. リポジトリをクローン後、docker compose build を実行
  2. docker compose up -d でアプリとOllamaを起動
  3. 別途Ollamaモデルをダウンロード (例: docker compose exec ollama ollama pull ...)
  4. サービス停止: docker compose down
  5. 再起動: docker compose up -d

オプションB: 手動インストール

  1. Python venvを設定後、依存関係をインストール
  2. CUDAバージョンに合ったPyTorchを手動インストール
  3. server.py を実行してFastAPIサーバーを起動

実行方法

  • ブラウザで http://localhost:8000 にアクセス
  • マイク権限を許可して "Start" をクリック
  • "Stop" で終了、"Reset" で会話を初期化

設定変更ガイド

  • TTSエンジン/音声の変更: server.py, audio_module.py で修正
  • LLMモデル/バックエンドの変更: server.py, llm_module.py で設定
  • STTモデル/無音判定基準の変更: transcribe.py, turndetect.py
  • SSL設定可能: server.py でHTTPS利用有無および証明書を設定

ライセンス

  • MITライセンスのもとで公開
  • Coquiなどの外部エンジンには別ライセンスが適用される

2件のコメント

 
nicewook 2025-05-10

元のデモ動画が印象的です。

  1. 自然な会話になってほしいという願望がありましたが、この程度ならかなり満たされているように思います。
  2. 会話をしながらリアルタイムでテキストでも見たいと思っていましたが、この点も良いですね。
  3. AIが私の話を遮らず、十分に聞いてから話してくれると良いですね。たとえば、はっきりしないときは「話し終わった?」「私が話してもいい?」というふうに質問してから自分の会話を始める方式です。
  4. AIも人もお互いの話を遮らないように促す仕組みがあると良いですね
 
GN⁺ 2025-05-06
Hacker Newsのコメント
  • RealtimeVoiceChatを開発した理由は、ほとんどの音声AIインタラクションで遅延が満足できるものではなかったため。このシステムは、リアルタイムのローカル音声対話向けに設計されたオープンソースシステム

    • 自然な会話速度に近づけることが目標
    • WebSocketsによる音声チャンクのストリーミング、WhisperベースのRealtimeSTT、Coqui XTTSv2/KokoroのようなエンジンをサポートするRealtimeTTSを使用し、約500msの応答遅延を達成
    • Ollama経由で24B Mistralのような、より大きなローカルモデルを動かす場合でも可能
    • 主な特徴: ローカルLLMs向けに設計(主にOllama、OpenAIコネクタを含む)、会話の割り込みが可能、ユーザーの思考を遮らないためのスマートなターン検出、依存関係の管理を容易にするDockerizedセットアップを提供
    • STT/TTSモデルのため、性能を出すにはCUDA対応GPUが必要
    • アプローチ、性能、潜在的な最適化、あるいは優れたローカル音声AI体験に必須の機能についてフィードバックを聞きたい
    • コード: https://github.com/KoljaB/RealtimeVoiceChat
  • この種のツールのユーザーとして言うと、速くはあるが、自然に話すときの間を許容してくれない

    • 会話中、私たちは考えたり別の理由だったりで長い間や短い間を取る
    • こうしたツールでは、こちらが止まるとAIがすぐ話し始める
    • 数週間前にTwitterで、AIが人間が本当に話し終えるまで待つデモを見た。間の長さは問題にならなかった
    • これがどれほど複雑な問題なのかは分からない。おそらく別のAIが入力を分析して、それが単なる間なのかどうかを判断する必要があるのだと思う
  • とてもクール! 割り込み機能が「おおっ」となる瞬間だった(新しいものではないが、オープンソースでここまでうまく実装されているのを見るのは驚き)

    • 割り込み機能についての質問: "Mmk"、"Yes"、"Of course"、"咳" などはどう処理するのか気になる
    • OpenAIの音声チャットでのお世辞っぽさに加えて、ノイズでAIの応答が止まってしまい、うまく再開する方法がないのが嫌
    • すばやく応答を止めることと、適切な理由で止めることの両立は難しい問題
  • 約1年前にこのテーマを調査した。いくつか面白い事実を学んだ

    • 人間同士の会話では、話者間の中央値の遅延は0ミリ秒。つまり、およそ半分の時間では、一方の話者がもう一方の話者を遮るため、遅延は負になる
    • 人間は、既知のAIと会話するとき遅延を気にしない。AIには考える時間が必要だと仮定するから。ほとんどのユーザーは1000msの遅延を許容可能と見なし、500msの遅延は例外的に良いと感じる
    • すべての音声アシスタントには約300msの最小遅延がある。これは、いずれも無音検出を使って応答開始のタイミングを決めており、話者の通常の間と確実に区別するには約300msの無音が必要だから
    • Alexaには、ゆっくり話す人向けにこの待ち時間を長くする設定がある
    • このデモ動画では、AIが彼を遮らないことが分かる。これによって、人間とのインタラクションのようには感じられなくなっている(音声のぎこちない抑揚も含めて)
    • 人間は文をリアルタイムで処理し、文の意味を理解するのに十分な量を聞いたと確信した時点で応答する
  • 素晴らしい。ソースをざっと見たところ、作者がSilero VADの代わりにカスタムのターン検出戦略を実装しているのが興味深い。なぜそうしたのか、どんな利点があったのか気になる

    • 音声エージェント分野の現状に興味がある人向けに言うと、Daily(WebRTC企業)が優れたガイドと多くのユーティリティを含むオープンソースフレームワークを提供している
    • 参考までに、私はCartesiaで働いており、多くの音声エージェントのユースケースを提供している。Dailyは友人
  • LLMsは、より短い応答向けに調整されるべきだと感じ始めている。短い文を入力すると、長い段落のテキストを出力する

    • 良いテキストであることもあるが、すべての入力文にミニエッセイのような返答が必要なわけではない
    • とてもクールなプロジェクト。AIの会話の傾向を変えるためにプロンプトを微調整できるはず
  • 誰も言及していないのが驚き。人間のようにインタラクションし、十分なコンテキストがあると多くの場面でこちらを遮ってくる。非常に低い遅延がある

    • 初めて使ったときはかなり衝撃的な体験だった
  • かなり良い。SOTA音声に聞こえれば、さらにずっと良くなるはず

  • 印象的! 現在利用可能なオープンソースの中では最高の音声合成品質だと思う

    • 最終目標は、テキストトークンをまったく介さない、継続動作する波形対波形モデルになるだろう
  • 似たようなものを作っていたところで、これを見つけた。素晴らしい仕事。デモが気に入った