---
read_when:
    - การนำโหมดสนทนาไปใช้งานบน macOS/iOS/Android
    - การเปลี่ยนลักษณะการทำงานของเสียง/TTS/การขัดจังหวะ
summary: 'โหมดสนทนา: การสนทนาด้วยเสียงพูดอย่างต่อเนื่องผ่าน STT/TTS ภายในเครื่องและเสียงแบบเรียลไทม์'
title: โหมดพูดคุย
x-i18n:
    generated_at: "2026-05-10T19:44:22Z"
    model: gpt-5.5
    provider: openai
    source_hash: 28e5feae8af8ff89472dfb73c44c590b2f7fab3c0ca335b67603c7fd9d50dfe7
    source_path: nodes/talk.md
    workflow: 16
---

โหมดพูดคุยมีรูปแบบรันไทม์สองแบบ:

- การพูดคุยแบบเนทีฟบน macOS/iOS/Android ใช้การรู้จำเสียงพูดภายในเครื่อง, แชทผ่าน Gateway และ TTS ด้วย `talk.speak` Node จะประกาศความสามารถ `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` เมื่อต้องการคำบรรยายหรือการป้อนตามคำบอกโดยไม่มีเสียงตอบกลับจากผู้ช่วย

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

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

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

การพูดคุยแบบถอดเสียงอย่างเดียวปล่อยซองเหตุการณ์พูดคุยทั่วไปแบบเดียวกับเซสชันเรียลไทม์และ STT/TTS แต่ใช้ `mode: "transcription"` และ `brain: "none"` เหมาะสำหรับคำบรรยาย การป้อนตามคำบอก และการจับเสียงพูดเพื่อสังเกตอย่างเดียว; โน้ตเสียงแบบอัปโหลดครั้งเดียวยังคงใช้เส้นทางสื่อ/เสียง

## พฤติกรรม (macOS)

- **โอเวอร์เลย์เปิดตลอด** ขณะเปิดใช้งานโหมดพูดคุย
- การเปลี่ยนเฟส **กำลังฟัง → กำลังคิด → กำลังพูด**
- เมื่อมี **การหยุดสั้น ๆ** (หน้าต่างความเงียบ) ข้อความถอดเสียงปัจจุบันจะถูกส่ง
- คำตอบจะถูก **เขียนไปยัง WebChat** (เหมือนการพิมพ์)
- **ขัดจังหวะเมื่อมีเสียงพูด** (เปิดเป็นค่าเริ่มต้น): หากผู้ใช้เริ่มพูดในขณะที่ผู้ช่วยกำลังพูด เราจะหยุดการเล่นและบันทึกเวลาการขัดจังหวะสำหรับพรอมป์ถัดไป

## ไดเรกทีฟเสียงในคำตอบ

ผู้ช่วยอาจขึ้นต้นคำตอบด้วย **บรรทัด JSON เดียว** เพื่อควบคุมเสียง:

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

กฎ:

- เฉพาะบรรทัดแรกที่ไม่ว่างเท่านั้น
- คีย์ที่ไม่รู้จักจะถูกละเว้น
- `once: true` ใช้กับคำตอบปัจจุบันเท่านั้น
- หากไม่มี `once` เสียงนั้นจะกลายเป็นค่าเริ่มต้นใหม่สำหรับโหมดพูดคุย
- บรรทัด 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`)

```json5
{
  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`: true
- `silenceTimeoutMs`: เมื่อไม่ได้ตั้งค่า การพูดคุยจะใช้หน้าต่างหยุดชั่วคราวเริ่มต้นของแพลตฟอร์มก่อนส่งข้อความถอดเสียง (`700 ms on macOS and Android, 900 ms on iOS`)
- `provider`: เลือกผู้ให้บริการพูดคุยที่ใช้งานอยู่ ใช้ `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 หากมี)
- `consultThinkingLevel`: การแทนที่ระดับการคิดแบบไม่บังคับสำหรับการรันเอเจนต์ OpenClaw แบบเต็มที่อยู่เบื้องหลังการเรียก `openclaw_agent_consult` แบบเรียลไทม์
- `consultFastMode`: การแทนที่โหมดเร็วแบบไม่บังคับสำหรับการเรียก `openclaw_agent_consult` แบบเรียลไทม์
- `realtime.provider`: เลือกผู้ให้บริการเสียงเรียลไทม์บนเบราว์เซอร์/เซิร์ฟเวอร์ที่ใช้งานอยู่ ใช้ `openai` สำหรับ WebRTC, `google` สำหรับ WebSocket ของผู้ให้บริการ หรือผู้ให้บริการแบบบริดจ์เท่านั้นผ่านรีเลย์ Gateway
- `realtime.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.brain`: `agent-consult` กำหนดเส้นทางการเรียกเครื่องมือเรียลไทม์ผ่านนโยบาย Gateway; `direct-tools` เป็นพฤติกรรมความเข้ากันได้สำหรับเจ้าของเท่านั้น; `none` ใช้สำหรับการถอดเสียงหรือการจัดการลำดับงานภายนอก
- `realtime.instructions`: เพิ่มคำสั่งระบบที่หันไปยังผู้ให้บริการต่อท้ายพรอมป์เรียลไทม์ในตัวของ OpenClaw ใช้สำหรับสไตล์และโทนเสียง; OpenClaw จะคงคำแนะนำเริ่มต้นของ `openclaw_agent_consult`
- `talk.catalog` เปิดเผยโหมด ทรานสปอร์ต กลยุทธ์ brain รูปแบบเสียงเรียลไทม์ และแฟล็กความสามารถที่ถูกต้องของผู้ให้บริการแต่ละราย เพื่อให้ไคลเอนต์พูดคุยของบุคคลที่หนึ่งหลีกเลี่ยงชุดค่าที่ไม่รองรับได้
- ผู้ให้บริการถอดเสียงแบบสตรีมจะถูกค้นพบผ่าน `talk.catalog.transcription` รีเลย์ Gateway ปัจจุบันใช้การกำหนดค่าผู้ให้บริการสตรีมมิง Voice Call จนกว่าจะเพิ่มพื้นผิวการกำหนดค่าการถอดเสียงสำหรับการพูดคุยโดยเฉพาะ
- `speechLocale`: รหัสภาษา BCP 47 แบบไม่บังคับสำหรับการรู้จำเสียงพูดของการพูดคุยบนอุปกรณ์ใน iOS/macOS ปล่อยว่างไว้เพื่อใช้ค่าเริ่มต้นของอุปกรณ์
- `outputFormat`: ค่าเริ่มต้นคือ `pcm_44100` บน macOS/iOS และ `pcm_24000` บน Android (ตั้งค่า `mp3_*` เพื่อบังคับใช้การสตรีม MP3)

## UI macOS

- สวิตช์แถบเมนู: **พูดคุย**
- แท็บการกำหนดค่า: กลุ่ม **โหมดพูดคุย** (รหัสเสียง + สวิตช์ขัดจังหวะ)
- โอเวอร์เลย์:
  - **กำลังฟัง**: เมฆเต้นตามระดับไมค์
  - **กำลังคิด**: แอนิเมชันจมลง
  - **กำลังพูด**: วงแหวนแผ่ออก
  - คลิกเมฆ: หยุดพูด
  - คลิก X: ออกจากโหมดพูดคุย

## UI Android

- สวิตช์แท็บเสียง: **พูดคุย**
- **ไมค์** และ **พูดคุย** แบบแมนนวลเป็นโหมดจับเสียงรันไทม์ที่ใช้พร้อมกันไม่ได้
- ไมค์แบบแมนนวลจะหยุดเมื่อแอปออกจาก foreground หรือผู้ใช้ออกจากแท็บเสียง
- โหมดพูดคุยจะทำงานต่อไปจนกว่าจะปิดสวิตช์หรือ Node Android ตัดการเชื่อมต่อ และใช้ประเภท foreground-service ของไมโครโฟน Android ขณะทำงาน

## หมายเหตุ

- ต้องมีสิทธิ์ Speech + Microphone
- การพูดคุยแบบเนทีฟใช้เซสชัน Gateway ที่ใช้งานอยู่ และจะย้อนกลับไปใช้การโพลประวัติเมื่อไม่มีเหตุการณ์การตอบกลับเท่านั้น
- การพูดคุยแบบเรียลไทม์บนเบราว์เซอร์ใช้ `talk.client.toolCall` สำหรับ `openclaw_agent_consult` แทนการเปิดเผย `chat.send` ให้เซสชันเบราว์เซอร์ที่ผู้ให้บริการเป็นเจ้าของ
- การพูดคุยแบบถอดเสียงอย่างเดียวใช้ `talk.session.create`, `talk.session.appendAudio`, `talk.session.cancelTurn` และ `talk.session.close`; ไคลเอนต์สมัครรับ `talk.event` เพื่ออัปเดตข้อความถอดเสียงบางส่วน/สุดท้าย
- Gateway แก้การเล่นเสียงพูดคุยผ่าน `talk.speak` โดยใช้ผู้ให้บริการพูดคุยที่ใช้งานอยู่ 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 ที่มีความหน่วงต่ำ

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

- [การปลุกด้วยเสียง](/th/nodes/voicewake)
- [เสียงและโน้ตเสียง](/th/nodes/audio)
- [การทำความเข้าใจสื่อ](/th/nodes/media-understanding)
