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.
- https://github.com/predict-woo/qwen3-tts.cpp
- https://github.com/predict-woo/qwen3-asr.cpp
- Slightly faster (~1000x) on ASR
- 大概就是用什么语言的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 下载二进制文件
- 如果你就是想吃苦……
- 下载 LLVM-MinGW 编译器的二进制,在Github上有仓库,Release 里
- 配置环境变量
- 下载 llama.cpp 的 Release (运行时需要它)
- 去我的 stable-diffusion.cpp fork里找到编译指南,根据它编译并使用 Dll2Lib 工具,把 ggml.dll 和 ggml-base.dll 做成 .a
- 把 ggml 项目的 includes 头文件下载了,放到这个项目的includes里面
- 改 build.bat 在里面找到 -Lsecret\libs 把这个位置改成你的 libggml.a 文件的所在文件夹
- 改 build.bat 在里面找到 -Isecret\includes 把这个位置改成你的 ggml.h 文件的所在文件夹
- 点击 build.bat 然后喝口水
- 失败了可以发issue,但更建议你问AI或者右转下载DLL
- 逗你玩的 .a 和 .h 我都提供了,猜猜在哪里呢?(不过只支持到2026-4-13的GGML,后续版本可能失效)