中文多说话人 TTS 模型,基于 SAMBERT 声学模型 + HiFiGAN 声码器。
| 项目 | 值 |
|---|---|
| 模型类型 | Text-to-Speech (TTS) |
| 语言 | 中文普通话 |
| 说话人 | F7 (女声默认) |
| 采样率 | 16kHz |
| 声学模型 | KanTtsSAMBERT (Transformer + FSMN) |
| 声码器 | HiFiGAN |
pip install torch numpy pyyamlpython3 inference.py --text "今天天气真好" --output output.wav| 参数 | 默认值 | 说明 |
|---|---|---|
--text | 今天天气真好 | 输入文本 |
--output | output.wav | 输出音频文件 |
--voice | F7 | 说话人 (当前仅支持 F7) |
--model_dir | ./ | 模型根目录 |
import sys
sys.path.insert(0, '.')
from inference import main
# 命令行方式
# python3 inference.py --text "你好世界" --output hello.wav$ python3 inference.py --text "北京今天天气怎么样" --output /tmp/test.wav
AM: 395/395 loaded
Mel: torch.Size([1, 60, 80]), range: [-3.56, 1.96]
Voc: 318/318 loaded
Saved /tmp/test.wav: 16000Hz, 0.75s| 指标 | 值 |
|---|---|
| MSE | 1.68e-06 |
| MAE | 1.01e-03 |
| Max Abs Error | 6.34e-03 |
| Cosine Similarity | 0.999957 |
| SNR | 40.6 dB |
结论: FP16 精度损失可忽略 (cos_sim > 0.999),GPU 推理与 CPU 输出一致。
此模型从 ModelScope 下载后进行了以下适配:
位置编码数值溢出 — 原代码 exp(inv * log(10000)) 在大模型维度时 NaN,修正为 exp(inv * log(10000.0) / d)
FSMN 架构错误 — FSMN 和 BLSTM 应为串联架构 (FSMN → Linear → BN),而非并联
条件嵌入维度不匹配 — pitch/energy/emotion 嵌入从 32 维投影到 128 维
PostnetFSMN 维度不匹配 — Postnet 输入 80 维而 memory 要求 256 维,添加 FFN 投影层
HiFiGAN ResBlock 聚合错误 — 残差块输出应求和 .sum(0) 而非平均 .mean(0)
repeat_ups, deconv) 映射到代码结构.
├── inference.py # 推理脚本
├── voices/
│ ├── voices.json # 说话人列表
│ └── F7/
│ ├── am/
│ │ ├── config.yaml
│ │ └── ckpt/ # 声学模型权重
│ └── voc/
│ ├── config.yaml
│ └── ckpt/ # 声码器权重
└── README.mdModelScope 模型权重许可