Chatterbox 是 Resemble AI 的生产级开源 TTS 模型,支持 23 种语言的零样本文本转语音,采用 0.5B 参数 Llama backbone。本仓库为 华为昇腾 NPU(Ascend 910 系列) 的适配版本。
| 属性 | 说明 |
|---|---|
| 模型名称 | Chatterbox TTS |
| 开发者 | Resemble AI |
| 模型类型 | Text-to-Speech (TTS) |
| Backbone | 0.5B Llama (T3) + S3Gen + Voice Encoder |
| 总参数量 | ~797M (T3: 532M + S3Gen: 264M + VE: 1.4M) |
| 支持语言 | 23 种(含中英日韩法德西等) |
| 采样率 | 24000 Hz |
| License | MIT |
| 子模型 | 参数量 | 功能 |
|---|---|---|
| T3 (Text-to-Token) | 532,405,248 | 文本转语音 token,基于 Llama backbone |
| S3Gen (Token-to-Wave) | 263,933,767 | 语音 token 转音频波形 |
| Voice Encoder | 1,423,618 | 说话人声纹提取 |
| 参数 | 值 |
|---|---|
| NPU 型号 | Ascend 910_9362 |
| NPU 数量 | 2 卡 |
| 操作系统 | Ubuntu 22.04.5 LTS (aarch64) |
| 组件 | 版本 |
|---|---|
| Python | 3.11.14 |
| PyTorch | 2.9.0 |
| torch_npu | 2.9.0.post1 |
| CANN | 8.5.1 |
| chatterbox-tts | 0.1.7 |
| transformers | 5.2.0 |
| safetensors | 0.5.3 |
| torchaudio | 2.9.0 |
| numpy | 1.26.4 |
| scipy | 1.17.1 |
pip install chatterbox-tts torch_npu scipy从 AtomGit 或 ModelScope 下载模型权重到本地目录。
import torch
import numpy as np
import scipy.io.wavfile as wavfile
from chatterbox.tts import ChatterboxTTS
MODEL_DIR = "/path/to/chatterbox_weights/ResembleAI/chatterbox"
TEXT = "Ezreal and Jinx teamed up with Ahri, Yasuo, and Teemo to take down the enemy Nexus in an epic late game pentakill."
def save_wav(path, wav_tensor, sr):
audio = wav_tensor.squeeze().numpy()
audio = np.clip(audio, -1.0, 1.0)
audio_int16 = (audio * 32767).astype(np.int16)
wavfile.write(path, sr, audio_int16)
# 加载模型到 NPU
device = "npu:0"
model = ChatterboxTTS.from_local(MODEL_DIR, device=device)
# 生成语音
wav = model.generate(TEXT)
# 保存音频
save_wav("output_npu.wav", wav, model.sr)
print(f"Audio shape: {wav.shape}, sr={model.sr}, duration={wav.shape[-1]/model.sr:.2f}s")说明:与 GPU 版本相比,只需将
device="cuda"改为device="npu:0",使用scipy替代torchaudio保存音频即可。模型加载和推理过程无需其他代码修改。
在昇腾 NPU(Ascend 910_9362)上成功运行推理,以下是运行日志:
Loading model on npu:0...
Model loaded in 13.81s
Generating speech for: Ezreal and Jinx teamed up with Ahri, Yasuo, and Teemo to tak...
Generation took 5.55s
Saved to /opt/atomgit/output_npu.wav
Audio shape: torch.Size([1, 141120]), sr=24000, duration=5.88s输出音频信息:
| 属性 | 值 |
|---|---|
| 文件格式 | RIFF WAVE, Microsoft PCM, 16 bit, mono |
| 采样率 | 24000 Hz |
| 采样数 | 141,120 |
| 时长 | 5.88 秒 |
| 模型加载时间 | 13.81 秒 |
| 语音生成时间 | 5.55 秒 |
推理正常完成,输出音频文件格式正确,时长与输入文本长度匹配,语音内容清晰可辨识。
由于 Chatterbox TTS 是自回归采样模型,最终的音频波形会因采样随机性而不同(即使在相同 seed 下,不同硬件的随机数生成器行为也可能不同)。因此我们通过对比模型确定性中间计算结果来评估 NPU 与 CPU 的计算精度差异。
以下结果基于相同输入文本 "Hello world, this is a test.",在 CPU 和 NPU:0 上分别运行模型的确定性前向传播路径(不涉及随机采样):
| 对比层级 | MAE | 相对误差 | 余弦相似度 | 最大绝对误差 |
|---|---|---|---|---|
| Conditionals | ||||
| speaker_emb | 0.00000000 | 0.0000% | 1.00000000 | 0.00000000 |
| cond_prompt_tokens | 0.00000000 | 0.0000% | 1.00000000 | 0.00000000 |
| Text Embedding | ||||
| text_emb | 0.00000000 | 0.0000% | 0.99999946 | 0.00000000 |
| T3 Conditioning Encoder | ||||
| cond_enc_output | 0.00000032 | 0.0004% | 1.00000072 | 0.00000310 |
| T3 Transformer Forward | ||||
| input_embeds | 0.00000020 | 0.0003% | 1.00000691 | 0.00000310 |
| tfmr_hidden | 0.00000086 | 0.0012% | 1.00000477 | 0.00001693 |
| speech_logits | 0.00000124 | 0.0008% | 1.00000381 | 0.00002575 |
| 指标 | 值 |
|---|---|
| 平均相对误差 | 0.0004% |
| 最大相对误差 | 0.0012% |
| 通过标准 | 最大相对误差 < 1% |
| 结果 | PASS |
结论:NPU 与 CPU 的确定性计算结果高度一致,所有层的余弦相似度 > 0.999999,最大相对误差仅为 0.0012%,远低于 1% 的阈值要求。昇腾 NPU 上的计算精度完全满足要求。
ResembleAI 官方在 Podonos 评测平台 上提供了 Chatterbox TTS 与 ElevenLabs 等闭源 TTS 系统的人工评测对比,声称在自然度和偏好评测中表现优于 ElevenLabs。但这些评测数据为语音质量主观评分(如自然度、说话人相似度),并非 GPU vs NPU 的数值精度对比。
目前没有公开的 Chatterbox TTS 在 GPU(CUDA)上的数值精度基准数据可供对比。 原因如下:
本适配采用了以下替代验证策略:
device="npu:0" 加载模型,torch_npu 会自动将所有张量运算映射到昇腾 NPU。scipy.io.wavfile 替代 torchaudio 保存音频,以避免 NPU 环境下 torchaudio 的编码器兼容性问题。Cannot create tensor with internal format 的 UserWarning,不影响推理结果和精度。