Appearance
OpenClaw 智能体可以通过 Chrome(本地或远程 macOS 节点)或 Twilio 电话拨入加入指定的 Google Meet 会议。使用 openclaw googlemeet join <url> 命令或 google_meet 工具,默认采用 agent 模式(实时转录 → 智能体回答 → TTS 语音回播)。Chrome 模式依赖 macOS 虚拟音频设备 BlackHole 2ch 和 SoX;Twilio 模式需启用 voice-call 插件并配置公共 webhook 地址。只有指定了 https://meet.google.com/... 格式的 URL 才会被接受;创建会议可通过 Google Meet API(需 OAuth)或浏览器回退(需已登录的 Chrome 配置)。
OpenClaw Google Meet 插件配置:加入、创建会议与故障排查
Google Meet 插件功能明确:只加入明确的 https://meet.google.com/... URL,可创建新会议空间并通过 API 或浏览器回退加入。默认 talk-back 模式为 agent:实时转录监听,配置好的 OpenClaw 智能体回答,常规 TTS 发声到会议中。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 作为 bidi 模式的语音回退独立使用,需设置 realtime.voiceProvider: "google":
bash
brew install blackhole-2ch sox
export OPENAI_API_KEY=sk-...
# 仅当 realtime.voiceProvider 设为 "google" 时用于 bidi 模式
export GEMINI_API_KEY=...blackhole-2ch 安装 BlackHole 2ch 虚拟音频设备。Homebrew 安装器要求重启后 macOS 才能暴露该设备:
bash
sudo reboot重启后确认两项都可用:
bash
system_profiler SPAudioDataType | grep -i BlackHole
command -v sox启用插件:
json5
{
plugins: {
entries: {
"google-meet": {
enabled: true,
config: {},
},
},
},
}验证设置:
bash
openclaw googlemeet setup输出结果包含 Chrome 配置、节点 pinning 以及(对于实时 Chrome 加入)BlackHole/SoX 音频桥和延迟实时引入检查。对于只观察模式,使用 --mode transcribe 检查相同传输;该模式跳过实时音频前提条件,因为不通过桥接听或说话:
bash
openclaw googlemeet setup --transport chrome-node --mode transcribe当配置了 Twilio 委托时,setup 还会报告 voice-call 插件、Twilio 凭据和公共 webhook 暴露是否就绪。在要求智能体加入前,将任何 ok: false 检查视为该传输和模式的阻塞点。使用 openclaw googlemeet setup --json 获取脚本或机器可读输出。使用 --transport chrome、--transport chrome-node 或 --transport twilio 针对特定传输进行预检。
对于 Twilio,当默认传输为 Chrome 时,始终显式预检该传输:
bash
openclaw googlemeet setup --transport twilio这会在智能体尝试拨号会议前捕获缺失的 voice-call 接线、Twilio 凭据或不可达的 webhook 暴露。
加入会议:
bash
openclaw googlemeet join https://meet.google.com/abc-defg-hij或通过 google_meet 工具让智能体加入:
json
{
"action": "join",
"url": "https://meet.google.com/abc-defg-hij",
"transport": "chrome-node",
"mode": "agent"
}非 macOS 主机上仍提供面向智能体的 google_meet 工具用于 artifact、calendar、setup、transcribe、Twilio 和 chrome-node 流程。本地 Chrome talk-back 操作在那里被阻止,因为捆绑的 Chrome 音频路径当前依赖 macOS BlackHole 2ch。在 Linux 上,使用 mode: "transcribe"、Twilio 拨入或 macOS chrome-node 主机来实现 Chrome talk-back 参与。
创建新会议并加入:
bash
openclaw googlemeet create --transport chrome-node --mode agent对于 API 创建的房间,使用 Google Meet SpaceConfig.accessType 来显式指定房间的免敲门策略而不是继承自 Google 账户默认值:
bash
openclaw googlemeet create --access-type OPEN --transport chrome-node --mode agentOPEN 允许任何拥有 Meet URL 的人无需敲门即可加入。TRUSTED 允许主机组织的受信任用户、受邀外部用户和拨入用户无需敲门即可加入。RESTRICTED 限制仅受邀者免敲门进入。这些设置仅适用于官方 Google Meet API 创建路径,因此必须配置 OAuth 凭据。
如果在此选项可用之前已经认证了 Google Meet,则在将 meetings.space.settings 范围添加到 Google OAuth 同意屏幕后,重新运行 openclaw googlemeet auth login --json。
仅创建 URL 而不加入:
bash
openclaw googlemeet create --no-joingooglemeet create 有两条路径:
- API 创建:当配置了 Google Meet OAuth 凭据时使用。这是最确定性的路径,不依赖浏览器 UI 状态。
- 浏览器回退:当缺少 OAuth 凭据时使用。OpenClaw 使用固定的 Chrome 节点,打开
https://meet.google.com/new,等待 Google 重定向到真实的会议代码 URL,然后返回该 URL。此路径要求节点上的 OpenClaw Chrome 配置已登录 Google。浏览器自动化处理 Meet 自己的首次运行麦克风提示;该提示不被视为 Google 登录失败。加入和创建流程也尝试在打开新标签页前重用已有的 Meet 标签页。匹配忽略无害的 URL 查询字符串如authuser,因此智能体重试时应聚焦已打开的会议而不是创建第二个 Chrome 标签页。
命令/工具输出包含 source 字段(api 或 browser),以便智能体解释使用了哪条路径。create 默认加入新会议并返回 joined: true 和加入会话。要仅生成 URL,使用 CLI 的 create --no-join 或向工具传递 "join": false。
或者告诉智能体:"创建一个 Google Meet,用智能体对话模式加入,然后把链接发给我。" 智能体应调用 google_meet 并设置 action: "create",然后分享返回的 meetingUri。
json
{
"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 页面提示,浏览器自动化会尽力处理。登录、主机准入和浏览器/操作系统权限提示会报告为手动操作,附有原因和消息供智能体中继。托管 Chrome 会话仅在浏览器健康报告 inCall: true 后才发出 intro 或测试短语;否则状态报告 speechReady: false 并且语音尝试被阻止,而不是假装智能体向会议说了话。
本地 Chrome 加入到已登录的 OpenClaw 浏览器配置。实时模式要求 BlackHole 2ch 作为 OpenClaw 使用的麦克风/扬声器路径。为了清洁的双工音频,使用独立的虚拟设备或 Loopback 风格图;单个 BlackHole 设备足够首次冒烟测试但可能产生回声。
本地网关 + Parallels Chrome
不需要在 macOS VM 内运行完整的 OpenClaw 网关或模型 API 键来让 VM 拥有 Chrome。在本地运行网关和智能体,然后在 VM 内运行节点主机。在 VM 上启用捆绑插件一次,以便节点通告 Chrome 命令。
各部分运行位置:
- 网关主机:OpenClaw 网关、智能体工作区、模型/API 键、实时提供商和 Google Meet 插件配置。
- Parallels macOS VM:OpenClaw CLI/节点主机、Google Chrome、SoX、BlackHole 2ch 和已登录 Google 的 Chrome 配置。
- VM 中不需要:网关服务、智能体配置、OpenAI/GPT 键或模型提供商设置。
安装 VM 依赖:
bash
brew install blackhole-2ch sox安装 BlackHole 后重启 VM 以使 macOS 暴露 BlackHole 2ch:
bash
sudo reboot重启后验证 VM 能看到音频设备和 SoX 命令:
bash
system_profiler SPAudioDataType | grep -i BlackHole
command -v sox在 VM 中安装或更新 OpenClaw,然后在那里启用捆绑插件:
bash
openclaw plugins enable google-meet在 VM 中启动节点主机:
bash
openclaw node run --host <gateway-host> --port 18789 --display-name parallels-macos如果 <gateway-host> 是 LAN IP 且未使用 TLS,节点会拒绝纯文本 WebSocket,除非您为受信任的私有网络选择加入:
bash
OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 \
openclaw node run --host <gateway-lan-ip> --port 18789 --display-name parallels-macos安装节点为 LaunchAgent 时也使用相同环境变量:
bash
OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 \
openclaw node install --host <gateway-lan-ip> --port 18789 --display-name parallels-macos --force
openclaw node restartOPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 是进程环境变量,不是 openclaw.json 设置。openclaw node install 在安装命令中如果存在则将其存储在 LaunchAgent 环境中。
在网关主机上批准节点:
bash
openclaw devices list
openclaw devices approve <requestId>确认网关能看到节点且它通告了 googlemeet.chrome 和浏览器能力/browser.proxy:
bash
openclaw nodes status在网关主机上将 Meet 路由到该节点:
json5
{
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",
},
},
},
},
},
}现在从网关主机正常加入:
bash
openclaw googlemeet join https://meet.google.com/abc-defg-hij或让智能体使用 google_meet 工具并设置 transport: "chrome-node"。
用于创建或重用会话、说出已知短语并打印会话健康的一键冒烟测试:
bash
openclaw googlemeet test-speech https://meet.google.com/abc-defg-hij在实时加入期间,OpenClaw 浏览器自动化填写访客名称、点击“加入/请求加入”,并在出现提示时接受 Meet 的首次运行“使用麦克风”选择。在只观察加入或仅浏览器创建会议期间,当该选择可用时,它会继续绕过该提示而不使用麦克风。如果浏览器配置未登录、Meet 正在等待主机准入、Chrome 需要实时加入的麦克风/摄像头权限,或者 Meet 卡在自动化无法解决的提示上,加入/test-speech 结果会报告 manualActionRequired: true,附带 manualActionReason 和 manualActionMessage。智能体应停止重试加入,报告该确切消息加上当前 browserUrl/browserTitle,并仅在手动浏览器操作完成后重试。
如果省略 chromeNode.node,OpenClaw 仅在恰好一个已连接节点同时通告 googlemeet.chrome 和浏览器控制时自动选择。如果有多个能力节点连接,将 chromeNode.node 设置为节点 id、显示名称或远程 IP。
常见失败检查:
Configured Google Meet node ... is not usable: offline:固定节点已知但不可用。智能体应将其视为诊断状态,而不是可用的 Chrome 主机,并报告设置阻塞,除非用户要求回退到其他传输。No connected Google Meet-capable node:在 VM 中启动openclaw node run,批准配对,并确保在 VM 中运行了openclaw plugins enable google-meet和openclaw plugins enable browser。同时在网关主机上用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 在打开新标签页前会激活已存在的同 URL Meet 标签页,浏览器创建会议时也会重用正在进行的https://meet.google.com/new或 Google 账户提示标签页。 - 无音频:在 Meet 中,将麦克风/扬声器路由到 OpenClaw 使用的虚拟音频设备路径;使用独立的虚拟设备或 Loopback 风格路由以获得清洁的双工音频。
安装说明
Chrome talk-back 默认使用两个外部工具:
sox:命令行音频工具。插件使用显式 CoreAudio 设备命令,用于默认的 24 kHz PCM16 音频桥。blackhole-2ch:macOS 虚拟音频驱动程序。它创建BlackHole 2ch音频设备,Chrome/Meet 可以通过它路由。
OpenClaw 不捆绑或重新分发任一软件包。文档要求用户通过 Homebrew 安装为宿主机依赖。SoX 许可为 LGPL-2.0-only AND GPL-2.0-only;BlackHole 为 GPL-3.0。如果您构建包含 BlackHole 的安装程序或设备,请审查 BlackHole 的上游许可条款或从 Existential Audio 获得单独许可。
传输方式
Chrome
Chrome 传输通过 OpenClaw 浏览器控制打开 Meet URL,并以已登录的 OpenClaw 浏览器配置身份加入。在 macOS 上,插件在启动前检查 BlackHole 2ch。如果配置了,它还会在打开 Chrome 前运行音频桥健康命令和启动命令。当 Chrome/音频位于网关主机上时使用 chrome;当 Chrome/音频位于配对节点(如 Parallels macOS VM)上时使用 chrome-node。对于本地 Chrome,通过 browser.defaultProfile 选择配置;chrome.browserProfile 传递给 chrome-node 主机。
bash
openclaw googlemeet join https://meet.google.com/abc-defg-hij --transport chrome
openclaw googlemeet join https://meet.google.com/abc-defg-hij --transport chrome-node将 Chrome 麦克风和扬声器音频路由到本地 OpenClaw 音频桥。如果未安装 BlackHole 2ch,加入会因设置错误而失败,而不是无音频路径地静默加入。
Twilio
Twilio 传输是委托给 Voice Call 插件的严格拨号计划。它不会解析 Meet 页面以获取电话号码。
当 Chrome 参与不可用或您想要电话拨入回退时使用。Google Meet 必须为会议暴露电话拨入号码和 PIN;OpenClaw 不会从 Meet 页面发现这些信息。
在网关主机上启用 Voice Call 插件,而不是在 Chrome 节点上:
json5
{
plugins: {
allow: ["google-meet", "voice-call", "google"],
entries: {
"google-meet": {
enabled: true,
config: {
defaultTransport: "chrome-node",
// 如果 Twilio 应为默认,则设为 "twilio"
},
},
"voice-call": {
enabled: true,
config: {
provider: "twilio",
inboundPolicy: "allowlist",
realtime: {
enabled: true,
provider: "google",
instructions: "作为 OpenClaw 智能体加入此 Google Meet。简短发言。",
toolPolicy: "safe-read-only",
providers: {
google: {
silenceDurationMs: 500,
startSensitivity: "high",
},
},
},
},
},
google: {
enabled: true,
},
},
},
}通过环境变量或配置文件提供 Twilio 凭据。环境变量保持机密不在 openclaw.json 中:
bash
export TWILIO_ACCOUNT_SID=AC...
export TWILIO_AUTH_TOKEN=...
export TWILIO_FROM_NUMBER=+15550001234
export GEMINI_API_KEY=...如果实时语音提供商是 OpenAI,则使用 realtime.provider: "openai" 配合 OpenAI 提供商插件和 OPENAI_API_KEY。
启用 voice-call 后重启或重载网关;插件配置更改在网关进程重载前不会生效。
然后验证:
bash
openclaw config validate
openclaw plugins list | grep -E 'google-meet|voice-call'
openclaw googlemeet setup当 Twilio 委托接线后,googlemeet setup 包含成功的 twilio-voice-call-plugin、twilio-voice-call-credentials 和 twilio-voice-call-webhook 检查。
bash
openclaw googlemeet join https://meet.google.com/abc-defg-hij \
--transport twilio \
--dial-in-number +15551234567 \
--pin 123456当会议需要自定义序列时使用 --dtmf-sequence:
bash
openclaw googlemeet join https://meet.google.com/abc-defg-hij \
--transport twilio \
--dial-in-number +15551234567 \
--dtmf-sequence ww123456#OAuth 和预检
对于创建 Meet 链接,OAuth 是可选的,因为 googlemeet create 可以回退到浏览器自动化。当您想要官方 API 创建、空间解析或 Meet Media API 预检检查时,配置 OAuth。
Google Meet API 访问使用用户 OAuth:创建 Google Cloud OAuth 客户端,请求所需范围,授权 Google 账户,然后将生成的刷新令牌存储在 Google Meet 插件配置中或提供 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 同意屏幕。
- 对于 Google Workspace 组织,Internal 最简单。
- 对于个人/测试设置,使用 External;在测试阶段,将每个将授权应用的 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:
texthttp://localhost:8085/oauth2callback
复制客户端 ID 和客户端密钥。
meetings.space.created 是 Google Meet spaces.create 必需的。meetings.space.readonly 允许 OpenClaw 将 Meet URL/代码解析为空间。meetings.space.settings 允许 OpenClaw 在 API 房间创建期间传递 SpaceConfig 设置(如 accessType)。meetings.conference.media.readonly 用于 Meet Media API 预检和媒体工作;Google 可能要求 Developer Preview 注册才能实际使用 Media API。如果只需要基于浏览器的 Chrome 加入,完全跳过 OAuth。
生成刷新令牌
配置 oauth.clientId 和可选的 oauth.clientSecret,或将其作为环境变量传递,然后运行:
bash
openclaw googlemeet auth login --json该命令打印一个包含刷新令牌的 oauth 配置块。它使用 PKCE、本地主机回调(http://localhost:8085/oauth2callback)和手动复制/粘贴流程(--manual)。
示例:
bash
OPENCLAW_GOOGLE_MEET_CLIENT_ID="your-client-id" \
OPENCLAW_GOOGLE_MEET_CLIENT_SECRET="your-client-secret" \
openclaw googlemeet auth login --json当浏览器无法到达本地回调时使用手动模式:
bash
OPENCLAW_GOOGLE_MEET_CLIENT_ID="your-client-id" \
OPENCLAW_GOOGLE_MEET_CLIENT_SECRET="your-client-secret" \
openclaw googlemeet auth login --json --manualJSON 输出包含:
json
{
"oauth": {
"clientId": "your-client-id",
"clientSecret": "your-client-secret",
"refreshToken": "refresh-token",
"accessToken": "access-token",
"expiresAt": 1770000000000
},
"scope": "..."
}将 oauth 对象存储在 Google Meet 插件配置下:
json5
{
plugins: {
entries: {
"google-meet": {
enabled: true,
config: {
oauth: {
clientId: "your-client-id",
clientSecret: "your-client-secret",
refreshToken: "refresh-token",
},
},
},
},
},
}当您不希望刷新令牌出现在配置中时,优先使用环境变量。如果配置和环境变量都存在,插件先解析配置,再回退到环境变量。
OAuth 同意包括 Meet 空间创建、Meet 空间读取访问和 Meet 会议媒体读取访问。如果您在会议创建支持存在之前已认证,重新运行 openclaw googlemeet auth login --json 以便刷新令牌具有 meetings.space.created 范围。
使用 doctor 验证 OAuth
当您需要快速、非机密健康检查时运行 OAuth doctor:
bash
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 范围,运行产生副作用的创建检查:
bash
openclaw googlemeet doctor --oauth --create-space --json
openclaw googlemeet create --no-join --json--create-space 创建一个一次性 Meet URL。当您需要确认 Google Cloud 项目已启用 Meet API 且授权账户具有 meetings.space.created 范围时使用它。
为了证明对现有会议空间的读取访问:
bash
openclaw googlemeet doctor --oauth --meeting https://meet.google.com/abc-defg-hij --json
openclaw 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 认证来自所选节点上已登录的 Chrome 配置,而不是来自 OpenClaw 配置。
这些环境变量可作为回退:
OPENCLAW_GOOGLE_MEET_CLIENT_ID或GOOGLE_MEET_CLIENT_IDOPENCLAW_GOOGLE_MEET_CLIENT_SECRET或GOOGLE_MEET_CLIENT_SECRETOPENCLAW_GOOGLE_MEET_REFRESH_TOKEN或GOOGLE_MEET_REFRESH_TOKENOPENCLAW_GOOGLE_MEET_ACCESS_TOKEN或GOOGLE_MEET_ACCESS_TOKENOPENCLAW_GOOGLE_MEET_ACCESS_TOKEN_EXPIRES_AT或GOOGLE_MEET_ACCESS_TOKEN_EXPIRES_ATOPENCLAW_GOOGLE_MEET_DEFAULT_MEETING或GOOGLE_MEET_DEFAULT_MEETINGOPENCLAW_GOOGLE_MEET_PREVIEW_ACK或GOOGLE_MEET_PREVIEW_ACK
通过 spaces.get 解析 Meet URL、代码或 spaces/{id}:
bash
openclaw googlemeet resolve-space --meeting https://meet.google.com/abc-defg-hij在媒体工作前运行预检:
bash
openclaw googlemeet preflight --meeting https://meet.google.com/abc-defg-hij在 Meet 创建了会议记录后列出会议构件和出席信息:
bash
openclaw googlemeet artifacts --meeting https://meet.google.com/abc-defg-hij
openclaw googlemeet attendance --meeting https://meet.google.com/abc-defg-hij
openclaw googlemeet export --meeting https://meet.google.com/abc-defg-hij --output ./meet-export使用 --meeting 时,artifacts 和 attendance 默认使用最新的会议记录。当您想要每个保留的记录时传递 --all-conference-records。
日历查找可以在读取 Meet 构件前从 Google 日历解析会议 URL:
bash
openclaw googlemeet latest --today
openclaw googlemeet calendar-events --today --json
openclaw googlemeet artifacts --event "Weekly sync"
openclaw googlemeet attendance --today --format csv --output attendance.csv--today 搜索今天 primary 日历中带有 Google Meet 链接的日历事件。使用 --event <query> 搜索匹配的事件文本,--calendar <id> 用于非主要日历。日历查找需要包含 Calendar events readonly 范围的新鲜 OAuth 登录。calendar-events 预览匹配的 Meet 事件,并标记 latest、artifacts、attendance 或 export 将选择的事件。
如果您已经知道会议记录 id,直接指定它:
bash
openclaw googlemeet latest --meeting https://meet.google.com/abc-defg-hij
openclaw googlemeet artifacts --conference-record conferenceRecords/abc123 --json
openclaw googlemeet attendance --conference-record conferenceRecords/abc123 --json当您想在通话后关闭房间时,结束 API 创建空间的活跃会议:
bash
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 结束该空间的活跃会议。
编写可读报告:
bash
openclaw googlemeet artifacts --conference-record conferenceRecords/abc123 \
--format markdown --output meet-artifacts.md
openclaw googlemeet attendance --conference-record conferenceRecords/abc123 \
--format markdown --output meet-attendance.md
openclaw googlemeet attendance --conference-record conferenceRecords/abc123 \
--format csv --output meet-attendance.csv
openclaw googlemeet export --conference-record conferenceRecords/abc123 \
--include-doc-bodies --zip --output meet-export
openclaw 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 记录所选输入、导出选项、会议记录、输出文件、计数、令牌源、使用的日历事件以及任何部分检索警告。传递 --zip 以在文件夹旁边写入可移植归档。传递 --include-doc-bodies 以通过 Google Drive files.export 导出链接的转录和智能笔记 Google Docs 文本;这需要包含 Drive Meet readonly 范围的新鲜 OAuth 登录。没有 --include-doc-bodies,导出仅包含 Meet 元数据和结构化转录条目。如果 Google 返回部分 artifact 失败(例如智能笔记列表、转录条目或 Drive 文档正文错误),摘要和清单会保留警告而不是使整个导出失败。使用 --dry-run 获取相同的 artifact/attendance 数据并打印清单 JSON,而不创建文件夹或 ZIP。这在编写大型导出之前或当智能体仅需要计数、所选记录和警告时很有用。
智能体也可以通过 google_meet 工具创建相同的捆绑包:
json
{
"action": "export",
"conferenceRecord": "conferenceRecords/abc123",
"includeDocumentBodies": true,
"outputDir": "meet-export",
"zip": true
}设置 "dryRun": true 以仅返回导出清单并跳过文件写入。
智能体还可以创建具有显式访问策略的 API 支持房间:
json
{
"action": "create",
"transport": "chrome-node",
"mode": "agent",
"accessType": "OPEN"
}并且可以为已知房间结束活跃会议:
json
{
"action": "end_active_conference",
"meeting": "https://meet.google.com/abc-defg-hij"
}对于先听后验证,智能体应在声称会议有用之前使用 test_listen:
json
{
"action": "test_listen",
"url": "https://meet.google.com/abc-defg-hij",
"transport": "chrome-node",
"timeoutMs": 30000
}针对真实的保留会议运行受保护的实时冒烟测试:
bash
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 字幕可用的会议运行实时先听后浏览器探测:
bash
openclaw googlemeet setup --transport chrome-node --mode transcribe
openclaw 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_ID或GOOGLE_MEET_CLIENT_ID提供 OAuth 客户端 id。OPENCLAW_GOOGLE_MEET_REFRESH_TOKEN或GOOGLE_MEET_REFRESH_TOKEN提供刷新令牌。- 可选:
OPENCLAW_GOOGLE_MEET_CLIENT_SECRET、OPENCLAW_GOOGLE_MEET_ACCESS_TOKEN和OPENCLAW_GOOGLE_MEET_ACCESS_TOKEN_EXPIRES_AT使用相同的无OPENCLAW_前缀回退名称。
基础 artifact/attendance 实时烟雾需要 https://www.googleapis.com/auth/meetings.space.readonly 和 https://www.googleapis.com/auth/meetings.conference.media.readonly。日历查找需要 https://www.googleapis.com/auth/calendar.events.readonly。Drive 文档正文导出需要 https://www.googleapis.com/auth/drive.meet.readonly。
创建新 Meet 空间:
bash
openclaw googlemeet create该命令打印新的 meeting uri、源和加入会话。使用 OAuth 凭据时,它使用官方 Google Meet API。没有 OAuth 凭据时,它使用固定 Chrome 节点上已登录的浏览器配置作为回退。智能体可以使用 google_meet 工具设置 action: "create" 一步创建并加入。对于仅 URL 创建,传递 "join": false。
来自浏览器回退的示例 JSON 输出:
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 权限阻止,网关方法返回失败响应,google_meet 工具返回结构化细节而不是纯字符串:
json
{
"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 输出:
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 主体和会议参与者已注册 Google Workspace Developer Preview Program 用于 Meet Media API 后,才设置 preview.enrollmentAcknowledged: true。
配置
常见的 Chrome 智能体路径只需要启用插件、BlackHole、SoX、实时转录提供商密钥和配置的 OpenClaw TTS 提供商。OpenAI 是默认转录提供商;设置 realtime.voiceProvider 为 "google" 和 realtime.model 以使用 Google Gemini Live 用于 bidi 模式,而不更改默认智能体模式转录提供商:
bash
brew install blackhole-2ch sox
export OPENAI_API_KEY=sk-...
# 或
export GEMINI_API_KEY=...在 plugins.entries.google-meet.config 下设置插件配置:
json5
{
plugins: {
entries: {
"google-meet": {
enabled: true,
config: {},
},
},
},
}默认值:
defaultTransport: "chrome"defaultMode: "agent"("realtime"仅作为遗留向后兼容别名被接受;新的工具调用应使用"agent")chromeNode.node:可选的节点 id/名称/IP 用于chrome-nodechrome.audioBackend: "blackhole-2ch"chrome.guestName: "OpenClaw Agent":在已登出的 Meet 访客屏幕上使用的名称chrome.autoJoin: true:尽力填写访客名称并通过 OpenClaw 浏览器自动化点击“立即加入”(在chrome-node上)chrome.reuseExistingTab: true:激活已存在的 Meet 标签页而不是打开重复标签页chrome.waitForInCallMs: 20000:在触发 talk-back intro 之前等待 Meet 标签页报告 in-callchrome.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:可选的本地麦克风命令,写入带符号 16 位小端序单声道 PCM 用于人类插话检测(在辅助播放期间)chrome.bargeInRmsThreshold: 650:在chrome.bargeInInputCommand上计为人类中断的 RMS 电平chrome.bargeInPeakThreshold: 2500:在chrome.bargeInInputCommand上计为人类中断的峰值电平chrome.bargeInCooldownMs: 900:重复人类中断清除之间的最小延迟mode: "agent":默认 talk-back 模式。参与者语音由配置的实时转录提供商转录,在按会议划分的子智能体会话中发送到配置的 OpenClaw 智能体,并通过常规 OpenClaw TTS 运行时回说mode: "bidi":备选直接双向实时模型模式。实时语音提供商直接回答参与者语音,并可能调用openclaw_agent_consult以获得更深入/支持工具的答案mode: "transcribe":仅观察模式,无 talk-back 桥realtime.provider: "openai":当下面限域提供商字段未设置时使用的向后兼容回退realtime.transcriptionProvider: "openai":agent模式用于实时转录的提供商 idrealtime.voiceProvider:bidi模式用于直接实时语音的提供商 id。设置为"google"以使用 Gemini Live,同时保持智能体模式转录使用 OpenAIrealtime.toolPolicy: "safe-read-only"realtime.instructions:简短的口头回复,配合openclaw_agent_consult进行更深入的答案realtime.introMessage:实时桥连接时的简短口头准备就绪检查;设置为""以静默加入realtime.agentId:用于openclaw_agent_consult的可选 OpenClaw 智能体 id;默认为main
可选覆盖:
json5
{
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: {
voice: "Kore",
},
},
},
}ElevenLabs 用于智能体模式监听和说话:
json5
{
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 配置:
json5
{
defaultTransport: "twilio",
twilio: {
defaultDialInNumber: "+15551234567",
defaultPin: "123456",
},
voiceCall: {
gatewayUrl: "ws://127.0.0.1:18789",
},
}voiceCall.enabled 默认为 true;使用 Twilio 传输时,它将实际的 PSTN 呼叫、DTMF 和 intro 问候委托给 Voice Call 插件。Voice Call 在打开实时媒体流之前播放 DTMF 序列,然后使用保存的 intro 文本作为初始实时问候。如果未启用 voice-call,Google Meet 仍然可以验证和记录拨号计划,但无法发起 Twilio 呼叫。
工具
智能体可以使用 google_meet 工具:
json
{
"action": "join",
"url": "https://meet.google.com/abc-defg-hij",
"transport": "chrome-node",
"mode": "agent"
}当 Chrome 在网关主机上运行时使用 transport: "chrome"。当 Chrome 在配对节点(如 Parallels VM)上运行时使用 transport: "chrome-node"。两种情况下,模型提供商和 openclaw_agent_consult 都在网关主机上运行,因此模型凭据保留在那里。使用默认 mode: "agent" 时,实时转录提供商处理监听,配置的 OpenClaw 智能体产生答案,常规 OpenClaw TTS 将其说入 Meet。使用 mode: "bidi" 时,您希望实时语音模型直接回答。原始 mode: "realtime" 仍被接受作为 mode: "agent" 的向后兼容别名,但不再在智能体工具模式中广告。智能体模式日志包含桥启动时解析的转录提供商/模型,以及每个合成回复后的 TTS 提供商、模型、语音、输出格式和采样率。
使用 action: "status" 列出活跃会话或检查会话 ID。使用 action: "speak" 配合 sessionId 和 message 使实时智能体立即说话。使用 action: "test_speech" 创建或重用会话,触发已知短语,并在 Chrome 主机可以报告时返回 inCall 健康状态。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 未将 intro/test 短语发送到音频桥providerConnected/realtimeReady:实时语音桥状态lastInputAt/lastOutputAt:从桥看到或发送到桥的最新音频audioOutputRouted/audioOutputDeviceLabel:Meet 标签页的媒体输出是否已主动路由到桥使用的 BlackHole 设备lastSuppressedInputAt/suppressedInputBytes:在辅助播放期间被忽略的回环输入
json
{
"action": "speak",
"sessionId": "meet_...",
"message": "Say exactly: I'm here and listening."
}智能体与 bidi 模式
Chrome agent 模式针对“我的智能体在会议中”行为进行了优化。实时转录提供商听到会议音频,最终的参与者转录通过配置的 OpenClaw 智能体路由,答案通过正常 OpenClaw TTS 运行时说出。设置 mode: "bidi" 时,您希望实时语音模型直接回答。附近的最终转录片段在咨询之前被合并,以便一次发言不会产生多个过时的部分答案。同时,在排队的辅助音频仍在播放时抑制实时输入,并且在智能体咨询之前忽略最近的类似辅助的转录回声,以便 BlackHole 回环不会使智能体回答自己的语音。
| 模式 | 谁决定答案 | 语音输出路径 | 使用场景 |
|---|---|---|---|
agent | 配置的 OpenClaw 智能体 | 常规 OpenClaw TTS 运行时 | 您想要“我的智能体在会议中”行为 |
bidi | 实时语音模型 | 实时语音提供商音频响应 | 您想要最低延迟的对话语音回路 |
在 bidi 模式下,当实时模型需要更深入的推理、当前信息或常规 OpenClaw 工具时,它可以调用 openclaw_agent_consult。咨询工具在后台运行常规 OpenClaw 智能体,并附有最近的会议转录上下文,返回简洁的口头答案。在 agent 模式下,OpenClaw 将该答案直接发送到 TTS 运行时;在 bidi 模式下,实时语音模型可以将咨询结果说回会议中。它使用与 Voice Call 相同的共享咨询机制。
默认情况下,咨询针对 main 智能体运行。当 Meet 通道应咨询专用 OpenClaw 智能体工作区、模型默认值、工具策略、内存和会话历史时设置 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 完全加入通话后强制进行口头准备就绪检查:
bash
openclaw googlemeet speak meet_... "Say exactly: I'm here and listening."完整的加入并说话冒烟测试:
bash
openclaw googlemeet test-speech https://meet.google.com/abc-defg-hij \
--transport chrome-node \
--message "Say exactly: I'm here and listening."实时测试清单
在将会议交给无人值守的智能体之前,使用此序列:
bash
openclaw googlemeet setup
openclaw nodes status
openclaw 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全部绿色。googlemeet setup在默认传输为 chrome-node 或固定了节点时包含chrome-node-connected。nodes status显示所选节点已连接。- 所选节点通告了
googlemeet.chrome和browser.proxy。 - Meet 标签页加入通话,并且
test-speech返回的 Chrome 健康状态包含inCall: true。
对于远程 Chrome 主机(如 Parallels macOS VM),这是在更新网关或 VM 后最短的安全检查:
bash
openclaw googlemeet setup
openclaw nodes status --connected
openclaw nodes invoke \
--node parallels-macos \
--command googlemeet.chrome \
--params '{"action":"setup"}'这证明网关插件已加载、VM 节点已通过当前令牌连接,并且在智能体打开真实会议标签页之前 Meet 音频桥可用。
对于 Twilio 冒烟测试,使用暴露了电话拨入详情的会议:
bash
openclaw googlemeet setup
openclaw 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检查。- 网关重载后 CLI 中
voicecall可用。 - 返回的会话具有
transport: "twilio"和twilio.voiceCallId。 openclaw logs --follow显示在实时 TwiML 之前服务的 DTMF TwiML,然后是带有排队的初始问候的实时桥。googlemeet leave <sessionId>挂断委托的语音呼叫。
故障排查
智能体看不到 Google Meet 工具
确认插件已在网关配置中启用并重载网关:
bash
openclaw plugins list | grep google-meet
openclaw googlemeet setup如果您刚刚编辑了 plugins.entries.google-meet,请重启或重载网关。正在运行的智能体只能看到当前网关进程注册的插件工具。
在非 macOS 网关主机上,面向智能体的 google_meet 工具仍然可见,但本地 Chrome talk-back 操作在到达音频桥之前被阻止。本地 Chrome talk-back 音频目前依赖 macOS BlackHole 2ch,因此 Linux 智能体应使用 mode: "transcribe"、Twilio 拨入或 macOS chrome-node 主机,而不是默认的本地 Chrome 智能体路径。
没有已连接的 Google Meet 能力节点
在节点主机上运行:
bash
openclaw plugins enable google-meet
openclaw plugins enable browser
OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 \
openclaw node run --host <gateway-lan-ip> --port 18789 --display-name parallels-macos在网关主机上,批准节点并验证命令:
bash
openclaw devices list
openclaw devices approve <requestId>
openclaw nodes status节点必须已连接并列出 googlemeet.chrome 和 browser.proxy。网关配置必须允许这些节点命令:
json5
{
gateway: {
nodes: {
allowCommands: ["browser.proxy", "googlemeet.chrome"],
},
},
}如果 googlemeet setup 失败 chrome-node-connected 或网关日志报告 gateway token mismatch,使用当前网关令牌重新安装或重启节点。对于 LAN 网关,通常意味着:
bash
OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 \
openclaw node install \
--host <gateway-lan-ip> \
--port 18789 \
--display-name parallels-macos \
--force然后重载节点服务并重新运行:
bash
openclaw googlemeet setup
openclaw nodes status --connected浏览器打开但智能体无法加入
运行 googlemeet test-listen(用于只观察加入)或 googlemeet test-speech(用于实时加入),然后检查返回的 Chrome 健康状态。如果任一探测报告 manualActionRequired: true,向操作员显示 manualActionMessage 并停止重试,直到浏览器操作完成。
常见手动操作:
- 登录 Chrome 配置。
- 从 Meet 主机账户批准访客。
- 当 Chrome 的原生权限提示出现时,授予 Chrome 麦克风/摄像头权限。
- 关闭或修复卡住的 Meet 权限对话框。
不要仅因为 Meet 显示“您希望人们在会议中听到您的声音吗?”就报告“未登录”。这是 Meet 的音频选择插页;OpenClaw 在可用时通过浏览器自动化点击“使用麦克风”,并继续等待真实会议状态。对于仅创建的浏览器回退,OpenClaw 可能点击“继续时不使用麦克风”,因为创建 URL 不需要实时音频路径。
会议创建失败
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并更新插件配置。 - 对于浏览器回退:
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。如果无法做到,错误应提到
meet-audio-choice-required,而不是google-login-required。
智能体加入但不说话
检查实时路径:
bash
openclaw googlemeet setup
openclaw googlemeet doctor使用 mode: "agent" 进行正常的 STT -> OpenClaw 智能体 -> TTS talk-back 路径,或 mode: "bidi" 用于直接实时语音回退。mode: "transcribe" 故意不启动 talk-back 桥。对于只观察调试,在参与者说话后运行 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。 BlackHole 2ch在 Chrome 主机上可见。sox在 Chrome 主机上存在。- Meet 麦克风和扬声器路由通过 OpenClaw 使用的虚拟音频路径。
doctor应显示meet output routed: yes用于本地 Chrome 实时加入。
googlemeet doctor [session-id] 打印会话、节点、通话中状态、手动操作原因、实时提供商连接、realtimeReady、音频输入/输出活动、最后音频时间戳、字节计数器和浏览器 URL。当您需要原始 JSON 时使用 googlemeet status [session-id] --json。当您需要验证 Google Meet OAuth 刷新而不暴露令牌时使用 googlemeet doctor --oauth;添加 --meeting 或 --create-space 当您还需要 Google Meet API 证明时。
如果智能体超时并且您可以看到一个已经打开的 Meet 标签页,检查该标签页而不打开另一个:
bash
openclaw googlemeet recover-tab
openclaw googlemeet recover-tab https://meet.google.com/abc-defg-hij等效的工具操作是 recover_current_tab。它聚焦并检查所选传输的现有 Meet 标签页。使用 chrome 时,它通过网关使用本地浏览器控制;使用 chrome-node 时,它使用配置的 Chrome 节点。它不打开新标签页或创建新会话;它报告当前阻塞项,如登录、准入、权限或音频选择状态。CLI 命令与配置的网关通信,因此网关必须正在运行;chrome-node 还需要 Chrome 节点已连接。
Twilio 设置检查失败
twilio-voice-call-plugin 在 voice-call 未被允许或启用时失败。将其添加到 plugins.allow,启用 plugins.entries.voice-call,并重载网关。
twilio-voice-call-credentials 在 Twilio 后端缺少账户 SID、认证令牌或主叫号码时失败。在网关主机上设置这些:
bash
export TWILIO_ACCOUNT_SID=AC...
export TWILIO_AUTH_TOKEN=...
export TWILIO_FROM_NUMBER=+15550001234twilio-voice-call-webhook 在 voice-call 没有公共 webhook 暴露,或 publicUrl 指向回环或私有网络空间时失败。将 plugins.entries.voice-call.config.publicUrl 设置为公共提供商 URL,或配置 voice-call 隧道/Tailscale 暴露。
回环和私有 URL 对运营商回调无效。不要使用 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:
json5
{
plugins: {
entries: {
"voice-call": {
enabled: true,
config: {
provider: "twilio",
fromNumber: "+15550001234",
publicUrl: "https://voice.example.com/voice/webhook",
},
},
},
},
}对于本地开发,使用隧道或 Tailscale 暴露而不是私有主机 URL:
json5
{
plugins: {
entries: {
"voice-call": {
config: {
tunnel: { provider: "ngrok" },
// 或
tailscale: { mode: "funnel", path: "/voice/webhook" },
},
},
},
},
}然后重启或重载网关并运行:
bash
openclaw googlemeet setup --transport twilio
openclaw voicecall setup
openclaw voicecall smokevoicecall smoke 默认仅检查就绪状态。要试运行特定号码:
bash
openclaw voicecall smoke --to "+15555550123"只有当您有意发起实时外呼通知呼叫时才添加 --yes:
bash
openclaw voicecall smoke --to "+15555550123" --yesTwilio 呼叫开始但从未进入会议
确认 Meet 事件暴露了电话拨入详情。传递确切的拨入号码和 PIN 或自定义 DTMF 序列:
bash
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 是否已排队以及 intro 问候是否已请求。 - 运行
openclaw voicecall status --call-id <id>并确认呼叫仍活跃。 - 运行
openclaw voicecall tail并检查 Twilio webhook 是否到达网关。 - 运行
openclaw logs --follow并查找 Twilio Meet 序列:Google Meet 委托加入,Voice Call 存储并提供连接前 DTMF TwiML,Voice Call 为 Twilio 呼叫提供实时 TwiML,然后 Google Meet 通过voicecall.speak请求 intro 语音。 - 重新运行
openclaw googlemeet setup --transport twilio;绿色设置检查是必需的,但不能证明会议 PIN 序列是正确的。 - 确认拨入号码与同一 Meet 邀请的区域和 PIN 匹配。
- 如果 Meet 响应缓慢或通话记录仍显示要求输入 PIN 的提示(在连接前 DTMF 已发送后),增加
voiceCall.dtmfDelayMs从 12 秒默认值。 - 如果参与者加入但您没有听到问候,检查
openclaw logs --follow中的后 DTMFvoicecall.speak请求以及媒体流 TTS 播放或 Twilio<Say>回退。如果通话记录仍包含“输入会议 PIN”,则电话线路尚未加入 Meet 房间,因此会议参与者不会听到语音。
如果 webhook 未到达,首先调试 Voice Call 插件:提供商必须能够访问 plugins.entries.voice-call.config.publicUrl 或配置的隧道。请参阅 Voice call 故障排查。
注意
Google Meet 的官方媒体 API 是面向接收的,因此向 Meet 通话说话仍然需要参与者路径。此插件保持了这一边界可见:Chrome 处理浏览器参与和本地音频路由;Twilio 处理电话拨入参与。
Chrome talk-back 模式需要 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 会话的活跃 talk-back 音频桥。googlemeet leave 停止该桥。对于通过 Voice Call 插件委托的 Twilio 会话,leave 也会挂断底层语音呼叫。当您还想为 API 管理的空间关闭活跃的 Google Meet 会议时,使用 googlemeet end-active-conference。
相关
常见问题
OpenClaw 智能体加入 Google Meet 需要安装哪些依赖?
在 macOS 主机上,需要安装 blackhole-2ch 和 sox(通过 Homebrew)。还需要配置实时转录提供商(默认 OpenAI,设置 OPENAI_API_KEY)。对于 Chrome 模式,确保 BlackHole 2ch 设备存在,并重启后才使用。对于 Twilio 模式,需要启用 voice-call 插件并提供 Twilio 凭据和公共 webhook URL。
为什么 openclaw googlemeet join 返回 manualActionRequired: true?
通常是因为 Chrome 配置未登录 Google、Meet 需要主机准入、浏览器需要麦克风/摄像头权限,或者 Meet 音频选择插页未被自动化处理。运行 openclaw googlemeet status <session-id> --json 查看 manualActionReason 和 manualActionMessage。按照消息引导操作员完成浏览器步骤,然后重试工具调用。
使用 Twilio 拨打 Meet 时如何传递 PIN?
使用 --pin 123456 或更精确的 --dtmf-sequence ww123456#(w 表示短暂停顿)。确保拨入号码与会议邀请中的号码一致。如果 Meet 响应缓慢,可以增加 voiceCall.dtmfDelayMs(默认 12 秒)来调整等待时间。