Kokoro-ONNX中英数字混合语音合成(支持静态推理)
这是一个基于Kokoro-82M模型的ONNX语音合成系统,支持中英文文本到语音转换。该系统采用深度学习技术,通过端到端的神经网络架构实现高质量的语音合成。
特色:目前示例代码仅支持中文、英文、数字混合,但模型支持更多语言,包括但不限于:日语、韩语、法语等。如需支持更多语言请自行调整代码。
🎯 项目特性
- 多语言支持:支持中文和英文语音合成
- ONNX推理:基于ONNX Runtime的高效推理引擎
- 动态/静态输入:支持动态和静态输入形状配置
- 高质量语音:基于Kokoro-82M预训练模型
- 音色控制:支持多种音色选择和自定义音色
- 可调节语速:支持实时语速调节
📦 环境要求
系统依赖
- Python 3.10.12+
- ONNX Runtime
- CUDA(可选,用于GPU加速)
主要依赖包
项目依赖项已导出到requirements.txt,包含以下核心组件:
onnxruntime- ONNX模型推理引擎torch- PyTorch深度学习框架numpy- 数值计算库soundfile- 音频文件处理misaki- 多语言文本处理kokoro- 语音合成核心库
🚀 快速开始
1. 模型下载&源码获取
👇👇👇👇首先需要下载模型: Kokoro-82M-v1.1-dynamic-static-ONNX👇👇👇👇👇
modelscope download --model KeanuX/Kokoro-82M-v1.1-dynamic-static-ONNX --local_dir ./2. 环境配置
安装项目依赖:
pipinstall-r requirements.txt3. 基础使用
运行语音合成:
python run.py -t"你好,这是一个语音合成测试"-o ./output.wav4. 高级参数
python run.py -t"需要合成的文本"\-o ./\-m ./models/kokoro_82M_v1.1_zh_onnx/model_dynamic.onnx\-c ./models/kokoro_82M_v1.1_zh_onnx/config.json\-v ./models/kokoro_82M_v1.1_zh_onnx/voices/zm_031.bin\-s1.0\-d python run.py -t"需要合成的文本"\-o ./\-m ./models/kokoro_82M_v1.1_zh_onnx/model_static.onnx\-c ./models/kokoro_82M_v1.1_zh_onnx/config.json\-v ./models/kokoro_82M_v1.1_zh_onnx/voices/zm_031.bin\-s1.0\参数说明:
-t, --text: 需要合成的文本(必需)-o, --output: 输出音频文件路径,默认为当前目录-m, --model: ONNX模型路径-c, --config: 模型配置文件路径-v, --voice: 音色数据文件路径-s, --speed: 合成速度因子,默认为1.0-d, --dynamic: 是否使用动态输入形状
🔧 技术原理
语音合成算法架构
本系统基于Kokoro-82M神经网络架构,采用端到端的语音合成方法:
1. 文本处理流程
输入文本 → 语言检测 → 音素转换 → 序列编码- 语言检测:自动识别中英文及数字混合文本
- 音素转换:使用misaki库将文本转换为音素序列
- 序列编码:将音素序列编码为模型可处理的token格式
2. 语音生成流程
音素序列 + 音色嵌入 → Kokoro模型 → 音频波形- 音色嵌入:使用预训练的音色向量(shape: [510, 1, 256])
- Kokoro模型:基于Transformer的序列到序列架构
- 音频解码:生成24kHz采样率的音频波形
3. 模型架构特点
Kokoro-82M模型包含以下核心组件:
编码器(Encoder)
- 多层Transformer编码器
- 自注意力机制捕获音素间关系
- 位置编码保持序列顺序
解码器(Decoder)
- 自回归生成机制
- 注意力机制对齐音素和音频帧
- 多层卷积网络处理音频特征
声码器(Vocoder)
- 基于神经网络的声码器
- 将频谱特征转换为时域波形
- 支持高质量音频重建
4. 音色控制机制
系统支持音色定制和切换:
- 音色提取:从参考音频中提取音色特征
- 音色嵌入:将音色信息编码为256维向量
- 多音色支持:支持多种预设音色和自定义音色
音色处理流程:
参考音频 → 特征提取 → 音色嵌入 → 模型融合性能优化
- ONNX优化:模型导出为ONNX格式,支持跨平台部署
- 动态形状:支持动态输入长度,适应不同文本长度
- 批处理:支持批量文本处理,提高处理效率
- GPU加速:可选CUDA支持,加速推理过程
📁 项目结构
KokoroTTS-ONNX-DS/ ├── run.py # 主运行脚本 ├── requirements.txt # 项目依赖 ├── src/ # 源代码目录 │ ├── kokoro_loader.py # Kokoro模型加载器 │ ├── tokenizer.py # 文本分词器 │ └── espeakcfg.py # Espeak配置 ├── sources/ # 资源文件 │ ├── speakers/ # 说话人参考音频 │ └── output_feats/ # 输出特征 ├── tools/ # 工具脚本 │ └── audio_handler.py # 音频处理工具 ├── logs/ # 日志文件 │ └── run_kokoro_onnx.log # 运行日志 └── models/ # 模型文件(下载后) └── kokoro_82M_v1.1_zh_onnx/ ├── model_static.onnx # 静态模型 ├── config.json # 配置文件 └── voices/ # 音色文件📊 运行日志
所有运行日志保存在logs/目录下:
run_kokoro_onnx.log- 主程序运行日志- 日志包含详细的推理过程、性能指标和错误信息
🎛️ 高级功能
音色定制
系统支持从参考音频中提取音色特征:
fromtools.audio_handlerimportextract_voice_embedding,process_speaker_wavs# 批量处理说话人音频process_speaker_wavs("./sources/speakers","./sources/output_feats")多语言混合
支持中英文数字混合文本的合成,以及其他多语言支持:
python run.py -t"Hello 你好,这是一个mixed language test测试"语速控制
支持实时语速调节(0.5x - 2.0x):
python run.py -t"需要合成的文本"-s0.8# 慢速python run.py -t"需要合成的文本"-s1.5# 快速关键语音合成算法
def__create(self,phonemes:str,voice:NDArray[np.float32],speed:float=1.0)->tuple[NDArray[np.float32],NDArray[np.int64],int]:logger.info(f"phonemes:{len(phonemes)}")phonemes=phonemes[:510]start_time=time.time()tokens=np.array(self.tokenizer.tokenize(phonemes),dtype=np.int64)assertlen(tokens)<=510,(f"Context length is 510, but leave room for the pad token 0 at the start & end")voice=voice[len(tokens)]ifself.is_dynamic:tokens=np.array([[0,*tokens,0]],dtype=np.int64)# add pad token 0 at the start & endinput_specs={self.input_names[0]:tokens,self.input_names[1]:voice,self.input_names[2]:np.array([speed],dtype=np.float32)}audio,pred_dur=self.session.run(self.output_names,input_specs)returnaudio,pred_dur,24000else:tokens=np.array([[0,*tokens,0]],dtype=np.int64)# add pad token 0 at the start & endiftokens.shape[1]!=512:pad_token_len=512-tokens.shape[1]padded_tokens=np.pad(tokens,((0,0),(0,pad_token_len)),'constant')input_specs={self.input_names[0]:padded_tokens,self.input_names[1]:voice,self.input_names[2]:np.array([speed],dtype=np.float32)}audio,pred_dur=self.session.run(self.output_names,input_specs)samples_per_dur_unit=audio.shape[0]/np.sum(pred_dur)# 计算总的单位持续时间对应的采样数valid_tokens_len=tokens.shape[1]valid_dur=pred_dur[:valid_tokens_len]total_duration=np.sum(valid_dur)# 计算有效token的总持续时间# 将持续时间转换为音频样本数(采样率24000Hz)audio_length=int(total_duration*samples_per_dur_unit)audio_length=min(audio_length,audio.shape[0])# 确保不超出实际音频长度# 裁剪音频audio=audio[:audio_length]returnaudio,pred_dur,24000🔍 故障排除
常见问题
模型加载失败
- 检查模型文件是否完整下载
- 确认ONNX Runtime版本兼容性
音频质量差
- 检查输入文本的编码格式
- 尝试不同的音色文件
推理速度慢
- 启用GPU加速(CUDA)
- 使用静态输入形状模型
音色不一致
- 确保音色文件与模型版本匹配
- 检查音色嵌入的维度一致性
📈 性能指标
- 推理速度:CPU约2-3秒/句,GPU约0.5-1秒/句
- 音频质量:24kHz采样率,16bit深度
- 内存占用:约500MB(模型加载后)
- 支持文本长度:最大510个token
🔗 相关资源
- Kokoro-82M模型
- ONNX Runtime
- ModelScope
📄 许可证
本项目采用开源许可证,具体条款请参考LICENSE文件。
🤝 贡献
欢迎提交Issue和Pull Request来改进项目。
注意:本项目基于预训练模型,仅供学习和研究使用。请遵守相关法律法规,合理使用语音合成技术。
联系
- 项目维护者:CrazyNET
- 公众号:“CrazyNET”
源码获取
您可以从以下方式获取项目源码:
- 公众号回复:“kokorods”