Skip to content

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 命令为 googlemeetmeet 保留给更广泛的智能体电话会议工作流。

快速开始

安装本地音频依赖并配置实时转录提供商和常规 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 agent

OPEN 允许任何拥有 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-join

googlemeet 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 字段(apibrowser),以便智能体解释使用了哪条路径。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 --jsongooglemeet doctor 显示 captioningcaptionsEnabledAttemptedtranscriptLineslastCaptionAtlastCaptionSpeakerlastCaptionText 以及简短的 recentTranscript 尾缀,以便操作员判断浏览器是否加入会议以及 Meet 字幕是否产生文本。使用 openclaw googlemeet test-listen <meet-url> --transport chrome-node 进行是/否探测:它以 transcribe 模式加入,等待新的字幕或转录移动,然后返回 listenVerifiedlistenTimedOut、手动操作字段和最新字幕健康状态。

在实时会话期间,google_meet 状态包含浏览器和音频桥健康状态,如 inCallmanualActionRequiredproviderConnectedrealtimeReadyaudioInputActiveaudioOutputActive、最后输入/输出时间戳、字节计数器和桥关闭状态。如果出现安全的 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

如果 &lt;gateway-host&gt; 是 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 restart

OPENCLAW_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,附带 manualActionReasonmanualActionMessage。智能体应停止重试加入,报告该确切消息加上当前 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-meetopenclaw 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-plugintwilio-voice-call-credentialstwilio-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 中:

  1. 创建或选择一个 Google Cloud 项目。

  2. 为该项目启用 Google Meet REST API

  3. 配置 OAuth 同意屏幕。

    • 对于 Google Workspace 组织,Internal 最简单。
    • 对于个人/测试设置,使用 External;在测试阶段,将每个将授权应用的 Google 账户添加为测试用户。
  4. 添加 OpenClaw 请求的范围:

    • https://www.googleapis.com/auth/meetings.space.created
    • https://www.googleapis.com/auth/meetings.space.readonly
    • https://www.googleapis.com/auth/meetings.space.settings
    • https://www.googleapis.com/auth/meetings.conference.media.readonly
  5. 创建 OAuth 客户端 ID。

    • 应用类型:Web application

    • 授权重定向 URI:

      text
      http://localhost:8085/oauth2callback
  6. 复制客户端 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 --manual

JSON 输出包含:

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 报告仅包含状态字段如 okconfiguredtokenSourceexpiresAt 和检查消息;不打印访问令牌、刷新令牌或客户端密钥。

常见结果:

检查含义
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-hij

doctor --oauth --meetingresolve-space 证明对授权 Google 账户可访问的现有空间进行读取访问。这些检查返回 403 通常意味着 Google Meet REST API 被禁用、同意的刷新令牌缺少所需范围,或 Google 账户无法访问该 Meet 空间。刷新令牌错误意味着重新运行 openclaw googlemeet auth login --json 并存储新的 oauth 块。

浏览器回退不需要 OAuth 凭据。在该模式下,Google 认证来自所选节点上已登录的 Chrome 配置,而不是来自 OpenClaw 配置。

这些环境变量可作为回退:

  • OPENCLAW_GOOGLE_MEET_CLIENT_IDGOOGLE_MEET_CLIENT_ID
  • OPENCLAW_GOOGLE_MEET_CLIENT_SECRETGOOGLE_MEET_CLIENT_SECRET
  • OPENCLAW_GOOGLE_MEET_REFRESH_TOKENGOOGLE_MEET_REFRESH_TOKEN
  • OPENCLAW_GOOGLE_MEET_ACCESS_TOKENGOOGLE_MEET_ACCESS_TOKEN
  • OPENCLAW_GOOGLE_MEET_ACCESS_TOKEN_EXPIRES_ATGOOGLE_MEET_ACCESS_TOKEN_EXPIRES_AT
  • OPENCLAW_GOOGLE_MEET_DEFAULT_MEETINGGOOGLE_MEET_DEFAULT_MEETING
  • OPENCLAW_GOOGLE_MEET_PREVIEW_ACKGOOGLE_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 时,artifactsattendance 默认使用最新的会议记录。当您想要每个保留的记录时传递 --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 &lt;query&gt; 搜索匹配的事件文本,--calendar &lt;id&gt; 用于非主要日历。日历查找需要包含 Calendar events readonly 范围的新鲜 OAuth 登录。calendar-events 预览匹配的 Meet 事件,并标记 latestartifactsattendanceexport 将选择的事件。

如果您已经知道会议记录 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-run

artifacts 返回会议记录元数据以及参与者、录制、转录、结构化转录条目和智能笔记资源元数据(当 Google 为会议暴露时)。对于大型会议,使用 --no-transcript-entries 跳过条目查找。attendance 将参与者展开为参与者会话行,包含首次/末次看到时间、总会话时长、迟到/早退标志,并通过已登录用户或显示名称合并重复参与者资源。传递 --no-merge-duplicates 以保留原始参与者资源分离,--late-after-minutes 调整迟到检测,--early-before-minutes 调整早退检测。

export 写入包含 summary.mdattendance.csvtranscript.mdartifacts.jsonattendance.jsonmanifest.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_IDGOOGLE_MEET_CLIENT_ID 提供 OAuth 客户端 id。
  • OPENCLAW_GOOGLE_MEET_REFRESH_TOKENGOOGLE_MEET_REFRESH_TOKEN 提供刷新令牌。
  • 可选:OPENCLAW_GOOGLE_MEET_CLIENT_SECRETOPENCLAW_GOOGLE_MEET_ACCESS_TOKENOPENCLAW_GOOGLE_MEET_ACCESS_TOKEN_EXPIRES_AT 使用相同的无 OPENCLAW_ 前缀回退名称。

基础 artifact/attendance 实时烟雾需要 https://www.googleapis.com/auth/meetings.space.readonlyhttps://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-node
  • chrome.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-call
  • chrome.audioFormat: "pcm16-24khz":命令对音频格式。仅对仍发出电话音频的遗留/自定义命令对使用 "g711-ulaw-8khz"
  • chrome.audioBufferBytes: 4096:生成的 Chrome 命令对音频命令的 SoX 处理缓冲区。这是 SoX 默认 8192 字节缓冲区的一半,减少默认管道延迟,同时保留在繁忙主机上提高的空间。低于 SoX 最小值的值被限制为 17 字节
  • chrome.audioInputCommand:从 CoreAudio BlackHole 2ch 读取并用 chrome.audioFormat 写入音频的 SoX 命令
  • chrome.audioOutputCommand:以 chrome.audioFormat 读取音频并写入 CoreAudio BlackHole 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 模式用于实时转录的提供商 id
  • realtime.voiceProviderbidi 模式用于直接实时语音的提供商 id。设置为 "google" 以使用 Gemini Live,同时保持智能体模式转录使用 OpenAI
  • realtime.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" 配合 sessionIdmessage 使实时智能体立即说话。使用 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:&lt;id&gt;:subagent:google-meet:&lt;session&gt; 会话键,以便后续问题保留会议上下文,同时从配置的智能体继承常规智能体策略。

realtime.toolPolicy 控制咨询运行:

  • safe-read-only:暴露咨询工具,并将常规智能体限制为 readweb_searchweb_fetchx_searchmemory_searchmemory_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.chromebrowser.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-plugintwilio-voice-call-credentialstwilio-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.chromebrowser.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.clientIdoauth.refreshToken,或存在匹配的 OPENCLAW_GOOGLE_MEET_* 环境变量。
  • 对于 API 创建:刷新令牌是在创建支持添加后生成的。较旧的令牌可能缺少 meetings.space.created 范围;重新运行 openclaw googlemeet auth login --json 并更新插件配置。
  • 对于浏览器回退:defaultTransport: "chrome-node"chromeNode.node 指向具有 browser.proxygooglemeet.chrome 的已连接节点。
  • 对于浏览器回退:该节点上的 OpenClaw Chrome 配置已登录 Google 并且可以打开 https://meet.google.com/new
  • 对于浏览器回退:重试在打开新标签页之前重用现有的 https://meet.google.com/new 或 Google 账户提示标签页。如果智能体超时,重试工具调用而不是手动打开另一个 Meet 标签页。
  • 对于浏览器回退:如果工具返回 manualActionRequired: true,使用返回的 browser.nodeIdbrowser.targetIdbrowserUrlmanualActionMessage 引导操作员。不要在该操作完成前循环重试。
  • 对于浏览器回退:如果 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 &lt;session-id&gt; 并检查 captioningtranscriptLineslastCaptionText。如果 inCall 为 true 但 transcriptLines 保持为 0,可能 Meet 字幕被禁用、自观察器安装以来无人说话、Meet UI 已更改,或者实时字幕在会议语言/账户上不可用。

googlemeet test-speech 始终检查实时路径,并报告该调用是否观察到桥输出字节。如果 speechOutputVerified 为 false 且 speechOutputTimedOut 为 true,则实时提供商可能接受了话语,但 OpenClaw 未看到新的输出字节到达 Chrome 音频桥。

同时验证:

  • 网关主机上有实时提供商密钥可用,如 OPENAI_API_KEYGEMINI_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-pluginvoice-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=+15550001234

twilio-voice-call-webhookvoice-call 没有公共 webhook 暴露,或 publicUrl 指向回环或私有网络空间时失败。将 plugins.entries.voice-call.config.publicUrl 设置为公共提供商 URL,或配置 voice-call 隧道/Tailscale 暴露。

回环和私有 URL 对运营商回调无效。不要使用 localhost127.0.0.10.0.0.010.x172.16.x-172.31.x192.168.x169.254.xfc00::/7fd00::/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 smoke

voicecall smoke 默认仅检查就绪状态。要试运行特定号码:

bash
openclaw voicecall smoke --to "+15555550123"

只有当您有意发起实时外呼通知呼叫时才添加 --yes

bash
openclaw voicecall smoke --to "+15555550123" --yes

Twilio 呼叫开始但从未进入会议

确认 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 &lt;session-id&gt; 以确认委托的 Twilio 呼叫 ID、DTMF 是否已排队以及 intro 问候是否已请求。
  • 运行 openclaw voicecall status --call-id &lt;id&gt; 并确认呼叫仍活跃。
  • 运行 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 中的后 DTMF voicecall.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.audioInputCommandchrome.audioOutputCommand 一样,它是一个操作员配置的本地命令。使用显式的可信命令路径或参数列表,不要指向来自不可信位置的脚本。

googlemeet speak 触发 Chrome 会话的活跃 talk-back 音频桥。googlemeet leave 停止该桥。对于通过 Voice Call 插件委托的 Twilio 会话,leave 也会挂断底层语音呼叫。当您还想为 API 管理的空间关闭活跃的 Google Meet 会议时,使用 googlemeet end-active-conference

相关

常见问题

OpenClaw 智能体加入 Google Meet 需要安装哪些依赖?

在 macOS 主机上,需要安装 blackhole-2chsox(通过 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 &lt;session-id&gt; --json 查看 manualActionReasonmanualActionMessage。按照消息引导操作员完成浏览器步骤,然后重试工具调用。

使用 Twilio 拨打 Meet 时如何传递 PIN?

使用 --pin 123456 或更精确的 --dtmf-sequence ww123456#w 表示短暂停顿)。确保拨入号码与会议邀请中的号码一致。如果 Meet 响应缓慢,可以增加 voiceCall.dtmfDelayMs(默认 12 秒)来调整等待时间。