chore(i18n): refresh zh-CN translations

This commit is contained in:
openclaw-docs-i18n[bot] 2026-04-24 22:16:20 +00:00
parent fd92d89bc1
commit db2d6efc55
2 changed files with 227 additions and 234 deletions

View File

@ -1,36 +1,36 @@
---
read_when:
- 你希望一个 OpenClaw 智能体加入一个 Google Meet 通话
- 你希望一个 OpenClaw 智能体创建一个新的 Google Meet 通话
- 你希望一个 OpenClaw 智能体加入 Google Meet 通话
- 你希望一个 OpenClaw 智能体创建新的 Google Meet 通话
- 你正在将 Chrome、Chrome 节点或 Twilio 配置为 Google Meet 传输方式
summary: Google Meet 插件:通过 Chrome 或 Twilio 加入明确的 Meet URL并使用实时语音默认设置
summary: Google Meet 插件:通过 Chrome 或 Twilio 加入显式的 Meet URL并默认启用实时语音
title: Google Meet 插件
x-i18n:
generated_at: "2026-04-24T22:10:12Z"
generated_at: "2026-04-24T22:14:45Z"
model: gpt-5.4
provider: openai
source_hash: d45b56e334b27509372a4f313262697eb026416077b39fa65ce7c150397ceb4d
source_hash: 2438d52c6a3c98e9d2aa345790b72475bc26c3497580d6af15b6df221705864a
source_path: plugins/google-meet.md
workflow: 15
---
OpenClaw 的 Google Meet 参与支持——该插件按设计即为显式模式
OpenClaw 的 Google Meet 参与支持——该插件在设计上是显式的
- 它只会加入明确`https://meet.google.com/...` URL。
- 它可以通过 Google Meet API 创建一个新的 Meet 空间,然后加入返回的 URL。
- 它只会加入显式`https://meet.google.com/...` URL。
- 它可以通过 Google Meet API 创建新的 Meet 空间,然后加入返回的 URL。
- `realtime` 语音是默认模式。
- 当需要更深入的推理或工具时,实时语音可以回调到完整的 OpenClaw 智能体。
- 智能体通过 `mode` 选择加入行为:实时收听/回话使用 `realtime`若只加入/控制浏览器而不启用实时语音桥接,则使用 `transcribe`
- 认证起点是个人 Google OAuth或一个已经登录的 Chrome 配置文件。
- 没有自动的同意提示播报
- 实时语音在需要更深入推理或工具时,可以回调到完整的 OpenClaw 智能体。
- 智能体通过 `mode` 选择加入行为:实时收听/回话使用 `realtime`加入/控制浏览器但不启用实时语音桥接则使用 `transcribe`
- 认证起始方式可以是个人 Google OAuth或已登录的 Chrome 配置文件。
- 不会自动播报同意声明
- 默认的 Chrome 音频后端是 `BlackHole 2ch`
- Chrome 可以在本地运行,也可以在已配对的节点主机上运行。
- Twilio 接受拨入号码以及可选的 PIN 或 DTMF 序列。
- CLI 命令是 `googlemeet``meet` 保留给更广泛的智能体电话会议工作流使用
- CLI 命令是 `googlemeet``meet` 保留给更广义的智能体电话会议工作流
## 快速开始
安装本地音频依赖并配置一个后端实时语音提供商。OpenAI 是默认Google Gemini Live 也可与 `realtime.provider: "google"` 一起使用:
安装本地音频依赖并配置后端实时语音提供商。OpenAI 是默认项Google Gemini Live 也可与 `realtime.provider: "google"` 配合使用:
```bash
brew install blackhole-2ch sox
@ -52,7 +52,7 @@ system_profiler SPAudioDataType | grep -i BlackHole
command -v rec play
```
启用插件:
启用插件:
```json5
{
@ -73,7 +73,7 @@ command -v rec play
openclaw googlemeet setup
```
设置输出旨在让智能体可读。它会报告 Chrome 配置文件、音频桥接、节点固定、延迟的实时介绍,以及在配置了 Twilio 委派时,`voice-call` 插件和 Twilio 凭证是否已就绪。对于任何 `ok: false` 的检查项,在要求智能体加入之前都应视为阻塞问题。脚本或机器可读输出请使用 `openclaw googlemeet setup --json`
设置输出旨在供智能体读取。它会报告 Chrome 配置文件、音频桥接、节点固定、延迟的实时介绍,以及在配置了 Twilio 委派时,`voice-call` 插件和 Twilio 凭证是否已就绪。请求智能体加入前,将任何 `ok: false` 检查都视为阻塞项。对脚本或机器可读输出使用 `openclaw googlemeet setup --json`
加入会议:
@ -92,7 +92,7 @@ openclaw googlemeet join https://meet.google.com/abc-defg-hij
}
```
创建一个新会议,然后加入:
创建新会议,然后加入:
```bash
openclaw googlemeet create
@ -101,12 +101,12 @@ openclaw googlemeet join https://meet.google.com/new-abcd-xyz --transport chrome
`googlemeet create` 有两条路径:
- API 创建:当已配置 Google Meet OAuth 凭证时使用。这是最可预测的路径,并且不依赖浏览器 UI 状态。
- 浏览器回退:当缺少 OAuth 凭证时使用。OpenClaw 使用固定的 Chrome 节点,打开 `https://meet.google.com/new`,等待 Google 重定向到真实的会议代码 URL然后返回该 URL。此路径要求节点上的 OpenClaw Chrome 配置文件已登录 Google。浏览器自动化会处理 Meet 自身的首次麦克风提示;该提示不会被视为 Google 登录失败。
- API 创建:当配置了 Google Meet OAuth 凭证时使用。这是最确定的路径,不依赖浏览器 UI 状态。
- 浏览器回退:当 OAuth 凭证缺失时使用。OpenClaw 使用固定的 Chrome 节点,打开 `https://meet.google.com/new`,等待 Google 重定向到真实的会议代码 URL然后返回该 URL。此路径要求节点上的 OpenClaw Chrome 配置文件已登录 Google。浏览器自动化会处理 Meet 自身的首次运行麦克风提示;该提示不会被视为 Google 登录失败。
命令输出包含一个 `source` 字段(`api` 或 `browser`),这样智能体就可以说明使用了哪条路径。
命令输出包含 `source` 字段(`api` 或 `browser`),这样智能体就可以说明使用了哪条路径。
或者告诉智能体:“创建一个 Google Meet用实时语音加入并把链接发给我。” 智能体应先用 `action: "create"` 调用 `google_meet`,复制返回的 `meetingUri`,然后再`action: "join"` 和该 URL 调用 `google_meet`
或者告诉智能体:“创建一个 Google Meet用实时语音加入并把链接发给我。” 智能体应先调用 `google_meet` 并使`action: "create"`,复制返回的 `meetingUri`,然后再调用 `google_meet` 并使用 `action: "join"` 以及该 URL
```json
{
@ -123,40 +123,40 @@ openclaw googlemeet join https://meet.google.com/new-abcd-xyz --transport chrome
}
```
若要以仅观察/仅浏览器控制的方式加入,请设置 `"mode": "transcribe"`。这不会启动双向实时模型桥接,因此不会在会议中回话。
如果只是观察或控制浏览器加入,请设置 `"mode": "transcribe"`。这不会启动双向实时模型桥接,因此不会在会议中回话。
Chrome 会以已登录的 Chrome 配置文件身份加入。在 Meet 中,为 OpenClaw 使用的麦克风/扬声器路径选择 `BlackHole 2ch`。为了获得干净的双工音频,请使用独立的虚拟设备或类似 Loopback 的音频拓扑;单个 BlackHole 设备足以完成首次冒烟测试,但可能会产生回声。
Chrome 会以已登录的 Chrome 配置文件身份加入。在 Meet 中,选择 `BlackHole 2ch` 作为 OpenClaw 使用的麦克风/扬声器路径。为了获得干净的双向音频,请使用独立的虚拟设备或类似 Loopback 的音频图;单个 BlackHole 设备足以完成首次冒烟测试,但可能会产生回声。
### 本地 Gateway 网关 + Parallels Chrome
你**不**需要在 macOS VM 中运行完整的 OpenClaw Gateway 网关 或模型 API 密钥,只是为了让 VM 承担 Chrome。你可以在本地运行 Gateway 网关和智能体,然后在 VM 中运行一个节点主机。只需在 VM 中启用一次内置插件,这样节点就会通告 Chrome 命令:
你**不**需要在 macOS VM 内运行完整的 OpenClaw Gateway 网关或模型 API 密钥,只是为了让 VM 托管 Chrome。你可以在本地运行 Gateway 网关和智能体,然后在 VM 中运行节点主机。只需在 VM 中启用一次内置插件,这样节点就会通告 Chrome 命令:
各组件运行位置如下
各组件运行位置:
- Gateway 网关主机OpenClaw Gateway 网关、智能体工作区、模型/API 密钥、实时提供商,以及 Google Meet 插件配置。
- Parallels macOS VMOpenClaw CLI/节点主机、Google Chrome、SoX、BlackHole 2ch以及一个已登录 Google 的 Chrome 配置文件。
- VM 中不需要Gateway 网关服务、智能体配置、OpenAI/GPT 密钥或模型提供商设置。
安装 VM 依赖:
安装 VM 依赖
```bash
brew install blackhole-2ch sox
```
安装 BlackHole 后重启 VM以便 macOS 暴露 `BlackHole 2ch`
安装 BlackHole 后重启 VM这样 macOS 才会暴露 `BlackHole 2ch`
```bash
sudo reboot
```
重启后,验证 VM 可以看到音频设备和 SoX 命令:
重启后,验证 VM 看到音频设备和 SoX 命令:
```bash
system_profiler SPAudioDataType | grep -i BlackHole
command -v rec play
```
在 VM 中安装或更新 OpenClaw然后在那里启用内置插件:
在 VM 中安装或更新 OpenClaw然后在其中启用内置插件:
```bash
openclaw plugins enable google-meet
@ -168,7 +168,7 @@ openclaw plugins enable google-meet
openclaw node run --host <gateway-host> --port 18789 --display-name parallels-macos
```
如果 `<gateway-host>`局域网 IP 且你未使用 TLS除非你为这个受信任的私有网络显式启用否则节点会拒绝明文 WebSocket
如果 `<gateway-host>` LAN IP并且你未使用 TLS节点会拒绝明文 WebSocket除非你为该受信任私有网络显式启用
```bash
OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 \
@ -183,16 +183,16 @@ OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 \
openclaw node restart
```
`OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1` 是进程环境变量,不是 `openclaw.json` 设置。`openclaw node install` 会在安装命令存在该变量时,将其存储到 LaunchAgent 环境中。
`OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1` 是进程环境,不是 `openclaw.json` 设置。`openclaw node install` 会在安装命令中检测到它存在时,将其存储到 LaunchAgent 环境中。
在 Gateway 网关主机上批准该节点:
从 Gateway 网关主机批准该节点:
```bash
openclaw devices list
openclaw devices approve <requestId>
```
确认 Gateway 网关可以看到该节点,并且它同时通告了 `googlemeet.chrome`浏览器能力/`browser.proxy`
确认 Gateway 网关能看到该节点,并且它通告了 `googlemeet.chrome` 以及浏览器能力/`browser.proxy`
```bash
openclaw nodes status
@ -228,61 +228,62 @@ openclaw nodes status
}
```
现在可从 Gateway 网关主机正常加入:
现在可从 Gateway 网关主机正常加入:
```bash
openclaw googlemeet join https://meet.google.com/abc-defg-hij
```
或者让智能体使用带有 `transport: "chrome-node"``google_meet` 工具
或者要求智能体使用 `google_meet` 工具,并设置 `transport: "chrome-node"`
若要执行一个单命令冒烟测试,创建或复用一个会话、说出一段已知短语,并打印会话健康状态:
如需一个单命令冒烟测试,以创建或复用会话、说出已知短语并打印会话健康状态:
```bash
openclaw googlemeet test-speech https://meet.google.com/abc-defg-hij
```
加入过程中OpenClaw 浏览器自动化会填写访客名、点击加入/请求加入,并在出现提示时接受 Meet 首次运行的“使用麦克风”选项。在仅通过浏览器创建会议时,如果 Meet 没有暴露使用麦克风按钮,它也可以在不使用麦克风的情况下继续通过同一提示。如果浏览器配置文件未登录、Meet 正在等待主持人准、Chrome 需要麦克风/摄像头权限,或者 Meet 卡在自动化无法解决的提示上,join/test-speech 结果会报告 `manualActionRequired: true`,并附带 `manualActionReason``manualActionMessage`。智能体应停止重试加入,报告该确切消息以及当前的 `browserUrl`/`browserTitle`,并且只在手动浏览器操作完成后再重试。
加入过程中OpenClaw 浏览器自动化会填写访客名、点击加入/请求加入,并在出现时接受 Meet 首次运行的“使用麦克风”选择。在仅通过浏览器创建会议时,如果 Meet 未暴露使用麦克风按钮,它也可以在无麦克风的情况下继续越过同一提示。如果浏览器配置文件未登录、Meet 正在等待主持人准、Chrome 需要麦克风/摄像头权限,或者 Meet 卡在自动化无法解决的提示上,加入/`test-speech` 结果会报告 `manualActionRequired: true`,并附带 `manualActionReason``manualActionMessage`。智能体应停止重试加入,报告该确切消息以及当前的 `browserUrl`/`browserTitle`,并且只在手动浏览器操作完成后再重试。
如果省略`chromeNode.node`OpenClaw 只会在恰好有一个已连接节点同时通告 `googlemeet.chrome` 和浏览器控制时自动选择。如果连接了多个具备能力的节点,请将 `chromeNode.node` 设置为节点 id、显示名称或远程 IP。
如果省略 `chromeNode.node`,只有在恰好存在一个已连接节点同时通告 `googlemeet.chrome` 和浏览器控制时OpenClaw 才会自动选择。如果连接了多个具备能力的节点,请将 `chromeNode.node` 设置为节点 id、显示名称或远程 IP。
常见故障检查:
- `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"]`
- `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 on the node`:在 VM 中安装 `blackhole-2ch` 并重启 VM。
- Chrome 已打开但无法加入:在 VM 登录浏览器配置文件,或保持设置 `chrome.guestName`便访客加入。访客自动加入使用 OpenClaw 通过节点浏览器代理进行的浏览器自动化;请确保节点浏览器配置指向你想使用的配置文件,例如 `browser.defaultProfile: "user"`某个已存在会话的命名配置文件。
- 重复的 Meet 标签页:保持启用 `chrome.reuseExistingTab: true`。OpenClaw 会在打开新标签页前,先激活同 Meet URL 的现有标签页。
- 没有音频:在 Meet 中,将麦克风/扬声器路由到 OpenClaw 使用的虚拟音频设备路径;为获得干净的双工音频,请使用独立虚拟设备或类似 Loopback 的路由。
- Chrome 已打开但无法加入:在 VM 登录浏览器配置文件,或保持设置 `chrome.guestName` 以访客身份加入。访客自动加入使用 OpenClaw 通过节点浏览器代理进行的浏览器自动化;请确保节点浏览器配置指向你想使用的配置文件,例如 `browser.defaultProfile: "user"` 或已存在会话的命名配置文件。
- 重复的 Meet 标签页:保持启用 `chrome.reuseExistingTab: true`。OpenClaw 会在打开新标签页前激活同 Meet URL 的现有标签页。
- 没有音频:在 Meet 中,将麦克风/扬声器路由到 OpenClaw 使用的虚拟音频设备路径;使用独立虚拟设备或类似 Loopback 的路由以获得干净的双向音频
## 安装说明
Chrome 的实时默认模式使用两个外部工具:
Chrome 实时默认值使用两个外部工具:
- `sox`:命令行音频工具。该插件使用它的 `rec``play` 命令来实现默认的 8 kHz G.711 mu-law 音频桥接。
- `blackhole-2ch`macOS 虚拟音频驱动。它会创建 `BlackHole 2ch` 音频设备,供 Chrome/Meet 路由使用
- `blackhole-2ch`macOS 虚拟音频驱动。它会创建 `BlackHole 2ch` 音频设备,供 Chrome/Meet 通过其进行路由。
OpenClaw 不会内置或重新分发这两个软件包。文档要求用户通过 Homebrew 将它们作为主机依赖安装。SoX 的许可证为 `LGPL-2.0-only AND GPL-2.0-only`BlackHole 为 GPL-3.0。如果你构建了一个将 BlackHole 与 OpenClaw 一起打包的安装程序或 appliance请审查 BlackHole 上游许可条款,或从 Existential Audio 获取单独许可。
OpenClaw 不会内置或重新分发这两个软件包。文档要求用户通过 Homebrew 将它们作为主机依赖安装。SoX 采用 `LGPL-2.0-only AND GPL-2.0-only` 许可BlackHole 采用 GPL-3.0 许可。如果你构建的安装程序或设备将 BlackHole 与 OpenClaw 一起打包,请查看 BlackHole 上游许可条款,或从 Existential Audio 获取单独许可。
## 传输方式
### Chrome
Chrome 传输会在 Google Chrome 中打开 Meet URL并以已登录的 Chrome 配置文件身份加入。在 macOS 上,插件会在启动前检查 `BlackHole 2ch`。如果已配置,它还会在打开 Chrome 前运行音频桥接健康检查命令和启动命令。当 Chrome/音频运行在 Gateway 网关主机上时使用 `chrome`;当 Chrome/音频运行在已配对节点(例如 Parallels macOS VM上时使用 `chrome-node`
Chrome 传输方式会在 Google Chrome 中打开 Meet URL并以已登录的 Chrome 配置文件身份加入。在 macOS 上,插件会在启动前检查 `BlackHole 2ch`。如果已配置,它还会在打开 Chrome 前运行音频桥接健康检查命令和启动命令。当 Chrome/音频位于 Gateway 网关主机上时,请使用 `chrome`;当 Chrome/音频位于已配对节点上(例如 Parallels macOS VM使用 `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
```
通过本地 OpenClaw 音频桥接来路由 Chrome 的麦克风和扬声器音频。如果未安装 `BlackHole 2ch`,加入会以设置错误失败,而不是在没有音频路径的情况下静默加入。
将 Chrome 的麦克风和扬声器音频路由到本地 OpenClaw 音频桥接。如果未安装 `BlackHole 2ch`,加入会因设置错误而失败,而不是在没有音频路径的情况下静默加入。
### Twilio
Twilio 传输是委派给 Voice Call 插件的严格拨号计划。它不会解析 Meet 页面来提取电话号码。
Twilio 传输方式是一个严格的拨号计划,委派给 Voice Call 插件。它不会从 Meet 页面解析电话号码。
Chrome 参与不可用,或者你想使用电话拨入作为回退时,可使用该方式。Google Meet 必须为该会议提供电话拨入号码和 PINOpenClaw 不会从 Meet 页面中发现这些信息。
无法使用 Chrome 参与,或你想要电话拨入回退方案时,请使用此方式。Google Meet 必须为该会议提供电话拨入号码和 PINOpenClaw 不会从 Meet 页面中发现这些信息。
在 Gateway 网关主机上启用 Voice Call 插件,而不是在 Chrome 节点上启用
在 Gateway 网关主机上启用 Voice Call 插件,而不是在 Chrome 节点上:
```json5
{
@ -293,7 +294,7 @@ Twilio 传输是委派给 Voice Call 插件的严格拨号计划。它不会解
enabled: true,
config: {
defaultTransport: "chrome-node",
// or set "twilio" if Twilio should be the default
// 或设置为 "twilio",如果 Twilio 应为默认值
},
},
"voice-call": {
@ -315,7 +316,7 @@ export TWILIO_AUTH_TOKEN=...
export TWILIO_FROM_NUMBER=+15550001234
```
启用 `voice-call` 后,重启或重新加载 Gateway 网关;在 Gateway 网关进程重新加载前,插件配置更不会出现在已运行的 Gateway 网关进程中。
启用 `voice-call` 后,重启或重新加载 Gateway 网关;在 Gateway 网关进程重新加载前,插件配置更不会出现在已运行的 Gateway 网关进程中。
然后验证:
@ -325,7 +326,7 @@ openclaw plugins list | grep -E 'google-meet|voice-call'
openclaw googlemeet setup
```
当 Twilio 委派已正确接通时`googlemeet setup` 会包含成功的 `twilio-voice-call-plugin``twilio-voice-call-credentials` 检查。
当 Twilio 委派接线完成后`googlemeet setup` 会包含成功的 `twilio-voice-call-plugin``twilio-voice-call-credentials` 检查。
```bash
openclaw googlemeet join https://meet.google.com/abc-defg-hij \
@ -345,7 +346,7 @@ openclaw googlemeet join https://meet.google.com/abc-defg-hij \
## OAuth 和预检
由于 `googlemeet create` 可以回退到浏览器自动化,因此 OAuth 对于创建 Meet 链接来说是可选的。当你想使用官方 API 创建、空间解析或 Meet Media API 预检时,请配置 OAuth。
OAuth 对于创建 Meet 链接来说是可选的,因为 `googlemeet create` 可以回退到浏览器自动化。当你需要官方 API 创建、空间解析或 Meet Media API 预检时,请配置 OAuth。
Google Meet API 访问首先使用个人 OAuth 客户端。配置 `oauth.clientId`,并可选配置 `oauth.clientSecret`,然后运行:
@ -353,13 +354,13 @@ Google Meet API 访问首先使用个人 OAuth 客户端。配置 `oauth.clientI
openclaw googlemeet auth login --json
```
该命令会输出一个带有刷新令牌的 `oauth` 配置块。它使用 PKCE、位于 `http://localhost:8085/oauth2callback` 的 localhost 回调,以及通过 `--manual` 进行的手动复制/粘贴流程。
该命令会打印一个带有刷新令牌的 `oauth` 配置块。它使用 PKCE、`http://localhost:8085/oauth2callback` 的 localhost 回调,以及通过 `--manual` 进行的手动复制/粘贴流程。
OAuth 同意范围包括 Meet 空间创建、Meet 空间读取权限,以及 Meet 会议媒体读取权限。如果你在支持会议创建功能之前就已完成认证,请重新运行 `openclaw googlemeet auth login --json`,以便刷新令牌具备 `meetings.space.created` 作用域
OAuth 同意范围包括 Meet 空间创建、Meet 空间读取访问以及 Meet 会议媒体读取访问。如果你在会议创建支持存在之前就已完成认证,请重新运行 `openclaw googlemeet auth login --json`,以便刷新令牌包含 `meetings.space.created` scope
浏览器回退不需要 OAuth 凭证。在该模式下Google 认证来自所选节点上已登录的 Chrome 配置文件,而不是 OpenClaw 配置。
浏览器回退不需要 OAuth 凭证。在该模式下Google 认证来自所选节点上已登录的 Chrome 配置文件,而不是来自 OpenClaw 配置。
支持以下环境变量作为回退:
接受以下环境变量作为回退:
- `OPENCLAW_GOOGLE_MEET_CLIENT_ID``GOOGLE_MEET_CLIENT_ID`
- `OPENCLAW_GOOGLE_MEET_CLIENT_SECRET``GOOGLE_MEET_CLIENT_SECRET`
@ -376,7 +377,7 @@ OAuth 同意范围包括 Meet 空间创建、Meet 空间读取权限,以及 Me
openclaw googlemeet resolve-space --meeting https://meet.google.com/abc-defg-hij
```
在进行媒体相关工作前运行预检:
在进行媒体工作前运行预检:
```bash
openclaw googlemeet preflight --meeting https://meet.google.com/abc-defg-hij
@ -388,7 +389,7 @@ openclaw googlemeet preflight --meeting https://meet.google.com/abc-defg-hij
openclaw googlemeet create
```
该命令会输出新的 `meeting uri` 和来源。有 OAuth 凭证时,它使用官方 Google Meet API。没有 OAuth 凭证时,它会使用固定 Chrome 节点上已登录的浏览器配置文件作为回退。智能体可以用 `action: "create"` 调用 `google_meet` 工具来创建会议,然后用返回的 `meetingUri` 调用 `action: "join"`
该命令会打印新的 `meeting uri` 和来源。使用 OAuth 凭证时,它会使用官方 Google Meet API。没有 OAuth 凭证时,它会回退到使用固定 Chrome 节点上已登录的浏览器配置文件。智能体可以使`google_meet` 工具并设置 `action: "create"` 来创建会议,然后使用返回的 `meetingUri` 调用 `action: "join"`
浏览器回退的 JSON 输出示例:
@ -417,13 +418,13 @@ API 创建的 JSON 输出示例:
}
```
创建 Meet 只会创建或发现会议 URL。Chrome 或 `chrome-node` 传输仍然需要一个已登录 Google 的 Chrome 配置文件才能通过浏览器加入。如果该配置文件已退出登录OpenClaw 会报告 `manualActionRequired: true` 或浏览器回退错误,并要求操作员先完成 Google 登录后再重试
创建 Meet 只会创建或发现会议 URL。`chrome` 或 `chrome-node` 传输方式仍然需要一个已登录 Google 的 Chrome 配置文件才能通过浏览器加入。如果该配置文件已退出登录OpenClaw 会报告 `manualActionRequired: true` 或浏览器回退错误,并要求操作员在重试前完成 Google 登录
只有在确认你的 Cloud 项目、OAuth 主体和会议参与者都已加入 Google Workspace Developer Preview Program for Meet media APIs 后,才设置 `preview.enrollmentAcknowledged: true`
仅在确认你的 Cloud 项目、OAuth principal 和会议参与者都已加入用于 Meet 媒体 API 的 Google Workspace Developer Preview Program 后,才设置 `preview.enrollmentAcknowledged: true`
## 配置
常见的 Chrome 实时路径只需要启用插件、安装 BlackHole、SoX以及一个后端实时语音提供商密钥。OpenAI 是默认选项;设置 `realtime.provider: "google"` 可使用 Google Gemini Live
常见的 Chrome 实时路径只需要启用插件、安装 BlackHole、SoX以及配置后端实时语音提供商密钥。OpenAI 是默认值;设置 `realtime.provider: "google"` 可使用 Google Gemini Live
```bash
brew install blackhole-2ch sox
@ -453,16 +454,16 @@ export GEMINI_API_KEY=...
- `defaultMode: "realtime"`
- `chromeNode.node``chrome-node` 的可选节点 id/名称/IP
- `chrome.audioBackend: "blackhole-2ch"`
- `chrome.guestName: "OpenClaw Agent"`:在已退出登录的 Meet 访客面上使用的名称
- `chrome.autoJoin: true`:在 `chrome-node`,通过 OpenClaw 浏览器自动化尽力填充访客名并点击“立即加入”
- `chrome.guestName: "OpenClaw Agent"`:在已退出登录的 Meet 访客面上使用的名称
- `chrome.autoJoin: true`:在 `chrome-node`通过 OpenClaw 浏览器自动化尽力填写访客名并点击立即加入
- `chrome.reuseExistingTab: true`:激活现有 Meet 标签页,而不是打开重复标签页
- `chrome.waitForInCallMs: 20000`:在触发实时介绍前,等待 Meet 标签页报告已在通话中
- `chrome.waitForInCallMs: 20000`:在触发实时介绍前,等待 Meet 标签页报告已在通话中
- `chrome.audioInputCommand`:将 8 kHz G.711 mu-law 音频写入 stdout 的 SoX `rec` 命令
- `chrome.audioOutputCommand`:从 stdin 读取 8 kHz G.711 mu-law 音频的 SoX `play` 命令
- `realtime.provider: "openai"`
- `realtime.toolPolicy: "safe-read-only"`
- `realtime.instructions`:简短的口头回复,需要更深入回答时使用 `openclaw_agent_consult`
- `realtime.introMessage`:实时桥接连接时播放的简短口头就绪检查;将其设为 `""` 可静默加入
- `realtime.instructions`:简短的口头回复,较深入的回答使用 `openclaw_agent_consult`
- `realtime.introMessage`:实时桥接连接时的简短口头就绪检查;将其设`""` 可静默加入
可选覆盖项:
@ -482,7 +483,7 @@ export GEMINI_API_KEY=...
realtime: {
provider: "google",
toolPolicy: "owner",
introMessage: "准确地说:I'm here.",
introMessage: "Say exactly: I'm here.",
providers: {
google: {
model: "gemini-2.5-flash-native-audio-preview-12-2025",
@ -508,7 +509,7 @@ export GEMINI_API_KEY=...
}
```
`voiceCall.enabled` 默认为 `true`;使用 Twilio 传输时,它会将实际的 PSTN 呼叫和 DTMF 委派给 Voice Call 插件。如果未启用 `voice-call`Google Meet 仍然可以验证并记录拨号计划,但无法发起 Twilio 呼叫。
`voiceCall.enabled` 默认为 `true`;使用 Twilio 传输方式时,它会将实际的 PSTN 呼叫和 DTMF 委派给 Voice Call 插件。如果未启用 `voice-call`Google Meet 仍然可以验证并记录拨号计划,但无法发起 Twilio 呼叫。
## 工具
@ -523,15 +524,15 @@ export GEMINI_API_KEY=...
}
```
当 Chrome 运行在 Gateway 网关主机上时,使用 `transport: "chrome"`。当 Chrome 运行在已配对节点(例如 Parallels VM上时,使用 `transport: "chrome-node"`。在这两种情况下,实时模型和 `openclaw_agent_consult` 都运行在 Gateway 网关主机上,因此模型凭证会保留在那里。
当 Chrome 在 Gateway 网关主机上运行时,使用 `transport: "chrome"`。当 Chrome 在已配对节点上运行时,例如 Parallels VM,使用 `transport: "chrome-node"`。在这两种情况下,实时模型和 `openclaw_agent_consult` 都运行在 Gateway 网关主机上,因此模型凭证会保留在那里。
使用 `action: "status"` 可列出活动会话或检查某个会话 ID。使用带有 `sessionId``message``action: "speak"` 可让实时智能体立即发言。使用 `action: "test_speech"` 可创建或复用会话触发一段已知短语,并在 Chrome 主机可报告时返回 `inCall` 健康状态。使用 `action: "leave"` 可将会话标记为已结束。
使用 `action: "status"` 可列出活动会话或检查某个会话 ID。使用带有 `sessionId``message``action: "speak"` 可让实时智能体立即发言。使用 `action: "test_speech"` 可创建或复用会话触发一段已知短语,并在 Chrome 主机可报告时返回 `inCall` 健康状态。使用 `action: "leave"` 可将会话标记为已结束。
`status` 在可用时包含 Chrome 健康状态:
- `inCall`Chrome 似乎已处于 Meet 通话中
- `micMuted`:尽力判断的 Meet 麦克风状态
- `manualActionRequired` / `manualActionReason` / `manualActionMessage`浏览器配置文件需要手动登录、Meet 主持人批准、权限授予,或浏览器控制修复,发言功能才能正常工作
- `inCall`Chrome 似乎已进入 Meet 通话
- `micMuted`:尽力获取的 Meet 麦克风状态
- `manualActionRequired` / `manualActionReason` / `manualActionMessage`浏览器配置文件需要手动登录、Meet 主持人准入、权限授予或浏览器控制修复后,语音功能才能工作
- `providerConnected` / `realtimeReady`:实时语音桥接状态
- `lastInputAt` / `lastOutputAt`:桥接最近一次接收或发送音频的时间
@ -539,58 +540,58 @@ export GEMINI_API_KEY=...
{
"action": "speak",
"sessionId": "meet_...",
"message": "准确地说:I'm here and listening."
"message": "Say exactly: I'm here and listening."
}
```
## 实时智能体咨询
Chrome `realtime` 模式针对实时语音循环进行了优化。实时语音提供商会听取会议音频,并通过已配置的音频桥接发言。当实时模型需要更深入的推理、当前信息或常规 OpenClaw 工具时,它可以调用 `openclaw_agent_consult`
Chrome 实时模式针对实时语音循环进行了优化。实时语音提供商会听取会议音频,并通过已配置的音频桥进行发言。当实时模型需要更深入的推理、最新信息或普通 OpenClaw 工具时,它可以调用 `openclaw_agent_consult`
该咨询工具会在后台运行常规 OpenClaw 智能体,带入最近的会议转录上下文,并向实时语音会话返回简洁的口头回答。然后语音模型就可以把该回答说回会议中
该咨询工具会在后台运行常规 OpenClaw 智能体,并附带最近的会议转录上下文,然后向实时语音会话返回简洁的口头回答。随后语音模型可以将该回答说回会议中。它与 Voice Call 共用同一个实时咨询工具
`realtime.toolPolicy` 控制咨询运行方式
`realtime.toolPolicy` 控制咨询运行:
- `safe-read-only`公开咨询工具,并将常规智能体限制为使用 `read`、`web_search`、`web_fetch`、`x_search`、`memory_search` 和 `memory_get`
- `owner`公开咨询工具,并允许常规智能体使用普通智能体工具策略。
- `none`:不向实时语音模型公开咨询工具。
- `safe-read-only`暴露咨询工具,并将常规智能体限制为使用 `read`、`web_search`、`web_fetch`、`x_search`、`memory_search` 和 `memory_get`
- `owner`暴露咨询工具,并允许常规智能体使用正常的智能体工具策略。
- `none`:不向实时语音模型暴露咨询工具。
咨询会话键按每个 Meet 会话进行作用域隔离,因此同一会议期间,后续咨询调用可以复用先前的咨询上下文。
咨询会话键按 Meet 会话进行作用域隔离,因此同一会议期间,后续咨询调用可以复用先前的咨询上下文。
要在 Chrome 完全加入通话后强制执行一次口头就绪检查:
要在 Chrome 完全加入通话后强制执行一次口头就绪检查:
```bash
openclaw googlemeet speak meet_... "准确地说:I'm here and listening."
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 "准确地说:I'm here and listening."
--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 "准确地说:Google Meet speech test complete."
--message "Say exactly: Google Meet speech test complete."
```
预期的 `chrome-node` 状态:
- `googlemeet setup` 全部为绿色。
- `nodes status` 显示所选节点已连接。
- 所选节点同时通告 `googlemeet.chrome``browser.proxy`
- Meet 标签页加入通话,`test-speech` 返回的 Chrome 健康状态中 `inCall: true`
- 所选节点同时通告 `googlemeet.chrome``browser.proxy`
- Meet 标签页加入通话,并且 `test-speech` 返回带有 `inCall: true` 的 Chrome 健康状态
对于 Twilio 冒烟测试,请使用一个暴露电话拨入详情的会议:
对于 Twilio 冒烟测试,请使用一个会公开电话拨入详情的会议:
```bash
openclaw googlemeet setup
@ -604,8 +605,8 @@ openclaw googlemeet join https://meet.google.com/abc-defg-hij \
- `googlemeet setup` 包含绿色的 `twilio-voice-call-plugin``twilio-voice-call-credentials` 检查。
- Gateway 网关重新加载后CLI 中可用 `voicecall`
- 返回的会话包含 `transport: "twilio"` 和一个 `twilio.voiceCallId`
- `googlemeet leave <sessionId>` 会挂断已委派的语音呼叫
- 返回的会话带有 `transport: "twilio"` `twilio.voiceCallId`
- `googlemeet leave <sessionId>` 会挂断被委派的语音通话
## 故障排除
@ -618,11 +619,11 @@ openclaw plugins list | grep google-meet
openclaw googlemeet setup
```
如果你刚刚编辑了 `plugins.entries.google-meet`,请重启或重新加载 Gateway 网关。运行的智能体只能看到由当前 Gateway 网关进程注册的插件工具。
如果你刚刚编辑了 `plugins.entries.google-meet`,请重启或重新加载 Gateway 网关。正在运行的智能体只能看到由当前 Gateway 网关进程注册的插件工具。
### 没有已连接的具备 Google Meet 能力的节点
### 没有已连接的 Google Meet 可用节点
在节点主机上运行:
在节点主机上运行:
```bash
openclaw plugins enable google-meet
@ -639,8 +640,7 @@ openclaw devices approve <requestId>
openclaw nodes status
```
该节点必须处于已连接状态,并列出 `googlemeet.chrome` 以及 `browser.proxy`
Gateway 网关配置必须允许这些节点命令:
节点必须已连接,并列出 `googlemeet.chrome` 以及 `browser.proxy`。Gateway 网关配置必须允许这些节点命令:
```json5
{
@ -654,28 +654,28 @@ Gateway 网关配置必须允许这些节点命令:
### 浏览器已打开,但智能体无法加入
运行 `googlemeet test-speech` 并检查返回的 Chrome 健康状态。如果它报告 `manualActionRequired: true`,请向操作员显示 `manualActionMessage`,并停止重试,直到浏览器操作完成
运行 `googlemeet test-speech` 并检查返回的 Chrome 健康状态。如果它报告 `manualActionRequired: true`,请向操作员显示 `manualActionMessage`,并在浏览器操作完成前停止重试
常见手动操作:
常见手动操作:
- 登录 Chrome 配置文件。
- 通过 Meet 主持人账号批准访客加入
- 当 Chrome 原生权限提示出现时,授予 Chrome 麦克风/摄像头权限。
- 从 Meet 主持人账号准入访客
- 当出现 Chrome 原生权限提示时,授予 Chrome 麦克风/摄像头权限。
- 关闭或修复卡住的 Meet 权限对话框。
不要仅仅因为 Meet 显示“Do you want people to hear you in the meeting?” 就报告“未登录”。那是 Meet 的音频选择过渡页OpenClaw 会在可用时通过浏览器自动化点击 **Use microphone**并继续等待真正的会议状态。对于仅创建的浏览器回退OpenClaw 可能会点击 **Continue without microphone**,因为创建 URL 不需要实时音频路径。
如果 Meet 显示“Do you want people to hear you in the meeting?”,不要仅因此就报告“未登录”。这是 Meet 的音频选择过渡页OpenClaw 会在可用时通过浏览器自动化点击**使用麦克风**并继续等待真正的会议状态。对于仅创建的浏览器回退OpenClaw 可能会点击**继续且不使用麦克风**,因为创建 URL 不需要实时音频路径。
### 会议创建失败
配置了 OAuth 凭证时,`googlemeet create` 会首先使用 Google Meet API `spaces.create` 端点。没有 OAuth 凭证时,它会回退到固定的 Chrome 节点浏览器。请确认:
配置了 OAuth 凭证时,`googlemeet create` 会首先使用 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`
- 对于浏览器回退:如果 Meet 显示“Do you want people to hear you in the meeting?”,请保持标签页打开。OpenClaw 应通过浏览器自动化点击 **Use microphone**,或者在仅创建回退时点击 **Continue without microphone**,并继续等待生成的 Meet URL。如果无法做到错误应提及 `meet-audio-choice-required`,而不是 `google-login-required`
- 对于 API 创建:已配置 `oauth.clientId``oauth.refreshToken`,或存在对应的 `OPENCLAW_GOOGLE_MEET_*` 环境变量。
- 对于 API 创建:刷新令牌是在添加创建支持之后签发的。旧令牌可能缺少 `meetings.space.created` scope;请重新运行 `openclaw googlemeet auth login --json` 并更新插件配置。
- 对于浏览器回退:`defaultTransport: "chrome-node"` 且 `chromeNode.node` 指向一个已连接节点,并且该节点具有 `browser.proxy``googlemeet.chrome`
- 对于浏览器回退:该节点上的 OpenClaw Chrome 配置文件已登录 Google并且能够打开 `https://meet.google.com/new`
- 对于浏览器回退:如果 Meet 显示“Do you want people to hear you in the meeting?”请保持标签页打开。OpenClaw 应通过浏览器自动化点击**使用麦克风**,或者在仅创建回退场景下点击**继续且不使用麦克风**,并继续等待生成的 Meet URL。如果做不到错误应提到 `meet-audio-choice-required`,而不是 `google-login-required`
### 智能体已加入但不说话
### 智能体已加入但不说话
检查实时路径:
@ -684,20 +684,20 @@ openclaw googlemeet setup
openclaw googlemeet status
```
收听/回话请使用 `mode: "realtime"`。`mode: "transcribe"` 是有意不启动双向实时语音桥接的
使用 `mode: "realtime"` 进行收听/回话。`mode: "transcribe"` 按设计不会启动双向实时语音桥接
另外还要验证:
- Gateway 网关主机上有可用的实时提供商密钥,例如 `OPENAI_API_KEY``GEMINI_API_KEY`
- `BlackHole 2ch` 在 Chrome 主机上可见
- `rec``play` 在 Chrome 主机上存在
- Meet 的麦克风和扬声器通过 OpenClaw 使用的虚拟音频路径进行路由。
- Chrome 主机上可见 `BlackHole 2ch`
- Chrome 主机上存在 `rec``play`
- Meet 的麦克风和扬声器通过 OpenClaw 使用的虚拟音频路径进行路由。
### Twilio 设置检查失败
`voice-call` 未被允许或未启用时,`twilio-voice-call-plugin` 会失败。请将其加入 `plugins.allow`,启用 `plugins.entries.voice-call`,并重新加载 Gateway 网关。
`voice-call` 未被允许或未启用时,`twilio-voice-call-plugin` 会失败。将其添加到 `plugins.allow`,启用 `plugins.entries.voice-call`,并重新加载 Gateway 网关。
当 Twilio 后端缺少 account SID、auth token 或主叫号码时,`twilio-voice-call-credentials` 会失败。请在 Gateway 网关主机上设置以下内容
当 Twilio 后端缺少 account SID、auth token 或 caller number 时,`twilio-voice-call-credentials` 会失败。在 Gateway 网关主机上设置这些值
```bash
export TWILIO_ACCOUNT_SID=AC...
@ -713,7 +713,7 @@ openclaw googlemeet setup
### Twilio 呼叫已开始,但始终未进入会议
确认 Meet 事件暴露了电话拨入详情。传入精确的拨入号码和 PIN或自定义 DTMF 序列:
确认 Meet 事件公开了电话拨入详情。传入精确的拨入号码和 PIN或自定义 DTMF 序列:
```bash
openclaw googlemeet join https://meet.google.com/abc-defg-hij \
@ -726,19 +726,19 @@ openclaw googlemeet join https://meet.google.com/abc-defg-hij \
## 说明
Google Meet 的官方媒体 API 偏向接收方向,因此要向 Meet 通话中发言仍然需要一个参与者路径。这个插件让这个边界保持可见Chrome 负责浏览器参与和本地音频路由Twilio 负责电话拨入参与。
Google Meet 的官方媒体 API 偏向接收,因此向 Meet 通话中发言仍然需要一个参与者路径。该插件将这一边界保持为可见状态Chrome 处理浏览器参与和本地音频路由Twilio 处理电话拨入参与。
Chrome `realtime` 模式需要以下二者之一:
Chrome 实时模式需要以下两者之一:
- `chrome.audioInputCommand``chrome.audioOutputCommand`OpenClaw 拥有实时模型桥接,并在这些命令与所选实时语音提供商之间传输 8 kHz G.711 mu-law 音频。
- `chrome.audioBridgeCommand`:一个外部桥接命令拥有整个本地音频路径,并且必须在启动或验证其守护进程后退出。
为了获得干净的双工音频,请通过独立的虚拟设备或类似 Loopback 的虚拟设备拓扑来路由 Meet 输出和 Meet 麦克风。单个共享的 BlackHole 设备可能会把其他参会者的声音回送到通话中。
为了获得干净的双向音频,请将 Meet 输出和 Meet 麦克风通过独立虚拟设备或类似 Loopback 的虚拟设备图进行路由。单个共享的 BlackHole 设备可能会把其他参与者的声音回送到通话中。
`googlemeet speak` 会触发 Chrome 会话当前活动的实时音频桥接。`googlemeet leave` 会停止该桥接。对于通过 Voice Call 插件委派的 Twilio 会话,`leave` 还会挂断底层语音呼叫
`googlemeet speak` 会触发 Chrome 会话的活动实时音频桥接。`googlemeet leave` 会停止该桥接。对于通过 Voice Call 插件委派的 Twilio 会话,`leave` 还会挂断底层语音通话
## 相关内容
- [Voice Call 插件](/zh-CN/plugins/voice-call)
- [对话模式](/zh-CN/nodes/talk)
- [Voice call 插件](/zh-CN/plugins/voice-call)
- [Talk 模式](/zh-CN/nodes/talk)
- [构建插件](/zh-CN/plugins/building-plugins)

View File

@ -1,19 +1,19 @@
---
read_when:
- 你想从 OpenClaw 发起一通呼出语音电
- 你正在配置或开发语音通话插件
summary: 语音通话插件:通过 Twilio/Telnyx/Plivo 进行呼出 + 呼入通话(插件安装 + 配置 + CLI
title: 语音通话插件
- 你想从 OpenClaw 发起一个呼出语音通
- 你正在配置或开发 voice-call 插件
summary: Voice Call 插件:通过 Twilio/Telnyx/Plivo 进行呼出 + 呼入通话(插件安装 + 配置 + CLI
title: Voice call 插件
x-i18n:
generated_at: "2026-04-24T21:43:50Z"
generated_at: "2026-04-24T22:14:45Z"
model: gpt-5.4
provider: openai
source_hash: a6d03153cf6ba1b4cd7cf2e4c0ffcdf96595363473b172b2d4b21b4100c20e3c
source_hash: 1b033d9c46fa1af60c3ae2d22f8bad909ee179ef01926efca5b62b9f8a30375f
source_path: plugins/voice-call.md
workflow: 15
---
# 语音通话(插件)
# Voice Call(插件)
通过插件为 OpenClaw 提供语音通话。支持呼出通知,以及带有呼入策略的多轮对话。
@ -22,7 +22,7 @@ x-i18n:
- `twilio`Programmable Voice + Media Streams
- `telnyx`Call Control v2
- `plivo`Voice API + XML transfer + GetInput speech
- `mock`(开发用 / 无网络)
- `mock`(开发用/无网络)
快速理解模型:
@ -33,9 +33,9 @@ x-i18n:
## 运行位置(本地 vs 远程)
语音通话插件运行在 **Gateway 网关进程内部**
Voice Call 插件**运行在 Gateway 网关进程内部**
如果你使用远程 Gateway 网关,请在**运行 Gateway 网关的机器**安装 / 配置该插件,然后重启 Gateway 网关以加载它。
如果你使用远程 Gateway 网关,请在**运行 Gateway 网关的机器**安装/配置该插件,然后重启 Gateway 网关以加载它。
## 安装
@ -47,7 +47,7 @@ openclaw plugins install @openclaw/voice-call
之后重启 Gateway 网关。
### 选项 B从本地文件夹安装开发,无需复制)
### 选项 B从本地文件夹安装开发用,不复制)
```bash
PLUGIN_SRC=./path/to/local/voice-call-plugin
@ -69,7 +69,7 @@ cd "$PLUGIN_SRC" && pnpm install
enabled: true,
config: {
provider: "twilio", // 或 "telnyx" | "plivo" | "mock"
fromNumber: "+15550001234", // 或者 Twilio 的 TWILIO_FROM_NUMBER
fromNumber: "+15550001234", // 或者对 Twilio 使用 TWILIO_FROM_NUMBER
toNumber: "+15550005678",
twilio: {
@ -96,13 +96,13 @@ cd "$PLUGIN_SRC" && pnpm install
path: "/voice/webhook",
},
// Webhook 安全性(推荐用于隧道 / 代理)
// Webhook 安全性(建议用于隧道/代理)
webhookSecurity: {
allowedHosts: ["voice.example.com"],
trustedProxyIPs: ["100.64.0.1"],
},
// 公开暴露方式(任选其一)
// 对外暴露(任选其一)
// publicUrl: "https://example.ngrok.app/voice/webhook",
// tunnel: { provider: "ngrok" },
// tailscale: { mode: "funnel", path: "/voice/webhook" }
@ -113,11 +113,11 @@ cd "$PLUGIN_SRC" && pnpm install
streaming: {
enabled: true,
provider: "openai", // 可选;未设置时使用第一个已注册的实时转提供商
provider: "openai", // 可选;未设置时使用第一个已注册的实时转提供商
streamPath: "/voice/stream",
providers: {
openai: {
apiKey: "sk-...", // 如果设置 OPENAI_API_KEY则可选
apiKey: "sk-...", // 如果设置 OPENAI_API_KEY则可选
model: "gpt-4o-transcribe",
silenceDurationMs: 800,
vadThreshold: 0.5,
@ -132,6 +132,7 @@ cd "$PLUGIN_SRC" && pnpm install
realtime: {
enabled: false,
provider: "google", // 可选;未设置时使用第一个已注册的实时语音提供商
toolPolicy: "safe-read-only",
providers: {
google: {
model: "gemini-2.5-flash-native-audio-preview-12-2025",
@ -148,42 +149,48 @@ cd "$PLUGIN_SRC" && pnpm install
说明:
- Twilio / Telnyx 需要一个**可从公网访问**的 webhook URL。
- Plivo 需要一个**可公网访问**的 webhook URL。
- `mock`本地开发提供商(不发起网络调用)。
- Twilio/Telnyx 需要一个**可被公网访问**的 webhook URL。
- Plivo 需要一个**可公网访问**的 webhook URL。
- `mock`一个本地开发提供商(不进行网络调用)。
- 如果旧配置仍在使用 `provider: "log"`、`twilio.from` 或旧版 `streaming.*` OpenAI 键,请运行 `openclaw doctor --fix` 进行重写。
- 除非 `skipSignatureVerification` 为 true否则 Telnyx 需要 `telnyx.publicKey`(或 `TELNYX_PUBLIC_KEY`)。
- Telnyx 需要 `telnyx.publicKey`(或 `TELNYX_PUBLIC_KEY`,除非 `skipSignatureVerification` 为 true
- `skipSignatureVerification` 仅用于本地测试。
- 如果你使用 ngrok 免费层,请将 `publicUrl` 设置为精确的 ngrok URL签名验证始终会被强制执行。
- 如果你使用 ngrok 免费层,请将 `publicUrl` 设置为准确的 ngrok URL签名校验始终会被强制执行。
- `tunnel.allowNgrokFreeTierLoopbackBypass: true` 仅在 `tunnel.provider="ngrok"``serve.bind` 为 loopbackngrok 本地代理)时,允许带有无效签名的 Twilio webhook。仅用于本地开发。
- Ngrok 免费层 URL 可能会变化,或插入中间页行为;如果 `publicUrl` 漂移Twilio 签名将会验证失败。生产环境中,优先使用稳定域名或 Tailscale funnel。
- Ngrok 免费层 URL 可能会变化,或增加中间页行为;如果 `publicUrl` 漂移Twilio 签名校验将失败。生产环境中,优先使用稳定域名或 Tailscale funnel。
- `realtime.enabled` 会启动完整的语音到语音对话;不要与 `streaming.enabled` 同时启用。
- 流式传输安全默认值:
- `streaming.preStartTimeoutMs` 会关闭那些从未发送有效 `start` 帧的 socket。
- `streaming.maxPendingConnections` 限制未认证启动前 socket 的总数。
- `streaming.maxPendingConnectionsPerIp` 限制每个源 IP 的未认证启动前 socket 数量。
- `streaming.maxConnections` 限制媒体流 socket 的总打开数(待启动 + 活动)。
- 运行时回退目前仍接受这些旧的 voice-call 键,但推荐的重写路径是 `openclaw doctor --fix`,兼容垫片只是临时方案。
- `streaming.maxPendingConnections` 限制未认证启动前 socket 的总数。
- `streaming.maxPendingConnectionsPerIp` 限制每个源 IP 的未认证启动前 socket 数量。
- `streaming.maxConnections` 限制已打开媒体流 socket 的总数(待启动 + 活跃)。
- 运行时回退目前仍会接受这些旧版 voice-call 键,但重写路径是 `openclaw doctor --fix`,兼容垫片只是临时方案。
## 实时语音对话
`realtime` 为实时通话音频选择一个全双工实时语音提供商。
它与 `streaming`离,后者仅将音频转发给实时转录提供商。
它与 `streaming`开,后者仅将音频转发给实时转写提供商。
当前运行时行为:
- `realtime.enabled` 支持用于 Twilio Media Streams。
- `realtime.enabled` 不能与 `streaming.enabled` 组合使用。
- `realtime.provider` 是可选的。未设置时,语音通话会使用第一个已注册的实时语音提供商。
- `realtime.enabled` 支持 Twilio Media Streams。
- `realtime.enabled` 不能与 `streaming.enabled` 同时使用。
- `realtime.provider` 是可选的。未设置时,Voice Call 会使用第一个已注册的实时语音提供商。
- 内置的实时语音提供商包括 Google Gemini Live`google`)和 OpenAI`openai`),由它们各自的提供商插件注册。
- 提供商自有的原始配置位于 `realtime.providers.<providerId>` 下。
- 如果 `realtime.provider` 指向一个未注册的提供商,或者根本没有注册任何实时语音提供商,语音通话会记录一条警告,并跳过实时媒体,而不是让整个插件失败。
- 提供商拥有的原始配置位于 `realtime.providers.<providerId>` 下。
- 默认情况下Voice Call 会暴露共享的 `openclaw_agent_consult` 实时工具。当来电者请求更深入的推理、当前信息或普通 OpenClaw 工具时,实时模型可以调用它。
- `realtime.toolPolicy` 控制 consult 运行:
- `safe-read-only`:暴露 consult 工具,并将常规智能体限制为使用 `read`、`web_search`、`web_fetch`、`x_search`、`memory_search` 和 `memory_get`
- `owner`:暴露 consult 工具,并允许常规智能体使用普通智能体工具策略。
- `none`:不暴露 consult 工具。自定义 `realtime.tools` 仍会传递给实时提供商。
- Consult 会话键在可用时会复用现有语音会话,否则回退到主叫/被叫电话号码,以便后续 consult 调用在通话期间保持上下文。
- 如果 `realtime.provider` 指向未注册的提供商或者根本没有注册任何实时语音提供商Voice Call 会记录一条警告,并跳过实时媒体,而不是让整个插件失败。
Google Gemini Live 实时默认值:
- API 密钥:`realtime.providers.google.apiKey`、`GEMINI_API_KEY` 或 `GOOGLE_GENERATIVE_AI_API_KEY`
- model`gemini-2.5-flash-native-audio-preview-12-2025`
- voice`Kore`
- 模型`gemini-2.5-flash-native-audio-preview-12-2025`
- 声音`Kore`
示例:
@ -199,7 +206,8 @@ Google Gemini Live 实时默认值:
realtime: {
enabled: true,
provider: "google",
instructions: "Speak briefly and ask before using tools.",
instructions: "简短说话。在使用更深层工具之前先调用 openclaw_agent_consult。",
toolPolicy: "safe-read-only",
providers: {
google: {
apiKey: "${GEMINI_API_KEY}",
@ -239,30 +247,30 @@ Google Gemini Live 实时默认值:
}
```
有关提供商特定的实时语音选项,请参 [Google provider](/zh-CN/providers/google) 和 [OpenAI provider](/zh-CN/providers/openai)。
有关提供商特定的实时语音选项,请参 [Google provider](/zh-CN/providers/google) 和 [OpenAI provider](/zh-CN/providers/openai)。
## 流式转
## 流式转
`streaming` 为实时通话音频选择一个实时转提供商。
`streaming` 为实时通话音频选择一个实时转提供商。
当前运行时行为:
- `streaming.provider` 是可选的。未设置时,语音通话会使用第一个已注册的实时转录提供商。
- 内置的实时转提供商包括 Deepgram`deepgram`、ElevenLabs`elevenlabs`、Mistral`mistral`、OpenAI`openai`)和 xAI`xai`),由它们各自的提供商插件注册。
- 提供商有的原始配置位于 `streaming.providers.<providerId>` 下。
- 如果 `streaming.provider` 指向一个未注册的提供商,或者根本没有注册任何实时转录提供商,语音通话会记录一条警告,并跳过媒体流式传输,而不是让整个插件失败。
- `streaming.provider` 是可选的。未设置时,Voice Call 会使用第一个已注册的实时转写提供商。
- 内置的实时转提供商包括 Deepgram`deepgram`、ElevenLabs`elevenlabs`、Mistral`mistral`、OpenAI`openai`)和 xAI`xai`),由它们各自的提供商插件注册。
- 提供商有的原始配置位于 `streaming.providers.<providerId>` 下。
- 如果 `streaming.provider` 指向未注册的提供商,或者根本没有注册任何实时转写提供商Voice Call 会记录一条警告,并跳过媒体流传输,而不是让整个插件失败。
OpenAI 流式转默认值:
OpenAI 流式转默认值:
- API 密钥:`streaming.providers.openai.apiKey` 或 `OPENAI_API_KEY`
- model`gpt-4o-transcribe`
- 模型`gpt-4o-transcribe`
- `silenceDurationMs``800`
- `vadThreshold``0.5`
xAI 流式转默认值:
xAI 流式转默认值:
- API 密钥:`streaming.providers.xai.apiKey` 或 `XAI_API_KEY`
- endpoint`wss://api.x.ai/v1/stt`
- 端点`wss://api.x.ai/v1/stt`
- `encoding``mulaw`
- `sampleRate``8000`
- `endpointingMs``800`
@ -282,7 +290,7 @@ xAI 流式转录默认值:
streamPath: "/voice/stream",
providers: {
openai: {
apiKey: "sk-...", // 如果设置 OPENAI_API_KEY则可选
apiKey: "sk-...", // 如果设置 OPENAI_API_KEY则可选
model: "gpt-4o-transcribe",
silenceDurationMs: 800,
vadThreshold: 0.5,
@ -310,7 +318,7 @@ xAI 流式转录默认值:
streamPath: "/voice/stream",
providers: {
xai: {
apiKey: "${XAI_API_KEY}", // 如果设置 XAI_API_KEY则可选
apiKey: "${XAI_API_KEY}", // 如果设置 XAI_API_KEY则可选
endpointingMs: 800,
language: "en",
},
@ -323,7 +331,7 @@ xAI 流式转录默认值:
}
```
旧版键仍`openclaw doctor --fix` 自动迁移:
旧版键仍`openclaw doctor --fix` 自动迁移:
- `streaming.sttProvider``streaming.provider`
- `streaming.openaiApiKey``streaming.providers.openai.apiKey`
@ -331,16 +339,16 @@ xAI 流式转录默认值:
- `streaming.silenceDurationMs``streaming.providers.openai.silenceDurationMs`
- `streaming.vadThreshold``streaming.providers.openai.vadThreshold`
## 陈旧通话清理器
## 过期通话清理器
使用 `staleCallReaperSeconds` 来结束那些始终未收到终止 webhook 的通话
(例如,始终未完成的 notify 模式通话)。默认值为 `0`
使用 `staleCallReaperSeconds` 结束那些从未收到终止 webhook 的通话
(例如,永远没有完成的通知模式通话)。默认值为 `0`
(禁用)。
建议范围:
推荐范围:
- **生产环境:** 对于 notify 风格流程,使用 `120``300` 秒。
- 保持该值**高于 `maxDurationSeconds`**,以便正常通话可以完成。一个不错的起始值是 `maxDurationSeconds + 3060` 秒。
- **生产环境:** 对于通知风格流程,使用 `120``300` 秒。
- 保持该值**高于 `maxDurationSeconds`**,以便正常通话能够完成。一个不错的起始值是 `maxDurationSeconds + 3060` 秒。
示例:
@ -361,28 +369,21 @@ xAI 流式转录默认值:
## Webhook 安全性
当前方有代理或隧道位于 Gateway 网关前面时,插件会重建
用于签名验证的公网 URL。这些选项控制哪些转发头
会被信任。
当 Gateway 网关前面有代理或隧道时,插件会重建用于签名校验的公网 URL。这些选项用于控制信任哪些转发头。
`webhookSecurity.allowedHosts` 会将来自转发头的主机加入允许列表
`webhookSecurity.allowedHosts` 对来自转发头的主机进行允许列表控制。
`webhookSecurity.trustForwardingHeaders` 在没有允许列表的情况下信任转发头。
`webhookSecurity.trustForwardingHeaders` 在没有允许列表的情况下信任转发头。
`webhookSecurity.trustedProxyIPs` 仅在请求的远程 IP
匹配列表时才信任转发头。
`webhookSecurity.trustedProxyIPs` 仅在请求的远程 IP 与列表匹配时,才信任转发头。
Twilio 和 Plivo 启用了 webhook 重放保护。被重放的有效 webhook
请求会被确认,但会跳过副作用处理。
Twilio 和 Plivo 已启用 webhook 重放保护。被重放的有效 webhook 请求会被确认接收,但会跳过副作用处理。
Twilio 对话轮次在 `<Gather>` 回调中包含每轮唯一 token因此
陈旧 / 重放的语音回调无法满足较新的待处理转录轮次。
Twilio 对话轮次会在 `<Gather>` 回调中包含每轮专属 token因此过期/重放的语音回调无法满足较新的待处理转写轮次。
未认证的 webhook 请求会在读取 body 之前被拒绝,前提是缺少
该提供商所要求的签名头。
当提供商要求的签名头缺失时,未认证的 webhook 请求会在读取 body 之前被拒绝。
voice-call webhook 使用共享的预认证 body 配置文件64 KB / 5 秒),
并且在签名验证之前会施加每 IP 的进行中请求上限。
voice-call webhook 在签名校验前使用共享的预认证 body 配置文件64 KB / 5 秒),并带有按 IP 限制的进行中请求上限。
使用稳定公网主机的示例:
@ -403,11 +404,9 @@ voice-call webhook 使用共享的预认证 body 配置文件64 KB / 5 秒)
}
```
## 通话 TTS
## 通话 TTS
语音通话会使用核心 `messages.tts` 配置来进行
通话中的流式语音播放。你也可以在插件配置下使用**相同结构**
来覆盖它——它会与 `messages.tts` 进行深度合并。
Voice Call 对通话中的流式语音使用核心 `messages.tts` 配置。你可以在插件配置下使用**相同结构**覆盖它——它会与 `messages.tts` 进行深度合并。
```json5
{
@ -425,11 +424,11 @@ voice-call webhook 使用共享的预认证 body 配置文件64 KB / 5 秒)
说明:
- 插件配置中的旧版 `tts.<provider>` 键(`openai`、`elevenlabs`、`microsoft`、`edge`)会在加载时自动迁移到 `tts.providers.<provider>`已提交的配置中请优先使用 `providers` 结构。
- **Microsoft speech 会被语音通话忽略**(电话音频需要 PCM当前的 Microsoft 传输方式不暴露电话用 PCM 输出)。
- 插件配置中的旧版 `tts.<provider>` 键(`openai`、`elevenlabs`、`microsoft`、`edge`)会在加载时自动迁移到 `tts.providers.<provider>`提交到配置文件时,优先使用 `providers` 结构。
- **Microsoft speech 会被语音通话忽略**(电话音频需要 PCM当前的 Microsoft 传输不提供电话用 PCM 输出)。
- 当启用 Twilio 媒体流时,会使用核心 TTS否则通话会回退到提供商原生语音。
- 如果 Twilio 媒体流已经处于活动状态,语音通话不会回退到 TwiML `<Say>`。如果该状态下电话 TTS 不可用,播放请求会直接失败,而不是混用两条播放路径。
- 当电话 TTS 回退到次级提供商时,语音通话会记录一条包含提供商链(`from`、`to`、`attempts`)的警告日志便调试。
- 如果 Twilio 媒体流已经处于活动状态,Voice Call 不会回退到 TwiML `<Say>`。如果该状态下电话 TTS 不可用,播放请求会失败,而不是混用两条播放路径。
- 当电话 TTS 回退到次级提供商时,Voice Call 会记录一条带有提供商链(`from`、`to`、`attempts`)的警告,便调试。
### 更多示例
@ -448,7 +447,7 @@ voice-call webhook 使用共享的预认证 body 配置文件64 KB / 5 秒)
}
```
仅为通话覆盖为 ElevenLabs其他地方保留核心默认值):
仅为通话覆盖为 ElevenLabs其他地方保留核心默认值
```json5
{
@ -473,7 +472,7 @@ voice-call webhook 使用共享的预认证 body 配置文件64 KB / 5 秒)
}
```
仅为通话覆盖 OpenAI model(深度合并示例):
仅为通话覆盖 OpenAI 模型(深度合并示例):
```json5
{
@ -498,7 +497,7 @@ voice-call webhook 使用共享的预认证 body 配置文件64 KB / 5 秒)
## 呼入通话
呼入策略默认 `disabled`。要启用呼入通话,请设置:
呼入策略默认 `disabled`。要启用呼入通话,请设置:
```json5
{
@ -508,47 +507,43 @@ voice-call webhook 使用共享的预认证 body 配置文件64 KB / 5 秒)
}
```
`inboundPolicy: "allowlist"` 是一种低保障的来电号码筛选机制。插件会
标准化提供商给出的 `From` 值,并将其与 `allowFrom` 进行比较。
Webhook 验证可以认证提供商投递及载荷完整性,但
它并不能证明 PSTN / VoIP 来电号码的归属权。因此应将 `allowFrom` 视为
来电显示过滤,而不是强身份验证。
`inboundPolicy: "allowlist"` 是一种低保障级别的来电显示筛选。插件会规范化提供商给出的 `From` 值,并将其与 `allowFrom` 进行比较。Webhook 校验可以验证提供商投递和负载完整性,但不能证明 PSTN/VoIP 来电号码的实际归属。请将 `allowFrom` 视为来电显示过滤,而不是强身份认证。
自动响应使用智能体系统。可通过以下项进行调优:
自动响应使用智能体系统。可通过以下参数调优:
- `responseModel`
- `responseSystemPrompt`
- `responseTimeoutMs`
### 语输出约
### 语输出
对于自动响应,语音通话会在系统提示词后附加一个严格的口语输出约定
对于自动响应,Voice Call 会在系统提示词后附加一个严格的语音输出契约
- `{"spoken":"..."}`
随后,语音通话会以防御式方式提取语音文本:
随后 Voice Call 会以防御性方式提取语音文本:
- 忽略被标记为推理 / 错误内容的载
- 忽略被标记为推理/错误内容的载。
- 解析直接 JSON、带围栏的 JSON 或内联 `"spoken"` 键。
- 回退到纯文本,并移除可能的规划 / 元信息引导段落
- 回退到纯文本,并移除可能属于规划/元信息引导段落的内容
这样可以让语音播放聚焦于面向来电者的文本,并避免规划文本泄露到音频中。
这样可以让语音播放聚焦于面向来电者的文本,并避免规划文本泄露到音频中。
### 对话启动行为
对于呼出 `conversation` 通话,首条消息处理与实时播放状态绑定:
对于呼出 `conversation` 通话,首条消息处理与实时播放状态绑定:
- 仅在初始问候语正在主动播放时,才会抑制打断时的队列清空和自动响应。
- 如果初始播放失败,通话会返回 `listening`并将初始消息保留在队列中以供重试。
- 对于 Twilio 流式传输,初始播放会在流连接时立即开始,无额外延迟。
- 实时语音对话使用实时流自身的开场轮次。语音通话不会为该初始消息发送旧版 `<Say>` TwiML 更新,因此呼出 `<Connect><Stream>` 会话会保持附着状态
- 仅当初始问候正在主动播报时,才会抑制打断队列清空和自动响应。
- 如果初始播放失败,通话会返回 `listening`初始消息会保留在队列中以便重试。
- Twilio 流式传输的初始播放会在流连接建立时立即开始,不会额外延迟。
- 实时语音对话使用实时流自身的开场轮次。Voice Call 不会为该初始消息发送旧版 `<Say>` TwiML 更新,因此呼出 `<Connect><Stream>` 会话会保持附着。
### Twilio 流断开宽限期
当 Twilio 媒体流断开时,语音通话会等待 `2000ms`,然后才自动结束通话:
当 Twilio 媒体流断开时,Voice Call 会等待 `2000ms`,然后才自动结束通话:
- 如果流在此时间窗内重新连接,则会取消自动结束。
- 如果宽限期后仍未重新注册任何流,则会结束通话,以防出现卡住的活动通话
- 如果流在此窗口期间重新连接,则会取消自动结束。
- 如果宽限期后仍未重新注册任何流,则会结束通话,以防止活跃通话卡住
## CLI
@ -561,13 +556,11 @@ openclaw voicecall dtmf --call-id <id> --digits "ww123456#"
openclaw voicecall end --call-id <id>
openclaw voicecall status --call-id <id>
openclaw voicecall tail
openclaw voicecall latency # 从日志汇总轮次延迟
openclaw voicecall latency # 从日志汇总轮次延迟
openclaw voicecall expose --mode funnel
```
`latency` 会从默认的 voice-call 存储路径读取 `calls.jsonl`。使用
`--file <path>` 可指向其他日志,使用 `--last <n>` 可将分析范围限制为
最后 N 条记录(默认 200。输出包括轮次延迟和监听等待时间的 p50 / p90 / p99。
`latency` 会从默认的 voice-call 存储路径读取 `calls.jsonl`。使用 `--file <path>` 指向其他日志文件,并使用 `--last <n>` 将分析限制为最后 N 条记录(默认 200。输出包含轮次延迟和监听等待时间的 p50/p90/p99。
## 智能体工具
@ -582,7 +575,7 @@ openclaw voicecall expose --mode funnel
- `end_call`callId
- `get_status`callId
该仓库附带了对应的技能文档,位于 `skills/voice-call/SKILL.md`
此仓库附带对应的 skill 文档,位于 `skills/voice-call/SKILL.md`
## Gateway 网关 RPC
@ -595,6 +588,6 @@ openclaw voicecall expose --mode funnel
## 相关内容
- [文本转语音](/zh-CN/tools/tts)
- [对话模式](/zh-CN/nodes/talk)
- [语音唤醒](/zh-CN/nodes/voicewake)
- [Text-to-speech](/zh-CN/tools/tts)
- [Talk mode](/zh-CN/nodes/talk)
- [Voice wake](/zh-CN/nodes/voicewake)