Bundled plugin guides
Plugin Google Meet
پشتیبانی شرکتکننده Google Meet برای OmeniaClaw — این Plugin طبق طراحی صریح است:
- فقط به یک URL صریح
https://meet.google.com/...میپیوندد. - میتواند از طریق Google Meet API یک فضای Meet جدید ایجاد کند و سپس به URL بازگرداندهشده بپیوندد.
agentحالت پیشفرض پاسخگویی است: رونویسی بیدرنگ گوش میدهد، عامل پیکربندیشده OmeniaClaw پاسخ میدهد، و TTS معمول OmeniaClaw در Meet صحبت میکند.bidiهمچنان بهعنوان حالت پشتیبان مدل صوتی بیدرنگ مستقیم در دسترس است.- عاملها رفتار پیوستن را با
modeانتخاب میکنند: ازagentبرای گوشدادن/پاسخگویی زنده، ازbidiبرای پشتیبان صوتی بیدرنگ مستقیم، یا ازtranscribeبرای پیوستن/کنترل مرورگر بدون پل پاسخگویی استفاده کنید. - احراز هویت ابتدا بهصورت Google OAuth شخصی یا یک پروفایل Chrome از قبل واردشده شروع میشود.
- اعلام رضایت خودکار وجود ندارد.
- backend صوتی پیشفرض Chrome برابر
BlackHole 2chاست. - Chrome میتواند بهصورت محلی یا روی یک میزبان Node جفتشده اجرا شود.
- Twilio یک شماره شمارهگیری بههمراه PIN اختیاری یا دنباله DTMF را میپذیرد؛ نمیتواند مستقیما با URL مربوط به Meet تماس بگیرد.
- دستور CLI برابر
googlemeetاست؛meetبرای گردشکارهای گستردهتر کنفرانس از راه دور عامل رزرو شده است.
شروع سریع
وابستگیهای صوتی محلی را نصب کنید و یک provider رونویسی بیدرنگ بههمراه
TTS معمول OmeniaClaw را پیکربندی کنید. OpenAI provider پیشفرض رونویسی است؛
Google Gemini Live نیز بهعنوان یک پشتیبان صوتی bidi جداگانه با
realtime.voiceProvider: "google" کار میکند:
brew install blackhole-2ch soxexport OPENAI_API_KEY=sk-...# only needed when realtime.voiceProvider is "google" for bidi modeexport GEMINI_API_KEY=...blackhole-2ch دستگاه صوتی مجازی BlackHole 2ch را نصب میکند. نصبکننده
Homebrew پیش از آنکه macOS دستگاه را نمایان کند، به راهاندازی دوباره نیاز دارد:
sudo rebootپس از راهاندازی دوباره، هر دو بخش را بررسی کنید:
system_profiler SPAudioDataType | grep -i BlackHolecommand -v soxPlugin را فعال کنید:
{ plugins: { entries: { "google-meet": { enabled: true, config: {}, }, }, },}راهاندازی را بررسی کنید:
OmeniaClaw googlemeet setupخروجی setup برای خوانایی توسط عامل و آگاهی از حالت طراحی شده است. پروفایل
Chrome، اتصال به Node، و برای پیوستنهای بیدرنگ Chrome، پل صوتی BlackHole/SoX
و بررسیهای مقدمه بیدرنگ با تأخیر را گزارش میکند. برای پیوستنهای فقط-مشاهده،
همان انتقال را با --mode transcribe بررسی کنید؛ این حالت پیشنیازهای صوتی
بیدرنگ را رد میکند چون از طریق پل گوش نمیدهد یا صحبت نمیکند:
OmeniaClaw googlemeet setup --transport chrome-node --mode transcribeوقتی واگذاری Twilio پیکربندی شده باشد، setup همچنین گزارش میکند که آیا
Plugin voice-call، اعتبارنامههای Twilio، و در دسترس بودن Webhook عمومی آمادهاند یا نه.
هر بررسی ok: false را پیش از درخواست از عامل برای پیوستن، برای transport و حالت
بررسیشده یک blocker در نظر بگیرید. برای اسکریپتها یا خروجی قابلخواندن توسط ماشین
از OmeniaClaw googlemeet setup --json استفاده کنید. برای پیشپرواز یک transport مشخص
پیش از تلاش عامل، از --transport chrome،
--transport chrome-node، یا --transport twilio استفاده کنید.
برای Twilio، وقتی transport پیشفرض Chrome است، همیشه transport را بهصورت صریح پیشپرواز کنید:
OmeniaClaw googlemeet setup --transport twilioاین کار نبود اتصال voice-call، اعتبارنامههای Twilio، یا دسترسیناپذیری
Webhook را پیش از تلاش عامل برای شمارهگیری جلسه تشخیص میدهد.
به یک جلسه بپیوندید:
OmeniaClaw googlemeet join https://meet.google.com/abc-defg-hijیا اجازه دهید یک عامل از طریق ابزار google_meet بپیوندد:
{ "action": "join", "url": "https://meet.google.com/abc-defg-hij", "transport": "chrome-node", "mode": "agent"}ابزار روبهعامل google_meet روی میزبانهای غیر macOS برای جریانهای artifact،
calendar، setup، transcribe، Twilio، و chrome-node همچنان در دسترس میماند. کنشهای
پاسخگویی Chrome محلی در آنجا مسدود میشوند، چون مسیر صوتی Chrome همراهشده در حال حاضر
به BlackHole 2ch در macOS وابسته است. روی Linux، برای مشارکت پاسخگویی Chrome
از mode: "transcribe"، شمارهگیری Twilio، یا یک میزبان macOS chrome-node استفاده کنید.
یک جلسه جدید ایجاد کنید و به آن بپیوندید:
OmeniaClaw googlemeet create --transport chrome-node --mode agentبرای اتاقهای ایجادشده با API، وقتی میخواهید سیاست ورود بدون knock اتاق
بهجای ارثبری از پیشفرضهای حساب Google صریح باشد، از Google Meet
SpaceConfig.accessType استفاده کنید:
OmeniaClaw googlemeet create --access-type OPEN --transport chrome-node --mode agentOPEN به هر کسی که URL مربوط به Meet را دارد اجازه میدهد بدون knock بپیوندد. TRUSTED
به کاربران مورداعتماد سازمان میزبان، کاربران خارجی دعوتشده، و کاربران dial-in اجازه میدهد
بدون knock بپیوندند. RESTRICTED ورود بدون knock را به دعوتشدگان محدود میکند. این
تنظیمات فقط برای مسیر رسمی ایجاد با Google Meet API اعمال میشوند، بنابراین اعتبارنامههای
OAuth باید پیکربندی شده باشند.
اگر پیش از در دسترس بودن این گزینه Google Meet را احراز هویت کردهاید، پس از افزودن scope
meetings.space.settings به صفحه رضایت Google OAuth خود، دوباره
OmeniaClaw googlemeet auth login --json را اجرا کنید.
فقط URL را بدون پیوستن ایجاد کنید:
OmeniaClaw googlemeet create --no-joingooglemeet create دو مسیر دارد:
- ایجاد با API: وقتی اعتبارنامههای OAuth مربوط به Google Meet پیکربندی شده باشند استفاده میشود. این قطعیترین مسیر است و به وضعیت UI مرورگر وابسته نیست.
- پشتیبان مرورگر: وقتی اعتبارنامههای OAuth وجود نداشته باشند استفاده میشود. OmeniaClaw از
Node ثابتشده Chrome استفاده میکند،
https://meet.google.com/newرا باز میکند، منتظر میماند Google به یک URL واقعی دارای کد جلسه redirect کند، سپس آن URL را برمیگرداند. این مسیر نیاز دارد پروفایل Chrome متعلق به OmeniaClaw روی Node از قبل وارد Google شده باشد. خودکارسازی مرورگر prompt اولین اجرای میکروفون خود Meet را مدیریت میکند؛ آن prompt بهعنوان شکست ورود Google در نظر گرفته نمیشود. جریانهای پیوستن و ایجاد همچنین تلاش میکنند پیش از باز کردن یک مورد جدید، از یک تب موجود Meet دوباره استفاده کنند. تطبیق، query stringهای بیضرر URL مانندauthuserرا نادیده میگیرد، بنابراین تلاش دوباره عامل باید بهجای ایجاد تب دوم Chrome، جلسه از قبل باز را focus کند.
خروجی دستور/ابزار شامل یک فیلد source (api یا browser) است تا عاملها
بتوانند توضیح دهند کدام مسیر استفاده شده است. create بهصورت پیشفرض به جلسه جدید میپیوندد و
joined: true بههمراه نشست پیوستن را برمیگرداند. برای فقط ساختن URL، در CLI از
create --no-join استفاده کنید یا "join": false را به ابزار بدهید.
یا به یک عامل بگویید: «یک Google Meet ایجاد کن، با حالت پاسخگویی عامل به آن بپیوند،
و لینک را برایم بفرست.» عامل باید google_meet را با
action: "create" فراخوانی کند و سپس meetingUri بازگرداندهشده را به اشتراک بگذارد.
{ "action": "create", "transport": "chrome-node", "mode": "agent"}برای پیوستن فقط-مشاهده/کنترل مرورگر، "mode": "transcribe" را تنظیم کنید. این کار
پل صوتی بیدرنگ دوطرفه را شروع نمیکند، به BlackHole یا SoX نیاز ندارد،
و در جلسه پاسخ نمیدهد. پیوستنهای Chrome در این حالت همچنین از اعطای مجوز
میکروفون/دوربین OmeniaClaw و مسیر Use
microphone در Meet پرهیز میکنند. اگر Meet یک interstitial انتخاب صدا نشان دهد، خودکارسازی
مسیر بدون میکروفون را امتحان میکند و در غیر این صورت بهجای باز کردن میکروفون محلی،
یک اقدام دستی گزارش میکند. در حالت transcribe، transportهای Chrome مدیریتشده همچنین
یک observer زیرنویس Meet بهصورت best-effort نصب میکنند. googlemeet status --json و
googlemeet doctor موارد captioning، captionsEnabledAttempted،
transcriptLines، lastCaptionAt، lastCaptionSpeaker، lastCaptionText،
و یک دنباله کوتاه recentTranscript را نشان میدهند تا operatorها بتوانند تشخیص دهند آیا مرورگر
به تماس پیوسته و آیا زیرنویسهای Meet متن تولید میکنند یا نه.
وقتی به یک probe بله/خیر نیاز دارید از OmeniaClaw googlemeet test-listen <meet-url> --transport chrome-node
استفاده کنید: این دستور در حالت transcribe میپیوندد، منتظر حرکت تازه در caption یا transcript میماند،
و listenVerified، listenTimedOut، فیلدهای اقدام دستی، و تازهترین وضعیت سلامت caption را برمیگرداند.
در طول نشستهای بیدرنگ، وضعیت google_meet شامل سلامت مرورگر و پل صوتی مانند
inCall، manualActionRequired، providerConnected،
realtimeReady، audioInputActive، audioOutputActive، زمانمهرهای آخرین ورودی/خروجی،
شمارندههای بایت، و وضعیت بسته بودن پل است. اگر یک prompt امن صفحه Meet ظاهر شود،
خودکارسازی مرورگر وقتی بتواند آن را مدیریت میکند. ورود، پذیرش میزبان، و promptهای مجوز
مرورگر/OS بهعنوان اقدام دستی همراه با دلیل و پیام برای انتقال توسط عامل گزارش میشوند.
نشستهای Chrome مدیریتشده فقط پس از آن intro یا عبارت test را emit میکنند که سلامت مرورگر
inCall: true را گزارش کند؛ در غیر این صورت وضعیت speechReady: false را گزارش میکند و
تلاش برای صحبت بهجای وانمود کردن به اینکه عامل در جلسه صحبت کرده، مسدود میشود.
پیوستنهای Chrome محلی از طریق پروفایل مرورگر OmeniaClaw واردشده انجام میشوند. حالت بیدرنگ
برای مسیر میکروفون/اسپیکر مورد استفاده OmeniaClaw به BlackHole 2ch نیاز دارد. برای
صدای دوطرفه تمیز، از دستگاههای مجازی جداگانه یا یک گراف سبک Loopback استفاده کنید؛ یک دستگاه
BlackHole واحد برای نخستین smoke test کافی است اما میتواند echo ایجاد کند.
Gateway محلی + Chrome در Parallels
برای اینکه VM مالک Chrome باشد، به یک OmeniaClaw Gateway کامل یا کلید API مدل درون macOS VM نیاز ندارید. Gateway و عامل را محلی اجرا کنید، سپس یک میزبان Node در VM اجرا کنید. Plugin همراهشده را یکبار روی VM فعال کنید تا Node دستور Chrome را advertise کند:
چه چیزی کجا اجرا میشود:
- میزبان Gateway: OmeniaClaw Gateway، workspace عامل، کلیدهای مدل/API، provider بیدرنگ، و پیکربندی Plugin مربوط به Google Meet.
- Parallels macOS VM: OmeniaClaw CLI/میزبان Node، Google Chrome، SoX، BlackHole 2ch، و یک پروفایل Chrome واردشده به Google.
- در VM لازم نیست: سرویس Gateway، پیکربندی عامل، کلید OpenAI/GPT، یا setup provider مدل.
وابستگیهای VM را نصب کنید:
brew install blackhole-2ch soxپس از نصب BlackHole، VM را راهاندازی دوباره کنید تا macOS دستگاه BlackHole 2ch را نمایان کند:
sudo rebootپس از راهاندازی دوباره، بررسی کنید VM میتواند دستگاه صوتی و دستورات SoX را ببیند:
system_profiler SPAudioDataType | grep -i BlackHolecommand -v soxOmeniaClaw را در VM نصب یا بهروزرسانی کنید، سپس Plugin همراهشده را آنجا فعال کنید:
OmeniaClaw plugins enable google-meetمیزبان Node را در VM شروع کنید:
OmeniaClaw node run --host <gateway-host> --port 18789 --display-name parallels-macosاگر <gateway-host> یک IP شبکه LAN است و از TLS استفاده نمیکنید، Node
WebSocket متنواضح را رد میکند مگر اینکه برای آن شبکه خصوصی مورداعتماد opt in کنید:
OmeniaClaw_ALLOW_INSECURE_PRIVATE_WS=1 \ OmeniaClaw node run --host <gateway-lan-ip> --port 18789 --display-name parallels-macosهنگام نصب Node بهعنوان LaunchAgent، از همان متغیر محیطی استفاده کنید:
OmeniaClaw_ALLOW_INSECURE_PRIVATE_WS=1 \ OmeniaClaw node install --host <gateway-lan-ip> --port 18789 --display-name parallels-macos --forceOmeniaClaw node restartOmeniaClaw_ALLOW_INSECURE_PRIVATE_WS=1 محیط پردازش است، نه یک تنظیم
OmeniaClaw.json. وقتی روی دستور نصب وجود داشته باشد، OmeniaClaw node install آن را در محیط
LaunchAgent ذخیره میکند.
Node را از میزبان Gateway تأیید کنید:
OmeniaClaw devices listOmeniaClaw devices approve <requestId>تأیید کنید Gateway، Node را میبیند و اینکه هم googlemeet.chrome
و هم قابلیت مرورگر/browser.proxy را advertise میکند:
OmeniaClaw nodes statusMeet را روی میزبان Gateway از طریق آن Node مسیریابی کنید:
{ gateway: { nodes: { allowCommands: ["googlemeet.chrome", "browser.proxy"], }, }, plugins: { entries: { "google-meet": { enabled: true, config: { defaultTransport: "chrome-node", chrome: { guestName: "OmeniaClaw Agent", autoJoin: true, reuseExistingTab: true, }, chromeNode: { node: "parallels-macos", }, }, }, }, },}اکنون از میزبان Gateway بهصورت معمول بپیوندید:
OmeniaClaw googlemeet join https://meet.google.com/abc-defg-hijیا از عامل بخواهید از ابزار google_meet با transport: "chrome-node" استفاده کند.
برای یک smoke test تکدستوری که یک نشست ایجاد میکند یا از آن دوباره استفاده میکند، یک عبارت شناختهشده را میگوید، و سلامت نشست را چاپ میکند:
OmeniaClaw googlemeet test-speech https://meet.google.com/abc-defg-hijهنگام پیوستن بلادرنگ، خودکارسازی مرورگر OmeniaClaw نام مهمان را پر میکند، روی
پیوستن/درخواست پیوستن کلیک میکند و وقتی اعلان انتخاب بار اول Meet برای «استفاده از میکروفون»
ظاهر شود، آن را میپذیرد. هنگام پیوستن فقط برای مشاهده یا ایجاد جلسه فقط با مرورگر، در صورت
در دسترس بودن گزینهٔ بدون میکروفون، از همان اعلان عبور میکند.
اگر پروفایل مرورگر وارد نشده باشد، Meet منتظر پذیرش میزبان باشد،
Chrome برای پیوستن بلادرنگ به مجوز میکروفون/دوربین نیاز داشته باشد، یا Meet روی
اعلانی گیر کرده باشد که خودکارسازی نتوانسته آن را حل کند، نتیجهٔ join/test-speech
manualActionRequired: true را همراه با manualActionReason و
manualActionMessage گزارش میکند. عاملها باید تلاش دوباره برای پیوستن را متوقف کنند،
همان پیام دقیق بههمراه browserUrl/browserTitle فعلی را گزارش کنند و فقط پس از
تکمیل اقدام دستی در مرورگر دوباره تلاش کنند.
اگر chromeNode.node حذف شده باشد، OmeniaClaw فقط زمانی بهصورت خودکار انتخاب میکند که دقیقاً یک
Node متصل هم googlemeet.chrome و هم کنترل مرورگر را اعلام کند. اگر
چند Node توانمند متصل باشند، chromeNode.node را روی شناسهٔ Node،
نام نمایشی یا IP راه دور تنظیم کنید.
بررسیهای رایج خرابی:
Configured Google Meet node ... is not usable: offline: Node سنجاقشده برای Gateway شناخته شده است اما در دسترس نیست. عاملها باید آن Node را وضعیت تشخیصی در نظر بگیرند، نه میزبان Chrome قابل استفاده، و مانع راهاندازی را بهجای برگشت به انتقالی دیگر گزارش کنند، مگر اینکه کاربر چنین خواسته باشد.No connected Google Meet-capable node: در VM فرمانOmeniaClaw node runرا شروع کنید، جفتسازی را تأیید کنید و مطمئن شویدOmeniaClaw plugins enable google-meetوOmeniaClaw plugins enable browserدر VM اجرا شدهاند. همچنین تأیید کنید که میزبان Gateway هر دو فرمان Node را باgateway.nodes.allowCommands: ["googlemeet.chrome", "browser.proxy"]مجاز کرده است.BlackHole 2ch audio device not found: روی میزبانی که بررسی میشودblackhole-2chرا نصب کنید و پیش از استفاده از صدای Chrome محلی راهاندازی مجدد کنید.BlackHole 2ch audio device not found on the node: در VMblackhole-2chرا نصب کنید و VM را راهاندازی مجدد کنید.- Chrome باز میشود اما نمیتواند بپیوندد: داخل VM به پروفایل مرورگر وارد شوید، یا
برای پیوستن مهمان،
chrome.guestNameرا تنظیمشده نگه دارید. پیوستن خودکار مهمان از خودکارسازی مرورگر OmeniaClaw از طریق پراکسی مرورگر Node استفاده میکند؛ مطمئن شوید پیکربندی مرورگر Node به پروفایلی که میخواهید اشاره میکند، برای مثالbrowser.defaultProfile: "user"یا یک پروفایل نشست موجودِ نامگذاریشده. - تبهای تکراری Meet: گزینهٔ
chrome.reuseExistingTab: trueرا فعال نگه دارید. OmeniaClaw پیش از باز کردن تب جدید، تب موجود برای همان URL در Meet را فعال میکند، و ایجاد جلسه با مرورگر، پیش از باز کردن تب دیگر، از تب درحالانجامhttps://meet.google.com/newیا اعلان حساب Google استفادهٔ دوباره میکند. - بدون صدا: در Meet، میکروفون/بلندگو را از مسیر دستگاه صوتی مجازی مورد استفادهٔ OmeniaClaw عبور دهید؛ برای صدای دوطرفهٔ تمیز از دستگاههای مجازی جداگانه یا مسیریابی سبک Loopback استفاده کنید.
نکات نصب
پیشفرض بازگویی Chrome از دو ابزار خارجی استفاده میکند:
sox: ابزار صوتی خط فرمان. این Plugin از فرمانهای صریح دستگاه CoreAudio برای پل صوتی پیشفرض PCM16 با نرخ 24 kHz استفاده میکند.blackhole-2ch: درایور صوتی مجازی macOS. این ابزار دستگاه صوتیBlackHole 2chرا ایجاد میکند که Chrome/Meet میتوانند از آن عبور کنند.
OmeniaClaw هیچکدام از این بستهها را همراه خود ارائه یا بازتوزیع نمیکند. مستندات از کاربران میخواهند
آنها را بهعنوان وابستگیهای میزبان از طریق Homebrew نصب کنند. SoX با مجوز
LGPL-2.0-only AND GPL-2.0-only منتشر شده است؛ BlackHole دارای GPL-3.0 است. اگر
نصبکننده یا appliance میسازید که BlackHole را همراه با OmeniaClaw بستهبندی میکند، شرایط
مجوز بالادستی BlackHole را بررسی کنید یا از Existential Audio مجوز جداگانه بگیرید.
انتقالها
Chrome
انتقال Chrome نشانی Meet را از طریق کنترل مرورگر OmeniaClaw باز میکند و
بهعنوان پروفایل مرورگر واردشدهٔ OmeniaClaw میپیوندد. در macOS، این Plugin پیش از اجرا وجود
BlackHole 2ch را بررسی میکند. اگر پیکربندی شده باشد، پیش از باز کردن Chrome یک فرمان
سلامت پل صوتی و فرمان راهاندازی نیز اجرا میکند. وقتی
Chrome/صدا روی میزبان Gateway قرار دارند از chrome استفاده کنید؛ وقتی Chrome/صدا روی
Node جفتشدهای مانند VM macOS در Parallels قرار دارند از chrome-node استفاده کنید. برای Chrome محلی،
پروفایل را با browser.defaultProfile انتخاب کنید؛ chrome.browserProfile به
میزبانهای chrome-node داده میشود.
OmeniaClaw googlemeet join https://meet.google.com/abc-defg-hij --transport chromeOmeniaClaw googlemeet join https://meet.google.com/abc-defg-hij --transport chrome-nodeصدای میکروفون و بلندگوی Chrome را از طریق پل صوتی محلی OmeniaClaw عبور دهید.
اگر BlackHole 2ch نصب نشده باشد، پیوستن بهجای ورود بیصدا بدون مسیر صوتی،
با خطای راهاندازی شکست میخورد.
Twilio
انتقال Twilio یک طرح شمارهگیری سختگیرانه است که به Plugin تماس صوتی واگذار میشود. این صفحههای Meet را برای شماره تلفنها تجزیه نمیکند.
وقتی مشارکت Chrome در دسترس نیست یا fallback شمارهگیری تلفنی میخواهید، از این استفاده کنید. Google Meet باید برای جلسه شمارهٔ تماس ورودی و PIN ارائه کند؛ OmeniaClaw آنها را از صفحهٔ Meet کشف نمیکند.
Plugin تماس صوتی را روی میزبان Gateway فعال کنید، نه روی Node مربوط به Chrome:
{ plugins: { allow: ["google-meet", "voice-call", "google"], entries: { "google-meet": { enabled: true, config: { defaultTransport: "chrome-node", // or set "twilio" if Twilio should be the default }, }, "voice-call": { enabled: true, config: { provider: "twilio", inboundPolicy: "allowlist", realtime: { enabled: true, provider: "google", instructions: "Join this Google Meet as an OmeniaClaw agent. Be brief.", toolPolicy: "safe-read-only", providers: { google: { silenceDurationMs: 500, startSensitivity: "high", }, }, }, }, }, google: { enabled: true, }, }, },}اعتبارنامههای Twilio را از طریق محیط یا پیکربندی ارائه کنید. محیط
اسرار را خارج از OmeniaClaw.json نگه میدارد:
export TWILIO_ACCOUNT_SID=AC...export TWILIO_AUTH_TOKEN=...export TWILIO_FROM_NUMBER=+15550001234export GEMINI_API_KEY=...اگر ارائهدهندهٔ صدای بلادرنگ شما این است، بهجای آن از realtime.provider: "openai" همراه با Plugin ارائهدهندهٔ OpenAI و
OPENAI_API_KEY استفاده کنید.
پس از فعال کردن voice-call، Gateway را راهاندازی مجدد یا بارگذاری مجدد کنید؛ تغییرات پیکربندی Plugin
تا زمانی که پردازهٔ Gateway از قبل درحال اجرا بارگذاری مجدد نشود، در آن ظاهر نمیشوند.
سپس بررسی کنید:
OmeniaClaw config validateOmeniaClaw plugins list | grep -E 'google-meet|voice-call'OmeniaClaw googlemeet setupوقتی واگذاری Twilio سیمکشی شده باشد، googlemeet setup شامل بررسیهای موفق
twilio-voice-call-plugin، twilio-voice-call-credentials و
twilio-voice-call-webhook است.
OmeniaClaw googlemeet join https://meet.google.com/abc-defg-hij \ --transport twilio \ --dial-in-number +15551234567 \ --pin 123456وقتی جلسه به دنبالهٔ سفارشی نیاز دارد، از --dtmf-sequence استفاده کنید:
OmeniaClaw googlemeet join https://meet.google.com/abc-defg-hij \ --transport twilio \ --dial-in-number +15551234567 \ --dtmf-sequence ww123456#OAuth و پیشبررسی
OAuth برای ایجاد پیوند Meet اختیاری است، چون googlemeet create میتواند به
خودکارسازی مرورگر fallback کند. وقتی ایجاد از طریق API رسمی،
حلکردن فضا، یا بررسیهای پیشبررسی Meet Media API را میخواهید، OAuth را پیکربندی کنید.
دسترسی Google Meet API از OAuth کاربر استفاده میکند: یک کلاینت OAuth در Google Cloud ایجاد کنید،
دامنههای لازم را درخواست کنید، یک حساب Google را مجاز کنید، سپس
توکن تازهسازی حاصل را در پیکربندی Plugin Google Meet ذخیره کنید یا متغیرهای محیطی
OmeniaClaw_GOOGLE_MEET_* را ارائه کنید.
OAuth جایگزین مسیر پیوستن Chrome نمیشود. انتقالهای Chrome و Chrome-node هنوز هنگام استفاده از مشارکت مرورگر، از طریق پروفایل Chrome واردشده، BlackHole/SoX، و یک Node متصل میپیوندند. OAuth فقط برای مسیر رسمی Google Meet API است: ایجاد فضاهای جلسه، حلکردن فضاها، و اجرای بررسیهای پیشبررسی Meet Media API.
ایجاد اعتبارنامههای Google
در Google Cloud Console:
-
یک پروژهٔ Google Cloud ایجاد یا انتخاب کنید.
-
Google Meet REST API را برای آن پروژه فعال کنید.
-
صفحهٔ رضایت OAuth را پیکربندی کنید.
- داخلی برای یک سازمان Google Workspace سادهترین گزینه است.
- خارجی برای راهاندازیهای شخصی/آزمایشی کار میکند؛ وقتی برنامه در حالت آزمایش است، هر حساب Google را که قرار است برنامه را مجاز کند، بهعنوان کاربر آزمایشی اضافه کنید.
-
دامنههایی را که OmeniaClaw درخواست میکند اضافه کنید:
https://www.googleapis.com/auth/meetings.space.createdhttps://www.googleapis.com/auth/meetings.space.readonlyhttps://www.googleapis.com/auth/meetings.space.settingshttps://www.googleapis.com/auth/meetings.conference.media.readonly
-
یک شناسهٔ کلاینت OAuth ایجاد کنید.
-
نوع برنامه: برنامهٔ وب.
-
URI تغییرمسیر مجاز:
text http://localhost:8085/oauth2callback
-
-
شناسهٔ کلاینت و راز کلاینت را کپی کنید.
meetings.space.created برای Google Meet spaces.create لازم است.
meetings.space.readonly به OmeniaClaw اجازه میدهد URLها/کدهای Meet را به فضاها حل کند.
meetings.space.settings به OmeniaClaw اجازه میدهد تنظیمات SpaceConfig مانند
accessType را هنگام ایجاد اتاق از طریق API ارسال کند.
meetings.conference.media.readonly برای پیشبررسی Meet Media API و کار رسانهای است؛
Google ممکن است برای استفادهٔ واقعی از Media API به ثبتنام Developer Preview نیاز داشته باشد.
اگر فقط به پیوستنهای Chrome مبتنی بر مرورگر نیاز دارید، OAuth را کاملاً رد کنید.
ایجاد توکن تازهسازی
oauth.clientId و در صورت نیاز oauth.clientSecret را پیکربندی کنید، یا آنها را بهعنوان
متغیرهای محیطی ارسال کنید، سپس اجرا کنید:
OmeniaClaw googlemeet auth login --jsonاین فرمان یک بلوک پیکربندی oauth با توکن تازهسازی چاپ میکند. از PKCE،
callback روی localhost در http://localhost:8085/oauth2callback، و جریان
کپی/جایگذاری دستی با --manual استفاده میکند.
نمونهها:
OmeniaClaw_GOOGLE_MEET_CLIENT_ID="your-client-id" \OmeniaClaw_GOOGLE_MEET_CLIENT_SECRET="your-client-secret" \OmeniaClaw googlemeet auth login --jsonوقتی مرورگر نمیتواند به callback محلی برسد، از حالت دستی استفاده کنید:
OmeniaClaw_GOOGLE_MEET_CLIENT_ID="your-client-id" \OmeniaClaw_GOOGLE_MEET_CLIENT_SECRET="your-client-secret" \OmeniaClaw googlemeet auth login --json --manualخروجی JSON شامل این موارد است:
{ "oauth": { "clientId": "your-client-id", "clientSecret": "your-client-secret", "refreshToken": "refresh-token", "accessToken": "access-token", "expiresAt": 1770000000000 }, "scope": "..."}شیء oauth را زیر پیکربندی Plugin Google Meet ذخیره کنید:
{ plugins: { entries: { "google-meet": { enabled: true, config: { oauth: { clientId: "your-client-id", clientSecret: "your-client-secret", refreshToken: "refresh-token", }, }, }, }, },}وقتی نمیخواهید توکن تازهسازی در پیکربندی باشد، متغیرهای محیطی را ترجیح دهید. اگر هر دو مقدار پیکربندی و محیط وجود داشته باشند، Plugin ابتدا پیکربندی را حل میکند و سپس به fallback محیط میرود.
رضایت OAuth شامل ایجاد فضای Meet، دسترسی خواندن به فضای Meet، و دسترسی خواندن به رسانهٔ
کنفرانس Meet است. اگر پیش از وجود پشتیبانی ایجاد جلسه احراز هویت کردهاید،
OmeniaClaw googlemeet auth login --json را دوباره اجرا کنید تا توکن تازهسازی
دامنهٔ meetings.space.created را داشته باشد.
بررسی OAuth با doctor
وقتی یک بررسی سلامت سریع و بدون راز میخواهید، doctor مربوط به OAuth را اجرا کنید:
OmeniaClaw googlemeet doctor --oauth --jsonاین کار runtime مربوط به Chrome را بارگذاری نمیکند و به Node متصل برای Chrome نیاز ندارد. این
بررسی میکند که پیکربندی OAuth وجود دارد و توکن تازهسازی میتواند یک توکن دسترسی
ایجاد کند. گزارش JSON فقط فیلدهای وضعیت مانند ok، configured،
tokenSource، expiresAt و پیامهای بررسی را شامل میشود؛ توکن دسترسی،
توکن تازهسازی، یا راز کلاینت را چاپ نمیکند.
نتایج رایج:
| بررسی | معنی |
|---|---|
oauth-config |
oauth.clientId بههمراه oauth.refreshToken، یا یک توکن دسترسی کششده، موجود است. |
oauth-token |
توکن دسترسی کششده هنوز معتبر است، یا توکن نوسازی یک توکن دسترسی جدید صادر کرده است. |
meet-spaces-get |
بررسی اختیاری --meeting یک فضای Meet موجود را resolve کرد. |
meet-spaces-create |
بررسی اختیاری --create-space یک فضای Meet جدید ایجاد کرد. |
برای اثبات فعال بودن Google Meet API و scope مربوط به spaces.create نیز، بررسی
ایجاد دارای اثر جانبی را اجرا کنید:
OmeniaClaw googlemeet doctor --oauth --create-space --jsonOmeniaClaw googlemeet create --no-join --json--create-space یک URL موقت Meet ایجاد میکند. وقتی لازم است تأیید کنید
که پروژه Google Cloud دارای Meet API فعال است و حساب مجازشده
scope مربوط به meetings.space.created را دارد، از آن استفاده کنید.
برای اثبات دسترسی خواندن به یک فضای جلسه موجود:
OmeniaClaw googlemeet doctor --oauth --meeting https://meet.google.com/abc-defg-hij --jsonOmeniaClaw googlemeet resolve-space --meeting https://meet.google.com/abc-defg-hijdoctor --oauth --meeting و resolve-space دسترسی خواندن به یک
فضای موجود را اثبات میکنند که حساب Google مجازشده میتواند به آن دسترسی داشته باشد. دریافت 403 از این بررسیها
معمولاً یعنی Google Meet REST API غیرفعال است، توکن نوسازی consentشده
scope لازم را ندارد، یا حساب Google نمیتواند به آن فضای Meet
دسترسی پیدا کند. خطای refresh-token یعنی OmeniaClaw googlemeet auth login --json را دوباره اجرا کنید و بلوک جدید oauth را ذخیره کنید.
برای fallback مرورگر، هیچ credential مربوط به OAuth لازم نیست. در آن حالت، احراز هویت Google از پروفایل Chrome واردشده روی node انتخابشده میآید، نه از پیکربندی OmeniaClaw.
این متغیرهای محیطی بهعنوان fallback پذیرفته میشوند:
OmeniaClaw_GOOGLE_MEET_CLIENT_IDیاGOOGLE_MEET_CLIENT_IDOmeniaClaw_GOOGLE_MEET_CLIENT_SECRETیاGOOGLE_MEET_CLIENT_SECRETOmeniaClaw_GOOGLE_MEET_REFRESH_TOKENیاGOOGLE_MEET_REFRESH_TOKENOmeniaClaw_GOOGLE_MEET_ACCESS_TOKENیاGOOGLE_MEET_ACCESS_TOKENOmeniaClaw_GOOGLE_MEET_ACCESS_TOKEN_EXPIRES_ATیاGOOGLE_MEET_ACCESS_TOKEN_EXPIRES_ATOmeniaClaw_GOOGLE_MEET_DEFAULT_MEETINGیاGOOGLE_MEET_DEFAULT_MEETINGOmeniaClaw_GOOGLE_MEET_PREVIEW_ACKیاGOOGLE_MEET_PREVIEW_ACK
یک URL یا کد Meet، یا spaces/{id} را از طریق spaces.get resolve کنید:
OmeniaClaw googlemeet resolve-space --meeting https://meet.google.com/abc-defg-hijپیش از کار رسانهای، preflight را اجرا کنید:
OmeniaClaw googlemeet preflight --meeting https://meet.google.com/abc-defg-hijپس از اینکه Meet رکوردهای کنفرانس را ایجاد کرد، artifactهای جلسه و حضور را فهرست کنید:
OmeniaClaw googlemeet artifacts --meeting https://meet.google.com/abc-defg-hijOmeniaClaw googlemeet attendance --meeting https://meet.google.com/abc-defg-hijOmeniaClaw googlemeet export --meeting https://meet.google.com/abc-defg-hij --output ./meet-exportبا --meeting، artifacts و attendance بهصورت پیشفرض از جدیدترین رکورد کنفرانس
استفاده میکنند. وقتی همه رکوردهای نگهداریشده
برای آن جلسه را میخواهید، --all-conference-records را بدهید.
جستوجوی Calendar میتواند پیش از خواندن artifactهای Meet، URL جلسه را از Google Calendar resolve کند:
OmeniaClaw googlemeet latest --todayOmeniaClaw googlemeet calendar-events --today --jsonOmeniaClaw googlemeet artifacts --event "Weekly sync"OmeniaClaw googlemeet attendance --today --format csv --output attendance.csv--today تقویم primary امروز را برای یک رویداد Calendar دارای
لینک Google Meet جستوجو میکند. برای جستوجوی متن رویداد مطابق، از --event <query> استفاده کنید، و
برای تقویمی غیر از primary از --calendar <id>. جستوجوی Calendar به یک ورود تازه
OAuth نیاز دارد که شامل scope فقطخواندنی رویدادهای Calendar باشد.
calendar-events رویدادهای Meet مطابق را پیشنمایش میکند و رویدادی را که
latest، artifacts، attendance یا export انتخاب خواهد کرد علامتگذاری میکند.
اگر از قبل شناسه رکورد کنفرانس را میدانید، مستقیماً آن را نشانیدهی کنید:
OmeniaClaw googlemeet latest --meeting https://meet.google.com/abc-defg-hijOmeniaClaw googlemeet artifacts --conference-record conferenceRecords/abc123 --jsonOmeniaClaw googlemeet attendance --conference-record conferenceRecords/abc123 --jsonوقتی میخواهید پس از تماس اتاق را ببندید، یک کنفرانس فعال را برای فضای ایجادشده با API پایان دهید:
OmeniaClaw googlemeet end-active-conference https://meet.google.com/abc-defg-hijاین دستور Google Meet spaces.endActiveConference را فراخوانی میکند و به OAuth با
scope مربوط به meetings.space.created برای فضایی نیاز دارد که حساب مجازشده بتواند مدیریت کند.
OmeniaClaw یک URL Meet، کد جلسه، یا ورودی spaces/{id} را میپذیرد و پیش از پایان دادن به کنفرانس فعال،
آن را به منبع فضای API resolve میکند.
این از googlemeet leave جداست: leave مشارکت محلی/session
OmeniaClaw را متوقف میکند، در حالی که end-active-conference از Google Meet میخواهد کنفرانس فعال
آن فضا را پایان دهد.
یک گزارش خوانا بنویسید:
OmeniaClaw googlemeet artifacts --conference-record conferenceRecords/abc123 \ --format markdown --output meet-artifacts.mdOmeniaClaw googlemeet attendance --conference-record conferenceRecords/abc123 \ --format markdown --output meet-attendance.mdOmeniaClaw googlemeet attendance --conference-record conferenceRecords/abc123 \ --format csv --output meet-attendance.csvOmeniaClaw googlemeet export --conference-record conferenceRecords/abc123 \ --include-doc-bodies --zip --output meet-exportOmeniaClaw googlemeet export --conference-record conferenceRecords/abc123 \ --include-doc-bodies --dry-runartifacts در صورت ارائهشدن توسط Google برای جلسه، metadata رکورد کنفرانس بههمراه metadata منابع شرکتکننده، ضبط،
رونوشت، ورودی ساختاریافته رونوشت، و یادداشت هوشمند را برمیگرداند. برای رد کردن
جستوجوی entry در جلسههای بزرگ از --no-transcript-entries استفاده کنید. attendance شرکتکنندگان را به
ردیفهای participant-session با زمانهای اولین/آخرین مشاهده، مدت کل session،
پرچمهای دیر رسیدن/ترک زودهنگام، و منابع شرکتکننده تکراری ادغامشده بر اساس کاربر واردشده
یا نام نمایشی گسترش میدهد. برای جدا نگه داشتن منابع خام شرکتکننده،
--no-merge-duplicates را بدهید، برای تنظیم تشخیص دیرکرد از --late-after-minutes، و
برای تنظیم تشخیص ترک زودهنگام از --early-before-minutes استفاده کنید.
export پوشهای شامل summary.md، attendance.csv،
transcript.md، artifacts.json، attendance.json، و manifest.json مینویسد.
manifest.json ورودی انتخابشده، گزینههای export، رکوردهای کنفرانس،
فایلهای خروجی، شمارشها، منبع توکن، رویداد Calendar در صورت استفاده، و هر
هشدار مربوط به بازیابی ناقص را ثبت میکند. برای نوشتن یک آرشیو قابلحمل در کنار
پوشه نیز --zip را بدهید. برای export کردن متن Google Docs رونوشت و یادداشت هوشمند
لینکشده از طریق Google Drive files.export، --include-doc-bodies را بدهید؛ این به
یک ورود تازه OAuth نیاز دارد که شامل scope فقطخواندنی Drive Meet باشد. بدون
--include-doc-bodies، exportها فقط شامل metadata مربوط به Meet و ورودیهای ساختاریافته رونوشت
هستند. اگر Google یک شکست جزئی artifact برگرداند، مانند خطای فهرستکردن یادداشت هوشمند،
transcript-entry، یا document-body در Drive، summary و
manifest بهجای شکست کل export، هشدار را نگه میدارند.
برای دریافت همان دادههای artifact/attendance و چاپ JSON مربوط به
manifest بدون ایجاد پوشه یا ZIP، از --dry-run استفاده کنید. این پیش از نوشتن
یک export بزرگ یا وقتی یک agent فقط به شمارشها، رکوردهای انتخابشده، و
هشدارها نیاز دارد مفید است.
agentها همچنین میتوانند همان bundle را از طریق ابزار google_meet ایجاد کنند:
{ "action": "export", "conferenceRecord": "conferenceRecords/abc123", "includeDocumentBodies": true, "outputDir": "meet-export", "zip": true}برای برگرداندن فقط manifest مربوط به export و رد کردن نوشتن فایلها، "dryRun": true را تنظیم کنید.
agentها همچنین میتوانند یک اتاق مبتنی بر API با سیاست دسترسی صریح ایجاد کنند:
{ "action": "create", "transport": "chrome-node", "mode": "agent", "accessType": "OPEN"}و میتوانند کنفرانس فعال یک اتاق شناختهشده را پایان دهند:
{ "action": "end_active_conference", "meeting": "https://meet.google.com/abc-defg-hij"}برای اعتبارسنجی listen-first، agentها باید پیش از ادعای مفید بودن
جلسه، از test_listen استفاده کنند:
{ "action": "test_listen", "url": "https://meet.google.com/abc-defg-hij", "transport": "chrome-node", "timeoutMs": 30000}live smoke محافظتشده را در برابر یک جلسه واقعی نگهداریشده اجرا کنید:
OmeniaClaw_LIVE_TEST=1 \OmeniaClaw_GOOGLE_MEET_LIVE_MEETING=https://meet.google.com/abc-defg-hij \pnpm test:live -- extensions/google-meet/google-meet.live.test.tslive listen-first browser probe را در برابر جلسهای اجرا کنید که در آن کسی با زیرنویسهای Meet در دسترس صحبت خواهد کرد:
OmeniaClaw googlemeet setup --transport chrome-node --mode transcribeOmeniaClaw googlemeet test-listen https://meet.google.com/abc-defg-hij --transport chrome-node --timeout-ms 30000محیط live smoke:
OmeniaClaw_LIVE_TEST=1تستهای live محافظتشده را فعال میکند.OmeniaClaw_GOOGLE_MEET_LIVE_MEETINGبه یک URL، کد، یاspaces/{id}مربوط به Meet نگهداریشده اشاره میکند.OmeniaClaw_GOOGLE_MEET_CLIENT_IDیاGOOGLE_MEET_CLIENT_IDشناسه client مربوط به OAuth را فراهم میکند.OmeniaClaw_GOOGLE_MEET_REFRESH_TOKENیاGOOGLE_MEET_REFRESH_TOKENتوکن نوسازی را فراهم میکند.- اختیاری:
OmeniaClaw_GOOGLE_MEET_CLIENT_SECRET،OmeniaClaw_GOOGLE_MEET_ACCESS_TOKEN، وOmeniaClaw_GOOGLE_MEET_ACCESS_TOKEN_EXPIRES_ATاز همان نامهای fallback بدون پیشوندOmeniaClaw_استفاده میکنند.
live smoke پایه artifact/attendance به
https://www.googleapis.com/auth/meetings.space.readonly و
https://www.googleapis.com/auth/meetings.conference.media.readonly نیاز دارد. جستوجوی Calendar
به https://www.googleapis.com/auth/calendar.events.readonly نیاز دارد. export کردن
document-body از Drive به
https://www.googleapis.com/auth/drive.meet.readonly نیاز دارد.
یک فضای تازه Meet ایجاد کنید:
OmeniaClaw googlemeet createاین دستور meeting uri جدید، منبع، و join session را چاپ میکند. با credentialهای OAuth
از Google Meet API رسمی استفاده میکند. بدون credentialهای OAuth،
از پروفایل مرورگر واردشده pinned Chrome node بهعنوان fallback استفاده میکند. agentها میتوانند
از ابزار google_meet با action: "create" برای ایجاد و join در یک
گام استفاده کنند. برای ایجاد فقط URL، "join": false را بدهید.
نمونه خروجی JSON از fallback مرورگر:
{ "source": "browser", "meetingUri": "https://meet.google.com/abc-defg-hij", "joined": true, "browser": { "nodeId": "ba0f4e4bc...", "targetId": "tab-1" }, "join": { "session": { "id": "meet_...", "url": "https://meet.google.com/abc-defg-hij" } }}اگر fallback مرورگر پیش از آنکه بتواند URL را ایجاد کند با ورود Google یا مانع مجوز Meet
برخورد کند، متد Gateway یک پاسخ ناموفق برمیگرداند و
ابزار google_meet بهجای یک رشته ساده، جزئیات ساختاریافته برمیگرداند:
{ "source": "browser", "error": "google-login-required: Sign in to Google in the OmeniaClaw browser profile, then retry meeting creation.", "manualActionRequired": true, "manualActionReason": "google-login-required", "manualActionMessage": "Sign in to Google in the OmeniaClaw browser profile, then retry meeting creation.", "browser": { "nodeId": "ba0f4e4bc...", "targetId": "tab-1", "browserUrl": "https://accounts.google.com/signin", "browserTitle": "Sign in - Google Accounts" }}وقتی یک agent مقدار manualActionRequired: true را میبیند، باید
manualActionMessage بههمراه زمینه browser node/tab را گزارش کند و تا زمانی که operator
مرحله مرورگر را کامل نکرده است، باز کردن tabهای جدید Meet را متوقف کند.
نمونه خروجی JSON از ایجاد با API:
{ "source": "api", "meetingUri": "https://meet.google.com/abc-defg-hij", "joined": true, "space": { "name": "spaces/abc-defg-hij", "meetingCode": "abc-defg-hij", "meetingUri": "https://meet.google.com/abc-defg-hij" }, "join": { "session": { "id": "meet_...", "url": "https://meet.google.com/abc-defg-hij" } }}ایجاد یک Meet بهصورت پیشفرض به آن میپیوندد. انتقال Chrome یا Chrome-node همچنان برای پیوستن از طریق مرورگر به یک نمایه Google Chrome واردشده نیاز دارد. اگر نمایه خارج شده باشد، OmeniaClaw مقدار manualActionRequired: true یا یک خطای جایگزین مرورگر را گزارش میکند و از اپراتور میخواهد پیش از تلاش دوباره، ورود به Google را کامل کند.
فقط پس از تأیید اینکه پروژه Cloud، اصل OAuth، و شرکتکنندگان جلسه شما در Google Workspace Developer Preview Program برای APIهای رسانه Meet ثبتنام شدهاند، preview.enrollmentAcknowledged: true را تنظیم کنید.
پیکربندی
مسیر مشترک عامل Chrome فقط به فعال بودن Plugin، BlackHole، SoX، یک کلید ارائهدهنده رونویسی بلادرنگ، و یک ارائهدهنده TTS پیکربندیشده OmeniaClaw نیاز دارد. OpenAI ارائهدهنده پیشفرض رونویسی است؛ برای استفاده از Google Gemini Live در حالت bidi بدون تغییر ارائهدهنده پیشفرض رونویسی حالت عامل، realtime.voiceProvider را روی "google" و realtime.model را تنظیم کنید:
brew install blackhole-2ch soxexport OPENAI_API_KEY=sk-...# orexport GEMINI_API_KEY=...پیکربندی Plugin را زیر plugins.entries.google-meet.config تنظیم کنید:
{ plugins: { entries: { "google-meet": { enabled: true, config: {}, }, }, },}پیشفرضها:
defaultTransport: "chrome"defaultMode: "agent"("realtime"فقط بهعنوان نام مستعار سازگاری قدیمی برای"agent"پذیرفته میشود؛ فراخوانیهای ابزار جدید باید"agent"بگویند)chromeNode.node: شناسه/نام/IP اختیاری Node برایchrome-nodechrome.audioBackend: "blackhole-2ch"chrome.guestName: "OmeniaClaw Agent": نامی که در صفحه مهمان Meet برای کاربر خارجشده استفاده میشودchrome.autoJoin: true: تلاش بهینه برای پر کردن نام مهمان و کلیک روی Join Now از طریق خودکارسازی مرورگر OmeniaClaw رویchrome-nodechrome.reuseExistingTab: true: فعال کردن یک زبانه Meet موجود بهجای باز کردن نسخههای تکراریchrome.waitForInCallMs: 20000: منتظر ماندن تا زبانه Meet وضعیت داخل تماس را گزارش کند، پیش از آنکه معرفی پاسخگویی گفتاری فعال شودchrome.audioFormat: "pcm16-24khz": قالب صوتی جفت فرمان. از"g711-ulaw-8khz"فقط برای جفتفرمانهای قدیمی/سفارشی استفاده کنید که هنوز صدای تلفنی تولید میکنند.chrome.audioBufferBytes: 4096: بافر پردازش SoX برای فرمانهای صوتی جفتفرمان Chrome تولیدشده. این مقدار نصف بافر پیشفرض 8192 بایتی SoX است و تأخیر پیشفرض پایپ را کاهش میدهد، درحالیکه امکان افزایش آن روی میزبانهای شلوغ را حفظ میکند. مقادیر پایینتر از حداقل SoX به 17 بایت محدود میشوند.chrome.audioInputCommand: فرمان SoX که از CoreAudioBlackHole 2chمیخواند و صدا را درchrome.audioFormatمینویسدchrome.audioOutputCommand: فرمان SoX که صدا را درchrome.audioFormatمیخواند و به CoreAudioBlackHole 2chمینویسدchrome.bargeInInputCommand: فرمان اختیاری میکروفون محلی که PCM تککاناله 16 بیتی little-endian علامتدار را برای تشخیص ورود گفتار انسان هنگام فعال بودن پخش دستیار مینویسد. این در حال حاضر برای پل جفتفرمانchromeمیزبانیشده روی Gateway اعمال میشود.chrome.bargeInRmsThreshold: 650: سطح RMS که رویchrome.bargeInInputCommandبهعنوان قطع گفتار توسط انسان محسوب میشودchrome.bargeInPeakThreshold: 2500: سطح اوج که رویchrome.bargeInInputCommandبهعنوان قطع گفتار توسط انسان محسوب میشودchrome.bargeInCooldownMs: 900: حداقل تأخیر بین پاکسازیهای تکراری قطع گفتار توسط انسانmode: "agent": حالت پیشفرض پاسخگویی گفتاری. گفتار شرکتکننده توسط ارائهدهنده رونویسی بلادرنگ پیکربندیشده رونویسی میشود، به عامل پیکربندیشده OmeniaClaw در یک نشست زیرعامل مخصوص هر جلسه فرستاده میشود، و از طریق زماناجرای عادی TTS در OmeniaClaw به گفتار تبدیل میشود.mode: "bidi": حالت جایگزین مدل بلادرنگ مستقیم دوسویه. ارائهدهنده صدای بلادرنگ مستقیماً به گفتار شرکتکننده پاسخ میدهد و میتواند برای پاسخهای عمیقتر/پشتیبانیشده با ابزار،OmeniaClaw_agent_consultرا فراخوانی کند.mode: "transcribe": حالت فقط مشاهده بدون پل پاسخگویی گفتاری.realtime.provider: "openai": جایگزین سازگاری که وقتی فیلدهای ارائهدهنده محدودهدار زیر تنظیم نشدهاند استفاده میشود.realtime.transcriptionProvider: "openai": شناسه ارائهدهندهای که حالتagentبرای رونویسی بلادرنگ استفاده میکند.realtime.voiceProvider: شناسه ارائهدهندهای که حالتbidiبرای صدای بلادرنگ مستقیم استفاده میکند. برای استفاده از Gemini Live درحالیکه رونویسی حالت عامل روی OpenAI میماند، این را روی"google"تنظیم کنید.realtime.toolPolicy: "safe-read-only"realtime.instructions: پاسخهای گفتاری کوتاه، باOmeniaClaw_agent_consultبرای پاسخهای عمیقترrealtime.introMessage: بررسی کوتاه آمادگی گفتاری هنگام اتصال پل بلادرنگ؛ برای پیوستن بیصدا آن را روی""تنظیم کنیدrealtime.agentId: شناسه اختیاری عامل OmeniaClaw برایOmeniaClaw_agent_consult؛ پیشفرضmainاست
بازنویسیهای اختیاری:
{ defaults: { meeting: "https://meet.google.com/abc-defg-hij", }, browser: { defaultProfile: "OmeniaClaw", }, chrome: { guestName: "OmeniaClaw Agent", waitForInCallMs: 30000, bargeInInputCommand: [ "sox", "-q", "-t", "coreaudio", "External Microphone", "-r", "24000", "-c", "1", "-b", "16", "-e", "signed-integer", "-t", "raw", "-", ], }, chromeNode: { node: "parallels-macos", }, defaultMode: "agent", realtime: { provider: "openai", transcriptionProvider: "openai", voiceProvider: "google", model: "gemini-2.5-flash-native-audio-preview-12-2025", agentId: "jay", toolPolicy: "owner", introMessage: "Say exactly: I'm here.", providers: { google: { voice: "Kore", }, }, },}ElevenLabs برای شنیدن و گفتار در حالت عامل:
{ messages: { tts: { provider: "elevenlabs", providers: { elevenlabs: { modelId: "eleven_v3", voiceId: "pMsXgVXv3BLzUgSXRplE", }, }, }, }, plugins: { entries: { "google-meet": { config: { realtime: { transcriptionProvider: "elevenlabs", providers: { elevenlabs: { modelId: "scribe_v2_realtime", audioFormat: "ulaw_8000", sampleRate: 8000, commitStrategy: "vad", }, }, }, }, }, }, },}صدای پایدار Meet از messages.tts.providers.elevenlabs.voiceId میآید. پاسخهای عامل همچنین میتوانند وقتی بازنویسیهای مدل TTS فعال هستند، از دستورهای مخصوص هر پاسخ مانند [[tts:voiceId=... model=eleven_v3]] استفاده کنند، اما پیکربندی پیشفرض قطعی برای جلسات است. هنگام پیوستن، لاگها باید transcriptionProvider=elevenlabs را نشان دهند و هر پاسخ گفتاری باید provider=elevenlabs model=eleven_v3 voice=<voiceId> را ثبت کند.
پیکربندی فقط Twilio:
{ defaultTransport: "twilio", twilio: { defaultDialInNumber: "+15551234567", defaultPin: "123456", }, voiceCall: { gatewayUrl: "ws://127.0.0.1:18789", },}voiceCall.enabled بهصورت پیشفرض true است؛ با انتقال Twilio، تماس PSTN واقعی، DTMF، و خوشامدگویی معرفی را به Plugin تماس صوتی واگذار میکند. تماس صوتی توالی DTMF را پیش از باز کردن جریان رسانه بلادرنگ پخش میکند، سپس از متن معرفی ذخیرهشده بهعنوان خوشامدگویی اولیه بلادرنگ استفاده میکند. اگر voice-call فعال نباشد، Google Meet همچنان میتواند طرح شمارهگیری را اعتبارسنجی و ثبت کند، اما نمیتواند تماس Twilio را برقرار کند.
ابزار
عاملها میتوانند از ابزار google_meet استفاده کنند:
{ "action": "join", "url": "https://meet.google.com/abc-defg-hij", "transport": "chrome-node", "mode": "agent"}وقتی Chrome روی میزبان Gateway اجرا میشود، از transport: "chrome" استفاده کنید. وقتی Chrome روی یک Node جفتشده مانند یک ماشین مجازی Parallels اجرا میشود، از transport: "chrome-node" استفاده کنید. در هر دو حالت، ارائهدهندگان مدل و OmeniaClaw_agent_consult روی میزبان Gateway اجرا میشوند، بنابراین اعتبارنامههای مدل همانجا میمانند. با mode: "agent" پیشفرض، ارائهدهنده رونویسی بلادرنگ شنیدن را مدیریت میکند، عامل پیکربندیشده OmeniaClaw پاسخ را تولید میکند، و TTS عادی OmeniaClaw آن را در Meet پخش میکند. وقتی میخواهید مدل صدای بلادرنگ مستقیماً پاسخ دهد، از mode: "bidi" استفاده کنید. مقدار خام mode: "realtime" همچنان بهعنوان نام مستعار سازگاری قدیمی برای mode: "agent" پذیرفته میشود، اما دیگر در شمای ابزار عامل تبلیغ نمیشود. لاگهای حالت عامل در شروع پل، ارائهدهنده/مدل رونویسی حلشده و پس از هر پاسخ ساختهشده، ارائهدهنده TTS، مدل، صدا، قالب خروجی، و نرخ نمونهبرداری را شامل میشوند.
برای فهرست کردن نشستهای فعال یا بررسی شناسه نشست از action: "status" استفاده کنید. برای اینکه عامل بلادرنگ فوراً صحبت کند، از action: "speak" همراه با sessionId و message استفاده کنید. برای ایجاد یا استفاده دوباره از نشست، فعال کردن یک عبارت شناختهشده، و بازگرداندن سلامت inCall وقتی میزبان Chrome بتواند آن را گزارش کند، از action: "test_speech" استفاده کنید. test_speech همیشه mode: "agent" را اجباری میکند و اگر از آن خواسته شود در mode: "transcribe" اجرا شود، شکست میخورد، زیرا نشستهای فقط مشاهده عمداً نمیتوانند گفتار تولید کنند. نتیجه speechOutputVerified آن بر اساس افزایش بایتهای خروجی صوتی بلادرنگ در طول این فراخوانی آزمایشی است، بنابراین یک نشست استفادهشدهدوباره با صدای قدیمیتر بهعنوان بررسی گفتار موفق تازه حساب نمیشود. برای علامتگذاری پایان یک نشست، از action: "leave" استفاده کنید.
status در صورت دسترسی، سلامت Chrome را شامل میشود:
inCall: به نظر میرسد Chrome داخل تماس Meet استmicMuted: وضعیت میکروفون Meet با تلاش بهینهmanualActionRequired/manualActionReason/manualActionMessage: نمایه مرورگر پیش از کار کردن گفتار، به ورود دستی، پذیرش میزبان Meet، مجوزها، یا تعمیر کنترل مرورگر نیاز داردspeechReady/speechBlockedReason/speechBlockedMessage: آیا گفتار مدیریتشده Chrome اکنون مجاز است یا نه.speechReady: falseیعنی OmeniaClaw عبارت معرفی/آزمایشی را به پل صوتی نفرستاده است.providerConnected/realtimeReady: وضعیت پل صدای بلادرنگlastInputAt/lastOutputAt: آخرین صدای دیدهشده از پل یا فرستادهشده به آنaudioOutputRouted/audioOutputDeviceLabel: آیا خروجی رسانه زبانه Meet بهصورت فعال به دستگاه BlackHole مورد استفاده پل هدایت شده است یا نهlastSuppressedInputAt/suppressedInputBytes: ورودی local loopback که هنگام فعال بودن پخش دستیار نادیده گرفته شده است
{ "action": "speak", "sessionId": "meet_...", "message": "Say exactly: I'm here and listening."}حالتهای عامل و bidi
حالت agent در Chrome برای رفتار «عامل من در جلسه است» بهینه شده است. ارائهدهنده رونویسی بلادرنگ صدای جلسه را میشنود، رونویسیهای نهایی شرکتکننده از طریق عامل پیکربندیشده OmeniaClaw مسیریابی میشوند، و پاسخ از طریق زماناجرای عادی TTS در OmeniaClaw به گفتار تبدیل میشود. وقتی میخواهید مدل صدای بلادرنگ مستقیماً پاسخ دهد، mode: "bidi" را تنظیم کنید.
قطعههای نزدیک رونویسی نهایی پیش از مشورت ادغام میشوند تا یک نوبت گفتاری چند پاسخ جزئی کهنه تولید نکند. ورودی بلادرنگ نیز هنگامی که صدای صفشده دستیار هنوز در حال پخش است سرکوب میشود، و پژواکهای اخیر رونویسی شبیه دستیار پیش از مشورت عامل نادیده گرفته میشوند تا local loopback در BlackHole باعث نشود عامل به گفتار خودش پاسخ دهد.
| حالت | چه کسی پاسخ را تعیین میکند | مسیر خروجی گفتار | زمان استفاده |
|---|---|---|---|
agent |
عامل پیکربندیشده OmeniaClaw | زماناجرای عادی TTS در OmeniaClaw | وقتی رفتار «عامل من در جلسه است» را میخواهید |
bidi |
مدل صدای بلادرنگ | پاسخ صوتی ارائهدهنده صدای بلادرنگ | وقتی حلقه صدای مکالمهای با کمترین تأخیر را میخواهید |
در حالت bidi، وقتی مدل بلادرنگ به استدلال عمیقتر، اطلاعات جاری، یا ابزارهای عادی OmeniaClaw نیاز دارد، میتواند OmeniaClaw_agent_consult را فراخوانی کند.
ابزار مشاوره، عامل معمول OmeniaClaw را در پشتصحنه با زمینه رونوشت اخیر
جلسه اجرا میکند و یک پاسخ گفتاری کوتاه برمیگرداند. در حالت agent،
OmeniaClaw آن پاسخ را مستقیم به محیط اجرای TTS میفرستد؛ در حالت bidi، مدل
صوتی بیدرنگ میتواند نتیجه مشاوره را دوباره در جلسه بیان کند. این ابزار از
همان سازوکار مشاوره مشترکِ تماس صوتی استفاده میکند.
بهطور پیشفرض، مشاورهها روی عامل main اجرا میشوند. وقتی یک مسیر Meet باید
از فضای کاری عامل اختصاصی OmeniaClaw، پیشفرضهای مدل، سیاست ابزار، حافظه و
تاریخچه نشست اختصاصی استفاده کند، realtime.agentId را تنظیم کنید.
مشاورههای حالت عامل از یک کلید نشستِ بهازای هر جلسه با قالب
agent:<id>:subagent:google-meet:<session> استفاده میکنند تا پرسشهای
پیگیری، ضمن به ارث بردن سیاست معمول عامل از عامل پیکربندیشده، زمینه جلسه را
حفظ کنند.
realtime.toolPolicy اجرای مشاوره را کنترل میکند:
safe-read-only: ابزار مشاوره را در دسترس قرار بده و عامل معمول را بهread،web_search،web_fetch،x_search،memory_search، وmemory_getمحدود کن.owner: ابزار مشاوره را در دسترس قرار بده و اجازه بده عامل معمول از سیاست عادی ابزارهای عامل استفاده کند.none: ابزار مشاوره را در اختیار مدل صوتی بیدرنگ قرار نده.
کلید نشست مشاوره برای هر نشست Meet محدود میشود، بنابراین فراخوانیهای مشاوره پیگیری میتوانند در همان جلسه، از زمینه مشاوره قبلی دوباره استفاده کنند.
برای اجبار یک بررسی آمادگی گفتاری پس از اینکه Chrome کامل وارد تماس شد:
OmeniaClaw googlemeet speak meet_... "Say exactly: I'm here and listening."برای آزمون دودِ کاملِ پیوستن و صحبت کردن:
OmeniaClaw googlemeet test-speech https://meet.google.com/abc-defg-hij \ --transport chrome-node \ --message "Say exactly: I'm here and listening."چکلیست آزمون زنده
پیش از سپردن جلسه به یک عامل بدون نظارت، از این توالی استفاده کنید:
OmeniaClaw googlemeet setupOmeniaClaw nodes statusOmeniaClaw googlemeet test-speech https://meet.google.com/abc-defg-hij \ --transport chrome-node \ --message "Say exactly: Google Meet speech test complete."وضعیت مورد انتظار Chrome-node:
googlemeet setupهمگی سبز است.- وقتی Chrome-node ترابری پیشفرض است یا یک Node پین شده،
googlemeet setupشاملchrome-node-connectedاست. nodes statusنشان میدهد Node انتخابشده وصل است.- Node انتخابشده هر دو قابلیت
googlemeet.chromeوbrowser.proxyرا اعلام میکند. - زبانه Meet وارد تماس میشود و
test-speechسلامت Chrome را باinCall: trueبرمیگرداند.
برای یک میزبان Chrome راهدور مانند یک ماشین مجازی macOS روی Parallels، این کوتاهترین بررسی امن پس از بهروزرسانی Gateway یا ماشین مجازی است:
OmeniaClaw googlemeet setupOmeniaClaw nodes status --connectedOmeniaClaw nodes invoke \ --node parallels-macos \ --command googlemeet.chrome \ --params '{"action":"setup"}'این ثابت میکند Plugin مربوط به Gateway بارگذاری شده، Node ماشین مجازی با توکن فعلی وصل است، و پل صوتی Meet پیش از باز کردن زبانه جلسه واقعی توسط عامل در دسترس است.
برای آزمون دود Twilio، از جلسهای استفاده کنید که جزئیات شمارهگیری تلفنی را نمایش میدهد:
OmeniaClaw googlemeet setupOmeniaClaw googlemeet join https://meet.google.com/abc-defg-hij \ --transport twilio \ --dial-in-number +15551234567 \ --pin 123456وضعیت مورد انتظار Twilio:
googlemeet setupشامل بررسیهای سبزtwilio-voice-call-plugin،twilio-voice-call-credentials، وtwilio-voice-call-webhookاست.voicecallپس از بارگذاری دوباره Gateway در CLI در دسترس است.- نشست برگشتی
transport: "twilio"و یکtwilio.voiceCallIdدارد. OmeniaClaw logs --followنشان میدهد TwiML مربوط به DTMF پیش از TwiML بیدرنگ ارائه شده، سپس یک پل بیدرنگ با خوشامدگویی اولیه در صف قرار گرفته است.googlemeet leave <sessionId>تماس صوتی واگذارشده را قطع میکند.
عیبیابی
عامل نمیتواند ابزار Google Meet را ببیند
تأیید کنید Plugin در پیکربندی Gateway فعال است و Gateway را دوباره بارگذاری کنید:
OmeniaClaw plugins list | grep google-meetOmeniaClaw googlemeet setupاگر همین حالا plugins.entries.google-meet را ویرایش کردهاید، Gateway را
راهاندازی دوباره یا بارگذاری دوباره کنید. عامل در حال اجرا فقط ابزارهای Plugin
ثبتشده توسط فرایند فعلی Gateway را میبیند.
روی میزبانهای Gateway غیر macOS، ابزار عاملمحور google_meet همچنان قابل
مشاهده میماند، اما کنشهای گفتوبرگشت Chrome محلی پیش از رسیدن به پل صوتی
مسدود میشوند. صدای گفتوبرگشت Chrome محلی در حال حاضر به BlackHole 2ch در
macOS وابسته است، بنابراین عاملهای Linux باید بهجای مسیر پیشفرض عامل Chrome
محلی، از mode: "transcribe"، شمارهگیری Twilio، یا یک میزبان
chrome-node روی macOS استفاده کنند.
هیچ Node متصل و سازگار با Google Meet وجود ندارد
روی میزبان Node اجرا کنید:
OmeniaClaw plugins enable google-meetOmeniaClaw plugins enable browserOmeniaClaw_ALLOW_INSECURE_PRIVATE_WS=1 \ OmeniaClaw node run --host <gateway-lan-ip> --port 18789 --display-name parallels-macosروی میزبان Gateway، Node را تأیید و فرمانها را بررسی کنید:
OmeniaClaw devices listOmeniaClaw devices approve <requestId>OmeniaClaw nodes statusNode باید وصل باشد و googlemeet.chrome بههمراه browser.proxy را فهرست کند.
پیکربندی Gateway باید این فرمانهای Node را مجاز کند:
{ gateway: { nodes: { allowCommands: ["browser.proxy", "googlemeet.chrome"], }, },}اگر googlemeet setup در chrome-node-connected شکست خورد یا لاگ Gateway
gateway token mismatch را گزارش کرد، Node را با توکن فعلی Gateway دوباره نصب
یا راهاندازی دوباره کنید. برای Gateway روی LAN، این معمولاً یعنی:
OmeniaClaw_ALLOW_INSECURE_PRIVATE_WS=1 \ OmeniaClaw node install \ --host <gateway-lan-ip> \ --port 18789 \ --display-name parallels-macos \ --forceسپس سرویس Node را دوباره بارگذاری و دوباره اجرا کنید:
OmeniaClaw googlemeet setupOmeniaClaw nodes status --connectedمرورگر باز میشود اما عامل نمیتواند وارد شود
برای پیوستنهای فقط مشاهده، googlemeet test-listen و برای پیوستنهای بیدرنگ،
googlemeet test-speech را اجرا کنید، سپس سلامت Chrome برگشتی را بررسی کنید.
اگر هرکدام از این بررسیها manualActionRequired: true را گزارش کرد،
manualActionMessage را به اپراتور نشان دهید و تا کامل شدن کنش مرورگر، تلاش
دوباره را متوقف کنید.
کنشهای دستی رایج:
- وارد نمایه Chrome شوید.
- مهمان را از حساب میزبان Meet بپذیرید.
- وقتی اعلان مجوز بومی Chrome ظاهر میشود، مجوزهای میکروفون/دوربین Chrome را بدهید.
- یک گفتوگوی مجوز گیرکرده Meet را ببندید یا تعمیر کنید.
صرفاً به این دلیل که Meet نشان میدهد «Do you want people to hear you in the meeting?» گزارش «وارد نشده» ندهید. این میانپرده انتخاب صدا در Meet است؛ OmeniaClaw وقتی خودکارسازی مرورگر در دسترس باشد، روی Use microphone کلیک میکند و همچنان منتظر وضعیت واقعی جلسه میماند. برای پسگرد مرورگرِ فقط ایجاد، OmeniaClaw ممکن است روی Continue without microphone کلیک کند، چون ایجاد URL به مسیر صوتی بیدرنگ نیاز ندارد.
ایجاد جلسه شکست میخورد
googlemeet create ابتدا وقتی اعتبارنامههای OAuth پیکربندی شده باشند، از
نقطه پایانی spaces.create در Google Meet API استفاده میکند. بدون
اعتبارنامههای OAuth، به مرورگر Node پینشده Chrome پسگرد میکند. تأیید کنید:
- برای ایجاد با API:
oauth.clientIdوoauth.refreshTokenپیکربندی شدهاند، یا متغیرهای محیطی مطابقOmeniaClaw_GOOGLE_MEET_*موجودند. - برای ایجاد با API: توکن تازهسازی پس از اضافه شدن پشتیبانی ایجاد صادر شده
است. توکنهای قدیمیتر ممکن است قلمرو
meetings.space.createdرا نداشته باشند؛OmeniaClaw googlemeet auth login --jsonرا دوباره اجرا کنید و پیکربندی Plugin را بهروزرسانی کنید. - برای پسگرد مرورگر:
defaultTransport: "chrome-node"وchromeNode.nodeبه یک Node متصل باbrowser.proxyوgooglemeet.chromeاشاره میکنند. - برای پسگرد مرورگر: نمایه Chrome متعلق به OmeniaClaw روی آن Node به Google
وارد شده و میتواند
https://meet.google.com/newرا باز کند. - برای پسگرد مرورگر: تلاشهای دوباره پیش از باز کردن زبانه جدید، از یک
https://meet.google.com/newموجود یا زبانه اعلان حساب Google دوباره استفاده میکنند. اگر زمان عامل تمام شد، بهجای باز کردن دستی زبانه Meet دیگر، فراخوانی ابزار را دوباره امتحان کنید. - برای پسگرد مرورگر: اگر ابزار
manualActionRequired: trueرا برگرداند، ازbrowser.nodeId،browser.targetId،browserUrl، وmanualActionMessageبرگشتی برای راهنمایی اپراتور استفاده کنید. تا کامل شدن آن کنش، در حلقه تلاش دوباره نکنید. - برای پسگرد مرورگر: اگر Meet نشان داد «Do you want people to hear you in the
meeting?» زبانه را باز بگذارید. OmeniaClaw باید از طریق خودکارسازی مرورگر روی
Use microphone یا، برای پسگرد فقط ایجاد، روی Continue without
microphone کلیک کند و همچنان منتظر URL تولیدشده Meet بماند. اگر نتواند،
خطا باید به
meet-audio-choice-requiredاشاره کند، نهgoogle-login-required.
عامل وارد میشود اما صحبت نمیکند
مسیر بیدرنگ را بررسی کنید:
OmeniaClaw googlemeet setupOmeniaClaw googlemeet doctorبرای مسیر معمول STT -> عامل OmeniaClaw -> گفتوبرگشت TTS از mode: "agent"،
یا برای پسگرد صوتی بیدرنگ مستقیم از mode: "bidi" استفاده کنید.
mode: "transcribe" عمداً پل گفتوبرگشت را شروع نمیکند. برای اشکالزدایی
فقط مشاهده، پس از صحبت کردن شرکتکنندگان OmeniaClaw googlemeet status --json <session-id> را اجرا کنید و captioning، transcriptLines، و
lastCaptionText را بررسی کنید. اگر inCall درست است اما transcriptLines
روی 0 میماند، ممکن است زیرنویسهای Meet غیرفعال باشند، از زمان نصب ناظر
کسی صحبت نکرده باشد، رابط کاربری Meet تغییر کرده باشد، یا زیرنویس زنده برای
زبان/حساب جلسه در دسترس نباشد.
googlemeet test-speech همیشه مسیر بیدرنگ را بررسی میکند و گزارش میدهد آیا
برای آن فراخوانی، بایتهای خروجی پل مشاهده شدهاند یا نه. اگر
speechOutputVerified نادرست و speechOutputTimedOut درست باشد، ارائهدهنده
بیدرنگ ممکن است گفتار را پذیرفته باشد اما OmeniaClaw بایتهای خروجی جدیدی را که
به پل صوتی Chrome برسند ندیده است.
همچنین بررسی کنید:
- یک کلید ارائهدهنده بیدرنگ روی میزبان Gateway در دسترس است، مانند
OPENAI_API_KEYیاGEMINI_API_KEY. BlackHole 2chروی میزبان Chrome قابل مشاهده است.soxروی میزبان Chrome وجود دارد.- میکروفون و بلندگوی Meet از مسیر صوتی مجازی مورد استفاده OmeniaClaw عبور داده
شدهاند. برای پیوستنهای بیدرنگ Chrome محلی،
doctorبایدmeet output routed: yesرا نشان دهد.
googlemeet doctor [session-id] نشست، Node، وضعیت حضور در تماس، دلیل کنش
دستی، اتصال ارائهدهنده بیدرنگ، realtimeReady، فعالیت ورودی/خروجی صدا،
آخرین زمانهای صوتی، شمارندههای بایت، و URL مرورگر را چاپ میکند. وقتی به
JSON خام نیاز دارید از googlemeet status [session-id] --json استفاده کنید.
وقتی باید تازهسازی OAuth مربوط به Google Meet را بدون افشای توکنها بررسی
کنید از googlemeet doctor --oauth استفاده کنید؛ وقتی به اثبات Google Meet
API هم نیاز دارید، --meeting یا --create-space را اضافه کنید.
اگر زمان عامل تمام شد و میتوانید ببینید یک زبانه Meet از قبل باز است، بدون باز کردن زبانه دیگر همان زبانه را بررسی کنید:
OmeniaClaw googlemeet recover-tabOmeniaClaw googlemeet recover-tab https://meet.google.com/abc-defg-hijکنش ابزار معادل recover_current_tab است. این کنش یک زبانه Meet موجود را برای
ترابری انتخابشده متمرکز و بررسی میکند. با chrome، از کنترل مرورگر محلی از
طریق Gateway استفاده میکند؛ با chrome-node، از Node پیکربندیشده Chrome
استفاده میکند. زبانه جدیدی باز نمیکند و نشست جدیدی نمیسازد؛ مانع فعلی را
گزارش میدهد، مانند وضعیت ورود، پذیرش، مجوزها، یا انتخاب صدا. فرمان CLI با
Gateway پیکربندیشده صحبت میکند، بنابراین Gateway باید در حال اجرا باشد؛
chrome-node همچنین نیاز دارد Node مربوط به Chrome متصل باشد.
بررسیهای راهاندازی Twilio شکست میخورند
وقتی voice-call مجاز یا فعال نباشد، twilio-voice-call-plugin شکست میخورد.
آن را به plugins.allow اضافه کنید، plugins.entries.voice-call را فعال کنید،
و Gateway را دوباره بارگذاری کنید.
وقتی پسزمینه Twilio فاقد SID حساب، توکن احراز هویت، یا شماره تماسگیرنده
باشد، twilio-voice-call-credentials شکست میخورد. اینها را روی میزبان
Gateway تنظیم کنید:
export TWILIO_ACCOUNT_SID=AC...export TWILIO_AUTH_TOKEN=...export TWILIO_FROM_NUMBER=+15550001234وقتی voice-call هیچ نمایش Webhook عمومی نداشته باشد، یا وقتی publicUrl به
local loopback یا فضای شبکه خصوصی اشاره کند، twilio-voice-call-webhook شکست
میخورد. plugins.entries.voice-call.config.publicUrl را به URL عمومی
ارائهدهنده تنظیم کنید یا یک تونل/نمایش Tailscale برای voice-call پیکربندی
کنید.
URLهای local loopback و خصوصی برای callbackهای اپراتور تلفنی معتبر نیستند. از
localhost، 127.0.0.1، 0.0.0.0، 10.x، 172.16.x-172.31.x،
192.168.x، 169.254.x، fc00::/7، یا fd00::/8 بهعنوان publicUrl
استفاده نکنید.
برای یک URL عمومی پایدار:
{ plugins: { entries: { "voice-call": { enabled: true, config: { provider: "twilio", fromNumber: "+15550001234", publicUrl: "https://voice.example.com/voice/webhook", }, }, }, },}برای توسعهٔ محلی، بهجای URL میزبان خصوصی، از یک تونل یا ارائهٔ Tailscale استفاده کنید:
{ plugins: { entries: { "voice-call": { config: { tunnel: { provider: "ngrok" }, // or tailscale: { mode: "funnel", path: "/voice/webhook" }, }, }, }, },}سپس Gateway را بازراهاندازی یا دوباره بارگذاری کنید و اجرا کنید:
OmeniaClaw googlemeet setup --transport twilioOmeniaClaw voicecall setupOmeniaClaw voicecall smokevoicecall smoke بهطور پیشفرض فقط آمادگی را بررسی میکند. برای اجرای آزمایشی یک شمارهٔ مشخص:
OmeniaClaw voicecall smoke --to "+15555550123"فقط زمانی --yes را اضافه کنید که عمداً میخواهید یک تماس اعلان خروجی زنده برقرار کنید:
OmeniaClaw voicecall smoke --to "+15555550123" --yesتماس Twilio شروع میشود اما هرگز وارد جلسه نمیشود
تأیید کنید که رویداد Meet جزئیات شمارهگیری تلفنی را ارائه میکند. شمارهٔ دقیق شمارهگیری و PIN یا یک توالی DTMF سفارشی را بدهید:
OmeniaClaw googlemeet join https://meet.google.com/abc-defg-hij \ --transport twilio \ --dial-in-number +15551234567 \ --dtmf-sequence ww123456#اگر ارائهدهنده پیش از وارد کردن PIN به مکث نیاز دارد، در --dtmf-sequence از w ابتدایی یا ویرگول استفاده کنید.
اگر تماس تلفنی ایجاد میشود اما فهرست حاضران Meet هرگز شرکتکنندهٔ شمارهگیری تلفنی را نشان نمیدهد:
OmeniaClaw googlemeet doctor <session-id>را اجرا کنید تا شناسهٔ تماس Twilio واگذارشده، اینکه آیا DTMF در صف قرار گرفته، و اینکه آیا پیام خوشامدگویی آغازین درخواست شده است را تأیید کنید.OmeniaClaw voicecall status --call-id <id>را اجرا کنید و تأیید کنید که تماس همچنان فعال است.OmeniaClaw voicecall tailرا اجرا کنید و بررسی کنید که Webhookهای Twilio به Gateway میرسند.OmeniaClaw logs --followرا اجرا کنید و دنبال توالی Twilio Meet بگردید: Google Meet پیوستن را واگذار میکند، Voice Call، TwiML مربوط به DTMF پیش از اتصال را ذخیره و سرو میکند، Voice Call، TwiML بلادرنگ را برای تماس Twilio سرو میکند، سپس Google Meet گفتار آغازین را باvoicecall.speakدرخواست میکند.OmeniaClaw googlemeet setup --transport twilioرا دوباره اجرا کنید؛ یک بررسی راهاندازی سبز لازم است اما درست بودن توالی PIN جلسه را ثابت نمیکند.- تأیید کنید که شمارهٔ شمارهگیری به همان دعوتنامه و منطقهٔ Meet مربوط به PIN تعلق دارد.
- اگر Meet کند پاسخ میدهد یا متن تماس پس از ارسال DTMF پیش از اتصال همچنان اعلان درخواست PIN را نشان میدهد،
voiceCall.dtmfDelayMsرا از مقدار پیشفرض ۱۲ ثانیه افزایش دهید. - اگر شرکتکننده میپیوندد اما پیام خوشامدگویی را نمیشنوید،
OmeniaClaw logs --followرا برای درخواست پس از DTMF یعنیvoicecall.speakو پخش TTS جریان رسانه یا جایگزین TwilioOmeniaClaw_DOCS_MARKER:calloutOpen:U2F5بررسی کنید. اگر متن تماس همچنان شامل «PIN جلسه را وارد کنید» است، مسیر تلفنی هنوز به اتاق Meet نپیوسته است، بنابراین شرکتکنندگان جلسه گفتار را نخواهند شنید.
اگر Webhookها نمیرسند، ابتدا Plugin تماس صوتی را اشکالزدایی کنید: ارائهدهنده باید بتواند به plugins.entries.voice-call.config.publicUrl یا تونل پیکربندیشده برسد. عیبیابی تماس صوتی را ببینید.
یادداشتها
API رسانهٔ رسمی Google Meet دریافتمحور است، بنابراین صحبت کردن در یک تماس Meet همچنان به مسیر شرکتکننده نیاز دارد. این Plugin آن مرز را آشکار نگه میدارد: Chrome مشارکت مرورگر و مسیریابی صوت محلی را مدیریت میکند؛ Twilio مشارکت شمارهگیری تلفنی را مدیریت میکند.
حالتهای پاسخگویی Chrome به BlackHole 2ch بههمراه یکی از اینها نیاز دارند:
chrome.audioInputCommandبههمراهchrome.audioOutputCommand: OmeniaClaw مالک پل است و صدا را باchrome.audioFormatبین آن فرمانها و ارائهدهندهٔ انتخابشده لولهکشی میکند. حالت عامل از رونویسی بلادرنگ بههمراه TTS معمولی استفاده میکند؛ حالت دوسویه از ارائهدهندهٔ صدای بلادرنگ استفاده میکند. مسیر پیشفرض Chrome برابر با PCM16 با نرخ ۲۴ kHz وchrome.audioBufferBytes: 4096است؛ G.711 mu-law با نرخ ۸ kHz همچنان برای جفتفرمانهای قدیمی در دسترس است.chrome.audioBridgeCommand: یک فرمان پل خارجی مالک کل مسیر صوت محلی است و باید پس از شروع یا اعتبارسنجی daemon خود خارج شود. این فقط برایbidiمعتبر است، زیرا حالتagentبرای TTS به دسترسی مستقیم جفتفرمان نیاز دارد.
وقتی یک عامل ابزار google_meet را در حالت عامل فراخوانی میکند، نشست مشاور جلسه پیش از پاسخ دادن به گفتار شرکتکنندگان، متن رونوشت فعلی فراخواننده را fork میکند. نشست Meet همچنان جدا میماند (agent:<agentId>:subagent:google-meet:<sessionId>) تا پیگیریهای جلسه مستقیماً متن رونوشت فراخواننده را تغییر ندهند.
برای صدای دوطرفهٔ تمیز، خروجی Meet و میکروفون Meet را از طریق دستگاههای مجازی جداگانه یا یک گراف دستگاه مجازی به سبک Loopback مسیریابی کنید. یک دستگاه BlackHole مشترک میتواند صدای شرکتکنندگان دیگر را دوباره به تماس بازتاب دهد.
با پل Chrome جفتفرمان، chrome.bargeInInputCommand میتواند به یک میکروفون محلی جداگانه گوش دهد و وقتی انسان شروع به صحبت میکند پخش دستیار را پاک کند. این کار گفتار انسان را حتی زمانی که ورودی local loopback مشترک BlackHole هنگام پخش دستیار بهطور موقت سرکوب شده است، جلوتر از خروجی دستیار نگه میدارد. مانند chrome.audioInputCommand و chrome.audioOutputCommand، این یک فرمان محلی پیکربندیشده توسط اپراتور است. از مسیر فرمان یا فهرست آرگومانهای صریح و قابلاعتماد استفاده کنید و آن را به اسکریپتهایی از مکانهای غیرقابلاعتماد اشاره ندهید.
googlemeet speak پل صوتی پاسخگویی فعال را برای یک نشست Chrome فعال میکند. googlemeet leave آن پل را متوقف میکند. برای نشستهای Twilio که از طریق Plugin تماس صوتی واگذار شدهاند، leave تماس صوتی زیربنایی را نیز قطع میکند. وقتی میخواهید کنفرانس فعال Google Meet را نیز برای یک فضای مدیریتشده با API ببندید، از googlemeet end-active-conference استفاده کنید.