长文本合成怎么切:按章节、句子还是标点

2026-08-24

一本书不能一次性丢给 TTS。 它必须先被切成片段,逐段合成,再把音频拼回去。这个”切—合成—拼”的过程听起来平平无奇,但真做过的人都知道:拼出来的音频常常”听得出接缝”——前后两段像是两个人念的,段落之间没有喘息,接缝处偶尔还有一声轻微的爆响。

这篇讲三件事:为什么必须切、按什么切、拼接处的连贯性问题怎么缓解。

为什么必须切

两个原因叠加。

一是模型有输入长度限制。 这是硬约束,超过就报错或截断,没有商量余地。

二是首包延迟会变得不可接受。 这条更要命。整本书一次性送进去,用户要等到全部内容合成完毕才能听到第一个字,哪怕总耗时并不夸张,这段干等也足以毁掉体验。切开之后,第一个片段合成完就能立刻播放,后面的片段一边播一边合成——只要生成速度跟得上播放速度,用户听到的就是连续的语音。完整推演见流式 TTS 的首包延迟为什么比总耗时重要

所以切分不是为了绕开限制的权宜之计,它本身就是流式播放的前提

按什么切:句子边界优先,绝不按字数硬切

这是标题承诺要回答的问题,答案有明确的优先级。

第一优先:句子边界。 句号、问号、感叹号。这些标点天然对应语义与语气的完整单元,从这里断开,每个片段都是一句完整的话,模型有足够的上下文判断该用什么语调收尾。

第二优先:分句边界。 逗号、分号、冒号。当一个句子长到超出限制时,退而求其次从分句处断。韵律会受一点影响,但仍然落在语法结构的接缝上。

绝不做的事:按固定字数硬切。 数到第 N 个字就一刀切下去,最省事也最糟糕。切点很可能落在一个词的中间——“人工智能”被拆成”人工”和”智能”,模型读第一段时会把”工”当句尾处理,加上下沉的收尾语调,第二段又从”智”重新起调。听感上就是一个词被生生掰断,韵律彻底毁掉

另外,中文的”句子”边界比想象中模糊:省略号、破折号、引号内的对话、书名号里的长标题,都会干扰简单的标点切分。切分逻辑得和前端的文本规范化放在一起考虑,见TTS 前端在做什么:文本规范化、多音字与韵律

首句要短:流式场景的实用技巧

既然首包延迟由第一个片段决定,就有一个直接的优化手段:让第一个片段尽可能短。

不必对所有片段一视同仁。第一片段可以只取一个短句甚至半句,用最快的速度出声,从第二片段起再恢复正常长度。用户听到的是”几乎立刻开口”,而后台已经在从容合成后续内容。但这是针对首句的例外,片段不能一味求短,下一节会讲原因。

跨片段的连贯性:最难的部分

分开合成的两段,拼起来常常不是一个人在说话。具体有三种表现。

音色漂移。 尤其在零样本克隆场景,每次推理都从参考音频重新抽取说话人嵌入,两次的结果可能有细微差异。单独听每段都没问题,连起来就是”这人声音怎么变了”。

语速不一致。 时长预测受片段内容影响,一段全是短句、一段全是长定语,念出来的节奏差得很明显。

拼接处爆音。 两段波形在接缝处若不是从零幅度自然过渡,直接首尾相接会产生瞬时电平跳变,听感上是”咔”的一声。

缓解手段有三条:

  1. 固定随机种子与说话人嵌入。 说话人嵌入只抽取一次,全篇复用,不要每段重抽;能固定随机种子的实现就固定,让每次推理的随机成分保持一致。这是治音色漂移的根本手段。
  2. 片段间做短交叉淡化。 前一段的尾部淡出、后一段的头部淡入,两者有一小段重叠。爆音基本就消失了。注意淡化区要短,长了会把有效语音也淡掉。
  3. 控制每段长度不要过短。 这条最容易被忽略。过短的片段韵律更容易跑偏——模型缺少上下文来判断该用什么语调,只有三五个字时,它没法分辨这是陈述、疑问还是列举中的一项,语调往往生硬。所以”首句要短”只是针对第一句的例外,不是全篇策略。

段落停顿要显式插入静音

这是最容易踩的一个坑,因为它反直觉。

模型看不到段落结构。 原文里章与章之间空了行、段与段之间有分隔,但送进模型的只是一串文字——换行符要么被清洗掉,要么被当成普通空白。模型不知道这里是章节的结束,它不会替你留出停顿。

结果就是:一段讲完,下一段紧接着开口,中间没有任何呼吸。听众感受不到结构,一路平推到底。

正确做法是在拼接阶段显式插入静音:段落之间插一段,章节之间插更长的一段,具体时长按内容类型自己调。有声书、播客、课程讲解对停顿长度的偏好差别很大,没有通用值。

标题和正文要分开处理

章节标题和正文段落是两种不同的语言材料,该用不同的语调。标题更短、更需要强调,念完应有明确的收束;正文则要保持连贯的叙述节奏。混在一个片段里合成,模型会用同一套韵律逻辑处理,标题听起来就像正文的第一句话,结构感全丢。

分开还有个好处:标题固定、可复用,天然适合走缓存。哪些内容值得缓存、缓存键该包含什么,见TTS 的缓存策略怎么设计

和 ASR 长音频切分的对照

这两件事是一对镜像,放在一起看更清楚。

ASR 长音频切分TTS 长文本切分
切的对象音频文本
最怕什么切点落在语音中间,吃掉字切点落在词中间,毁掉韵律
理想切点静音段(没人说话的地方)句子边界(标点处)
拼接的难点重叠区去重、时间戳回加偏移音色一致、接缝无爆音
共同结论都不能按固定长度硬切

ASR 那边的完整讨论见长音频怎么切:切分点选错会吃掉哪些字。两边的共同点值得记住:切分点的位置必须由内容的结构决定,不能由计数器决定。

拼接故障排查表

故障成因缓解手段
接缝处”咔”的一声爆音两段波形在拼接点电平跳变片段间做短交叉淡化
前后两段像两个人每段重新抽取说话人嵌入,音色漂移说话人嵌入抽一次全篇复用,固定随机种子
语速忽快忽慢各片段内容差异导致时长预测不同显式指定语速参数,别让模型自由发挥
某些短片段语调僵硬片段过短,模型缺少上下文判断语调提高片段长度下限,短句与相邻句合并
词被读断、中间莫名收尾按固定字数硬切,切点落在词中间改按句子边界切,其次按分句
段落之间没有停顿,一路平推模型看不到段落结构,不会自己留白拼接时显式插入静音
标题听起来像正文标题与正文混在同一片段合成标题单独成段,单独设定语调
首句迟迟不出声第一个片段太长第一片段单独缩短

常见问题

问:按章节切行不行?

章节太长,多半超过输入长度限制,首包延迟同样不可接受。章节应作为插入长静音的位置标记保留,但不能当合成片段的单位。切分粒度是句子,章节是结构信息。

问:能不能干脆不切,找个支持超长输入的模型?

即使模型吃得下,首包延迟这一关也过不去。用户不会为了听第一句话而等完整本书合成完。切分服务的是播放体验,不只是绕开限制。

问:切分和整条合成链路的其他环节是什么关系?

切分属于工程编排层,发生在文本进入模型之前;它上游是前端文本处理,下游是声学模型与声码器。整条链路的分工见TTS 是怎么工作的:从文本到波形的三段流水线

相关阅读


本文讲的是长文本合成切分与拼接的通用工程原理,不绑定任何具体实现。 各家系统对输入长度的限制、是否支持固定随机种子、是否暴露语速与停顿控制,差异很大,请以官方文档为准。 我们没有做过性能实测,因此不给延迟一类的数字,也不给切分长度的推荐值——这些必须用你自己的内容与目标模型实测确定。

想系统学会用 AI?报名体系课或加入会员,照着学、照着用。