Aller au contenu

Talk mode

Le mode discussion existe sous deux formes à l’exécution :

  • Le mode discussion natif macOS/iOS/Android utilise la reconnaissance vocale locale, la discussion Gateway et la TTS macOSiOSAndroidGatewaytalk.speak. Les nœuds annoncent la capacité talk et déclarent les commandes talk.* qu’ils prennent en charge.
  • Le mode discussion navigateur utilise talk.client.create pour les sessions webrtc et provider-websocket appartenant au client, ou talk.session.createGateway pour les sessions gateway-relay appartenant au Gateway. managed-roomGateway est réservé pour le transfert Gateway et les salons talkie-walkie.
  • Android Talk peut opter pour des sessions de relais en temps réel détenues par Gateway avec AndroidGatewaytalk.realtime.mode: "realtime" et talk.realtime.transport: "gateway-relay"Gateway. Sinon, il reste sur la reconnaissance vocale native, le chat Gateway et talk.speak.
  • Les clients de transcription uniquement utilisent talk.session.create({ mode: "transcription", transport: "gateway-relay", brain: "none" }), puis talk.session.appendAudio, talk.session.cancelTurn et talk.session.close lorsqu’ils ont besoin de sous-titres ou de dictée sans réponse vocale de l’assistant.

Le mode Talk natif est une boucle de conversation vocale continue :

  1. Écouter la parole
  2. Envoyer la transcription au modèle via la session active
  3. Attendre la réponse
  4. La prononcer via le fournisseur Talk configuré (talk.speak)

Le Talk en temps réel du navigateur transmet les appels d’outils du provider via talk.client.toolCall ; les clients navigateur n’appellent pas directement chat.send pour les consultations en temps réel. Pendant qu’une consultation en temps réel est active, les clients Talk peuvent utiliser talk.client.steer ou talk.session.steer pour classer les entrées vocales comme status, steer, cancel, ou followup. Les directives acceptées sont mises en file d’attente dans l’exécution intégrée active ; les directives rejetées renvoient une raison structurée telle que no_active_run, not_streaming, ou compacting.

Le Talk de transcription uniquement émet la même enveloppe d’événements Talk commune que les sessions en temps réel et STT/TTS, mais utilise mode: "transcription" et brain: "none". Il est destiné aux sous-titres, à la dictée et à la capture vocale en observation uniquement ; les notes vocales téléchargées en une seule fois utilisent toujours le chemin média/audio.

  • Superposition toujours active tant que le mode Talk est activé.
  • Transitions de phase Écoute → Réflexion → Parole.
  • Lors d’une courte pause (fenêtre de silence), la transcription actuelle est envoyée.
  • Les réponses sont écrites dans WebChat (comme lors de la frappe).
  • Interrompre sur parole (activé par défaut) : si l’utilisateur commence à parler alors que l’assistant parle, nous arrêtons la lecture et notons l’horodatage de l’interruption pour la prochaine invite.

L’assistant peut préfixer sa réponse par une seule ligne JSON pour contrôler la voix :

{ "voice": "<voice-id>", "once": true }

Règles :

  • Uniquement la première ligne non vide.
  • Les clés inconnues sont ignorées.
  • once: true s’applique uniquement à la réponse actuelle.
  • Sans once, la voix devient la nouvelle valeur par défaut pour le mode Talk.
  • La ligne JSON est supprimée avant la lecture TTS.

Clés prises en charge :

  • voice / voice_id / voiceId
  • model / model_id / modelId
  • speed, rate (WPM), stability, similarity, style, speakerBoost
  • seed, normalize, lang, output_format, latency_tier
  • once
{
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-2",
voice: "cedar",
},
},
instructions: "Speak warmly and keep answers brief.",
mode: "realtime",
transport: "webrtc",
brain: "agent-consult",
},
},
}

Par défaut :

  • interruptOnSpeech : true
  • silenceTimeoutMs : lorsqu’il n’est pas défini, Talk conserve la fenêtre de pause par défaut de la plateforme avant d’envoyer la transcription (700 ms on macOS and Android, 900 ms on iOS)
  • provider : sélectionne le provider Talk actif. Utilisez elevenlabs, mlx ou system pour les chemins de lecture locale macOS.
  • providers.<provider>.voiceId : revient à ELEVENLABS_VOICE_ID / SAG_VOICE_ID pour ElevenLabs (ou à la première voix ElevenLabs lorsque la clé API est disponible).
  • providers.elevenlabs.modelId : valeur par défaut eleven_v3 si non défini.
  • providers.mlx.modelId : valeur par défaut mlx-community/Soprano-80M-bf16 si non défini.
  • providers.elevenlabs.apiKey : revient à ELEVENLABS_API_KEY (ou au profil shell de la passerelle si disponible).
  • consultThinkingLevel : substitution facultative du niveau de réflexion pour l’exécution complète de l’agent OpenClaw derrière les appels openclaw_agent_consult en temps réel.
  • consultFastMode : substitution facultative du mode rapide pour les appels openclaw_agent_consult en temps réel.
  • realtime.provider : sélectionne le provider de voix en temps réel actif du navigateur/serveur. Utilisez openai pour WebRTC, google pour le WebSocket du provider, ou un provider de pont uniquement via le relais Gateway.
  • realtime.providers.<provider> stocke la configuration en temps réel appartenant au provider. Le navigateur ne reçoit que des identifiants de session éphémères ou contraints, jamais une clé API standard.
  • realtime.providers.openai.voice : id de voix Realtime intégrée OpenAI. Les voix gpt-realtime-2 actuelles sont alloy, ash, ballad, coral, echo, sage, shimmer, verse, marin et cedar ; marin et cedar sont recommandés pour une meilleure qualité.
  • realtime.transport : webrtc et provider-websocketAndroid sont des transports temps réel du navigateur. Android n’utilise le relais temps réel que lorsque c’est gateway-relayAndroid ; sinon, Android Talk utilise sa boucle native STT/TTS.
  • realtime.brain : agent-consultGateway achemine les appels d’outils temps réel via la stratégie du Gateway ; direct-tools est le comportement de compatibilité hérité d’outil direct ; none est pour la transcription ou l’orchestration externe.
  • realtime.consultRouting : provider-direct préserve la réponse directe du provider lorsqu’il ignore openclaw_agent_consult ; force-agent-consultGatewayOpenClaw fait en sorte que le relais Gateway achemine les transcriptions d’utilisateur finalisées via OpenClaw à la place.
  • realtime.instructionsOpenClawOpenClaw : ajoute des instructions système destinées au provider à l’invite temps réel intégrée d’OpenClaw. Utilisez-le pour le style et le ton de la voix ; OpenClaw conserve les directives openclaw_agent_consult par défaut.
  • talk.catalog expose les modes valides, les transports, les stratégies de cerveau, les formats audio temps réel et les indicateurs de capacité de chaque provider afin que les clients Talk de première partie puissent éviter les combinaisons non prises en charge.
  • Les providers de transcription en continu sont découverts via talk.catalog.transcriptionGateway. Le relais Gateway actuel utilise la configuration du provider de diffusion en continu Voice Call jusqu’à ce que la surface de configuration de transcription Talk dédiée soit ajoutée.
  • speechLocaleiOSmacOS : identifiant de locale BCP 47 optionnel pour la reconnaissance vocale Talk sur appareil sous iOS/macOS. Laisser non défini pour utiliser la valeur par défaut de l’appareil.
  • outputFormat : par défaut pcm_44100macOSiOS sous macOS/iOS et pcm_24000Android sous Android (définir mp3_* pour forcer le streaming MP3)
  • Bascule de la barre de menus : Talk
  • Onglet Config : groupe Talk Mode (identifiant vocal + bascule d’interruption)
  • Superposition :
    • Écoute : le nuage pulse en fonction du niveau du micro
    • Réflexion : animation d’enfoncement
    • Parole : anneaux rayonnants
    • Cliquer sur le nuage : arrêter la parole
    • Cliquer sur X : quitter le mode Talk
  • Bascule de l’onglet Voice : Talk
  • Mic et Talk manuels sont des modes de capture d’exécution mutuellement exclusifs.
  • Le micro manuel s’arrête lorsque l’application quitte le premier plan ou lorsque l’utilisateur quitte l’onglet Voice.
  • Le mode Talk continue de fonctionner jusqu’à ce qu’il soit désactivé ou que le nœud Android se déconnecte, et utilise le type de service de premier plan du micro d’Android tant qu’il est actif.
  • Nécessite les permissions Speech + Microphone.
  • Le mode Talk natif utilise la session active du Gateway et ne recourt au sondage de l’historique que lorsque les événements de réponse ne sont pas disponibles.
  • Le mode Talk en temps réel du navigateur utilise talk.client.toolCall pour openclaw_agent_consult au lieu d’exposer chat.send aux sessions de navigateur détenues par le fournisseur.
  • Le mode Talk de transcription uniquement utilise talk.session.create, talk.session.appendAudio, talk.session.cancelTurn et talk.session.close ; les clients s’abonnent à talk.event pour les mises à jour partielles/finales de la transcription.
  • La passerelle résout la lecture Talk via talk.speak en utilisant le fournisseur Talk actif. Android recourt au TTS du système local uniquement lorsque cet RPC est indisponible.
  • La lecture MLX locale de macOS utilise l’assistant intégré openclaw-mlx-tts s’il est présent, ou un exécutable sur PATH. Définissez OPENCLAW_MLX_TTS_BIN pour pointer vers un binaire d’assistant personnalisé lors du développement.
  • stability pour eleven_v3 est validé à 0.0, 0.5 ou 1.0 ; d’autres modèles acceptent 0..1.
  • latency_tier est validé à 0..4 lorsqu’il est défini.
  • Android prend en charge les formats de sortie Androidpcm_16000, pcm_22050, pcm_24000 et pcm_44100 pour le streaming AudioTrack à faible latence.