Nodes and media
会話モード
Talkモードには2つの実行時形態があります。
- ネイティブのmacOS/iOS/Android Talkは、ローカル音声認識、Gatewayチャット、
talk.speakTTSを使用します。ノードはtalk機能をアドバタイズし、対応するtalk.*コマンドを宣言します。 - ブラウザーTalkは、クライアント所有の
webrtcおよびprovider-websocketセッションにはtalk.client.createを使用し、Gateway所有のgateway-relayセッションにはtalk.session.createを使用します。managed-roomはGatewayハンドオフとトランシーバールーム用に予約されています。 - 文字起こし専用クライアントは、アシスタントの音声応答なしでキャプションやディクテーションが必要な場合に、
talk.session.create({ mode: "transcription", transport: "gateway-relay", brain: "none" })を使用し、その後talk.session.appendAudio、talk.session.cancelTurn、talk.session.closeを使用します。
ネイティブTalkは継続的な音声会話ループです。
- 音声を聞き取る
- アクティブセッションを通じて文字起こしをモデルに送信する
- 応答を待つ
- 設定されたTalkプロバイダー(
talk.speak)経由で読み上げる
ブラウザーのリアルタイムTalkは、プロバイダーのツール呼び出しをtalk.client.toolCall経由で転送します。ブラウザークライアントは、リアルタイム相談でchat.sendを直接呼び出しません。
文字起こし専用Talkは、リアルタイムおよびSTT/TTSセッションと同じ共通Talkイベントエンベロープを出力しますが、mode: "transcription"とbrain: "none"を使用します。これはキャプション、ディクテーション、観察専用の音声キャプチャ向けです。1回限りでアップロードされるボイスメモは引き続きメディア/音声パスを使用します。
動作(macOS)
- Talkモードが有効な間は常時表示オーバーレイ。
- 聞き取り中 → 考え中 → 発話中のフェーズ遷移。
- 短い一時停止(無音ウィンドウ)で、現在の文字起こしが送信されます。
- 返信はWebChatに書き込まれます(入力した場合と同じ)。
- 発話による割り込み(デフォルトでオン):アシスタントが話している間にユーザーが話し始めた場合、再生を停止し、次のプロンプト用に割り込みタイムスタンプを記録します。
返信内の音声ディレクティブ
アシスタントは、音声を制御するために返信の先頭に単一のJSON行を付けることができます。
{ "voice": "<voice-id>", "once": true }
ルール:
- 最初の空でない行のみ。
- 不明なキーは無視されます。
once: trueは現在の返信にのみ適用されます。onceがない場合、その音声がTalkモードの新しいデフォルトになります。- JSON行はTTS再生前に取り除かれます。
対応キー:
voice/voice_id/voiceIdmodel/model_id/modelIdspeed,rate(WPM),stability,similarity,style,speakerBoostseed,normalize,lang,output_format,latency_tieronce
設定(~/.openclaw/openclaw.json)
{
talk: {
provider: "elevenlabs",
providers: {
elevenlabs: {
voiceId: "elevenlabs_voice_id",
modelId: "eleven_v3",
outputFormat: "mp3_44100_128",
apiKey: "elevenlabs_api_key",
},
mlx: {
modelId: "mlx-community/Soprano-80M-bf16",
},
system: {},
},
speechLocale: "ru-RU",
silenceTimeoutMs: 1500,
interruptOnSpeech: true,
realtime: {
provider: "openai",
providers: {
openai: {
apiKey: "openai_api_key",
model: "gpt-realtime",
voice: "alloy",
},
},
mode: "realtime",
transport: "webrtc",
brain: "agent-consult",
},
},
}
デフォルト:
interruptOnSpeech: truesilenceTimeoutMs: 未設定の場合、Talkは文字起こしを送信する前にプラットフォーム既定の一時停止ウィンドウを維持します(macOSとAndroidでは700 ms、iOSでは900 ms)provider: アクティブなTalkプロバイダーを選択します。macOSローカル再生パスではelevenlabs、mlx、またはsystemを使用します。providers.<provider>.voiceId: ElevenLabsではELEVENLABS_VOICE_ID/SAG_VOICE_IDにフォールバックします(またはAPIキーが利用可能な場合は最初のElevenLabs音声)。providers.elevenlabs.modelId: 未設定の場合はeleven_v3がデフォルトです。providers.mlx.modelId: 未設定の場合はmlx-community/Soprano-80M-bf16がデフォルトです。providers.elevenlabs.apiKey:ELEVENLABS_API_KEYにフォールバックします(または利用可能な場合はGatewayシェルプロファイル)。realtime.provider: アクティブなブラウザー/サーバーのリアルタイム音声プロバイダーを選択します。WebRTCにはopenai、プロバイダーWebSocketにはgoogle、またはGatewayリレー経由のブリッジ専用プロバイダーを使用します。realtime.providers.<provider>は、プロバイダー所有のリアルタイム設定を保存します。ブラウザーが受け取るのは一時的または制約付きのセッション認証情報のみで、通常のAPIキーは受け取りません。realtime.brain:agent-consultはリアルタイムツール呼び出しをGatewayポリシー経由でルーティングします。direct-toolsは所有者専用の互換動作です。noneは文字起こしまたは外部オーケストレーション向けです。talk.catalogは、ファーストパーティのTalkクライアントが未対応の組み合わせを避けられるように、各プロバイダーの有効なモード、トランスポート、ブレイン戦略、リアルタイム音声形式、機能フラグを公開します。- ストリーミング文字起こしプロバイダーは
talk.catalog.transcription経由で検出されます。現在のGatewayリレーは、専用のTalk文字起こし設定サーフェスが追加されるまで、Voice Callストリーミングプロバイダー設定を使用します。 speechLocale: iOS/macOSのオンデバイスTalk音声認識用の任意のBCP 47ロケールID。デバイスのデフォルトを使用するには未設定のままにします。outputFormat: macOS/iOSではpcm_44100、Androidではpcm_24000がデフォルトです(MP3ストリーミングを強制するにはmp3_*を設定します)
macOS UI
- メニューバー切り替え: Talk
- 設定タブ: Talk Modeグループ(音声ID + 割り込み切り替え)
- オーバーレイ:
- 聞き取り中: クラウドがマイクレベルに合わせて脈動
- 考え中: 沈み込むアニメーション
- 発話中: 広がるリング
- クラウドをクリック: 発話を停止
- Xをクリック: Talkモードを終了
Android UI
- Voiceタブ切り替え: Talk
- 手動のMicとTalkは、相互排他的な実行時キャプチャモードです。
- 手動Micは、アプリがフォアグラウンドを離れるか、ユーザーがVoiceタブを離れると停止します。
- Talkモードは、オフに切り替えられるかAndroidノードが切断されるまで実行を続け、アクティブな間はAndroidのマイク用フォアグラウンドサービスタイプを使用します。
注記
- SpeechとMicrophoneの権限が必要です。
- ネイティブTalkはアクティブなGatewayセッションを使用し、応答イベントが利用できない場合にのみ履歴ポーリングにフォールバックします。
- ブラウザーのリアルタイムTalkは、プロバイダー所有のブラウザーセッションに
chat.sendを公開する代わりに、openclaw_agent_consultにtalk.client.toolCallを使用します。 - 文字起こし専用Talkは
talk.session.create、talk.session.appendAudio、talk.session.cancelTurn、talk.session.closeを使用します。クライアントは部分/最終文字起こしの更新を受け取るためにtalk.eventを購読します。 - Gatewayは、アクティブなTalkプロバイダーを使用して
talk.speak経由でTalk再生を解決します。Androidは、そのRPCが利用できない場合にのみローカルシステムTTSにフォールバックします。 - macOSローカルMLX再生は、存在する場合はバンドルされた
openclaw-mlx-ttsヘルパーを使用し、またはPATH上の実行可能ファイルを使用します。開発中にカスタムヘルパーバイナリを指すにはOPENCLAW_MLX_TTS_BINを設定します。 eleven_v3のstabilityは0.0、0.5、または1.0に検証されます。その他のモデルは0..1を受け入れます。latency_tierは、設定されている場合0..4に検証されます。- Androidは、低遅延AudioTrackストリーミング向けに
pcm_16000、pcm_22050、pcm_24000、pcm_44100出力形式に対応しています。