Bundled plugin guides
Google Meet Plugin
Google Meet åå è ãµããŒãã® OpenClaw 察å¿ã¯ãèšèšäžæç€ºçã§ã:
- æç€ºçãª
https://meet.google.com/...URL ã«ã®ã¿åå ããŸãã - Google Meet API çµç±ã§æ°ãã Meet ã¹ããŒã¹ãäœæããè¿ããã URL ã«åå ã§ããŸãã
agentãããã©ã«ãã®å¿ççºè©±ã¢ãŒãã§ãããªã¢ã«ã¿ã€ã æåèµ·ãããèãåããèšå®æžã¿ã® OpenClaw ãšãŒãžã§ã³ããåçããéåžžã® OpenClaw TTS ã Meet ã«çºè©±ããŸããbidiã¯ãçŽæ¥ãªã¢ã«ã¿ã€ã é³å£°ã¢ãã«ã¢ãŒãã®ãã©ãŒã«ããã¯ãšããŠåŒãç¶ãå©çšã§ããŸãã- ãšãŒãžã§ã³ãã¯
modeã§åå åäœãéžã³ãŸããã©ã€ãã®èãåã/å¿ççºè©±ã«ã¯agentãçŽæ¥ãªã¢ã«ã¿ã€ã é³å£°ãã©ãŒã«ããã¯ã«ã¯bidiãå¿ççºè©±ããªããžãªãã§ãã©ãŠã¶ãžåå /å¶åŸ¡ããã«ã¯transcribeã䜿ããŸãã - èªèšŒã¯ãåäººçš Google OAuth ãŸãã¯ãã§ã«ãµã€ã³ã€ã³æžã¿ã® Chrome ãããã¡ã€ã«ããéå§ããŸãã
- èªåã®åæã¢ããŠã³ã¹ã¯ãããŸããã
- ããã©ã«ãã® Chrome é³å£°ããã¯ãšã³ãã¯
BlackHole 2chã§ãã - Chrome ã¯ããŒã«ã«ã§ãããã¢ãªã³ã°æžã¿ããŒããã¹ãäžã§ãå®è¡ã§ããŸãã
- Twilio ã¯ãã€ã€ã«ã€ã³çªå·ãšä»»æã® PIN ãŸã㯠DTMF ã·ãŒã±ã³ã¹ãåãä»ããŸãããMeet URL ã«çŽæ¥ãã€ã€ã«ããããšã¯ã§ããŸããã
- CLI ã³ãã³ãã¯
googlemeetã§ããmeetã¯ãããåºç¯ãªãšãŒãžã§ã³ãã®ãã¬ãäŒè°ã¯ãŒã¯ãããŒçšã«äºçŽãããŠããŸãã
ã¯ã€ãã¯ã¹ã¿ãŒã
ããŒã«ã«é³å£°äŸåé¢ä¿ãã€ã³ã¹ããŒã«ãããªã¢ã«ã¿ã€ã æåèµ·ãããããã€ããŒãšéåžžã® OpenClaw TTS ãèšå®ããŸããOpenAI ã¯ããã©ã«ãã®æåèµ·ãããããã€ããŒã§ããGoogle Gemini Live ããrealtime.voiceProvider: "google" ãæå®ããå¥åã® bidi é³å£°ãã©ãŒã«ããã¯ãšããŠæ©èœããŸã:
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: {}, }, }, },}ã»ããã¢ããã確èªããŸã:
openclaw googlemeet setupã»ããã¢ããåºåã¯ããšãŒãžã§ã³ããèªã¿åããããšãšã¢ãŒãèªèãæå³ããŠããŸããChrome ãããã¡ã€ã«ãããŒãåºå®ããããŠãªã¢ã«ã¿ã€ã Chrome åå ã®å Žå㯠BlackHole/SoX é³å£°ããªããžãšé
å»¶ãªã¢ã«ã¿ã€ã å°å
¥ãã§ãã¯ãå ±åããŸãã芳å¯å°çšåå ã§ã¯ãåããã©ã³ã¹ããŒãã --mode transcribe ã§ç¢ºèªããŸãããã®ã¢ãŒãã¯ãããªããžçµç±ã§èãåã£ããçºè©±ãããããªãããããªã¢ã«ã¿ã€ã é³å£°ã®åææ¡ä»¶ãã¹ãããããŸã:
openclaw googlemeet setup --transport chrome-node --mode transcribeTwilio å§ä»»ãèšå®ãããŠããå Žåãã»ããã¢ãã㯠voice-call PluginãTwilio èªèšŒæ
å ±ãå
¬é Webhook é²åºã®æºåç¶æ³ãå ±åããŸãããšãŒãžã§ã³ãã«åå ãäŸé Œããåã«ãok: false ã®ãã§ãã¯ã¯ã確èªå¯Ÿè±¡ã®ãã©ã³ã¹ããŒããšã¢ãŒãã«å¯Ÿãããããã«ãŒãšããŠæ±ã£ãŠãã ãããã¹ã¯ãªãããŸãã¯æ©æ¢°å¯èªåºåã«ã¯ openclaw googlemeet setup --json ã䜿ããŸãããšãŒãžã§ã³ãã詊è¡ããåã«ç¹å®ã®ãã©ã³ã¹ããŒããäºå確èªããã«ã¯ã--transport chromeã--transport chrome-nodeããŸã㯠--transport twilio ã䜿ããŸãã
Twilio ã§ã¯ãããã©ã«ããã©ã³ã¹ããŒãã Chrome ã®å Žåãåžžã«ãã©ã³ã¹ããŒããæç€ºçã«äºå確èªããŸã:
openclaw googlemeet setup --transport twilioããã«ããããšãŒãžã§ã³ããäŒè°ãžãã€ã€ã«ããããšããåã«ãvoice-call é
ç·ã®æ¬ èœãTwilio èªèšŒæ
å ±ããŸãã¯å°éäžèœãª Webhook é²åºãæ€åºã§ããŸãã
äŒè°ã«åå ããŸã:
openclaw 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 以å€ã®ãã¹ãã§ããã¢ãŒãã£ãã¡ã¯ããã«ã¬ã³ããŒãã»ããã¢ãããæåèµ·ãããTwilioãchrome-node ãããŒã§åŒãç¶ãå©çšã§ããŸããããŒã«ã« Chrome ã®å¿ççºè©±ã¢ã¯ã·ã§ã³ã¯ããã³ãã«ããã Chrome é³å£°ãã¹ãçŸåš macOS ã® BlackHole 2ch ã«äŸåããŠãããããããã§ãããã¯ãããŸããLinux ã§ã¯ãChrome å¿ççºè©±åå ã« mode: "transcribe"ãTwilio ãã€ã€ã«ã€ã³ããŸã㯠macOS chrome-node ãã¹ãã䜿ããŸãã
æ°ããäŒè°ãäœæããŠåå ããŸã:
openclaw googlemeet create --transport chrome-node --mode agentAPI ã§äœæããã«ãŒã ã§ã¯ãGoogle ã¢ã«ãŠã³ãã®ããã©ã«ãããç¶æ¿ããã®ã§ã¯ãªããã«ãŒã ã®ããã¯äžèŠããªã·ãŒãæç€ºãããå Žåã« Google Meet SpaceConfig.accessType ã䜿ããŸã:
openclaw googlemeet create --access-type OPEN --transport chrome-node --mode agentOPEN ã¯ãMeet URL ãæã€å
šå¡ãããã¯ãªãã§åå ã§ããããã«ããŸããTRUSTED ã¯ããã¹ãçµç¹ã®ä¿¡é Œæžã¿ãŠãŒã¶ãŒãæåŸ
ãããå€éšãŠãŒã¶ãŒããã€ã€ã«ã€ã³ãŠãŒã¶ãŒãããã¯ãªãã§åå ã§ããããã«ããŸããRESTRICTED ã¯ãããã¯ãªãã®å
¥å®€ãæåŸ
è
ã«éå®ããŸãããããã®èšå®ã¯å
¬åŒ Google Meet API äœæãã¹ã«ã®ã¿é©çšããããããOAuth èªèšŒæ
å ±ãèšå®ããå¿
èŠããããŸãã
ãã®ãªãã·ã§ã³ãå©çšå¯èœã«ãªãåã« Google Meet ãèªèšŒããŠããå Žåã¯ãGoogle OAuth åæç»é¢ã« meetings.space.settings ã¹ã³ãŒãã远å ããåŸãopenclaw googlemeet auth login --json ãåå®è¡ããŸãã
åå ããã« URL ã ããäœæããŸã:
openclaw googlemeet create --no-joingooglemeet create ã«ã¯ 2 ã€ã®ãã¹ããããŸã:
- API äœæ: Google Meet OAuth èªèšŒæ å ±ãèšå®ãããŠããå Žåã«äœ¿ãããŸããããã¯æãæ±ºå®çãªãã¹ã§ããããã©ãŠã¶ UI ã®ç¶æ ã«äŸåããŸããã
- ãã©ãŠã¶ãã©ãŒã«ããã¯: OAuth èªèšŒæ
å ±ããªãå Žåã«äœ¿ãããŸããOpenClaw ã¯åºå®ããã Chrome ããŒãã䜿ãã
https://meet.google.com/newãéããGoogle ãå®éã®äŒè°ã³ãŒã URL ã«ãªãã€ã¬ã¯ãããã®ãåŸ ã£ãŠããããã® URL ãè¿ããŸãããã®ãã¹ã§ã¯ãããŒãäžã® OpenClaw Chrome ãããã¡ã€ã«ããã§ã« Google ã«ãµã€ã³ã€ã³ããŠããå¿ èŠããããŸãããã©ãŠã¶èªåå㯠Meet èªäœã®ååãã€ã¯ããã³ãããåŠçããŸãããã®ããã³ãã㯠Google ãã°ã€ã³å€±æãšããŠã¯æ±ãããŸããã åå ãããŒãšäœæãããŒã¯ãæ°ããã¿ããéãåã«æ¢åã® Meet ã¿ãã®åå©çšã詊ã¿ãŸããç §åã§ã¯authuserãªã©ã®ç¡å®³ãª URL ã¯ãšãªæååãç¡èŠããããããšãŒãžã§ã³ãã®å詊è¡ã§ã¯ 2 ã€ç®ã® Chrome ã¿ããäœæããã®ã§ã¯ãªãããã§ã«éããŠããäŒè°ã«ãã©ãŒã«ã¹ããã¯ãã§ãã
ã³ãã³ã/ããŒã«åºåã«ã¯ 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 åå ã¯ãOpenClaw ã®ãã€ã¯/ã«ã¡ã©æš©éä»äžãé¿ããMeet ã® ãã€ã¯ãäœ¿çš ãã¹ãé¿ããŸããMeet ãé³å£°éžæã€ã³ã¿ãŒã¹ãã£ã·ã£ã«ã衚瀺ããå Žåãèªååã¯ãã€ã¯ãªãã®ãã¹ã詊ã¿ããã以å€ã®å Žåã¯ããŒã«ã«ãã€ã¯ãéã代ããã«æåã¢ã¯ã·ã§ã³ãå ±åããŸããtranscribe ã¢ãŒãã§ã¯ã管ç察象 Chrome ãã©ã³ã¹ããŒãããã¹ããšãã©ãŒãã® Meet ãã£ãã·ã§ã³ãªãã¶ãŒããŒãã€ã³ã¹ããŒã«ããŸããgooglemeet status --json ãš googlemeet doctor ã¯ãcaptioningãcaptionsEnabledAttemptedãtranscriptLinesãlastCaptionAtãlastCaptionSpeakerãlastCaptionTextãçã recentTranscript æ«å°Ÿã衚瀺ããããããªãã¬ãŒã¿ãŒã¯ãã©ãŠã¶ãé話ã«åå ããããMeet ãã£ãã·ã§ã³ãããã¹ããçæããŠãããã倿ã§ããŸãã
ã¯ã/ãããã®ãããŒããå¿
èŠãªå Žåã¯ãopenclaw googlemeet test-listen <meet-url> --transport chrome-node ã䜿ããŸãããã㯠transcribe ã¢ãŒãã§åå ããæ°ãããã£ãã·ã§ã³ãŸãã¯æåèµ·ããã®åããåŸ
ã¡ãlistenVerifiedãlistenTimedOutãæåã¢ã¯ã·ã§ã³ãã£ãŒã«ããææ°ã®ãã£ãã·ã§ã³ãã«ã¹ãè¿ããŸãã
ãªã¢ã«ã¿ã€ã ã»ãã·ã§ã³äžãgoogle_meet ã¹ããŒã¿ã¹ã«ã¯ãinCallãmanualActionRequiredãproviderConnectedãrealtimeReadyãaudioInputActiveãaudioOutputActiveãæçµå
¥å/åºåã¿ã€ã ã¹ã¿ã³ãããã€ãã«ãŠã³ã¿ãŒãããªããžã®ã¯ããŒãºç¶æ
ãªã©ããã©ãŠã¶ãšé³å£°ããªããžã®ãã«ã¹ãå«ãŸããŸããå®å
šãª Meet ããŒãžããã³ããã衚瀺ãããå Žåããã©ãŠã¶èªååã¯å¯èœãªãšãã«ãããåŠçããŸãããã°ã€ã³ããã¹ãæ¿èªããã©ãŠã¶/OS æš©éããã³ããã¯ããšãŒãžã§ã³ããäžç¶ããããã®çç±ãšã¡ãã»ãŒãžä»ãã®æåã¢ã¯ã·ã§ã³ãšããŠå ±åãããŸãã管ç察象 Chrome ã»ãã·ã§ã³ã¯ããã©ãŠã¶ãã«ã¹ã inCall: true ãå ±åããåŸã«ã®ã¿å°å
¥ãŸãã¯ãã¹ããã¬ãŒãºãåºåããŸãããã以å€ã®å Žåãã¹ããŒã¿ã¹ã¯ speechReady: false ãå ±åãããšãŒãžã§ã³ããäŒè°ã§è©±ãããµãããã代ããã«çºè©±è©Šè¡ããããã¯ããŸãã
ããŒã«ã« Chrome åå ã¯ããµã€ã³ã€ã³æžã¿ã® OpenClaw ãã©ãŠã¶ãããã¡ã€ã«ãéããŠè¡ãããŸãããªã¢ã«ã¿ã€ã ã¢ãŒãã§ã¯ãOpenClaw ã䜿ããã€ã¯/ã¹ããŒã«ãŒãã¹ã« BlackHole 2ch ãå¿
èŠã§ããã¯ãªãŒã³ãªåæ¹åé³å£°ã«ã¯ãå¥åã®ä»®æ³ããã€ã¹ãŸã㯠Loopback 圢åŒã®ã°ã©ãã䜿ããŸããåäžã® BlackHole ããã€ã¹ã§ãæåã®ã¹ã¢ãŒã¯ãã¹ãã«ã¯ååã§ããããšã³ãŒãçºçããå¯èœæ§ããããŸãã
ããŒã«ã« Gateway + Parallels Chrome
VM ã« Chrome ãææãããã ããªããmacOS VM å ã«å®å šãª OpenClaw Gateway ãã¢ãã« API ããŒã¯å¿ èŠãããŸãããGateway ãšãšãŒãžã§ã³ããããŒã«ã«ã§å®è¡ããVM å ã§ããŒããã¹ããå®è¡ããŸããVM äžã§ãã³ãã«ããã Plugin ãäžåºŠæå¹ã«ããããŒãã Chrome ã³ãã³ããéç¥ããããã«ããŸã:
ã©ãã§äœãå®è¡ããã:
- Gateway ãã¹ã: OpenClaw GatewayããšãŒãžã§ã³ãã¯ãŒã¯ã¹ããŒã¹ãã¢ãã«/API ããŒããªã¢ã«ã¿ã€ã ãããã€ããŒãGoogle Meet Plugin èšå®ã
- Parallels macOS VM: OpenClaw CLI/ããŒããã¹ããGoogle ChromeãSoXãBlackHole 2chãGoogle ã«ãµã€ã³ã€ã³æžã¿ã® Chrome ãããã¡ã€ã«ã
- VM ã§äžèŠãªãã®: Gateway ãµãŒãã¹ããšãŒãžã§ã³ãèšå®ãOpenAI/GPT ããŒãã¢ãã«ãããã€ããŒèšå®ã
VM ã®äŸåé¢ä¿ãã€ã³ã¹ããŒã«ããŸã:
brew install blackhole-2ch soxBlackHole ã®ã€ã³ã¹ããŒã«åŸãmacOS ã BlackHole 2ch ãå
¬éããããã« VM ãåèµ·åããŸã:
sudo rebootåèµ·ååŸãVM ãé³å£°ããã€ã¹ãš SoX ã³ãã³ããèªèã§ããããšã確èªããŸã:
system_profiler SPAudioDataType | grep -i BlackHolecommand -v soxVM ã« OpenClaw ãã€ã³ã¹ããŒã«ãŸãã¯æŽæ°ããããã§ãã³ãã«ããã Plugin ãæå¹ã«ããŸã:
openclaw plugins enable google-meetVM å ã§ããŒããã¹ããéå§ããŸã:
openclaw node run --host <gateway-host> --port 18789 --display-name parallels-macos<gateway-host> ã LAN IP ã§ãTLS ã䜿ã£ãŠããªãå Žåããã®ä¿¡é Œæžã¿ãã©ã€ããŒããããã¯ãŒã¯ã«æç€ºçã«åæããªãéããããŒãã¯å¹³æ WebSocket ãæåŠããŸã:
OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 \ openclaw node run --host <gateway-lan-ip> --port 18789 --display-name parallels-macosããŒãã LaunchAgent ãšããŠã€ã³ã¹ããŒã«ããå Žåãåãç°å¢å€æ°ã䜿ããŸã:
OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 \ openclaw node install --host <gateway-lan-ip> --port 18789 --display-name parallels-macos --forceopenclaw node restartOPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 ã¯ããã»ã¹ç°å¢ã§ãããopenclaw.json èšå®ã§ã¯ãããŸãããopenclaw node install ã¯ãã€ã³ã¹ããŒã«ã³ãã³ãäžã«ååšããå Žåãããã LaunchAgent ç°å¢ã«ä¿åããŸãã
Gateway ãã¹ãããããŒããæ¿èªããŸã:
openclaw devices listopenclaw devices approve <requestId>Gateway ãããŒããèªèãããã®ããŒãã googlemeet.chrome ãšãã©ãŠã¶æ©èœ/browser.proxy ã®äž¡æ¹ãéç¥ããŠããããšã確èªããŸã:
openclaw nodes statusGateway ãã¹ãäžã§ Meet ããã®ããŒãçµç±ã«ã«ãŒãã£ã³ã°ããŸã:
{ gateway: { nodes: { allowCommands: ["googlemeet.chrome", "browser.proxy"], }, }, plugins: { entries: { "google-meet": { enabled: true, config: { defaultTransport: "chrome-node", chrome: { guestName: "OpenClaw Agent", autoJoin: true, reuseExistingTab: true, }, chromeNode: { node: "parallels-macos", }, }, }, }, },}ããã§ Gateway ãã¹ãããéåžžã©ããåå ã§ããŸã:
openclaw googlemeet join https://meet.google.com/abc-defg-hijãŸãã¯ãtransport: "chrome-node" ã§ google_meet ããŒã«ã䜿ããããšãŒãžã§ã³ãã«äŸé ŒããŸãã
ã»ãã·ã§ã³ãäœæãŸãã¯åå©çšããæ¢ç¥ã®ãã¬ãŒãºã話ããã»ãã·ã§ã³ãã«ã¹ãåºåãã 1 ã³ãã³ãã®ã¹ã¢ãŒã¯ãã¹ã:
openclaw googlemeet test-speech https://meet.google.com/abc-defg-hijãªã¢ã«ã¿ã€ã åå äžãOpenClaw ã®ãã©ãŠã¶ãŒèªååã¯ã²ã¹ãåãå
¥åãã
Join/Ask to join ãã¯ãªãã¯ãããã®ããã³ããã衚瀺ãããå Žå㯠Meet ã®ååå®è¡æã®
ãUse microphoneãéžæãåãå
¥ããŸãã芳å¯å°çšåå ãŸãã¯ãã©ãŠã¶ãŒã®ã¿ã®äŒè°äœæäžã¯ã
ãã®éžæãå©çšå¯èœãªå Žåããã€ã¯ãªãã§åãããã³ãããé²ããŸãã
ãã©ãŠã¶ãŒãããã¡ã€ã«ããµã€ã³ã€ã³ããŠããªããMeet ããã¹ãã®æ¿èªåŸ
ã¡ã§ããã
ãªã¢ã«ã¿ã€ã åå ã« Chrome ã®ãã€ã¯/ã«ã¡ã©æš©éãå¿
èŠã§ããããŸã㯠Meet ãèªååã§ã¯
解決ã§ããªãããã³ããã§æ¢ãŸã£ãŠããå Žåãåå /test-speech ã®çµæã¯
manualActionRequired: true ã manualActionReason ããã³
manualActionMessage ãšãšãã«å ±åããŸãããšãŒãžã§ã³ãã¯åå ã®å詊è¡ã忢ãã
ãã®æ£ç¢ºãªã¡ãã»ãŒãžã«çŸåšã® browserUrl/browserTitle ãæ·»ããŠå ±åãã
æåã®ãã©ãŠã¶ãŒæäœãå®äºããŠããã®ã¿å詊è¡ããå¿
èŠããããŸãã
chromeNode.node ãçç¥ãããå ŽåãOpenClaw ã¯ãæ¥ç¶æžã¿ããŒãã®ãã¡
googlemeet.chrome ãšãã©ãŠã¶ãŒå¶åŸ¡ã®äž¡æ¹ãéç¥ããŠãããã®ãã¡ããã© 1 ã€ã®å Žåã«ã®ã¿
èªåéžæããŸãã察å¿å¯èœãªããŒããè€æ°æ¥ç¶ãããŠããå Žåã¯ãchromeNode.node ã
ããŒã IDã衚瀺åããŸãã¯ãªã¢ãŒã IP ã«èšå®ããŠãã ããã
äžè¬çãªå€±æãã§ãã¯:
Configured Google Meet node ... is not usable: offline: åºå®ãããããŒã㯠Gateway ã«ã¯èªèãããŠããŸããå©çšã§ããŸããããšãŒãžã§ã³ãã¯ãã®ããŒãã å©çšå¯èœãª Chrome ãã¹ãã§ã¯ãªã蚺æç¶æ ãšããŠæ±ãããŠãŒã¶ãŒããããæ±ããŠããªãéãã å¥ã®ãã©ã³ã¹ããŒããžãã©ãŒã«ããã¯ããã«ã»ããã¢ããã®ãããã«ãŒãå ±åããå¿ èŠããããŸããNo connected Google Meet-capable node: VM å ã§openclaw node runãéå§ãã ãã¢ãªã³ã°ãæ¿èªããVM å ã§openclaw plugins enable google-meetãšopenclaw plugins enable browserãå®è¡æžã¿ã§ããããšã確èªããŠãã ããããŸãã Gateway ãã¹ãã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: VM å ã«blackhole-2chã ã€ã³ã¹ããŒã«ããVM ãåèµ·åããŠãã ããã- Chrome ã¯éããåå ã§ããªã: VM å
ã®ãã©ãŠã¶ãŒãããã¡ã€ã«ã«ãµã€ã³ã€ã³ãããã
ã²ã¹ãåå çšã«
chrome.guestNameãèšå®ãããŸãŸã«ããŠãã ãããã²ã¹ãã®èªååå ã¯ã ããŒãã®ãã©ãŠã¶ãŒãããã·çµç±ã§ OpenClaw ã®ãã©ãŠã¶ãŒèªååã䜿çšããŸããããŒãã® ãã©ãŠã¶ãŒèšå®ãç®çã®ãããã¡ã€ã«ãæããŠããããšã確èªããŠãã ãããããšãã°browser.defaultProfile: "user"ãŸãã¯ååä»ãã®æ¢åã»ãã·ã§ã³ãããã¡ã€ã«ã§ãã - Meet ã¿ãã®éè€:
chrome.reuseExistingTab: trueãæå¹ã®ãŸãŸã«ããŠãã ãããOpenClaw 㯠æ°ããã¿ããéãåã«åã Meet URL ã®æ¢åã¿ããã¢ã¯ãã£ãåãããã©ãŠã¶ãŒã§ã®äŒè°äœæã§ã¯ã å¥ã®ã¿ããéãåã«é²è¡äžã®https://meet.google.com/newãŸã㯠Google ã¢ã«ãŠã³ãã® ããã³ããã¿ããåå©çšããŸãã - é³å£°ããªã: Meet å ã§ããã€ã¯/ã¹ããŒã«ãŒã OpenClaw ã䜿çšããä»®æ³é³å£°ããã€ã¹çµè·¯ã« ã«ãŒãã£ã³ã°ããŠãã ãããã¯ãªãŒã³ãªåæ¹åé³å£°ã«ã¯ãå¥ã ã®ä»®æ³ããã€ã¹ãŸã㯠Loopback ã¹ã¿ã€ã«ã®ã«ãŒãã£ã³ã°ã䜿çšããŠãã ããã
ã€ã³ã¹ããŒã«ã¡ã¢
Chrome ã®ããŒã¯ããã¯æ¢å®å€ã¯ã2 ã€ã®å€éšããŒã«ã䜿çšããŸã:
sox: ã³ãã³ãã©ã€ã³é³å£°ãŠãŒãã£ãªãã£ãPlugin ã¯ãæ¢å®ã® 24 kHz PCM16 é³å£°ããªããžçšã« æç€ºç㪠CoreAudio ããã€ã¹ã³ãã³ãã䜿çšããŸããblackhole-2ch: macOS ä»®æ³é³å£°ãã©ã€ããŒãChrome/Meet ãçµç±ããŠã«ãŒãã£ã³ã°ã§ããBlackHole 2ché³å£°ããã€ã¹ãäœæããŸãã
OpenClaw ã¯ã©ã¡ãã®ããã±ãŒãžããã³ãã«ãŸãã¯åé
åžããŸãããããã¥ã¡ã³ãã§ã¯ããŠãŒã¶ãŒã«
Homebrew çµç±ã§ãã¹ãäŸåé¢ä¿ãšããŠã€ã³ã¹ããŒã«ããããæ¡å
ããŠããŸããSoX ã®ã©ã€ã»ã³ã¹ã¯
LGPL-2.0-only AND GPL-2.0-onlyãBlackHole 㯠GPL-3.0 ã§ããBlackHole ã OpenClaw ãš
äžç·ã«ãã³ãã«ããã€ã³ã¹ããŒã©ãŒãŸãã¯ã¢ãã©ã€ã¢ã³ã¹ãæ§ç¯ããå Žåã¯ãBlackHole ã®
äžæµã©ã€ã»ã³ã¹æ¡ä»¶ã確èªããããExistential Audio ããå¥éã©ã€ã»ã³ã¹ãååŸããŠãã ããã
ãã©ã³ã¹ããŒã
Chrome
Chrome ãã©ã³ã¹ããŒãã¯ãOpenClaw ãã©ãŠã¶ãŒå¶åŸ¡ãéã㊠Meet URL ãéãã
ãµã€ã³ã€ã³æžã¿ã® OpenClaw ãã©ãŠã¶ãŒãããã¡ã€ã«ãšããŠåå ããŸããmacOS ã§ã¯ãPlugin ã¯
èµ·ååã« BlackHole 2ch ã確èªããŸããèšå®ãããŠããå ŽåãChrome ãéãåã«é³å£°ããªããžã®
ãã«ã¹ã³ãã³ããšèµ·åã³ãã³ããå®è¡ããŸããChrome/é³å£°ã Gateway ãã¹ãäžã«ããå Žåã¯
chrome ã䜿çšããChrome/é³å£°ã Parallels macOS VM ãªã©ã®ãã¢ãªã³ã°æžã¿ããŒãäžã«ããå Žåã¯
chrome-node ã䜿çšããŸããããŒã«ã« Chrome ã§ã¯ browser.defaultProfile ã§ãããã¡ã€ã«ã
éžæããŸããchrome.browserProfile 㯠chrome-node ãã¹ãã«æž¡ãããŸãã
openclaw googlemeet join https://meet.google.com/abc-defg-hij --transport chromeopenclaw googlemeet join https://meet.google.com/abc-defg-hij --transport chrome-nodeChrome ã®ãã€ã¯ãšã¹ããŒã«ãŒé³å£°ããããŒã«ã«ã® OpenClaw é³å£°ããªããžã«ã«ãŒãã£ã³ã°ããŠãã ããã
BlackHole 2ch ãã€ã³ã¹ããŒã«ãããŠããªãå Žåãé³å£°çµè·¯ãªãã§é»ã£ãŠåå ããã®ã§ã¯ãªãã
ã»ããã¢ãããšã©ãŒã§åå ã¯å€±æããŸãã
Twilio
Twilio ãã©ã³ã¹ããŒãã¯ãVoice Call Plugin ã«å§ä»»ããã峿 Œãªãã€ã€ã«ãã©ã³ã§ãã Meet ããŒãžããé»è©±çªå·ãè§£æããŸããã
Chrome ã§ã®åå ãå©çšã§ããªãå ŽåããŸãã¯é»è©±ãã€ã€ã«ã€ã³ã®ãã©ãŒã«ããã¯ãå¿ èŠãªå Žå㫠䜿çšããŠãã ãããGoogle Meet ã¯ããã®äŒè°ã®é»è©±ãã€ã€ã«ã€ã³çªå·ãš PIN ãå ¬éããŠããå¿ èŠããããŸãã OpenClaw 㯠Meet ããŒãžããããããæ€åºããŸããã
Voice Call Plugin 㯠Chrome ããŒãã§ã¯ãªã Gateway ãã¹ãã§æå¹ã«ããŠãã ãã:
{ 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 OpenClaw agent. Be brief.", toolPolicy: "safe-read-only", providers: { google: { silenceDurationMs: 500, startSensitivity: "high", }, }, }, }, }, google: { enabled: true, }, }, },}Twilio èªèšŒæ
å ±ã¯ç°å¢ãŸãã¯èšå®ãéããŠæäŸããŸããç°å¢ã䜿ããšãã·ãŒã¯ã¬ããã
openclaw.json ã®å€ã«çœ®ããŸã:
export TWILIO_ACCOUNT_SID=AC...export TWILIO_AUTH_TOKEN=...export TWILIO_FROM_NUMBER=+15550001234export GEMINI_API_KEY=...ãªã¢ã«ã¿ã€ã é³å£°ãããã€ããŒãããã§ããå Žåã¯ã代ããã« OpenAI ãããã€ã㌠Plugin ãš
OPENAI_API_KEY ã§ realtime.provider: "openai" ã䜿çšããŠãã ããã
voice-call ãæå¹åããåŸãGateway ãåèµ·åãŸãã¯åèªã¿èŸŒã¿ããŠãã ãããPlugin èšå®ã®å€æŽã¯ã
åèªã¿èŸŒã¿ããããŸã§ããã§ã«å®è¡äžã® Gateway ããã»ã¹ã«ã¯åæ ãããŸããã
次ã«ç¢ºèªããŸã:
openclaw config validateopenclaw plugins list | grep -E 'google-meet|voice-call'openclaw googlemeet setupTwilio å§ä»»ãé
ç·ãããŠããå Žåãgooglemeet setup ã«ã¯æåãã
twilio-voice-call-pluginãtwilio-voice-call-credentialsãããã³
twilio-voice-call-webhook ãã§ãã¯ãå«ãŸããŸãã
openclaw googlemeet join https://meet.google.com/abc-defg-hij \ --transport twilio \ --dial-in-number +15551234567 \ --pin 123456äŒè°ã§ã«ã¹ã¿ã ã·ãŒã±ã³ã¹ãå¿
èŠãªå Žå㯠--dtmf-sequence ã䜿çšããŸã:
openclaw googlemeet join https://meet.google.com/abc-defg-hij \ --transport twilio \ --dial-in-number +15551234567 \ --dtmf-sequence ww123456#OAuth ãšããªãã©ã€ã
googlemeet create ã¯ãã©ãŠã¶ãŒèªååã«ãã©ãŒã«ããã¯ã§ãããããMeet ãªã³ã¯ã®äœæã«
OAuth ã¯ä»»æã§ããå
¬åŒ API ã«ããäœæãã¹ããŒã¹è§£æ±ºããŸã㯠Meet Media API ã®
ããªãã©ã€ããã§ãã¯ãå¿
èŠãªå Žåã« OAuth ãèšå®ããŠãã ããã
Google Meet API ã¢ã¯ã»ã¹ã¯ãŠãŒã¶ãŒ OAuth ã䜿çšããŸããGoogle Cloud OAuth ã¯ã©ã€ã¢ã³ããäœæãã
å¿
èŠãªã¹ã³ãŒãããªã¯ãšã¹ãããGoogle ã¢ã«ãŠã³ããèªå¯ããŠãããåŸãããæŽæ°ããŒã¯ã³ã
Google Meet Plugin èšå®ã«ä¿åããããOPENCLAW_GOOGLE_MEET_* ç°å¢å€æ°ãæäŸããŸãã
OAuth 㯠Chrome åå çµè·¯ã眮ãæããŸããããã©ãŠã¶ãŒåå ã䜿çšããå ŽåãChrome ããã³ Chrome-node ãã©ã³ã¹ããŒãã¯ããµã€ã³ã€ã³æžã¿ã® Chrome ãããã¡ã€ã«ãBlackHole/SoXãããã³ æ¥ç¶æžã¿ããŒããéããŠåŒãç¶ãåå ããŸããOAuth ã¯å ¬åŒ Google Meet API çµè·¯å°çšã§ã: äŒè°ã¹ããŒã¹ã®äœæãã¹ããŒã¹ã®è§£æ±ºãMeet Media API ããªãã©ã€ããã§ãã¯ã®å®è¡ã§ãã
Google èªèšŒæ å ±ãäœæãã
Google Cloud Console ã§:
-
Google Cloud ãããžã§ã¯ããäœæãŸãã¯éžæããŸãã
-
ãã®ãããžã§ã¯ãã§ Google Meet REST API ãæå¹ã«ããŸãã
-
OAuth åæç»é¢ãèšå®ããŸãã
- Internal 㯠Google Workspace çµç¹ã§ã¯æãç°¡åã§ãã
- External ã¯å人/ãã¹ãã»ããã¢ããã§æ©èœããŸããã¢ããªã Testing ã®éã¯ã ã¢ããªãèªå¯ããå Google ã¢ã«ãŠã³ãããã¹ããŠãŒã¶ãŒãšããŠè¿œå ããŠãã ããã
-
OpenClaw ããªã¯ãšã¹ãããã¹ã³ãŒãã远å ããŸã:
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 ã¯ã©ã€ã¢ã³ã ID ãäœæããŸãã
-
ã¢ããªã±ãŒã·ã§ã³ã®çš®é¡: Web applicationã
-
æ¿èªæžã¿ãªãã€ã¬ã¯ã URI:
text http://localhost:8085/oauth2callback
-
-
ã¯ã©ã€ã¢ã³ã ID ãšã¯ã©ã€ã¢ã³ãã·ãŒã¯ã¬ãããã³ããŒããŸãã
meetings.space.created 㯠Google Meet spaces.create ã«å¿
èŠã§ãã
meetings.space.readonly ã«ãããOpenClaw 㯠Meet URL/ã³ãŒããã¹ããŒã¹ã«è§£æ±ºã§ããŸãã
meetings.space.settings ã«ãããOpenClaw 㯠API ã«ãŒã äœæäžã« accessType ãªã©ã®
SpaceConfig èšå®ãæž¡ããŸãã
meetings.conference.media.readonly 㯠Meet Media API ããªãã©ã€ãããã³ã¡ãã£ã¢äœæ¥çšã§ãã
å®éã® Media API 䜿çšã«ã¯ãGoogle ã Developer Preview ãžã®ç»é²ãæ±ããå ŽåããããŸãã
ãã©ãŠã¶ãŒããŒã¹ã® Chrome åå ã ããå¿
èŠãªå Žåã¯ãOAuth ãå®å
šã«çç¥ããŠãã ããã
æŽæ°ããŒã¯ã³ãçºè¡ãã
oauth.clientId ãšãå¿
èŠã«å¿ã㊠oauth.clientSecret ãèšå®ããããç°å¢å€æ°ãšããŠæž¡ããŠããã
次ãå®è¡ããŸã:
openclaw googlemeet auth login --jsonãã®ã³ãã³ãã¯ãæŽæ°ããŒã¯ã³ãå«ã oauth èšå®ãããã¯ãåºåããŸããPKCEã
http://localhost:8085/oauth2callback ã® localhost ã³ãŒã«ããã¯ãããã³ --manual ã«ãã
æåã³ããŒ/貌ãä»ããããŒã䜿çšããŸãã
äŸ:
OPENCLAW_GOOGLE_MEET_CLIENT_ID="your-client-id" \OPENCLAW_GOOGLE_MEET_CLIENT_SECRET="your-client-secret" \openclaw googlemeet auth login --jsonãã©ãŠã¶ãŒãããŒã«ã«ã³ãŒã«ããã¯ã«å°éã§ããªãå Žåã¯ãæåã¢ãŒãã䜿çšããŸã:
OPENCLAW_GOOGLE_MEET_CLIENT_ID="your-client-id" \OPENCLAW_GOOGLE_MEET_CLIENT_SECRET="your-client-secret" \openclaw googlemeet auth login --json --manualJSON åºåã«ã¯æ¬¡ãå«ãŸããŸã:
{ "oauth": { "clientId": "your-client-id", "clientSecret": "your-client-secret", "refreshToken": "refresh-token", "accessToken": "access-token", "expiresAt": 1770000000000 }, "scope": "..."}oauth ãªããžã§ã¯ãã Google Meet Plugin èšå®ã®äžã«ä¿åããŸã:
{ plugins: { entries: { "google-meet": { enabled: true, config: { oauth: { clientId: "your-client-id", clientSecret: "your-client-secret", refreshToken: "refresh-token", }, }, }, }, },}æŽæ°ããŒã¯ã³ãèšå®å ã«çœ®ããããªãå Žåã¯ãç°å¢å€æ°ãåªå ããŠãã ãããèšå®å€ãšç°å¢å€ã®äž¡æ¹ã ååšããå ŽåãPlugin ã¯ãŸãèšå®ã解決ãããã®åŸã«ç°å¢ãã©ãŒã«ããã¯ã䜿çšããŸãã
OAuth åæã«ã¯ãMeet ã¹ããŒã¹äœæãMeet ã¹ããŒã¹èªã¿åãã¢ã¯ã»ã¹ãããã³ Meet äŒè°ã¡ãã£ã¢
èªã¿åãã¢ã¯ã»ã¹ãå«ãŸããŸããäŒè°äœæãµããŒããååšããåã«èªèšŒããå Žåã¯ã
openclaw googlemeet auth login --json ãåå®è¡ããŠãæŽæ°ããŒã¯ã³ã«
meetings.space.created ã¹ã³ãŒããæãããŠãã ããã
doctor ã§ OAuth ã確èªãã
é«éã§ã·ãŒã¯ã¬ãããå«ãŸãªããã«ã¹ãã§ãã¯ãå¿ èŠãªå Žåã¯ãOAuth doctor ãå®è¡ããŸã:
openclaw googlemeet doctor --oauth --jsonãã㯠Chrome ã©ã³ã¿ã€ã ãèªã¿èŸŒãŸããæ¥ç¶æžã¿ã® Chrome ããŒããå¿
èŠãšããŸããã
OAuth èšå®ãååšããæŽæ°ããŒã¯ã³ãã¢ã¯ã»ã¹ããŒã¯ã³ãçºè¡ã§ããããšã確èªããŸããJSON ã¬ããŒãã«ã¯
okãconfiguredãtokenSourceãexpiresAtããã§ãã¯ã¡ãã»ãŒãžãªã©ã®ã¹ããŒã¿ã¹ãã£ãŒã«ãã®ã¿ã
å«ãŸããŸããã¢ã¯ã»ã¹ããŒã¯ã³ãæŽæ°ããŒã¯ã³ãã¯ã©ã€ã¢ã³ãã·ãŒã¯ã¬ããã¯åºåããŸããã
äžè¬çãªçµæ:
| ãã§ã㯠| æå³ |
|---|---|
oauth-config |
oauth.clientId ã«å ã㊠oauth.refreshTokenããŸãã¯ãã£ãã·ã¥ãããã¢ã¯ã»ã¹ããŒã¯ã³ãååšããŸãã |
oauth-token |
ãã£ãã·ã¥ãããã¢ã¯ã»ã¹ããŒã¯ã³ããŸã æå¹ã§ãããããªãã¬ãã·ã¥ããŒã¯ã³ãæ°ããã¢ã¯ã»ã¹ããŒã¯ã³ãçºè¡ããŸããã |
meet-spaces-get |
ä»»æã® --meeting ãã§ãã¯ãæ¢åã® Meet ã¹ããŒã¹ã解決ããŸããã |
meet-spaces-create |
ä»»æã® --create-space ãã§ãã¯ãæ°ãã Meet ã¹ããŒã¹ãäœæããŸããã |
Google Meet API ã®æå¹åãš spaces.create ã¹ã³ãŒãã蚌æããã«ã¯ãå¯äœçšã䌎ãäœæãã§ãã¯ãå®è¡ããŸãã
openclaw googlemeet doctor --oauth --create-space --jsonopenclaw googlemeet create --no-join --json--create-space ã¯äœ¿ãæšãŠã® Meet URL ãäœæããŸããGoogle Cloud ãããžã§ã¯ãã§ Meet API ãæå¹ã«ãªã£ãŠãããèªå¯æžã¿ã¢ã«ãŠã³ãã« meetings.space.created ã¹ã³ãŒããããããšã確èªããå¿
èŠãããå Žåã«äœ¿çšããŸãã
æ¢åã®ããŒãã£ã³ã°ã¹ããŒã¹ãžã®èªã¿åãã¢ã¯ã»ã¹ã蚌æããã«ã¯:
openclaw googlemeet doctor --oauth --meeting https://meet.google.com/abc-defg-hij --jsonopenclaw googlemeet resolve-space --meeting https://meet.google.com/abc-defg-hijdoctor --oauth --meeting ãš resolve-space ã¯ãèªå¯æžã¿ Google ã¢ã«ãŠã³ããã¢ã¯ã»ã¹ã§ããæ¢åã¹ããŒã¹ãžã®èªã¿åãã¢ã¯ã»ã¹ã蚌æããŸãããããã®ãã§ãã¯ã§ 403 ãè¿ãå Žåãé垞㯠Google Meet REST API ãç¡å¹ã§ãããåææžã¿ã®ãªãã¬ãã·ã¥ããŒã¯ã³ã«å¿
èŠãªã¹ã³ãŒãããªãããŸã㯠Google ã¢ã«ãŠã³ãããã® Meet ã¹ããŒã¹ã«ã¢ã¯ã»ã¹ã§ããªãããšãæå³ããŸãããªãã¬ãã·ã¥ããŒã¯ã³ãšã©ãŒã¯ãopenclaw googlemeet auth login --json ãåå®è¡ããæ°ãã oauth ãããã¯ãä¿åããå¿
èŠãããããšãæå³ããŸãã
ãã©ãŠã¶ãã©ãŒã«ããã¯ã«ã¯ OAuth èªèšŒæ å ±ã¯äžèŠã§ãããã®ã¢ãŒãã§ã¯ãGoogle èªèšŒã¯ OpenClaw èšå®ã§ã¯ãªããéžæããããŒãäžã§ãµã€ã³ã€ã³æžã¿ã® Chrome ãããã¡ã€ã«ããååŸãããŸãã
ãããã®ç°å¢å€æ°ã¯ãã©ãŒã«ããã¯ãšããŠåãå ¥ããããŸãã
OPENCLAW_GOOGLE_MEET_CLIENT_IDorGOOGLE_MEET_CLIENT_IDOPENCLAW_GOOGLE_MEET_CLIENT_SECRETorGOOGLE_MEET_CLIENT_SECRETOPENCLAW_GOOGLE_MEET_REFRESH_TOKENorGOOGLE_MEET_REFRESH_TOKENOPENCLAW_GOOGLE_MEET_ACCESS_TOKENorGOOGLE_MEET_ACCESS_TOKENOPENCLAW_GOOGLE_MEET_ACCESS_TOKEN_EXPIRES_ATorGOOGLE_MEET_ACCESS_TOKEN_EXPIRES_ATOPENCLAW_GOOGLE_MEET_DEFAULT_MEETINGorGOOGLE_MEET_DEFAULT_MEETINGOPENCLAW_GOOGLE_MEET_PREVIEW_ACKorGOOGLE_MEET_PREVIEW_ACK
Meet URLãã³ãŒãããŸã㯠spaces/{id} ã spaces.get çµç±ã§è§£æ±ºããŸãã
openclaw googlemeet resolve-space --meeting https://meet.google.com/abc-defg-hijã¡ãã£ã¢åŠçã®åã«äºåãã§ãã¯ãå®è¡ããŸãã
openclaw googlemeet preflight --meeting https://meet.google.com/abc-defg-hijMeet ãäŒè°ã¬ã³ãŒããäœæããåŸãããŒãã£ã³ã°ææç©ãšåºåžç¶æ³ãäžèŠ§è¡šç€ºããŸãã
openclaw googlemeet artifacts --meeting https://meet.google.com/abc-defg-hijopenclaw googlemeet attendance --meeting https://meet.google.com/abc-defg-hijopenclaw googlemeet export --meeting https://meet.google.com/abc-defg-hij --output ./meet-export--meeting ãæå®ãããšãartifacts ãš attendance ã¯ããã©ã«ãã§ææ°ã®äŒè°ã¬ã³ãŒãã䜿çšããŸãããã®ããŒãã£ã³ã°ã«ã€ããŠä¿æãããŠãããã¹ãŠã®ã¬ã³ãŒããå¿
èŠãªå Žåã¯ã--all-conference-records ãæž¡ããŸãã
Calendar ã«ãã¯ã¢ããã¯ãMeet ææç©ãèªã¿åãåã« Google Calendar ããããŒãã£ã³ã° URL ã解決ã§ããŸãã
openclaw googlemeet latest --todayopenclaw googlemeet calendar-events --today --jsonopenclaw googlemeet artifacts --event "Weekly sync"openclaw googlemeet attendance --today --format csv --output attendance.csv--today ã¯ãGoogle Meet ãªã³ã¯ãæã€ Calendar ã€ãã³ãã仿¥ã® primary ã«ã¬ã³ããŒããæ€çŽ¢ããŸããäžèŽããã€ãã³ãããã¹ããæ€çŽ¢ããã«ã¯ --event <query> ã䜿çšããéãã©ã€ããªã«ã¬ã³ããŒã«ã¯ --calendar <id> ã䜿çšããŸããCalendar ã«ãã¯ã¢ããã«ã¯ãCalendar ã€ãã³ãã®èªã¿åãå°çšã¹ã³ãŒããå«ãæ°ãã OAuth ãã°ã€ã³ãå¿
èŠã§ããcalendar-events ã¯ãäžèŽãã Meet ã€ãã³ãããã¬ãã¥ãŒããlatestãartifactsãattendanceããŸã㯠export ãéžæããã€ãã³ãã瀺ããŸãã
äŒè°ã¬ã³ãŒã ID ããã§ã«åãã£ãŠããå Žåã¯ãçŽæ¥æå®ããŸãã
openclaw googlemeet latest --meeting https://meet.google.com/abc-defg-hijopenclaw googlemeet artifacts --conference-record conferenceRecords/abc123 --jsonopenclaw googlemeet attendance --conference-record conferenceRecords/abc123 --jsoné話åŸã«ã«ãŒã ãéãããå Žåã¯ãAPI ã§äœæãããã¹ããŒã¹ã®ã¢ã¯ãã£ããªäŒè°ãçµäºããŸãã
openclaw googlemeet end-active-conference https://meet.google.com/abc-defg-hijãã㯠Google Meet spaces.endActiveConference ãåŒã³åºããèªå¯æžã¿ã¢ã«ãŠã³ãã管çã§ããã¹ããŒã¹ã«å¯Ÿã㊠meetings.space.created ã¹ã³ãŒãä»ãã® OAuth ãå¿
èŠãšããŸããOpenClaw 㯠Meet URLãããŒãã£ã³ã°ã³ãŒãããŸã㯠spaces/{id} å
¥åãåãä»ããã¢ã¯ãã£ããªäŒè°ãçµäºããåã« API ã¹ããŒã¹ãªãœãŒã¹ãžè§£æ±ºããŸãããã㯠googlemeet leave ãšã¯å¥ã§ããleave 㯠OpenClaw ã®ããŒã«ã«/ã»ãã·ã§ã³åå ã忢ããend-active-conference 㯠Google Meet ã«å¯ŸããŠãã®ã¹ããŒã¹ã®ã¢ã¯ãã£ããªäŒè°ã®çµäºãäŸé ŒããŸãã
èªã¿ãããã¬ããŒããæžãåºããŸãã
openclaw googlemeet artifacts --conference-record conferenceRecords/abc123 \ --format markdown --output meet-artifacts.mdopenclaw googlemeet attendance --conference-record conferenceRecords/abc123 \ --format markdown --output meet-attendance.mdopenclaw googlemeet attendance --conference-record conferenceRecords/abc123 \ --format csv --output meet-attendance.csvopenclaw googlemeet export --conference-record conferenceRecords/abc123 \ --include-doc-bodies --zip --output meet-exportopenclaw googlemeet export --conference-record conferenceRecords/abc123 \ --include-doc-bodies --dry-runartifacts ã¯ãGoogle ããã®ããŒãã£ã³ã°ã«ã€ããŠå
¬éããŠããå ŽåãäŒè°ã¬ã³ãŒãã¡ã¿ããŒã¿ã«å ããŠãåå è
ãé²ç»ãæåèµ·ãããæ§é åãããæåèµ·ãããšã³ããªãã¹ããŒãããŒãã®ãªãœãŒã¹ã¡ã¿ããŒã¿ãè¿ããŸããå€§èŠæš¡ãªããŒãã£ã³ã°ã§ãšã³ããªæ€çŽ¢ãã¹ãããããã«ã¯ --no-transcript-entries ã䜿çšããŸããattendance ã¯åå è
ãåå è
ã»ãã·ã§ã³è¡ã«å±éããæå/æåŸã«ç¢ºèªãããæå»ãåèšã»ãã·ã§ã³æéãé
å»/æ©éãã©ã°ããµã€ã³ã€ã³æžã¿ãŠãŒã¶ãŒãŸãã¯è¡šç€ºåã§ããŒãžãããéè€åå è
ãªãœãŒã¹ãå«ããŸããæªå å·¥ã®åå è
ãªãœãŒã¹ãå¥ã
ã«ä¿æããã«ã¯ --no-merge-duplicates ãæž¡ããé
廿€åºã調æŽããã«ã¯ --late-after-minutesãæ©éæ€åºã調æŽããã«ã¯ --early-before-minutes ãæž¡ããŸãã
export ã¯ãsummary.mdãattendance.csvãtranscript.mdãartifacts.jsonãattendance.jsonãmanifest.json ãå«ããã©ã«ããŒãæžãåºããŸããmanifest.json ã¯ãéžæãããå
¥åããšã¯ã¹ããŒããªãã·ã§ã³ãäŒè°ã¬ã³ãŒããåºåãã¡ã€ã«ãä»¶æ°ãããŒã¯ã³ãœãŒã¹ã䜿çšãããå Žåã® Calendar ã€ãã³ããããã³éšåçãªååŸèŠåãèšé²ããŸãããã©ã«ããŒã®æšªã«ããŒã¿ãã«ã¢ãŒã«ã€ããæžãåºãã«ã¯ --zip ãæž¡ããŸãããªã³ã¯ãããæåèµ·ãããšã¹ããŒãããŒãã® Google Docs ããã¹ãã Google Drive files.export çµç±ã§ãšã¯ã¹ããŒãããã«ã¯ã--include-doc-bodies ãæž¡ããŸããããã«ã¯ Drive Meet èªã¿åãå°çšã¹ã³ãŒããå«ãæ°ãã OAuth ãã°ã€ã³ãå¿
èŠã§ãã--include-doc-bodies ããªãå Žåããšã¯ã¹ããŒãã«ã¯ Meet ã¡ã¿ããŒã¿ãšæ§é åãããæåèµ·ãããšã³ããªã®ã¿ãå«ãŸããŸããã¹ããŒãããŒãäžèЧãæåèµ·ãããšã³ããªãDrive ããã¥ã¡ã³ãæ¬æãšã©ãŒãªã©ãGoogle ãéšåçãªææç©ãšã©ãŒãè¿ããå Žåããšã¯ã¹ããŒãå
šäœã倱æããã代ããã«ããµããªãŒãšãããã§ã¹ãã«èŠåãä¿æãããŸãããã©ã«ããŒã ZIP ãäœæããã«åãææç©/åºåžããŒã¿ãååŸãããããã§ã¹ã JSON ãåºåããã«ã¯ --dry-run ã䜿çšããŸããããã¯ãå€§èŠæš¡ãªãšã¯ã¹ããŒããæžãåºãåãããšãŒãžã§ã³ããä»¶æ°ãéžæãããã¬ã³ãŒããèŠåã ããå¿
èŠãšããå Žåã«äŸ¿å©ã§ãã
ãšãŒãžã§ã³ã㯠google_meet ããŒã«çµç±ã§ãåããã³ãã«ãäœæã§ããŸãã
{ "action": "export", "conferenceRecord": "conferenceRecords/abc123", "includeDocumentBodies": true, "outputDir": "meet-export", "zip": true}ãšã¯ã¹ããŒããããã§ã¹ãã®ã¿ãè¿ãããã¡ã€ã«æžã蟌ã¿ãã¹ãããããã«ã¯ "dryRun": true ãèšå®ããŸãã
ãšãŒãžã§ã³ãã¯ãæç€ºçãªã¢ã¯ã»ã¹ããªã·ãŒãæã€ API ããŒã¹ã®ã«ãŒã ãäœæã§ããŸãã
{ "action": "create", "transport": "chrome-node", "mode": "agent", "accessType": "OPEN"}ãŸããæ¢ç¥ã®ã«ãŒã ã®ã¢ã¯ãã£ããªäŒè°ãçµäºããããšãã§ããŸãã
{ "action": "end_active_conference", "meeting": "https://meet.google.com/abc-defg-hij"}ãªãã¹ã³åªå
ã®æ€èšŒã§ã¯ããšãŒãžã§ã³ãã¯ããŒãã£ã³ã°ãæçšã§ãããšäž»åŒµããåã« test_listen ã䜿çšããå¿
èŠããããŸãã
{ "action": "test_listen", "url": "https://meet.google.com/abc-defg-hij", "transport": "chrome-node", "timeoutMs": 30000}å®éã«ä¿æãããããŒãã£ã³ã°ã«å¯ŸããŠãã¬ãŒãä»ãã©ã€ãã¹ã¢ãŒã¯ãå®è¡ããŸãã
OPENCLAW_LIVE_TEST=1 \OPENCLAW_GOOGLE_MEET_LIVE_MEETING=https://meet.google.com/abc-defg-hij \pnpm test:live -- extensions/google-meet/google-meet.live.test.ts誰ãã話ããMeet åå¹ãå©çšå¯èœãªããŒãã£ã³ã°ã«å¯ŸããŠãã©ã€ãã®ãªãã¹ã³åªå ãã©ãŠã¶ãããŒããå®è¡ããŸãã
openclaw googlemeet setup --transport chrome-node --mode transcribeopenclaw googlemeet test-listen https://meet.google.com/abc-defg-hij --transport chrome-node --timeout-ms 30000ã©ã€ãã¹ã¢ãŒã¯ç°å¢:
OPENCLAW_LIVE_TEST=1ã¯ã¬ãŒãä»ãã©ã€ããã¹ããæå¹ã«ããŸããOPENCLAW_GOOGLE_MEET_LIVE_MEETINGã¯ãä¿æããã Meet URLãã³ãŒãããŸãã¯spaces/{id}ãæããŸããOPENCLAW_GOOGLE_MEET_CLIENT_IDorGOOGLE_MEET_CLIENT_ID㯠OAuth ã¯ã©ã€ã¢ã³ã ID ãæäŸããŸããOPENCLAW_GOOGLE_MEET_REFRESH_TOKENorGOOGLE_MEET_REFRESH_TOKENã¯ãªãã¬ãã·ã¥ããŒã¯ã³ãæäŸããŸãã- ä»»æ:
OPENCLAW_GOOGLE_MEET_CLIENT_SECRETãOPENCLAW_GOOGLE_MEET_ACCESS_TOKENãããã³OPENCLAW_GOOGLE_MEET_ACCESS_TOKEN_EXPIRES_ATã¯ãOPENCLAW_ãã¬ãã£ãã¯ã¹ãªãã®åããã©ãŒã«ããã¯åã䜿çšããŸãã
åºæ¬ã®ææç©/åºåžã©ã€ãã¹ã¢ãŒã¯ã«ã¯ 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 ãå¿
èŠã§ããDrive ããã¥ã¡ã³ãæ¬æã®ãšã¯ã¹ããŒãã«ã¯ https://www.googleapis.com/auth/drive.meet.readonly ãå¿
èŠã§ãã
æ°ãã Meet ã¹ããŒã¹ãäœæããŸãã
openclaw googlemeet createãã®ã³ãã³ãã¯æ°ãã meeting uriããœãŒã¹ãåå ã»ãã·ã§ã³ãåºåããŸããOAuth èªèšŒæ
å ±ãããå Žåã¯å
¬åŒ Google Meet API ã䜿çšããŸããOAuth èªèšŒæ
å ±ããªãå Žåã¯ãåºå®ããã Chrome ããŒãã®ãµã€ã³ã€ã³æžã¿ãã©ãŠã¶ãããã¡ã€ã«ããã©ãŒã«ããã¯ãšããŠäœ¿çšããŸãããšãŒãžã§ã³ã㯠action: "create" ãæå®ãã google_meet ããŒã«ã䜿çšããŠãäœæãšåå ã 1 ã¹ãããã§å®è¡ã§ããŸããURL ã®ã¿ãäœæããã«ã¯ã"join": false ãæž¡ããŸãã
ãã©ãŠã¶ãã©ãŒã«ããã¯ããã® JSON åºåäŸ:
{ "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" } }}ãã©ãŠã¶ãã©ãŒã«ããã¯ã URL ãäœæããåã« Google ãã°ã€ã³ãŸã㯠Meet æš©éã®ãããã«ãŒã«ééããå ŽåãGateway ã¡ãœããã¯å€±æããã¬ã¹ãã³ã¹ãè¿ããgoogle_meet ããŒã«ã¯ãã¬ãŒã³ãªæååã§ã¯ãªãæ§é åããã詳现ãè¿ããŸãã
{ "source": "browser", "error": "google-login-required: Sign in to Google in the OpenClaw browser profile, then retry meeting creation.", "manualActionRequired": true, "manualActionReason": "google-login-required", "manualActionMessage": "Sign in to Google in the OpenClaw browser profile, then retry meeting creation.", "browser": { "nodeId": "ba0f4e4bc...", "targetId": "tab-1", "browserUrl": "https://accounts.google.com/signin", "browserTitle": "Sign in - Google Accounts" }}ãšãŒãžã§ã³ãã manualActionRequired: true ãèŠãå ŽåãmanualActionMessage ãšãã©ãŠã¶ã®ããŒã/ã¿ãã³ã³ããã¹ããå ±åãããªãã¬ãŒã¿ãŒããã©ãŠã¶æé ãå®äºãããŸã§æ°ãã Meet ã¿ããéãã®ã忢ããå¿
èŠããããŸãã
API äœæããã® JSON åºåäŸ:
{ "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 ãããã¡ã€ã«ãåŒãç¶ã
å¿
èŠã§ãããããã¡ã€ã«ããã°ã¢ãŠãããŠããå ŽåãOpenClaw 㯠manualActionRequired: true ãŸãã¯
ãã©ãŠã¶ã®ãã©ãŒã«ããã¯ãšã©ãŒãå ±åããå詊è¡ããåã«ãªãã¬ãŒã¿ãŒãž Google ãã°ã€ã³ã®å®äºã
æ±ããŸãã
Cloud ãããžã§ã¯ããOAuth ããªã³ã·ãã«ãäŒè°åå è
ã Meet media APIs åãã® Google
Workspace Developer Preview Program ã«ç»é²ãããŠããããšã確èªããåŸã«ã®ã¿ã
preview.enrollmentAcknowledged: true ãèšå®ããŠãã ããã
èšå®
å
±éã® Chrome agent ãã¹ã«å¿
èŠãªã®ã¯ãPlugin ã®æå¹åãBlackHoleãSoXã
ãªã¢ã«ã¿ã€ã æåèµ·ãããããã€ããŒããŒãèšå®æžã¿ã® OpenClaw TTS ãããã€ããŒã ãã§ãã
OpenAI ãããã©ã«ãã®æåèµ·ãããããã€ããŒã§ããããã©ã«ãã® agent-mode æåèµ·ãã
ãããã€ããŒã倿Žããã«ãbidi ã¢ãŒãã§ Google Gemini Live ã䜿ãã«ã¯ã
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:chrome-nodeã®ä»»æã® node id/name/IPchrome.audioBackend: "blackhole-2ch"chrome.guestName: "OpenClaw Agent": ãã°ã¢ãŠãç¶æ ã® Meet ã²ã¹ãç»é¢ã§äœ¿çšãããååchrome.autoJoin: true:chrome-nodeäžã® OpenClaw ãã©ãŠã¶èªååã«ããã ãã¹ããšãã©ãŒãã®ã²ã¹ãåå ¥åãš Join Now ã¯ãªãã¯chrome.reuseExistingTab: true: éè€ããŠéã代ããã«æ¢åã® Meet ã¿ããã¢ã¯ãã£ãåchrome.waitForInCallMs: 20000: ããŒã¯ããã¯ã®ã€ã³ãããããªã¬ãŒãããåã«ã Meet ã¿ããé話äžãå ±åãããŸã§åŸ æ©chrome.audioFormat: "pcm16-24khz": ã³ãã³ããã¢ã®é³å£°åœ¢åŒããŸã ãã¬ãã©ããŒé³å£°ã åºåããã¬ã¬ã·ãŒ/ã«ã¹ã¿ã ã®ã³ãã³ããã¢ã«ã®ã¿"g711-ulaw-8khz"ã䜿çšããŸããchrome.audioBufferBytes: 4096: çæããã Chrome ã³ãã³ããã¢é³å£°ã³ãã³ãçšã® SoX åŠçãããã¡ããã㯠SoX ã®ããã©ã«ã 8192 ãã€ããããã¡ã®ååã§ã ããžãŒãªãã¹ãã§å¢ããäœå°ãæ®ãã€ã€ãããã©ã«ãã®ãã€ãã¬ã€ãã³ã·ãŒãäœæžããŸãã SoX ã®æå°å€ãäžåãå€ã¯ 17 ãã€ãã«ã¯ã©ã³ããããŸããchrome.audioInputCommand: CoreAudioBlackHole 2chããèªã¿åããchrome.audioFormatã§é³å£°ãæžãåºã SoX ã³ãã³ãchrome.audioOutputCommand:chrome.audioFormatã®é³å£°ãèªã¿åãã CoreAudioBlackHole 2chãžæžã蟌ã SoX ã³ãã³ãchrome.bargeInInputCommand: assistant ã®åçäžã«äººéã®å²ãèŸŒã¿æ€åºã®ããã signed 16-bit little-endian mono PCM ãæžã蟌ãä»»æã®ããŒã«ã«ãã€ã¯ã³ãã³ãã ããã¯çŸåšãGateway ãã¹ãã®chromeã³ãã³ããã¢ããªããžã«é©çšãããŸããchrome.bargeInRmsThreshold: 650:chrome.bargeInInputCommandäžã§äººéã® å²ã蟌ã¿ãšããŠæ±ããã RMS ã¬ãã«chrome.bargeInPeakThreshold: 2500:chrome.bargeInInputCommandäžã§äººéã® å²ã蟌ã¿ãšããŠæ±ãããããŒã¯ã¬ãã«chrome.bargeInCooldownMs: 900: ç¹°ãè¿ãçºçãã人éã®å²ã蟌ã¿ã¯ãªã¢éã®æå°é å»¶mode: "agent": ããã©ã«ãã®ããŒã¯ããã¯ã¢ãŒããåå è ã®çºè©±ã¯èšå®æžã¿ã® ãªã¢ã«ã¿ã€ã æåèµ·ãããããã€ããŒã«ãã£ãŠæåèµ·ãããããäŒè°ããšã®ãµããšãŒãžã§ã³ã ã»ãã·ã§ã³å ã§èšå®æžã¿ã® OpenClaw agent ã«éä¿¡ãããéåžžã® OpenClaw TTS runtime ãéã㊠é³å£°ã§è¿ãããŸããmode: "bidi": ãã©ãŒã«ããã¯ã®çŽæ¥åæ¹åãªã¢ã«ã¿ã€ã ã¢ãã«ã¢ãŒãããªã¢ã«ã¿ã€ã é³å£° ãããã€ããŒãåå è ã®çºè©±ã«çŽæ¥å¿çããããæ·±ã/ããŒã«ã«åºã¥ãåçã®ããã«openclaw_agent_consultãåŒã³åºãå ŽåããããŸããmode: "transcribe": ããŒã¯ããã¯ããªããžãªãã®èгå¯å°çšã¢ãŒããrealtime.provider: "openai": äžèšã®ã¹ã³ãŒãä»ããããã€ããŒãã£ãŒã«ããæªèšå®ã®å Žå㫠䜿çšãããäºæãã©ãŒã«ããã¯ãrealtime.transcriptionProvider: "openai":agentã¢ãŒãã§ãªã¢ã«ã¿ã€ã æåèµ·ãã㫠䜿çšããããããã€ã㌠idãrealtime.voiceProvider:bidiã¢ãŒãã§çŽæ¥ãªã¢ã«ã¿ã€ã é³å£°ã«äœ¿çšããããããã€ã㌠idã agent-mode ã®æåèµ·ããã OpenAI ã®ãŸãŸã«ããªãã Gemini Live ã䜿ãã«ã¯ãããã"google"ã«èšå®ããŸããrealtime.toolPolicy: "safe-read-only"realtime.instructions: çãé³å£°å¿çãããæ·±ãåçã«ã¯openclaw_agent_consultã䜿çšrealtime.introMessage: ãªã¢ã«ã¿ã€ã ããªããžæ¥ç¶æã®çãé³å£°ã¬ãã£ãã¹ç¢ºèªã ç¡é³ã§åå ããã«ã¯""ã«èšå®realtime.agentId:openclaw_agent_consultçšã®ä»»æã® OpenClaw agent idã ããã©ã«ãã¯main
ä»»æã®äžæžã:
{ defaults: { meeting: "https://meet.google.com/abc-defg-hij", }, browser: { defaultProfile: "openclaw", }, chrome: { guestName: "OpenClaw 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: { speakerVoice: "Kore", }, }, },}agent-mode ã®ãªã¹ãã³ã°ãšçºè©±ã®äž¡æ¹ã« ElevenLabs ã䜿ãå Žå:
{ messages: { tts: { provider: "elevenlabs", providers: { elevenlabs: { modelId: "eleven_v3", speakerVoiceId: "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.speakerVoiceId ããååŸãããŸãã
TTS ã¢ãã«ã®äžæžããæå¹ãªå Žåãagent ã®è¿ä¿¡ã§ã¯è¿ä¿¡ããšã®
[[tts:speakerVoiceId=... model=eleven_v3]] ãã£ã¬ã¯ãã£ãã䜿çšã§ããŸããã
äŒè°ã§ã¯èšå®ã決å®çãªããã©ã«ãã§ããåå æããã°ã«ã¯ transcriptionProvider=elevenlabs
ã衚瀺ãããåé³å£°è¿ä¿¡ã§ã¯
provider=elevenlabs model=eleven_v3 speakerVoiceId=<voiceId> ããã°ã«èšé²ãããã¯ãã§ãã
Twilio ã®ã¿ã®èšå®:
{ defaultTransport: "twilio", twilio: { defaultDialInNumber: "+15551234567", defaultPin: "123456", }, voiceCall: { gatewayUrl: "ws://127.0.0.1:18789", },}voiceCall.enabled ã¯ããã©ã«ãã§ true ã§ããTwilio ãã©ã³ã¹ããŒãã§ã¯ãå®éã®
PSTN é話ãDTMFãã€ã³ããæšæ¶ã Voice Call Plugin ã«å§è²ããŸããVoice Call ã¯
ãªã¢ã«ã¿ã€ã ã¡ãã£ã¢ã¹ããªãŒã ãéãåã« DTMF ã·ãŒã±ã³ã¹ãåçãããã®åŸãä¿åããã
ã€ã³ããããã¹ããæåã®ãªã¢ã«ã¿ã€ã æšæ¶ãšããŠäœ¿çšããŸããvoice-call ãæå¹ã§ãªãå Žåã§ãã
Google Meet ã¯ãã€ã€ã«ãã©ã³ãæ€èšŒããŠèšé²ã§ããŸãããTwilio é話ãçºä¿¡ããããšã¯ã§ããŸããã
ããŒã«
Agents 㯠google_meet ããŒã«ã䜿çšã§ããŸãã
{ "action": "join", "url": "https://meet.google.com/abc-defg-hij", "transport": "chrome-node", "mode": "agent"}Chrome ã Gateway ãã¹ãäžã§åäœããå Žå㯠transport: "chrome" ã䜿çšããŸãã
Chrome ã Parallels VM ãªã©ã®ãã¢ãªã³ã°æžã¿ node äžã§åäœããå Žåã¯
transport: "chrome-node" ã䜿çšããŸããã©ã¡ãã®å Žåããã¢ãã«ãããã€ããŒãš
openclaw_agent_consult 㯠Gateway ãã¹ãäžã§å®è¡ããããããã¢ãã«èªèšŒæ
å ±ã¯ããã«
ä¿æãããŸããããã©ã«ãã® mode: "agent" ã§ã¯ããªã¢ã«ã¿ã€ã æåèµ·ãããããã€ããŒã
ãªã¹ãã³ã°ãåŠçããèšå®æžã¿ã® OpenClaw agent ãåçãçæããéåžžã® OpenClaw TTS ã
ããã Meet ã«çºè©±ããŸãããªã¢ã«ã¿ã€ã é³å£°ã¢ãã«ã«çŽæ¥å¿çããããå Žåã¯
mode: "bidi" ã䜿çšããŸããçã® mode: "realtime" 㯠mode: "agent" ã®
ã¬ã¬ã·ãŒäºæãšã€ãªã¢ã¹ãšããŠåŒãç¶ãåãä»ããããŸãããagent ããŒã«ã¹ããŒãã§ã¯
ããæ¡å
ãããŸãããAgent-mode ã®ãã°ã«ã¯ãããªããžèµ·åæã«è§£æ±ºæžã¿ã®æåèµ·ãã
ãããã€ããŒ/ã¢ãã«ãå«ãŸããååæè¿ä¿¡åŸã« TTS ãããã€ããŒãã¢ãã«ãé³å£°ãåºå圢åŒã
ãµã³ãã«ã¬ãŒããå«ãŸããŸãã
ã¢ã¯ãã£ããªã»ãã·ã§ã³ãäžèŠ§è¡šç€ºããããŸãã¯ã»ãã·ã§ã³ ID ã調ã¹ãã«ã¯
action: "status" ã䜿çšããŸãããªã¢ã«ã¿ã€ã agent ã«å³åº§ã«çºè©±ãããã«ã¯ã
sessionId ãš message ãšãšãã« action: "speak" ã䜿çšããŸããã»ãã·ã§ã³ãäœæãŸãã¯åå©çšãã
æ¢ç¥ã®ãã¬ãŒãºãããªã¬ãŒããChrome ãã¹ããå ±åã§ããå Žåã« inCall ãã«ã¹ãè¿ãã«ã¯
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ã¯ãOpenClaw ãã€ã³ãã/ãã¹ããã¬ãŒãºã é³å£°ããªããžãžéä¿¡ããªãã£ãããšãæå³ããŸããproviderConnected/realtimeReady: ãªã¢ã«ã¿ã€ã é³å£°ããªããžã®ç¶æ lastInputAt/lastOutputAt: ããªããžããæåŸã«èŠããããŸãã¯ããªããžãžéä¿¡ãããé³å£°audioOutputRouted/audioOutputDeviceLabel: Meet ã¿ãã®ã¡ãã£ã¢åºåããããªããžã§ 䜿çšããã BlackHole ããã€ã¹ãžã¢ã¯ãã£ãã«ã«ãŒãã£ã³ã°ããããã©ããlastSuppressedInputAt/suppressedInputBytes: assistant ã®åçäžã«ç¡èŠããã loopback å ¥å
{ "action": "speak", "sessionId": "meet_...", "message": "Say exactly: I'm here and listening."}agent ãš bidi ã¢ãŒã
Chrome agent ã¢ãŒãã¯ããèªåã® agent ãäŒè°ã«åå ããŠãããåäœã«æé©åãããŠããŸãã
ãªã¢ã«ã¿ã€ã æåèµ·ãããããã€ããŒãäŒè°é³å£°ãèãåããæçµçãªåå è
ã®æåèµ·ããã¯
èšå®æžã¿ã® OpenClaw agent ã«ã«ãŒãã£ã³ã°ãããåçã¯éåžžã® OpenClaw TTS runtime ãéããŠ
çºè©±ãããŸãããªã¢ã«ã¿ã€ã é³å£°ã¢ãã«ã«çŽæ¥å¿çããããå Žå㯠mode: "bidi" ãèšå®ããŸãã
è¿æ¥ããæçµæåèµ·ããæç㯠consult ã®åã«çµåãããããã1 åã®çºè©±ã¿ãŒã³ãè€æ°ã®
å€ãéšååçãçæããããšã¯ãããŸããããã¥ãŒå
ã® assistant é³å£°ããŸã åçäžã®éã¯
ãªã¢ã«ã¿ã€ã å
¥åãæå¶ãããagent consult ã®åã«ã¯æè¿ã® assistant ãããæåèµ·ãããšã³ãŒã
ç¡èŠããããããBlackHole loopback ã«ãã£ãŠ agent ãèªåèªèº«ã®çºè©±ã«åçããããšã¯ãããŸããã
| ã¢ãŒã | åçãæ±ºå®ãããã® | é³å£°åºåãã¹ | 䜿çšããå Žé¢ |
|---|---|---|---|
agent |
èšå®æžã¿ã® OpenClaw agent | éåžžã® OpenClaw TTS runtime | ãèªåã® agent ãäŒè°ã«åå ããŠãããåäœãå¿ èŠãªå Žå |
bidi |
ãªã¢ã«ã¿ã€ã é³å£°ã¢ãã« | ãªã¢ã«ã¿ã€ã é³å£°ãããã€ããŒã®é³å£°å¿ç | æäœã¬ã€ãã³ã·ãŒã®äŒè©±é³å£°ã«ãŒããå¿ èŠãªå Žå |
bidi ã¢ãŒãã§ã¯ããªã¢ã«ã¿ã€ã ã¢ãã«ãããæ·±ãæšè«ãçŸåšã®æ
å ±ããŸãã¯éåžžã® OpenClaw
ããŒã«ãå¿
èŠãšããå Žåãopenclaw_agent_consult ãåŒã³åºããŸãã
consult ããŒã«ã¯ãæè¿ã®äŒè°ãã©ã³ã¹ã¯ãªããã®ã³ã³ããã¹ãã䜿ã£ãŠéåžžã® OpenClaw ãšãŒãžã§ã³ããããã¯ã°ã©ãŠã³ãã§å®è¡ããç°¡æœãªé³å£°åãåçãè¿ããŸããagent ã¢ãŒãã§ã¯ãOpenClaw ããã®åçã TTS ã©ã³ã¿ã€ã ãžçŽæ¥éä¿¡ããŸããbidi ã¢ãŒãã§ã¯ããªã¢ã«ã¿ã€ã é³å£°ã¢ãã«ã consult çµæãäŒè°å
ã§çºè©±ã§ããŸããVoice Call ãšåãå
±æ consult ä»çµã¿ã䜿çšããŸãã
ããã©ã«ãã§ã¯ãconsult 㯠main ãšãŒãžã§ã³ãã«å¯ŸããŠå®è¡ãããŸããMeet ã¬ãŒã³ãå°çšã® OpenClaw ãšãŒãžã§ã³ãã¯ãŒã¯ã¹ããŒã¹ãã¢ãã«ã®ããã©ã«ããããŒã«ããªã·ãŒãã¡ã¢ãªãã»ãã·ã§ã³å±¥æŽãåç
§ããå¿
èŠãããå Žåã¯ãrealtime.agentId ãèšå®ããŸãã
ãšãŒãžã§ã³ãã¢ãŒãã® consult ã¯ãäŒè°ããšã® agent:<id>:subagent:google-meet:<session> ã»ãã·ã§ã³ããŒã䜿çšããããããã©ããŒã¢ãã質åã¯ãèšå®æžã¿ãšãŒãžã§ã³ãããéåžžã®ãšãŒãžã§ã³ãããªã·ãŒãç¶æ¿ããªããäŒè°ã³ã³ããã¹ããä¿æããŸãã
realtime.toolPolicy 㯠consult å®è¡ãå¶åŸ¡ããŸãã
safe-read-only: consult ããŒã«ãå ¬éããéåžžã®ãšãŒãžã§ã³ããreadãweb_searchãweb_fetchãx_searchãmemory_searchãmemory_getã«å¶éããŸããowner: consult ããŒã«ãå ¬éããéåžžã®ãšãŒãžã§ã³ããéåžžã®ãšãŒãžã§ã³ãããŒã«ããªã·ãŒã䜿çšã§ããããã«ããŸããnone: consult ããŒã«ããªã¢ã«ã¿ã€ã é³å£°ã¢ãã«ã«å ¬éããŸããã
consult ã»ãã·ã§ã³ããŒã¯ Meet ã»ãã·ã§ã³ããšã«ã¹ã³ãŒããããããããã©ããŒã¢ããã® consult åŒã³åºãã¯åãäŒè°äžã«ä»¥åã® consult ã³ã³ããã¹ããåå©çšã§ããŸãã
Chrome ãé話ã«å®å šã«åå ããåŸã«ãé³å£°ã«ããæºåå®äºãã§ãã¯ã匷å¶ããã«ã¯:
openclaw googlemeet speak meet_... "Say exactly: I'm here and listening."åå ããŠçºè©±ããå®å šãªã¹ã¢ãŒã¯ã«ã¯:
openclaw googlemeet test-speech https://meet.google.com/abc-defg-hij \ --transport chrome-node \ --message "Say exactly: I'm here and listening."ã©ã€ããã¹ããã§ãã¯ãªã¹ã
äŒè°ãç¡äººãšãŒãžã§ã³ãã«åŒãæž¡ãåã«ããã®ã·ãŒã±ã³ã¹ã䜿çšããŸãã
openclaw googlemeet setupopenclaw nodes statusopenclaw 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 ãããã©ã«ããã©ã³ã¹ããŒãã§ããããããŒããåºå®ãããŠããå Žåã
googlemeet setupã«chrome-node-connectedãå«ãŸããŸãã nodes statusã«ãéžæããããŒããæ¥ç¶æžã¿ãšããŠè¡šç€ºãããŸãã- éžæããããŒãã
googlemeet.chromeãšbrowser.proxyã®äž¡æ¹ãéç¥ããŸãã - Meet ã¿ããé話ã«åå ãã
test-speechãinCall: trueãå«ã Chrome ãã«ã¹ãè¿ããŸãã
Parallels macOS VM ã®ãããªãªã¢ãŒã Chrome ãã¹ãã§ã¯ãGateway ãŸã㯠VM ã®æŽæ°åŸããããæçã®å®å šãªãã§ãã¯ã§ãã
openclaw googlemeet setupopenclaw nodes status --connectedopenclaw nodes invoke \ --node parallels-macos \ --command googlemeet.chrome \ --params '{"action":"setup"}'ããã«ããããšãŒãžã§ã³ããå®éã®äŒè°ã¿ããéãåã«ãGateway Plugin ãèªã¿èŸŒãŸããŠããããšãVM ããŒããçŸåšã®ããŒã¯ã³ã§æ¥ç¶ãããŠããããšãMeet é³å£°ããªããžãå©çšå¯èœã§ããããšã蚌æã§ããŸãã
Twilio ã¹ã¢ãŒã¯ã§ã¯ãé»è©±ãã€ã€ã«ã€ã³è©³çްãå ¬éããäŒè°ã䜿çšããŸãã
openclaw googlemeet setupopenclaw 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ãã§ãã¯ãå«ãŸããŸãã- Gateway ã®ãªããŒãåŸãCLI ã§
voicecallãå©çšå¯èœã§ãã - è¿ãããã»ãã·ã§ã³ã«
transport: "twilio"ãštwilio.voiceCallIdããããŸãã openclaw logs --followã«ããªã¢ã«ã¿ã€ã TwiML ã®åã«æäŸããã DTMF TwiML ã衚瀺ããããã®åŸãåææšæ¶ããã¥ãŒã«å ¥ã£ããªã¢ã«ã¿ã€ã ããªããžã衚瀺ãããŸããgooglemeet leave <sessionId>ãå§ä»»ãããé³å£°é話ãåæããŸãã
ãã©ãã«ã·ã¥ãŒãã£ã³ã°
ãšãŒãžã§ã³ãã Google Meet ããŒã«ã確èªã§ããªã
Plugin ã Gateway èšå®ã§æå¹ã«ãªã£ãŠããããšã確èªããGateway ããªããŒãããŸãã
openclaw plugins list | grep google-meetopenclaw googlemeet setupplugins.entries.google-meet ãç·šéããã°ããã®å Žåã¯ãGateway ãåèµ·åãŸãã¯ãªããŒãããŸããå®è¡äžã®ãšãŒãžã§ã³ãã«ã¯ãçŸåšã® Gateway ããã»ã¹ã«ãã£ãŠç»é²ããã Plugin ããŒã«ã ãã衚瀺ãããŸãã
macOS 以å€ã® Gateway ãã¹ãã§ã¯ããšãŒãžã§ã³ãåãã® google_meet ããŒã«ã¯è¡šç€ºããããŸãŸã§ãããããŒã«ã« Chrome ã®ããŒã¯ããã¯ã¢ã¯ã·ã§ã³ã¯é³å£°ããªããžã«å°éããåã«ãããã¯ãããŸããããŒã«ã« Chrome ã®ããŒã¯ããã¯é³å£°ã¯çŸåš macOS ã® BlackHole 2ch ã«äŸåããŠãããããLinux ãšãŒãžã§ã³ãã¯ããã©ã«ãã®ããŒã«ã« Chrome ãšãŒãžã§ã³ããã¹ã§ã¯ãªããmode: "transcribe"ãTwilio ãã€ã€ã«ã€ã³ããŸã㯠macOS ã® chrome-node ãã¹ãã䜿çšããŠãã ããã
æ¥ç¶æžã¿ã® Google Meet 察å¿ããŒãããªã
ããŒããã¹ãã§å®è¡ããŸãã
openclaw plugins enable google-meetopenclaw plugins enable browserOPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 \ openclaw node run --host <gateway-lan-ip> --port 18789 --display-name parallels-macosGateway ãã¹ãã§ãããŒããæ¿èªããã³ãã³ãã確èªããŸãã
openclaw devices listopenclaw devices approve <requestId>openclaw nodes statusããŒãã¯æ¥ç¶æžã¿ã§ãããgooglemeet.chrome ãš browser.proxy ãäžèŠ§è¡šç€ºããå¿
èŠããããŸããGateway èšå®ã§ã¯ããããã®ããŒãã³ãã³ããèš±å¯ããå¿
èŠããããŸãã
{ gateway: { nodes: { allowCommands: ["browser.proxy", "googlemeet.chrome"], }, },}googlemeet setup ã chrome-node-connected ã«å€±æããããGateway ãã°ã gateway token mismatch ãå ±åããå Žåã¯ãçŸåšã® Gateway ããŒã¯ã³ã§ããŒããåã€ã³ã¹ããŒã«ãŸãã¯åèµ·åããŸããLAN Gateway ã®å Žåãéåžžã¯æ¬¡ã®ããã«ãªããŸãã
OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 \ openclaw node install \ --host <gateway-lan-ip> \ --port 18789 \ --display-name parallels-macos \ --force次ã«ãããŒããµãŒãã¹ããªããŒãããŠåå®è¡ããŸãã
openclaw googlemeet setupopenclaw nodes status --connectedãã©ãŠã¶ãŒã¯éãããšãŒãžã§ã³ããåå ã§ããªã
芳å¯ã®ã¿ã®åå ã«ã¯ googlemeet test-listen ãããªã¢ã«ã¿ã€ã åå ã«ã¯ googlemeet test-speech ãå®è¡ããè¿ããã Chrome ãã«ã¹ã調ã¹ãŸããã©ã¡ããã®ãããŒãã manualActionRequired: true ãå ±åããå Žåã¯ãmanualActionMessage ããªãã¬ãŒã¿ãŒã«è¡šç€ºãããã©ãŠã¶ãŒã¢ã¯ã·ã§ã³ãå®äºãããŸã§å詊è¡ã忢ããŸãã
äžè¬çãªæåã¢ã¯ã·ã§ã³:
- Chrome ãããã¡ã€ã«ã«ãµã€ã³ã€ã³ããŸãã
- Meet ãã¹ãã¢ã«ãŠã³ãããã²ã¹ããæ¿èªããŸãã
- Chrome ã®ãã€ãã£ãæš©éããã³ããã衚瀺ãããããChrome ã®ãã€ã¯/ã«ã¡ã©æš©éãä»äžããŸãã
- åºçãã Meet æš©éãã€ã¢ãã°ãéããã修埩ããŸãã
Meet ã«ãäŒè°ã§ä»ã®ãŠãŒã¶ãŒã«ããªãã®é³å£°ãèãããŸãã?ããšè¡šç€ºãããŠããã ãã§ãããµã€ã³ã€ã³ããŠããªãããšå ±åããªãã§ãã ããããã㯠Meet ã®é³å£°éžæã€ã³ã¿ãŒã¹ãã£ã·ã£ã«ã§ããOpenClaw ã¯ãå©çšå¯èœãªå Žåã¯ãã©ãŠã¶ãŒèªååãéã㊠ãã€ã¯ãäœ¿çš ãã¯ãªãã¯ããå®éã®äŒè°ç¶æ ãåŸ ã¡ç¶ããŸããäœæã®ã¿ã®ãã©ãŠã¶ãŒãã©ãŒã«ããã¯ã§ã¯ãURL ã®äœæã«ãªã¢ã«ã¿ã€ã é³å£°ãã¹ãäžèŠãªãããOpenClaw ã ãã€ã¯ãªãã§ç¶è¡ ãã¯ãªãã¯ããå ŽåããããŸãã
äŒè°ã®äœæã«å€±æãã
googlemeet create ã¯ãOAuth è³æ Œæ
å ±ãèšå®ãããŠããå Žåãæåã« Google Meet API ã® spaces.create ãšã³ããã€ã³ãã䜿çšããŸããOAuth è³æ Œæ
å ±ããªãå Žåã¯ãåºå®ããã Chrome ããŒããã©ãŠã¶ãŒã«ãã©ãŒã«ããã¯ããŸããæ¬¡ã確èªããŸãã
- API äœæã®å Žå:
oauth.clientIdãšoauth.refreshTokenãèšå®ãããŠããããäžèŽããOPENCLAW_GOOGLE_MEET_*ç°å¢å€æ°ãååšããŸãã - API äœæã®å Žå: æŽæ°ããŒã¯ã³ã¯äœæãµããŒãã远å ãããåŸã«çºè¡ãããŠããŸããå€ãããŒã¯ã³ã«ã¯
meetings.space.createdã¹ã³ãŒãããªãå ŽåããããŸããopenclaw googlemeet auth login --jsonãåå®è¡ããPlugin èšå®ãæŽæ°ããŠãã ããã - ãã©ãŠã¶ãŒãã©ãŒã«ããã¯ã®å Žå:
defaultTransport: "chrome-node"ãšchromeNode.nodeããbrowser.proxyãšgooglemeet.chromeãæã€æ¥ç¶æžã¿ããŒããæããŠããŸãã - ãã©ãŠã¶ãŒãã©ãŒã«ããã¯ã®å Žå: ãã®ããŒãäžã® OpenClaw Chrome ãããã¡ã€ã«ã Google ã«ãµã€ã³ã€ã³ããŠããã
https://meet.google.com/newãéããŸãã - ãã©ãŠã¶ãŒãã©ãŒã«ããã¯ã®å Žå: å詊è¡ã§ã¯ãæ°ããã¿ããéãåã«ãæ¢åã®
https://meet.google.com/newãŸã㯠Google ã¢ã«ãŠã³ãããã³ããã¿ããåå©çšããŸãããšãŒãžã§ã³ããã¿ã€ã ã¢ãŠãããå Žåã¯ãå¥ã® Meet ã¿ããæåã§éãã®ã§ã¯ãªããããŒã«åŒã³åºããå詊è¡ããŠãã ããã - ãã©ãŠã¶ãŒãã©ãŒã«ããã¯ã®å Žå: ããŒã«ã
manualActionRequired: trueãè¿ããå Žåã¯ãè¿ãããbrowser.nodeIdãbrowser.targetIdãbrowserUrlãmanualActionMessageã䜿çšããŠãªãã¬ãŒã¿ãŒãèªå°ããŸãããã®ã¢ã¯ã·ã§ã³ãå®äºãããŸã§ã«ãŒãã§å詊è¡ããªãã§ãã ããã - ãã©ãŠã¶ãŒãã©ãŒã«ããã¯ã®å Žå: Meet ã«ãäŒè°ã§ä»ã®ãŠãŒã¶ãŒã«ããªãã®é³å£°ãèãããŸãã?ããšè¡šç€ºãããããã¿ããéãããŸãŸã«ããŸããOpenClaw ã¯ãã©ãŠã¶ãŒèªååãéã㊠ãã€ã¯ã䜿çšããŸãã¯äœæã®ã¿ã®ãã©ãŒã«ããã¯ã§ã¯ ãã€ã¯ãªãã§ç¶è¡ ãã¯ãªãã¯ããçæããã Meet URL ãåŸ
ã¡ç¶ããå¿
èŠããããŸãããããã§ããªãå Žåããšã©ãŒã¯
google-login-requiredã§ã¯ãªãmeet-audio-choice-requiredã«èšåããå¿ èŠããããŸãã
ãšãŒãžã§ã³ãã¯åå ããã話ããªã
ãªã¢ã«ã¿ã€ã ãã¹ã確èªããŸãã
openclaw googlemeet setupopenclaw googlemeet doctoréåžžã® STT -> OpenClaw ãšãŒãžã§ã³ã -> TTS ããŒã¯ããã¯ãã¹ã«ã¯ mode: "agent" ã䜿çšããçŽæ¥ã®ãªã¢ã«ã¿ã€ã é³å£°ãã©ãŒã«ããã¯ã«ã¯ mode: "bidi" ã䜿çšããŸããmode: "transcribe" ã¯æå³çã«ããŒã¯ããã¯ããªããžãéå§ããŸããã芳å¯ã®ã¿ã®ãããã°ã§ã¯ãåå è
ã話ããåŸã« openclaw googlemeet status --json <session-id> ãå®è¡ããcaptioningãtranscriptLinesãlastCaptionText ã確èªããŸããinCall ã true ã§ã transcriptLines ã 0 ã®ãŸãŸã®å ŽåãMeet ã®åå¹ãç¡å¹ã§ããããªãã¶ãŒããŒãã€ã³ã¹ããŒã«ãããŠä»¥éã ãã話ããŠããªããMeet UI ã倿ŽãããããŸãã¯äŒè°ã®èšèª/ã¢ã«ãŠã³ãã§ã©ã€ãåå¹ãå©çšã§ããªãå¯èœæ§ããããŸãã
googlemeet test-speech ã¯åžžã«ãªã¢ã«ã¿ã€ã ãã¹ã確èªãããã®åŒã³åºãã§ããªããžåºåãã€ãã芳枬ããããã©ãããå ±åããŸããspeechOutputVerified ã false ã§ speechOutputTimedOut ã true ã®å Žåããªã¢ã«ã¿ã€ã ãããã€ããŒã¯çºè©±ãåãä»ãããã®ã®ãOpenClaw ã¯æ°ããåºåãã€ãã Chrome é³å£°ããªããžã«å°éããã®ã確èªã§ããªãã£ãå¯èœæ§ããããŸãã
次ã確èªããŸãã
OPENAI_API_KEYãGEMINI_API_KEYãªã©ã®ãªã¢ã«ã¿ã€ã ãããã€ããŒããŒã Gateway ãã¹ãã§å©çšå¯èœã§ãã- Chrome ãã¹ãã§
BlackHole 2chã衚瀺ãããŠããŸãã - Chrome ãã¹ãã«
soxããããŸãã - Meet ã®ãã€ã¯ãšã¹ããŒã«ãŒããOpenClaw ã䜿çšããä»®æ³é³å£°ãã¹ãéããŠã«ãŒãã£ã³ã°ãããŠããŸããããŒã«ã« Chrome ã®ãªã¢ã«ã¿ã€ã åå ã§ã¯ã
doctorã«meet output routed: yesã衚瀺ãããå¿ èŠããããŸãã
googlemeet doctor [session-id] ã¯ãã»ãã·ã§ã³ãããŒããé話äžç¶æ
ãæåã¢ã¯ã·ã§ã³çç±ããªã¢ã«ã¿ã€ã ãããã€ããŒæ¥ç¶ãrealtimeReadyãé³å£°å
¥å/åºåã¢ã¯ãã£ããã£ãæåŸã®é³å£°ã¿ã€ã ã¹ã¿ã³ãããã€ãã«ãŠã³ã¿ãŒããã©ãŠã¶ãŒ URL ãåºåããŸããçã® JSON ãå¿
èŠãªå Žå㯠googlemeet status [session-id] --json ã䜿çšããŸããããŒã¯ã³ãå
¬éããã« Google Meet OAuth æŽæ°ã確èªããå¿
èŠãããå Žå㯠googlemeet doctor --oauth ã䜿çšããŸããGoogle Meet API ã®èšŒæãå¿
èŠãªå Žå㯠--meeting ãŸã㯠--create-space ã远å ããŸãã
ãšãŒãžã§ã³ããã¿ã€ã ã¢ãŠãããMeet ã¿ãããã§ã«éããŠããããšã確èªã§ããå Žåã¯ãå¥ã®ã¿ããéããã«ãã®ã¿ãã調ã¹ãŸãã
openclaw googlemeet recover-tabopenclaw googlemeet recover-tab https://meet.google.com/abc-defg-hijåçã®ããŒã«ã¢ã¯ã·ã§ã³ã¯ recover_current_tab ã§ããéžæãããã©ã³ã¹ããŒãã®æ¢åã® Meet ã¿ãã«ãã©ãŒã«ã¹ãã調ã¹ãŸããchrome ã§ã¯ Gateway çµç±ã®ããŒã«ã«ãã©ãŠã¶ãŒå¶åŸ¡ã䜿çšããŸããchrome-node ã§ã¯èšå®æžã¿ Chrome ããŒãã䜿çšããŸããæ°ããã¿ããéããããæ°ããã»ãã·ã§ã³ãäœæãããã¯ããŸããããã°ã€ã³ãæ¿èªãæš©éãé³å£°éžæç¶æ
ãªã©ãçŸåšã®ãããã«ãŒãå ±åããŸããCLI ã³ãã³ãã¯èšå®æžã¿ Gateway ãšéä¿¡ãããããGateway ãå®è¡äžã§ããå¿
èŠããããŸããchrome-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=+15550001234voice-call ã«ãããªã㯠Webhook å
¬éããªãå ŽåããŸã㯠publicUrl ãã«ãŒãããã¯ããã©ã€ããŒããããã¯ãŒã¯ç©ºéãæããŠããå Žåãtwilio-voice-call-webhook ã¯å€±æããŸããplugins.entries.voice-call.config.publicUrl ããããªãã¯ãããã€ã㌠URL ã«èšå®ããããvoice-call ãã³ãã«/Tailscale å
¬éãèšå®ããŸãã
ã«ãŒããã㯠URL ãšãã©ã€ããŒã URL ã¯ãã£ãªã¢ã³ãŒã«ããã¯ã«ã¯æå¹ã§ã¯ãããŸãããpublicUrl ãšã㊠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 ã䜿çšããªãã§ãã ããã
å®å®ãããããªã㯠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 ãåèµ·åãŸãã¯åèªã¿èŸŒã¿ããŠã次ãå®è¡ããŸãã
openclaw googlemeet setup --transport twilioopenclaw voicecall setupopenclaw voicecall smokevoicecall smoke ã¯ããã©ã«ãã§ã¯æºåç¶æ
ã®ç¢ºèªã®ã¿ã§ããç¹å®ã®çªå·ã§ãã©ã€ã©ã³ããã«ã¯æ¬¡ãå®è¡ããŸãã
openclaw voicecall smoke --to "+15555550123"æå³çã«ã©ã€ãã®ã¢ãŠãããŠã³ãéç¥é話ãçºä¿¡ãããå Žåã«ã®ã¿ --yes ã远å ããŸãã
openclaw voicecall smoke --to "+15555550123" --yesTwilio é話ã¯éå§ãããäŒè°ã«åå ããªã
Meet ã€ãã³ããé»è©±ã®ãã€ã€ã«ã€ã³è©³çްãå ¬éããŠããããšã確èªããŸããæ£ç¢ºãªãã€ã€ã«ã€ã³çªå·ãš PINããŸãã¯ã«ã¹ã¿ã DTMF ã·ãŒã±ã³ã¹ãæž¡ããŸãã
openclaw googlemeet join https://meet.google.com/abc-defg-hij \ --transport twilio \ --dial-in-number +15551234567 \ --dtmf-sequence ww123456#PIN ãå
¥åããåã«ãããã€ããŒãäžæåæ¢ãå¿
èŠãšããå Žåã¯ã--dtmf-sequence ã§å
é ã® w ãŸãã¯ã«ã³ãã䜿çšããŸãã
é»è©±é話ã¯äœæããããã®ã®ãMeet ã®åå è äžèЧã«ãã€ã€ã«ã€ã³åå è ã衚瀺ãããªãå Žå:
openclaw googlemeet doctor <session-id>ãå®è¡ããŠãå§ä»»ããã Twilio é話 IDãDTMF ããã¥ãŒã«å ¥ã£ããã©ãããã€ã³ããæšæ¶ããªã¯ãšã¹ãããããã©ããã確èªããŸããopenclaw voicecall status --call-id <id>ãå®è¡ããé話ããŸã ã¢ã¯ãã£ãã§ããããšã確èªããŸããopenclaw voicecall tailãå®è¡ããTwilio Webhook ã Gateway ã«å°çããŠããããšã確èªããŸããopenclaw logs --followãå®è¡ããTwilio Meet ã·ãŒã±ã³ã¹ãæ¢ããŸããGoogle Meet ãåå ãå§ä»»ããVoice Call ãæ¥ç¶å DTMF TwiML ãä¿åããŠæäŸããVoice Call ã Twilio é話çšã®ãªã¢ã«ã¿ã€ã TwiML ãæäŸãããã®åŸ Google Meet ãvoicecall.speakã§ã€ã³ããé³å£°ããªã¯ãšã¹ãããŸããopenclaw googlemeet setup --transport twilioãåå®è¡ããŸããç·ã®ã»ããã¢ãããã§ãã¯ã¯å¿ é ã§ãããäŒè° PIN ã·ãŒã±ã³ã¹ãæ£ããããšãŸã§ã¯èšŒæããŸããã- ãã€ã€ã«ã€ã³çªå·ã PIN ãšåã Meet æåŸ ããã³ãªãŒãžã§ã³ã«å±ããŠããããšã確èªããŸãã
- Meet ã®å¿çãé
ãå ŽåããŸãã¯æ¥ç¶å DTMF ã®éä¿¡åŸãé話ãã©ã³ã¹ã¯ãªããã« PIN ã®å
¥åãæ±ããããã³ããã衚瀺ãããå Žåã¯ã
voiceCall.dtmfDelayMsãããã©ã«ãã® 12 ç§ããå¢ãããŸãã - åå è
ã¯åå ããŠãããæšæ¶ãèãããªãå Žåã¯ã
openclaw logs --followã§ DTMF åŸã®voicecall.speakãªã¯ãšã¹ããšãã¡ãã£ã¢ã¹ããªãŒã TTS åçãŸã㯠TwilioOPENCLAW_DOCS_MARKER:calloutOpen:U2F5ãã©ãŒã«ããã¯ã確èªããŸããé話ãã©ã³ã¹ã¯ãªããã«ãŸã ãenter the meeting PINããå«ãŸããŠããå Žåãé»è©±åŽã¯ãŸã Meet ã«ãŒã ã«åå ããŠããªããããäŒè°åå è ã«ã¯é³å£°ãèãããŸããã
Webhook ãå°çããªãå Žåã¯ããŸã Voice Call Plugin ããããã°ããŸãããããã€ããŒã¯ plugins.entries.voice-call.config.publicUrl ãŸãã¯èšå®æžã¿ã®ãã³ãã«ã«å°éã§ããå¿
èŠããããŸããVoice call ã®ãã©ãã«ã·ã¥ãŒãã£ã³ã°ãåç
§ããŠãã ããã
泚æäºé
Google Meet ã®å ¬åŒã¡ãã£ã¢ API ã¯åä¿¡æåã®ãããMeet é話ã§çºè©±ããã«ã¯åŒãç¶ãåå è ãã¹ãå¿ èŠã§ãããã® Plugin ã¯ãã®å¢çãæç¢ºã«ä¿ã¡ãŸããChrome ã¯ãã©ãŠã¶ãŒåå ãšããŒã«ã«é³å£°ã«ãŒãã£ã³ã°ãåŠçããTwilio ã¯é»è©±ãã€ã€ã«ã€ã³åå ãåŠçããŸãã
Chrome ã®ããŒã¯ããã¯ã¢ãŒãã«ã¯ BlackHole 2ch ãšã次ã®ãããããå¿
èŠã§ãã
chrome.audioInputCommandãšchrome.audioOutputCommand: OpenClaw ãããªããžãææãããããã®ã³ãã³ããšéžæããããããã€ããŒã®éã§chrome.audioFormatã®é³å£°ããã€ãããŸãããšãŒãžã§ã³ãã¢ãŒãã§ã¯ãªã¢ã«ã¿ã€ã æåèµ·ãããšéåžžã® TTS ã䜿çšããŸããbidi ã¢ãŒãã§ã¯ãªã¢ã«ã¿ã€ã é³å£°ãããã€ããŒã䜿çšããŸããããã©ã«ãã® Chrome ãã¹ã¯ 24 kHz PCM16 ãšchrome.audioBufferBytes: 4096ã§ãã8 kHz G.711 mu-law ã¯ã¬ã¬ã·ãŒã³ãã³ããã¢åãã«åŒãç¶ãå©çšã§ããŸããchrome.audioBridgeCommand: å€éšããªããžã³ãã³ããããŒã«ã«é³å£°ãã¹å šäœãææããããŒã¢ã³ã®èµ·åãŸãã¯æ€èšŒåŸã«çµäºããå¿ èŠããããŸããããã¯bidiã®å Žåã®ã¿æå¹ã§ããagentã¢ãŒãã§ã¯ TTS ã®ããã«ã³ãã³ããã¢ãžã®çŽæ¥ã¢ã¯ã»ã¹ãå¿ èŠãªããã§ãã
ãšãŒãžã§ã³ãã¢ãŒãã§ãšãŒãžã§ã³ãã google_meet ããŒã«ãåŒã³åºããšãäŒè°ã³ã³ãµã«ã¿ã³ãã»ãã·ã§ã³ã¯åå è
ã®çºè©±ã«å¿çããåã«åŒã³åºãå
ã®çŸåšã®ãã©ã³ã¹ã¯ãªããããã©ãŒã¯ããŸããMeet ã»ãã·ã§ã³ã¯åŒãç¶ãå¥åã®ãŸãŸã§ã (agent:<agentId>:subagent:google-meet:<sessionId>)ããã®ãããäŒè°ã®ãã©ããŒã¢ãããåŒã³åºãå
ã®ãã©ã³ã¹ã¯ãªãããçŽæ¥å€æŽããããšã¯ãããŸããã
ã¯ãªãŒã³ãªäºéé³å£°ã®ããã«ãMeet åºåãš Meet ãã€ã¯ãå¥ã ã®ä»®æ³ããã€ã¹ããŸã㯠Loopback ã¹ã¿ã€ã«ã®ä»®æ³ããã€ã¹ã°ã©ãã«ã«ãŒãã£ã³ã°ããŸããåäžã®å ±æ BlackHole ããã€ã¹ã§ã¯ãä»ã®åå è ã®é³å£°ãé話ã«ãšã³ãŒããã¯ãããå¯èœæ§ããããŸãã
ã³ãã³ããã¢ã® Chrome ããªããžã§ã¯ãchrome.bargeInInputCommand ãå¥ã®ããŒã«ã«ãã€ã¯ããªãã¹ã³ãã人éã話ãå§ãããšãã«ã¢ã·ã¹ã¿ã³ãåçãã¯ãªã¢ã§ããŸããããã«ãããã¢ã·ã¹ã¿ã³ãåçäžã«å
±æ BlackHole ã«ãŒãããã¯å
¥åãäžæçã«æå¶ãããŠããå Žåã§ãã人éã®çºè©±ãã¢ã·ã¹ã¿ã³ãåºåããåªå
ã§ããŸããchrome.audioInputCommand ã chrome.audioOutputCommand ãšåæ§ã«ãããã¯ãªãã¬ãŒã¿ãŒãèšå®ããããŒã«ã«ã³ãã³ãã§ããæç€ºçã«ä¿¡é Œãããã³ãã³ããã¹ãŸãã¯åŒæ°ãªã¹ãã䜿çšããä¿¡é Œã§ããªãå Žæã®ã¹ã¯ãªãããæããªãã§ãã ããã
googlemeet speak 㯠Chrome ã»ãã·ã§ã³ã®ã¢ã¯ãã£ããªããŒã¯ããã¯é³å£°ããªããžãããªã¬ãŒããŸããgooglemeet leave ã¯ãã®ããªããžã忢ããŸããVoice Call Plugin ãéããŠå§ä»»ããã Twilio ã»ãã·ã§ã³ã§ã¯ãleave ã¯åºç€ãšãªãé³å£°é話ãåæããŸããAPI 管çã®ã¹ããŒã¹ã§ã¢ã¯ãã£ã㪠Google Meet äŒè°ãéãããå Žåã¯ãgooglemeet end-active-conference ã䜿çšããŸãã