English | 简体中文(当前)
本项目包含对 CosyVoice 的 Flow 与 HiFT 模块的修改版本,使其可导出为 ONNX 格式。同时也包含来自原始 CosyVoice 与 Matcha-TTS 仓库的必要源码,以保证兼容性与可用性。
matcha/hifigan/xutils.py:移除对matplotlib的依赖。matcha/models/components/flow_matching.py:移除日志记录器。cosyvoice/utils/class_utils.py:移除未使用的导入与函数。
cosyvoice/flow/flow_matching.py:调整 forward 以满足 TorchScript 要求。cosyvoice/flow/flow.py:调整 forward 以满足 TorchScript 要求;删除测试代码。cosyvoice/flow/DiT/modules.py:修改AttnProcessor,手动实现缩放点积注意力,在计算注意力分数前将 QK 转为 float32,以避免 NaN 问题。cosyvoice/hifigan/generator.py:新增 ISTFT 类替代torch.istft,同时避免使用复数张量以适配 ONNX;删除测试代码。cosyvoice/transformer/attention.py:移除对缓存的支持。cosyvoice/transformer/encoder_layer.py:移除对缓存的支持。cosyvoice/transformer/upsample_encoder.py:移除对流式的支持;调整 forward 实现以满足 TorchScript 要求。
请先安装依赖:
pip install -r requirements.txt提示:导出脚本本身不依赖 ONNX Runtime。仅在需要本地推理验证时再额外安装。
使用脚本 convert_flow_to_onnx.py 导出模型为 ONNX。
--model_path:CosyVoice 模型检查点目录路径。--flow_name:Flow 模块文件名称(默认值:flow.pt)。--half:将模块参数转换为半精度。--output_path:导出的 ONNX 文件保存路径。--int32_token:将输入 token 数据类型设为 int32(默认不指定则为 int64)。--add_speed_control:为 Flow 模块增加语速控制输入。--device:用于导出的 PyTorch 设备(默认值:default)。必须是有效的设备字符串(例如:cuda:0、cpu)。当为default时,脚本会在可用时使用cuda,否则使用cpu。
python convert_flow_to_onnx.py --device cpu --half --model_path path/to/model --output_path path/to/output.onnx --int32_token --add_speed_control使用脚本 convert_hift_to_onnx.py 导出模型为 ONNX。
--model_path:CosyVoice 模型检查点目录路径。--hift_name:HiFT 模块文件名称(默认值:hift.pt)。--output_path:导出的 ONNX 文件保存路径。--device:用于导出的 PyTorch 设备(默认值:default)。行为与 Flow 导出脚本相同。
python convert_hift_to_onnx.py --model_path path/to/model --output_path path/to/output.onnx使用脚本 compose_flow_hift.py 将已导出的 Flow 与 HiFT 模块组合为单一 ONNX。
--flow_path:Flow 的 ONNX 路径。--hift_path:HiFT 的 ONNX 路径。--output_path:组合后 ONNX 的保存路径。
python compose_flow_hift.py --flow_path path/to/flow.onnx --hift_path path/to/hift.onnx --output_path path/to/composed.onnx- 已移除流式(Streaming)支持。
- 转换 ONNX 工具只支持 CosyVoice2-0.5B 和 Fun-CosyVoice3-0.5B-2512 版本。
组合模型出错:“Bad node spec for node. Name: flow_/decoder/Loop OpType: Loop”。 经测试,在 onnx 1.19.0 版本下会出现该问题,若出现该问题,可以使用 onnx 1.16.0 版本进行组合操作,后者测试通过。
运行带速度控制的 Flow ONNX 模型时报错。
确保 speed 输入为 float32 类型的标量。例如:
speed = np.array(1.25, dtype=np.float32)或者 C++ 代码:
float speed_value = 1.25f;
Ort::Value speed = Ort::Value::CreateTensor(memory_info, &speed_value, sizeof(float), nullptr, 0, ONNX_TENSOR_ELEMENT_DATA_TYPE_FLOAT);组合模型出错:“google.protobuf.message.EncodeError: Failed to serialize proto” 该错误通常是由于电脑内存不足引起的。尝试关闭其他占用大量内存的程序,或在内存更大的电脑上运行组合脚本。
我在下面的环境中测试通过:
- Python 3.12.9/3.10.18
- PyTorch 2.8.0+cu129/2.3.1+cu121
- ONNX 1.16.0
- ONNX Runtime DirectML 1.22.0 (Python) / 1.23.0 (C++) (用于运行时验证)
- Windows 11 25H2 x64
- CosyVoice (Apache-2.0): https://github.com/FunAudioLLM/CosyVoice
- Matcha-TTS (MIT): https://github.com/shivammehta25/Matcha-TTS
本仓库再分发了受 Apache-2.0(CosyVoice)与 MIT(Matcha-TTS)许可覆盖的代码;仓库根目录的自定义转换脚本和 utils 使用 MIT 许可。详见 LICENSE 与 NOTICE 文件;修改源码时请保留上游的许可证头。