Skip to content

roj234/qwen3-audio.cpp

Repository files navigation

Qwen3-audio.cpp

GGML powered Qwen3-ASR and Qwen3-TTS with C API (and a runnable python FFI cli example)
基于GGML的Qwen3-ASR和Qwen3-TTS,带有C API和可运行的python FFI CLI示例 (使用 ctypes 和 struct)

Based on the original work by predict-woo MIT, with significant fixes for Windows, C API, and memory optimization.

我可以用他做什么

  • 大概就是用什么语言的FFI做一个包装,然后自动化一些东西
  • 比如FastAPI或者KoboldServer套一个服务器什么的
  • 想要加功能的话,比C++服务器方便多了

做出的修改

  • 实现了CPU后端的线程数控制 (n_threads)
  • 实现了Min-P采样,同时删除了Top-K,另外Top-P从未存在过
  • GGUF转换脚本支持BF16格式,但在CUDA后端上未看到明显的性能提升(主要是精度可能更高,因为原模型是 BF16)
  • 能在Windows上编译 参考了部分 https://github.com/paoletto/qwen3-tts.cpp
  • 修复了无法加载1.7B模型的问题 (windows平台上的fseek要用64位版本,2GB文件大小导致的)
  • 分离了SpeechTokenizer和Transformer模型,不同模型可以共享SpeechTokenizer节省资源
  • 修复了ASR只支持16000采样率的问题,优化了线性重采样算法
  • 加入了说话者特征提取功能
  • 梅尔频谱转换采用多线程和蝶形FFT(Whisper.cpp)比起之前的DFT快一千倍
    • 由于什么bug 好像还是单线程执行的,但是单线程已经快一千倍了
    • 音频特征提取也进行了优化,不排除对特征提取能力有负面影响,但是测试用例我没听出来

存在的问题(原项目就有的)

  • AudioTokenizerEncoder 只用了一个CPU核心而且没用显卡,可能是卡在Mel频谱计算上
  • AudioTokenizerDecoder 即便提供了CUDA也只使用了CPU后端,可能和注释里 buffer lifetime 有关

其它:

  • 修改后的代码我只测试了能在 Windows 和 LLVM-MinGW 上编译和运行
  • 不建议量化(当然也可能是我的问题),我试了 Q8_0 比 F16 慢很多
  • 我没有在python参考中实现说话者ID (CustomVoice模型),但API支持,在params中设置speaker_id和language_id(如有)应该就行了
  • 加载音频文件的API不支持中文,我也懒得修(其实是不会),反正我有提供 float* 的API
  • C++做的事情越少越好

项目结构

  • python参考实现:ffi
  • GGUF转换脚本:scripts
  • ASR源代码:src_asr
  • TTS源代码:src_tts
  • 公共头文件:includes

性能

  • 建议看原项目,有图
  • 我自己的感觉是比 qwen3-tts (pytorch) 快了十倍左右,RTF能做到1
  • 没有比 qwen3-asr 快很多
  • 反正 pytorch 垃圾就对了,triton 还会真的产生很多物理(文件)垃圾

如何编译

  • 建议右边 Release 下载二进制文件
  • 如果你就是想吃苦……
  1. 下载 LLVM-MinGW 编译器的二进制,在Github上有仓库,Release 里
  2. 配置环境变量
  3. 下载 llama.cpp 的 Release (运行时需要它)
  4. 去我的 stable-diffusion.cpp fork里找到编译指南,根据它编译并使用 Dll2Lib 工具,把 ggml.dll 和 ggml-base.dll 做成 .a
  5. 把 ggml 项目的 includes 头文件下载了,放到这个项目的includes里面
  6. 改 build.bat 在里面找到 -Lsecret\libs 把这个位置改成你的 libggml.a 文件的所在文件夹
  7. 改 build.bat 在里面找到 -Isecret\includes 把这个位置改成你的 ggml.h 文件的所在文件夹
  8. 点击 build.bat 然后喝口水
  9. 失败了可以发issue,但更建议你问AI或者右转下载DLL
  10. 逗你玩的 .a 和 .h 我都提供了,猜猜在哪里呢?(不过只支持到2026-4-13的GGML,后续版本可能失效)

About

Qwen3-TTS and Qwen3-ASR use GGML and Clang-MinGW on Windows with C API and a Python FFI example

Resources

Stars

Watchers

Forks

Contributors