Voice Mode

Other

在 Telegram 渠道文字回复后自动将纯文本转换为中文活泼女声语音并发送语音消息,需开启语音模式和安装 edge-tts。

Install

openclaw skills install voice-mode

Voice Mode — Telegram 语音自动回复技能

这是一项让 AI 自动将文字回复转为语音消息发送给用户的技能。安装此技能的模型需要在 Telegram 渠道中运行,且需要安装 edge-tts CLI 工具。

前置条件

  • 运行环境:Windows 11(PowerShell 可用)
  • 已安装 Python edge-tts 包(可通过 pip install edge-tts 安装)
  • 已配置 Telegram Bot(有有效的 Bot Token 和 Chat ID)
  • 运行在 OpenClaw 环境中(需要使用 execmessage 工具)

核心触发条件

当满足以下所有条件时,才使用本技能:

  1. 语音模式处于开启状态 → 读取文件 .voice-mode,内容是 on 则为开启
  2. 你刚刚发完一条文字回复(通过 message 工具或其他方式)
  3. 当前渠道是 Telegram

如果 .voice-mode 文件内容是 off 或不存在,不要执行本技能,正常回复即可。

用户手动控制开关

  • 用户说以下任意一种 → 开启语音模式:
  • 开语音 / 开启 TTS / 语音模式 / 发语音 / 开启语音
  • 用户说以下任意一种 → 关闭语音模式:
  • 关语音 / 退出语音 / 关闭语音模式 / 关闭 TTS
  • 开关操作:写文件 .voice-modeonoff

工作配置

固定参数:

参数
语音服务edge-tts
声音风格zh-CN-XiaoyiNeural(中文活泼女声)
语音输出路径C:\Users\yangl\.openclaw\workspace\tts_auto.mp3
Bot Token8790428866:AAHqdKyvZGTB26Deg79HoCZTuiAiTsvwWzs
Chat ID5764948700
音频 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/mpeg
  • target 是 Chat ID(数字字符串)
  • 如果刚才文字回复时已经用了 reply_to 标签(如 [[reply_to_current]]),语音消息不需要再重复 tag,直接发送即可

Step 4:回复结束

语音发送后,你的整轮回复就完成了。如果系统要求你结束回复而没有新内容需要发送,请回复:

NO_REPLY

这告诉系统不需要再发送额外的空消息。

异常处理

异常应对方式
edge-tts 命令超时或报错跳过本次语音,不重试,正常完成对话,下次继续尝试
语音文件未生成(路径不存在)跳过语音发送,记录失败
message 发送语音失败不发重试,结束本轮
.voice-mode 读取失败视为关闭状态,不触发语音
文本非常短(如"嗯")仍然生成语音,不需要跳过
文本超过 200 字截取前 200 字生成语音,避免过长

核心原则: 语音生成/发送失败时,安静跳过即可,不要反复重试、不要让用户注意到失败、不要因此阻碍正常的文字对话。

注意事项

  1. 语音内容 = 你刚才发出去的文字内容。不需要额外编造一段话。
  2. 每次生成的语音文件都覆盖写入到 tts_auto.mp3,不需要每次都换文件名。
  3. 不要同时运行独立的守护进程(如 voice_daemon.py),会与 OpenClaw 争夺 Telegram Bot API 的 getUpdates 权限(导致 409 Conflict)。语音生成只在回复时同步执行。
  4. 如果 edge-tts 尚未安装,尝试运行以下命令安装:
pip install edge-tts
  1. 不要在语音消息前面加任何额外问候,直接把你的文字内容变成语音就好。

完整流程示例

用户发送: 开语音

AI 行为(这一轮):

  1. 写文件 .voice-mode 内容为 on
  2. 回复用户:语音模式开启。以后本小姐发完消息会自动附带语音,别自作多情啊。
  3. (因为此时刚开启,这是第一条响应文字,也要生成语音) 执行 Step 1-4 发送语音

用户发送: 今天天气怎么样?

AI 行为(这一轮):

  1. 读取 .voice-mode → 内容 on → 需要发语音
  2. 文字回复:北京今天 23 度,晴天,微风。会长出门记得带伞。
  3. 紧接着执行 Step 1-4:
  • 准备纯文本:北京今天 23 度,晴天,微风。会长出门记得带伞。
  • 生成语音:edge-tts --voice zh-CN-XiaoyiNeural --text "北京今天 23 度,晴天,微风。会长出门记得带伞。" --write-media "C:\Users\yangl\.openclaw\workspace\tts_auto.mp3
  • 发送语音:使用 message 工具的 asVoice 参数
  1. NO_REPLY

关闭流程示例

用户发送: 关语音

AI 行为:

  1. 写文件 .voice-mode 内容为 off
  2. 回复:语音模式已关掉。
  3. 因为模式已关闭,不需要再生成语音(本轮就是关闭指令)

本技能文档由四宫辉夜亲自编写。任何模型拿到这份文档,都应该能正确执行语音发送。