chore(i18n): refresh zh-CN translations
This commit is contained in:
parent
c3344abf5f
commit
b7a6405acf
@ -1,57 +1,59 @@
|
||||
---
|
||||
read_when:
|
||||
- 你希望一个 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-24T08:44:55Z"
|
||||
generated_at: "2026-04-24T09:19:17Z"
|
||||
model: gpt-5.4
|
||||
provider: openai
|
||||
source_hash: 8d430a1f2d6ee7fc1d997ef388a2e0d2915a6475480343e7060edac799dfc027
|
||||
source_hash: f1673ac4adc9cf163194a340dd6e451d0e4d28bb62adeb126898298e62106d43
|
||||
source_path: plugins/google-meet.md
|
||||
workflow: 15
|
||||
---
|
||||
|
||||
# Google Meet(插件)
|
||||
|
||||
适用于 OpenClaw 的 Google Meet 参会支持。
|
||||
适用于 OpenClaw 的 Google Meet 参与者支持。
|
||||
|
||||
该插件在设计上是显式的:
|
||||
|
||||
- 它只会加入明确指定的 `https://meet.google.com/...` URL。
|
||||
- 它只会加入明确的 `https://meet.google.com/...` URL。
|
||||
- `realtime` 语音是默认模式。
|
||||
- 当需要更深入的推理或工具时,实时语音可以回调到完整的 OpenClaw 智能体。
|
||||
- 认证起始方式为个人 Google OAuth,或使用已登录的 Chrome 配置文件。
|
||||
- 认证起始方式为个人 Google OAuth 或已登录的 Chrome 配置文件。
|
||||
- 不会自动播报同意声明。
|
||||
- 默认的 Chrome 音频后端是 `BlackHole 2ch`。
|
||||
- Chrome 可以在本地运行,也可以在已配对的节点主机上运行。
|
||||
- Twilio 接受拨入号码以及可选的 PIN 或 DTMF 序列。
|
||||
- CLI 命令为 `googlemeet`;`meet` 保留给更广泛的智能体电话会议工作流使用。
|
||||
- CLI 命令是 `googlemeet`;`meet` 保留给更广泛的智能体电话会议工作流使用。
|
||||
|
||||
## 快速开始
|
||||
|
||||
安装本地音频依赖,并确保实时提供商可以使用 OpenAI:
|
||||
安装本地音频依赖,并配置一个后端实时语音提供商。OpenAI 是默认选项;Google Gemini Live 也可用,需设置 `realtime.provider: "google"`:
|
||||
|
||||
```bash
|
||||
brew install blackhole-2ch sox
|
||||
export OPENAI_API_KEY=sk-...
|
||||
# or
|
||||
export GEMINI_API_KEY=...
|
||||
```
|
||||
|
||||
`blackhole-2ch` 会安装 `BlackHole 2ch` 虚拟音频设备。Homebrew 的安装程序要求重启后 macOS 才会暴露该设备:
|
||||
`blackhole-2ch` 会安装 `BlackHole 2ch` 虚拟音频设备。Homebrew 的安装程序要求重启后,macOS 才会暴露该设备:
|
||||
|
||||
```bash
|
||||
sudo reboot
|
||||
```
|
||||
|
||||
重启后,验证这两项都已就绪:
|
||||
重启后,验证这两个部分:
|
||||
|
||||
```bash
|
||||
system_profiler SPAudioDataType | grep -i BlackHole
|
||||
command -v rec play
|
||||
```
|
||||
|
||||
启用该插件:
|
||||
启用插件:
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -87,17 +89,17 @@ openclaw googlemeet join https://meet.google.com/abc-defg-hij
|
||||
}
|
||||
```
|
||||
|
||||
Chrome 会以已登录的 Chrome 配置文件身份加入。在 Meet 中,选择 `BlackHole 2ch` 作为 OpenClaw 使用的麦克风/扬声器路径。为了获得干净的双工音频,请使用单独的虚拟设备或类似 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 VM:OpenClaw CLI/节点主机、Google Chrome、SoX、BlackHole 2ch,以及已登录 Google 的 Chrome 配置文件。
|
||||
- VM 中不需要:Gateway 网关服务、智能体配置、OpenAI/GPT 密钥或模型提供商设置。
|
||||
- Parallels macOS VM:OpenClaw CLI/节点主机、Google Chrome、SoX、BlackHole 2ch,以及一个已登录 Google 的 Chrome 配置文件。
|
||||
- VM 中不需要:Gateway 网关服务、智能体配置、OpenAI/GPT 密钥,或模型提供商设置。
|
||||
|
||||
安装 VM 依赖:
|
||||
|
||||
@ -105,20 +107,20 @@ Chrome 会以已登录的 Chrome 配置文件身份加入。在 Meet 中,选
|
||||
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
|
||||
@ -130,14 +132,14 @@ openclaw plugins enable google-meet
|
||||
openclaw node run --host <gateway-host> --port 18789 --display-name parallels-macos
|
||||
```
|
||||
|
||||
如果 `<gateway-host>` 是局域网 IP,并且你没有使用 TLS,那么除非你明确为该受信任私有网络启用明文 WebSocket,否则节点会拒绝连接:
|
||||
如果 `<gateway-host>` 是局域网 IP,且你未使用 TLS,则节点会拒绝明文 WebSocket,除非你明确允许该受信任私有网络:
|
||||
|
||||
```bash
|
||||
OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 \
|
||||
openclaw node run --host <gateway-lan-ip> --port 18789 --display-name parallels-macos
|
||||
```
|
||||
|
||||
将节点安装为 LaunchAgent 时,也要使用同一个环境变量:
|
||||
当将节点安装为 LaunchAgent 时,也要使用相同的环境变量:
|
||||
|
||||
```bash
|
||||
OPENCLAW_ALLOW_INSECURE_PRIVATE_WS=1 \
|
||||
@ -145,7 +147,7 @@ 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 网关主机上批准该节点:
|
||||
|
||||
@ -154,13 +156,13 @@ openclaw devices list
|
||||
openclaw devices approve <requestId>
|
||||
```
|
||||
|
||||
确认 Gateway 网关可以看到该节点,并且它通告了 `googlemeet.chrome`:
|
||||
确认 Gateway 网关能看到该节点,并且它声明了 `googlemeet.chrome`:
|
||||
|
||||
```bash
|
||||
openclaw nodes status
|
||||
```
|
||||
|
||||
在 Gateway 网关主机上将 Meet 路由到该节点:
|
||||
在 Gateway 网关主机上通过该节点路由 Meet:
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -185,31 +187,31 @@ 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"`。
|
||||
|
||||
如果省略 `chromeNode.node`,只有在恰好有一个已连接节点通告 `googlemeet.chrome` 时,OpenClaw 才会自动选择。如果连接了多个具备该能力的节点,请将 `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`。同时确认 Gateway 网关主机允许该节点命令:`gateway.nodes.allowCommands: ["googlemeet.chrome"]`。
|
||||
- `BlackHole 2ch audio device not found on the node`:在 VM 中安装 `blackhole-2ch` 并重启 VM。
|
||||
- Chrome 已打开但无法加入:在 VM 内登录 Chrome,并确认该配置文件可以手动加入该 Meet URL。
|
||||
- 没有音频:在 Meet 中,将麦克风/扬声器路由到 OpenClaw 使用的虚拟音频设备路径;为了获得干净的双工音频,请使用单独的虚拟设备或类似 Loopback 的路由方式。
|
||||
- 没有音频:在 Meet 中,将麦克风/扬声器路由到 OpenClaw 使用的虚拟音频设备路径;使用独立的虚拟设备或类似 Loopback 的路由来获得干净的全双工音频。
|
||||
|
||||
## 安装说明
|
||||
|
||||
Chrome 实时默认路径使用两个外部工具:
|
||||
Chrome 的实时默认路径使用两个外部工具:
|
||||
|
||||
- `sox`:命令行音频工具。该插件使用它的 `rec` 和 `play` 命令,作为默认的 8 kHz G.711 mu-law 音频桥接。
|
||||
- `sox`:命令行音频工具。插件使用其 `rec` 和 `play` 命令来实现默认的 8 kHz G.711 mu-law 音频桥接。
|
||||
- `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 一起打包,请审查 BlackHole 上游的许可条款,或向 Existential Audio 获取单独许可。
|
||||
OpenClaw 不会内置或重新分发这两个软件包。文档要求用户通过 Homebrew 将它们作为主机依赖安装。SoX 采用 `LGPL-2.0-only AND GPL-2.0-only` 许可证;BlackHole 采用 GPL-3.0。如果你正在构建一个将 BlackHole 与 OpenClaw 一起打包的安装程序或设备,请审查 BlackHole 上游许可条款,或从 Existential Audio 获取单独许可证。
|
||||
|
||||
## 传输方式
|
||||
|
||||
@ -226,7 +228,7 @@ openclaw googlemeet join https://meet.google.com/abc-defg-hij --transport chrome
|
||||
|
||||
### Twilio
|
||||
|
||||
Twilio 传输方式是委托给 Voice Call 插件的严格拨号方案。它不会解析 Meet 页面中的电话号码。
|
||||
Twilio 传输方式是一个严格的拨号方案,委托给 Voice Call 插件处理。它不会解析 Meet 页面中的电话号码。
|
||||
|
||||
```bash
|
||||
openclaw googlemeet join https://meet.google.com/abc-defg-hij \
|
||||
@ -246,22 +248,21 @@ openclaw googlemeet join https://meet.google.com/abc-defg-hij \
|
||||
|
||||
## OAuth 和预检
|
||||
|
||||
Google Meet Media API 访问优先使用个人 OAuth 客户端。配置 `oauth.clientId`,并可选配置 `oauth.clientSecret`,然后运行:
|
||||
Google Meet Media API 访问首先使用个人 OAuth 客户端。配置 `oauth.clientId`,并可选配置 `oauth.clientSecret`,然后运行:
|
||||
|
||||
```bash
|
||||
openclaw googlemeet auth login --json
|
||||
```
|
||||
|
||||
该命令会打印带有刷新令牌的 `oauth` 配置块。它使用 PKCE、位于 `http://localhost:8085/oauth2callback` 的 localhost 回调,以及配合 `--manual` 的手动复制/粘贴流程。
|
||||
该命令会打印一个带有刷新令牌的 `oauth` 配置块。它使用 PKCE、位于 `http://localhost:8085/oauth2callback` 的 localhost 回调,以及通过 `--manual` 进行的手动复制/粘贴流程。
|
||||
|
||||
以下环境变量可作为后备值使用:
|
||||
接受以下环境变量作为回退值:
|
||||
|
||||
- `OPENCLAW_GOOGLE_MEET_CLIENT_ID` 或 `GOOGLE_MEET_CLIENT_ID`
|
||||
- `OPENCLAW_GOOGLE_MEET_CLIENT_SECRET` 或 `GOOGLE_MEET_CLIENT_SECRET`
|
||||
- `OPENCLAW_GOOGLE_MEET_REFRESH_TOKEN` 或 `GOOGLE_MEET_REFRESH_TOKEN`
|
||||
- `OPENCLAW_GOOGLE_MEET_ACCESS_TOKEN` 或 `GOOGLE_MEET_ACCESS_TOKEN`
|
||||
- `OPENCLAW_GOOGLE_MEET_ACCESS_TOKEN_EXPIRES_AT` 或
|
||||
`GOOGLE_MEET_ACCESS_TOKEN_EXPIRES_AT`
|
||||
- `OPENCLAW_GOOGLE_MEET_ACCESS_TOKEN_EXPIRES_AT` 或 `GOOGLE_MEET_ACCESS_TOKEN_EXPIRES_AT`
|
||||
- `OPENCLAW_GOOGLE_MEET_DEFAULT_MEETING` 或 `GOOGLE_MEET_DEFAULT_MEETING`
|
||||
- `OPENCLAW_GOOGLE_MEET_PREVIEW_ACK` 或 `GOOGLE_MEET_PREVIEW_ACK`
|
||||
|
||||
@ -277,15 +278,17 @@ openclaw googlemeet resolve-space --meeting https://meet.google.com/abc-defg-hij
|
||||
openclaw googlemeet preflight --meeting https://meet.google.com/abc-defg-hij
|
||||
```
|
||||
|
||||
只有在确认你的 Cloud 项目、OAuth 主体以及会议参与者都已加入用于 Meet 媒体 API 的 Google Workspace Developer Preview Program 之后,才设置 `preview.enrollmentAcknowledged: true`。
|
||||
只有在确认你的 Cloud 项目、OAuth 主体和会议参与者都已加入用于 Meet 媒体 API 的 Google Workspace Developer Preview Program 后,才设置 `preview.enrollmentAcknowledged: true`。
|
||||
|
||||
## 配置
|
||||
|
||||
常见的 Chrome 实时路径只需要启用该插件、安装 BlackHole 和 SoX,并配置一个 OpenAI 密钥:
|
||||
常见的 Chrome 实时路径只需要启用插件、安装 BlackHole、安装 SoX,以及一个后端实时语音提供商密钥。OpenAI 是默认选项;设置 `realtime.provider: "google"` 可使用 Google Gemini Live:
|
||||
|
||||
```bash
|
||||
brew install blackhole-2ch sox
|
||||
export OPENAI_API_KEY=sk-...
|
||||
# or
|
||||
export GEMINI_API_KEY=...
|
||||
```
|
||||
|
||||
在 `plugins.entries.google-meet.config` 下设置插件配置:
|
||||
@ -313,8 +316,8 @@ export OPENAI_API_KEY=sk-...
|
||||
- `chrome.audioOutputCommand`:SoX `play` 命令,从 stdin 读取 8 kHz G.711 mu-law 音频
|
||||
- `realtime.provider: "openai"`
|
||||
- `realtime.toolPolicy: "safe-read-only"`
|
||||
- `realtime.instructions`:简短的口头回复,并在需要更深入回答时使用 `openclaw_agent_consult`
|
||||
- `realtime.introMessage`:实时桥接连接时进行简短的口头就绪检查;将其设为 `""` 可静默加入
|
||||
- `realtime.instructions`:简短的口头回复,较深层回答使用 `openclaw_agent_consult`
|
||||
- `realtime.introMessage`:当实时桥接连接时进行简短的口头就绪检查;将其设为 `""` 可静默加入
|
||||
|
||||
可选覆盖项:
|
||||
|
||||
@ -330,8 +333,15 @@ export OPENAI_API_KEY=sk-...
|
||||
node: "parallels-macos",
|
||||
},
|
||||
realtime: {
|
||||
provider: "google",
|
||||
toolPolicy: "owner",
|
||||
introMessage: "Say exactly: I'm here.",
|
||||
providers: {
|
||||
google: {
|
||||
model: "gemini-2.5-flash-native-audio-preview-12-2025",
|
||||
voice: "Kore",
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
```
|
||||
@ -366,7 +376,7 @@ export OPENAI_API_KEY=sk-...
|
||||
|
||||
当 Chrome 运行在 Gateway 网关主机上时,使用 `transport: "chrome"`。当 Chrome 运行在已配对节点上(例如 Parallels VM)时,使用 `transport: "chrome-node"`。在这两种情况下,实时模型和 `openclaw_agent_consult` 都运行在 Gateway 网关主机上,因此模型凭证会保留在那里。
|
||||
|
||||
使用 `action: "status"` 可列出活动会话或检查某个会话 ID。使用带有 `sessionId` 和 `message` 的 `action: "speak"` 可让实时智能体立即发声。使用 `action: "leave"` 可将会话标记为已结束。
|
||||
使用 `action: "status"` 可列出活动会话,或检查某个会话 ID。使用 `action: "speak"` 并提供 `sessionId` 和 `message`,可让实时智能体立即发言。使用 `action: "leave"` 可将某个会话标记为已结束。
|
||||
|
||||
```json
|
||||
{
|
||||
@ -378,17 +388,17 @@ export OPENAI_API_KEY=sk-...
|
||||
|
||||
## 实时智能体咨询
|
||||
|
||||
Chrome 实时模式针对实时语音循环进行了优化。实时语音提供商会听取会议音频,并通过已配置的音频桥接发声。当实时模型需要更深入的推理、最新信息或普通 OpenClaw 工具时,它可以调用 `openclaw_agent_consult`。
|
||||
Chrome 实时模式针对实时语音回路进行了优化。实时语音提供商会听取会议音频,并通过已配置的音频桥接进行发声。当实时模型需要更深入的推理、最新信息或常规 OpenClaw 工具时,它可以调用 `openclaw_agent_consult`。
|
||||
|
||||
咨询工具会在后台运行常规 OpenClaw 智能体,附带最近的会议转录上下文,并向实时语音会话返回简洁的口头答复。随后,语音模型可以将该答复说回会议中。
|
||||
该咨询工具会在后台运行常规 OpenClaw 智能体,并结合最近的会议转录上下文,向实时语音会话返回简洁的口头回答。随后,语音模型可以将该回答说回会议中。
|
||||
|
||||
`realtime.toolPolicy` 用于控制咨询运行方式:
|
||||
`realtime.toolPolicy` 控制咨询运行方式:
|
||||
|
||||
- `safe-read-only`:暴露咨询工具,并将常规智能体限制为使用 `read`、`web_search`、`web_fetch`、`x_search`、`memory_search` 和 `memory_get`。
|
||||
- `owner`:暴露咨询工具,并允许常规智能体使用正常的智能体工具策略。
|
||||
- `owner`:暴露咨询工具,并让常规智能体使用正常的智能体工具策略。
|
||||
- `none`:不向实时语音模型暴露咨询工具。
|
||||
|
||||
咨询会话键按每个 Meet 会话进行作用域限定,因此在同一场会议期间,后续的咨询调用可以复用之前的咨询上下文。
|
||||
咨询会话键按每个 Meet 会话进行作用域限定,因此在同一场会议中,后续咨询调用可以复用先前的咨询上下文。
|
||||
|
||||
要在 Chrome 完全加入通话后强制执行一次口头就绪检查:
|
||||
|
||||
@ -398,16 +408,16 @@ openclaw googlemeet speak meet_... "Say exactly: I'm here and listening."
|
||||
|
||||
## 说明
|
||||
|
||||
Google Meet 的官方媒体 API 偏向接收,因此要在 Meet 通话中发声,仍然需要一个参与者路径。该插件将这一边界保持为可见状态:Chrome 负责浏览器参会和本地音频路由;Twilio 负责电话拨入参会。
|
||||
Google Meet 的官方媒体 API 偏向接收,因此要在 Meet 通话中发声,仍然需要一个参与者路径。该插件会让这一边界保持可见:Chrome 负责浏览器参与和本地音频路由;Twilio 负责电话拨入参与。
|
||||
|
||||
Chrome 实时模式需要以下两种方式之一:
|
||||
|
||||
- `chrome.audioInputCommand` 加上 `chrome.audioOutputCommand`:OpenClaw 自主管理实时模型桥接,并在这些命令与所选实时语音提供商之间传输 8 kHz G.711 mu-law 音频。
|
||||
- `chrome.audioBridgeCommand`:由一个外部桥接命令负责整个本地音频路径,并且它在启动或验证其守护进程后必须退出。
|
||||
- `chrome.audioInputCommand` 加 `chrome.audioOutputCommand`:OpenClaw 拥有实时模型桥接,并在这些命令与所选实时语音提供商之间传输 8 kHz G.711 mu-law 音频。
|
||||
- `chrome.audioBridgeCommand`:由外部桥接命令负责整个本地音频路径,并且必须在启动或验证其守护进程后退出。
|
||||
|
||||
为了获得干净的双工音频,请将 Meet 输出和 Meet 麦克风路由到单独的虚拟设备,或使用类似 Loopback 的虚拟设备图。单个共享的 BlackHole 设备可能会将其他参与者的声音回声送回通话中。
|
||||
为了获得干净的全双工音频,请将 Meet 输出和 Meet 麦克风路由到独立的虚拟设备,或使用类似 Loopback 的虚拟设备拓扑。单个共享的 BlackHole 设备可能会将其他参与者的声音回送到通话中。
|
||||
|
||||
`googlemeet speak` 会触发 Chrome 会话当前活动的实时音频桥接。`googlemeet leave` 会停止该桥接。对于通过 Voice Call 插件委托的 Twilio 会话,`leave` 还会挂断底层语音通话。
|
||||
`googlemeet speak` 会触发 Chrome 会话的活动实时音频桥接。`googlemeet leave` 会停止该桥接。对于通过 Voice Call 插件委托的 Twilio 会话,`leave` 还会挂断底层语音通话。
|
||||
|
||||
## 相关内容
|
||||
|
||||
|
||||
@ -1,41 +1,41 @@
|
||||
---
|
||||
read_when:
|
||||
- 你想从 OpenClaw 发起一通外呼语音电话
|
||||
- 你想从 OpenClaw 发起一个呼出语音通话
|
||||
- 你正在配置或开发 voice-call 插件
|
||||
summary: Voice Call 插件:通过 Twilio/Telnyx/Plivo 进行呼出和呼入通话(插件安装 + 配置 + CLI)
|
||||
summary: Voice Call 插件:通过 Twilio/Telnyx/Plivo 进行呼出 + 呼入通话(插件安装 + 配置 + CLI)
|
||||
title: Voice call 插件
|
||||
x-i18n:
|
||||
generated_at: "2026-04-24T00:54:21Z"
|
||||
generated_at: "2026-04-24T09:19:16Z"
|
||||
model: gpt-5.4
|
||||
provider: openai
|
||||
source_hash: 4cd57118133506c22604ab9592a823546a91795ab425de4b7a81edbbb8374e6d
|
||||
source_hash: 6aed4e33ce090c86f43c71280f033e446f335c53d42456fdc93c9938250e9af6
|
||||
source_path: plugins/voice-call.md
|
||||
workflow: 15
|
||||
---
|
||||
|
||||
# Voice Call(插件)
|
||||
|
||||
通过插件为 OpenClaw 提供语音通话功能。支持外呼通知,以及带有呼入策略的多轮对话。
|
||||
通过插件为 OpenClaw 提供语音通话。支持呼出通知,以及带有呼入策略的多轮对话。
|
||||
|
||||
当前提供商:
|
||||
|
||||
- `twilio`(Programmable Voice + Media Streams)
|
||||
- `telnyx`(Call Control v2)
|
||||
- `plivo`(Voice API + XML transfer + GetInput speech)
|
||||
- `mock`(开发用/无网络)
|
||||
- `mock`(开发 / 无网络)
|
||||
|
||||
快速理解:
|
||||
快速理解模型:
|
||||
|
||||
- 安装插件
|
||||
- 重启 Gateway 网关
|
||||
- 在 `plugins.entries.voice-call.config` 下进行配置
|
||||
- 在 `plugins.entries.voice-call.config` 下配置
|
||||
- 使用 `openclaw voicecall ...` 或 `voice_call` 工具
|
||||
|
||||
## 运行位置(本地 vs 远程)
|
||||
|
||||
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
|
||||
@ -68,8 +68,8 @@ cd "$PLUGIN_SRC" && pnpm install
|
||||
"voice-call": {
|
||||
enabled: true,
|
||||
config: {
|
||||
provider: "twilio", // or "telnyx" | "plivo" | "mock"
|
||||
fromNumber: "+15550001234", // or TWILIO_FROM_NUMBER for Twilio
|
||||
provider: "twilio", // 或 "telnyx" | "plivo" | "mock"
|
||||
fromNumber: "+15550001234", // 或者对 Twilio 使用 TWILIO_FROM_NUMBER
|
||||
toNumber: "+15550005678",
|
||||
|
||||
twilio: {
|
||||
@ -80,8 +80,8 @@ cd "$PLUGIN_SRC" && pnpm install
|
||||
telnyx: {
|
||||
apiKey: "...",
|
||||
connectionId: "...",
|
||||
// Telnyx webhook public key from the Telnyx Mission Control Portal
|
||||
// (Base64 string; can also be set via TELNYX_PUBLIC_KEY).
|
||||
// 来自 Telnyx Mission Control Portal 的 Telnyx webhook 公钥
|
||||
// (Base64 字符串;也可以通过 TELNYX_PUBLIC_KEY 设置)。
|
||||
publicKey: "...",
|
||||
},
|
||||
|
||||
@ -90,19 +90,19 @@ cd "$PLUGIN_SRC" && pnpm install
|
||||
authToken: "...",
|
||||
},
|
||||
|
||||
// Webhook server
|
||||
// Webhook 服务器
|
||||
serve: {
|
||||
port: 3334,
|
||||
path: "/voice/webhook",
|
||||
},
|
||||
|
||||
// Webhook security (recommended for tunnels/proxies)
|
||||
// Webhook 安全性(推荐用于 tunnel / 代理)
|
||||
webhookSecurity: {
|
||||
allowedHosts: ["voice.example.com"],
|
||||
trustedProxyIPs: ["100.64.0.1"],
|
||||
},
|
||||
|
||||
// Public exposure (pick one)
|
||||
// 公开暴露(选择一种)
|
||||
// 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", // optional; first registered realtime transcription provider when unset
|
||||
provider: "openai", // 可选;未设置时使用第一个已注册的实时转录提供商
|
||||
streamPath: "/voice/stream",
|
||||
providers: {
|
||||
openai: {
|
||||
apiKey: "sk-...", // optional if OPENAI_API_KEY is set
|
||||
apiKey: "sk-...", // 如果已设置 OPENAI_API_KEY,则可选
|
||||
model: "gpt-4o-transcribe",
|
||||
silenceDurationMs: 800,
|
||||
vadThreshold: 0.5,
|
||||
@ -128,6 +128,17 @@ cd "$PLUGIN_SRC" && pnpm install
|
||||
maxPendingConnectionsPerIp: 4,
|
||||
maxConnections: 128,
|
||||
},
|
||||
|
||||
realtime: {
|
||||
enabled: false,
|
||||
provider: "google", // 可选;未设置时使用第一个已注册的实时语音提供商
|
||||
providers: {
|
||||
google: {
|
||||
model: "gemini-2.5-flash-native-audio-preview-12-2025",
|
||||
voice: "Kore",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
@ -137,44 +148,121 @@ 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` 进行重写。
|
||||
- Telnyx 需要 `telnyx.publicKey`(或 `TELNYX_PUBLIC_KEY`),除非 `skipSignatureVerification` 为 true。
|
||||
- 除非 `skipSignatureVerification` 为 true,否则 Telnyx 需要 `telnyx.publicKey`(或 `TELNYX_PUBLIC_KEY`)。
|
||||
- `skipSignatureVerification` 仅用于本地测试。
|
||||
- 如果你使用 ngrok 免费层,请将 `publicUrl` 设置为精确的 ngrok URL;签名校验始终会强制执行。
|
||||
- `tunnel.allowNgrokFreeTierLoopbackBypass: true` 仅在 `tunnel.provider="ngrok"` 且 `serve.bind` 为 loopback(ngrok 本地代理)时,允许带有无效签名的 Twilio webhook。仅用于本地开发。
|
||||
- Ngrok 免费层 URL 可能会变化或增加中间页行为;如果 `publicUrl` 发生漂移,Twilio 签名将校验失败。生产环境中,优先使用稳定域名或 Tailscale funnel。
|
||||
- Ngrok 免费层 URL 可能会变化,或增加中间页行为;如果 `publicUrl` 漂移,Twilio 签名校验将失败。生产环境中,优先使用稳定域名或 Tailscale funnel。
|
||||
- `realtime.enabled` 会启动完整的语音到语音对话;不要与 `streaming.enabled` 同时启用。
|
||||
- 流式传输安全默认值:
|
||||
- `streaming.preStartTimeoutMs` 会关闭那些从未发送有效 `start` 帧的套接字。
|
||||
- `streaming.maxPendingConnections` 限制未认证 pre-start 套接字的总数。
|
||||
- `streaming.maxPendingConnectionsPerIp` 限制每个源 IP 的未认证 pre-start 套接字数量。
|
||||
- `streaming.maxConnections` 限制打开的媒体流套接字总数(待启动 + 活跃)。
|
||||
- 运行时回退目前仍会接受这些旧的 voice-call 键,但推荐的重写路径是 `openclaw doctor --fix`,而这个兼容层只是临时的。
|
||||
- `streaming.maxPendingConnections` 限制未认证、启动前套接字的总数。
|
||||
- `streaming.maxPendingConnectionsPerIp` 限制每个源 IP 的未认证、启动前套接字数量。
|
||||
- `streaming.maxConnections` 限制打开的媒体流套接字总数(等待中 + 活跃中)。
|
||||
- 运行时回退当前仍接受这些旧的 voice-call 键,但重写路径是 `openclaw doctor --fix`,兼容垫片只是临时方案。
|
||||
|
||||
## 流式转写
|
||||
## 实时语音对话
|
||||
|
||||
`streaming` 用于为实时通话音频选择一个实时转写提供商。
|
||||
`realtime` 为实时通话音频选择一个全双工实时语音提供商。
|
||||
它与 `streaming` 分开,后者只会将音频转发给实时转录提供商。
|
||||
|
||||
当前运行时行为:
|
||||
|
||||
- `streaming.provider` 是可选的。如果未设置,Voice Call 会使用第一个已注册的实时转写提供商。
|
||||
- 内置的实时转写提供商包括 Deepgram(`deepgram`)、ElevenLabs(`elevenlabs`)、Mistral(`mistral`)、OpenAI(`openai`)以及 xAI(`xai`),它们由各自的提供商插件注册。
|
||||
- 提供商自有的原始配置位于 `streaming.providers.<providerId>` 下。
|
||||
- 如果 `streaming.provider` 指向了未注册的提供商,或者根本没有注册任何实时转写提供商,Voice Call 会记录一条警告,并跳过媒体流处理,而不是让整个插件失败。
|
||||
- `realtime.enabled` 支持用于 Twilio Media Streams。
|
||||
- `realtime.enabled` 不能与 `streaming.enabled` 组合使用。
|
||||
- `realtime.provider` 是可选的。未设置时,Voice Call 会使用第一个已注册的实时语音提供商。
|
||||
- 内置的实时语音提供商包括 Google Gemini Live(`google`)和 OpenAI(`openai`),由各自的提供商插件注册。
|
||||
- 提供商拥有的原始配置位于 `realtime.providers.<providerId>` 下。
|
||||
- 如果 `realtime.provider` 指向未注册的提供商,或者根本没有注册任何实时语音提供商,Voice Call 会记录一条警告并跳过实时媒体,而不是让整个插件失败。
|
||||
|
||||
OpenAI 流式转写默认值:
|
||||
Google Gemini Live 实时默认值:
|
||||
|
||||
- API 密钥:`streaming.providers.openai.apiKey` 或 `OPENAI_API_KEY`
|
||||
- 模型:`gpt-4o-transcribe`
|
||||
- API key:`realtime.providers.google.apiKey`、`GEMINI_API_KEY` 或 `GOOGLE_GENERATIVE_AI_API_KEY`
|
||||
- model:`gemini-2.5-flash-native-audio-preview-12-2025`
|
||||
- voice:`Kore`
|
||||
|
||||
示例:
|
||||
|
||||
```json5
|
||||
{
|
||||
plugins: {
|
||||
entries: {
|
||||
"voice-call": {
|
||||
config: {
|
||||
provider: "twilio",
|
||||
inboundPolicy: "allowlist",
|
||||
allowFrom: ["+15550005678"],
|
||||
realtime: {
|
||||
enabled: true,
|
||||
provider: "google",
|
||||
instructions: "简短回答,并在使用工具前先询问。",
|
||||
providers: {
|
||||
google: {
|
||||
apiKey: "${GEMINI_API_KEY}",
|
||||
model: "gemini-2.5-flash-native-audio-preview-12-2025",
|
||||
voice: "Kore",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
```
|
||||
|
||||
改用 OpenAI:
|
||||
|
||||
```json5
|
||||
{
|
||||
plugins: {
|
||||
entries: {
|
||||
"voice-call": {
|
||||
config: {
|
||||
realtime: {
|
||||
enabled: true,
|
||||
provider: "openai",
|
||||
providers: {
|
||||
openai: {
|
||||
apiKey: "${OPENAI_API_KEY}",
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
},
|
||||
}
|
||||
```
|
||||
|
||||
请参阅 [Google provider](/zh-CN/providers/google) 和 [OpenAI provider](/zh-CN/providers/openai),了解提供商特定的实时语音选项。
|
||||
|
||||
## 流式转录
|
||||
|
||||
`streaming` 为实时通话音频选择一个实时转录提供商。
|
||||
|
||||
当前运行时行为:
|
||||
|
||||
- `streaming.provider` 是可选的。未设置时,Voice Call 会使用第一个已注册的实时转录提供商。
|
||||
- 内置的实时转录提供商包括 Deepgram(`deepgram`)、ElevenLabs(`elevenlabs`)、Mistral(`mistral`)、OpenAI(`openai`)和 xAI(`xai`),由各自的提供商插件注册。
|
||||
- 提供商拥有的原始配置位于 `streaming.providers.<providerId>` 下。
|
||||
- 如果 `streaming.provider` 指向未注册的提供商,或者根本没有注册任何实时转录提供商,Voice Call 会记录一条警告,并跳过媒体流式传输,而不是让整个插件失败。
|
||||
|
||||
OpenAI 流式转录默认值:
|
||||
|
||||
- API key:`streaming.providers.openai.apiKey` 或 `OPENAI_API_KEY`
|
||||
- model:`gpt-4o-transcribe`
|
||||
- `silenceDurationMs`:`800`
|
||||
- `vadThreshold`:`0.5`
|
||||
|
||||
xAI 流式转写默认值:
|
||||
xAI 流式转录默认值:
|
||||
|
||||
- API 密钥:`streaming.providers.xai.apiKey` 或 `XAI_API_KEY`
|
||||
- 端点:`wss://api.x.ai/v1/stt`
|
||||
- API key:`streaming.providers.xai.apiKey` 或 `XAI_API_KEY`
|
||||
- endpoint:`wss://api.x.ai/v1/stt`
|
||||
- `encoding`:`mulaw`
|
||||
- `sampleRate`:`8000`
|
||||
- `endpointingMs`:`800`
|
||||
@ -194,7 +282,7 @@ xAI 流式转写默认值:
|
||||
streamPath: "/voice/stream",
|
||||
providers: {
|
||||
openai: {
|
||||
apiKey: "sk-...", // optional if OPENAI_API_KEY is set
|
||||
apiKey: "sk-...", // 如果已设置 OPENAI_API_KEY,则可选
|
||||
model: "gpt-4o-transcribe",
|
||||
silenceDurationMs: 800,
|
||||
vadThreshold: 0.5,
|
||||
@ -208,7 +296,7 @@ xAI 流式转写默认值:
|
||||
}
|
||||
```
|
||||
|
||||
改为使用 xAI:
|
||||
改用 xAI:
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -222,7 +310,7 @@ xAI 流式转写默认值:
|
||||
streamPath: "/voice/stream",
|
||||
providers: {
|
||||
xai: {
|
||||
apiKey: "${XAI_API_KEY}", // optional if XAI_API_KEY is set
|
||||
apiKey: "${XAI_API_KEY}", // 如果已设置 XAI_API_KEY,则可选
|
||||
endpointingMs: 800,
|
||||
language: "en",
|
||||
},
|
||||
@ -235,7 +323,7 @@ xAI 流式转写默认值:
|
||||
}
|
||||
```
|
||||
|
||||
旧键仍然会由 `openclaw doctor --fix` 自动迁移:
|
||||
旧键仍可通过 `openclaw doctor --fix` 自动迁移:
|
||||
|
||||
- `streaming.sttProvider` → `streaming.provider`
|
||||
- `streaming.openaiApiKey` → `streaming.providers.openai.apiKey`
|
||||
@ -243,16 +331,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`**,以便正常通话能够完成。
|
||||
- **生产环境:** 通知类流程使用 `120`–`300` 秒。
|
||||
- 保持该值**高于 `maxDurationSeconds`**,这样正常通话才能完成。
|
||||
一个不错的起始值是 `maxDurationSeconds + 30–60` 秒。
|
||||
|
||||
示例:
|
||||
@ -272,30 +360,32 @@ xAI 流式转写默认值:
|
||||
}
|
||||
```
|
||||
|
||||
## Webhook 安全
|
||||
## Webhook 安全性
|
||||
|
||||
当 Gateway 网关前面有代理或隧道时,插件会重建用于签名校验的公网 URL。
|
||||
这些选项用于控制信任哪些转发头。
|
||||
当前端有代理或 tunnel 位于 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,因此
|
||||
过期/重放的语音回调无法满足更新的待处理转写轮次。
|
||||
陈旧 / 重放的语音回调无法满足更新的待处理转录轮次。
|
||||
|
||||
如果缺少提供商所要求的签名头,未认证的 webhook 请求会在读取请求体之前被拒绝。
|
||||
未认证的 webhook 请求会在读取 body 之前被拒绝,前提是缺少
|
||||
该提供商要求的签名头。
|
||||
|
||||
voice-call webhook 使用共享的预认证请求体配置文件(64 KB / 5 秒),
|
||||
并且在签名校验前还会施加每个 IP 的进行中请求数量上限。
|
||||
voice-call webhook 使用共享的预认证 body 配置文件(64 KB / 5 秒),
|
||||
并在签名校验前对每个 IP 的进行中请求数量设置上限。
|
||||
|
||||
使用稳定公网主机的示例:
|
||||
使用稳定公开主机的示例:
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -314,11 +404,11 @@ voice-call webhook 使用共享的预认证请求体配置文件(64 KB / 5 秒
|
||||
}
|
||||
```
|
||||
|
||||
## 通话 TTS
|
||||
## 用于通话的 TTS
|
||||
|
||||
Voice Call 会使用核心 `messages.tts` 配置来为通话提供
|
||||
流式语音。你也可以在插件配置下用**相同的结构**
|
||||
进行覆盖——它会与 `messages.tts` 做深度合并。
|
||||
流式语音。你可以在插件配置下用**相同的结构**
|
||||
对其进行覆盖——它会与 `messages.tts` 深度合并。
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -336,11 +426,11 @@ Voice Call 会使用核心 `messages.tts` 配置来为通话提供
|
||||
|
||||
说明:
|
||||
|
||||
- 插件配置中的旧版 `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 媒体流已经处于活跃状态,Voice Call 不会回退到 TwiML `<Say>`。如果该状态下电话 TTS 不可用,则播放请求会失败,而不是混用两种播放路径。
|
||||
- 当电话 TTS 回退到次级提供商时,Voice Call 会记录一条带有提供商链(`from`、`to`、`attempts`)的警告,便于调试。
|
||||
- 如果 Twilio 媒体流已经处于活动状态,Voice Call 不会回退到 TwiML `<Say>`。如果在该状态下电话 TTS 不可用,则播放请求会失败,而不是混用两条播放路径。
|
||||
- 当电话 TTS 回退到次级提供商时,Voice Call 会记录一条带有提供商链(`from`、`to`、`attempts`)的警告日志,便于调试。
|
||||
|
||||
### 更多示例
|
||||
|
||||
@ -359,7 +449,7 @@ Voice Call 会使用核心 `messages.tts` 配置来为通话提供
|
||||
}
|
||||
```
|
||||
|
||||
仅对通话覆盖为 ElevenLabs(其他地方仍保留核心默认值):
|
||||
仅为通话覆盖为 ElevenLabs(在其他地方保留核心默认值):
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -384,7 +474,7 @@ Voice Call 会使用核心 `messages.tts` 配置来为通话提供
|
||||
}
|
||||
```
|
||||
|
||||
仅对通话覆盖 OpenAI 模型(深度合并示例):
|
||||
仅为通话覆盖 OpenAI 模型(深度合并示例):
|
||||
|
||||
```json5
|
||||
{
|
||||
@ -415,14 +505,15 @@ Voice Call 会使用核心 `messages.tts` 配置来为通话提供
|
||||
{
|
||||
inboundPolicy: "allowlist",
|
||||
allowFrom: ["+15550001234"],
|
||||
inboundGreeting: "Hello! How can I help?",
|
||||
inboundGreeting: "你好!我可以怎么帮你?",
|
||||
}
|
||||
```
|
||||
|
||||
`inboundPolicy: "allowlist"` 是一种低保障的来电号码筛选机制。插件会对提供商提供的 `From` 值进行标准化,并将其与 `allowFrom` 进行比较。
|
||||
Webhook 校验可以验证提供商投递与载荷完整性,但
|
||||
不能证明 PSTN/VoIP 来电号码的实际归属权。请将 `allowFrom` 视为
|
||||
来电显示筛选,而不是强身份验证。
|
||||
`inboundPolicy: "allowlist"` 是一种低保障的来电号码筛选机制。插件会
|
||||
对提供商提供的 `From` 值进行规范化,并将其与 `allowFrom` 进行比较。
|
||||
Webhook 校验可以验证提供商投递和负载完整性,但
|
||||
无法证明 PSTN / VoIP 来电号码的归属权。请将 `allowFrom` 视为
|
||||
来电显示过滤,而不是强来电身份认证。
|
||||
|
||||
自动响应使用智能体系统。可通过以下项进行调优:
|
||||
|
||||
@ -432,52 +523,52 @@ Webhook 校验可以验证提供商投递与载荷完整性,但
|
||||
|
||||
### 语音输出约定
|
||||
|
||||
对于自动响应,Voice Call 会向系统提示词追加一个严格的语音输出约定:
|
||||
对于自动响应,Voice Call 会向 system prompt 追加一个严格的语音输出约定:
|
||||
|
||||
- `{"spoken":"..."}`
|
||||
|
||||
随后 Voice Call 会以防御性方式提取语音文本:
|
||||
随后,Voice Call 会以防御性方式提取语音文本:
|
||||
|
||||
- 忽略被标记为推理/错误内容的载荷。
|
||||
- 解析直接 JSON、带围栏的 JSON,或内联 `"spoken"` 键。
|
||||
- 回退到纯文本,并移除可能属于规划/元信息的前导段落。
|
||||
- 忽略被标记为推理 / 错误内容的负载。
|
||||
- 解析直接 JSON、围栏 JSON 或内联 `"spoken"` 键。
|
||||
- 回退为纯文本,并移除可能属于规划 / 元信息的开头段落。
|
||||
|
||||
这样可以让语音播放聚焦于面向来电者的文本,并避免将规划文本泄露到音频中。
|
||||
|
||||
### 对话启动行为
|
||||
|
||||
对于外呼 `conversation` 通话,首条消息的处理与实时播放状态绑定:
|
||||
对于呼出 `conversation` 通话,首条消息处理与实时播放状态绑定:
|
||||
|
||||
- 仅当初始问候语正在主动播放时,打断清队列和自动响应才会被抑制。
|
||||
- 如果初始播放失败,通话会返回 `listening` 状态,且初始消息会保留在队列中以供重试。
|
||||
- 对于 Twilio 流式传输,初始播放会在流连接建立后立即开始,不会额外延迟。
|
||||
- 仅当初始问候正在主动播放时,才会抑制打断队列清空和自动响应。
|
||||
- 如果初始播放失败,通话会返回到 `listening`,初始消息会保留在队列中等待重试。
|
||||
- 对于 Twilio 流式传输,初始播放会在流连接时立即开始,不会有额外延迟。
|
||||
|
||||
### Twilio 流断开宽限期
|
||||
|
||||
当 Twilio 媒体流断开时,Voice Call 会等待 `2000ms`,然后才自动结束通话:
|
||||
当 Twilio 媒体流断开时,Voice Call 会等待 `2000ms` 后再自动结束通话:
|
||||
|
||||
- 如果流在这段时间内重新连接,自动结束会被取消。
|
||||
- 如果宽限期结束后仍未重新注册流,为防止通话卡在活跃状态,系统会结束该通话。
|
||||
- 如果流在这段时间内重新连接,则会取消自动结束。
|
||||
- 如果宽限期结束后仍没有重新注册流,则会结束通话,以防止通话卡在活动状态。
|
||||
|
||||
## CLI
|
||||
|
||||
```bash
|
||||
openclaw voicecall call --to "+15555550123" --message "Hello from OpenClaw"
|
||||
openclaw voicecall start --to "+15555550123" # alias for call
|
||||
openclaw voicecall start --to "+15555550123" # `call` 的别名
|
||||
openclaw voicecall continue --call-id <id> --message "Any questions?"
|
||||
openclaw voicecall speak --call-id <id> --message "One moment"
|
||||
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 # summarize turn latency from logs
|
||||
openclaw voicecall latency # 从日志汇总轮次延迟
|
||||
openclaw voicecall expose --mode funnel
|
||||
```
|
||||
|
||||
`latency` 会从默认的 voice-call 存储路径读取 `calls.jsonl`。使用
|
||||
`--file <path>` 可指向其他日志文件,使用 `--last <n>` 可将分析范围限制为
|
||||
最后 N 条记录(默认 200)。输出包括轮次延迟与监听等待时间的
|
||||
p50/p90/p99 摘要。
|
||||
`--file <path>` 可指向其他日志,使用 `--last <n>` 可将分析限制为
|
||||
最后 N 条记录(默认 200)。输出包括轮次延迟和监听等待时间的
|
||||
p50 / p90 / p99。
|
||||
|
||||
## 智能体工具
|
||||
|
||||
@ -492,19 +583,19 @@ p50/p90/p99 摘要。
|
||||
- `end_call`(callId)
|
||||
- `get_status`(callId)
|
||||
|
||||
此仓库提供了对应的 Skills 文档:`skills/voice-call/SKILL.md`。
|
||||
此仓库提供了对应的 skill 文档,位于 `skills/voice-call/SKILL.md`。
|
||||
|
||||
## Gateway 网关 RPC
|
||||
|
||||
- `voicecall.initiate`(`to?`、`message`、`mode?`)
|
||||
- `voicecall.continue`(`callId`、`message`)
|
||||
- `voicecall.speak`(`callId`、`message`)
|
||||
- `voicecall.speak`(`callId`)
|
||||
- `voicecall.dtmf`(`callId`、`digits`)
|
||||
- `voicecall.end`(`callId`)
|
||||
- `voicecall.status`(`callId`)
|
||||
|
||||
## 相关内容
|
||||
|
||||
- [文本转语音](/zh-CN/tools/tts)
|
||||
- [Talk 模式](/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)
|
||||
|
||||
@ -1,78 +1,77 @@
|
||||
---
|
||||
read_when:
|
||||
- 你正在寻找媒体能力的概览
|
||||
- 决定配置哪个媒体提供商
|
||||
- 寻找媒体能力概览
|
||||
- 决定要配置哪个媒体提供商
|
||||
- 了解异步媒体生成的工作方式
|
||||
summary: 媒体生成、理解和语音能力的统一落地页
|
||||
summary: 用于媒体生成、理解和语音能力的统一落地页
|
||||
title: 媒体概览
|
||||
x-i18n:
|
||||
generated_at: "2026-04-23T23:05:08Z"
|
||||
generated_at: "2026-04-24T09:19:17Z"
|
||||
model: gpt-5.4
|
||||
provider: openai
|
||||
source_hash: 469fb173ac3853011b8cd4f89f3ab97dd7d14e12e4e1d7d87e84de05d025a593
|
||||
source_hash: 39848c6104ebd4feeb37b233b70f3312fa076b535c3b3780336729eb9fdfa4e6
|
||||
source_path: tools/media-overview.md
|
||||
workflow: 15
|
||||
---
|
||||
|
||||
# 媒体生成与理解
|
||||
|
||||
OpenClaw 可以生成图像、视频和音乐,理解入站媒体(图像、音频、视频),并通过文本转语音将回复朗读出来。所有媒体能力都由工具驱动:智能体会根据对话决定何时使用它们,而每个工具只有在至少配置了一个后端提供商时才会出现。
|
||||
OpenClaw 可以生成图像、视频和音乐,理解传入媒体(图像、音频、视频),并通过文本转语音将回复朗读出来。所有媒体能力都由工具驱动:智能体会根据对话决定何时使用它们,并且每个工具仅在至少配置了一个后端提供商时才会出现。
|
||||
|
||||
## 能力一览
|
||||
## 能力概览
|
||||
|
||||
| 能力 | 工具 | 提供商 | 作用 |
|
||||
| -------------------- | ---------------- | -------------------------------------------------------------------------------------------- | ------------------------------------------------------- |
|
||||
| 图像生成 | `image_generate` | ComfyUI、fal、Google、MiniMax、OpenAI、Vydra、xAI | 根据文本提示或参考图像创建或编辑图像 |
|
||||
| 视频生成 | `video_generate` | Alibaba、BytePlus(国际版)、ComfyUI、fal、Google、MiniMax、OpenAI、Qwen、Runway、Together、Vydra、xAI | 根据文本、图像或现有视频创建视频 |
|
||||
| 音乐生成 | `music_generate` | ComfyUI、Google、MiniMax | 根据文本提示创建音乐或音频轨道 |
|
||||
| 文本转语音(TTS) | `tts` | ElevenLabs、Microsoft、MiniMax、OpenAI、xAI | 将出站回复转换为语音音频 |
|
||||
| 媒体理解 | (自动) | 任意具备视觉/音频能力的模型提供商,外加 CLI 回退 | 总结入站图像、音频和视频 |
|
||||
| 图像生成 | `image_generate` | ComfyUI, fal, Google, MiniMax, OpenAI, Vydra, xAI | 根据文本提示词或参考内容创建或编辑图像 |
|
||||
| 视频生成 | `video_generate` | Alibaba, BytePlus, ComfyUI, fal, Google, MiniMax, OpenAI, Qwen, Runway, Together, Vydra, xAI | 根据文本、图像或现有视频创建视频 |
|
||||
| 音乐生成 | `music_generate` | ComfyUI, Google, MiniMax | 根据文本提示词创建音乐或音轨 |
|
||||
| 文本转语音(TTS) | `tts` | ElevenLabs, Google, Microsoft, MiniMax, OpenAI, xAI | 将发出的回复转换为语音音频 |
|
||||
| 媒体理解 | (自动) | 任何支持视觉/音频的模型提供商,以及 CLI 回退方案 | 总结传入的图像、音频和视频 |
|
||||
|
||||
## 提供商能力矩阵
|
||||
|
||||
下表展示了各个提供商在整个平台上支持哪些媒体能力。
|
||||
下表展示了各提供商在整个平台上支持哪些媒体能力。
|
||||
|
||||
| 提供商 | 图像 | 视频 | 音乐 | TTS | STT / 转录 | 媒体理解 |
|
||||
| ---------- | ----- | ----- | ----- | --- | ------------------- | ------------------- |
|
||||
| Alibaba | | 是 | | | | |
|
||||
| BytePlus(国际版) | | 是 | | | | |
|
||||
| ComfyUI | 是 | 是 | 是 | | | |
|
||||
| Deepgram | | | | | 是 | |
|
||||
| ElevenLabs | | | | 是 | 是 | |
|
||||
| fal | 是 | 是 | | | | |
|
||||
| Google | 是 | 是 | 是 | | | 是 |
|
||||
| Microsoft | | | | 是 | | |
|
||||
| MiniMax | 是 | 是 | 是 | 是 | | |
|
||||
| Mistral | | | | | 是 | |
|
||||
| OpenAI | 是 | 是 | | 是 | 是 | 是 |
|
||||
| Qwen | | 是 | | | | |
|
||||
| Runway | | 是 | | | | |
|
||||
| Together | | 是 | | | | |
|
||||
| Vydra | 是 | 是 | | | | |
|
||||
| xAI | 是 | 是 | | 是 | 是 | 是 |
|
||||
| 提供商 | 图像 | 视频 | 音乐 | TTS | STT / 转写 | 实时语音 | 媒体理解 |
|
||||
| ---------- | ----- | ----- | ----- | --- | ------------------- | -------------- | ------------------- |
|
||||
| Alibaba | | 是 | | | | | |
|
||||
| BytePlus | | 是 | | | | | |
|
||||
| ComfyUI | 是 | 是 | 是 | | | | |
|
||||
| Deepgram | | | | | 是 | | |
|
||||
| ElevenLabs | | | | 是 | 是 | | |
|
||||
| fal | 是 | 是 | | | | | |
|
||||
| Google | 是 | 是 | 是 | 是 | | 是 | 是 |
|
||||
| Microsoft | | | | 是 | | | |
|
||||
| MiniMax | 是 | 是 | 是 | 是 | | | |
|
||||
| Mistral | | | | | 是 | | |
|
||||
| OpenAI | 是 | 是 | | 是 | 是 | 是 | 是 |
|
||||
| Qwen | | 是 | | | | | |
|
||||
| Runway | | 是 | | | | | |
|
||||
| Together | | 是 | | | | | |
|
||||
| Vydra | 是 | 是 | | | | | |
|
||||
| xAI | 是 | 是 | | 是 | 是 | | 是 |
|
||||
|
||||
<Note>
|
||||
媒体理解会使用你在提供商配置中注册的任意具备视觉能力或音频能力的模型。上表重点标出了具备专门媒体理解支持的提供商;大多数拥有多模态模型的 LLM 提供商(Anthropic、Google、OpenAI 等)在被配置为当前回复模型时,也可以理解入站媒体。
|
||||
媒体理解会使用你在提供商配置中注册的任何支持视觉或音频的模型。上表重点列出了具有专门媒体理解支持的提供商;大多数带有多模态模型的 LLM 提供商(Anthropic、Google、OpenAI 等)在被配置为当前活动回复模型时,也可以理解传入媒体。
|
||||
</Note>
|
||||
|
||||
## 异步生成如何工作
|
||||
## 异步生成的工作方式
|
||||
|
||||
视频和音乐生成会作为后台任务运行,因为提供商处理通常需要 30 秒到几分钟不等。当智能体调用 `video_generate` 或 `music_generate` 时,OpenClaw 会将请求提交给提供商,立即返回一个任务 ID,并在任务账本中跟踪该作业。作业运行期间,智能体会继续响应其他消息。当提供商完成处理后,OpenClaw 会唤醒智能体,以便它将生成完成的媒体发回原始渠道。图像生成和 TTS 是同步的,会在回复过程中内联完成。
|
||||
视频和音乐生成会作为后台任务运行,因为提供商处理通常需要 30 秒到数分钟。当智能体调用 `video_generate` 或 `music_generate` 时,OpenClaw 会将请求提交给提供商,立即返回任务 ID,并在任务账本中跟踪该作业。作业运行期间,智能体会继续响应其他消息。当提供商完成处理后,OpenClaw 会唤醒智能体,以便它将生成完成的媒体发布回原始渠道。图像生成和 TTS 是同步的,会在回复过程中内联完成。
|
||||
|
||||
在配置后,Deepgram、ElevenLabs、Mistral、OpenAI 和 xAI 都可以通过批量 `tools.media.audio` 路径转录入站音频。Deepgram、ElevenLabs、Mistral、OpenAI 和 xAI 也会注册 Voice Call 流式 STT 提供商,因此实时电话音频可以被转发到选定的供应商,而无需等待录音完成。
|
||||
在完成配置后,Deepgram、ElevenLabs、Mistral、OpenAI 和 xAI 都可以通过批处理 `tools.media.audio` 路径转写传入音频。Deepgram、ElevenLabs、Mistral、OpenAI 和 xAI 还会注册 Voice Call 流式 STT 提供商,因此实时电话音频可以直接转发给所选供应商,而无需等待录音完成。
|
||||
|
||||
OpenAI 映射到 OpenClaw 的图像、视频、批量 TTS、批量 STT、Voice Call
|
||||
流式 STT、实时语音和记忆嵌入能力面。xAI 当前映射到 OpenClaw 的图像、视频、搜索、代码执行、批量 TTS、批量 STT 和 Voice Call 流式 STT 能力面。xAI Realtime 语音是上游能力,但在共享实时语音契约能够表示它之前,OpenClaw 不会注册它。
|
||||
Google 映射到 OpenClaw 的图像、视频、音乐、批处理 TTS、后端实时语音和媒体理解功能面。OpenAI 映射到 OpenClaw 的图像、视频、批处理 TTS、批处理 STT、Voice Call 流式 STT、后端实时语音和记忆嵌入功能面。xAI 目前映射到 OpenClaw 的图像、视频、搜索、代码执行、批处理 TTS、批处理 STT 和 Voice Call 流式 STT 功能面。xAI Realtime voice 是上游能力,但在共享的实时语音契约能够表示它之前,OpenClaw 不会注册该能力。
|
||||
|
||||
## 快速链接
|
||||
|
||||
- [图像生成](/zh-CN/tools/image-generation) -- 生成和编辑图像
|
||||
- [视频生成](/zh-CN/tools/video-generation) -- 文本生成视频、图像生成视频和视频转视频
|
||||
- [音乐生成](/zh-CN/tools/music-generation) -- 创建音乐和音频轨道
|
||||
- [视频生成](/zh-CN/tools/video-generation) -- 文本生成视频、图像生成视频和视频生成视频
|
||||
- [音乐生成](/zh-CN/tools/music-generation) -- 创建音乐和音轨
|
||||
- [文本转语音](/zh-CN/tools/tts) -- 将回复转换为语音音频
|
||||
- [媒体理解](/zh-CN/nodes/media-understanding) -- 理解入站图像、音频和视频
|
||||
- [媒体理解](/zh-CN/nodes/media-understanding) -- 理解传入的图像、音频和视频
|
||||
|
||||
## 相关
|
||||
## 相关内容
|
||||
|
||||
- [图像生成](/zh-CN/tools/image-generation)
|
||||
- [视频生成](/zh-CN/tools/video-generation)
|
||||
|
||||
Loading…
Reference in New Issue
Block a user