VibeVoice-1.5B 是微软研究院开发的前沿开源文本转语音 (TTS) 模型,专为生成长篇、多说话人的对话音频(如播客)而设计。该模型基于 Qwen2.5-1.5B 大语言模型,结合连续语音分词器和扩散解码头,能够在昇腾 NPU 上高效运行。
本仓库提供了 VibeVoice-1.5B 模型在华为昇腾 Ascend 910 NPU 上的完整适配方案,包括推理脚本、精度评测和性能测试。
| 组件 | 规格 |
|---|---|
| 语言模型 (LLM) | Qwen2.5-1.5B (28 layers, 1536 hidden, 12 heads, 2 KV heads) |
| 声学分词器 (Acoustic Tokenizer) | σ-VAE 变体, 7-stage mirrored encoder-decoder, 3200x 压缩 |
| 语义分词器 (Semantic Tokenizer) | 与声学分词器相同编码器架构, ASR 代理任务训练 |
| 扩散头 (Diffusion Head) | 4 layers, ~123M params, DDPM + DPM-Solver |
| 总参数量 | ~5.4B (含 tokenizer encoder/decoder) |
| 上下文长度 | 最大 65,536 tokens |
| 输出采样率 | 24,000 Hz |
| 推理精度 | bfloat16 (NPU) |
# 基础依赖
pip install torch==2.9.0 torch_npu transformers>=4.51.0
# VibeVoice 模型包
pip install vibevoice
# 音频处理
pip install torchaudio soundfile scipy
# 模型下载
pip install modelscope
modelscope download --model microsoft/VibeVoice-1.5Bimport torch
import torch_npu
from vibevoice.processor import VibeVoiceProcessor
from vibevoice.modular.modeling_vibevoice_inference import VibeVoiceForConditionalGenerationInference
# 加载模型
model_path = "/path/to/VibeVoice-1___5B"
qwen_tokenizer_path = "/path/to/Qwen2___5-1___5B" # Qwen2.5-1.5B tokenizer
processor = VibeVoiceProcessor.from_pretrained(
model_path, language_model_pretrained_name=qwen_tokenizer_path
)
model = VibeVoiceForConditionalGenerationInference.from_pretrained(
model_path,
torch_dtype=torch.bfloat16,
)
# 移到 NPU
device = torch.device("npu:0")
model = model.to(device)
model.eval()
# 生成播客音频
script = (
"Speaker 1: Welcome to our podcast. Today we explore the latest in AI technology.\n"
"Speaker 2: It's exciting to see how speech synthesis has advanced in recent years."
)
inputs = processor(text=script, return_tensors="pt", padding=True)
device_inputs = {k: v.to(device) if isinstance(v, torch.Tensor) else v
for k, v in inputs.items()}
with torch.no_grad():
output = model.generate(**device_inputs, max_new_tokens=512,
do_sample=True, return_speech=True)
# 保存音频
import torchaudio
audio = output.speech_outputs[0].cpu()
torchaudio.save("output.wav", audio, 24000)# 基础推理 (默认演示脚本)
python inference.py
# 指定文本推理
python inference.py --text "Speaker 1: Hello from Ascend NPU.\nSpeaker 2: The model is running well."
# 运行所有评测 (精度 + 性能)
python inference.py --all
# 仅精度评测
python eval_accuracy.py
# 仅性能测试
python eval_performance.py| 文件 | 说明 |
|---|---|
inference.py | 主推理脚本,支持播客脚本转语音及批量测试 |
eval_accuracy.py | 精度评测脚本,NPU vs CPU 误差分析 |
eval_performance.py | 性能评测脚本,吞吐/延迟/显存基准测试 |
| 参数 | 类型 | 默认值 | 说明 |
|---|---|---|---|
--text | str | - | 播客脚本文本 (Speaker N: 格式) |
--max-tokens | int | 1024 | 最大生成 token 数 |
--temperature | float | 0.9 | 采样温度 |
--top-p | float | 0.95 | Top-P 采样 |
--compile | flag | False | 启用 torch.compile 加速 |
--benchmark | flag | False | 运行性能基准 |
--accuracy | flag | False | 运行精度评测 |
--all | flag | False | 运行全部评测 |
--no-sample | flag | False | 禁用采样 (确定性推理) |
--output | str | output.wav | 输出音频路径 |
VibeVoice 使用多说话人播客格式输入:
Speaker 1: <说话人1的文本>
Speaker 2: <说话人2的文本>
Speaker 1: <后续对话>说话人 ID 从 0 或 1 开始,模型最多支持 4 个不同说话人。
评测方法:对相同输入在 NPU (bfloat16) 和 CPU (float32) 上执行前向推理,比较输出 logits 的数值差异。
| 测试用例 | 相关系数 | MAE | 最大误差 | 相对误差 | 结果 |
|---|---|---|---|---|---|
| Short English (2 speakers) | 0.999832 | 0.011008 | 0.306395 | 0.130450 | PASS |
| Medium English (2 speakers) | 0.999880 | 0.009938 | 0.173290 | 0.141079 | PASS |
| Chinese (2 speakers) | 0.999872 | 0.010177 | 0.205385 | 0.427394 | PASS |
通过标准:相关系数 > 0.99
结论:NPU (bfloat16) 与 CPU (float32) 的 logits 相关系数 > 0.999,远超 0.99 通过标准,数值精度满足要求。
注:相对误差较高是因为大量 logit 值接近零,分母极小导致比值不稳定。相关系数 (>0.999) 和 MAE (<0.02) 是更可靠的精度指标。
运行
python eval_accuracy.py获取详细评测数据。
测试环境:Ascend 910 NPU,bfloat16 精度
| 配置 | Token 数 | 耗时 (s) | Token/s | RTF | 显存 (GB) |
|---|---|---|---|---|---|
| short_256t | 256 | 10.62 | 10.9 | 1.328 | 5.12 |
| short_512t | 512 | 18.16 | 10.0 | 1.350 | 5.13 |
| medium_512t | 512 | 25.17 | 8.6 | 1.346 | 5.13 |
| medium_1024t | 1024 | 37.12 | 8.7 | 1.349 | 5.13 |
| long_1024t | 1024 | 62.25 | 8.5 | 1.337 | 5.14 |
注:性能数据请运行
python eval_performance.py获取实时结果。
model.to("npu:0"))torch.bfloat16 混合精度,Ascend 910 原生支持 bf16 计算PYTORCH_NPU_ALLOC_CONF=expandable_segments:True 启用可扩展内存段import os
import torch_npu
# 内存分配器优化
os.environ["PYTORCH_NPU_ALLOC_CONF"] = "expandable_segments:True"
# 设备初始化
device = torch.device("npu:0")
torch.npu.set_device(device)
# 同步操作 (确保执行完成)
torch.npu.synchronize()VibeVoice-1.5B/
├── inference.py # 主推理脚本
├── eval_accuracy.py # 精度评测脚本
├── eval_performance.py # 性能基准测试
├── README.md # 本文档
├── output/ # 输出目录
│ ├── results.json # 运行结果
│ ├── accuracy_*.json # 精度评测结果
│ ├── performance_*.json # 性能测试结果
│ └── demo_*.wav # 演示音频输出
└── model/ # 模型文件 (需下载)本模型基于微软研究院的 VibeVoice 模型:
@misc{microsoft2025vibevoice,
title={VibeVoice: A Frontier Open-Source Text-to-Speech Model},
author={Microsoft Research},
year={2025},
howpublished={\url{https://huggingface.co/microsoft/VibeVoice-1.5B}},
}论文: VibeVoice Technical Report
本仓库代码基于 MIT 许可证。VibeVoice-1.5B 模型权重遵循微软原始许可协议。