Install
openclaw skills install voice-chat-bridge双向语音对话系统 - 语音识别转文字 + Edge TTS语音合成 + Cloudflare Tunnel公网访问
openclaw skills install voice-chat-bridge让你的 OpenClaw 助手具备完整的双向语音对话能力。
ffmpeg - 音频格式转换
brew install ffmpeg
Python 依赖
pip3 install edge-tts
方案A:本地模式(最简单)
方案B:公网访问
brew install cloudflared
brew install ngrok
npm install -g localtunnel
方案C:Web界面模式
http://localhost:8765hear - 本地识别,无需联网
curl -LO https://github.com/sveinbjornt/hear/releases/download/0.7/hear-0.7.zip
unzip hear-0.7.zip && cp hear-0.7/hear ~/.local/bin/
| 方案 | 需要域名 | 公网访问 | 适用场景 |
|---|---|---|---|
| 本地模式 | ❌ 不需要 | ❌ 仅本机 | 个人使用,电脑上直接听 |
| Web界面 | ❌ 不需要 | ❌ 局域网 | 同一WiFi下多设备访问 |
| Ngrok | ❌ 不需要 | ✅ 临时域名 | 快速测试,分享给朋友 |
| Cloudflare | ✅ 需要自有域名 | ✅ 永久 | 长期使用,生产环境 |
| LocalTunnel | ❌ 不需要 | ✅ 临时域名 | 免费替代Ngrok |
适合:只想在电脑上听语音回复
# 1. 初始化
bash skills/voice-chat-bridge/scripts/init.sh
# 2. 配置为本地模式
cat > ~/.openclaw/workspace/voice_config.json << 'EOF'
{
"mode": "local",
"tts_engine": "edge-tts",
"voice": "zh-CN-XiaoxiaoNeural",
"auto_play": true
}
EOF
# 3. 生成语音并自动播放
python3 skills/voice-chat-bridge/scripts/generate_voice.py "你好,这是本地模式测试"
AGENTS.md 配置:
## Voice Chat Bridge (本地模式)
当用户发送语音消息时:
1. 使用 `transcribe.py` 转文字
2. 生成回复后,使用 `generate_voice.py` 生成语音
3. **自动播放**: 调用 `afplay` (macOS) 或 `mpg123` (Linux) 播放语音
4. 回复文字内容: "[已播放语音] 回复内容..."
适合:同一WiFi下手机/平板也能访问
# 1. 配置为Web模式
cat > ~/.openclaw/workspace/voice_config.json << 'EOF'
{
"mode": "web",
"local_port": 8765,
"tts_engine": "edge-tts",
"voice": "zh-CN-XiaoxiaoNeural"
}
EOF
# 2. 启动Web服务器
python3 skills/voice-chat-bridge/scripts/voice_server.py --web
# 3. 浏览器访问 http://localhost:8765
内置Web界面包含:
适合:临时分享给朋友,或不想配置域名
# 1. 安装Ngrok
brew install ngrok
# 2. 注册获取token(免费)
ngrok config add-authtoken YOUR_TOKEN
# 3. 启动语音服务器
python3 skills/voice-chat-bridge/scripts/voice_server.py
# 4. 在另一个终端启动Ngrok
ngrok http 8765
# 5. 获取临时域名(如 https://abc123.ngrok.io)
# 6. 更新配置
cat > ~/.openclaw/workspace/voice_config.json << 'EOF'
{
"mode": "ngrok",
"domain": "https://abc123.ngrok.io",
"local_port": 8765
}
EOF
适合:有域名,长期稳定使用
# 参考原教程...
# 使用Discord的tts参数
await channel.send("回复内容", tts=True) # 使用Discord内置TTS
# 或发送语音文件
await channel.send(file=discord.File("voice.mp3"))
# 使用Slack的音频附件
client.chat_postMessage(
channel="#general",
text="回复内容",
attachments=[{
"audio_url": voice_url
}]
)
# 返回JSON
{
"text": "回复内容",
"voice_url": "http://localhost:8765/voice.mp3",
"voice_base64": "..." # 可选
}
# 直接对话模式
python3 skills/voice-chat-bridge/scripts/chat.py
# > 你说: [语音输入或文字]
# > AI回复: [文字]
# > [自动播放语音]
适合:完整的本地化语音交互体验
# 启动完整对话循环
python3 skills/voice-chat-bridge/scripts/voice_chat_loop.py
完整流程:
按住 Ctrl+T
↓
🎤 开始录音(听到提示音)
↓
说话...
↓
松开按键
↓
✅ 录音结束 → 自动转文字
↓
🤖 AI处理(写入.voice_trigger文件)
↓
💬 生成回复文字
↓
🔊 生成语音回复
↓
🔈 自动播放语音
↓
返回等待下一段录音
特点:
适合:只想快速语音输入,不依赖完整对话循环
# 启动快捷键监听(后台运行)
python3 skills/voice-chat-bridge/scripts/hotkey_recorder.py
# 然后任何时候:
# 1. 按住 Ctrl+T(可配置)
# 2. 说话
# 3. 松开按键
# 4. 自动转文字并复制到剪贴板/发送给AI
快捷键配置(编辑 voice_config.json):
{
"hotkey": {
"enabled": true,
"combination": ["ctrl", "t"],
"on_release": "transcribe_and_send",
"beep_on_start": true,
"beep_on_end": true
}
}
工作流程:
按住 Ctrl+T
↓
🎤 开始录音(听到提示音)
↓
说话...
↓
松开按键
↓
✅ 录音结束 → 自动转文字
↓
📋 复制到剪贴板 或 直接发给AI
bash skills/voice-chat-bridge/scripts/init.sh
这会创建:
voice_output/ - 语音文件输出目录voice_config.json - 配置文件编辑 voice_config.json:
{
"domain": "https://your-domain.com",
"local_port": 8765,
"voice": "zh-CN-XiaoxiaoNeural"
}
# 启动语音服务器
python3 skills/voice-chat-bridge/scripts/voice_server.py
# 在另一个终端启动 Cloudflare Tunnel
cloudflared tunnel --config ~/.cloudflared/config.yml run
在 AGENTS.md 中添加:
## Voice Chat Bridge
当用户发送语音消息时:
1. 使用 `skills/voice-chat-bridge/scripts/transcribe.py` 转文字
2. 理解内容并生成回复
3. 使用 `skills/voice-chat-bridge/scripts/generate_voice.py` 生成语音
4. 回复文字内容 + 语音链接
### 情绪状态更新(每次语音交互)
- connection: +0.2(语音交流增强连接感)
- 记录语音交互频率到 habits.json
python3 skills/voice-chat-bridge/scripts/transcribe.py /path/to/audio.ogg
python3 skills/voice-chat-bridge/scripts/generate_voice.py "要合成的文字内容"
# 输出: https://your-domain.com/abc123.mp3
# 伪代码示例
if user_message.is_voice:
# 1. 转写
text = transcribe(user_message.audio_path)
# 2. 理解并回复
reply = generate_reply(text)
# 3. 生成语音
voice_url = generate_voice(reply)
# 4. 发送回复
send_message(f"{reply}\n\n🎙️ {voice_url}")
skills/voice-chat-bridge/
├── SKILL.md # 本文件
├── scripts/
│ ├── init.sh # 初始化脚本
│ ├── transcribe.py # 语音转文字
│ ├── generate_voice.py # 文字转语音
│ └── voice_server.py # HTTP服务器
└── templates/
└── config.json # 配置模板
本 Skill 默认使用 Edge TTS,支持 100+ 种语言和方言:
| 语音ID | 描述 |
|---|---|
| zh-CN-XiaoxiaoNeural | 晓晓 - 自然女声(中国大陆推荐) |
| zh-CN-YunxiNeural | 云希 - 自然男声(中国大陆) |
| zh-TW-HsiaoChenNeural | 曉臻 - 台湾女声 |
| zh-HK-HiuMaanNeural | 曉曼 - 香港粤语女声 |
| 语音ID | 描述 |
|---|---|
| en-US-AriaNeural | Aria - 美式英语女声 |
| en-US-GuyNeural | Guy - 美式英语男声 |
| en-GB-SoniaNeural | Sonia - 英式英语女声 |
| en-AU-NatashaNeural | Natasha - 澳洲英语女声 |
| 语音ID | 描述 |
|---|---|
| ja-JP-NanamiNeural | 七海 - 日语女声 |
| ja-JP-KeitaNeural | 圭太 - 日语男声 |
| 语音ID | 描述 |
|---|---|
| ko-KR-SunHiNeural | 선희 - 韩语女声 |
| ko-KR-InJoonNeural | 인준 - 韩语男声 |
| 语音ID | 描述 |
|---|---|
| fr-FR-DeniseNeural | Denise - 法语女声 |
| de-DE-KatjaNeural | Katja - 德语女声 |
| es-ES-ElviraNeural | Elvira - 西班牙语女声 |
| ru-RU-SvetlanaNeural | Svetlana - 俄语女声 |
| ar-SA-ZariyahNeural | Zariyah - 阿拉伯语女声 |
| hi-IN-SwaraNeural | Swara - 印地语女声 |
完整列表: 运行 edge-tts --list-voices
编辑 voice_config.json:
{
"domain": "https://your-domain.com",
"local_port": 8765,
"voice": "en-US-AriaNeural", // 改成你想要的语音
"language": "en-US" // 用于语音识别
}
结合 inner-life skill,根据用户语言自动切换:
# 在 AGENTS.md 中添加
if user_message.language == "zh":
voice_config["voice"] = "zh-CN-XiaoxiaoNeural"
elif user_message.language == "en":
voice_config["voice"] = "en-US-AriaNeural"
elif user_message.language == "ja":
voice_config["voice"] = "ja-JP-NanamiNeural"
如果 Edge TTS 在某些地区访问受限,支持以下备选:
# 修改 scripts/generate_voice.py 中的 TTS_ENGINE
TTS_ENGINE = "say"
say -v "Ting-Ting" "你好" # 中文
say -v "Samantha" "Hello" # 英文
修改 voice_config.json 中的 voice 字段:
在 generate_voice.py 中修改:
# 默认 16kHz,可提高至 24kHz
"-ar", "16000" # → "-ar", "24000"
问题: 转写失败,提示 "No speech detected"
问题: Cloudflare Tunnel 连接失败
~/.cloudflared/config.yml 配置,确保域名和端口正确问题: Edge TTS 生成语音失败
结合 inner-life-core skill,根据情绪状态调整语音风格:
if inner_state.confidence > 0.8:
voice_style = "cheerful"
elif inner_state.connection < 0.3:
voice_style = "gentle"
自动将每日日记转为语音:
python3 skills/voice-chat-bridge/scripts/diary_to_voice.py
MIT - 随便用,欢迎改进!