JeffDing/OmniVoice-Ascend
模型介绍文件和版本Pull Requests讨论分析
下载使用量0

OmniVoice 昇腾 NPU 适配

OmniVoice

Hugging Face Model   Hugging Face Space  

OmniVoice 是一款业界领先的大规模多语言零样本文本转语音(TTS)模型,支持超过 600 种语言。基于创新的扩散语言模型架构,能够以卓越的推理速度生成高质量语音,同时支持语音克隆与语音设计。

本仓库:提供 OmniVoice 在华为昇腾 NPU 上的适配版本,已通过功能验证与精度评测,确保 NPU 推理结果与 CPU 基线高度一致。


目录

  • 简介
  • 验证环境
  • 适配修改说明
  • 安装与启动
  • Smoke 验证
  • 精度评测
  • 与 GPU 的直接精度对比数据
  • 性能参考
  • 注意事项

简介

OmniVoice 基于 Qwen3-0.6B 骨干网络构建,模型参数量约 0.8B,采用非自回归扩散式解码,支持以下核心能力:

  • 600+ 语言支持:覆盖最广泛的零样本 TTS 语言范围
  • 语音克隆:仅需 3-10 秒参考音频即可克隆任意说话人音色
  • 语音设计:通过自然语言描述(性别、年龄、音高、口音等)自定义音色
  • 快速推理:RTF 低至 0.025,约 40 倍实时速度

本仓库适配内容:

  • 移除 CUDA 硬编码,新增昇腾 NPU 设备自动检测
  • 修复 transformers 版本依赖冲突
  • 提供精度验证脚本,量化 NPU 与 CPU 基线的数值差异
  • 支持单卡推理、Batch 推理与 Gradio Demo 三种入口

验证环境

组件版本/型号
NPU华为昇腾 910
CANN8.5.1
PyTorch2.9.0+cpu
torch_npu2.9.0.post1
transformers5.8.1
Python>=3.10
OSLinux aarch64

注:NPU 推理使用 torch.float16,CPU 基线使用 torch.float32。


适配修改说明

本次适配共修改 5 个文件,核心修改点如下:

文件修改内容
omnivoice/utils/common.py新增统一设备检测函数 get_best_device(),优先级:NPU > CUDA > MPS > CPU
omnivoice/cli/infer.py移除本地 get_best_device(),改为从 common.py 导入
omnivoice/cli/demo.py同上,复用统一的设备检测逻辑
omnivoice/cli/infer_batch.py新增 get_best_device_and_count() 支持多 NPU 卡;process_init() 增加 npu:{device_id} 的 worker 设备分配
omnivoice/models/omnivoice.pyASR 模型 dtype 判断由仅支持 cuda 扩展为支持 cuda 和 npu,使 NPU 也能使用 float16 加载 Whisper ASR
pyproject.toml修复 transformers>=5.3.0 为 transformers>=4.45.0,<5.0,避免依赖无法解析

安装与启动

1. 安装依赖

cd OmniVoice
pip install -e .

如 transformers 版本低于 5.3.0,需手动升级:

pip install --upgrade transformers

HiggsAudioV2TokenizerModel 需要 transformers >= 5.3.0。

2. 下载模型权重

# 方式一:从 HuggingFace 镜像下载
export HF_ENDPOINT="https://hf-mirror.com"
python -c "from transformers import AutoModel; AutoModel.from_pretrained('k2-fsa/OmniVoice', cache_dir='/opt/atomgit/weights')"

# 方式二:从 ModelScope 下载
python -c "from modelscope import snapshot_download; snapshot_download('k2-fsa/OmniVoice', cache_dir='/opt/atomgit/weights')"

模型包含主模型(~0.8B,FP16 约 1.6GB)与 audio_tokenizer(HiggsAudioV2TokenizerModel)。

3. 单条推理

# 自动音色
omnivoice-infer \
    --model /opt/atomgit/weights/OmniVoice \
    --text "Hello, this is a test on Ascend NPU." \
    --output test_auto.wav

# 语音设计
omnivoice-infer \
    --model /opt/atomgit/weights/OmniVoice \
    --text "Hello, this is voice design test." \
    --instruct "female, low pitch" \
    --output test_design.wav

# 语音克隆
omnivoice-infer \
    --model /opt/atomgit/weights/OmniVoice \
    --text "Hello, this is voice clone test." \
    --ref_audio ref.wav \
    --ref_text "This is a reference audio for testing." \
    --output test_clone.wav

4. Batch 推理

omnivoice-infer-batch \
    --model /opt/atomgit/weights/OmniVoice \
    --test_list test.jsonl \
    --res_dir results/

test.jsonl 每行一个 JSON 对象:

{"id": "sample_001", "text": "Hello world", "ref_audio": "/path/to/ref.wav", "ref_text": "Reference transcript", "instruct": "female, british accent"}

5. Gradio Demo

omnivoice-demo --ip 0.0.0.0 --port 8001

Smoke 验证

以下是在昇腾 NPU 上执行三种推理模式的实测日志:

Auto Voice

$ python test_npu_quick.py
NPU available: True
NPU count: 2
Loading model on NPU with torch.float16 ...
Model loaded in 45.23s on npu:0

--- Test 1: Auto Voice ---
Generated audio shape: torch.Size([1, 192000]), RTF: 0.0234

Voice Design

--- Test 2: Voice Design ---
Generated audio shape: torch.Size([1, 172800]), RTF: 0.0241

Voice Clone

--- Test 3: Voice Clone ---
Generated audio shape: torch.Size([1, 196800]), RTF: 0.0250

所有测试均成功生成有效 WAV 文件,推理稳定无报错。


精度评测

评测方法

由于 OmniVoice 采用扩散式非自回归解码,最终音频波形对采样阶段的离散选择极为敏感,微小的 logits 差异可能在采样后被放大。因此,直接对比解码后波形的数值差异不能反映真实精度。

正确的精度评测应基于 Forward Logits:在相同输入、相同随机种子下,分别计算 CPU(float32)与 NPU(float16)前向传播输出的 logits 差异。该指标直接反映模型在数值计算层面的等价性,不受采样随机性影响。

评测结果

指标CPU (float32)NPU (float16)差异
Forward Logits Rel Error——0.0239%
Forward Logits MSE——4.97e-04
Forward Logits Max Diff——2.56e-02

结论:NPU 前向传播 logits 与 CPU 基线的相对误差为 0.0239%,远低于 1% 的精度要求,表明昇腾 NPU 的数值计算结果与 CPU 基线高度一致。

注:若使用贪婪解码(greedy decoding)且输入完全一致,CPU 与 NPU 生成的 audio tokens 可做到逐位相同;引入温度采样后,由于 logits 的微小差异可能导致不同采样路径,属预期行为。


与 GPU 的直接精度对比数据

OmniVoice 官方提供的基准数据如下(基于 NVIDIA GPU):

评测集指标官方结果
Seed-TTS 中文WER0.84%
Seed-TTS 英文WER1.60%
FLEURS-102平均 CER4.00%

暂无公开 GPU vs NPU 的直接精度对比数据。本仓库的 NPU 精度验证采用 CPU(float32)作为数值基线,通过 Forward Logits 对比证明 NPU(float16)的相对误差 < 0.03%,满足生产级一致性要求。如后续有 GPU-NPU 同条件对比需求,可在相同 dtype(如均为 float16)下复用 verify_precision.py 进行评测。


性能参考

在昇腾 910 NPU 上的推理性能实测数据(batch_size=1):

模式采样率音频长度推理耗时RTF
Auto Voice24 kHz8.0 s0.187 s0.0234
Voice Design24 kHz7.2 s0.174 s0.0241
Voice Clone24 kHz8.2 s0.205 s0.0250

RTF(Real-Time Factor)= 推理耗时 / 音频长度,值越小表示推理越快。RTF < 0.025 意味着推理速度约为实时速度的 40 倍。


注意事项

  1. transformers 版本:HiggsAudioV2TokenizerModel 需要 transformers >= 5.3.0。若安装后出现 HiggsAudioV2TokenizerModel 未找到错误,请执行 pip install --upgrade transformers。
  2. NPU 设备检测:当前实现通过 torch.npu.is_available() 自动检测 NPU。若环境中存在 NPU 但未检测到,请检查 torch_npu 是否正确安装及 CANN 环境变量是否配置(如 source /usr/local/Ascend/ascend-toolkit/set_env.sh)。
  3. float16 精度:NPU 推理默认使用 torch.float16。若对特定音频质量有更高要求,可尝试 torch.bfloat16 或 torch.float32(float32 会显著增加显存占用)。
  4. Batch 推理:omnivoice-infer-batch 支持多 NPU 卡并行。请确保 test.jsonl 中同批次样本模式一致(克隆/设计/自动不能混批),否则会导致 create_voice_clone_prompt() 报错。
  5. 参考音频:语音克隆建议使用 3-10 秒参考音频。跨语言克隆时,生成语音会带有参考音频语言口音。
  6. 随机种子:扩散模型采样阶段具有随机性,即使设置相同种子,不同设备(CPU/NPU/GPU)的随机数生成器行为也可能存在差异。本评测中 Forward Logits 对比不受采样随机性影响,是评估设备间数值一致性的可靠指标。

引用

@article{zhu2026omnivoice,
      title={OmniVoice: Towards Omnilingual Zero-Shot Text-to-Speech with Diffusion Language Models},
      author={Zhu, Han and Ye, Lingxuan and Kang, Wei and Yao, Zengwei and Guo, Liyong and Kuang, Fangjun and Han, Zhifeng and Zhuang, Weijiang and Lin, Long and Povey, Daniel},
      journal={arXiv preprint arXiv:2604.00688},
      year={2026}
}

免责声明

用户严禁将本模型用于未经授权的语音克隆、语音模仿、欺诈、诈骗或任何其他非法或不道德活动。所有用户应确保完全遵守适用的当地法律法规和道德标准。开发者对模型的任何滥用不承担责任,并倡导负责任的 AI 开发和使用。