如何将TTS模型Kokoro v0.19从ONNX格式转换为TFLite以在Flutter中本地运行?
如何将TTS模型Kokoro v0.19从ONNX格式转换为TFLite以在Flutter中本地运行?
嗨Martin,看起来你已经做了不少扎实的前期工作——能把Kokoro通过Flask跑通,还验证了模型本身没问题,已经迈出了一大步!想要把模型移到本地移动端摆脱网络依赖的想法完全合理,我来给你梳理几个能解决当前问题的实际方向:
先搞定你遇到的ONNX DLL导入错误
你碰到的ImportError: DLL load failed问题,在Windows环境下太常见了,多半是Python版本、ONNX预编译包和系统环境不兼容导致的。试试下面的步骤修复:
- 用干净的虚拟环境隔离依赖:别用全局的Anaconda环境,创建一个专门用于转换的环境,指定兼容性好的Python版本(比如3.9或3.10,太新的Python 3.11+可能和旧版ONNX的DLL不兼容)
- 严格匹配依赖版本:用下面的命令安装对应版本的包,避开版本冲突:
conda create -n kokoro-convert python=3.9 conda activate kokoro-convert pip install onnx==1.14.0 onnx-tf==1.15.0 tensorflow==2.10.1 - 补充系统依赖:如果还是有DLL问题,检查是否安装了Visual C++ Redistributable for Visual Studio 2019(64位版本),很多Python的C扩展包都依赖这个。
优化ONNX转TFLite的完整流程
之前的转换代码可能忽略了TTS模型的动态输入特性,导致转换失败。试试这个调整后的流程:
步骤1:补全模型形状信息(关键!)
Kokoro作为TTS模型,输入是动态长度的文本,直接转换会报错。先给模型固定输入形状(或者用形状推理补全):
import onnx from onnx import shape_inference # 加载并检查模型有效性 model = onnx.load("kokoro-v0_19.onnx") onnx.checker.check_model(model) # 补全所有节点的形状信息 model = shape_inference.infer_shapes(model) # (可选)固定输入形状,方便TFLite转换 # 先查看模型的输入节点名称 print("模型输入节点:", [input.name for input in model.graph.input]) # 假设输入节点名为"text",固定batch size为1,文本长度为64(可根据你的需求调整) for input in model.graph.input: if input.name == "text": input.type.tensor_type.shape.dim[0].dim_value = 1 input.type.tensor_type.shape.dim[1].dim_value = 64
步骤2:转换为TensorFlow SavedModel,再转TFLite
from onnx_tf.backend import prepare import tensorflow as tf # 转换为TensorFlow SavedModel tf_rep = prepare(model) tf_rep.export_graph("kokoro-tf-savedmodel") # 转换为TFLite并开启移动端优化 converter = tf.lite.TFLiteConverter.from_saved_model("kokoro-tf-savedmodel") converter.optimizations = [tf.lite.Optimize.DEFAULT] # 如果转换时遇到算子不支持,可添加允许自定义算子的配置 # converter.target_spec.supported_ops = [tf.lite.OpsSet.TFLITE_BUILTINS, tf.lite.OpsSet.SELECT_TF_OPS] tflite_model = converter.convert() # 保存最终的TFLite模型 with open("kokoro-v0_19.tflite", "wb") as f: f.write(tflite_model)
避开转换坑的替代方案:直接在Flutter中运行ONNX模型
其实你完全可以跳过TFLite转换这一步!Flutter有成熟的ONNX Runtime插件,能直接在移动端运行ONNX模型,这样你不用折腾转换,还能和你之前验证过的模型逻辑保持一致:
- 用
flutter_onnxruntime插件:在pubspec.yaml中添加依赖,把kokoro-v0_19.onnx和voices.bin放到Flutter的assets目录并声明 - 参考你之前的Python代码逻辑,用Dart调用ONNX Runtime的API处理输入输出,生成音频数据后用Flutter的音频播放组件处理
- 这个方案的优势是:你已经确认ONNX模型本身可用,不用面对转换过程中的各种兼容问题,直接实现本地运行的需求。
关于之前GitHub指南的包兼容问题
那个指南的依赖版本可能比较陈旧,建议不要直接照搬它的requirements.txt。解决包冲突的核心就是用虚拟环境隔离,然后根据官方的兼容矩阵安装对应版本的PyTorch、ONNX、TensorFlow等工具——比如PyTorch 1.13.x对应ONNX 1.13.x,onnx-tf的版本要和ONNX严格匹配。
希望这些方法能帮你搞定问题,祝你顺利把Kokoro搬到移动端!
备注:内容来源于stack exchange,提问作者Martin Váňa
相关产品推荐
相关产品推荐

