Nodes and media
โหมดสนทนา
โหมดการสนทนารองรับรูปแบบรันไทม์ห้ารูปแบบ:
- การสนทนาแบบเนทีฟบน macOS/iOS/Android: การรู้จำเสียงพูดภายในเครื่อง การแชตผ่าน Gateway และ TTS ด้วย
talk.speakโดย Node จะประกาศความสามารถtalkและระบุคำสั่งtalk.*ที่รองรับ - การสนทนาบน iOS (เรียลไทม์): WebRTC ที่ไคลเอนต์เป็นผู้ควบคุม สำหรับการกำหนดค่าเรียลไทม์ของ OpenAI ที่เลือกทรานสปอร์ต
webrtcหรือไม่ระบุทรานสปอร์ต การกำหนดค่าเรียลไทม์ที่ระบุgateway-relay,provider-websocketและการกำหนดค่าเรียลไทม์ที่ไม่ใช่ OpenAI จะยังคงใช้รีเลย์ที่ Gateway เป็นผู้ควบคุม ส่วนการกำหนดค่าที่ไม่ใช่เรียลไทม์จะใช้ลูปเสียงพูดแบบเนทีฟ - การสนทนาบนเบราว์เซอร์: ใช้
talk.client.createสำหรับเซสชันwebrtc/provider-websocketที่ไคลเอนต์เป็นผู้ควบคุม หรือtalk.session.createสำหรับเซสชันgateway-relayที่ Gateway เป็นผู้ควบคุม โดยสงวนmanaged-roomไว้สำหรับการส่งมอบจาก Gateway และห้องสื่อสารแบบวอล์กกีทอล์กกี - การสนทนาบน Android (เรียลไทม์): เปิดใช้ด้วย
talk.realtime.mode: "realtime"และtalk.realtime.transport: "gateway-relay"มิฉะนั้น Android จะยังคงใช้การรู้จำเสียงพูดแบบเนทีฟ การแชตผ่าน Gateway และtalk.speak - ไคลเอนต์สำหรับถอดเสียงเท่านั้น: ใช้
talk.session.create({ mode: "transcription", transport: "gateway-relay", brain: "none" })ตามด้วยtalk.session.appendAudio,talk.session.cancelTurnและtalk.session.closeสำหรับคำบรรยายหรือการเขียนตามคำบอกโดยไม่มีเสียงตอบกลับจากผู้ช่วย ส่วนข้อความเสียงที่อัปโหลดแบบครั้งเดียวยังคงใช้เส้นทางเสียงของ การทำความเข้าใจสื่อ
การสนทนาแบบเนทีฟเป็นลูปต่อเนื่อง: ฟังเสียงพูด ส่งข้อความถอดเสียงไปยังโมเดลผ่านเซสชันที่ใช้งานอยู่ รอการตอบกลับ แล้วอ่านออกเสียงผ่านผู้ให้บริการการสนทนาที่กำหนดค่าไว้ (talk.speak)
การสนทนาเรียลไทม์ที่ไคลเอนต์เป็นผู้ควบคุมจะส่งต่อการเรียกใช้เครื่องมือของผู้ให้บริการผ่าน talk.client.toolCall แทนการเรียก chat.send โดยตรง ระหว่างที่การปรึกษาแบบเรียลไทม์ทำงานอยู่ ไคลเอนต์สามารถเรียก talk.client.steer หรือ talk.session.steer เพื่อจำแนกอินพุตเสียงพูดเป็น status, steer, cancel หรือ followup การกำกับที่ยอมรับจะถูกจัดคิวเข้าสู่การทำงานแบบฝังที่กำลังดำเนินอยู่ ส่วนการกำกับที่ถูกปฏิเสธจะส่งคืนเหตุผล เช่น no_active_run, not_streaming หรือ compacting
การสนทนาสำหรับถอดเสียงเท่านั้นจะปล่อยซองเหตุการณ์การสนทนาแบบเดียวกับเซสชันเรียลไทม์และ STT/TTS แต่ใช้ mode: "transcription" และ brain: "none" เซสชันการสนทนาทั้งหมดจะกระจายเหตุการณ์ผ่านช่อง talk.event ซึ่งไคลเอนต์สมัครรับข้อมูลเพื่อรับการอัปเดตข้อความถอดเสียงบางส่วน/ฉบับสมบูรณ์ (transcript.delta/transcript.done) และข้อมูลการวัดอื่น ๆ ของเซสชัน
ลักษณะการทำงาน (macOS)
- แสดงโอเวอร์เลย์ตลอดเวลาขณะเปิดใช้โหมดการสนทนา
- การเปลี่ยนช่วง กำลังฟัง → กำลังคิด → กำลังพูด
- เมื่อหยุดชั่วครู่ (ช่วงตรวจจับความเงียบ) ระบบจะส่งข้อความถอดเสียงปัจจุบัน
- คำตอบจะถูกเขียนลงใน WebChat (เช่นเดียวกับการพิมพ์)
- ขัดจังหวะด้วยเสียงพูด (เปิดเป็นค่าเริ่มต้น): หากผู้ใช้พูดขณะที่ผู้ช่วยกำลังพูด การเล่นเสียงจะหยุดลงและบันทึกเวลาที่ขัดจังหวะไว้สำหรับพรอมต์ถัดไป
คำสั่งกำกับเสียงในคำตอบ
ผู้ช่วยสามารถเติมบรรทัด JSON หนึ่งบรรทัดไว้หน้าคำตอบเพื่อควบคุมเสียง:
{ "voice": "<voice-id>", "once": true }กฎ:
- ใช้เฉพาะบรรทัดแรกที่ไม่ว่าง ระบบจะนำบรรทัด JSON ออกก่อนเล่นเสียง TTS
- ระบบจะเพิกเฉยต่อคีย์ที่ไม่รู้จัก
once: trueใช้กับคำตอบปัจจุบันเท่านั้น หากไม่มีค่านี้ เสียงดังกล่าวจะกลายเป็นค่าเริ่มต้นใหม่ของโหมดการสนทนา
คีย์ที่รองรับ: voice / voice_id / voiceId, model / model_id / modelId, speed, rate (คำต่อนาที), stability, similarity, style, speakerBoost, seed, normalize, lang, output_format, latency_tier, once
การกำหนดค่า (~/.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.1", speakerVoice: "cedar", }, }, instructions: "พูดด้วยน้ำเสียงอบอุ่นและตอบให้กระชับ", mode: "realtime", transport: "webrtc", brain: "agent-consult", }, },}| คีย์ | ค่าเริ่มต้น | หมายเหตุ |
|---|---|---|
provider |
- | ผู้ให้บริการ TTS ของการสนทนาที่ใช้งานอยู่ ใช้ elevenlabs, mlx หรือ system สำหรับเส้นทางเล่นเสียงภายในเครื่องบน macOS |
providers.<id>.voiceId |
- | ElevenLabs จะย้อนกลับไปใช้ ELEVENLABS_VOICE_ID / SAG_VOICE_ID หรือเสียงแรกที่พร้อมใช้งานเมื่อมีคีย์ API |
providers.elevenlabs.modelId |
eleven_v3 |
|
providers.mlx.modelId |
mlx-community/Soprano-80M-bf16 |
|
providers.elevenlabs.apiKey |
- | ย้อนกลับไปใช้ ELEVENLABS_API_KEY (หรือโปรไฟล์เชลล์ของ Gateway หากมี) |
speechLocale |
ค่าเริ่มต้นของอุปกรณ์ | รหัสโลแคล BCP 47 สำหรับการรู้จำเสียงพูดของการสนทนาบนอุปกรณ์ใน iOS/macOS |
silenceTimeoutMs |
700 มิลลิวินาทีบน macOS/Android, 900 มิลลิวินาทีบน iOS |
ช่วงหยุดชั่วครู่ก่อนที่การสนทนาจะส่งข้อความถอดเสียง |
interruptOnSpeech |
true |
|
outputFormat |
pcm_44100 บน macOS/iOS, pcm_24000 บน Android |
ตั้งค่าเป็น mp3_* เพื่อบังคับใช้การสตรีม MP3 |
consultThinkingLevel |
ไม่ได้ตั้งค่า | ค่าที่ใช้แทนระดับการคิดสำหรับการทำงานของเอเจนต์เบื้องหลังการเรียก openclaw_agent_consult แบบเรียลไทม์ |
consultFastMode |
ไม่ได้ตั้งค่า | ค่าที่ใช้แทนโหมดเร็วสำหรับการเรียก openclaw_agent_consult แบบเรียลไทม์ |
realtime.provider |
- | ใช้ openai สำหรับ WebRTC, google สำหรับ WebSocket ของผู้ให้บริการ หรือผู้ให้บริการแบบบริดจ์เท่านั้นผ่านรีเลย์ของ Gateway |
realtime.providers.<id> |
- | การกำหนดค่าเรียลไทม์ที่ผู้ให้บริการเป็นเจ้าของ เบราว์เซอร์จะได้รับเฉพาะข้อมูลประจำตัวของเซสชันแบบชั่วคราว/มีข้อจำกัดเท่านั้น และจะไม่ได้รับคีย์ API มาตรฐานโดยเด็ดขาด |
realtime.providers.openai.speakerVoice |
alloy |
รหัสเสียง OpenAI Realtime ในตัว (คีย์ voice รุ่นเก่ายังคงใช้งานได้แต่เลิกแนะนำแล้ว) เสียงของ gpt-realtime-2.1 ในปัจจุบัน ได้แก่ alloy, ash, ballad, cedar, coral, echo, marin, sage, shimmer, verse; แนะนำให้ใช้ marin และ cedar เพื่อคุณภาพที่ดีที่สุด |
realtime.transport |
- | webrtc: OpenAI WebRTC ที่ไคลเอนต์เป็นผู้ควบคุมบน iOS และในเบราว์เซอร์ provider-websocket: เบราว์เซอร์เป็นผู้ควบคุม แต่ยังคงใช้รีเลย์ของ Gateway บน iOS gateway-relay: เก็บเสียงของผู้ให้บริการไว้ที่ Gateway โดย Android จะใช้เรียลไทม์เฉพาะกับทรานสปอร์ตนี้ |
realtime.brain |
- | agent-consult ส่งการเรียกใช้เครื่องมือแบบเรียลไทม์ผ่านนโยบายของ Gateway; direct-tools คือความเข้ากันได้กับเครื่องมือโดยตรงแบบเดิม; none ใช้สำหรับการถอดเสียง/การควบคุมจากภายนอก |
realtime.consultRouting |
- | provider-direct คงคำตอบโดยตรงของผู้ให้บริการไว้เมื่อข้าม openclaw_agent_consult; force-agent-consult จะส่งข้อความถอดเสียงของผู้ใช้ฉบับสมบูรณ์ผ่าน OpenClaw แทน |
realtime.instructions |
- | ผนวกคำสั่งระบบสำหรับผู้ให้บริการเข้ากับพรอมต์เรียลไทม์ในตัวของ OpenClaw (รูปแบบ/โทนเสียง) โดยยังคงคำแนะนำเริ่มต้นของ openclaw_agent_consult ไว้ |
talk.catalog เปิดเผย ID ผู้ให้บริการมาตรฐานและนามแฝงในรีจิสทรี รวมถึงโหมด/การรับส่ง/กลยุทธ์สมอง/รูปแบบเสียงแบบเรียลไทม์/แฟล็กความสามารถที่ใช้ได้ของผู้ให้บริการแต่ละราย และผลความพร้อมที่รันไทม์เลือกไว้ ไคลเอนต์ Talk ของผู้พัฒนาโดยตรงควรอ่านแค็ตตาล็อกดังกล่าวแทนการดูแลนามแฝงของผู้ให้บริการไว้ภายในเครื่อง สำหรับ Gateway รุ่นเก่าที่ไม่ระบุความพร้อมระดับกลุ่ม ให้ถือว่ายังไม่ได้ตรวจสอบ แทนที่จะสรุปแน่ชัดว่ายังไม่ได้กำหนดค่า ระบบค้นหาผู้ให้บริการถอดเสียงแบบสตรีมผ่าน talk.catalog.transcription โดยรีเลย์ Gateway ปัจจุบันใช้การกำหนดค่าผู้ให้บริการสตรีมของ Voice Call ไปก่อน จนกว่าจะมีพื้นผิวการกำหนดค่าการถอดเสียงสำหรับ Talk โดยเฉพาะ
UI ของ macOS
- ตัวสลับบนแถบเมนู: Talk
- แท็บการกำหนดค่า: กลุ่ม Talk Mode (ID เสียง + ตัวสลับการขัดจังหวะ)
- โอเวอร์เลย์: ลูกแก้วแสดงรูปคลื่นการสนทนาสากล (ใช้ร่วมกับ iOS, watchOS และ Android) ขณะฟัง รูปคลื่นจะเคลื่อนไหวตามระดับไมโครโฟนสด ขณะพูดจะเคลื่อนไหวตามเอนเวโลปการเล่น TTS จริง และขณะคิดจะเต้นเบา ๆ คลิกลูกแก้วเพื่อหยุดชั่วคราว/เล่นต่อ ดับเบิลคลิกเพื่อหยุดพูด และคลิก X เพื่อออกจากโหมด Talk
UI ของ Android
- ตัวสลับในแท็บเสียง: Talk
- Mic และ Talk แบบสั่งงานด้วยตนเองเป็นโหมดบันทึกเสียงที่ไม่สามารถใช้งานพร้อมกันได้
- Mic แบบสั่งงานด้วยตนเองและ Talk แบบเรียลไทม์จะเลือกใช้ไมโครโฟนของชุดหูฟัง Bluetooth Classic หรือ BLE ที่เชื่อมต่ออยู่ก่อน หากการเชื่อมต่อขาด แอปจะขอใช้อินพุตจากชุดหูฟังอื่น หรือถอยกลับไปใช้ไมโครโฟนเริ่มต้น และจะคืนค่าการตั้งค่าเริ่มต้นเมื่อหยุดบันทึกเสียง
- Mic แบบสั่งงานด้วยตนเองจะหยุดเมื่อแอปออกจากเบื้องหน้า หรือผู้ใช้ออกจากแท็บเสียง
- โหมด Talk จะทำงานต่อไปจนกว่าจะปิดด้วยตัวสลับหรือ Node ตัดการเชื่อมต่อ โดยใช้ประเภทบริการเบื้องหน้าสำหรับไมโครโฟนของ Android ขณะทำงาน
- Android รองรับรูปแบบเอาต์พุต
pcm_16000,pcm_22050,pcm_24000และpcm_44100สำหรับการสตรีมAudioTrackที่มีเวลาแฝงต่ำ
หมายเหตุ
- ต้องมีสิทธิ์คำพูดและไมโครโฟน
- Talk แบบเนทีฟใช้เซสชัน Gateway ที่ทำงานอยู่ และจะถอยกลับไปสำรวจประวัติเฉพาะเมื่อไม่มีเหตุการณ์การตอบกลับ
- Gateway จัดการการเล่นเสียง Talk ผ่าน
talk.speakโดยใช้ผู้ให้บริการ Talk ที่ทำงานอยู่ Android จะถอยกลับไปใช้ TTS ของระบบภายในเครื่องเฉพาะเมื่อ RPC ดังกล่าวไม่พร้อมใช้งาน - การเล่น MLX ภายในเครื่องบน macOS ใช้ตัวช่วย
openclaw-mlx-ttsที่รวมมาให้เมื่อมีอยู่ หรือใช้ไฟล์ปฏิบัติการบนPATHตั้งค่าOPENCLAW_MLX_TTS_BINให้ชี้ไปยังไบนารีตัวช่วยแบบกำหนดเองระหว่างการพัฒนา - ช่วงค่าคำสั่งเสียง (ElevenLabs):
stability,similarityและstyleรับค่า0..1;speedรับค่า0.5..2;latency_tierรับค่า0..4