Nodes and media
เสียงและบันทึกเสียง
สิ่งที่ใช้งานได้
- การทำความเข้าใจสื่อ (เสียง): หากเปิดใช้การทำความเข้าใจเสียง (หรือตรวจพบโดยอัตโนมัติ) OpenClaw จะ:
- ค้นหาไฟล์แนบเสียงแรก (พาธภายในเครื่องหรือ URL) และดาวน์โหลดหากจำเป็น
- บังคับใช้
maxBytesก่อนส่งไปยังแต่ละรายการโมเดล - รันรายการโมเดลแรกที่เข้าเกณฑ์ตามลำดับ (ผู้ให้บริการหรือ CLI)
- หากล้มเหลวหรือข้าม (ขนาด/หมดเวลา) จะลองรายการถัดไป
- เมื่อสำเร็จ จะแทนที่
Bodyด้วยบล็อก[Audio]และตั้งค่า{{Transcript}}
- การแยกวิเคราะห์คำสั่ง: เมื่อถอดเสียงสำเร็จ
CommandBody/RawBodyจะถูกตั้งค่าเป็นข้อความถอดเสียง เพื่อให้คำสั่ง slash ยังคงทำงานได้ - การบันทึกแบบละเอียด: ใน
--verboseเราจะบันทึกเมื่อการถอดเสียงทำงานและเมื่อแทนที่เนื้อหา
การตรวจหาอัตโนมัติ (ค่าเริ่มต้น)
หากคุณ ไม่ได้กำหนดค่าโมเดล และ tools.media.audio.enabled ไม่ได้ ถูกตั้งค่าเป็น false
OpenClaw จะตรวจหาอัตโนมัติตามลำดับนี้ และหยุดที่ตัวเลือกแรกที่ใช้งานได้:
- โมเดลตอบกลับที่ใช้งานอยู่ เมื่อผู้ให้บริการรองรับการทำความเข้าใจเสียง
- CLI ภายในเครื่อง (หากติดตั้งไว้)
sherpa-onnx-offline(ต้องใช้SHERPA_ONNX_MODEL_DIRพร้อม encoder/decoder/joiner/tokens)whisper-cli(จากwhisper-cpp; ใช้WHISPER_CPP_MODELหรือโมเดล tiny ที่รวมมาให้)whisper(Python CLI; ดาวน์โหลดโมเดลโดยอัตโนมัติ)
- Gemini CLI (
gemini) โดยใช้read_many_files - การยืนยันตัวตนของผู้ให้บริการ
- รายการ
models.providers.*ที่กำหนดค่าไว้ซึ่งรองรับเสียงจะถูกลองก่อน - ลำดับ fallback ที่รวมมาให้: OpenAI → Groq → xAI → Deepgram → Google → SenseAudio → ElevenLabs → Mistral
- รายการ
หากต้องการปิดการตรวจหาอัตโนมัติ ให้ตั้งค่า tools.media.audio.enabled: false
หากต้องการปรับแต่ง ให้ตั้งค่า tools.media.audio.models
หมายเหตุ: การตรวจหาไบนารีเป็นแบบ best-effort บน macOS/Linux/Windows; ตรวจสอบให้แน่ใจว่า CLI อยู่ใน PATH (เราขยาย ~) หรือตั้งค่าโมเดล CLI แบบชัดเจนด้วยพาธคำสั่งแบบเต็ม
ตัวอย่างการกำหนดค่า
Fallback ของผู้ให้บริการ + CLI (OpenAI + Whisper CLI)
{
tools: {
media: {
audio: {
enabled: true,
maxBytes: 20971520,
models: [
{ provider: "openai", model: "gpt-4o-mini-transcribe" },
{
type: "cli",
command: "whisper",
args: ["--model", "base", "{{MediaPath}}"],
timeoutSeconds: 45,
},
],
},
},
},
}
เฉพาะผู้ให้บริการพร้อมการควบคุมตามขอบเขต
{
tools: {
media: {
audio: {
enabled: true,
scope: {
default: "allow",
rules: [{ action: "deny", match: { chatType: "group" } }],
},
models: [{ provider: "openai", model: "gpt-4o-mini-transcribe" }],
},
},
},
}
เฉพาะผู้ให้บริการ (Deepgram)
{
tools: {
media: {
audio: {
enabled: true,
models: [{ provider: "deepgram", model: "nova-3" }],
},
},
},
}
เฉพาะผู้ให้บริการ (Mistral Voxtral)
{
tools: {
media: {
audio: {
enabled: true,
models: [{ provider: "mistral", model: "voxtral-mini-latest" }],
},
},
},
}
เฉพาะผู้ให้บริการ (SenseAudio)
{
tools: {
media: {
audio: {
enabled: true,
models: [{ provider: "senseaudio", model: "senseaudio-asr-pro-1.5-260319" }],
},
},
},
}
ส่งข้อความถอดเสียงกลับไปยังแชต (เลือกเปิดใช้)
{
tools: {
media: {
audio: {
enabled: true,
echoTranscript: true, // default is false
echoFormat: '📝 "{transcript}"', // optional, supports {transcript}
models: [{ provider: "openai", model: "gpt-4o-mini-transcribe" }],
},
},
},
}
หมายเหตุและข้อจำกัด
- การยืนยันตัวตนของผู้ให้บริการใช้ลำดับการยืนยันตัวตนของโมเดลมาตรฐาน (โปรไฟล์การยืนยันตัวตน, env vars,
models.providers.*.apiKey) - รายละเอียดการตั้งค่า Groq: Groq
- Deepgram จะใช้
DEEPGRAM_API_KEYเมื่อใช้provider: "deepgram" - รายละเอียดการตั้งค่า Deepgram: Deepgram (การถอดเสียงเสียง)
- รายละเอียดการตั้งค่า Mistral: Mistral
- SenseAudio จะใช้
SENSEAUDIO_API_KEYเมื่อใช้provider: "senseaudio" - รายละเอียดการตั้งค่า SenseAudio: SenseAudio
- ผู้ให้บริการเสียงสามารถ override
baseUrl,headersและproviderOptionsผ่านtools.media.audio - ขีดจำกัดขนาดเริ่มต้นคือ 20MB (
tools.media.audio.maxBytes) เสียงที่เกินขนาดจะถูกข้ามสำหรับโมเดลนั้น และจะลองรายการถัดไป - ไฟล์เสียงขนาดเล็กมาก/ว่างเปล่าที่ต่ำกว่า 1024 ไบต์จะถูกข้ามก่อนการถอดเสียงโดยผู้ให้บริการ/CLI
- ค่าเริ่มต้น
maxCharsสำหรับเสียงคือ ไม่ได้ตั้งค่า (ข้อความถอดเสียงเต็ม) ตั้งค่าtools.media.audio.maxCharsหรือmaxCharsต่อรายการเพื่อตัดเอาต์พุต - ค่าเริ่มต้นอัตโนมัติของ OpenAI คือ
gpt-4o-mini-transcribe; ตั้งค่าmodel: "gpt-4o-transcribe"เพื่อความแม่นยำสูงขึ้น - ใช้
tools.media.audio.attachmentsเพื่อประมวลผลบันทึกเสียงหลายรายการ (mode: "all"+maxAttachments) - ข้อความถอดเสียงพร้อมใช้งานสำหรับเทมเพลตในรูปแบบ
{{Transcript}} tools.media.audio.echoTranscriptปิดอยู่โดยค่าเริ่มต้น; เปิดใช้เพื่อส่งการยืนยันข้อความถอดเสียงกลับไปยังแชตต้นทางก่อนการประมวลผลของเอเจนต์tools.media.audio.echoFormatปรับแต่งข้อความ echo (placeholder:{transcript})- stdout ของ CLI ถูกจำกัดไว้ (5MB); ควรทำให้เอาต์พุต CLI กระชับ
argsของ CLI ควรใช้{{MediaPath}}สำหรับพาธไฟล์เสียงภายในเครื่อง รันopenclaw doctor --fixเพื่อย้าย placeholder{input}ที่เลิกใช้แล้วจากการกำหนดค่าaudio.transcription.commandรุ่นเก่า
การรองรับสภาพแวดล้อมพร็อกซี
การถอดเสียงเสียงที่ใช้ผู้ให้บริการจะเคารพ env vars พร็อกซีขาออกมาตรฐาน:
HTTPS_PROXYHTTP_PROXYALL_PROXYhttps_proxyhttp_proxyall_proxy
หากไม่ได้ตั้งค่า env vars พร็อกซี จะใช้การออกสู่ภายนอกโดยตรง หากการกำหนดค่าพร็อกซีผิดรูปแบบ OpenClaw จะบันทึกคำเตือนและ fallback ไปใช้การ fetch โดยตรง
การตรวจจับการ mention ในกลุ่ม
เมื่อตั้งค่า requireMention: true สำหรับแชตกลุ่ม ตอนนี้ OpenClaw จะถอดเสียงเสียง ก่อน ตรวจสอบการ mention ซึ่งช่วยให้บันทึกเสียงถูกประมวลผลได้แม้มีการ mention อยู่ภายใน
วิธีการทำงาน:
- หากข้อความเสียงไม่มีเนื้อหาข้อความ และกลุ่มต้องการการ mention OpenClaw จะทำการถอดเสียงแบบ "preflight"
- ข้อความถอดเสียงจะถูกตรวจสอบหารูปแบบการ mention (เช่น
@BotName, ทริกเกอร์อีโมจิ) - หากพบการ mention ข้อความจะดำเนินต่อผ่าน pipeline การตอบกลับเต็มรูปแบบ
- ข้อความถอดเสียงถูกใช้สำหรับการตรวจจับการ mention เพื่อให้บันทึกเสียงผ่านด่านการ mention ได้
พฤติกรรม fallback:
- หากการถอดเสียงล้มเหลวระหว่าง preflight (หมดเวลา, ข้อผิดพลาด API ฯลฯ) ข้อความจะถูกประมวลผลตามการตรวจจับการ mention จากข้อความเท่านั้น
- สิ่งนี้ช่วยให้ข้อความผสม (ข้อความ + เสียง) จะไม่ถูกทิ้งอย่างไม่ถูกต้อง
ปิดใช้เฉพาะกลุ่ม/หัวข้อ Telegram:
- ตั้งค่า
channels.telegram.groups.<chatId>.disableAudioPreflight: trueเพื่อข้ามการตรวจสอบการ mention จากข้อความถอดเสียง preflight สำหรับกลุ่มนั้น - ตั้งค่า
channels.telegram.groups.<chatId>.topics.<threadId>.disableAudioPreflightเพื่อ override ต่อหัวข้อ (trueเพื่อข้าม,falseเพื่อบังคับเปิดใช้) - ค่าเริ่มต้นคือ
false(เปิดใช้ preflight เมื่อเงื่อนไขที่ต้องผ่านการ mention ตรงกัน)
ตัวอย่าง: ผู้ใช้ส่งบันทึกเสียงว่า "Hey @Claude, what's the weather?" ในกลุ่ม Telegram ที่มี requireMention: true บันทึกเสียงจะถูกถอดเสียง ตรวจพบการ mention และเอเจนต์ตอบกลับ
ข้อควรระวัง
- กฎขอบเขตใช้หลักการรายการแรกที่ตรงกันชนะ
chatTypeจะถูกทำให้เป็นมาตรฐานเป็นdirect,groupหรือroom - ตรวจสอบให้แน่ใจว่า CLI ของคุณออกด้วยสถานะ 0 และพิมพ์ข้อความธรรมดา; JSON ต้องถูกปรับรูปผ่าน
jq -r .text - สำหรับ
parakeet-mlxหากคุณส่ง--output-dirOpenClaw จะอ่าน<output-dir>/<media-basename>.txtเมื่อ--output-formatเป็นtxt(หรือไม่ได้ระบุ); รูปแบบเอาต์พุตที่ไม่ใช่txtจะ fallback ไปใช้การแยกวิเคราะห์ stdout - ตั้งค่า timeout ให้เหมาะสม (
timeoutSeconds, ค่าเริ่มต้น 60s) เพื่อหลีกเลี่ยงการบล็อกคิวตอบกลับ - การถอดเสียง preflight ประมวลผลเฉพาะไฟล์แนบเสียง แรก สำหรับการตรวจจับการ mention เสียงเพิ่มเติมจะถูกประมวลผลระหว่างขั้นตอนการทำความเข้าใจสื่อหลัก