两级式光伏MMC并网系统故障穿越Simulink仿真模型解析
2026/10/14 23:15:53
这是一个基于Kokoro-82M模型的ONNX语音合成系统,支持中英文文本到语音转换。该系统采用深度学习技术,通过端到端的神经网络架构实现高质量的语音合成。
特色:目前示例代码仅支持中文、英文、数字混合,但模型支持更多语言,包括但不限于:日语、韩语、法语等。如需支持更多语言请自行调整代码。
项目依赖项已导出到requirements.txt,包含以下核心组件:
onnxruntime- ONNX模型推理引擎torch- PyTorch深度学习框架numpy- 数值计算库soundfile- 音频文件处理misaki- 多语言文本处理kokoro- 语音合成核心库👇👇👇👇首先需要下载模型: Kokoro-82M-v1.1-dynamic-static-ONNX👇👇👇👇👇
modelscope download --model KeanuX/Kokoro-82M-v1.1-dynamic-static-ONNX --local_dir ./安装项目依赖:
pipinstall-r requirements.txt运行语音合成:
python run.py -t"你好,这是一个语音合成测试"-o ./output.wavpython 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神经网络架构,采用端到端的语音合成方法:
输入文本 → 语言检测 → 音素转换 → 序列编码音素序列 + 音色嵌入 → Kokoro模型 → 音频波形Kokoro-82M模型包含以下核心组件:
编码器(Encoder)
解码器(Decoder)
声码器(Vocoder)
系统支持音色定制和切换:
音色处理流程:
参考音频 → 特征提取 → 音色嵌入 → 模型融合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模型加载失败
音频质量差
推理速度慢
音色不一致
本项目采用开源许可证,具体条款请参考LICENSE文件。
欢迎提交Issue和Pull Request来改进项目。
注意:本项目基于预训练模型,仅供学习和研究使用。请遵守相关法律法规,合理使用语音合成技术。
您可以从以下方式获取项目源码: