项目说明: 本项目为 microsoft/VibeVoice-1.5B 在华为昇腾 NPU 上的适配方案,基于原生 PyTorch + torch_npu 实现。
模型类型: Text-to-Speech (TTS) — 微软开源的多语言语音合成模型
架构: Qwen2.5-1.5B LLM backbone + DDPM Diffusion + VAE Tokenizers
⚠️ 重要: VibeVoice 是 Text-to-Speech (TTS) 模型,与 vLLM 的 Text Generation 架构不兼容,无法在 vLLM-Ascend 框架上运行。本方案提供昇腾 NPU 原生推理实现。
| 属性 | 内容 |
|---|---|
| 原始模型 | microsoft/VibeVoice-1.5B |
| 模型类型 | Text-to-Speech (TTS) / 语音合成 |
| 总参数量 | ~2.5B (LLM 1.5B + Tokenizers ~900M + Diffusion 123M) |
| LLM Backbone | Qwen2.5-1.5B (GQA, 28 layers, bfloat16) |
| Audio Tokenizers | Acoustic σ-VAE + Semantic VAE |
| Diffusion Head | DDPM, 20 steps, v-prediction |
| 输出格式 | 24kHz 音频波形 |
| 最大长度 | 65,536 tokens (~90 分钟音频) |
| 支持语言 | 英语、中文 |
vibevoice-ascend-adaptation/
├── scripts/
│ ├── vibevoice_ascend_inference.py # 核心推理引擎
│ ├── ascend_affinity_patch.py # 昇腾亲和算子优化补丁
│ └── example_tts_pipeline.py # TTS 流水线示例
├── configs/
│ └── vibevoice_1.5b_ascend.yaml # 推理配置文件
├── docs/
│ ├── VibeVoice-Ascend-Analysis.md # 适配分析报告
│ └── VibeVoice-Ascend-Deployment.md # 部署文档
├── quantization/
│ ├── QUANTIZATION_ANALYSIS.md # 量化分析报告
│ ├── config_vibevoice_llm_w4a8.yaml # W4A8 量化配置
│ ├── config_vibevoice_llm_w8a8.yaml # W8A8 量化配置
│ ├── quantize_vibevoice.py # 量化脚本
│ ├── evaluate_tts_quality.py # 音质评估脚本
│ ├── run_quantization.sh # 一键量化脚本
│ └── run_sensitivity_analysis.sh # 敏感度分析脚本
└── README.md # 本文件# 激活 CANN 环境
source /usr/local/Ascend/ascend-toolkit/set_env.sh
# 安装依赖
pip install torch==2.1.0 torch_npu==2.1.0
pip install transformers>=4.40.0 accelerate scipy soundfile librosa
pip install modelscope # 国内下载推荐# 从 ModelScope 下载(推荐,国内速度快)
python -c "from modelscope import snapshot_download; snapshot_download('microsoft/VibeVoice-1.5B', cache_dir='./models')"
# 或从 HuggingFace 镜像下载
export HF_ENDPOINT=https://hf-mirror.com
huggingface-cli download microsoft/VibeVoice-1.5B --local-dir ./models/VibeVoice-1.5B# 单条文本生成
python scripts/vibevoice_ascend_inference.py \
--model-path ./models/microsoft/VibeVoice-1.5B \
--text "Hello, this is VibeVoice on Ascend NPU." \
--output hello.wav \
--dtype bfloat16
# 基准测试
python scripts/vibevoice_ascend_inference.py \
--model-path ./models/microsoft/VibeVoice-1.5B \
--benchmark \
--text "Benchmark test." \
--dtype bfloat16# 单说话人
python scripts/example_tts_pipeline.py single
# 多说话人对话
python scripts/example_tts_pipeline.py conversation
# 中文语音
python scripts/example_tts_pipeline.py chinese| 模块 | 昇腾 NPU 兼容性 | 说明 |
|---|---|---|
| Qwen2.5 LLM | ✅ 完全支持 | 已在 vLLM-Ascend 验证,NPU 运行良好 |
| Acoustic Tokenizer | ⚠️ 支持,需验证性能 | Depthwise Conv 需确认 NPU 效率 |
| Semantic Tokenizer | ⚠️ 支持,需验证性能 | 同 Acoustic Tokenizer |
| Diffusion Head | ✅ 支持 | Linear + Random 采样,NPU 可运行 |
| vLLM 部署 | ❌ 不支持 | TTS 模型与 vLLM 架构不匹配 |
model.to("npu") + torch.amp.autocastbfloat16(昇腾 910B/C 原生支持)ACLNN_CACHE_LIMIT 加速二次启动# 1. 设备迁移
model = model.to("npu")
# 2. SDPA 回退(昇腾兼容性)
F.scaled_dot_product_attention = ascend_sdpa
# 3. CUDA 函数替换
torch.cuda.synchronize = lambda d: torch.npu.synchronize(d)
# 4. 图编译缓存
os.environ["ACLNN_CACHE_LIMIT"] = "100000"| 项目 | 最低配置 | 推荐配置 |
|---|---|---|
| NPU | Ascend 910B (32GB) | Ascend 910B/C (64GB) |
| CPU | 8 核 | 16 核以上 |
| 内存 | 32 GB | 64 GB |
| 磁盘 | 20 GB 可用空间 | 50 GB (含模型缓存) |
| 组件 | 版本要求 |
|---|---|
| OS | Ubuntu 20.04/22.04, EulerOS |
| CANN | >= 8.0.RC2 |
| Python | 3.9 / 3.10 |
| PyTorch | 2.1.0 |
| torch_npu | >= 2.1.0 (匹配 PyTorch) |
| transformers | >= 4.40.0 |
在 ~/.bashrc 或启动脚本中添加:
# CANN 环境
source /usr/local/Ascend/ascend-toolkit/set_env.sh
# NPU 性能优化
export ACLNN_CACHE_LIMIT=100000
export PYTORCH_NPU_ALLOC_CONF="max_split_size_mb:512"
export ACL_OP_COMPILER_OPT_LEVEL=2
export TASK_QUEUE_ENABLE=1| 参数 | 默认值 | 说明 |
|---|---|---|
--model-path | microsoft/VibeVoice-1.5B | 模型路径 |
--text | None | 输入文本 |
--text-file | None | 输入文本文件 |
--output | output.wav | 输出音频路径 |
--max-length | 4096 | 最大生成长度 (tokens) |
--temperature | 0.8 | 采样温度 |
--top-p | 0.95 | Nucleus sampling |
--dtype | bfloat16 | 推理精度 (bfloat16/float16/float32) |
--benchmark | False | 运行基准测试 |
--device | auto | 指定设备 (npu/cuda/cpu) |
import sys
sys.path.insert(0, './scripts')
from vibevoice_ascend_inference import VibeVoiceAscendEngine
# 初始化引擎
engine = VibeVoiceAscendEngine(
model_path="./models/VibeVoice-1.5B",
dtype=torch.bfloat16,
)
engine.load()
# 生成语音
result = engine.generate(
text="你好,这是华为昇腾 NPU 上的语音合成测试。",
max_length=2048,
temperature=0.8,
output_audio_path="chinese_output.wav",
)
print(f"生成完成,耗时: {result['generation_time']:.2f}秒")| 问题 | 解决方案 |
|---|---|
torch_npu 导入失败 | 确认 CANN 环境已激活,且 torch_npu 版本与 PyTorch 匹配 |
RuntimeError: ACL stream synchronize failed | 检查 NPU 驱动与 CANN 版本匹配;降低 max_length |
trust_remote_code 错误 | 确保模型目录包含 .py 文件,并使用 trust_remote_code=True |
| 生成音频为静音或噪声 | 确认输入为英文或中文;检查 temperature/top_p 参数 |
| 首次推理极慢 | CANN 算子编译导致,等待完成,后续使用缓存加速 |
首次在 NPU 上运行时,CANN 需要编译算子(可能耗时 5-20 分钟)。后续运行会复用缓存:
# 查看 ACLNN 缓存目录
ls ~/atc_data/aclnn_cache/
# 如需清理缓存
rm -rf ~/atc_data/aclnn_cache/*在推理前应用算子优化补丁:
from ascend_affinity_patch import patch_vibevoice_for_ascend, optimize_model_for_ascend
# 应用全局补丁
patch_vibevoice_for_ascend()
# 加载模型后优化
model = ... # load model
optimize_model_for_ascend(model)| 精度 | 显存占用 | 速度 | 音质 | 建议 |
|---|---|---|---|---|
| float32 | ~10 GB | 基准 | 最佳 | 调试使用 |
| bfloat16 | ~6 GB | 1.3x | 几乎无损 | 推荐 |
| float16 | ~6 GB | 1.3x | 几乎无损 | 备选 |
生成超长音频(如 90 分钟播客)时:
npu-smi info 观察显存占用| 模块 | 参数量估算 | 占比 | 核心算子 |
|---|---|---|---|
language_model (Qwen2.5-1.5B) | ~1.5B | 60% | Linear, GQA Attention, RMSNorm, SwiGLU |
acoustic_tokenizer (Encoder+Decoder) | ~680M | 27% | Depthwise Conv1d, ConvTranspose1d, Linear |
semantic_tokenizer (Encoder) | ~340M | 14% | Depthwise Conv1d, Linear, RMSNorm |
prediction_head (DDPM Diffusion) | ~123M | 5% | Linear, RMSNorm, Random Sampling |
connectors | ~20M | <1% | Linear, RMSNorm |
| 总计 | ~2.5B | 100% | ~5.4GB (bf16) |
| 模块 | 是否推荐量化 | 推荐方案 | 说明 |
|---|---|---|---|
| LLM (Qwen2.5-1.5B) | ✅ 强烈推荐 | W8A8 (保守) / W4A8 (性能优先) | 占 60% 参数,msmodelslim 原生支持 Qwen2 |
| Acoustic Tokenizer Encoder | ⚠️ 部分适合 | Encoder: W8A8; Decoder: 不建议 | Decoder 对精度极其敏感,量化误差会 3200x 放大 |
| Semantic Tokenizer | ⚠️ 谨慎尝试 | W8A8 (仅限 Linear 层) | 语义特征影响 LLM 输入,优先保持 bf16 |
| Diffusion Head | ⚠️ 谨慎尝试 | W8A8 (需验证) / bf16 (默认) | 20 步迭代会累积量化噪声 |
| Connectors | ❌ 不建议 | 保持 bf16 | 参数量 < 1%,收益可忽略 |
配置 A: 保守方案 (推荐首次适配)
配置 B: 性能方案 (显存受限)
# 1. 安装 msmodelslim (需匹配 CANN 版本)
pip install msmodelslim --extra-index-url https://ascend-repo.obs.cn-east-2.myhuaweicloud.com
# 2. 执行一键量化 (LLM W8A8)
bash quantization/run_quantization.sh --config quantization/config_vibevoice_llm_w8a8.yaml
# 3. 执行音质评估
python quantization/evaluate_tts_quality.py \
--baseline-dir ./audio_baseline \
--quantized-dir ./audio_quantized \
--output-report ./quality_report.jsonTTS 量化评估需使用音频域指标:
| 指标 | 用途 | 通过阈值 |
|---|---|---|
| MOS (主观) | 人类听感 | ≥ 4.0 (vs 基线 4.2+) |
| UTMOS (客观) | 神经网络 MOS 预测 | ≥ 3.8 |
| Mel-Cepstral Distortion (MCD) | 频谱包络差异 | < 3.0 dB (vs 基线) |
| F0 RMSE | 基频曲线准确度 | < 10 Hz (句子级) |
| Word Error Rate (WER) | 语音可懂度 (ASR 回译) | < 5% (vs 基线 < 3%) |
| PESQ | 语音质量感知 | ≥ 3.5 |
MOS (Mean Opinion Score): 5 分制,0.1 下降为人类基本不可感知阈值,0.3 下降为 trained listener 可感知。
虽然无法在 vLLM 中部署,但可以使用 FastAPI 搭建简单的 TTS 服务:
from fastapi import FastAPI
from pydantic import BaseModel
app = FastAPI()
engine = VibeVoiceAscendEngine(model_path="./models/VibeVoice-1.5B")
engine.load()
class TTSRequest(BaseModel):
text: str
temperature: float = 0.8
max_length: int = 4096
@app.post("/tts")
def tts(req: TTSRequest):
result = engine.generate(
text=req.text,
temperature=req.temperature,
max_length=req.max_length,
output_audio_path="/tmp/tts_output.wav",
)
return {
"audio_path": "/tmp/tts_output.wav",
"generation_time": result["generation_time"],
"num_tokens": result["num_tokens"],
}启动服务:
uvicorn tts_server:app --host 0.0.0.0 --port 8000本适配方案遵循 MIT 许可证。VibeVoice 模型本身遵循其原始许可证(MIT)。
生成时间: 2026-05-14
适配工具: adapt-agent (vLLM-Ascend Model Adaptation Skill)