LabHub
开始
学习 学习路径 课程

语音 AI 智能体 — 会听、会查、会说的流水线

说话 — 首个声音的时间与制作“可朗读文本”

在 LabHub 中继续学习

一句话总结

TTS 的速度用 RTF(合成时间 ÷ 声音长度)来衡量。即使 RTF 小于 1,一次性合成整个回答,第一个声音也会很晚。如果按句子(或从句)切开,从第一个片段开始合成,第一个声音就能提前好几倍。而且 TTS 是按书写的样子来读的——“911”会被读成“nine hundred eleven”,“14:30”会被读成“fourteen thirty”,引用标记“[kb-hours]”会被读成“B hours”。必须单独有一个步骤,把给屏幕看的文字变成给耳朵听的文字。

为什么需要它

LabHub 口语练习中,TTS 每句话要花 2.3 秒(2026-09-23 实测,GPU 服务器)。因为是接收完整个回答之后再整体合成,所以如果模型写了五句话,就要等 12 秒——正如那个文件的注释所说,“那一刻就不是对话,而是朗读”。本课程的 TTS 在 CPU 上快得多(见下文),但原理相同。到第一个声音为止的时间,与第一个片段的长度成正比。

工作原理

Piper 与 VITS。这个镜像的 TTS 是 Piper 的 en_US ljspeech medium 语音。先用 espeak-ng 把文字转换成音素,再由 VITS(Kim et al., 2021)神经网络直接生成波形。输出是 22,050 Hz(模型卡)。训练数据 LJ Speech 是由一个人朗读的约 13,100 个片段,属于公有领域。VITS 每次合成时都会抽取噪声项,所以同一句话每次得到的波形也略有不同——这就是评分器不按采样点比较你的 WAV 的原因。

RTF 与第一个声音。在 CPU 2 核的 Pod(nuc1)上,这个模型的 RTF 约为 0.04——10 秒的内容只需 0.4 秒就能生成。同一个模型的 int8 量化版本,文件只有三分之一,RTF 却是 0.12,慢了三倍。动态量化在计算期间需要在整数和实数之间来回转换,这笔开销在这块 CPU、这种算子组合下,超过了收益。这是只看大小来选择就不对的例子。整体合成时,三句话的回答,第一个声音要等到全部合成结束时才出来;而如果按句子切开,先只合成第一句,就只需等那么长的时间。

句子切分。如果每个句号都切开,会在“Dr. Rivera”和“$3.50”处出错。规则是这样的——结束标点之后必须跟着空格和大写字母(或者文本结束),才是句子的结尾;像“Dr.”“Mr.”“No.”这样后面跟人名、数字的缩写,则不是结尾。“a.m.”也可能是句子的结尾(“…at 7:30 a.m. Results take…”)。

与 LLM 重叠。从 LLM 流中,一有文字进来就切出片段交给 TTS,在 LLM 写下一句话的同时合成前一句。小模型常常违反“简短回答”,所以句子可能很长。因此,即使没有句子结尾,也要在逗号之前的从句(五个词以上)或第十二个词处切开,由代码来决定第一个片段的长度。有一点要注意。这个 Pod 的 CPU 是 2 核,LLM 服务器也使用 2 个线程。重叠运行时,两件事会共用同样的核——第一个声音提前了,但各自比单独运行时更慢。重叠的收益,在有富余核数时最大(在模块 8 中测量)。

生成朗读文本(文本规范化)。用这个镜像的 TTS 合成,再用 ASR 转写回来,就能看出哪里会出错(实测):“Call 911”→“NINE HUNDRED ELEVEN”,“at 14:30 [kb-hours]”→“FOURTEEN THIRTY B HOURS”,“09:00”→“NINE ZERO ZERO”。所以在合成之前,要删去引用标记,把 24 小时制的时间改成上午、下午(14:30 → two thirty p m),把较长的数字改成逐位朗读(911 → nine one one),把金额改成用话说出($80 → eighty dollars)。效果用 TTS → ASR 往返 WER 来衡量——把 ASR 当作听的人,来代替人耳。

传输格式。合成的 22.05 kHz 声音,要转换成传输层约定的形态(16 kHz · s16le · 20 ms)再发出去。如果把 22050 当作 16000 直接发送,就会变成慢 1.38 倍、低沉的声音。

在现场相遇的样子

TTS 第一个声音的延迟中,常常被忽略的是首次合成的准备时间。加载模型之后的第一次调用,要准备计算图,所以很慢。因此服务在启动时会先合成一小段文字。(本课程的标准答案先调用“warm up”,就是这个原因。)这与 LabHub 给 ASR 发送静音来提前加载是同一个想法。

生成朗读文本取决于语言和地区。“14:30”在美式英语里读作“two thirty p m”,英国广播里则读作“half past two”。日期(“9/10”)在不同国家含义不同。所以要把规则集中到一处,每看到一种新的形态,就在往返 WER 测试中增加一行。本课程的规则,只是针对一种美式英语语音的最低限度。

下一项实验要做什么

合成一句话并测量 RTF,制作不会在缩写和小数处出错的句子切分。把三句话的文本,在整体合成与按句合成两种方式下比较第一个声音,并把 LLM 流切成片段,与 TTS 重叠运行。制作把文字变成朗读文本的函数,用往返 WER 测量效果,并把合成的声音转换成 16 kHz 20 ms 的帧。