Nodes and media
الصوت والملاحظات الصوتية
ما الذي يعمل
- فهم الوسائط (الصوت): إذا كان فهم الصوت ممكّنًا (أو تم اكتشافه تلقائيًا)، فإن OpenClaw:
- يحدد موقع أول مرفق صوتي (مسار محلي أو URL) وينزّله إذا لزم الأمر.
- يفرض
maxBytesقبل الإرسال إلى كل إدخال نموذج. - يشغّل أول إدخال نموذج مؤهل بالترتيب (المزوّد أو CLI).
- إذا فشل أو تم تخطيه (الحجم/المهلة)، فإنه يجرّب الإدخال التالي.
- عند النجاح، يستبدل
Bodyبكتلة[Audio]ويعيّن{{Transcript}}.
- تحليل الأوامر: عند نجاح النسخ، يتم تعيين
CommandBody/RawBodyإلى النص المنسوخ بحيث تظل أوامر الشرطة المائلة تعمل. - التسجيل التفصيلي: في
--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أو النموذج الصغير المضمّن)whisper(واجهة CLI من Python؛ تنزّل النماذج تلقائيًا)
- Gemini CLI (
gemini) باستخدامread_many_files - مصادقة المزوّد
- تتم تجربة إدخالات
models.providers.*المضبوطة التي تدعم الصوت أولًا - ترتيب الاحتياطي المضمّن: OpenAI → Groq → xAI → Deepgram → Google → SenseAudio → ElevenLabs → Mistral
- تتم تجربة إدخالات
لتعطيل الاكتشاف التلقائي، عيّن tools.media.audio.enabled: false.
للتخصيص، عيّن tools.media.audio.models.
ملاحظة: اكتشاف الملفات الثنائية يتم بأفضل جهد عبر macOS/Linux/Windows؛ تأكد من أن CLI موجودة على PATH (نوسّع ~)، أو عيّن نموذج CLI صريحًا بمسار أمر كامل.
أمثلة التكوين
مزوّد + احتياطي 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" }],
},
},
},
}
ملاحظات وحدود
- تتبع مصادقة المزوّد ترتيب مصادقة النموذج القياسي (ملفات تعريف المصادقة، ومتغيرات البيئة، و
models.providers.*.apiKey). - تفاصيل إعداد Groq: Groq.
- يلتقط Deepgram قيمة
DEEPGRAM_API_KEYعند استخدامprovider: "deepgram". - تفاصيل إعداد Deepgram: Deepgram (نسخ الصوت).
- تفاصيل إعداد Mistral: Mistral.
- يلتقط SenseAudio قيمة
SENSEAUDIO_API_KEYعند استخدامprovider: "senseaudio". - تفاصيل إعداد SenseAudio: SenseAudio.
- يمكن لمزوّدي الصوت تجاوز
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نص التكرار (العنصر النائب:{transcript}). - يتم تقييد stdout الخاص بـ CLI (5MB)؛ اجعل مخرجات CLI موجزة.
- يجب أن تستخدم
argsالخاصة بـ CLI قيمة{{MediaPath}}لمسار ملف الصوت المحلي. شغّلopenclaw doctor --fixلترحيل عناصر{input}النائبة المهملة من تكويناتaudio.transcription.commandالأقدم.
دعم بيئة الوكيل
يحترم نسخ الصوت المستند إلى المزوّد متغيرات بيئة الوكيل القياسية الصادرة:
HTTPS_PROXYHTTP_PROXYALL_PROXYhttps_proxyhttp_proxyall_proxy
إذا لم يتم تعيين أي متغيرات بيئة للوكيل، فسيتم استخدام الخروج المباشر. إذا كان تكوين الوكيل غير صحيح، يسجّل OpenClaw تحذيرًا ويعود إلى الجلب المباشر.
اكتشاف الإشارات في المجموعات
عند تعيين requireMention: true لدردشة جماعية، يقوم OpenClaw الآن بنسخ الصوت قبل التحقق من الإشارات. يتيح ذلك معالجة الملاحظات الصوتية حتى عندما تحتوي على إشارات.
كيف يعمل:
- إذا لم تكن للرسالة الصوتية متن نصي وكانت المجموعة تتطلب إشارات، ينفذ OpenClaw نسخًا "تمهيديًا".
- يتم التحقق من النص المنسوخ بحثًا عن أنماط الإشارة (مثل
@BotName، ومشغلات الرموز التعبيرية). - إذا تم العثور على إشارة، تتابع الرسالة عبر مسار الرد الكامل.
- يُستخدم النص المنسوخ لاكتشاف الإشارات بحيث يمكن للملاحظات الصوتية اجتياز بوابة الإشارة.
سلوك الاحتياطي:
- إذا فشل النسخ أثناء التمهيد (مهلة، خطأ API، وما إلى ذلك)، تتم معالجة الرسالة بناءً على اكتشاف الإشارات النصي فقط.
- يضمن هذا عدم إسقاط الرسائل المختلطة (نص + صوت) بشكل غير صحيح أبدًا.
إلغاء الاشتراك لكل مجموعة/موضوع في Telegram:
- عيّن
channels.telegram.groups.<chatId>.disableAudioPreflight: trueلتخطي فحوصات إشارات النص المنسوخ التمهيدية لتلك المجموعة. - عيّن
channels.telegram.groups.<chatId>.topics.<threadId>.disableAudioPreflightللتجاوز لكل موضوع (trueللتخطي، وfalseلفرض التمكين). - الافتراضي هو
false(التمهيد ممكّن عندما تتطابق شروط بوابة الإشارة).
مثال: يرسل مستخدم ملاحظة صوتية تقول "Hey @Claude, what's the weather?" في مجموعة Telegram مع requireMention: true. يتم نسخ الملاحظة الصوتية، واكتشاف الإشارة، ويرد الوكيل.
تنبيهات
- تستخدم قواعد النطاق أسبقية أول تطابق. يتم تطبيع
chatTypeإلىdirectأوgroupأوroom. - تأكد من أن CLI تخرج بالرمز 0 وتطبع نصًا عاديًا؛ يحتاج JSON إلى المعالجة عبر
jq -r .text. - بالنسبة إلى
parakeet-mlx، إذا مررت--output-dir، يقرأ OpenClaw من<output-dir>/<media-basename>.txtعندما تكون--output-formatهيtxt(أو محذوفة)؛ أما تنسيقات المخرجات غيرtxtفتعود إلى تحليل stdout. - أبقِ المهل معقولة (
timeoutSeconds، الافتراضي 60 ثانية) لتجنب حظر طابور الرد. - لا يعالج النسخ التمهيدي إلا المرفق الصوتي الأول لاكتشاف الإشارات. تتم معالجة الصوت الإضافي أثناء مرحلة فهم الوسائط الرئيسية.