OpenClaw语音通话插件配置TaoToken:WebRTC+Twilio+STT全链路骨架
1. 为什么语音通话插件值得单独配一条 API 通道
OpenClaw 的语音通话插件(Voice Call Plugin)给 Agent 装上了"耳朵和嘴":用户通过电话或浏览器 WebRTC 接入,语音经 STT 转成文本喂给 Agent,Agent 回复再经 TTS 合成语音回传。整条链路里,STT 和 TTS 是高频、低延迟、按量计费的调用,Twilio 负责 PSTN/SIP 信令与媒体流,WebRTC 负责浏览器侧的低延迟通道。
问题出在"多供应商、多 Key"上。Twilio 有 accountSid/authToken,STT 可能是 Whisper 或云端识别,TTS 可能是 OpenAI 或 ElevenLabs,每个服务一套凭据、一套计费、一套限流。调试阶段最怕的不是代码写错,而是"到底哪个 Key 失效了、哪次请求被限流了"分不清。把 STT/TTS 这类模型调用统一收敛到 TaoToken 的 Key/API 通道,Twilio 只管电话网络,模型侧只认一个 base_url 和一把 Key,排障面立刻收窄。
这篇面向已经跑通 OpenClaw 基础对话、准备接语音通话的开发者。你会拿到可复制的 openclaw.config.yaml 与 settings.json 骨架、CC Switch/Cline 的配置片段,以及 STT 请求经 TaoToken 转发的验证动作和一份报错排查清单。适合谁:想让 Agent 接电话、做 WebRTC 实时语音、又不想在多家模型平台之间来回切 Key 的人。
2. TaoToken 前置:把模型调用收敛成一条通道
TaoToken 在这里扮演的角色是"统一模型入口"。OpenClaw 语音插件本身不关心你用的是哪家 STT/TTS,它只认一个兼容 OpenAI 协议的 endpoint。你把 base_url 指向 TaoToken,把 Key 换成 TaoToken 的 Key,STT 和 TTS 的请求就都从这一条通道走。
官网入口:https://taotoken.net/?utm_source=taotoken_aicg_blog_end&utm_medium=csdn&utm_campaign=rewrite&utm_content=
API 基址(配置里填这个,不带 UTM):https://taotoken.net/api
需要提前准备的东西:
- 一个 TaoToken 账号,并在控制台创建 API Key。控制台地址:https://taotoken.net/console?utm_source=taotoken_aicg_blog_end&utm_content=console&utm_campaign=rewrite
- API Keys 管理页:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite
- 一个 Twilio 账号(拿 accountSid/authToken/号码),或者 Daily.co 的 apiKey 走纯 WebRTC
- OpenClaw 本体已安装,
openclaw plugins install @openclaw/voice-call能正常执行
注意:Twilio 的 authToken 和 TaoToken 的 Key 都属于敏感凭据,一律走环境变量,不要硬编码进配置文件。下面所有配置片段都用
${VAR}占位。
如果你还没确认模型通道是否通,可以先用模型对话页做一次最小验证:https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=model-chat&utm_campaign=rewrite 。能正常出字,说明 Key 和网络没问题,再往下配语音链路。
3. 可复制配置:config.toml 与 settings.json 骨架
OpenClaw 的语音插件配置分两层:插件级配置写在 openclaw.config.yaml(或等价的 config.toml),模型侧凭据和 endpoint 写在 settings.json。先给一份 config.toml 骨架,字段和 YAML 版一一对应。
# config.toml —— OpenClaw 语音通话插件骨架
[plugins.voice-call]
enabled = true
provider = "twilio" # twilio | daily
[plugins.voice-call.twilio]
accountSid = "${TWILIO_ACCOUNT_SID}"
authToken = "${TWILIO_AUTH_TOKEN}"
phoneNumber = "+1234567890"
[plugins.voice-call.audio]
sampleRate = 16000
channels = 1
codec = "opus" # opus | pcmu | pcma
vadEnabled = true
silenceTimeout = 3000
[plugins.voice-call.stt]
provider = "openai-compatible"
baseUrl = "https://taotoken.net/api"
apiKey = "${TAOTOKEN_API_KEY}"
model = "whisper-1"
language = "zh-CN"
[plugins.voice-call.tts]
provider = "openai-compatible"
baseUrl = "https://taotoken.net/api"
apiKey = "${TAOTOKEN_API_KEY}"
model = "tts-1"
voice = "alloy"
[plugins.voice-call.recording]
enabled = true
format = "wav"
storePath = "./recordings"
autoTranscribe = true
关键点:STT 和 TTS 都指向同一个 baseUrl 和同一把 ${TAOTOKEN_API_KEY},这就是"统一通道"的落地方式。Twilio 段只保留电话网络相关字段,模型调用完全不碰 Twilio 凭据。
再给 settings.json,用于 CC Switch / Cline 这类客户端复用同一把 Key:
{
"provider": "openai-compatible",
"baseUrl": "https://taotoken.net/api",
"apiKey": "${TAOTOKEN_API_KEY}",
"models": {
"stt": "whisper-1",
"tts": "tts-1",
"chat": "gpt-4o-mini"
},
"timeoutMs": 30000,
"retry": {
"maxAttempts": 3,
"backoffMs": 500
}
}
CC Switch 里对应的配置片段(切到 TaoToken 通道):
{
"name": "taotoken",
"type": "openai-compatible",
"baseUrl": "https://taotoken.net/api",
"apiKey": "${TAOTOKEN_API_KEY}"
}
Cline 的 settings.json 片段:
{
"cline.apiProvider": "openai",
"cline.openAiBaseUrl": "https://taotoken.net/api",
"cline.openAiApiKey": "${TAOTOKEN_API_KEY}",
"cline.openAiModelId": "gpt-4o-mini"
}
环境变量在启动 OpenClaw 前导出:
export TWILIO_ACCOUNT_SID="ACxxxxxxxxxxxxxxxx"
export TWILIO_AUTH_TOKEN="your_twilio_token"
export TAOTOKEN_API_KEY="sk-你的taotoken密钥"
openclaw gateway start
提示:
codec选opus时浏览器 WebRTC 原生支持最好;如果走 PSTN 且对端是老式电话网,pcmu兼容性更稳。sampleRate保持 16000,Whisper 系列对 16k 单声道最友好。
4. 验证请求:STT 经 TaoToken 转发的成功结果
配置写完别急着打电话,先用一条 curl 验证 STT 通道是否真的经 TaoToken 转发成功。准备一个 3 秒左右的 wav 文件 test.wav(16k、单声道)。
curl -s -X POST "https://taotoken.net/api/v1/audio/transcriptions" \
-H "Authorization: Bearer ${TAOTOKEN_API_KEY}" \
-F "file=@test.wav" \
-F "model=whisper-1" \
-F "language=zh-CN" \
| tee stt_result.json
成功时返回结构类似:
{
"text": "你好,这是一段测试语音",
"task": "transcribe",
"language": "zh-CN",
"duration": 3.02
}
看到 text 字段有内容,说明 STT 经 TaoToken 转发链路通了。接着验证 TTS:
curl -s -X POST "https://taotoken.net/api/v1/audio/speech" \
-H "Authorization: Bearer ${TAOTOKEN_API_KEY}" \
-H "Content-Type: application/json" \
-d '{
"model": "tts-1",
"voice": "alloy",
"input": "语音通道验证成功"
}' --output tts_out.mp3
tts_out.mp3 能正常播放即通过。最后在 OpenClaw 侧看事件监听是否触发:
gateway.on('voice:call:start', (event) => {
console.log(`通话开始: ${event.callId}`);
});
gateway.on('voice:call:end', (event) => {
console.log(`通话结束: 时长 ${event.duration}s`);
});
发起一次 WebRTC 测试通话,控制台应依次打印 通话开始 和 通话结束,recordings/ 目录下出现 wav 文件,autoTranscribe 开启时还会生成对应文字记录。到这里,WebRTC + Twilio + STT 全链路骨架就跑通了。
5. 本篇常见错排查清单
报错一:401 Unauthorized,STT 请求被拒。 九成是 ${TAOTOKEN_API_KEY} 没导出,或者导出后没重启 gateway。检查 echo $TAOTOKEN_API_KEY 是否有值,再确认 openclaw gateway start 是在同一 shell 会话里执行的。另一个可能是 Key 复制时带了空格。
报错二:404 Not Found,路径拼错。 baseUrl 填 https://taotoken.net/api,客户端会自动补 /v1/audio/transcriptions。如果你手动在 baseUrl 里又加了 /v1,就会变成 /api/v1/v1/...。统一只填到 /api。
报错三:Twilio 侧 11200 或媒体流中断。 这通常和模型通道无关,是 Twilio webhook 地址不可达或 phoneNumber 格式不对。确认号码是 E.164 格式(+ 开头),webhook 用公网可达地址。STT 慢导致的超时也会表现为媒体流中断,把 timeoutMs 调到 30000 以上试试。
报错四:STT 返回空 text。 音频采样率不匹配最常见。sampleRate 配 16000,但实际音频是 8000 或 44100,识别结果就会空或乱。用 ffprobe test.wav 确认实际采样率,和配置对齐。
报错五:TTS 音频能生成但播放是杂音。 codec 和播放端不匹配。WebRTC 侧用 opus,PSTN 侧用 pcmu,别混用。channels 保持 1,立体声在电话链路里会被降混。
报错六:CC Switch/Cline 里模型列表拉不到。 检查 baseUrl 是否带了 UTM 参数。配置里只填 https://taotoken.net/api,任何查询参数都会导致路径解析异常。
注意:排障时优先用 curl 直连 TaoToken 验证模型通道,再回到 OpenClaw 验证插件层。两层分开测,能快速定位是 Key 问题还是插件配置问题。
6. 通道配好之后:按场景选下一步
语音链路的模型调用已经收敛到 TaoToken 一条通道,接下来看你主要拿它干什么。
如果你在排障阶段反复调 STT/TTS 参数,或者想快速验证某个模型在语音场景下的表现,直接去模型对话页试:https://taotoken.net/chat?utm_source=taotoken_aicg_blog_end&utm_content=model-chat&utm_campaign=rewrite 。把识别文本和合成文本贴进去对比,比反复打电话快得多。
如果你要把语音 Agent 长期跑起来,尤其是接电话客服、外呼这类需要稳定并发和额度管理的场景,建议看 Coding Plan:https://taotoken.net/coding-plan?utm_source=taotoken_aicg_blog_end&utm_content=coding-plan&utm_campaign=rewrite 。它更适合长期编码和 Agent 类负载的额度规划。
接入文档在这里,STT/TTS 的完整参数和错误码对照都在这:https://taotoken.net/doc?utm_source=taotoken_aicg_blog_end&utm_content=doc&utm_campaign=rewrite 。Key 管理和新建入口:https://taotoken.net/api-keys?utm_source=taotoken_aicg_blog_end&utm_content=api-keys&utm_campaign=rewrite 。
最后留一个我踩过的坑:autoTranscribe 开启后,录音文件会同步触发一次 STT 调用,如果你同时在高频测试通话,额度消耗会比预期快。测试阶段先把 autoTranscribe 关掉,等链路稳定再打开。
更多推荐
所有评论(0)