chore(i18n): refresh ar translations
This commit is contained in:
parent
e5f0fa6243
commit
bdbf79b61c
@ -1,48 +1,48 @@
|
||||
---
|
||||
read_when:
|
||||
- تريد من وكيل OpenClaw الانضمام إلى مكالمة Google Meet
|
||||
- أنت تقوم بتكوين Chrome أو عقدة Chrome أو Twilio كوسيلة نقل لـ Google Meet
|
||||
summary: 'Plugin Google Meet: الانضمام إلى عناوين URL الخاصة بـ Meet المحددة صراحةً عبر Chrome أو Twilio مع الإعدادات الافتراضية للصوت في الوقت الفعلي'
|
||||
- تريد أن ينضم وكيل OpenClaw إلى مكالمة Google Meet
|
||||
- أنت تقوم بتكوين Chrome أو Chrome node أو Twilio كوسيلة نقل لـ Google Meet
|
||||
summary: 'Plugin Google Meet: انضم إلى عناوين URL الصريحة لاجتماعات Meet عبر Chrome أو Twilio باستخدام الإعدادات الافتراضية للصوت في الوقت الفعلي'
|
||||
title: Plugin Google Meet
|
||||
x-i18n:
|
||||
generated_at: "2026-04-24T09:01:31Z"
|
||||
generated_at: "2026-04-24T09:52:46Z"
|
||||
model: gpt-5.4
|
||||
provider: openai
|
||||
source_hash: 8d430a1f2d6ee7fc1d997ef388a2e0d2915a6475480343e7060edac799dfc027
|
||||
source_hash: f1673ac4adc9cf163194a340dd6e451d0e4d28bb62adeb126898298e62106d43
|
||||
source_path: plugins/google-meet.md
|
||||
workflow: 15
|
||||
---
|
||||
|
||||
# Google Meet (Plugin)
|
||||
# Google Meet (Plugin)
|
||||
|
||||
دعم المشاركين في Google Meet لـ OpenClaw.
|
||||
|
||||
تم تصميم الـ Plugin ليكون صريحًا عمدًا:
|
||||
تم تصميم الـ Plugin ليكون صريحًا:
|
||||
|
||||
- لا ينضم إلا إلى عنوان URL صريح من نوع `https://meet.google.com/...`.
|
||||
- يكون صوت `realtime` هو الوضع الافتراضي.
|
||||
- يمكن لصوت الوقت الفعلي الرجوع إلى وكيل OpenClaw الكامل عندما تكون هناك حاجة إلى
|
||||
استدلال أعمق أو أدوات.
|
||||
- تبدأ المصادقة باستخدام Google OAuth شخصي أو ملف تعريف Chrome مسجّل الدخول بالفعل.
|
||||
- لا ينضم إلا إلى عنوان URL صريح من `https://meet.google.com/...`.
|
||||
- يكون الصوت `realtime` هو الوضع الافتراضي.
|
||||
- يمكن للصوت في الوقت الفعلي الرجوع إلى وكيل OpenClaw الكامل عند الحاجة إلى استدلال أعمق أو أدوات.
|
||||
- تبدأ المصادقة عبر Google OAuth الشخصي أو ملف Chrome شخصي مسجّل الدخول بالفعل.
|
||||
- لا يوجد إعلان موافقة تلقائي.
|
||||
- تكون الواجهة الخلفية الصوتية الافتراضية لـ Chrome هي `BlackHole 2ch`.
|
||||
- يمكن تشغيل Chrome محليًا أو على مضيف Node مقترن.
|
||||
- يقبل Twilio رقم اتصال هاتفي بالإضافة إلى رقم PIN اختياري أو تسلسل DTMF.
|
||||
- أمر CLI هو `googlemeet`؛ أما `meet` فهو محجوز لسير عمل
|
||||
مؤتمرات الوكيل الأوسع.
|
||||
- الواجهة الخلفية الصوتية الافتراضية لـ Chrome هي `BlackHole 2ch`.
|
||||
- يمكن أن يعمل Chrome محليًا أو على مضيف Node مقترن.
|
||||
- يقبل Twilio رقم اتصال هاتفي بالإضافة إلى PIN اختياري أو تسلسل DTMF.
|
||||
- أمر CLI هو `googlemeet`؛ أما `meet` فهو محجوز لسير عمل المؤتمرات الهاتفية الأوسع للوكلاء.
|
||||
|
||||
## البدء السريع
|
||||
|
||||
ثبّت تبعيات الصوت المحلية وتأكد من أن موفّر الوقت الفعلي يمكنه استخدام
|
||||
OpenAI:
|
||||
ثبّت تبعيات الصوت المحلية وقم بتكوين موفّر صوت في الوقت الفعلي للواجهة الخلفية. OpenAI هو الافتراضي؛ كما يعمل Google Gemini Live أيضًا مع
|
||||
`realtime.provider: "google"`:
|
||||
|
||||
```bash
|
||||
brew install blackhole-2ch sox
|
||||
export OPENAI_API_KEY=sk-...
|
||||
# or
|
||||
export GEMINI_API_KEY=...
|
||||
```
|
||||
|
||||
يقوم `blackhole-2ch` بتثبيت جهاز الصوت الافتراضي `BlackHole 2ch`. يتطلب
|
||||
مثبّت Homebrew إعادة تشغيل قبل أن يوفّر macOS الجهاز:
|
||||
مثبّت Homebrew إعادة تشغيل قبل أن يتيح macOS هذا الجهاز:
|
||||
|
||||
```bash
|
||||
sudo reboot
|
||||
@ -70,7 +70,7 @@ command -v rec play
|
||||
}
|
||||
```
|
||||
|
||||
تحقق من الإعداد:
|
||||
تحقّق من الإعداد:
|
||||
|
||||
```bash
|
||||
openclaw googlemeet setup
|
||||
@ -91,67 +91,57 @@ openclaw googlemeet join https://meet.google.com/abc-defg-hij
|
||||
}
|
||||
```
|
||||
|
||||
ينضم Chrome باستخدام ملف تعريف Chrome المسجّل الدخول. في Meet، اختر `BlackHole 2ch`
|
||||
لمسار الميكروفون/مكبر الصوت الذي يستخدمه OpenClaw. للحصول على صوت ثنائي الاتجاه
|
||||
نظيف، استخدم أجهزة افتراضية منفصلة أو مخططًا على نمط Loopback؛ يكفي جهاز
|
||||
BlackHole واحد لاختبار أولي سريع لكنه قد يسبب صدى.
|
||||
ينضم Chrome باستخدام ملف Chrome الشخصي المسجّل الدخول. في Meet، اختر `BlackHole 2ch` لمسار الميكروفون/مكبر الصوت الذي يستخدمه OpenClaw. للحصول على صوت مزدوج نظيف، استخدم أجهزة افتراضية منفصلة أو مخططًا على نمط Loopback؛ يكفي جهاز BlackHole واحد لاختبار دخاني أولي لكنه قد يسبب صدى.
|
||||
|
||||
### Gateway محلي + Chrome على Parallels
|
||||
|
||||
أنت **لا** تحتاج إلى Gateway كامل من OpenClaw أو مفتاح API للنموذج داخل جهاز macOS افتراضي
|
||||
فقط لكي يمتلك الجهاز الافتراضي Chrome. شغّل Gateway والوكيل محليًا، ثم شغّل
|
||||
مضيف Node في الجهاز الافتراضي. فعّل الـ Plugin المضمّن على الجهاز الافتراضي مرة واحدة حتى
|
||||
يعلن الـ Node عن أمر Chrome:
|
||||
أنت **لا** تحتاج إلى OpenClaw Gateway كامل أو مفتاح API للنموذج داخل VM على macOS فقط لكي يكون Chrome مملوكًا لـ VM. شغّل Gateway والوكيل محليًا، ثم شغّل مضيف Node داخل VM. فعّل الـ Plugin المضمّن على VM مرة واحدة حتى يعلن Node عن أمر Chrome:
|
||||
|
||||
ما الذي يعمل وأين:
|
||||
|
||||
- مضيف Gateway: OpenClaw Gateway، مساحة عمل الوكيل، مفاتيح النموذج/API، موفّر
|
||||
الوقت الفعلي، وإعداد Google Meet Plugin.
|
||||
- جهاز macOS افتراضي على Parallels: OpenClaw CLI/مضيف Node، وGoogle Chrome، وSoX، وBlackHole 2ch،
|
||||
وملف تعريف Chrome مسجّل الدخول إلى Google.
|
||||
- غير مطلوب داخل الجهاز الافتراضي: خدمة Gateway، أو إعداد الوكيل، أو مفتاح OpenAI/GPT، أو إعداد
|
||||
موفّر النموذج.
|
||||
- مضيف Gateway: OpenClaw Gateway ومساحة عمل الوكيل ومفاتيح النموذج/API وموفّر `realtime` وتكوين Plugin الخاص بـ Google Meet.
|
||||
- Parallels macOS VM: OpenClaw CLI/مضيف Node وGoogle Chrome وSoX وBlackHole 2ch وملف Chrome شخصي مسجّل الدخول إلى Google.
|
||||
- غير مطلوب داخل VM: خدمة Gateway أو تكوين الوكيل أو مفتاح OpenAI/GPT أو إعداد موفّر النموذج.
|
||||
|
||||
ثبّت تبعيات الجهاز الافتراضي:
|
||||
ثبّت تبعيات VM:
|
||||
|
||||
```bash
|
||||
brew install blackhole-2ch sox
|
||||
```
|
||||
|
||||
أعد تشغيل الجهاز الافتراضي بعد تثبيت BlackHole حتى يوفّر macOS `BlackHole 2ch`:
|
||||
أعد تشغيل VM بعد تثبيت BlackHole حتى يتيح macOS جهاز `BlackHole 2ch`:
|
||||
|
||||
```bash
|
||||
sudo reboot
|
||||
```
|
||||
|
||||
بعد إعادة التشغيل، تحقّق من أن الجهاز الافتراضي يمكنه رؤية جهاز الصوت وأوامر SoX:
|
||||
بعد إعادة التشغيل، تحقّق من أن VM يمكنه رؤية جهاز الصوت وأوامر SoX:
|
||||
|
||||
```bash
|
||||
system_profiler SPAudioDataType | grep -i BlackHole
|
||||
command -v rec play
|
||||
```
|
||||
|
||||
ثبّت OpenClaw أو حدّثه في الجهاز الافتراضي، ثم فعّل الـ Plugin المضمّن هناك:
|
||||
ثبّت OpenClaw أو حدّثه داخل VM، ثم فعّل الـ Plugin المضمّن هناك:
|
||||
|
||||
```bash
|
||||
openclaw plugins enable google-meet
|
||||
```
|
||||
|
||||
ابدأ تشغيل مضيف Node في الجهاز الافتراضي:
|
||||
ابدأ مضيف Node داخل VM:
|
||||
|
||||
```bash
|
||||
openclaw node run --host <gateway-host> --port 18789 --display-name parallels-macos
|
||||
```
|
||||
|
||||
إذا كان `<gateway-host>` عنوان IP على الشبكة المحلية وأنت لا تستخدم TLS، فسيرفض الـ Node
|
||||
اتصال WebSocket النصي الصريح ما لم توافق صراحةً على هذه الشبكة الخاصة الموثوقة:
|
||||
إذا كان `<gateway-host>` عنوان IP ضمن LAN ولم تكن تستخدم TLS، فسيرفض Node اتصال WebSocket النصي الصريح إلا إذا وافقت عليه لهذه الشبكة الخاصة الموثوقة:
|
||||
|
||||
```bash
|
||||
OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 \
|
||||
openclaw node run --host <gateway-lan-ip> --port 18789 --display-name parallels-macos
|
||||
```
|
||||
|
||||
استخدم متغير البيئة نفسه عند تثبيت الـ Node كـ LaunchAgent:
|
||||
استخدم متغير البيئة نفسه عند تثبيت Node كـ LaunchAgent:
|
||||
|
||||
```bash
|
||||
OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 \
|
||||
@ -159,24 +149,24 @@ OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 \
|
||||
openclaw node restart
|
||||
```
|
||||
|
||||
إن `OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1` هو متغير بيئة للعملية، وليس
|
||||
إعدادًا في `openclaw.json`. يقوم `openclaw node install` بتخزينه في بيئة LaunchAgent
|
||||
إن `OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1` هو متغير بيئة للعملية، وليس إعدادًا في
|
||||
`openclaw.json`. يخزّن `openclaw node install` هذا المتغير في بيئة LaunchAgent
|
||||
عندما يكون موجودًا في أمر التثبيت.
|
||||
|
||||
وافق على الـ Node من مضيف Gateway:
|
||||
وافق على Node من مضيف Gateway:
|
||||
|
||||
```bash
|
||||
openclaw devices list
|
||||
openclaw devices approve <requestId>
|
||||
```
|
||||
|
||||
أكد أن Gateway يرى الـ Node وأنه يعلن عن `googlemeet.chrome`:
|
||||
أكّد أن Gateway يرى Node وأنه يعلن عن `googlemeet.chrome`:
|
||||
|
||||
```bash
|
||||
openclaw nodes status
|
||||
```
|
||||
|
||||
وجّه Meet عبر ذلك الـ Node على مضيف Gateway:
|
||||
وجّه Meet عبر ذلك Node على مضيف Gateway:
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -201,7 +191,7 @@ openclaw nodes status
|
||||
}
|
||||
```
|
||||
|
||||
الآن انضم بشكل طبيعي من مضيف Gateway:
|
||||
الآن انضم بشكل عادي من مضيف Gateway:
|
||||
|
||||
```bash
|
||||
openclaw googlemeet join https://meet.google.com/abc-defg-hij
|
||||
@ -209,62 +199,45 @@ openclaw googlemeet join https://meet.google.com/abc-defg-hij
|
||||
|
||||
أو اطلب من الوكيل استخدام أداة `google_meet` مع `transport: "chrome-node"`.
|
||||
|
||||
إذا تم حذف `chromeNode.node`، فسيقوم OpenClaw بالاختيار التلقائي فقط عندما
|
||||
يعلن Node واحد متصل بالضبط عن `googlemeet.chrome`. إذا كانت هناك عدة
|
||||
Nodes قادرة ومتّصلة، فاضبط `chromeNode.node` على معرّف الـ Node أو اسم العرض أو عنوان IP البعيد.
|
||||
إذا تم حذف `chromeNode.node`، فسيجري OpenClaw اختيارًا تلقائيًا فقط عندما يعلن Node واحد متصل بالضبط عن `googlemeet.chrome`. إذا كانت هناك عدة Nodes قادرة ومتّصلة، فاضبط `chromeNode.node` على معرّف Node أو اسمه المعروض أو عنوان IP البعيد.
|
||||
|
||||
فحوصات الأعطال الشائعة:
|
||||
|
||||
- `No connected Google Meet-capable node`: ابدأ تشغيل `openclaw node run` في الجهاز الافتراضي،
|
||||
ووافق على الاقتران، وتأكد من تشغيل `openclaw plugins enable google-meet`
|
||||
في الجهاز الافتراضي. أكّد أيضًا أن مضيف Gateway يسمح بأمر الـ Node باستخدام
|
||||
- `No connected Google Meet-capable node`: ابدأ `openclaw node run` داخل VM، ووافق على الاقتران، وتأكد من تشغيل `openclaw plugins enable google-meet` داخل VM. أكّد أيضًا أن مضيف Gateway يسمح بأمر Node باستخدام
|
||||
`gateway.nodes.allowCommands: ["googlemeet.chrome"]`.
|
||||
- `BlackHole 2ch audio device not found on the node`: ثبّت `blackhole-2ch`
|
||||
في الجهاز الافتراضي وأعد تشغيله.
|
||||
- يفتح Chrome لكنه لا يستطيع الانضمام: سجّل الدخول إلى Chrome داخل الجهاز الافتراضي وتأكد من أن
|
||||
ملف التعريف هذا يمكنه الانضمام إلى عنوان URL الخاص بـ Meet يدويًا.
|
||||
- لا يوجد صوت: في Meet، وجّه الميكروفون/مكبر الصوت عبر مسار جهاز الصوت الافتراضي
|
||||
الذي يستخدمه OpenClaw؛ استخدم أجهزة افتراضية منفصلة أو توجيهًا على نمط Loopback
|
||||
للحصول على صوت ثنائي الاتجاه نظيف.
|
||||
داخل VM وأعد تشغيل VM.
|
||||
- يفتح Chrome لكنه لا يستطيع الانضمام: سجّل الدخول إلى Chrome داخل VM وأكّد أن ذلك الملف الشخصي يمكنه الانضمام إلى عنوان Meet URL يدويًا.
|
||||
- لا يوجد صوت: في Meet، وجّه الميكروفون/مكبر الصوت عبر مسار جهاز الصوت الافتراضي الذي يستخدمه OpenClaw؛ استخدم أجهزة افتراضية منفصلة أو توجيهًا على نمط Loopback للحصول على صوت مزدوج نظيف.
|
||||
|
||||
## ملاحظات التثبيت
|
||||
|
||||
يستخدم وضع Chrome الافتراضي للوقت الفعلي أداتين خارجيتين:
|
||||
يستخدم وضع Chrome الافتراضي في الوقت الفعلي أداتين خارجيتين:
|
||||
|
||||
- `sox`: أداة صوت عبر سطر الأوامر. يستخدم الـ Plugin أمريها `rec` و`play`
|
||||
لجسر الصوت الافتراضي 8 كيلوهرتز G.711 mu-law.
|
||||
- `sox`: أداة صوت من سطر الأوامر. يستخدم الـ Plugin الأمرين `rec` و`play`
|
||||
للجسر الصوتي الافتراضي بتنسيق 8 كيلوهرتز G.711 mu-law.
|
||||
- `blackhole-2ch`: برنامج تشغيل صوت افتراضي لـ macOS. ينشئ جهاز الصوت
|
||||
`BlackHole 2ch` الذي يمكن لـ Chrome/Meet التوجيه من خلاله.
|
||||
`BlackHole 2ch` الذي يمكن لـ Chrome/Meet التوجيه عبره.
|
||||
|
||||
لا يقوم OpenClaw بتضمين أي من الحزمتين أو إعادة توزيعهما. تطلب الوثائق من المستخدمين
|
||||
تثبيتهما كتبعيات على المضيف عبر Homebrew. تُرخّص SoX بموجب
|
||||
`LGPL-2.0-only AND GPL-2.0-only`؛ أما BlackHole فمرخّص بموجب GPL-3.0. إذا أنشأت
|
||||
برنامج تثبيت أو جهازًا يضمّن BlackHole مع OpenClaw، فراجع شروط الترخيص
|
||||
الأصلية لـ BlackHole أو احصل على ترخيص منفصل من Existential Audio.
|
||||
لا يقوم OpenClaw بتضمين أي من الحزمتين أو إعادة توزيعهما. تطلب الوثائق من المستخدمين تثبيتهما كتبعيات مضيف عبر Homebrew. ترخيص SoX هو
|
||||
`LGPL-2.0-only AND GPL-2.0-only`؛ أما BlackHole فترخيصه GPL-3.0. إذا كنت تبني مثبّتًا أو جهازًا مخصصًا يضمّن BlackHole مع OpenClaw، فراجع شروط ترخيص BlackHole الأصلية أو احصل على ترخيص منفصل من Existential Audio.
|
||||
|
||||
## وسائل النقل
|
||||
|
||||
### Chrome
|
||||
|
||||
تفتح وسيلة نقل Chrome عنوان URL الخاص بـ Meet في Google Chrome وتنضم باستخدام
|
||||
ملف تعريف Chrome المسجّل الدخول. على macOS، يتحقق الـ Plugin من وجود `BlackHole 2ch` قبل التشغيل.
|
||||
إذا تم تكوين ذلك، فإنه يشغّل أيضًا أمر فحص سلامة جسر الصوت وأمر بدء التشغيل
|
||||
قبل فتح Chrome. استخدم `chrome` عندما يكون Chrome/الصوت موجودين على مضيف Gateway؛
|
||||
واستخدم `chrome-node` عندما يكون Chrome/الصوت موجودين على Node مقترن مثل جهاز macOS افتراضي على Parallels.
|
||||
تفتح وسيلة النقل Chrome عنوان Meet URL في Google Chrome وتنضم باستخدام ملف Chrome الشخصي المسجّل الدخول. على macOS، يتحقق الـ Plugin من وجود `BlackHole 2ch` قبل التشغيل. وإذا تم تكوين ذلك، فإنه يشغّل أيضًا أمر فحص سلامة الجسر الصوتي وأمر بدء التشغيل قبل فتح Chrome. استخدم `chrome` عندما يكون Chrome/الصوت موجودًا على مضيف Gateway؛ واستخدم `chrome-node` عندما يكون Chrome/الصوت موجودًا على Node مقترن مثل Parallels macOS VM.
|
||||
|
||||
```bash
|
||||
openclaw googlemeet join https://meet.google.com/abc-defg-hij --transport chrome
|
||||
openclaw googlemeet join https://meet.google.com/abc-defg-hij --transport chrome-node
|
||||
```
|
||||
|
||||
وجّه صوت ميكروفون Chrome ومكبر الصوت عبر جسر الصوت المحلي لـ OpenClaw.
|
||||
إذا لم يكن `BlackHole 2ch` مثبتًا، فسيفشل الانضمام مع خطأ إعداد
|
||||
بدلاً من الانضمام بصمت دون مسار صوت.
|
||||
وجّه صوت الميكروفون ومكبر الصوت في Chrome عبر الجسر الصوتي المحلي لـ OpenClaw. إذا لم يكن `BlackHole 2ch` مثبتًا، فسيفشل الانضمام بخطأ إعداد بدلًا من الانضمام بصمت من دون مسار صوتي.
|
||||
|
||||
### Twilio
|
||||
|
||||
وسيلة نقل Twilio هي خطة اتصال صارمة مفوضة إلى Voice Call Plugin. وهي
|
||||
لا تحلل صفحات Meet بحثًا عن أرقام الهاتف.
|
||||
وسيلة النقل Twilio هي خطة اتصال صارمة مفوّضة إلى Plugin مكالمات الصوت. وهي لا تحلّل صفحات Meet لاستخراج أرقام الهواتف.
|
||||
|
||||
```bash
|
||||
openclaw googlemeet join https://meet.google.com/abc-defg-hij \
|
||||
@ -284,18 +257,17 @@ openclaw googlemeet join https://meet.google.com/abc-defg-hij \
|
||||
|
||||
## OAuth والفحص المسبق
|
||||
|
||||
يستخدم الوصول إلى Google Meet Media API عميل OAuth شخصيًا في البداية. قم بتكوين
|
||||
يستخدم الوصول إلى Google Meet Media API عميل OAuth شخصيًا أولًا. قم بتكوين
|
||||
`oauth.clientId` واختياريًا `oauth.clientSecret`، ثم شغّل:
|
||||
|
||||
```bash
|
||||
openclaw googlemeet auth login --json
|
||||
```
|
||||
|
||||
يطبع الأمر كتلة إعداد `oauth` تحتوي على رمز تحديث. وهو يستخدم PKCE،
|
||||
واستدعاء localhost على `http://localhost:8085/oauth2callback`، وتدفق
|
||||
نسخ/لصق يدوي مع `--manual`.
|
||||
يطبع هذا الأمر كتلة تكوين `oauth` تحتوي على refresh token. وهو يستخدم PKCE،
|
||||
واستدعاء localhost على `http://localhost:8085/oauth2callback`، وتدفق نسخ/لصق يدوي مع `--manual`.
|
||||
|
||||
تُقبل متغيرات البيئة التالية كبدائل احتياطية:
|
||||
تُقبل متغيرات البيئة التالية كبدائل:
|
||||
|
||||
- `OPENCLAW_GOOGLE_MEET_CLIENT_ID` أو `GOOGLE_MEET_CLIENT_ID`
|
||||
- `OPENCLAW_GOOGLE_MEET_CLIENT_SECRET` أو `GOOGLE_MEET_CLIENT_SECRET`
|
||||
@ -306,33 +278,33 @@ openclaw googlemeet auth login --json
|
||||
- `OPENCLAW_GOOGLE_MEET_DEFAULT_MEETING` أو `GOOGLE_MEET_DEFAULT_MEETING`
|
||||
- `OPENCLAW_GOOGLE_MEET_PREVIEW_ACK` أو `GOOGLE_MEET_PREVIEW_ACK`
|
||||
|
||||
قم بحل عنوان URL أو الرمز أو `spaces/{id}` الخاص بـ Meet عبر `spaces.get`:
|
||||
حلّ عنوان Meet URL أو رمز الاجتماع أو `spaces/{id}` عبر `spaces.get`:
|
||||
|
||||
```bash
|
||||
openclaw googlemeet resolve-space --meeting https://meet.google.com/abc-defg-hij
|
||||
```
|
||||
|
||||
شغّل الفحص المسبق قبل العمل على الوسائط:
|
||||
شغّل الفحص المسبق قبل أعمال الوسائط:
|
||||
|
||||
```bash
|
||||
openclaw googlemeet preflight --meeting https://meet.google.com/abc-defg-hij
|
||||
```
|
||||
|
||||
اضبط `preview.enrollmentAcknowledged: true` فقط بعد التأكد من أن مشروع Cloud الخاص بك،
|
||||
وكيان OAuth، والمشاركين في الاجتماع مسجّلون في Google
|
||||
Workspace Developer Preview Program لواجهات Meet media APIs.
|
||||
اضبط `preview.enrollmentAcknowledged: true` فقط بعد التأكد من أن مشروع Cloud الخاص بك، وهوية OAuth، والمشاركين في الاجتماع مسجّلون في Google Workspace Developer Preview Program لواجهات Meet media APIs.
|
||||
|
||||
## الإعداد
|
||||
## التكوين
|
||||
|
||||
يحتاج مسار Chrome الشائع للوقت الفعلي فقط إلى تفعيل الـ Plugin، وBlackHole، وSoX،
|
||||
ومفتاح OpenAI:
|
||||
لا يحتاج مسار Chrome الشائع في الوقت الفعلي إلا إلى تفعيل الـ Plugin وBlackHole وSoX ومفتاح موفّر صوت في الوقت الفعلي للواجهة الخلفية. OpenAI هو الافتراضي؛ اضبط
|
||||
`realtime.provider: "google"` لاستخدام Google Gemini Live:
|
||||
|
||||
```bash
|
||||
brew install blackhole-2ch sox
|
||||
export OPENAI_API_KEY=sk-...
|
||||
# or
|
||||
export GEMINI_API_KEY=...
|
||||
```
|
||||
|
||||
اضبط إعداد الـ Plugin ضمن `plugins.entries.google-meet.config`:
|
||||
اضبط تكوين الـ Plugin تحت `plugins.entries.google-meet.config`:
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -347,21 +319,21 @@ export OPENAI_API_KEY=sk-...
|
||||
}
|
||||
```
|
||||
|
||||
القيم الافتراضية:
|
||||
الإعدادات الافتراضية:
|
||||
|
||||
- `defaultTransport: "chrome"`
|
||||
- `defaultMode: "realtime"`
|
||||
- `chromeNode.node`: معرّف/اسم/IP اختياري للـ Node من أجل `chrome-node`
|
||||
- `chromeNode.node`: معرّف/اسم/IP اختياري لـ Node من أجل `chrome-node`
|
||||
- `chrome.audioBackend: "blackhole-2ch"`
|
||||
- `chrome.audioInputCommand`: أمر SoX `rec` يكتب صوت
|
||||
8 كيلوهرتز G.711 mu-law إلى stdout
|
||||
- `chrome.audioOutputCommand`: أمر SoX `play` يقرأ صوت
|
||||
8 كيلوهرتز G.711 mu-law من stdin
|
||||
- `chrome.audioInputCommand`: أمر SoX `rec` يكتب صوت 8 كيلوهرتز G.711 mu-law
|
||||
إلى stdout
|
||||
- `chrome.audioOutputCommand`: أمر SoX `play` يقرأ صوت 8 كيلوهرتز G.711 mu-law
|
||||
من stdin
|
||||
- `realtime.provider: "openai"`
|
||||
- `realtime.toolPolicy: "safe-read-only"`
|
||||
- `realtime.instructions`: ردود صوتية موجزة، مع
|
||||
- `realtime.instructions`: ردود منطوقة موجزة، مع
|
||||
`openclaw_agent_consult` للإجابات الأعمق
|
||||
- `realtime.introMessage`: فحص جاهزية صوتي قصير عندما يتصل جسر الوقت الفعلي؛
|
||||
- `realtime.introMessage`: فحص جاهزية منطوق قصير عند اتصال جسر الوقت الفعلي؛
|
||||
اضبطه على `""` للانضمام بصمت
|
||||
|
||||
تجاوزات اختيارية:
|
||||
@ -378,13 +350,20 @@ export OPENAI_API_KEY=sk-...
|
||||
node: "parallels-macos",
|
||||
},
|
||||
realtime: {
|
||||
provider: "google",
|
||||
toolPolicy: "owner",
|
||||
introMessage: "قل حرفيًا: I'm here.",
|
||||
introMessage: "Say exactly: I'm here.",
|
||||
providers: {
|
||||
google: {
|
||||
model: "gemini-2.5-flash-native-audio-preview-12-2025",
|
||||
voice: "Kore",
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
```
|
||||
|
||||
إعداد خاص بـ Twilio فقط:
|
||||
تكوين خاص بـ Twilio فقط:
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -413,44 +392,35 @@ export OPENAI_API_KEY=sk-...
|
||||
```
|
||||
|
||||
استخدم `transport: "chrome"` عندما يعمل Chrome على مضيف Gateway. واستخدم
|
||||
`transport: "chrome-node"` عندما يعمل Chrome على Node مقترن مثل جهاز
|
||||
افتراضي على Parallels. في كلتا الحالتين، يعمل نموذج الوقت الفعلي و`openclaw_agent_consult` على
|
||||
مضيف Gateway، لذا تبقى بيانات اعتماد النموذج هناك.
|
||||
`transport: "chrome-node"` عندما يعمل Chrome على Node مقترن مثل Parallels
|
||||
VM. في كلتا الحالتين، يعمل نموذج `realtime` و`openclaw_agent_consult` على مضيف Gateway، لذا تبقى بيانات اعتماد النموذج هناك.
|
||||
|
||||
استخدم `action: "status"` لسرد الجلسات النشطة أو فحص معرّف جلسة. واستخدم
|
||||
`action: "speak"` مع `sessionId` و`message` لجعل
|
||||
وكيل الوقت الفعلي يتحدث فورًا. واستخدم `action: "leave"` لوضع علامة على انتهاء الجلسة.
|
||||
`action: "speak"` مع `sessionId` و`message` لجعل وكيل الوقت الفعلي يتحدث فورًا. واستخدم `action: "leave"` لوضع علامة على انتهاء الجلسة.
|
||||
|
||||
```json
|
||||
{
|
||||
"action": "speak",
|
||||
"sessionId": "meet_...",
|
||||
"message": "قل حرفيًا: I'm here and listening."
|
||||
"message": "Say exactly: I'm here and listening."
|
||||
}
|
||||
```
|
||||
|
||||
## استشارة وكيل الوقت الفعلي
|
||||
|
||||
تم تحسين وضع Chrome للوقت الفعلي من أجل حلقة صوتية مباشرة. يسمع
|
||||
موفّر الصوت في الوقت الفعلي صوت الاجتماع ويتحدث عبر جسر الصوت المُكوَّن.
|
||||
وعندما يحتاج نموذج الوقت الفعلي إلى استدلال أعمق، أو معلومات حالية، أو أدوات
|
||||
OpenClaw العادية، يمكنه استدعاء `openclaw_agent_consult`.
|
||||
تم تحسين وضع Chrome `realtime` ليعمل ضمن حلقة صوتية مباشرة. يسمع موفّر الصوت في الوقت الفعلي صوت الاجتماع ويتحدث عبر الجسر الصوتي المُكوَّن. وعندما يحتاج نموذج الوقت الفعلي إلى استدلال أعمق أو معلومات حديثة أو أدوات OpenClaw العادية، يمكنه استدعاء `openclaw_agent_consult`.
|
||||
|
||||
تعمل أداة الاستشارة على تشغيل وكيل OpenClaw العادي في الخلفية مع سياق حديث
|
||||
من نص الاجتماع، وتعيد إجابة صوتية موجزة إلى جلسة الصوت في `realtime`. ويمكن
|
||||
لنموذج الصوت بعد ذلك نطق تلك الإجابة مرة أخرى داخل الاجتماع.
|
||||
تعمل أداة الاستشارة على تشغيل وكيل OpenClaw العادي في الخلفية باستخدام سياق حديث من نص الاجتماع، وتُرجع إجابة منطوقة موجزة إلى جلسة الصوت في الوقت الفعلي. ويمكن لنموذج الصوت بعد ذلك نطق هذه الإجابة داخل الاجتماع.
|
||||
|
||||
يتحكم `realtime.toolPolicy` في تشغيل الاستشارة:
|
||||
|
||||
- `safe-read-only`: يعرض أداة الاستشارة ويقيّد الوكيل العادي إلى
|
||||
- `safe-read-only`: يعرض أداة الاستشارة ويقيّد الوكيل العادي بـ
|
||||
`read` و`web_search` و`web_fetch` و`x_search` و`memory_search` و
|
||||
`memory_get`.
|
||||
- `owner`: يعرض أداة الاستشارة ويتيح للوكيل العادي استخدام سياسة أدوات
|
||||
الوكيل العادية.
|
||||
- `none`: لا يعرض أداة الاستشارة إلى نموذج الصوت في `realtime`.
|
||||
- `owner`: يعرض أداة الاستشارة ويتيح للوكيل العادي استخدام سياسة أدوات الوكيل العادية.
|
||||
- `none`: لا يعرض أداة الاستشارة لنموذج الصوت في الوقت الفعلي.
|
||||
|
||||
يتم تحديد نطاق مفتاح جلسة الاستشارة لكل جلسة Meet، لذا يمكن لاستدعاءات
|
||||
الاستشارة اللاحقة إعادة استخدام سياق الاستشارة السابق أثناء الاجتماع نفسه.
|
||||
يكون مفتاح جلسة الاستشارة مقيّدًا لكل جلسة Meet، لذلك يمكن لاستدعاءات الاستشارة اللاحقة إعادة استخدام سياق الاستشارة السابق خلال الاجتماع نفسه.
|
||||
|
||||
لفرض فحص جاهزية منطوق بعد أن ينضم Chrome بالكامل إلى المكالمة:
|
||||
|
||||
@ -460,29 +430,21 @@ openclaw googlemeet speak meet_... "Say exactly: I'm here and listening."
|
||||
|
||||
## ملاحظات
|
||||
|
||||
إن Media API الرسمية في Google Meet موجّهة نحو الاستقبال، لذا فإن التحدث داخل
|
||||
مكالمة Meet لا يزال يحتاج إلى مسار مشارك. يُبقي هذا الـ Plugin هذا الحد واضحًا:
|
||||
يتولى Chrome مشاركة المتصفح وتوجيه الصوت المحلي؛ ويتولى Twilio مشاركة
|
||||
الاتصال الهاتفي.
|
||||
إن واجهة media API الرسمية في Google Meet موجهة للاستقبال، لذلك لا يزال التحدث داخل مكالمة Meet يحتاج إلى مسار مشارك. يُبقي هذا الـ Plugin هذه الحدود واضحة:
|
||||
يتولى Chrome المشاركة عبر المتصفح وتوجيه الصوت المحلي؛ ويتولى Twilio المشاركة عبر الاتصال الهاتفي.
|
||||
|
||||
يتطلب وضع Chrome في `realtime` أحد الخيارين التاليين:
|
||||
يحتاج وضع Chrome `realtime` إلى أحد الخيارين التاليين:
|
||||
|
||||
- `chrome.audioInputCommand` بالإضافة إلى `chrome.audioOutputCommand`: يمتلك OpenClaw
|
||||
جسر نموذج الوقت الفعلي ويمرر صوت 8 كيلوهرتز G.711 mu-law بين هذين
|
||||
الأمرين وموفّر الصوت المحدد في `realtime`.
|
||||
- `chrome.audioBridgeCommand`: يمتلك أمر جسر خارجي مسار الصوت المحلي بالكامل
|
||||
ويجب أن يخرج بعد بدء خدمته الخلفية أو التحقق منها.
|
||||
- `chrome.audioInputCommand` بالإضافة إلى `chrome.audioOutputCommand`: يمتلك OpenClaw جسر نموذج الوقت الفعلي ويُمرّر صوت 8 كيلوهرتز G.711 mu-law بين هذين الأمرين وموفّر الصوت في الوقت الفعلي المحدد.
|
||||
- `chrome.audioBridgeCommand`: يمتلك أمر جسر خارجي مسار الصوت المحلي بالكامل، ويجب أن يخرج بعد بدء خدمته الخلفية أو التحقق منها.
|
||||
|
||||
للحصول على صوت ثنائي الاتجاه نظيف، وجّه خرج Meet وميكروفون Meet عبر أجهزة
|
||||
افتراضية منفصلة أو مخطط أجهزة افتراضية على نمط Loopback. قد يتسبب جهاز
|
||||
BlackHole مشترك واحد في إعادة صدى المشاركين الآخرين إلى داخل المكالمة.
|
||||
للحصول على صوت مزدوج نظيف، وجّه خرج Meet وميكروفون Meet عبر أجهزة افتراضية منفصلة أو مخطط أجهزة افتراضية على نمط Loopback. قد يتسبب جهاز BlackHole مشترك واحد في إعادة صدى المشاركين الآخرين إلى داخل المكالمة.
|
||||
|
||||
يقوم `googlemeet speak` بتشغيل جسر الصوت النشط في `realtime` لجلسة
|
||||
Chrome. ويقوم `googlemeet leave` بإيقاف ذلك الجسر. أما بالنسبة إلى جلسات Twilio
|
||||
المفوّضة عبر Voice Call Plugin، فإن `leave` ينهي أيضًا مكالمة الصوت الأساسية.
|
||||
يؤدي `googlemeet speak` إلى تشغيل الجسر الصوتي النشط في الوقت الفعلي لجلسة Chrome.
|
||||
ويؤدي `googlemeet leave` إلى إيقاف ذلك الجسر. وبالنسبة إلى جلسات Twilio المفوّضة عبر Plugin مكالمات الصوت، فإن `leave` ينهي أيضًا مكالمة الصوت الأساسية.
|
||||
|
||||
## ذو صلة
|
||||
|
||||
- [Voice call plugin](/ar/plugins/voice-call)
|
||||
- [Plugin مكالمات الصوت](/ar/plugins/voice-call)
|
||||
- [وضع التحدث](/ar/nodes/talk)
|
||||
- [بناء Plugins](/ar/plugins/building-plugins)
|
||||
|
||||
@ -1,46 +1,46 @@
|
||||
---
|
||||
read_when:
|
||||
- تريد إجراء مكالمة صوتية صادرة من OpenClaw
|
||||
- أنت تقوم بإعداد أو تطوير Plugin voice-call
|
||||
summary: 'Plugin Voice Call: المكالمات الصادرة + الواردة عبر Twilio/Telnyx/Plivo (تثبيت Plugin + الإعداد + CLI)'
|
||||
title: Plugin Voice Call
|
||||
- أنت تقوم بإعداد أو تطوير plugin voice-call
|
||||
summary: 'Plugin مكالمات صوتية: مكالمات صادرة + واردة عبر Twilio/Telnyx/Plivo (تثبيت الـ plugin + الإعداد + CLI)'
|
||||
title: plugin المكالمات الصوتية
|
||||
x-i18n:
|
||||
generated_at: "2026-04-24T07:57:10Z"
|
||||
generated_at: "2026-04-24T09:52:42Z"
|
||||
model: gpt-5.4
|
||||
provider: openai
|
||||
source_hash: 4cd57118133506c22604ab9592a823546a91795ab425de4b7a81edbbb8374e6d
|
||||
source_hash: 6aed4e33ce090c86f43c71280f033e446f335c53d42456fdc93c9938250e9af6
|
||||
source_path: plugins/voice-call.md
|
||||
workflow: 15
|
||||
---
|
||||
|
||||
# Voice Call (Plugin)
|
||||
# المكالمات الصوتية (plugin)
|
||||
|
||||
المكالمات الصوتية لـ OpenClaw عبر Plugin. تدعم الإشعارات الصادرة
|
||||
مكالمات صوتية لـ OpenClaw عبر plugin. يدعم الإشعارات الصادرة
|
||||
والمحادثات متعددة الأدوار مع سياسات واردة.
|
||||
|
||||
الموفرون الحاليون:
|
||||
المزوّدون الحاليون:
|
||||
|
||||
- `twilio` (Programmable Voice + Media Streams)
|
||||
- `telnyx` (Call Control v2)
|
||||
- `plivo` (Voice API + XML transfer + GetInput speech)
|
||||
- `mock` (تطوير/من دون شبكة)
|
||||
- `twilio` (`Programmable Voice` + `Media Streams`)
|
||||
- `telnyx` (`Call Control v2`)
|
||||
- `plivo` (`Voice API` + نقل `XML` + كلام `GetInput`)
|
||||
- `mock` (للتطوير/من دون شبكة)
|
||||
|
||||
النموذج الذهني السريع:
|
||||
|
||||
- ثبّت Plugin
|
||||
- ثبّت plugin
|
||||
- أعد تشغيل Gateway
|
||||
- اضبطها تحت `plugins.entries.voice-call.config`
|
||||
- قم بالإعداد ضمن `plugins.entries.voice-call.config`
|
||||
- استخدم `openclaw voicecall ...` أو أداة `voice_call`
|
||||
|
||||
## أين تعمل (محليًا أم عن بُعد)
|
||||
## مكان التشغيل (محلي أم بعيد)
|
||||
|
||||
تعمل Plugin Voice Call **داخل عملية Gateway**.
|
||||
يعمل plugin المكالمات الصوتية **داخل عملية Gateway**.
|
||||
|
||||
إذا كنت تستخدم Gateway بعيدة، فثبّت/اضبط Plugin على **الجهاز الذي يشغّل Gateway**، ثم أعد تشغيل Gateway لتحميلها.
|
||||
إذا كنت تستخدم Gateway بعيدًا، فقم بتثبيت/إعداد plugin على **الجهاز الذي يشغّل Gateway**، ثم أعد تشغيل Gateway لتحميله.
|
||||
|
||||
## التثبيت
|
||||
|
||||
### الخيار A: التثبيت من npm (موصى به)
|
||||
### الخيار A: التثبيت من npm (موصى به)
|
||||
|
||||
```bash
|
||||
openclaw plugins install @openclaw/voice-call
|
||||
@ -48,7 +48,7 @@ openclaw plugins install @openclaw/voice-call
|
||||
|
||||
أعد تشغيل Gateway بعد ذلك.
|
||||
|
||||
### الخيار B: التثبيت من مجلد محلي (تطوير، من دون نسخ)
|
||||
### الخيار B: التثبيت من مجلد محلي (للتطوير، من دون نسخ)
|
||||
|
||||
```bash
|
||||
PLUGIN_SRC=./path/to/local/voice-call-plugin
|
||||
@ -60,7 +60,7 @@ cd "$PLUGIN_SRC" && pnpm install
|
||||
|
||||
## الإعداد
|
||||
|
||||
اضبط الإعداد تحت `plugins.entries.voice-call.config`:
|
||||
اضبط الإعدادات ضمن `plugins.entries.voice-call.config`:
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -69,8 +69,8 @@ cd "$PLUGIN_SRC" && pnpm install
|
||||
"voice-call": {
|
||||
enabled: true,
|
||||
config: {
|
||||
provider: "twilio", // or "telnyx" | "plivo" | "mock"
|
||||
fromNumber: "+15550001234", // or TWILIO_FROM_NUMBER for Twilio
|
||||
provider: "twilio", // أو "telnyx" | "plivo" | "mock"
|
||||
fromNumber: "+15550001234", // أو TWILIO_FROM_NUMBER لـ Twilio
|
||||
toNumber: "+15550005678",
|
||||
|
||||
twilio: {
|
||||
@ -81,8 +81,8 @@ cd "$PLUGIN_SRC" && pnpm install
|
||||
telnyx: {
|
||||
apiKey: "...",
|
||||
connectionId: "...",
|
||||
// Telnyx webhook public key from the Telnyx Mission Control Portal
|
||||
// (Base64 string; can also be set via TELNYX_PUBLIC_KEY).
|
||||
// مفتاح Webhook العام لـ Telnyx من بوابة Telnyx Mission Control
|
||||
// (سلسلة Base64؛ يمكن أيضًا ضبطه عبر TELNYX_PUBLIC_KEY).
|
||||
publicKey: "...",
|
||||
},
|
||||
|
||||
@ -91,19 +91,19 @@ cd "$PLUGIN_SRC" && pnpm install
|
||||
authToken: "...",
|
||||
},
|
||||
|
||||
// Webhook server
|
||||
// خادم Webhook
|
||||
serve: {
|
||||
port: 3334,
|
||||
path: "/voice/webhook",
|
||||
},
|
||||
|
||||
// Webhook security (recommended for tunnels/proxies)
|
||||
// أمان Webhook (موصى به للأنفاق/الوكلاء)
|
||||
webhookSecurity: {
|
||||
allowedHosts: ["voice.example.com"],
|
||||
trustedProxyIPs: ["100.64.0.1"],
|
||||
},
|
||||
|
||||
// Public exposure (pick one)
|
||||
// الإتاحة العامة (اختر واحدًا)
|
||||
// publicUrl: "https://example.ngrok.app/voice/webhook",
|
||||
// tunnel: { provider: "ngrok" },
|
||||
// tailscale: { mode: "funnel", path: "/voice/webhook" }
|
||||
@ -114,11 +114,11 @@ cd "$PLUGIN_SRC" && pnpm install
|
||||
|
||||
streaming: {
|
||||
enabled: true,
|
||||
provider: "openai", // optional; first registered realtime transcription provider when unset
|
||||
provider: "openai", // اختياري؛ أول مزوّد نسخ صوتي فوري مسجّل عند عدم التعيين
|
||||
streamPath: "/voice/stream",
|
||||
providers: {
|
||||
openai: {
|
||||
apiKey: "sk-...", // optional if OPENAI_API_KEY is set
|
||||
apiKey: "sk-...", // اختياري إذا كان OPENAI_API_KEY مضبوطًا
|
||||
model: "gpt-4o-transcribe",
|
||||
silenceDurationMs: 800,
|
||||
vadThreshold: 0.5,
|
||||
@ -129,6 +129,17 @@ cd "$PLUGIN_SRC" && pnpm install
|
||||
maxPendingConnectionsPerIp: 4,
|
||||
maxConnections: 128,
|
||||
},
|
||||
|
||||
realtime: {
|
||||
enabled: false,
|
||||
provider: "google", // اختياري؛ أول مزوّد صوت فوري مسجّل عند عدم التعيين
|
||||
providers: {
|
||||
google: {
|
||||
model: "gemini-2.5-flash-native-audio-preview-12-2025",
|
||||
voice: "Kore",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
@ -138,53 +149,137 @@ cd "$PLUGIN_SRC" && pnpm install
|
||||
|
||||
ملاحظات:
|
||||
|
||||
- يتطلب Twilio/Telnyx عنوان Webhook **قابلًا للوصول علنًا**.
|
||||
- يتطلب Plivo عنوان Webhook **قابلًا للوصول علنًا**.
|
||||
- `mock` هو موفر تطوير محلي (من دون استدعاءات شبكة).
|
||||
- إذا كانت الإعدادات الأقدم لا تزال تستخدم `provider: "log"` أو `twilio.from` أو مفاتيح OpenAI القديمة ضمن `streaming.*`، فشغّل `openclaw doctor --fix` لإعادة كتابتها.
|
||||
- يتطلب Telnyx القيمة `telnyx.publicKey` (أو `TELNYX_PUBLIC_KEY`) ما لم تكن `skipSignatureVerification` تساوي true.
|
||||
- `skipSignatureVerification` مخصصة للاختبار المحلي فقط.
|
||||
- إذا كنت تستخدم ngrok المجانية، فاضبط `publicUrl` على عنوان ngrok الدقيق؛ ويتم فرض التحقق من التوقيع دائمًا.
|
||||
- تسمح `tunnel.allowNgrokFreeTierLoopbackBypass: true` لخطافات Webhook في Twilio ذات التوقيعات غير الصالحة **فقط** عندما تكون `tunnel.provider="ngrok"` و`serve.bind` هي loopback (وكيل ngrok المحلي). استخدم هذا للتطوير المحلي فقط.
|
||||
- يمكن أن تتغير عناوين ngrok المجانية أو تضيف سلوك interstitial؛ وإذا انحرف `publicUrl`، فسيفشل توقيع Twilio. وفي الإنتاج، فضّل نطاقًا ثابتًا أو Tailscale funnel.
|
||||
- القيم الافتراضية لأمان البث:
|
||||
- يتطلّب Twilio/Telnyx عنوان URL لـ Webhook **يمكن الوصول إليه علنًا**.
|
||||
- يتطلّب Plivo عنوان URL لـ Webhook **يمكن الوصول إليه علنًا**.
|
||||
- `mock` هو مزوّد تطوير محلي (من دون استدعاءات شبكة).
|
||||
- إذا كانت الإعدادات الأقدم لا تزال تستخدم `provider: "log"` أو `twilio.from` أو مفاتيح OpenAI القديمة الخاصة بـ `streaming.*`، فشغّل `openclaw doctor --fix` لإعادة كتابتها.
|
||||
- يتطلّب Telnyx القيمة `telnyx.publicKey` (أو `TELNYX_PUBLIC_KEY`) ما لم تكن `skipSignatureVerification` مفعّلة.
|
||||
- الخيار `skipSignatureVerification` مخصّص للاختبار المحلي فقط.
|
||||
- إذا كنت تستخدم المستوى المجاني من ngrok، فاضبط `publicUrl` على عنوان URL الخاص بـ ngrok بدقّة؛ إذ يتم دائمًا فرض التحقق من التوقيع.
|
||||
- القيمة `tunnel.allowNgrokFreeTierLoopbackBypass: true` تسمح بـ Webhook من Twilio ذات التواقيع غير الصالحة **فقط** عندما تكون `tunnel.provider="ngrok"` و`serve.bind` هي loopback (وكيل ngrok المحلي). استخدم ذلك للتطوير المحلي فقط.
|
||||
- قد تتغيّر عناوين URL الخاصة بالمستوى المجاني من Ngrok أو تضيف سلوك صفحات وسيطة؛ إذا انحرفت `publicUrl`، فسيفشل تحقق تواقيع Twilio. للإنتاج، يُفضّل استخدام نطاق ثابت أو Tailscale funnel.
|
||||
- الخيار `realtime.enabled` يبدأ محادثات صوت إلى صوت كاملة؛ لا تفعّله مع `streaming.enabled` في الوقت نفسه.
|
||||
- افتراضات أمان البث:
|
||||
- تقوم `streaming.preStartTimeoutMs` بإغلاق المقابس التي لا ترسل إطار `start` صالحًا أبدًا.
|
||||
- تقيّد `streaming.maxPendingConnections` إجمالي المقابس غير الموثقة قبل البدء.
|
||||
- تقيّد `streaming.maxPendingConnectionsPerIp` المقابس غير الموثقة قبل البدء لكل عنوان IP مصدر.
|
||||
- تقيّد `streaming.maxConnections` إجمالي مقابس تدفق الوسائط المفتوحة (المعلقة + النشطة).
|
||||
- لا يزال الرجوع في وقت التشغيل يقبل مفاتيح voice-call القديمة هذه في الوقت الحالي، لكن مسار إعادة الكتابة هو `openclaw doctor --fix` وطبقة التوافق مؤقتة.
|
||||
- تحدّ `streaming.maxPendingConnections` من إجمالي مقابس ما قبل البدء غير الموثّقة.
|
||||
- تحدّ `streaming.maxPendingConnectionsPerIp` من مقابس ما قبل البدء غير الموثّقة لكل عنوان IP مصدر.
|
||||
- تحدّ `streaming.maxConnections` من إجمالي مقابس تدفقات الوسائط المفتوحة (المعلّقة + النشطة).
|
||||
- لا يزال التراجع وقت التشغيل يقبل مفاتيح voice-call القديمة هذه حاليًا، لكن مسار إعادة الكتابة هو `openclaw doctor --fix` وطبقة التوافق مؤقتة.
|
||||
|
||||
## النسخ أثناء البث
|
||||
## محادثات الصوت الفورية
|
||||
|
||||
تحدد `streaming` موفر نسخ فوريًا لصوت المكالمة المباشر.
|
||||
يختار `realtime` مزوّد صوت فوري ثنائي الاتجاه بالكامل لصوت المكالمة المباشر.
|
||||
وهو منفصل عن `streaming`، الذي يمرّر الصوت فقط إلى
|
||||
مزوّدي النسخ الصوتي الفوري.
|
||||
|
||||
سلوك وقت التشغيل الحالي:
|
||||
|
||||
- تكون `streaming.provider` اختيارية. وإذا لم تُضبط، تستخدم Voice Call أول
|
||||
موفر نسخ فوري مسجّل.
|
||||
- تتضمن موفرو النسخ الفوري المضمنون Deepgram (`deepgram`)،
|
||||
وElevenLabs (`elevenlabs`)، وMistral (`mistral`)، وOpenAI (`openai`)، وxAI
|
||||
(`xai`)، والتي تسجلها Plugins الموفّرين الخاصة بها.
|
||||
- تعيش الإعدادات الخام المملوكة للموفر تحت `streaming.providers.<providerId>`.
|
||||
- إذا كانت `streaming.provider` تشير إلى موفر غير مسجّل، أو لم يكن هناك أي موفر
|
||||
نسخ فوري مسجّل أصلًا، فإن Voice Call تسجل تحذيرًا
|
||||
وتتخطى بث الوسائط بدلًا من إفساد Plugin بالكامل.
|
||||
- `realtime.enabled` مدعوم لتدفقات وسائط Twilio.
|
||||
- لا يمكن الجمع بين `realtime.enabled` و`streaming.enabled`.
|
||||
- الخيار `realtime.provider` اختياري. إذا لم يتم تعيينه، تستخدم Voice Call
|
||||
أول مزوّد صوت فوري مسجّل.
|
||||
- تشمل مزوّدات الصوت الفوري المضمّنة Google Gemini Live (`google`) و
|
||||
OpenAI (`openai`)، ويتم تسجيلها بواسطة plugins المزودات الخاصة بها.
|
||||
- يوجد الإعداد الخام المملوك للمزوّد ضمن `realtime.providers.<providerId>`.
|
||||
- إذا كان `realtime.provider` يشير إلى مزوّد غير مسجّل، أو لم يكن هناك أي مزوّد
|
||||
صوت فوري مسجّل على الإطلاق، تسجّل Voice Call تحذيرًا وتتخطى
|
||||
الوسائط الفورية بدلًا من فشل plugin بالكامل.
|
||||
|
||||
القيم الافتراضية لنسخ OpenAI أثناء البث:
|
||||
افتراضات Google Gemini Live الفورية:
|
||||
|
||||
- مفتاح API: `streaming.providers.openai.apiKey` أو `OPENAI_API_KEY`
|
||||
- النموذج: `gpt-4o-transcribe`
|
||||
- `silenceDurationMs`: `800`
|
||||
- `vadThreshold`: `0.5`
|
||||
- مفتاح API: `realtime.providers.google.apiKey` أو `GEMINI_API_KEY` أو
|
||||
`GOOGLE_GENERATIVE_AI_API_KEY`
|
||||
- النموذج: `gemini-2.5-flash-native-audio-preview-12-2025`
|
||||
- الصوت: `Kore`
|
||||
|
||||
القيم الافتراضية لنسخ xAI أثناء البث:
|
||||
مثال:
|
||||
|
||||
- مفتاح API: `streaming.providers.xai.apiKey` أو `XAI_API_KEY`
|
||||
- نقطة النهاية: `wss://api.x.ai/v1/stt`
|
||||
- `encoding`: `mulaw`
|
||||
- `sampleRate`: `8000`
|
||||
- `endpointingMs`: `800`
|
||||
- `interimResults`: `true`
|
||||
```json5
|
||||
{
|
||||
plugins: {
|
||||
entries: {
|
||||
"voice-call": {
|
||||
config: {
|
||||
provider: "twilio",
|
||||
inboundPolicy: "allowlist",
|
||||
allowFrom: ["+15550005678"],
|
||||
realtime: {
|
||||
enabled: true,
|
||||
provider: "google",
|
||||
instructions: "تحدث بإيجاز واسأل قبل استخدام الأدوات.",
|
||||
providers: {
|
||||
google: {
|
||||
apiKey: "${GEMINI_API_KEY}",
|
||||
model: "gemini-2.5-flash-native-audio-preview-12-2025",
|
||||
voice: "Kore",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
```
|
||||
|
||||
استخدم OpenAI بدلًا من ذلك:
|
||||
|
||||
```json5
|
||||
{
|
||||
plugins: {
|
||||
entries: {
|
||||
"voice-call": {
|
||||
config: {
|
||||
realtime: {
|
||||
enabled: true,
|
||||
provider: "openai",
|
||||
providers: {
|
||||
openai: {
|
||||
apiKey: "${OPENAI_API_KEY}",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
```
|
||||
|
||||
راجع [مزود Google](/ar/providers/google) و[مزود OpenAI](/ar/providers/openai)
|
||||
لخيارات الصوت الفوري الخاصة بكل مزوّد.
|
||||
|
||||
## النسخ الصوتي بالبث
|
||||
|
||||
يختار `streaming` مزوّد نسخ صوتي فوري لصوت المكالمة المباشر.
|
||||
|
||||
سلوك وقت التشغيل الحالي:
|
||||
|
||||
- الخيار `streaming.provider` اختياري. إذا لم يتم تعيينه، تستخدم Voice Call أول
|
||||
مزوّد نسخ صوتي فوري مسجّل.
|
||||
- تشمل مزوّدات النسخ الصوتي الفوري المضمّنة Deepgram (`deepgram`) و
|
||||
ElevenLabs (`elevenlabs`) وMistral (`mistral`) وOpenAI (`openai`) وxAI
|
||||
(`xai`)، ويتم تسجيلها بواسطة plugins المزودات الخاصة بها.
|
||||
- يوجد الإعداد الخام المملوك للمزوّد ضمن `streaming.providers.<providerId>`.
|
||||
- إذا كان `streaming.provider` يشير إلى مزوّد غير مسجّل، أو لم يكن هناك أي مزوّد
|
||||
نسخ صوتي فوري مسجّل على الإطلاق، تسجّل Voice Call تحذيرًا و
|
||||
تتخطى بث الوسائط بدلًا من فشل plugin بالكامل.
|
||||
|
||||
افتراضات النسخ الصوتي بالبث لـ OpenAI:
|
||||
|
||||
- مفتاح API: `streaming.providers.openai.apiKey` أو `OPENAI_API_KEY`
|
||||
- النموذج: `gpt-4o-transcribe`
|
||||
- `silenceDurationMs`: `800`
|
||||
- `vadThreshold`: `0.5`
|
||||
|
||||
افتراضات النسخ الصوتي بالبث لـ xAI:
|
||||
|
||||
- مفتاح API: `streaming.providers.xai.apiKey` أو `XAI_API_KEY`
|
||||
- نقطة النهاية: `wss://api.x.ai/v1/stt`
|
||||
- `encoding`: `mulaw`
|
||||
- `sampleRate`: `8000`
|
||||
- `endpointingMs`: `800`
|
||||
- `interimResults`: `true`
|
||||
|
||||
مثال:
|
||||
|
||||
@ -200,7 +295,7 @@ cd "$PLUGIN_SRC" && pnpm install
|
||||
streamPath: "/voice/stream",
|
||||
providers: {
|
||||
openai: {
|
||||
apiKey: "sk-...", // optional if OPENAI_API_KEY is set
|
||||
apiKey: "sk-...", // اختياري إذا كان OPENAI_API_KEY مضبوطًا
|
||||
model: "gpt-4o-transcribe",
|
||||
silenceDurationMs: 800,
|
||||
vadThreshold: 0.5,
|
||||
@ -228,7 +323,7 @@ cd "$PLUGIN_SRC" && pnpm install
|
||||
streamPath: "/voice/stream",
|
||||
providers: {
|
||||
xai: {
|
||||
apiKey: "${XAI_API_KEY}", // optional if XAI_API_KEY is set
|
||||
apiKey: "${XAI_API_KEY}", // اختياري إذا كان XAI_API_KEY مضبوطًا
|
||||
endpointingMs: 800,
|
||||
language: "en",
|
||||
},
|
||||
@ -241,25 +336,25 @@ cd "$PLUGIN_SRC" && pnpm install
|
||||
}
|
||||
```
|
||||
|
||||
لا تزال المفاتيح القديمة تُرحَّل تلقائيًا بواسطة `openclaw doctor --fix`:
|
||||
لا تزال المفاتيح القديمة تُرحّل تلقائيًا بواسطة `openclaw doctor --fix`:
|
||||
|
||||
- `streaming.sttProvider` → `streaming.provider`
|
||||
- `streaming.openaiApiKey` → `streaming.providers.openai.apiKey`
|
||||
- `streaming.sttModel` → `streaming.providers.openai.model`
|
||||
- `streaming.silenceDurationMs` → `streaming.providers.openai.silenceDurationMs`
|
||||
- `streaming.vadThreshold` → `streaming.providers.openai.vadThreshold`
|
||||
- `streaming.sttProvider` ← `streaming.provider`
|
||||
- `streaming.openaiApiKey` ← `streaming.providers.openai.apiKey`
|
||||
- `streaming.sttModel` ← `streaming.providers.openai.model`
|
||||
- `streaming.silenceDurationMs` ← `streaming.providers.openai.silenceDurationMs`
|
||||
- `streaming.vadThreshold` ← `streaming.providers.openai.vadThreshold`
|
||||
|
||||
## منظف المكالمات القديمة
|
||||
|
||||
استخدم `staleCallReaperSeconds` لإنهاء المكالمات التي لا تستقبل Webhook نهائية
|
||||
أبدًا (على سبيل المثال مكالمات وضع notify التي لا تكتمل). والقيمة الافتراضية هي `0`
|
||||
(معطلة).
|
||||
استخدم `staleCallReaperSeconds` لإنهاء المكالمات التي لا تتلقى أبدًا Webhook نهائيًا
|
||||
(على سبيل المثال، مكالمات وضع الإشعار التي لا تكتمل أبدًا). القيمة الافتراضية هي `0`
|
||||
(معطّل).
|
||||
|
||||
النطاقات الموصى بها:
|
||||
|
||||
- **الإنتاج:** `120`–`300` ثانية للتدفقات على نمط notify.
|
||||
- **الإنتاج:** `120`–`300` ثانية لتدفّقات بنمط الإشعار.
|
||||
- أبقِ هذه القيمة **أعلى من `maxDurationSeconds`** حتى تتمكن المكالمات
|
||||
العادية من الانتهاء. ونقطة بداية جيدة هي `maxDurationSeconds + 30–60` ثانية.
|
||||
العادية من الاكتمال. نقطة بداية جيدة هي `maxDurationSeconds + 30–60` ثانية.
|
||||
|
||||
مثال:
|
||||
|
||||
@ -280,28 +375,28 @@ cd "$PLUGIN_SRC" && pnpm install
|
||||
|
||||
## أمان Webhook
|
||||
|
||||
عندما توجد proxy أو نفق أمام Gateway، تقوم Plugin بإعادة بناء
|
||||
عنوان URL العام من أجل التحقق من التوقيع. وتتحكم هذه الخيارات في الرؤوس
|
||||
المُمررة الموثوقة.
|
||||
عندما يكون وكيل أو نفق أمام Gateway، يعيد plugin إنشاء
|
||||
عنوان URL العام من أجل التحقق من التوقيع. تتحكم هذه الخيارات في رؤوس
|
||||
التمرير التي يتم الوثوق بها.
|
||||
|
||||
تضع `webhookSecurity.allowedHosts` قائمة سماح بالمضيفين من رؤوس إعادة التوجيه.
|
||||
يقوم `webhookSecurity.allowedHosts` بإدراج المضيفين المسموح بهم من رؤوس التمرير.
|
||||
|
||||
تثق `webhookSecurity.trustForwardingHeaders` في الرؤوس المُمررة من دون قائمة سماح.
|
||||
يقوم `webhookSecurity.trustForwardingHeaders` بالوثوق في رؤوس التمرير من دون قائمة سماح.
|
||||
|
||||
لا تثق `webhookSecurity.trustedProxyIPs` في الرؤوس المُمررة إلا عندما يطابق عنوان IP
|
||||
البعيد للطلب القائمة.
|
||||
لا يقوم `webhookSecurity.trustedProxyIPs` بالوثوق في رؤوس التمرير إلا عندما يطابق
|
||||
عنوان IP البعيد للطلب القائمة.
|
||||
|
||||
تكون حماية إعادة تشغيل Webhook مفعلة في Twilio وPlivo. ويتم الإقرار بطلبات Webhook
|
||||
الصالحة المعاد تشغيلها لكن يتم تخطي آثارها الجانبية.
|
||||
تكون حماية إعادة تشغيل Webhook مفعّلة لـ Twilio وPlivo. تتم
|
||||
الاستجابة لطلبات Webhook المعاد تشغيلها والصحيحة ولكن يتم تجاهل آثارها الجانبية.
|
||||
|
||||
تتضمن أدوار محادثة Twilio رمزًا خاصًا بكل دور في استدعاءات `<Gather>`، بحيث لا تستطيع
|
||||
استدعاءات الكلام القديمة/المعاد تشغيلها استيفاء دور نص معلق أحدث.
|
||||
تتضمن أدوار محادثة Twilio رمزًا مميزًا لكل دور في استدعاءات `<Gather>`، لذلك
|
||||
لا يمكن لاستدعاءات الكلام القديمة/المعاد تشغيلها تلبية دور نصي أحدث قيد الانتظار.
|
||||
|
||||
يتم رفض طلبات Webhook غير الموثقة قبل قراءة الجسم عندما تكون رؤوس التوقيع المطلوبة من
|
||||
الموفر مفقودة.
|
||||
يتم رفض طلبات Webhook غير الموثّقة قبل قراءة الجسم عندما تكون رؤوس التوقيع
|
||||
المطلوبة من المزوّد مفقودة.
|
||||
|
||||
تستخدم Webhook الخاصة بـ voice-call ملف تعريف الجسم السابق للمصادقة المشترك (64 KB / 5 ثوانٍ)
|
||||
بالإضافة إلى حد أثناء التنفيذ لكل IP قبل التحقق من التوقيع.
|
||||
يستخدم Webhook الخاص بـ voice-call ملف الجسم المشترك لما قبل المصادقة (64 كيلوبايت / 5 ثوانٍ)
|
||||
بالإضافة إلى حدّ أقصى للطلبات الجارية لكل IP قبل التحقق من التوقيع.
|
||||
|
||||
مثال مع مضيف عام ثابت:
|
||||
|
||||
@ -322,11 +417,11 @@ cd "$PLUGIN_SRC" && pnpm install
|
||||
}
|
||||
```
|
||||
|
||||
## TTS للمكالمات
|
||||
## تحويل النص إلى كلام للمكالمات
|
||||
|
||||
تستخدم Voice Call إعدادات `messages.tts` الأساسية من أجل
|
||||
بث الكلام في المكالمات. ويمكنك تجاوزها تحت إعداد Plugin باستخدام
|
||||
**البنية نفسها** — إذ يتم دمجها بعمق مع `messages.tts`.
|
||||
تستخدم Voice Call إعداد `messages.tts` الأساسي من أجل
|
||||
بث الكلام في المكالمات. يمكنك تجاوزه ضمن إعداد plugin باستخدام
|
||||
**البنية نفسها** — حيث يتم دمجه دمجًا عميقًا مع `messages.tts`.
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -344,15 +439,15 @@ cd "$PLUGIN_SRC" && pnpm install
|
||||
|
||||
ملاحظات:
|
||||
|
||||
- تُرحّل مفاتيح `tts.<provider>` القديمة داخل إعداد Plugin تلقائيًا (`openai`, `elevenlabs`, `microsoft`, `edge`) إلى `tts.providers.<provider>` عند التحميل. فضّل بنية `providers` في الإعدادات الملتزم بها.
|
||||
- **يتم تجاهل Microsoft speech في المكالمات الصوتية** (يتطلب صوت الاتصالات PCM؛ ولا تكشف وسيلة نقل Microsoft الحالية خرج PCM للاتصالات).
|
||||
- يُستخدم TTS الأساسي عند تمكين Twilio media streaming؛ وإلا فإن المكالمات ترجع إلى أصوات الموفّر الأصلية.
|
||||
- إذا كان تدفق وسائط Twilio نشطًا بالفعل، فإن Voice Call لا ترجع إلى TwiML `<Say>`. وإذا لم تكن TTS الخاصة بالاتصالات متاحة في تلك الحالة، يفشل طلب التشغيل بدلًا من خلط مساري تشغيل.
|
||||
- عندما ترجع TTS الخاصة بالاتصالات إلى موفر ثانوي، تسجل Voice Call تحذيرًا بسلسلة الموفّر (`from`, `to`, `attempts`) لأغراض التصحيح.
|
||||
- تتم ترحيل مفاتيح `tts.<provider>` القديمة داخل إعداد plugin (`openai` و`elevenlabs` و`microsoft` و`edge`) تلقائيًا إلى `tts.providers.<provider>` عند التحميل. يُفضَّل استخدام بنية `providers` في الإعدادات المحفوظة.
|
||||
- **يتم تجاهل Microsoft speech في المكالمات الصوتية** (صوت الاتصالات الهاتفية يحتاج إلى PCM؛ وطبقة النقل الحالية الخاصة بـ Microsoft لا توفّر خرج PCM للاتصالات الهاتفية).
|
||||
- يُستخدم TTS الأساسي عندما يكون بث وسائط Twilio مفعّلًا؛ وإلا فستعود المكالمات إلى أصوات المزوّد الأصلية.
|
||||
- إذا كان تدفق وسائط Twilio نشطًا بالفعل، فلن تعود Voice Call إلى `TwiML <Say>`. إذا لم يكن TTS الخاص بالاتصالات الهاتفية متاحًا في هذه الحالة، فسيفشل طلب التشغيل بدلًا من مزج مساري تشغيل.
|
||||
- عندما يعود TTS الخاص بالاتصالات الهاتفية إلى مزوّد ثانوي، تسجّل Voice Call تحذيرًا بسلسلة المزوّد (`from` و`to` و`attempts`) لأغراض تصحيح الأخطاء.
|
||||
|
||||
### مزيد من الأمثلة
|
||||
### المزيد من الأمثلة
|
||||
|
||||
استخدم TTS الأساسية فقط (من دون تجاوز):
|
||||
استخدم TTS الأساسي فقط (من دون تجاوز):
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -367,7 +462,7 @@ cd "$PLUGIN_SRC" && pnpm install
|
||||
}
|
||||
```
|
||||
|
||||
جاوز إلى ElevenLabs للمكالمات فقط (وأبقِ الافتراضي الأساسي في مكان آخر):
|
||||
قم بالتجاوز إلى ElevenLabs للمكالمات فقط (مع إبقاء الإعداد الأساسي الافتراضي في أماكن أخرى):
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -392,7 +487,7 @@ cd "$PLUGIN_SRC" && pnpm install
|
||||
}
|
||||
```
|
||||
|
||||
جاوز نموذج OpenAI فقط للمكالمات (مثال على الدمج العميق):
|
||||
قم بتجاوز نموذج OpenAI فقط للمكالمات (مثال على الدمج العميق):
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -417,23 +512,23 @@ cd "$PLUGIN_SRC" && pnpm install
|
||||
|
||||
## المكالمات الواردة
|
||||
|
||||
تكون سياسة الوارد افتراضيًا `disabled`. ولتمكين المكالمات الواردة، اضبط:
|
||||
تكون سياسة المكالمات الواردة افتراضيًا `disabled`. لتمكين المكالمات الواردة، اضبط:
|
||||
|
||||
```json5
|
||||
{
|
||||
inboundPolicy: "allowlist",
|
||||
allowFrom: ["+15550001234"],
|
||||
inboundGreeting: "Hello! How can I help?",
|
||||
inboundGreeting: "مرحبًا! كيف يمكنني المساعدة؟",
|
||||
}
|
||||
```
|
||||
|
||||
تمثل `inboundPolicy: "allowlist"` شاشة منخفضة الضمان لمعرّف المتصل. تقوم Plugin
|
||||
بتطبيع قيمة `From` التي يوفّرها الموفّر وتقارنها بـ `allowFrom`.
|
||||
يؤكد التحقق من Webhook تسليم الموفّر وسلامة الحمولة، لكنه
|
||||
لا يثبت ملكية رقم المتصل في PSTN/VoIP. تعامل مع `allowFrom` على أنها
|
||||
تصفية لمعرّف المتصل، وليست هوية قوية للمتصل.
|
||||
تمثل `inboundPolicy: "allowlist"` تصفية منخفضة الضمان بناءً على معرّف المتصل. يقوم plugin
|
||||
بتطبيع قيمة `From` التي يوفّرها المزوّد ثم يقارنها مع `allowFrom`.
|
||||
يؤدي التحقق من Webhook إلى توثيق تسليم المزوّد وسلامة الحمولة، لكنه
|
||||
لا يثبت ملكية رقم المتصل على شبكات PSTN/VoIP. تعامل مع `allowFrom` على أنه
|
||||
تصفية لمعرّف المتصل، وليس هوية قوية للمتصل.
|
||||
|
||||
تستخدم الردود التلقائية نظام الوكيل. ويمكن ضبطها عبر:
|
||||
تستخدم الردود التلقائية نظام الوكلاء. اضبطها باستخدام:
|
||||
|
||||
- `responseModel`
|
||||
- `responseSystemPrompt`
|
||||
@ -441,51 +536,51 @@ cd "$PLUGIN_SRC" && pnpm install
|
||||
|
||||
### عقد المخرجات المنطوقة
|
||||
|
||||
بالنسبة إلى الردود التلقائية، تضيف Voice Call عقدًا صارمًا للمخرجات المنطوقة إلى مطالبة النظام:
|
||||
بالنسبة للردود التلقائية، تضيف Voice Call عقدًا صارمًا للمخرجات المنطوقة إلى prompt النظام:
|
||||
|
||||
- `{"spoken":"..."}`
|
||||
|
||||
ثم تستخرج Voice Call نص الكلام بشكل دفاعي:
|
||||
|
||||
- تتجاهل الحمولات المعلَّمة على أنها محتوى تفكير/خطأ.
|
||||
- تحلل JSON المباشر أو JSON المسيّج أو مفاتيح `"spoken"` المضمنة.
|
||||
- ترجع إلى النص العادي وتزيل الفقرات التمهيدية المرجحة للتخطيط/البيانات الوصفية.
|
||||
- تتجاهل الحمولات المعلّمة على أنها محتوى استدلال/خطأ.
|
||||
- تحلل JSON المباشر أو JSON داخل أسوار أو مفاتيح `"spoken"` المضمّنة.
|
||||
- تعود إلى النص العادي وتزيل الفقرات الافتتاحية التي يُحتمل أن تكون تخطيطًا/بيانات وصفية.
|
||||
|
||||
وهذا يُبقي التشغيل المنطوق مركزًا على النص الموجّه للمتصل ويتجنب تسرب نص التخطيط إلى الصوت.
|
||||
هذا يحافظ على تركيز التشغيل الصوتي على النص الموجّه للمتصل ويتجنب تسريب نص التخطيط إلى الصوت.
|
||||
|
||||
### سلوك بدء المحادثة
|
||||
|
||||
بالنسبة إلى مكالمات `conversation` الصادرة، يرتبط التعامل مع الرسالة الأولى بحالة التشغيل المباشر:
|
||||
بالنسبة لمكالمات `conversation` الصادرة، يرتبط التعامل مع الرسالة الأولى بحالة التشغيل المباشر:
|
||||
|
||||
- يتم كبت مسح قائمة المقاطعة والرد التلقائي فقط بينما تكون التحية الأولية تُنطق فعليًا.
|
||||
- لا يتم مسح قائمة انتظار المقاطعة والرد التلقائي إلا أثناء نطق التحية الأولية فعليًا.
|
||||
- إذا فشل التشغيل الأولي، تعود المكالمة إلى `listening` وتبقى الرسالة الأولية في قائمة الانتظار لإعادة المحاولة.
|
||||
- يبدأ التشغيل الأولي لبث Twilio عند اتصال التدفق من دون تأخير إضافي.
|
||||
|
||||
### فترة السماح لقطع تدفق Twilio
|
||||
### مهلة سماح انقطاع تدفق Twilio
|
||||
|
||||
عند انقطاع تدفق وسائط Twilio، تنتظر Voice Call مدة `2000ms` قبل إنهاء المكالمة تلقائيًا:
|
||||
|
||||
- إذا أعاد التدفق الاتصال خلال تلك النافذة، يتم إلغاء الإنهاء التلقائي.
|
||||
- إذا لم تتم إعادة تسجيل أي تدفق بعد فترة السماح، تُنهى المكالمة لمنع بقاء مكالمات نشطة عالقة.
|
||||
- إذا أُعيد اتصال التدفق خلال هذه النافذة، يُلغى الإنهاء التلقائي.
|
||||
- إذا لم يُسجَّل أي تدفق مجددًا بعد فترة السماح، تُنهى المكالمة لمنع بقاء مكالمات نشطة معلّقة.
|
||||
|
||||
## CLI
|
||||
|
||||
```bash
|
||||
openclaw voicecall call --to "+15555550123" --message "Hello from OpenClaw"
|
||||
openclaw voicecall start --to "+15555550123" # alias for call
|
||||
openclaw voicecall start --to "+15555550123" # اسم بديل لـ call
|
||||
openclaw voicecall continue --call-id <id> --message "Any questions?"
|
||||
openclaw voicecall speak --call-id <id> --message "One moment"
|
||||
openclaw voicecall dtmf --call-id <id> --digits "ww123456#"
|
||||
openclaw voicecall end --call-id <id>
|
||||
openclaw voicecall status --call-id <id>
|
||||
openclaw voicecall tail
|
||||
openclaw voicecall latency # summarize turn latency from logs
|
||||
openclaw voicecall latency # يلخّص كمون الأدوار من السجلات
|
||||
openclaw voicecall expose --mode funnel
|
||||
```
|
||||
|
||||
يقرأ `latency` الملف `calls.jsonl` من مسار التخزين الافتراضي لـ voice-call. استخدم
|
||||
تقوم `latency` بقراءة `calls.jsonl` من مسار التخزين الافتراضي لـ voice-call. استخدم
|
||||
`--file <path>` للإشارة إلى سجل مختلف و`--last <n>` لقصر التحليل
|
||||
على آخر N سجلًا (الافتراضي 200). ويتضمن الإخراج القيم p50/p90/p99 لكمون
|
||||
على آخر N من السجلات (الافتراضي 200). يتضمن الناتج p50/p90/p99 لكمون
|
||||
الأدوار وأزمنة انتظار الاستماع.
|
||||
|
||||
## أداة الوكيل
|
||||
@ -494,26 +589,26 @@ openclaw voicecall expose --mode funnel
|
||||
|
||||
الإجراءات:
|
||||
|
||||
- `initiate_call` (`message`, `to?`, `mode?`)
|
||||
- `continue_call` (`callId`, `message`)
|
||||
- `speak_to_user` (`callId`, `message`)
|
||||
- `send_dtmf` (`callId`, `digits`)
|
||||
- `end_call` (`callId`)
|
||||
- `get_status` (`callId`)
|
||||
- `initiate_call` (`message` و`to?` و`mode?`)
|
||||
- `continue_call` (`callId` و`message`)
|
||||
- `speak_to_user` (`callId` و`message`)
|
||||
- `send_dtmf` (`callId` و`digits`)
|
||||
- `end_call` (`callId`)
|
||||
- `get_status` (`callId`)
|
||||
|
||||
يشحن هذا المستودع وثيقة Skill مطابقة عند `skills/voice-call/SKILL.md`.
|
||||
يشحن هذا المستودع مستند Skills مطابقًا في `skills/voice-call/SKILL.md`.
|
||||
|
||||
## Gateway RPC
|
||||
|
||||
- `voicecall.initiate` (`to?`, `message`, `mode?`)
|
||||
- `voicecall.continue` (`callId`, `message`)
|
||||
- `voicecall.speak` (`callId`, `message`)
|
||||
- `voicecall.dtmf` (`callId`, `digits`)
|
||||
- `voicecall.end` (`callId`)
|
||||
- `voicecall.status` (`callId`)
|
||||
- `voicecall.initiate` (`to?` و`message` و`mode?`)
|
||||
- `voicecall.continue` (`callId` و`message`)
|
||||
- `voicecall.speak` (`callId` و`message`)
|
||||
- `voicecall.dtmf` (`callId` و`digits`)
|
||||
- `voicecall.end` (`callId`)
|
||||
- `voicecall.status` (`callId`)
|
||||
|
||||
## ذو صلة
|
||||
## ذي صلة
|
||||
|
||||
- [تحويل النص إلى كلام](/ar/tools/tts)
|
||||
- [وضع Talk](/ar/nodes/talk)
|
||||
- [تنبيه الصوت](/ar/nodes/voicewake)
|
||||
- [وضع التحدث](/ar/nodes/talk)
|
||||
- [التنبيه الصوتي](/ar/nodes/voicewake)
|
||||
|
||||
@ -1,88 +1,89 @@
|
||||
---
|
||||
read_when:
|
||||
- تبحث عن نظرة عامة على إمكانات الوسائط
|
||||
- تحديد مزوّد الوسائط الذي ينبغي تكوينه
|
||||
- فهم كيفية عمل توليد الوسائط غير المتزامن
|
||||
summary: صفحة هبوط موحدة لإمكانات توليد الوسائط، وفهمها، والكلام
|
||||
- هل تبحث عن نظرة عامة على إمكانات الوسائط؟
|
||||
- اتخاذ قرار بشأن موفّر الوسائط الذي يجب تكوينه
|
||||
- فهم كيفية عمل إنشاء الوسائط غير المتزامن
|
||||
summary: صفحة وصول موحّدة لقدرات إنشاء الوسائط وفهمها والكلام
|
||||
title: نظرة عامة على الوسائط
|
||||
x-i18n:
|
||||
generated_at: "2026-04-24T08:10:23Z"
|
||||
generated_at: "2026-04-24T09:52:42Z"
|
||||
model: gpt-5.4
|
||||
provider: openai
|
||||
source_hash: 469fb173ac3853011b8cd4f89f3ab97dd7d14e12e4e1d7d87e84de05d025a593
|
||||
source_hash: 39848c6104ebd4feeb37b233b70f3312fa076b535c3b3780336729eb9fdfa4e6
|
||||
source_path: tools/media-overview.md
|
||||
workflow: 15
|
||||
---
|
||||
|
||||
# توليد الوسائط وفهمها
|
||||
# إنشاء الوسائط وفهمها
|
||||
|
||||
ينشئ OpenClaw الصور، والفيديوهات، والموسيقى، ويفهم الوسائط الواردة (الصور، والصوت، والفيديو)، وينطق الردود بصوت مسموع عبر تحويل النص إلى كلام. جميع إمكانات الوسائط مدفوعة بالأدوات: يقرر الوكيل متى يستخدمها بناءً على المحادثة، ولا تظهر كل أداة إلا عندما يكون هناك مزوّد داعم واحد على الأقل مكوّن.
|
||||
ينشئ OpenClaw الصور ومقاطع الفيديو والموسيقى، ويفهم الوسائط الواردة (الصور والصوت والفيديو)، وينطق الردود بصوت مسموع باستخدام تحويل النص إلى كلام. جميع إمكانات الوسائط تعتمد على الأدوات: يقرّر الوكيل متى يستخدمها بناءً على المحادثة، ولا تظهر كل أداة إلا عند تكوين موفّر داعم واحد على الأقل.
|
||||
|
||||
## الإمكانات في لمحة
|
||||
|
||||
| الإمكانية | الأداة | المزوّدون | ما الذي تفعله |
|
||||
| -------------------- | ----------------- | ------------------------------------------------------------------------------------------- | --------------------------------------------------------- |
|
||||
| توليد الصور | `image_generate` | ComfyUI، وfal، وGoogle، وMiniMax، وOpenAI، وVydra، وxAI | تنشئ الصور أو تحررها من مطالبات نصية أو مراجع |
|
||||
| توليد الفيديو | `video_generate` | Alibaba، وBytePlus، وComfyUI، وfal، وGoogle، وMiniMax، وOpenAI، وQwen، وRunway، وTogether، وVydra، وxAI | تنشئ فيديوهات من نصوص، أو صور، أو فيديوهات موجودة |
|
||||
| توليد الموسيقى | `music_generate` | ComfyUI، وGoogle، وMiniMax | تنشئ موسيقى أو مسارات صوتية من مطالبات نصية |
|
||||
| تحويل النص إلى كلام (TTS) | `tts` | ElevenLabs، وMicrosoft، وMiniMax، وOpenAI، وxAI | يحول الردود الصادرة إلى صوت منطوق |
|
||||
| فهم الوسائط | (تلقائي) | أي مزوّد نموذج قادر على الرؤية/الصوت، بالإضافة إلى احتياطات CLI | يلخّص الصور، والصوت، والفيديو الواردة |
|
||||
| الإمكانية | الأداة | الموفّرون | ما الذي تفعله |
|
||||
| ------------------- | ------------------ | -------------------------------------------------------------------------------------------- | -------------------------------------------------------- |
|
||||
| إنشاء الصور | `image_generate` | ComfyUI, fal, Google, MiniMax, OpenAI, Vydra, xAI | تنشئ الصور أو تعدّلها من مطالبات نصية أو مراجع |
|
||||
| إنشاء الفيديو | `video_generate` | Alibaba, BytePlus, ComfyUI, fal, Google, MiniMax, OpenAI, Qwen, Runway, Together, Vydra, xAI | تنشئ مقاطع فيديو من نصوص أو صور أو مقاطع فيديو موجودة |
|
||||
| إنشاء الموسيقى | `music_generate` | ComfyUI, Google, MiniMax | تنشئ موسيقى أو مسارات صوتية من مطالبات نصية |
|
||||
| تحويل النص إلى كلام (TTS) | `tts` | ElevenLabs, Google, Microsoft, MiniMax, OpenAI, xAI | تحوّل الردود الصادرة إلى صوت منطوق |
|
||||
| فهم الوسائط | (تلقائي) | أي موفّر نماذج يدعم الرؤية أو الصوت، بالإضافة إلى بدائل CLI الاحتياطية | يلخّص الصور والصوت والفيديو الوارد |
|
||||
|
||||
## مصفوفة إمكانات المزوّدين
|
||||
## مصفوفة إمكانات الموفّرين
|
||||
|
||||
يوضح هذا الجدول المزوّدين الذين يدعمون إمكانات الوسائط المختلفة عبر المنصة.
|
||||
يوضح هذا الجدول الموفّرين الذين يدعمون إمكانات الوسائط المختلفة عبر المنصة.
|
||||
|
||||
| المزوّد | الصور | الفيديو | الموسيقى | TTS | STT / النسخ | فهم الوسائط |
|
||||
| ----------- | ----- | ------- | -------- | --- | ----------- | ----------- |
|
||||
| Alibaba | | Yes | | | | |
|
||||
| BytePlus | | Yes | | | | |
|
||||
| ComfyUI | Yes | Yes | Yes | | | |
|
||||
| Deepgram | | | | | Yes | |
|
||||
| ElevenLabs | | | | Yes | Yes | |
|
||||
| fal | Yes | Yes | | | | |
|
||||
| Google | Yes | Yes | Yes | | | Yes |
|
||||
| Microsoft | | | | Yes | | |
|
||||
| MiniMax | Yes | Yes | Yes | Yes | | |
|
||||
| Mistral | | | | | Yes | |
|
||||
| OpenAI | Yes | Yes | | Yes | Yes | Yes |
|
||||
| Qwen | | Yes | | | | |
|
||||
| Runway | | Yes | | | | |
|
||||
| Together | | Yes | | | | |
|
||||
| Vydra | Yes | Yes | | | | |
|
||||
| xAI | Yes | Yes | | Yes | Yes | Yes |
|
||||
| الموفّر | الصور | الفيديو | الموسيقى | TTS | STT / التفريغ النصي | الصوت الفوري | فهم الوسائط |
|
||||
| ---------- | ----- | ------- | -------- | --- | ------------------- | ------------ | ----------- |
|
||||
| Alibaba | | نعم | | | | | |
|
||||
| BytePlus | | نعم | | | | | |
|
||||
| ComfyUI | نعم | نعم | نعم | | | | |
|
||||
| Deepgram | | | | | نعم | | |
|
||||
| ElevenLabs | | | | نعم | نعم | | |
|
||||
| fal | نعم | نعم | | | | | |
|
||||
| Google | نعم | نعم | نعم | نعم | | نعم | نعم |
|
||||
| Microsoft | | | | نعم | | | |
|
||||
| MiniMax | نعم | نعم | نعم | نعم | | | |
|
||||
| Mistral | | | | | نعم | | |
|
||||
| OpenAI | نعم | نعم | | نعم | نعم | نعم | نعم |
|
||||
| Qwen | | نعم | | | | | |
|
||||
| Runway | | نعم | | | | | |
|
||||
| Together | | نعم | | | | | |
|
||||
| Vydra | نعم | نعم | | | | | |
|
||||
| xAI | نعم | نعم | | نعم | نعم | | نعم |
|
||||
|
||||
<Note>
|
||||
يستخدم فهم الوسائط أي نموذج قادر على الرؤية أو الصوت مسجل في تكوين المزوّد لديك. يسلط الجدول أعلاه الضوء على المزوّدين الذين لديهم دعم مخصص لفهم الوسائط؛ كما أن معظم مزوّدي LLM الذين لديهم نماذج متعددة الوسائط (Anthropic، وGoogle، وOpenAI، وغيرهم) يمكنهم أيضًا فهم الوسائط الواردة عند تكوينهم كنموذج الرد النشط.
|
||||
يستخدم فهم الوسائط أي نموذج يدعم الرؤية أو الصوت ومسجّلًا في إعدادات الموفّر لديك. يبرز الجدول أعلاه الموفّرين الذين لديهم دعم مخصّص لفهم الوسائط؛ كما يمكن لمعظم موفّري LLM الذين يقدّمون نماذج متعددة الوسائط (Anthropic وGoogle وOpenAI وغيرهم) فهم الوسائط الواردة أيضًا عند تكوينهم كنموذج الرد النشط.
|
||||
</Note>
|
||||
|
||||
## كيف يعمل التوليد غير المتزامن
|
||||
## كيف يعمل الإنشاء غير المتزامن
|
||||
|
||||
يعمل توليد الفيديو والموسيقى كمهام في الخلفية لأن معالجة المزوّد تستغرق عادةً من 30 ثانية إلى عدة دقائق. عندما يستدعي الوكيل `video_generate` أو `music_generate`، يرسل OpenClaw الطلب إلى المزوّد، ويعيد معرّف مهمة فورًا، ويتتبع المهمة في سجل المهام. ويستمر الوكيل في الرد على الرسائل الأخرى أثناء تشغيل المهمة. وعندما ينتهي المزوّد، يقوم OpenClaw بتنبيه الوكيل حتى يتمكن من نشر الوسائط المكتملة مرة أخرى في القناة الأصلية. أما توليد الصور وTTS فهما متزامنان ويكتملان ضمن الرد نفسه.
|
||||
يعمل إنشاء الفيديو والموسيقى كمهام في الخلفية لأن معالجة الموفّر تستغرق عادةً من 30 ثانية إلى عدة دقائق. عندما يستدعي الوكيل `video_generate` أو `music_generate`، يرسل OpenClaw الطلب إلى الموفّر، ويُرجع معرّف مهمة فورًا، ويتتبّع المهمة في سجل المهام. يواصل الوكيل الرد على الرسائل الأخرى أثناء تشغيل المهمة. وعندما ينتهي الموفّر، يوقظ OpenClaw الوكيل حتى يتمكن من نشر الوسائط المكتملة مرة أخرى في القناة الأصلية. إنشاء الصور وTTS متزامنان ويكتملان ضمن الرد نفسه.
|
||||
|
||||
يمكن لكل من Deepgram وElevenLabs وMistral وOpenAI وxAI نسخ
|
||||
الصوت الوارد عبر مسار الدفعات `tools.media.audio` عند تكوينها. كما يسجل
|
||||
كل من Deepgram وElevenLabs وMistral وOpenAI وxAI مزوّدي STT للبث
|
||||
ضمن Voice Call، بحيث يمكن تمرير صوت الهاتف الحي إلى المورّد المحدد
|
||||
من دون انتظار تسجيل مكتمل.
|
||||
يمكن لكل من Deepgram وElevenLabs وMistral وOpenAI وxAI تفريغ
|
||||
الصوت الوارد نصيًا عبر مسار الدُفعات `tools.media.audio` عند التكوين. كما
|
||||
تسجّل Deepgram وElevenLabs وMistral وOpenAI وxAI أيضًا موفّري STT
|
||||
بثّيين لمكالمات الصوت، بحيث يمكن تمرير صوت الهاتف الحي إلى المورّد المحدد
|
||||
من دون انتظار اكتمال التسجيل.
|
||||
|
||||
يرتبط OpenAI بأسطح OpenClaw الخاصة بالصور، والفيديو، وTTS الدفعي، وSTT الدفعي، وSTT
|
||||
المتدفق ضمن Voice Call، والصوت في الوقت الحقيقي، وعمليات تضمين الذاكرة. ويرتبط xAI حاليًا
|
||||
بأسطح OpenClaw الخاصة بالصور، والفيديو، والبحث، وتنفيذ الشيفرة، وTTS الدفعي، وSTT الدفعي،
|
||||
وSTT المتدفق ضمن Voice Call. ويعد صوت xAI في الوقت الحقيقي إمكانية
|
||||
upstream، لكنه غير مسجل في OpenClaw حتى يصبح عقد الصوت في الوقت الحقيقي المشترك قادرًا
|
||||
على تمثيله.
|
||||
يرتبط Google بواجهات OpenClaw الخاصة بالصور والفيديو والموسيقى وTTS الدفعي والصوت الفوري في الواجهة الخلفية
|
||||
وفهم الوسائط. ويرتبط OpenAI بواجهات OpenClaw الخاصة بالصور
|
||||
والفيديو وTTS الدفعي وSTT الدفعي وSTT البثّي لمكالمات الصوت والصوت الفوري في الواجهة الخلفية
|
||||
وواجهات تضمين الذاكرة. ويرتبط xAI حاليًا بواجهات OpenClaw الخاصة بالصور والفيديو
|
||||
والبحث وتنفيذ الشيفرة وTTS الدفعي وSTT الدفعي وSTT البثّي لمكالمات الصوت.
|
||||
ويُعد الصوت الفوري في xAI قدرة متاحة من المصدر، لكنه غير
|
||||
مسجّل في OpenClaw حتى يتمكن عقد الصوت الفوري المشترك من تمثيله.
|
||||
|
||||
## روابط سريعة
|
||||
|
||||
- [توليد الصور](/ar/tools/image-generation) -- توليد الصور وتحريرها
|
||||
- [توليد الفيديو](/ar/tools/video-generation) -- نص إلى فيديو، وصورة إلى فيديو، وفيديو إلى فيديو
|
||||
- [توليد الموسيقى](/ar/tools/music-generation) -- إنشاء الموسيقى والمسارات الصوتية
|
||||
- [إنشاء الصور](/ar/tools/image-generation) -- إنشاء الصور وتعديلها
|
||||
- [إنشاء الفيديو](/ar/tools/video-generation) -- تحويل النص إلى فيديو، والصورة إلى فيديو، والفيديو إلى فيديو
|
||||
- [إنشاء الموسيقى](/ar/tools/music-generation) -- إنشاء الموسيقى والمسارات الصوتية
|
||||
- [تحويل النص إلى كلام](/ar/tools/tts) -- تحويل الردود إلى صوت منطوق
|
||||
- [فهم الوسائط](/ar/nodes/media-understanding) -- فهم الصور، والصوت، والفيديو الواردة
|
||||
- [فهم الوسائط](/ar/nodes/media-understanding) -- فهم الصور والصوت والفيديو الواردة
|
||||
|
||||
## ذو صلة
|
||||
|
||||
- [توليد الصور](/ar/tools/image-generation)
|
||||
- [توليد الفيديو](/ar/tools/video-generation)
|
||||
- [توليد الموسيقى](/ar/tools/music-generation)
|
||||
- [إنشاء الصور](/ar/tools/image-generation)
|
||||
- [إنشاء الفيديو](/ar/tools/video-generation)
|
||||
- [إنشاء الموسيقى](/ar/tools/music-generation)
|
||||
- [تحويل النص إلى كلام](/ar/tools/tts)
|
||||
|
||||
Loading…
Reference in New Issue
Block a user