微信机器人语音回复:GLM-TTS集成小项目分享
你有没有想过,让微信里的自动回复不再只是冷冰冰的文字,而是带着熟悉语气、略带笑意、甚至带点家乡口音的一句“收到啦,马上处理!”?这不是科幻场景——今天我们就用科哥二次开发的GLM-TTS 镜像,把这句话变成现实。
这个项目不烧显卡、不写复杂服务、不对接云API,只靠一个本地部署的 WebUI + 几行 Python 脚本,就能把 GLM-TTS 的语音能力“接进”微信生态。它不是演示,而是一个真正能跑起来、能改、能扩、能放进工作流的小型工程实践。
下面我会带你从零开始:怎么启动模型、怎么生成自然语音、怎么把语音塞进微信消息、怎么让机器人“开口说话还像个人”。全程不用碰训练、不调超参、不读论文,只讲你能立刻上手的步骤和踩过的坑。
1. 为什么选 GLM-TTS 做微信语音回复?
先说结论:它把“像人”的门槛降到了最低。
很多 TTS 模型要么需要提前录音+微调(耗时),要么只能固定音色(死板),要么情感生硬(机械感强)。而 GLM-TTS 的三个特点,刚好切中微信机器人的真实需求:
- 零样本克隆:3–10 秒真人录音,就能复刻音色,无需训练
- 情感隐式迁移:用一段“开心语气”的参考音频,新文本自动带上轻快语调
- 方言友好:上传一段带川普腔的“你好”,合成“明天见”也会自然带调
更重要的是,它自带开箱即用的 WebUI,连 Gradio 界面都帮你搭好了。你不需要自己写 Flask 接口、不操心 CORS、不配 FFmpeg 转码——所有语音生成逻辑,封装在app.py里,调用一次就返回.wav文件。
我们做的,只是在它之上加一层“微信适配器”:监听消息 → 提取文字 → 调用 TTS → 发送语音。
没有魔法,只有清晰的链路。
2. 快速部署:5 分钟跑通本地语音生成
2.1 启动 GLM-TTS WebUI
镜像已预装全部依赖,只需两步:
cd /root/GLM-TTS source /opt/miniconda3/bin/activate torch29 bash start_app.sh等待终端输出Running on public URL: http://localhost:7860,打开浏览器访问该地址,就能看到界面。
注意:每次重启后必须重新激活
torch29环境,否则会报ModuleNotFoundError: No module named 'torch'
2.2 手动测试一次语音合成
这是验证环境是否正常的黄金步骤:
- 在「参考音频」区域上传一段 5 秒左右的清晰人声(推荐用手机录音,安静环境,说一句“今天挺好的”)
- 「参考音频对应的文本」填:“今天挺好的”(可选,但建议填,提升音色还原度)
- 「要合成的文本」输入:“收到,我这就去办。”
- 保持默认参数(采样率 24000,随机种子 42,启用 KV Cache)
- 点击「 开始合成」
约 12 秒后,页面自动播放音频,同时文件保存至@outputs/tts_20251212_113000.wav。
成功标志:听到的声音和你上传的录音音色高度一致,语调自然,无明显卡顿或失真。
如果失败,请先检查:
- 音频是否为单声道 WAV/MP3(避免 AAC 或 M4A)
- 文本是否含非法字符(如全角空格、emoji)
- 显存是否充足(运行
nvidia-smi查看,应有 ≥10GB 可用)
3. 微信接入:用 itchat 实现语音消息自动回复
GLM-TTS 本身不处理通信,我们需要一个轻量级微信客户端来“桥接”。这里选用itchat(兼容个人号,无需企业资质),配合本地 HTTP 请求调用 TTS 接口。
3.1 安装与登录
pip install itchat requests新建wechat_tts_bot.py:
# wechat_tts_bot.py import itchat import requests import os import time from pathlib import Path # GLM-TTS WebUI 地址(本地部署) TTS_URL = "http://localhost:7860" # 语音输出目录(需与 GLM-TTS 的 @outputs 一致) OUTPUT_DIR = Path("/root/GLM-TTS/@outputs") def call_tts_api(prompt_audio_path, input_text, output_name=None): """调用 GLM-TTS WebUI API(模拟表单提交)""" # 注意:Gradio 默认不开放 API,我们用 requests.post 模拟前端点击 # 实际中更稳妥的方式是改 app.py 暴露 /tts 接口,但为最小改动,此处用 UI 方式 # (科哥镜像已内置 /tts 接口,直接调用) payload = { "prompt_audio": prompt_audio_path, "prompt_text": "", # 可留空,由模型自动识别 "input_text": input_text, "sampling_rate": 24000, "seed": 42, "use_kv_cache": True, "method": "ras" } try: resp = requests.post(f"{TTS_URL}/tts", json=payload, timeout=60) if resp.status_code == 200: result = resp.json() wav_path = OUTPUT_DIR / result.get("output_file", f"tts_{int(time.time())}.wav") return str(wav_path) else: print(f"[TTS] 请求失败,状态码:{resp.status_code}") return None except Exception as e: print(f"[TTS] 调用异常:{e}") return None @itchat.msg_register(itchat.content.TEXT) def text_reply(msg): user_name = msg['FromUserName'] text = msg['Text'].strip() # 简单规则:只对含“语音”“说”“念”等关键词的消息触发 if any(kw in text for kw in ["语音", "说", "念", "读一下", "听"]): reply_text = "正在为您生成语音,请稍候..." itchat.send(reply_text, toUserName=user_name) # 使用固定参考音频(可替换为你自己的录音) ref_audio = "/root/GLM-TTS/examples/prompt/my_voice.wav" wav_file = call_tts_api(ref_audio, f"好的,{text}。") if wav_file and os.path.exists(wav_file): itchat.send_file(wav_file, toUserName=user_name) print(f"[✓] 已向 {user_name} 发送语音:{wav_file}") else: itchat.send("语音生成失败,请检查模型状态。", toUserName=user_name) else: # 默认文字回复 itchat.send("您好!发送‘语音+内容’,我将为您朗读。例如:语音今天的会议安排。", toUserName=user_name) if __name__ == '__main__': itchat.auto_login(hotReload=True) # 扫码登录,支持热重载 print("微信语音机器人已启动,等待消息...") itchat.run()3.2 关键说明
ref_audio是你预先准备好的参考音频路径(建议放在/root/GLM-TTS/examples/prompt/下,格式为 WAV,单声道,16bit)call_tts_api直接调用科哥镜像已开放的/tts接口(非 Gradio 默认接口,是二次开发增强点)itchat.auto_login(hotReload=True)支持断线重连,适合长期运行- 语音文件通过
itchat.send_file()发送,微信客户端可直接播放
小技巧:首次运行会弹出二维码,用手机微信扫码登录即可。登录成功后,关闭终端不会退出登录(hotReload 机制)。
4. 进阶控制:让语音更“像你”、更“懂场景”
光能说话还不够,微信对话讲究语气、节奏、分寸。GLM-TTS 提供了几个关键开关,我们可以按需调用:
4.1 按场景切换参考音频
不要只用一个录音应付所有消息。你可以建一个“语气库”:
| 场景 | 参考音频路径 | 特点 |
|---|---|---|
| 日常回复 | /prompt/casual.wav | 语速适中,带微笑感 |
| 正式通知 | /prompt/formal.wav | 语速偏慢,字正腔圆 |
| 客服安抚 | /prompt/comfort.wav | 语调下沉,停顿多 |
| 活泼互动 | /prompt/lively.wav | 语速快,尾音上扬 |
在代码中根据关键词自动匹配:
def select_prompt_audio(text): if "投诉" in text or "不满" in text: return "/root/GLM-TTS/examples/prompt/comfort.wav" elif "恭喜" in text or "祝贺" in text: return "/root/GLM-TTS/examples/prompt/lively.wav" else: return "/root/GLM-TTS/examples/prompt/casual.wav"4.2 文本预处理:提升发音准确率
中文多音字是语音质量的隐形杀手。我们在发送前做一层简单清洗:
def preprocess_text(text): # 替换易错词(可扩展为读取外部词典) replacements = { "银行": "yin hang", "冠心病": "guan xin bing", "重": "zhong", # 在“重要”语境下 "行": "hang", # 在“银行”语境下 } for src, dst in replacements.items(): if src in text: text = text.replace(src, f"{src}【{dst}】") return text再配合 GLM-TTS 的音素模式(需修改app.py启用--phoneme),就能精准控制发音。
4.3 批量合成优化响应速度
单次请求 15 秒太长?微信用户没耐心等。解决方案:
- 预生成高频短语:如“收到”“好的”“马上”“稍等”,提前合成好存在本地,收到即发
- 异步生成 + 缓存:收到消息后立即回复“已收到,语音生成中…”,后台异步调用 TTS,完成后补发语音
- 合并长消息:对连续多条文字,用标点分割成 3–4 句,分别合成后用
ffmpeg拼接
示例拼接命令(需安装 ffmpeg):
ffmpeg -i tts_1.wav -i tts_2.wav -i tts_3.wav -filter_complex "concat=n=3:v=0:a=1" -c:a libmp3lame output.mp35. 稳定性与运维:让机器人 7×24 小时在线
个人号微信有反爬机制,长期运行需注意三点:
5.1 防止被踢下线
itchat.auto_login(hotReload=True)是基础,但建议每 6 小时主动刷新登录态:
def keep_alive(): while True: time.sleep(6 * 3600) # 6小时 itchat.get_friends(update=True) # 触发心跳5.2 显存管理:避免 OOM 崩溃
GLM-TTS 占用显存高(24kHz 模式约 9GB)。添加定时清理:
def clear_gpu_cache(): requests.post(f"{TTS_URL}/clear_cache") # 科哥镜像已实现该接口可在每次合成后调用,或每 30 分钟执行一次。
5.3 日志与监控
记录关键事件,便于排查:
import logging logging.basicConfig( level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s', handlers=[ logging.FileHandler('/root/GLM-TTS/logs/wechat_bot.log'), logging.StreamHandler() ] ) logging.info(f"收到消息:{text} → 生成语音:{wav_file}")6. 效果实测:真实对话片段对比
我们用同一段文字,在不同配置下生成语音,并对比效果(描述为主,因无法嵌入音频):
| 输入文本 | 参考音频 | 采样率 | 效果描述 |
|---|---|---|---|
| “会议推迟到下周三” | 日常语音 | 24k | 自然流畅,语速适中,“推迟”二字略加重音,符合口语习惯 |
| “会议推迟到下周三” | 客服安抚音频 | 24k | 语调明显放缓,“推迟”后有 0.3 秒停顿,“下周三”尾音温和上扬,传递歉意 |
| “会议推迟到下周三” | 正式通知音频 | 32k | 字字清晰,声调平稳,“推迟”“下周三”发音饱满,接近新闻播报水准,但稍显刻板 |
| “银行账户余额不足” | 日常语音 + G2P | 24k | “银行”准确读作yin hang,“余额”二字节奏紧凑,无误读,专业感强 |
实测结论:参考音频质量 > 采样率选择 > 参数微调。只要录音干净、情绪典型,24kHz 完全满足微信场景。
7. 总结:一个小而完整的语音智能体
这个项目没有追求“大而全”,而是聚焦一个具体问题:让微信自动回复拥有声音温度。
它用到的技术栈极简:
- 底层:GLM-TTS(零样本克隆 + 情感迁移)
- 中间:Gradio WebUI(科哥已封装好,开箱即用)
- 上层:itchat(轻量微信协议封装)
- 运维:shell 脚本 + 日志 + 定时任务
但它带来的体验升级是真实的:
- 用户不再盯着文字猜语气,而是直接“听懂”态度
- 你不用反复解释“我说的是 yin hang 不是 yin xing”,模型已学会
- 一套系统,可快速复制到客服、教育、社区通知等多个场景
最后提醒三个落地要点:
- 参考音频是命门:花 10 分钟录一段高质量音频,比调 10 小时参数更有效
- 别迷信 32kHz:微信语音播放器对音质压缩严重,24kHz 在实际体验中几乎无差别
- 先跑通,再优化:第一版只要能发语音,就是成功;后续再加缓存、并发、多音色切换
声音是人与人之间最原始的信任媒介。当你的机器人第一次用“你熟悉的声音”说出“我在呢”,那一刻,技术就不再是工具,而成了连接的桥梁。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。