资讯动态

sherpa-onnx Supertonic 3 TTS 模型 INT8 量化全流程指南:从校准数据到 on-device 部署

发布时间:2026/9/15 4:43:58 来源:尧图企业网站定制
sherpa-onnx Supertonic 3 TTS 模型 INT8 量化全流程指南从校准数据到 on-device 部署【免费下载链接】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/supertonic/README.md 为主线系统讲解如何在 sherpa-onnx 仓库中将 Supertonic 3 TTS 的 ONNX 模型量化为 INT8用于端侧on-device部署。你将掌握完整的五阶段流水线下载模型 → 生成校准配置 → 导出校准数据 → 量化 → 生成 voice.bin / unicode_indexer.bin并理解运行时如何通过--supertonic-voice-style、--supertonic-unicode-indexer、--supertonic-tts-json与--sid加载量化产物并选择说话人。一、量化管线总览五阶段流水线Supertonic 3 是一套基于扩散式声学模型vector estimator vocoder的多语种 TTS 系统。为了让其 ONNX 模型能在内存与算力受限的端侧设备上运行sherpa-onnx 在 scripts/supertonic/ 目录中提供了一条完整的 INT8 量化管线gen_calib_configs → dump_inputs → convert 阶段 1 → 2 → 3 │ └── stage 4生成 voice.bin 与 unicode_indexer.bin整条管线由 run.sh 驱动共 5 个阶段04阶段作用对应脚本/动作0下载 ONNX 模型如缺失从 Hugging Face 的Supertone/supertonic-3仓库git clone后移动到assets/1生成校准配置gen_calib_configs.py2导出校准数据dump_inputs.py3量化 ONNX 模型为 INT8convert.py4生成voice.bin、unicode_indexer.bingenerate_voices_bin.py、generate_indexer_bin.py阶段划分与执行控制run.sh 支持通过位置参数精确控制执行范围./run.sh # 运行全部阶段0-4 ./run.sh 1 2 # 只运行阶段 1-2 ./run.sh 3 # 只运行阶段 3 ./run.sh 0 0 # 只下载模型 ./run.sh 4 # 只生成 voice.bin、unicode_indexer.bin ./run.sh -h # 查看用法说明其中第一个参数为起始阶段第二个参数为结束阶段默认均为 4。脚本在每个阶段前会先检查前置条件阶段 0若assets/onnx/已存在则跳过下载避免重复拉取阶段 4仅当./assets/onnx/unicode_indexer.json存在时生成unicode_indexer.bin仅当./assets/voice_styles目录存在时生成voice.bin——这正是 README 中当 JSON 存在时才生成 .bin 资产的实现细节。另外run.sh 首次运行时会从 supertonic 官方仓库下载py/helper.py依次尝试curl与wget该文件提供了UnicodeProcessor、Style、TextToSpeech、load_onnx_all等基础类供后续 dump 与量化阶段复用。二、阶段 1生成多语言校准配置gen_calib_configs校准数据是静态量化的前提。阶段 1 由 gen_calib_configs.py 生成calib_configs.json其中每条记录包含三项字段{ voice: assets/voice_styles/M1.json, text: Hello world. ..., lang: en }覆盖全部 31 种支持语言脚本内置SUPPORTED_LANGS常量覆盖 Supertonic 3 的全部语言码源码中逐一列出并可交叉校验en ko ja ar bg cs da de el es et fi fr hi hr hu id it lt lv nl pl pt ro ru sk sl sv tr uk vi脚本在生成前会执行语言码一致性检查若SUPPORTED_LANGS与内置SENTENCES字典的语言集合不匹配会直接抛出RuntimeError并列出缺失/多余的语言见 gen_calib_configs.py从源头保证校准覆盖的完整性。每种语言 4 个样本、交错排列核心生成逻辑gen_calib_configs.py固定随机种子random.seed(42)保证结果可复现每种语言采样4 条句子SAMPLES_PER_LANG 4每轮对语言顺序做random.shuffle后逐语言生成使不同语言在输出序列中交错分布——这样即使量化阶段只取默认前 100 条校准记录--ve-calib-limit 100/--vocoder-calib-limit 100也能覆盖全部 31 种语言每轮随机偏移选取说话人男声 M1-M5、女声 F1-F5 共 10 个 voice style定义于 gen_calib_configs.py部分记录会将 23 条句子拼接拉长文本长度分布i % 3 0、i % 5 0分支。执行后脚本会打印说话人分布、语言分布以及文本长度统计min/max/avg便于人工检查校准集多样性。三、阶段 2导出校准数据dump_inputs阶段 2 由 dump_inputs.py 执行python dump_inputs.py --config-file calib_configs.json --clear工作原理脚本继承 supertonic 的TextToSpeech类实现了一个带输入导出能力的DumpTextToSpeech子类。它会用 FP32 ONNX 模型对calib_configs.json中的每条记录执行一次完整 TTS 推理并在推理过程中把每个子模型的输入张量保存为.npz文件dump_inputs.py子模型导出目录保存的输入张量duration_predictorcalib/duration_predictor/text_ids、style_dp、text_masktext_encodercalib/text_encoder/text_ids、style_ttl、text_maskvector_estimatorcalib/vector_estimator/noisy_latent、text_emb、style_ttl、text_mask、latent_mask、current_step、total_stepvocodercalib/vocoder/latent其中 vector_estimator 是扩散式模型会迭代--total-step默认 8次去噪为控制校准数据量仅在最后一步信息量最丰富的一步保存输入dump_inputs.py。导出的.npz按000.npz、001.npz依次编号。关键命令行参数参数默认值说明--onnx-dirassets/onnxONNX 模型目录--dump-dircalibnpz 输出目录--total-step8去噪步数--speed1.05语速--n_test1非批量模式下合成句数--batch关闭批量模式--voice_styleassets/voice_styles/M1.jsonvoice style JSON 路径可多个--text一条示例英文句待合成文本--langen语言--clear关闭清空 dump 目录--config-file无批量配置 JSON即阶段 1 产物注意当前脚本默认使用CPUExecutionProviderGPU 模式会抛出NotImplementedErrordump_inputs.py。四、阶段 3INT8 量化convert阶段 3 由 convert.py 执行是整条管线的核心python3 convert.py \ --src-dir ./assets/onnx \ --dst-dir ./onnx_int8 \ --calib-dir ./calib \ --preprocess ort \ --vocoder-calib-from-ve \ --exclude-last-conv 8 \ --ve-calib-limit 100 \ --vocoder-calib-limit 100 \ --pad-percentile 90量化策略动态 INT8 静态 INT8 混合README 中明确了各子模型的量化方式convert.py 给出了对应实现子模型量化方式默认配置duration_predictor动态 INT8默认copy即保持 FP32--dp-mode copy仅量化 MatMul/Gemmtext_encoder动态 INT8默认copy--te-mode copyvector_estimator动态 INT8--ve-mode dynamic默认开启权重 QInt8另做 Conv 权重 W8-DQ 压缩vocoder静态 INT8使用校准数据QDQ 格式、激活 QUInt8、权重 QInt8、per-channel说明duration_predictor 与 text_encoder 的默认模式为copy直接复制 FP32 模型见 convert.py可通过--dp-mode dynamic/--te-mode dynamic显式开启动态量化。README 中duration_predictor, text_encoder, vector_estimator → dynamic INT8描述的是可配置的量化方向其中 vector_estimator 默认即开启。预处理与健壮性设计--preprocess支持onnx/ort/none三种模式默认ort会调用 ONNX Runtime 的quant_pre_process做 shape inference 与图优化并对缺失的 graph/node 名称自动补名ensure_graph_names/ensure_node_names避免后续量化工具报错静态量化过程带有多重降级策略校准数据形状不齐时回退到MinMax校准方法量化失败则直接复制 FP32 模型并打印[WARN]convert.py保证管线不中断PaddedNpzDataReader校准数据读取器会分析各输入张量的可变维度按--pad-percentile默认 90即第 90 百分位长度对校准样本做居中裁剪或尾部补零使同批校准数据形状一致mask 类输入补 0数值类补 0.0。关键量化参数一览参数默认值说明--src-dir/--dst-dir必填FP32 输入目录 / INT8 输出目录--calib-dir必填阶段 2 的 npz 校准数据目录--duration-predictor/--text-encoder/--vector-estimator/--vocoder对应文件名四个子模型文件名--dp-mode/--te-mode/--ve-modecopy/copy/dynamic动态量化开关--ve-conv-w8dq开启对 vector_estimator 的 Conv 权重做 W8-DQ每通道 INT8 反量化压缩--ve-w8dq-exclude-last-conv6尾部 N 个 Conv 不参与 W8-DQ--ve-calib-limit/--vocoder-calib-limit100校准样本数上限--vocoder-calibrate-methodPercentile校准方法MinMax / Entropy / Percentile--vocoder-act/--vocoder-wtquint8/qint8vocoder 激活/权重量化类型--vocoder-per-channel/--vocoder-reduce-range开启per-channel 量化与缩小范围--exclude-last-conv8静态量化时排除 vocoder 尾部 8 个 Conv 节点保留高精度随后--vocoder-tail-w8dq再对它们单独做 W8-DQ 权重压缩--vocoder-calib-from-ve开启用 vector_estimator 的输出 latent 构建 vocoder 校准数据--ve-output-index-1手动指定 VE 输出索引-1 时自动选择维度含 512 的 3D 浮点输出--pad-percentile90校准数据长度对齐百分位--pad-max0对齐长度上限0 表示不限制vocoder 校准数据的两条路径默认--vocoder-calib-from-ve先运行已量化的 vector_estimator将其输出的 latent形状匹配 vocoder 输入、含 512 维 latent保存为临时校准 npz再对 vocoder 做静态量化convert.py。pick_ve_output_index会自动在多个输出中挑选维度包含 512 且为 3D 浮点张量的那个作为 latent。关闭该开关时直接使用calib/vocoder/目录下阶段 2 导出的原始校准数据。量化完成后四个 INT8 模型统一以.int8.onnx后缀输出到--dst-dir例如vocoder.int8.onnx。五、阶段 4生成 voice.bin 与 unicode_indexer.bin阶段 4 负责把运行时需要的两个二进制资产从 JSON 转换而来。这是部署前的收尾工作仅在对应 JSON 存在时才执行。voice.bin多说话人风格合并python3 generate_voices_bin.py [input_dir] [output_bin]generate_voices_bin.py 将目录下所有*.jsonvoice style 文件合并为一个二进制文件每个 JSON 必须包含style_ttl与style_dp两个键且各自带dims与datagenerate_voices_bin.py校验维度两者都必须是[1, d1, d2]三维形状且各 JSON 之间的dims[1:]必须一致否则报错输出文件布局为ttl_dims(int64×3) dp_dims(int64×3) 全部 ttl 数据 全部 dp 数据按说话人轴 concat文件末尾打印合并的说话人数量与 sid 范围Merged N voice(s) - voice.bin (sid 0..N-1)。运行时每个说话人对应该文件中的一段风格切片通过--sid0..N-1 选择详见第六节。unicode_indexer.binUnicode 索引表python3 generate_indexer_bin.py [json_path] [bin_path]generate_indexer_bin.py 将unicode_indexer.json一个整数数组转换为unicode_indexer.bin逐元素校验类型必须为 int布尔值会被拒绝且在 int32 范围内generate_indexer_bin.py以np.int32、C 顺序row-major写入二进制文件。该索引表与 offline-tts-supertonic-unicode-processor.cc 配合用于运行时文本的 Unicode 归一化处理。六、运行时加载sherpa-onnx 侧的配置项量化产物最终由 sherpa-onnx 的 C 运行时消费。相关配置在 offline-tts-supertonic-model-config.cc 中注册共 7 个参数参数作用--supertonic-duration-predictorduration_predictor ONNX 模型路径--supertonic-text-encodertext_encoder ONNX 模型路径--supertonic-vector-estimatorvector_estimator ONNX 模型路径--supertonic-vocodervocoder ONNX 模型路径--supertonic-tts-jsontts.json路径TTS 全局配置--supertonic-unicode-indexerunicode_indexer.bin路径--supertonic-voice-stylevoice.bin路径配合--sid选择说话人Validate()会对上述 7 项逐一检查非空且文件存在offline-tts-supertonic-model-config.cc任一项缺失都会给出明确的错误提示。说话人选择sid 与 voice.bin 的对应关系从 offline-tts-supertonic-impl.h 可以看到运行时通过NumSpeakers()报告说话人数量并在内部把voice.bin按 sid 切分成StyleSliceView包含ttl与dp两段风格数据。也就是说voice.bin中合并了多少个 voice style JSONNumSpeakers()就返回多少通过--sid 0、--sid 1…--sid N-1选择对应说话人Generate(text, sid, speed, callback)接口offline-tts-supertonic-impl.h接收 sid 参数运行时按其索引取出风格切片参与合成。一条完整的运行时命令行示例结合 sherpa-onnx-offline-tts.cc 中的入口使用量化产物的典型命令如下路径按实际部署目录调整./bin/sherpa-onnx-offline-tts \ --supertonic-duration-predictor./onnx_int8/duration_predictor.int8.onnx \ --supertonic-text-encoder./onnx_int8/text_encoder.int8.onnx \ --supertonic-vector-estimator./onnx_int8/vector_estimator.int8.onnx \ --supertonic-vocoder./onnx_int8/vocoder.int8.onnx \ --supertonic-tts-json./assets/onnx/tts.json \ --supertonic-unicode-indexer./assets/onnx/unicode_indexer.bin \ --supertonic-voice-style./assets/voice_styles/voice.bin \ --sid0 \ --speed1.0 \ Hello, this is a test of Supertonic 3 TTS with INT8 quantization.该示例同时演示了 README 中三个核心产物的加载方式voice.bin说话人风格、unicode_indexer.binUnicode 索引、tts.jsonTTS 配置。sherpa-onnx 还提供配套的播放器示例 sherpa-onnx-offline-tts-play.cc 与 sherpa-onnx-offline-tts-play-alsa.cc便于直接试听量化后音质。七、完整实战流程与注意事项一键执行全流程# 在 scripts/supertonic/ 目录下 ./run.sh # 0-4 全流程分阶段执行的典型场景只量化模型已下载、校准数据已有./run.sh 3只做部署资产./run.sh 4增量校准后重量化./run.sh 2 3。实操注意事项网络依赖阶段 0 依赖 Hugging Face 上的Supertone/supertonic-3模型仓库阶段 3 前的脚本运行还需从 supertonic 官方仓库下载helper.py请确保网络可达校准数据清理dump_inputs.py的--clear会在重新导出前清空旧calib/目录避免新旧样本混用导致校准分布漂移校准多样性gen_calib_configs.py使用固定随机种子42输出可复现若需更丰富的文本可修改SENTENCES字典或调整SAMPLES_PER_LANG量化回退策略静态量化遇到形状不齐会先回退MinMax再失败则复制 FP32 模型并告警务必检查阶段 3 输出的[WARN]日志确认四个子模型都产出了.int8.onnxspeaker 与模型一致性voice.bin中各 JSON 的style_ttl/style_dp维度必须与模型期望一致generate_voices_bin.py会在合并时强制校验int32 范围unicode_indexer.json的元素必须在 int32 范围内否则generate_indexer_bin.py会拒绝生成运行时参数完整性sherpa-onnx 运行时会强校验全部 7 个 Supertonic 相关参数的文件存在性缺一不可。八、仓库代码索引管线入口与阶段定义run.sh校准配置生成gen_calib_configs.py校准数据导出dump_inputs.pyINT8 量化convert.pyvoice.bin 生成generate_voices_bin.pyunicode_indexer.bin 生成generate_indexer_bin.py运行时配置解析与校验offline-tts-supertonic-model-config.cc运行时实现说话人切片、生成接口offline-tts-supertonic-impl.hUnicode 处理offline-tts-supertonic-unicode-processor.cc命令行入口sherpa-onnx-offline-tts.cc、sherpa-onnx-offline-tts-play.cc通过以上流程即可把 Supertonic 3 TTS 的 FP32 ONNX 模型转换为体积更小、端侧推理更快的 INT8 模型并配合voice.bin、unicode_indexer.bin、tts.json三个资产完成完整的离线语音合成部署。【免费下载链接】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),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价