Nodes and media
โหมดสนทนา
โหมด Talk มีรูปแบบรันไทม์สองแบบ:
- Talk แบบเนทีฟบน macOS/iOS/Android ใช้การรู้จำเสียงพูดภายในเครื่อง, แชต Gateway และ TTS
talk.speakโหนดจะประกาศความสามารถtalkและระบุคำสั่งtalk.*ที่รองรับ - Talk บนเบราว์เซอร์ใช้
talk.client.createสำหรับเซสชันwebrtcและprovider-websocketที่ไคลเอนต์เป็นเจ้าของ หรือใช้talk.session.createสำหรับเซสชันgateway-relayที่ Gateway เป็นเจ้าของmanaged-roomสงวนไว้สำหรับการส่งต่อของ Gateway และห้องวอล์กีทอล์ก - Talk บน Android สามารถเลือกใช้เซสชันรีเลย์เรียลไทม์ที่ Gateway เป็นเจ้าของได้ด้วย
talk.realtime.mode: "realtime"และtalk.realtime.transport: "gateway-relay"มิฉะนั้นจะยังคงใช้การรู้จำเสียงพูดแบบเนทีฟ, แชต Gateway และtalk.speak - ไคลเอนต์ที่ใช้เฉพาะการถอดเสียงใช้
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 สามารถใช้ talk.client.steer หรือ
talk.session.steer เพื่อจัดประเภทอินพุตเสียงพูดเป็น status, steer, cancel หรือ
followup การนำทางที่ยอมรับแล้วจะถูกจัดคิวเข้าไปในรันแบบฝังที่กำลังทำงานอยู่ ส่วนการนำทางที่ถูกปฏิเสธ
จะคืนเหตุผลแบบมีโครงสร้าง เช่น no_active_run, not_streaming
หรือ compacting
Talk ที่ใช้เฉพาะการถอดเสียงจะปล่อยซองเหตุการณ์ Talk ทั่วไปแบบเดียวกับเซสชันเรียลไทม์และ STT/TTS แต่ใช้ mode: "transcription" และ brain: "none" ใช้สำหรับคำบรรยาย การป้อนตามคำบอก และการจับเสียงพูดแบบสังเกตการณ์เท่านั้น ส่วนโน้ตเสียงที่อัปโหลดแบบครั้งเดียวยังคงใช้เส้นทางสื่อ/เสียง
พฤติกรรม (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-2", voice: "cedar", }, }, instructions: "Speak warmly and keep answers brief.", mode: "realtime", transport: "webrtc", brain: "agent-consult", }, },}ค่าเริ่มต้น:
interruptOnSpeech: truesilenceTimeoutMs: เมื่อไม่ได้ตั้งค่า Talk จะใช้ช่วงหยุดชั่วคราวเริ่มต้นของแพลตฟอร์มก่อนส่งข้อความถอดเสียง (700 ms บน macOS และ Android, 900 ms บน iOS)provider: เลือกผู้ให้บริการ Talk ที่ใช้งานอยู่ ใช้elevenlabs,mlxหรือsystemสำหรับเส้นทางการเล่นเสียงภายในเครื่องบน macOSproviders.<provider>.voiceId: ย้อนกลับไปใช้ELEVENLABS_VOICE_ID/SAG_VOICE_IDสำหรับ ElevenLabs (หรือเสียง ElevenLabs แรกเมื่อมีคีย์ API)providers.elevenlabs.modelId: ค่าเริ่มต้นเป็นeleven_v3เมื่อไม่ได้ตั้งค่าproviders.mlx.modelId: ค่าเริ่มต้นเป็นmlx-community/Soprano-80M-bf16เมื่อไม่ได้ตั้งค่าproviders.elevenlabs.apiKey: ย้อนกลับไปใช้ELEVENLABS_API_KEY(หรือโปรไฟล์เชลล์ของ Gateway หากมี)consultThinkingLevel: ตัวเลือกแทนที่ระดับการคิดสำหรับการรันเอเจนต์ OpenClaw แบบเต็มที่อยู่เบื้องหลังการเรียกopenclaw_agent_consultแบบเรียลไทม์consultFastMode: ตัวเลือกแทนที่โหมดเร็วสำหรับการเรียกopenclaw_agent_consultแบบเรียลไทม์realtime.provider: เลือกผู้ให้บริการเสียงเรียลไทม์บนเบราว์เซอร์/เซิร์ฟเวอร์ที่ใช้งานอยู่ ใช้openaiสำหรับ WebRTC,googleสำหรับ WebSocket ของผู้ให้บริการ หรือผู้ให้บริการแบบบริดจ์เท่านั้นผ่านรีเลย์ Gatewayrealtime.providers.<provider>เก็บการกำหนดค่าเรียลไทม์ที่ผู้ให้บริการเป็นเจ้าของ เบราว์เซอร์จะได้รับเฉพาะข้อมูลรับรองเซสชันแบบชั่วคราวหรือถูกจำกัดเท่านั้น ไม่ใช่คีย์ API มาตรฐานrealtime.providers.openai.voice: รหัสเสียง OpenAI Realtime ในตัว เสียงgpt-realtime-2ปัจจุบันคือalloy,ash,ballad,coral,echo,sage,shimmer,verse,marinและcedar; แนะนำmarinและcedarเพื่อคุณภาพที่ดีที่สุดrealtime.transport:webrtcและprovider-websocketเป็นทรานสปอร์ตเรียลไทม์ของเบราว์เซอร์ Android ใช้รีเลย์เรียลไทม์เฉพาะเมื่อค่านี้เป็นgateway-relay; มิฉะนั้น Talk บน Android จะใช้ลูป STT/TTS แบบเนทีฟของตนrealtime.brain:agent-consultกำหนดเส้นทางการเรียกเครื่องมือแบบเรียลไทม์ผ่านนโยบาย Gateway;direct-toolsเป็นพฤติกรรมความเข้ากันได้กับเครื่องมือโดยตรงแบบเดิม;noneใช้สำหรับการถอดเสียงหรือการประสานงานภายนอกrealtime.consultRouting:provider-directคงคำตอบโดยตรงของผู้ให้บริการไว้เมื่อข้ามopenclaw_agent_consult;force-agent-consultทำให้รีเลย์ Gateway กำหนดเส้นทางข้อความถอดเสียงของผู้ใช้ที่สรุปแล้วผ่าน OpenClaw แทนrealtime.instructions: ผนวกคำสั่งระบบที่ส่งให้ผู้ให้บริการเข้ากับพรอมป์เรียลไทม์ในตัวของ OpenClaw ใช้สำหรับสไตล์และน้ำเสียง OpenClaw จะคงคำแนะนำopenclaw_agent_consultเริ่มต้นไว้talk.catalogเปิดเผยโหมด ทรานสปอร์ต กลยุทธ์ brain รูปแบบเสียงเรียลไทม์ และแฟล็กความสามารถที่ใช้ได้ของแต่ละผู้ให้บริการ เพื่อให้ไคลเอนต์ Talk ของฝ่ายแรกหลีกเลี่ยงชุดค่าที่ไม่รองรับได้- ผู้ให้บริการถอดเสียงแบบสตรีมมิงถูกค้นพบผ่าน
talk.catalog.transcriptionรีเลย์ Gateway ปัจจุบันใช้การกำหนดค่าผู้ให้บริการสตรีมมิง Voice Call จนกว่าจะเพิ่มพื้นผิวการกำหนดค่าการถอดเสียง Talk โดยเฉพาะ speechLocale: รหัสโลแคล BCP 47 แบบไม่บังคับสำหรับการรู้จำเสียงพูด Talk บนอุปกรณ์บน iOS/macOS เว้นว่างไว้เพื่อใช้ค่าเริ่มต้นของอุปกรณ์outputFormat: ค่าเริ่มต้นเป็นpcm_44100บน macOS/iOS และpcm_24000บน Android (ตั้งค่าmp3_*เพื่อบังคับการสตรีม MP3)
UI บน macOS
- สวิตช์แถบเมนู: Talk
- แท็บการกำหนดค่า: กลุ่ม โหมด Talk (รหัสเสียง + สวิตช์ขัดจังหวะ)
- โอเวอร์เลย์:
- กำลังฟัง: คลาวด์เต้นตามระดับไมค์
- กำลังคิด: แอนิเมชันจมลง
- กำลังพูด: วงแหวนแผ่ออก
- คลิกคลาวด์: หยุดพูด
- คลิก X: ออกจากโหมด Talk
UI บน Android
- สวิตช์แท็บเสียง: Talk
- Mic แบบแมนนวลและ Talk เป็นโหมดจับเสียงรันไทม์ที่ใช้ร่วมกันไม่ได้
- Mic แบบแมนนวลจะหยุดเมื่อแอปออกจากโฟร์กราวด์หรือผู้ใช้ออกจากแท็บเสียง
- โหมด Talk จะทำงานต่อไปจนกว่าจะถูกปิดหรือโหนด Android ตัดการเชื่อมต่อ และใช้ประเภทบริการโฟร์กราวด์ไมโครโฟนของ Android ขณะทำงาน
หมายเหตุ
- ต้องมีสิทธิ์ Speech + Microphone
- Talk แบบเนทีฟใช้เซสชัน Gateway ที่ใช้งานอยู่ และจะย้อนกลับไปใช้การสำรวจประวัติเฉพาะเมื่อเหตุการณ์ตอบกลับไม่พร้อมใช้งาน
- Talk แบบเรียลไทม์บนเบราว์เซอร์ใช้
talk.client.toolCallสำหรับopenclaw_agent_consultแทนการเปิดเผยchat.sendให้กับเซสชันเบราว์เซอร์ที่ผู้ให้บริการเป็นเจ้าของ - Talk ที่ใช้เฉพาะการถอดเสียงใช้
talk.session.create,talk.session.appendAudio,talk.session.cancelTurnและtalk.session.close; ไคลเอนต์สมัครรับtalk.eventเพื่อรับการอัปเดตข้อความถอดเสียงบางส่วน/สุดท้าย - Gateway แก้เส้นทางการเล่นเสียง Talk ผ่าน
talk.speakโดยใช้ผู้ให้บริการ Talk ที่ใช้งานอยู่ Android จะย้อนกลับไปใช้ TTS ระบบภายในเครื่องเฉพาะเมื่อ RPC นั้นไม่พร้อมใช้งาน - การเล่นเสียง MLX ภายในเครื่องบน macOS ใช้ตัวช่วย
openclaw-mlx-ttsที่บันเดิลมาเมื่อมีอยู่ หรือไฟล์ปฏิบัติการบนPATHตั้งค่าOPENCLAW_MLX_TTS_BINให้ชี้ไปยังไบนารีตัวช่วยแบบกำหนดเองระหว่างการพัฒนา stabilityสำหรับeleven_v3ถูกตรวจสอบให้เป็น0.0,0.5หรือ1.0; โมเดลอื่นยอมรับ0..1latency_tierถูกตรวจสอบให้เป็น0..4เมื่อตั้งค่า- Android รองรับรูปแบบเอาต์พุต
pcm_16000,pcm_22050,pcm_24000และpcm_44100สำหรับการสตรีม AudioTrack ความหน่วงต่ำ