
sherpa-onnx 集成 KittenTTS v0.8从 Hugging Face 原始权重到可运行 TTS 模型的完整转换指南【免费下载链接】sherpa-onnxSpeech-to-text, text-to-speech, speaker diarization, speech enhancement, source separation, and VAD using next-gen Kaldi with onnxruntime without Internet connection. Support embedded systems, Android, iOS, HarmonyOS, Raspberry Pi, RISC-V, RK NPU, Axera NPU, Ascend NPU, x86_64 servers, websocket server/client, support 12 programming languages项目地址: https://gitcode.com/GitHub_Trending/sh/sherpa-onnx本文以 scripts/kitten-tts/README.md 为核心系统讲解如何在 sherpa-onnx 项目中通过 scripts/kitten-tts/v0_8/run.sh 一键将上游 KittenML 发布的 KittenTTS v0.8 原始模型资产转换为 sherpa-onnx 兼容的离线 TTS 模型目录。读完本文你将掌握四款 v0.8 型号的转换命令、voices.bin/tokens.txt的生成原理、写入 ONNX 元数据version8、end_id10、add_pad_after_end1、max_token_len400的语义以及转换产物在 C 运行时 offline-tts-kitten-model.cc 中的消费方式。一、KittenTTS 与 sherpa-onnx 的集成背景KittenTTS 是 KittenML 开源的一族轻量级神经网络语音合成模型上游仓库为 KittenML/KittenTTS。sherpa-onnx 在scripts/kitten-tts/目录下提供了从上游 Hugging Face 资产出发、生成 sherpa-onnx 兼容模型目录的整套脚本链覆盖了多个模型版本nano_v0_1/v0.1 nano 版转换脚本含convert_opset.py、show.py、test.py等辅助工具nano_v0_2/v0.2 nano 版转换脚本v0_8/本文主角v0.8 系列nano fp32 / nano int8 / micro / mini的转换脚本。与早期版本相比v0.8 目录的脚本链更精简run.sh、add_meta_data.py、generate_samples.py、generate_tokens.py、generate_voices_bin.py并且由run.sh根据传入的模型名自动映射 ONNX 文件名、输出文件名与最终包目录名实现了「一行命令出一个可用模型目录」的自动化流程。从源码结构看sherpa-onnx 在 sherpa-onnx/csrc/offline-tts-kitten-model.cc 与 sherpa-onnx/csrc/offline-tts-kitten-model-meta-data.h 中实现了 KittenTTS 模型的运行时支持因此本文转换出的模型目录可以直接被OfflineTts加载推理。二、环境准备与依赖转换脚本基于 Python 3依赖numpy解析voices.npz、拼接二进制 voices与onnx读写 ONNX 模型元数据。run.sh脚本开头内置了依赖自检逻辑见 run.sh通过importlib.util.find_spec检测numpy与onnx是否可用缺失时会在 stderr 打印安装提示并退出。按 README 与脚本提示安装依赖python3 -m pip install numpy onnx之后进入 v0.8 脚本目录cd scripts/kitten-tts/v0_8三、四种 v0.8 型号与一键转换命令README 给出了四款 KittenTTS v0.8 模型的转换命令。run.sh的第一个位置参数是模型名支持两种写法完整 Hugging Face 仓库名如KittenML/kitten-tts-nano-0.8-fp32省略命名空间KittenML/的短名脚本会自动补全见 run.sh。./run.sh KittenML/kitten-tts-nano-0.8-fp32 ./run.sh KittenML/kitten-tts-nano-0.8-int8 ./run.sh KittenML/kitten-tts-micro-0.8 ./run.sh KittenML/kitten-tts-mini-0.83.1 模型名与产物映射run.sh通过case分支按模型名关键字解析出三类信息run.sh模型名关键字上游 ONNX 文件名输出模型文件名包目录名kitten-tts-nano-0.8-int8kitten_tts_nano_v0_8.onnxmodel.int8.onnxkitten-nano-en-v0_8-int8kitten-tts-nano-0.8含 fp32kitten_tts_nano_v0_8.onnxmodel.fp32.onnxkitten-nano-en-v0_8-fp32kitten-tts-micro-0.8kitten_tts_micro_v0_8.onnxmodel.onnxkitten-micro-en-v0_8kitten-tts-mini-0.8kitten_tts_mini_v0_8.onnxmodel.onnxkitten-mini-en-v0_8注意case分支中*kitten-tts-nano-0.8-int8*排在*kitten-tts-nano-0.8*之前因此 int8 变体会命中 int8 分支而不会被 fp32 分支误匹配。凡不匹配上述任何模式的模型名脚本会打印Unsupported KittenTTS v0.8 model并退出。对于未知或未在 README 中列出的模型可通过run.sh --help或直接阅读脚本注释了解参数约定默认模型为KittenML/kitten-tts-nano-0.8-fp32run.sh。四、转换流水线run.sh 做了什么run.sh采用set -ex任何一步失败都会立即中止并打印执行命令便于排错。整体流程分为四步4.1 下载上游资产base_urlhttps://huggingface.co/${model_name}/resolve/main if [ ! -f ${onnx_name} ]; then curl -SL -O ${base_url}/${onnx_name} fi if [ ! -f voices.npz ]; then curl -SL -O ${base_url}/voices.npz fi脚本通过curl -SL -O从https://huggingface.co/model_name/resolve/main下载两份资产run.shONNX 模型文件如kitten_tts_nano_v0_8.onnxvoices.npz包含全部参考音色speaker reference voices的 NumPy 压缩存档。两个if [ ! -f ... ]判断实现了断点续传/缓存复用文件已存在时跳过下载方便多次转换不同模型时共享已下载资产。4.2 复制模型并生成 voices.bincp ${onnx_name} ${output_name} ./generate_voices_bin.py ./generate_tokens.pygenerate_voices_bin.py将voices.npz中按说话人命名的浮点数组顺序拼接为裸二进制voices.bingenerate_voices_bin.py。关键实现细节说话人列表固定为 8 个expr-voice-2-m、expr-voice-2-f、expr-voice-3-m、expr-voice-3-f、expr-voice-4-m、expr-voice-4-f、expr-voice-5-m、expr-voice-5-fgenerate_voices_bin.py其下标即 speaker id每个音色向量按np.float32写出并调用np.ascontiguousarray保证内存连续注释指出 v0.8 下单个音色 shape 通常为(400, 256)脚本具备幂等性若voices.bin已存在则直接跳过skip提示避免重复覆盖speaker2id/id2speaker两个映射会被add_meta_data.py导入复用确保元数据中的 id 映射与voices.bin的拼接顺序严格一致。generate_tokens.py依据上游kittentts/onnx_model.py的词汇表规则生成tokens.txtgenerate_tokens.py。词汇表组成如下填充符$padid 0标点集合;:,.!?¡¿—…«»含空格英文字母A-Z a-z完整的 IPA 音标符号集ɑɐɒæɓʙβɔɕçɗɖðʤ...用于承载英文音素表征。最终以符号 序号的格式逐行写入tokens.txt。该文件配合has_espeak1元数据使用sherpa-onnx 侧使用 espeak-ng 完成文本到音素的转换再按该词汇表映射为 token id。4.3 写入 ONNX 元数据./add_meta_data.py --model ./${output_name} --model-name ${model_name}add_meta_data.py在 ONNX 模型中写入 sherpa-onnx 运行时所需的全部元数据add_meta_data.py并在处理前后各打印一次model.metadata_props便于核对。完整属性如下元数据键值v0.8含义model_typekitten-tts运行时据此识别为 KittenTTS 系列languageEnglish支持语言v0.8 仅支持英文has_espeak1文本前端使用 espeak-ng 生成音素sample_rate24000输出音频采样率 24 kHzversion8模型版本号对应 v0.8voiceen-us音素前端声学方言配置max_token_len400单次推理最大 token 长度start_id0起始符 token idend_id10结束符 token idpad_id0填充符 token idadd_pad_after_end1遇到 end 后追加一个 pad与上游行为一致style_dim逗号分隔的 shape如400,256参考音色向量的维度n_speakers8音色说话人数量speaker2id/id2speaker逗号分隔映射说话人名与 id 双向映射speaker_names逗号分隔的说话人名列表供上层展示/选择speaker_speed_priors逗号分隔浮点每个说话人的语速先验model_url/see_also/maintainer/comment溯源信息模型出处与维护者说明值得注意的两处细节语速先验speaker_speed_priors对于 nano 模型kitten-tts-nano-0.8关键字命中脚本使用NANO_SPEED_PRIORS表为特定说话人赋予非 1.0 的语速先验如expr-voice-4-m为 0.9其余多为 0.8见 add_meta_data.pymicro/mini 模型则统一为1.0add_meta_data.py。这些先验会在运行时与用户请求的 speed 相乘。元数据覆盖方式脚本先del model.metadata_props[:]清空原有属性再逐条追加保证结果干净可控add_meta_data.py。4.4 组装最终模型包mkdir -p ${package_dir} cp ${output_name} ${package_dir}/ cp voices.bin tokens.txt ${package_dir}/ ls -lh ls -lh ${package_dir}最终每个型号得到独立目录例如kitten-mini-en-v0_8/、kitten-micro-en-v0_8/、kitten-nano-en-v0_8-fp32/、kitten-nano-en-v0_8-int8/内含三件套package_dir/ ├── model.onnx / model.fp32.onnx / model.int8.onnx # 带元数据的 ONNX 模型 ├── voices.bin # 8 个参考音色的裸二进制 └── tokens.txt # 符号到 token id 的词汇表脚本末尾两次ls -lh分别打印工作目录与包目录方便核对产物大小与文件清单。五、产物如何被 sherpa-onnx 运行时消费转换产物的消费入口是 sherpa-onnx/csrc/offline-tts-kitten-model.cc其行为与元数据严格对应音色加载与索引构造时读取config.kitten.voices指定的voices.bin运行时按(speaker_id, style_row)从styles_缓冲区中切片出当前句子的风格嵌入向量offline-tts-kitten-model.cc。style_rows来自元数据style_dim的第一个维度这正是voices.bin拼接顺序必须与speaker2id一致的原因。语速先验合并当模型元数据携带speaker_speed_priors时推理阶段会将用户传入的speed与该说话人的先验相乘若请求的 sid 超出先验数组长度会直接报错退出offline-tts-kitten-model.cc。另外若配置length_scale ! 1且用户未显式传 speed会以1/length_scale作为基础 speed。元数据默认值offline-tts-kitten-model-meta-data.h 中max_token_len默认 256、add_pad_after_end默认 0、version默认 1v0.8 脚本显式写入max_token_len400、add_pad_after_end1、version8正是为了让运行时选择与上游一致的行为即 README 所说「selects the same style row as upstream」。从源码结构还可以推断version元数据会被运行时用于区分不同 KittenTTS 版本的推理细节如 style 行选择策略与 token 后处理因此保持版本号正确是转换链路中不可省略的一步。六、转换注意事项与排错依赖缺失运行run.sh前确保已安装numpy、onnx否则脚本会提示Missing Python packages并退出。网络要求转换过程需要从 Hugging Face 下载模型与voices.npz网络不可达时脚本会失败已下载的文件会被缓存复用。模型名匹配必须使用 README 中列出的四款模型或其短名run.sh的case分支不支持其他名称否则报Unsupported KittenTTS v0.8 model。set -ex行为任一步骤失败立即中止日志中开头的行即实际执行的命令可用于快速定位失败点。包目录名即模型目录转换完成后将package_dir整体放入资源目录并在OfflineTtsModelConfig中把kitten.model指向model.onnxfp32/int8 分别指向model.fp32.onnx、model.int8.onnx、kitten.voices指向voices.bin即可加载。七、与其他版本脚本的差异与 v0.8 相比早期的nano_v0_1/、nano_v0_2/脚本见 nano_v0_1/run.sh 与 nano_v0_2/run.sh流程更繁琐需要额外执行convert_opset.py转换 ONNX opset、show.py检查模型输入输出输出为model.fp16.onnx且不自动生成包目录。v0.8 脚本则内置了模型名解析、产物命名与目录组装把整个转换收敛为「下载 → 生成 voices/tokens → 写元数据 → 打包」四步显著降低了接入成本。对需要对比版本行为的开发者可在转换后分别用 v0.1/v0.2/v0.8 的产物运行离线 TTS 示例并比较合成音频以验证version元数据对解码风格的影响。至此你已拥有将 KittenTTS v0.8 全系列模型接入 sherpa-onnx 的完整链路从 README 中的四条转换命令出发理解run.sh每一步的文件产物与元数据语义并能结合运行时源码定位音色索引、语速先验与 token 后处理的具体实现位置。【免费下载链接】sherpa-onnxSpeech-to-text, text-to-speech, speaker diarization, speech enhancement, source separation, and VAD using next-gen Kaldi with onnxruntime without Internet connection. Support embedded systems, Android, iOS, HarmonyOS, Raspberry Pi, RISC-V, RK NPU, Axera NPU, Ascend NPU, x86_64 servers, websocket server/client, support 12 programming languages项目地址: https://gitcode.com/GitHub_Trending/sh/sherpa-onnx创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考