把含特殊符号的文本直接交给 Qwen-Audio-3.0-TTS,最常见的表现不是报错,而是符号被忽略、被读成字面名称,或者导致停顿位置偏移。具体取决于符号类型、它在句子中的位置,以及文本是否经过预处理。这里先给出一条可操作的判断路径:先区分符号是「标点类」还是「业务字符类」,再决定是保留、替换还是转义。
含特殊符号的文本进入 TTS 后,通常不会让服务崩溃,但会让合成语音出现异常停顿、读错数字或把符号念出来。建议在送入模型前做一层轻量清洗:保留句末标点,替换业务符号为自然语言说法,再对有歧义的文本做试听验证。风险边界是:不同版本模型对符号的处理并不一致,不能假设所有符号都被忽略。
先判断哪些符号会影响语音合成
Qwen-Audio-3.0-TTS 这类语音合成模型,输入文本前通常会经历分词、标点预测和读音归一化。特殊符号对这几个阶段的影响不同,所以不能一句话说“能不能支持”。可以按下面三类来观察:
- 句末标点:中文句号、问号、感叹号通常能影响停顿和语气,建议保留。省略号、破折号可能导致停顿过长,需要结合试听决定是否替换为逗号。
- 业务字符:百分号、摄氏度、加减乘除、货币符号、井号、@ 等,模型可能读出“百分之”“度”“加”“at”等口播说法,也可能直接跳过。这类符号需要根据目标听众习惯决定口播写法。
- 排版符号:Markdown 标记、HTML 标签、花括号、竖线、反斜杠等,这些一般不是口语内容,建议在送入 TTS 前剔除,否则模型可能把标签名读出来,或者发生奇怪的断句。
例如“价格是 ¥99 包邮,优惠码 SAVE-50%”,如果不处理,模型可能把“¥”读成“人民币符号”,把“-”读成“减号”,把“%”读成“百分号”,整句听感很怪。而写成“价格是九十九元包邮,优惠码 SAVE 五零”,就自然得多。
给文本做一次“口语化清洗”
最稳妥的做法,是在调用 TTS 之前,把文本转成“适合朗读的纯文本”。这不是要求模型支持多少符号,而是主动消除歧义。下面给一个通用清洗骨架,可以直接按项目语言改写:
- 去掉 Markdown 标记和 HTML 标签:用正则把
#、*、_、[ ]、<...>等包裹的排版符号直接删除。 - 把计量单位改写成口语:
50%改成百分之五十,100°C改成一百摄氏度,3kg改成三公斤。 - 把连接符号替换成词:
+改加,/改斜杠或或,&改和,具体看语境。 - 保留句末标点,把句中逗号、顿号统一成逗号,避免过多特殊停顿。
- 对可能读错的字母数字串做显式标音或空格拆分,例如
SAVE50改成SAVE 五十或SAVE 五零。
这套清洗规则建议做成独立的函数,输入原始文本,输出清洗后的文本,再进入 TTS。这样后续遇到新符号,只需要维护同一张映射表。
用提示词约束或直接改写输入
如果你使用的是支持文本样式引导的 TTS 接口,可以在提示词里明确要求“按普通口语朗读,符号不读出名字”。例如:
请朗读下面文本,要求:自然口语,不读符号名;数字按正常数值读;标点只用于控制停顿。
文本:特惠价 ¥199,限量 50 件,先到先得!但要注意,提示词对 TTS 的效果不如对 LLM 明显,很多模型不保证遵守“不读符号名”的指令。更可靠的方式,是在提示词之外直接把文本改写到位。上面那个例子,如果改成:
特惠价一百九十九元,限量五十件,先到先得!就能避开大部分符号歧义。所以建议把提示词当作辅助,把清洗当作主路径。
给输入输出做对照验证
不要只依赖一次试听,特别是有多批文本时。可以做一个简单的对照清单:
- 原始文本和清洗后文本各存一份,便于定位是哪个符号导致问题。
- 用同样的参数分别合成,对比停顿、语气和是否出现“符号名”。
- 如果某类符号必须保留,例如代码变量名或数学公式,建议先用转义或拼音注释,再确认模型是否按预期读出。
- 如果清洗后仍读错,优先检查是不是分词阶段把数字和符号连在一起,例如
50%off被当成一个整体。
这类验证不需要复杂工具,用几段短音频就能判断规律。把每次的输入、输出和试听结论记录下来,慢慢就会形成自己项目里的符号处理规则。
什么情况下才需要担心“不支持”
如果文本里满是表情符号、颜文字、emoji、OCR 识别出来的特殊字符,或者有大量嵌套括号,可能让模型产生无法预测的停顿或重复音节。这不是模型“不能处理”,而是输入超出了正常朗读文本的分布。遇到这种情况,建议先做一轮粗糙清洗,把异常符号全部替换为空格,再观察断句是否合理。若仍然有明显错误,需要结合环境确认模型版本和输入限制,而不是直接断定它不支持某种格式。
总体判断是:特殊符号不是 Qwen-Audio-3.0-TTS 的开关,而是一条“输入文本质量线”。绕过问题的成本通常很低,把符号改写成口语,再试听验证,比反复猜测模型行为更可控。