news 2026/5/11 12:36:29

ChatTTS中文数字输出问题实战:从文本预处理到语音合成的完整解决方案

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
ChatTTS中文数字输出问题实战:从文本预处理到语音合成的完整解决方案


开篇:数字朗读的那些坑

做客服系统的朋友都懂,最怕听到机器人把“您的余额为 12345.67 元”读成“一万二千三百四十五点六七”,用户直接懵:我到底还剩多少钱?金融报数、快递电话、验证码播报,场景不同,数字读法却必须“像人”。ChatTTS 默认把连续数字当成整数处理,结果“123”秒变“一百二十三”,和“一二三”相差十万八千里。痛点总结一句话:数字格式不对,业务直接翻车

方案对比:三选一怎么挑

我先后试过三条路,踩坑记录如下:

  1. 直接调 API
    最省事,却最不可控。ChatTTS 内部规则黑盒,数字读法随版本变,今天“123”是“一二三”,明天就可能变“一百二十三”。线上事故复盘时只能干瞪眼。

  2. 正则替换
    自己先把“123”换成“一二三”再喂给 ChatTTS。可控、轻量,半小时能跑通。缺点是正则写不严谨就错杀,比如把“1号线”拆成“一号线”,用户听着别扭。

  3. 自定义发音词典
    把数字、单位、多音字全部写进词典,ChatTTS 优先走词典, fallback 再走模型。前期工作量最大,但一次到位,后期基本不动。金融客户最认这条,宁可多花两天排词典,也不想上线后因为读错钱数被投诉。

一句话总结:

  • 原型阶段→直接调 API
  • 快速上线→正则替换
  • 长期运营→自定义词典

核心代码:从“123”到“一二三”

下面给出可复用的 Python3.8+ 模块,开箱即用。整体思路:正则抓数字 → 转拼音 → 拼回文本 → 喂给 ChatTTS。

# num2spell.py import re from typing import Dict, List _DIGIT_MAP: Dict[str, str] = { "0": "líng", "1": "yī", "2": "èr", "3": "sān", "4": "sì", "5": "wǔ", "6": "liù", "7": "qī", "8": "bā", "9": "jiǔ" } # 预编译正则,O(n) 扫描 _RE_NUMBER = re.compile(r"\d+(?:\.\d+)?") # 匹配 123 或 123.45 def _digits2spell(match: re.Match) -> str: """把纯数字串逐字转拼音,保留小数点读‘点’""" num: str = match.group() return " ".join(_DIGIT_MAP[ch] if ch in _DIGIT_MAP else "diǎn" for ch in num) def preprocess(text: str) -> str: """入口函数,线程安全,无全局状态""" return _RE_NUMBER.sub(_digits2spell, text)

与 ChatTTS 的集成示例(官方 SDK 假设为chattts):

import chattts from num2spell import preprocess def tts_with_num(text: str, out_wav: str): clean = preprocess(text) tts = chattts.TTS() tts.t2w(clean, out_wav) # text-to-wave

单元测试顺手写掉,pytest 一把过:

# test_num2spell.py import pytest from num2spell import preprocess @pytest.mark.parametrize("raw,exp", [ ("验证码1234", "验证码 yī èr sān sì"), ("余额123.45元", "余额 yī èr sān diǒu sì wǔ 元"), ]) def test_preprocess(raw, exp): assert preprocess(raw) == exp

时间复杂度:正则一次扫描 O(n),n 为字符数;空间复杂度:输出新字符串 O(n)。百万级文本内存占用约 2 倍原串,可接受。

性能优化:别让预处理拖垮延迟

  1. 延迟预算
    实测 200 字符文本,预处理 <1 ms,ChatTTS 本身 200 ms+,占比可忽略。但正则别写贪婪回溯,一旦用(.+\d+)+这类死亡模式,CPU 直接飙升。

  2. 大文本内存管理
    批量合成 10 MB 文稿时,避免text += text式拼接,改用io.StringIO流式读写;正则替换开启re.DEBUG观察回溯。若仍吃内存,可切片分段,每段 5 k 字符,合成完立即落盘,GC 及时回收。

生产环境注意事项

  1. 多音字陷阱
    “1月”读“yī yuè”没错,但“第一名”要读“dì yī míng”。解决思路:扩展正则,先匹配“第\d+名”“\d+月”这类固定搭配,命中就走专用函数,不走通用 digit2spell。

  2. 并发线程安全
    上面_RE_NUMBER.sub_DIGIT_MAP都是只读,无共享状态,放心直接放 Web 框架线程池。若后续动态热更新词典,加threading.RLock保护 reload 即可。

  3. 错误重试
    ChatTTS 偶现网络 502,外层包一层 tenacity:

    from tenacity import retry, stop_after_attempt, wait_exponential @retry(stop=stop_after_attempt(3), wait=wait_exponential(multiplier=1, max=10)) def safe_tts(text, out_wav): tts.t2w(text, out_wav)

    失败自动退避重试,避免把瞬时错误抛给用户。

开放讨论:自然度 vs 准确性,怎么选?

把“110”读成“yāo yāo líng”更口语,却和“一百一十”冲突;金融场景要求一字不差,客服场景又希望越自然越好。你的业务会倾向哪一边?或者,有没有办法让模型自己学会“场景感知”,先读准再读美?欢迎留言聊聊。


版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/5/10 14:59:00

告别热水焦虑?这款开源工具让宿舍洗澡不再受微信控制

告别热水焦虑&#xff1f;这款开源工具让宿舍洗澡不再受微信控制 【免费下载链接】waterctl 深圳市常工电子“蓝牙水控器”控制程序的开源实现。适用于国内各大高校宿舍热水器。 项目地址: https://gitcode.com/gh_mirrors/wa/waterctl 还在为宿舍热水受微信小程序绑架而…

作者头像 李华
网站建设 2026/5/2 3:12:31

学长亲荐8个一键生成论文工具,继续教育学生轻松搞定毕业论文!

学长亲荐8个一键生成论文工具&#xff0c;继续教育学生轻松搞定毕业论文&#xff01; 论文写作新革命&#xff1a;AI 工具如何改变你的学术之路 在当今快速发展的学术环境中&#xff0c;继续教育学生面临着越来越高的论文写作要求。无论是本科、硕士还是博士阶段&#xff0c;撰…

作者头像 李华
网站建设 2026/5/2 13:47:18

基于CosyVoice Paraformer的语音识别效率优化实战

基于CosyVoice Paraformer的语音识别效率优化实战 1. 背景痛点&#xff1a;高并发 ASR 的“三座大山” 去年双十一&#xff0c;公司把客服机器人从“按键菜单”升级成“直接说”&#xff0c;结果流量一冲上来&#xff0c;ASR 服务直接三连跪&#xff1a; P99 延迟飙到 1.8 s&…

作者头像 李华
网站建设 2026/4/19 23:27:46

4×24GB显卡怎么跑?Live Avatar多GPU配置详解

424GB显卡怎么跑&#xff1f;Live Avatar多GPU配置详解 1. 现实困境&#xff1a;为什么424GB显卡跑不动Live Avatar&#xff1f; 你可能已经试过——把四张RTX 4090插进服务器&#xff0c;满怀期待地运行./run_4gpu_tpp.sh&#xff0c;结果却在启动瞬间遭遇CUDA Out of Memor…

作者头像 李华
网站建设 2026/5/2 2:53:55

无需专业显卡!Kook Zimage在普通GPU上的幻想风格创作体验

无需专业显卡&#xff01;Kook Zimage在普通GPU上的幻想风格创作体验 1. 为什么普通人也能玩转幻想风AI绘画&#xff1f; 你是不是也经历过这样的时刻&#xff1a;看到别人生成的梦幻人像——柔光漫溢的精灵少女、悬浮于星云之中的银发法师、雾气缭绕的古堡庭院——心动不已&…

作者头像 李华
网站建设 2026/5/9 4:32:10

Chainlit调用ERNIE-4.5-0.3B-PT效果展示:中文诗歌创作与押韵控制能力

Chainlit调用ERNIE-4.5-0.3B-PT效果展示&#xff1a;中文诗歌创作与押韵控制能力 1. 为什么选这个组合来写诗&#xff1f; 你有没有试过让AI写一首真正像样的中文诗&#xff1f;不是堆砌辞藻的“伪古风”&#xff0c;而是有平仄、讲押韵、懂意象、能传情的那种&#xff1f;很…

作者头像 李华