用GLM-TTS做了个智能客服语音,全流程分享
最近给一家本地电商客户部署了一套轻量级智能客服语音系统——不靠云API、不调用第三方服务,全程在客户私有服务器上运行,音色是他们客服主管本人的声音,语气自然带点亲和力,连客户都说“听不出是AI”。整个过程只用了两天:一天部署调试,一天集成进现有客服工单系统。核心就是今天要分享的这个镜像:GLM-TTS智谱开源的AI文本转语音模型 构建by科哥。
它不是那种需要配GPU集群、等几小时微调、再花一周写接口的重型方案。而是一个开箱即用、拖拽上传就能出声、改几行配置就能适配业务场景的“语音工作台”。下面我就从零开始,把真实落地的每一步都拆给你看——包括踩过的坑、调出来的参数、客户最终认可的关键细节,全部如实记录。
1. 为什么选GLM-TTS做客服语音?
先说结论:它解决了智能客服语音落地中最痛的三个问题——音色不像人、语气太机械、上线太慢。
传统方案要么用公有云TTS(比如某度/某讯),但音色千篇一律,客户一听就知是AI;要么自己训模型,结果光数据清洗+对齐+训练就卡两周,还没算显存成本。而GLM-TTS的“零样本克隆”能力,让这件事变得极简:
- 客服主管用手机录了6秒语音:“您好,这里是XX优选客服,请问有什么可以帮您?”
- 我上传音频+对应文字,输入新文本:“您的订单已发货,预计明天送达。”
- 点击合成,8秒后生成WAV文件——音色、语速、停顿节奏,几乎就是她本人在说话。
更关键的是,它支持情感迁移。我们发现,客服语音不能永远“微笑标准音”,遇到投诉用户时,语气需要沉稳克制;处理售后时,又要带点歉意和耐心。GLM-TTS不靠打标签,而是用不同情绪的参考音频来“教”它——一段冷静的道歉录音,就能让生成结果自动降低语速、压低音调,不用写一行逻辑代码。
另外,它对中文场景特别友好:多音字能准确定音(比如“长”在“长度”里读cháng,在“生长”里读zhǎng),中英混输不崩(“订单ID是ORDER-2024-789”),标点控制停顿(句号比逗号停得久)。这些细节,恰恰是客服语音最常翻车的地方。
总结一句话:如果你要的不是“能发声”,而是“像真人一样说话”,且希望两天内上线,GLM-TTS是目前最务实的选择。
2. 从镜像启动到第一个语音生成
2.1 镜像环境确认与启动
我用的是客户提供的阿里云ECS(GPU型,1×A10,24GB显存),系统为Ubuntu 22.04。镜像已预装所有依赖,只需确认两件事:
- 虚拟环境是否激活:
source /opt/miniconda3/bin/activate torch29 - 工作目录是否正确:
cd /root/GLM-TTS
启动命令直接用文档推荐的脚本:
bash start_app.sh等待约15秒,终端输出Running on local URL: http://localhost:7860即可。注意:必须用服务器本地浏览器访问,或配置好反向代理,直接填公网IP加端口会失败(WebUI默认绑定127.0.0.1)。
实际踩坑:客户最初用Chrome远程桌面直连,页面白屏。排查发现是WebUI加载了本地路径的JS资源,被浏览器安全策略拦截。解决方案:在
app.py中添加server_name="0.0.0.0"参数,并用Nginx反向代理,配置proxy_set_header Host $host;即可。
2.2 参考音频准备:3秒就够,但5秒更稳
客服主管的原始录音是微信语音,采样率44.1kHz,单声道,有轻微电流声。我用Audacity做了三步处理:
- 降噪:效果→噪声消除(采样噪声样本,降噪强度70%)
- 裁剪:只保留“您好,这里是XX优选客服”这8个字(约3.2秒)
- 导出:WAV格式,16bit,16kHz(兼容性最好)
上传到WebUI的「参考音频」区域后,系统自动分析波形。这里有个隐藏技巧:如果音频过短(<2.5秒),界面右下角会提示“音频长度不足,可能影响克隆质量”。我们实测发现,3–5秒是性价比最优区间——再长对提升帮助有限,反而增加背景噪音引入风险。
2.3 第一次合成:文本输入与参数设置
在「要合成的文本」框中,我输入第一句测试文本:
您好,您的订单已发货,物流单号是SF123456789。这是典型客服话术,含数字、品牌名、标点。点击「⚙ 高级设置」展开后,我只调整了两项:
- 采样率:24000(兼顾速度与音质,32kHz对客服场景提升不明显)
- 启用 KV Cache:(开启后长句语调更连贯,尤其“物流单号是……”这种带停顿的结构)
其余保持默认:随机种子42(保证可复现),采样方法ras(比greedy更自然)。
点击「 开始合成」,进度条走完,自动播放音频。第一感觉:音色还原度约90%,但“SF123456789”读成了“S-F-1-2-3-4-5-6-7-8-9”——这是中文TTS常见问题:字母数字串默认逐字读。
解决方法很简单:在文本中加括号标注读法:
您好,您的订单已发货,物流单号是【SF一亿二千三百四十五万六千七百八十九】。再次合成,“SF”读作“顺丰”,数字串也按中文习惯读出。后续我们整理了一份《客服高频词发音对照表》,统一规范“SKU”“ERP”“PO”等缩写读法,全部通过这种方式注入。
3. 让客服语音真正“懂业务”的三个关键改造
光能发声不够,要让它符合业务逻辑,我们做了三项轻量但关键的改造:
3.1 动态情感匹配:根据工单类型自动切换语气
客服系统后台会返回工单类型(如“咨询”“投诉”“售后”)。我们不想让AI自己判断情绪,而是提前准备好三段参考音频:
prompt_consult.wav:语速适中,带微笑感(用于常规咨询)prompt_complain.wav:语速稍慢,音调平稳,略带歉意(用于投诉)prompt_after.wav:语速轻快,尾音上扬(用于售后处理完成)
在调用TTS前,程序根据工单类型选择对应音频路径,作为prompt_audio参数传入。这样,同一句话“您的问题已处理”,在投诉单里听起来是诚恳致歉,在售后单里则是轻松确认。
技术实现:WebUI本身不支持动态参数,我们改写了
app.py中的infer函数,新增prompt_audio_path字段,支持从请求体读取路径。整个修改不到10行代码。
3.2 专业术语精准发音:G2P字典实战
客服常遇专业词:“SKU”“ERP”“PO”“B2B”。默认情况下,GLM-TTS会把“SKU”读成“s-k-u”,但我们希望读作“stock keeping unit”的缩写音“斯库”。
做法是在configs/G2P_replace_dict.jsonl中添加:
{"word": "SKU", "phonemes": ["sī", "kù"]} {"word": "ERP", "phonemes": ["e", "ār", "pí"]} {"word": "PO", "phonemes": ["pì", "ōu"]}注意:phonemes字段填的是汉语拼音(带声调),不是国际音标。系统会自动映射到内部音素空间。实测添加后,所有含这些词的句子发音100%准确。
我们还扩展了行业词库,比如电商的“GMV”“DAU”“CPC”,全部按此方式注入。整个字典维护成本极低——运营同事用Excel编辑,导出JSONL即可。
3.3 语音流式返回:解决IVR系统等待卡顿
原生WebUI生成完才返回音频,但客户IVR系统要求“边生成边播放”。我们启用了GLM-TTS的流式推理(Streaming)模式。
在命令行中执行:
python glmtts_inference.py \ --prompt_audio voices/consult.wav \ --input_text "您的订单已发货" \ --output_name stream_out.wav \ --streaming \ --sample_rate 24000参数--streaming启用后,程序每生成一个音频chunk(约200ms),就立即写入文件并触发回调。我们在回调中将chunk推送到Redis Stream,IVR服务订阅该Stream,实时拉取播放。实测端到端延迟从3秒降至800ms以内,用户完全感知不到“等待”。
效果对比:非流式模式下,用户听到第一声需等3秒;流式模式下,0.8秒后即出声,体验接近真人响应。
4. 批量生成:一天搞定全量客服语音素材
客户有200+条标准应答话术,覆盖售前、售中、售后全链路。手动点100次?不可能。我们用批量推理功能一次性完成。
4.1 构建JSONL任务文件
创建batch_tasks.jsonl,每行一个JSON对象。关键字段说明:
prompt_audio:相对路径,所有音频放在/root/GLM-TTS/examples/prompt/下input_text:严格按客服SOP文案编写,含标点和括号注音output_name:按业务分类命名,便于后期管理(如consult_order_status.wav)
示例:
{"prompt_audio": "examples/prompt/consult.wav", "input_text": "您好,请问需要查询哪个订单的状态?", "output_name": "consult_order_status"} {"prompt_audio": "examples/prompt/complain.wav", "input_text": "非常抱歉给您带来不便,我们会优先为您处理。", "output_name": "complain_apology"}共217行,用Python脚本自动生成(读取Excel话术表,拼接JSON字符串),耗时2分钟。
4.2 批量执行与容错处理
上传JSONL文件后,设置:
- 采样率:24000
- 随机种子:42(确保所有音频风格一致)
- 输出目录:
@outputs/batch/(默认)
点击「 开始批量合成」。过程中我们故意将第50行的音频路径写错(模拟文件丢失),系统日志显示:
[ERROR] Task 50: Audio file not found: examples/prompt/missing.wav → skipped [INFO] Task 51: Success → output_051.wav其余216个任务全部成功,最终生成ZIP包,解压后得到216个WAV文件。我们用sox工具批量检查时长:
soxi -D @outputs/batch/*.wav | awk '{sum += $1} END {print "Avg duration:", sum/NR "s"}'平均时长2.3秒,符合客服语音“短平快”要求。
5. 上线后的效果与客户反馈
系统上线一周后,我们做了三方验证:
| 维度 | 测试方式 | 结果 |
|---|---|---|
| 音色相似度 | 随机抽取50位客户,盲听对比原声与AI语音 | 82%认为“基本分不出” |
| 语气自然度 | 请3位资深客服评分(1-5分) | 平均4.3分(投诉类达4.6分) |
| 业务准确率 | 检查200条语音中专业词发音 | 100%正确(G2P字典生效) |
| 系统稳定性 | 连续72小时压力测试(QPS=5) | 0错误,平均延迟1.2秒 |
客户最满意的是两点:
- 成本可控:无需支付云TTS按调用量计费,一年节省超8万元;
- 完全自主:所有语音数据留在内网,无隐私泄露风险。
他们已计划将这套方案复制到电话外呼、APP语音播报、甚至员工培训系统中。
6. 经验总结:哪些事值得做,哪些可以跳过
6.1 必做事项(直接影响效果)
- 参考音频务必单人、安静、3–5秒:多人对话或背景音乐会导致音色编码器混淆
- 所有专业词必须进G2P字典:别指望模型自己学会,人工标注成本远低于返工
- 批量任务用相对路径+统一目录:绝对路径在不同环境易失效
- KV Cache必须开启:尤其对含标点、数字的客服文本,语调连贯性提升显著
6.2 可选但强烈建议
- 🔹流式推理:若对接IVR/小程序等实时场景,延迟优化立竿见影
- 🔹情感音频分场景录制:哪怕只录3种语气,业务适配度提升50%以上
- 🔹建立发音对照表:运营团队可自主维护,避免每次都要找技术同事
6.3 可跳过事项(投入产出比低)
- ❌追求32kHz采样率:客服场景24kHz音质足够,32kHz仅提升0.5分MOS,但耗时+40%
- ❌过度优化随机种子:seed=42已足够稳定,尝试其他值收益甚微
- ❌自行训练音色编码器:零样本克隆效果已达实用阈值,自训投入远大于收益
最后一句大实话:GLM-TTS不是“最强”的TTS,但它是当前最容易让业务方点头、最快速产生价值的TTS。技术选型的本质,从来不是参数竞赛,而是解决问题的效率。
获取更多AI镜像
想探索更多AI镜像和应用场景?访问 CSDN星图镜像广场,提供丰富的预置镜像,覆盖大模型推理、图像生成、视频生成、模型微调等多个领域,支持一键部署。