最終更新: 2026年3月 · ソース: voice-call
エグゼクティブ音声インターフェース
OpenClaw 向けの音声会話インターフェース — ブラウザや電話から WebRTC で AI アシスタントと話す。完全ローカルの音声認識(Apple Silicon 上の MLX-Whisper)、無料 TTS(Edge-TTS)、OpenClaw OAuth 経由の Claude、セルフホスト LiveKit による音声ルーティング。
概要
voice-call は音声会話ループを提供します:ブラウザや電話が WebRTC で接続し、VAD が音声を検出し、Whisper がローカルで文字起こしし、Claude に送信され(OpenClaw OAuth 経由)、Edge-TTS が応答を合成してストリーミング返送します。Claude は会話中にエージェントツールを呼び出せます — ファイル読み取り、コマンド実行、メモリ検索、アクティブセッション一覧。STT パイプライン全体はデバイス上で実行され、音声データはローカルマシンから出ません。
目的
テキストインターフェースにはスクリーンとキーボードが必要です。音声はモバイル中・料理中・通勤中・タイピングが非現実的な状況でのハンズフリー操作を可能にします。明らかな解決策 — OpenAI Realtime API、Gemini Live — は音声をクラウドサーバーに送信し、AI アシスタントと機密プロジェクト・個人情報・未公開の作業について話す人にはプライバシーの懸念があります。
このモジュールは STT パイプライン全体を完全にローカルに保ちます。MLX-Whisper large-v3-mlx-4bit は Apple Silicon 上でリアルタイムより高速に動作します — 10 秒の発話が 1 秒未満で文字起こしされます。文字起こし済みテキスト(とツール結果)のみが Anthropic API に送信されます。発話した言葉はマシンを離れません。
アーキテクチャ
LiveKit を通じて接続された 4 つのレイヤー:
1. 音声トランスポート — LiveKit + WebRTC
LiveKit Server が WebRTC 音声ルーティングを処理します。ブラウザや電話はトークンサーバーへ WSS で接続し、LiveKit にプロキシされます。Tailscale は iOS Safari がどのネットワークからでも WebSocket 接続を受け入れられるよう、信頼された TLS 証明書を提供します。
2. 音声認識 — MLX-Whisper(ローカル)
Silero VAD が音声ストリームの音声を検出します。音声が終わると、STT モジュールが Apple Silicon 上でローカルに動作する Whisper large-v3-mlx-4bit で文字起こしします。外部 STT サービスに音声は送信されません。
3. LLM — OpenClaw OAuth 経由の Claude
LLM アダプターは OpenClaw の認証情報ストアから OAuth トークンを読み込みます — 別途 Anthropic API キーは不要です。Claude は会話中にエージェントツールを呼び出せます:ファイル読み取り、コマンド実行、メモリ検索、セッション一覧。
4. テキスト音声変換 — Edge-TTS(無料)
Microsoft Edge-TTS が応答を合成します — 無料、API キー不要 — そして LiveKit を通じて発信者に音声をストリーミング返送します。
ソースファイル:
| ファイル | 責務 |
|---|---|
| agent.py | メイン音声エージェントエントリーポイント — LiveKit エージェントループ |
| stt_mlx.py | MLX-Whisper large-v3-mlx-4bit を使用したカスタム STT プラグイン |
| llm_anthropic.py | LLM アダプター — OpenClaw OAuth 経由の Claude、ツール呼び出し付き |
| tts_edge.py | Microsoft Edge-TTS(無料)経由の TTS |
| tools.py | エージェントツール:read_file、run_command、search_memory、list_sessions、think_carefully |
| token_server.py | HTTPS サーバー + LiveKit への WSS プロキシ + JWT トークン生成 |
| gateway.py | OpenClaw Gateway WebSocket クライアント(デバイス ID 認証) |
| web/index.html | ブラウザ通話 UI |
音声会話中に利用可能なエージェントツール:
| ツール | 機能 |
|---|---|
| read_file | ローカルファイルシステムのファイルを読み取る(max_lines まで切り詰め) |
| run_command | 設定可能なタイムアウトでシェルコマンドを実行 |
| search_memory | qmd CLI 経由で OpenClaw メモリを検索 |
| list_sessions | Gateway WebSocket 経由でアクティブな OpenClaw セッションを一覧 |
主要な設計上の決定
ローカル STT — 音声はマシンを離れない
MLX-Whisper は Apple Silicon 上でリアルタイムより高速に動作します。プライバシー保証はアーキテクチャ的なものです:音声パイプラインが完全にローカルなため、発話コンテンツが漏洩する可能性のある API 呼び出しが存在しません。文字起こし済みテキストのみが Anthropic API に送信され、それもオペレーターがその点に問題がない場合のみです。
WebRTC に LiveKit — WebRTC を直接実装しない
WebRTC のシグナリング・ICE ネゴシエーション・コーデック処理は複雑です。LiveKit はマルチデバイスルーティング・再接続・音質管理を処理するプロダクショングレードの抽象化を提供します。代替案(生の WebRTC)は大幅に多くのインフラコードの保守が必要です。
Edge-TTS — 無料、キー不要、品質良好
Microsoft の Edge TTS エンドポイントは無料で自然に聞こえる音声を生成し、API キーや課金アカウントは不要です。トレードオフ:各応答で Microsoft のサーバーへのアウトバウンド接続が必要です。完全なエアギャップ使用では、オンデバイス TTS(Kokoro やシステム TTS など)に置き換えてください。
リモートアクセスに Tailscale — パブリックドメインなしの信頼された TLS
iOS Safari は WebSocket 接続に有効な TLS を要求します。ホームサーバーの Let's Encrypt 証明書を取得するには通常パブリックドメインが必要です。Tailscale Serve はトークンサーバーを Tailscale HTTPS エンドポイント(Tailscale DNS 名に発行された有効な Let's Encrypt 証明書を持つ)の背後にプロキシし、パブリックインターネットには何も公開しません。
JWT 通話リンク — 通話ごとの使い捨てトークン
各通話リンクは、1 人の参加者が 1 つの LiveKit ルームに参加することを承認する短命の署名済み JWT です。永続的なログインセッションはありません。リンクはオンデマンドで生成でき自動的に期限切れになるため、永続的な認証情報を作成せずに電話に通話リンクを共有するのが簡単です。
自分でビルドする方法
1. STT の前に VAD を使う — 連続音声を文字起こししない
音声アクティビティ検出(Silero VAD または WebRTC VAD)は誰かが話しているとき・話し終わったときを検出します。音声セグメントのみが Whisper に渡されます。VAD なしでは、無音を文字起こし(無駄)するか、ユーザーに話すためのボタン押下を求める(不便)ことになります。
2. Apple Silicon は MLX-Whisper、CUDA は faster-whisper、それ以外は API
MLX-Whisper は Apple Silicon 専用です。CUDA ハードウェアでは faster-whisper が同様のスループットを達成します。クラウドデプロイや GPU のないハードウェアでは API ベースの STT サービスを使用し、音声がデバイスを離れることを受け入れます。STT レイヤーを交換可能にしてください — アーキテクチャの残りは STT の選択から独立しています。
3. トークンサーバーパターン — LiveKit を内部に保つ
トークンサーバーは LiveKit ルームアクセス用の JWT トークンを生成し WebSocket 接続をプロキシする小さな HTTPS サーバーです。外部に公開される(Tailscale 経由)唯一のサービスです。LiveKit 自体は localhost で動作し、ブラウザから直接到達可能である必要はありません。
4. iOS Safari は有効な TLS を要求する — これを計画する
iOS の Safari は、ユーザーが手動で証明書を受け入れても、自己署名証明書を持つサーバーへの WebSocket 接続を拒否します。Tailscale Serve はこれをクリーンに解決します。Tailscale なしではパブリックドメインと Let's Encrypt が必要か、クラウドホスト上の有効な証明書を持つリバースプロキシが必要です。
5. コンテキスト継続性のためセッション開始時に MEMORY.md を注入する
音声会話はデフォルトでステートレスです — 各通話は新鮮に開始されます。進行中のプロジェクトとの継続性を保つため、各セッションのシステムプロンプト先頭にエージェントの MEMORY.md を注入してください。エージェントは毎回の通話冒頭で口頭でブリーフィングされることなく、アクティブなプロジェクトについての即座のコンテキストを持ちます。
よくある質問
音声の文字起こしはローカルで行われますか?
はい。MLX-Whisper は Apple Silicon Mac 上で完全に動作します — 音声は外部 STT サービスに送信されません。文字起こし済みテキスト(とツール結果)のみが Anthropic API に送信されます。
有料の Anthropic API キーが必要ですか?
いいえ。LLM アダプターは OpenClaw が管理する OAuth トークンで認証します。有効な Anthropic OAuth 認証情報を持つアクティブな OpenClaw セッションがある限り、別途 API キーは不要です。
自宅のネットワーク外でも動作しますか?
はい、Tailscale 経由で。起動スクリプトは Let's Encrypt 証明書付きの Tailscale DNS 名でトークンサーバーを公開するよう Tailscale Serve を設定します。Tailnet 内の任意のデバイスがどのネットワークからでも通話リンクを開けます。
Intel Mac や Linux でも動作しますか?
MLX-Whisper は Apple Silicon が必要です。Intel Mac や Linux では STT モジュールを別のプロバイダー(faster-whisper(CUDA)、システムレベル STT、または API ベースのサービス)に交換する必要があります。アーキテクチャの残り(LiveKit、Edge-TTS、トークンサーバー)はクロスプラットフォームです。
Authors: Qiushi Wu & Orange 🍊