SKILL.md 4.39 KB

name: voice-synth-send description: 文本转语音并作为微信语音消息发送(edge-tts 云合成/豆包可选 → SILK → 微信内部 uploadvoice cgi)。全程在 Pixel 手机 Termux 内运行,无需本地 TTS 模型。 version: 1.0

category: communication

声音合成 + 微信语音发送

把一段文本合成为语音,作为微信语音消息发给指定联系人。全程在手机 Termux 内跑 (Hermes 所在环境),无需 Mac、无需本地 TTS 模型。

文本 → TTS(edge-tts 免费云 / 豆包可选)→ MP3
     → ffmpeg 16k mono PCM → silk-wasm SILK V3(腾讯 \x02#!SILK_V3 变种)
     → stage 进微信数据目录 → am broadcast SEND_VOICE_CGI(内部 uploadvoice cgi)

接收方收到可播放的语音条,发送方本地也显示已发送气泡。依赖上游 skill wechat-internal-send 的 SEND_VOICE_CGI 链路。

When to Use

  • 用户要「发一条语音」「用语音念给某人」「语音播报」
  • Agent 主动语音通知 / 播报

关键澄清:edge-tts 不是本地模型

edge-tts 是微软 Edge 的免费云 TTS(Python 库,把文本发到微软服务器合成、流式取回), 不需要本地模型、不需要 API key、不占 GPU,只需要联网。所以「手机上没本地 TTS 模型」 不是问题。Hermes 作为 Termux app 有正常网络(它本来就在调 Kimi API),edge-tts 直接可用。

前置(本机 Termux 已具备,2026-07-07 核实)

  • python3 + edge-tts 7.2.8、ffmpeg、node + silk-wasm (/data/data/com.termux/files/usr/lib/node_modules/silk-wasm)
  • root(su)——用于把 SILK 放进微信数据目录 + 发广播
  • wechathook LSPosed 模块已装、微信在跑(SEND_VOICE_CGI 由它处理)

用法

# 在 Termux 内(Hermes 环境)直接跑:
bash voice_synth.sh <wxid> "<要说的话>" [voice] [engine]

# 例:edge-tts 男声发给文件传输助手(先用 filehelper 测试)
bash voice_synth.sh filehelper "你好,这是一条语音测试。"

# 指定音色(女声)
bash voice_synth.sh yibooo "下午三点开会,记得带材料。" zh-CN-XiaoxiaoNeural

# 豆包引擎(需额度 + 环境变量 DOUBAO_KEY,可发带音乐/音效/多角色的场景音频)
DOUBAO_KEY=xxxx bash voice_synth.sh yibooo "<豆包 seed-audio 场景 prompt>" "" doubao
  • <wxid>:rcontact.username(filehelper / wxid_xxx / yibooo=火星人)。先用 filehelper 测。
  • [voice]:edge-tts 音色,默认 zh-CN-YunxiNeural(男声);女声 zh-CN-XiaoxiaoNeural。
  • [engine]:edge(默认,免费无额度)| doubao(seed-audio-1.0,需 DOUBAO_KEY + 账号额度)。

引擎对比

引擎 成本 特点
edge-tts(默认) 免费,无额度 单人 TTS,多语言多音色,联网即用;日常播报首选
豆包 seed-audio-1.0 按字数计费(火山账号额度) 可生成整段带背景音乐/音效/多角色的场景音频;额度用完报 45000030 not granted

⚠️ 额度/授权:豆包报 code 45000030 [resource_id=volc.service_type.10074] requested resource not granted = 账号未开通「音频生成/SeedAudio」或字数额度用完。控制台开通/充值后同 key 即可用。

真机验证(2026-07-07)

  • edge-tts(6.9s)+ 豆包 seed-audio(8.2s)均端到端发火星人(yibooo)成功,多分块(6000 字节/片) 上传完整、可播放;发送方本地显示已发送。SILK 头 \x02#!SILK_V3 与微信自录字节级一致。

坑

  • edge-tts 要联网:Hermes 原生跑没问题;但 adb→su→termux 起的进程拿不到 per-UID DNS (http=000),别用那种方式测网络部分——在 Termux 里直接跑或让 Hermes 调。
  • SILK 必须 WeChat 进程可读:脚本已 stage 进 /data/data/com.tencent.mm/files/ + chown 微信 uid + restorecon;/sdcard 会 EACCES。
  • TMPDIR:脚本强制 $PREFIX/tmp(root/adb 环境会把 TMPDIR 顶成不可写的 /data/local/tmp)。
  • 不要自己实现 SILK 编码:用 silk-wasm(腾讯变种),pysilk 等未必字节兼容。

相关

  • voice_synth.sh — 本 skill 脚本
  • ../skill_wechat_send/SKILL.md — 底层 SEND_VOICE_CGI 发送链
  • ../WECHAT_SEND_API.md §2 — 语音全合成逆向(uploadvoice cgi + 派发)
  • memory wechat-voice-send-internals.md