把「文字符号」变成「声音波形」这件事,拆到机器真正在干的活。 本文档为教学性模拟——所有频谱/波形/向量均为确定性可视化,用以理解原理,非真实模型输出。
文字是离散符号 · 声音是连续波形。TTS 要学出这条映射。
同样这段文字,机器最终要吐出几十万个浮点数。这就是为什么中间要分阶段处理——直接学映射太难。
TTS 技术走过的三代。点击切换。
把预先录好的音素片段像拼图一样接起来。自然但死板,韵律僵硬。
致命缺陷:想换一个人的声音,得重新录全部片段——几乎无法克隆。Siri 早期就是这个路子。
用统计模型预测语音参数(基频、频谱包络),再喂给声码器合成波形。
比拼接灵活,但「机械感」重——听起来像机器人在念字。
端到端用深度网络学习「文字→声音」的映射。Voicebox 的 7 个引擎全部走这条路。
这也是为什么能做出自然克隆——模型学会了从参考音频提取音色条件,而非靠录音库。
输入文字,依次跑过四阶段。点 [RUN] 观察每一步产出。
音素 → 梅尔频谱 (mel-spectrogram)。时间×频率的能量图,描述「该发出什么声音」。
频谱 → 波形。HiFi-GAN 之类全卷积生成器,并行生成。
[PLAY] 用 Web Audio 把文本字符映射成方波音调序列真发声(示意,非真语音)。
选一个参考音色 → 看它被编码成「条件向量」喂给模型。模型本身不变。
参考音频经编码器压缩成固定长度的向量,代表这个人的音色/韵律。生成时作为条件输入。
各引擎自行决定怎么把「参考音频」变成喂给模型的条件。点击切换。
提前把参考音频编码成张量并缓存,推理时直接喂给模型。
先存文件路径,推理时才真正读取编码。
引擎自带一批内置音色,按 ID 查表。无克隆步骤。
Voicebox 文档里的术语 → 底层含义。
| Voicebox 概念 | 底层含义 |
|---|---|
audio_array + sample_rate | 模型最终输出波形数组;采样率定频率上限(奈奎斯特=采样率/2),LuxTTS 48kHz → 24kHz 上限,高于人耳 20kHz |
seed | 控制推理随机数。同文本+同 seed 可复现;换 seed 产生变体(即「takes」) |
needs_trim | 某些引擎输出尾部带静音,需 trim_tts_output() 截掉 |
retries_runaway | 模型偶尔失控(噪音/无限重复),检测到则拆成更小块重试 |
instruct | 自然语言风格控制,仅 Qwen CustomVoice 真正接入 instruct head |
| MLX / CUDA / MPS | 张量计算加速后端。MPS「算子缺失」=该引擎用了 PyTorch MPS 后端尚未实现的算子,退回 CPU |
| 串行 task_queue + 模型钉扎 | 显存有限(Qwen 1.7B ~6GB),串行避免争用;切换尺寸先 del 旧模型再装新的 |
固定文本,调 seed → 看波形如何变化。同 seed 必出同波形(复现);换 seed 出变体(takes)。
"The quick brown fox"
0x00000000
// text+seed 的 hash,同输入恒等
神经 TTS 推理带随机性(温度采样、dropout)。seed 锁定随机数发生器,于是「相同文本 + 相同 seed → 相同输出」,这就是复现性。换 seed 就是一次新的随机采样,得到不同变体——也就是 Voicebox 里 generate() 的 seed 参数和「takes(重生成)」功能的原理。