Nodes and media

โหมดสนทนา

โหมด Talk มีรูปแบบรันไทม์สองแบบ:

  • Talk แบบเนทีฟบน macOS/iOS/Android ใช้การรู้จำเสียงในเครื่อง, แชตของ Gateway และ TTS ผ่าน talk.speak Node จะประกาศความสามารถ talk และประกาศคำสั่ง talk.* ที่รองรับ
  • Talk บนเบราว์เซอร์ใช้ talk.client.create สำหรับเซสชัน webrtc และ provider-websocket ที่ไคลเอนต์เป็นเจ้าของ หรือใช้ talk.session.create สำหรับเซสชัน gateway-relay ที่ Gateway เป็นเจ้าของ managed-room ถูกสงวนไว้สำหรับการส่งต่อของ Gateway และห้องวอล์กกี้ทอล์กกี้
  • ไคลเอนต์ที่ถอดเสียงอย่างเดียวใช้ talk.session.create({ mode: "transcription", transport: "gateway-relay", brain: "none" }) จากนั้นใช้ talk.session.appendAudio, talk.session.cancelTurn และ talk.session.close เมื่อต้องการคำบรรยายหรือการพิมพ์ตามเสียงโดยไม่มีการตอบกลับด้วยเสียงจากผู้ช่วย

Talk แบบเนทีฟเป็นลูปการสนทนาด้วยเสียงต่อเนื่อง:

  1. ฟังเสียงพูด
  2. ส่งทรานสคริปต์ไปยังโมเดลผ่านเซสชันที่ใช้งานอยู่
  3. รอคำตอบ
  4. พูดคำตอบผ่านผู้ให้บริการ Talk ที่กำหนดค่าไว้ (talk.speak)

Talk แบบเรียลไทม์บนเบราว์เซอร์จะส่งต่อการเรียกเครื่องมือของผู้ให้บริการผ่าน talk.client.toolCall; ไคลเอนต์เบราว์เซอร์จะไม่เรียก chat.send โดยตรงสำหรับการปรึกษาแบบเรียลไทม์

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 / voiceId
  • model / model_id / modelId
  • speed, rate (WPM), 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",
          voice: "alloy",
        },
      },
      mode: "realtime",
      transport: "webrtc",
      brain: "agent-consult",
    },
  },
}

ค่าเริ่มต้น:

  • interruptOnSpeech: true
  • silenceTimeoutMs: เมื่อไม่ได้ตั้งค่า Talk จะคงช่วงหน้าต่างหยุดชั่วคราวเริ่มต้นของแพลตฟอร์มไว้ก่อนส่งทรานสคริปต์ (700 ms on macOS and Android, 900 ms on iOS)
  • provider: เลือกผู้ให้บริการ Talk ที่ใช้งานอยู่ ใช้ elevenlabs, mlx หรือ system สำหรับเส้นทางเล่นเสียงในเครื่องบน macOS
  • providers.<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 หากมี)
  • realtime.provider: เลือกผู้ให้บริการเสียงเรียลไทม์บนเบราว์เซอร์/เซิร์ฟเวอร์ที่ใช้งานอยู่ ใช้ openai สำหรับ WebRTC, google สำหรับ WebSocket ของผู้ให้บริการ หรือผู้ให้บริการที่เป็นบริดจ์อย่างเดียวผ่านรีเลย์ของ Gateway
  • realtime.providers.<provider> เก็บการกำหนดค่าเรียลไทม์ที่ผู้ให้บริการเป็นเจ้าของ เบราว์เซอร์จะได้รับเฉพาะข้อมูลรับรองเซสชันแบบชั่วคราวหรือแบบจำกัดเท่านั้น ไม่ใช่คีย์ API มาตรฐาน
  • realtime.brain: agent-consult กำหนดเส้นทางการเรียกเครื่องมือแบบเรียลไทม์ผ่านนโยบายของ Gateway; direct-tools เป็นพฤติกรรมความเข้ากันได้สำหรับเจ้าของเท่านั้น; none ใช้สำหรับการถอดเสียงหรือการจัดการภายนอก
  • talk.catalog แสดงโหมด ทรานสปอร์ต กลยุทธ์ brain รูปแบบเสียงเรียลไทม์ และแฟล็กความสามารถที่ถูกต้องของแต่ละผู้ให้บริการ เพื่อให้ไคลเอนต์ Talk ของบุคคลที่หนึ่งหลีกเลี่ยงชุดค่าที่ไม่รองรับได้
  • ผู้ให้บริการถอดเสียงแบบสตรีมมิงถูกค้นพบผ่าน talk.catalog.transcription รีเลย์ Gateway ปัจจุบันใช้การกำหนดค่าผู้ให้บริการสตรีมมิง Voice Call จนกว่าจะเพิ่มพื้นผิวการกำหนดค่า Talk transcription โดยเฉพาะ
  • 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 จะทำงานต่อไปจนกว่าจะถูกปิดหรือ Node ของ 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..1
  • latency_tier จะถูกตรวจสอบให้เป็น 0..4 เมื่อตั้งค่า
  • Android รองรับรูปแบบเอาต์พุต pcm_16000, pcm_22050, pcm_24000 และ pcm_44100 สำหรับการสตรีม AudioTrack ความหน่วงต่ำ

ที่เกี่ยวข้อง