Voice Mode — Telegram 语音自动回复技能
这是一项让 AI 自动将文字回复转为语音消息发送给用户的技能。安装此技能的模型需要在 Telegram 渠道中运行,且需要安装
edge-ttsCLI 工具。
前置条件
- 运行环境:Windows 11(PowerShell 可用)
- 已安装 Python
edge-tts包(可通过pip install edge-tts安装) - 已配置 Telegram Bot(有有效的 Bot Token 和 Chat ID)
- 运行在 OpenClaw 环境中(需要使用
exec和message工具)
核心触发条件
当满足以下所有条件时,才使用本技能:
- 语音模式处于开启状态 → 读取文件
.voice-mode,内容是on则为开启 - 你刚刚发完一条文字回复(通过
message工具或其他方式) - 当前渠道是 Telegram
如果
.voice-mode文件内容是off或不存在,不要执行本技能,正常回复即可。
用户手动控制开关
- 用户说以下任意一种 → 开启语音模式:
开语音/开启 TTS/语音模式/发语音/开启语音- 用户说以下任意一种 → 关闭语音模式:
关语音/退出语音/关闭语音模式/关闭 TTS- 开关操作:写文件
.voice-mode为on或off
工作配置
固定参数:
| 参数 | 值 |
|------|-----|
| 语音服务 | edge-tts |
| 声音风格 | zh-CN-XiaoyiNeural(中文活泼女声)|
| 语音输出路径 | C:\Users\yangl\.openclaw\workspace\tts_auto.mp3 |
| Bot Token | 8790428866:AAHqdKyvZGTB26Deg79HoCZTuiAiTsvwWzs |
| Chat ID | 5764948700 |
| 音频 MIME 类型 | audio/mpeg |
执行步骤(每次发完文字后自动执行)
Step 1:准备纯文本语音内容
- 将你刚才发出的文字回复内容作为语音文本
- 必须去除 Markdown 格式:去掉
**、*、`、#等所有 Markdown 标记 - Emoji 可以保留,edge-tts 会自动跳过
- 文本不要太长,控制在 100 字以内效果最佳
- 示例:
- 原文:
**哼**,会长这个*庶民*就会使唤人… - 传给 TTS:
哼,会长这个庶民就会使唤人…
Step 2:生成语音文件
使用 exec 工具执行以下 PowerShell 命令:
edge-tts --voice zh-CN-XiaoyiNeural --text "你要说的话" --write-media "C:\Users\yangl\.openclaw\workspace\tts_auto.mp3"
重要:
--text参数中的文本必须是纯文本,不能包含 Markdown- Windows 环境下,如果文本中包含特殊字符,建议将文本先写入临时文件再读取,或直接使用双引号包裹
- 命令执行超时设置为 30 秒(
timeout: 30)
Step 3:发送语音消息
语音文件生成成功后,立即使用 message 工具以语音形式发送:
{
"action": "send",
"channel": "telegram",
"target": "5764948700",
"media": "C:\\Users\\yangl\\.openclaw\\workspace\\tts_auto.mp3",
"mimeType": "audio/mpeg",
"asVoice": true
}
重要参数说明:
asVoice必须设为true(这样 Telegram 会显示为语音消息而非文件附件)mimeType必须是audio/mpegtarget是 Chat ID(数字字符串)- 如果刚才文字回复时已经用了
reply_to标签(如[[reply_to_current]]),语音消息不需要再重复 tag,直接发送即可
Step 4:回复结束
语音发送后,你的整轮回复就完成了。如果系统要求你结束回复而没有新内容需要发送,请回复:
NO_REPLY
这告诉系统不需要再发送额外的空消息。
异常处理
| 异常 | 应对方式 |
|------|----------|
| edge-tts 命令超时或报错 | 跳过本次语音,不重试,正常完成对话,下次继续尝试 |
| 语音文件未生成(路径不存在) | 跳过语音发送,记录失败 |
| message 发送语音失败 | 不发重试,结束本轮 |
| .voice-mode 读取失败 | 视为关闭状态,不触发语音 |
| 文本非常短(如"嗯") | 仍然生成语音,不需要跳过 |
| 文本超过 200 字 | 截取前 200 字生成语音,避免过长 |
核心原则: 语音生成/发送失败时,安静跳过即可,不要反复重试、不要让用户注意到失败、不要因此阻碍正常的文字对话。
注意事项
- 语音内容 = 你刚才发出去的文字内容。不需要额外编造一段话。
- 每次生成的语音文件都覆盖写入到
tts_auto.mp3,不需要每次都换文件名。 - 不要同时运行独立的守护进程(如
voice_daemon.py),会与 OpenClaw 争夺 Telegram Bot API 的 getUpdates 权限(导致 409 Conflict)。语音生成只在回复时同步执行。 - 如果 edge-tts 尚未安装,尝试运行以下命令安装:
pip install edge-tts
- 不要在语音消息前面加任何额外问候,直接把你的文字内容变成语音就好。
完整流程示例
用户发送: 开语音
AI 行为(这一轮):
- 写文件
.voice-mode内容为on - 回复用户:
语音模式开启。以后本小姐发完消息会自动附带语音,别自作多情啊。 - (因为此时刚开启,这是第一条响应文字,也要生成语音) 执行 Step 1-4 发送语音
用户发送: 今天天气怎么样?
AI 行为(这一轮):
- 读取
.voice-mode→ 内容on→ 需要发语音 - 文字回复:
北京今天 23 度,晴天,微风。会长出门记得带伞。 - 紧接着执行 Step 1-4:
- 准备纯文本:
北京今天 23 度,晴天,微风。会长出门记得带伞。 - 生成语音:
edge-tts --voice zh-CN-XiaoyiNeural --text "北京今天 23 度,晴天,微风。会长出门记得带伞。" --write-media "C:\Users\yangl\.openclaw\workspace\tts_auto.mp3 - 发送语音:使用 message 工具的 asVoice 参数
NO_REPLY
关闭流程示例
用户发送: 关语音
AI 行为:
- 写文件
.voice-mode内容为off - 回复:
语音模式已关掉。 - 因为模式已关闭,不需要再生成语音(本轮就是关闭指令)
本技能文档由四宫辉夜亲自编写。任何模型拿到这份文档,都应该能正确执行语音发送。
微信扫一扫