
moonshine-tts 美式英语 G2P 数据包解析CMUdict 词库、OOV ONNX 与端到端重建指南【免费下载链接】moonshineVery low latency speech to text, intent recognition, and text to speech, for building voice agents and interfaces项目地址: https://gitcode.com/GitHub_Trending/moonshine3/moonshine本指南以 moonshine-tts 英文美式G2P 数据包core/moonshine-tts/data/en_us/为核心完整讲解其三大组成资产过滤词库、G2P 配置、OOV ONNX 模型的运行时作用、数据来源与从 CMUdict 原始数据到可部署产物的重建流程。读完本文你将掌握如何下载、裁剪、训练、导出并正确部署英文 G2P 数据理解词库命中、异形词消歧、集外词OOV预测与手写规则回退的完整调用链并能够用仓库内的测试与校验流程验证产物的一致性。数据包角色en_us 在英文 G2P 流水线中的位置moonshine-tts 的 C 运行时把「文本 → 音素IPA」的 G2P 能力做成按语言分组的资产束统一挂在同一个--model-root之下moonshine-tts的 speak 与 G2P-only CLI 都会消费这些资产。core/moonshine-tts/data/README.md 的目录索引将en_us描述为English CMU-style lexicon OOV ONNX (no heteronym ONNX in-tree)这句话点出了 en_us 数据包的三个关键事实词库是 CMU 风格的底层读音来自 CMU Pronouncing Dictionary并转写为 IPA带一个 OOV集外词ONNX 模型用于覆盖词库里查不到的单词不携带异形词heteronymONNX多读音单词的消歧在运行时用排序取第一个的策略完成而不是依赖独立的歧义消解模型。数据包结构如下目录层级来自仓库实际布局core/moonshine-tts/data/en_us/ ├── README.md ├── dict_filtered_heteronyms.tsv # CMUdict 派生词库eSpeak NG 对齐裁剪后 ├── g2p-config.json # 运行时开关uses_dictionary / uses_oov_model └── oov/ ├── model.onnx # 贪心 字符→音素 解码模型 └── onnx-config.json # 词汇表 索引合并后的导出配置需要特别说明的是二进制模型与词库文件不直接检入 git这一点在 core/moonshine-tts/data/README.md 中有明确说明en_us目录当前只有README.md一个文本文件。离线构建或测试前需要在仓库根目录执行scripts/fetch-voice-assets.sh tts运行时 SDK 则会按需从https://download.moonshine.ai/tts/下载同一批文件。三大资产逐一拆解dict_filtered_heteronyms.tsv裁剪后的 CMUdict 词库这是英文 G2P 的主查表。文件名为dict_filtered_heteronyms.tsv含义是dict来自 CMU Pronouncing Dictionarycmudict.dict经cmudict_ipa仓库转换为 IPAfiltered用语料 eSpeak NG 对齐filter_dict_by_espeak_coverage.py裁掉了稀有读音控制词库体积同时保留常见词的多读音信息heteronyms虽然经过了裁剪词表中仍然保留着一部分一词多音条目——这些正是运行时需要在没有 heteronym ONNX 的情况下自行消歧的对象。C 侧解析该 TSV 的实现位于 core/moonshine-tts/src/lang-specific/cmudict-tsv.cpp运行时默认路径键定义为en_us/dict_filtered_heteronyms.tsv见 core/moonshine-tts/src/moonshine-g2p-options.h。g2p-config.jsonG2P 行为开关g2p-config.json用两个布尔字段描述英文后端的行为uses_dictionary是否启用词库查表uses_oov_model是否启用 OOV ONNX 模型。对仓库内配套的布局该字段必须为true——C 工厂在uses_oov_model打开时会强制要求存在 OOV ONNX否则直接抛异常。这一点在 core/moonshine-tts/src/rule-based-g2p-factory.cpp 中有硬性校验工厂读取en_us/g2p-config.json无论是磁盘文件还是内存资产解析 JSON 后若uses_oov_model不为true会抛出English G2P: bundled g2p-config.json must set uses_oov_model true。注意它还会检测 Git LFS 指针残留如果读到的是 LFS stub 而非真实 JSON会提示从 moonshine-tts 目录执行git lfs pull。oov/OOV ONNX 模型与配置oov/目录包含两个文件model.onnx小型 transformer decoder做贪心 字符→音素 解码专门为词库查不到的 OOV 单词生成读音onnx-config.json由导出脚本把词汇表与索引合并进同一份 JSON运行时用它完成 token 化与解码配置。这个模型是在本仓库内训练的train_oov.py等脚本checkpoint 位于models/en_us/oov/例如checkpoint.pt JSON 词汇表因此英文 OOV 能力完全可复现、可再训练。数据来源Provenance对照表资产来源基础读音CMU Pronouncing Dictionarycmudict.dict经cmudict_ipa仓库转换为 IPA见scripts/download_cmudict_to_tsv.py过滤后的 TSV仓库流水线scripts/filter_dict_by_espeak_coverage.py使用 eSpeak NG 语料文本裁剪稀有读音OOV ONNX本仓库内训练的小型 transformer decodertrain_oov.py等checkpoint 位于models/en_us/oov/ONNX 导出scripts/export_models_to_onnx.py或流水线使用的 OOV 专用导出路径把词汇表与索引合并进onnx-config.json放在model.onnx旁边端到端重建流程高层面 5 步以下命令均以仓库根目录为当前工作目录执行。步骤 1原始 CMU → TSVpython scripts/download_cmudict_to_tsv.py默认写入data/en_us/dict.tsv。这一步把 CMU 词典下载并转换为 IPA TSV是后续一切加工的原料。按 core/moonshine-tts/data/README.md 的 Regeneration verification 记录该步骤的输出与仓库内既有文件逐字节一致byte-identical。步骤 2用 eSpeak NG 裁剪稀有读音python scripts/filter_dict_by_espeak_coverage.py \ --dict-path data/en_us/dict.tsv \ --input-text data/en_us/input_text.txt \ --out data/en_us/dict_filtered_heteronyms.tsv前置条件espeak-phonemizer或系统级 eSpeak NG以及一个句子语料默认data/en_us/input_text.txt也可用--input-text指定自己的语料。产出物dict_filtered_heteronyms.tsv需要安装到models/en_us/或你的model_root实际使用的路径下。注意这一步依赖外部环境eSpeak NG 语料因此 Regeneration verification 中标记为Not rerunrecipe 是环境相关的。步骤 3训练 OOV 模型参考项目文档与train_oov.py数据集脚本位于scripts/下。训练产出checkpoint.pt与 JSON 词汇表存放在models/en_us/oov/。步骤 4导出 ONNX需要 PyTorch onnx已安装。使用仓库自带的英文 OOV 导出路径例如scripts/export_models_to_onnx.py产出oov/model.onnx与oov/onnx-config.json然后拷贝到data/en_us/oov/。需要保持models/en_us/g2p-config.json与发布内容一致uses_oov_model: true且不捆绑 heteronym。用同一 checkpoint 重新导出即可复现model.onnx与onnx-config.json使用固定的 exporter细节见 core/moonshine-tts/data/README.md 的Regeneration verification。注意Regeneration verification 记录了一个已修复的导出 bug——scripts/export_models_to_onnx.py曾把onnx_export.onnx_path误写为onnx-config.json修复方式是必须把model.onnx路径而非 JSON 路径传给_build_config_onnx。重新导出英文 OOV 时若依赖--only config默认值还需要把g2p-config.json拷入临时model_root。步骤 5组装数据包把dict_filtered_heteronyms.tsv、g2p-config.json与oov/目录一起拷入data/en_us/如果你维护这种布局。最终目录即前文展示的三资产结构。运行时调用链词典 → 异形词排序 → OOV ONNX → 手写规则英文 G2P 的核心实现在 core/moonshine-tts/src/lang-specific/english.cpptext_to_ipa()对每个 token 依次执行以下回退链数字处理english_number_token_ipa()直接把数字 token 转成读音路径kEnglishNumber不经过词库词典命中单一读音查dict_filtered_heteronyms.tsv若只有一条读音直接使用路径kDictUnambiguous词典命中多读音 / 异形词多个 CMU 读音在运行时排序后取第一个路径kDictFirstAlternativeNoHeteronymModel。不过 english.cpp 的pick_english_heteronym_ipa()对美/英差异做了精细处理当备选里同时存在美式重读ˈeɪ与英式重读ˈɑ时会根据prefer_british_heteronyms_标志显式选择方言读音而不是机械地取排序第一。测试用例 core/moonshine-tts/tests/english-rule-g2p-test.cpp 验证了这一点en_us下tomato→təmˈeɪtˌoʊ英式en_gb下 →təmˈɑtˌoʊOOV 命中词库查不到时若oov/模型可用调用OnnxOovG2p::predict_phonemes()做贪心字符→音素解码路径kOovModel手写规则兜底OOV 模型不可用或返回空时回退到english_hand_oov_rules_ipa()的启发式规则路径kOovHandRules。方言别名与运行时路径解析EnglishRuleG2p::dialect_ids()声明了可接受的方言别名见 english.cppen_us / en-US / en-us / english / en → 美式 en_gb / en-GB / en-gb / british → 英式共享同一套 CMUdict OOV 栈工厂try_english()rule-based-g2p-factory.cpp的加载逻辑词库默认路径解析为en_us/dict_filtered_heteronyms.tsv可通过english_dict_path覆盖也支持从内存注册的files资产读取若内存中注册了en_us/g2p-config.json则以内存为准并做uses_oov_model校验否则从磁盘data_root/g2p-config.json读取校验OOV ONNX 默认从data_root/oov/model.ort解析仓库内英文 OOV 模型实际以.ort形式发布因为 wasm 运行时没有 ONNX 格式支持磁盘上仍接受同名的.onnx内存资产则对应键en_us/oov/model.orten_us/oov/onnx-config.json见 moonshine-g2p-options.h若 OOV 完全缺失抛出异常提示把model.onnx或model.ort与onnx-config.json放到g2p_root下的en_us/oov/。关于 .ort 与 .onnx 的格式取舍core/moonshine-tts/data/README.md 的Model file formats一节解释了为什么仓库内大部分模型存 ORT 格式而非 ONNXORT 在转换时就烘焙了图优化加载时跳过 protobuf 解析。英文 OOV 模型属于stem.ort布局float 权重完整优化几乎不增加体积而中文、阿拉伯语 G2P transformer 因为权重参与MatMulORT 只在常量操作数时预打包移出图会损失约 2.2 倍推理性能故保留.onnx。一致性验证测试与再生成校验单元测试英文 G2P 的测试集中在 core/moonshine-tts/tests/english-rule-g2p-test.cpp方言解析en_us、en-US、EN_US、english、en_gb、en-GB、british均归入英文规则de不归入异形词消歧tomato的美/英读音分别校验Wiki 文本奇偶校验取wiki-text.txt前 100 行逐行与参考 IPAtests/data/en_us/rule_g2p_wiki_100.txt比对构建的是词典查找、异形词选择与 OOV 预测全链路的黄金回归。测试通过moonshine_tts_bundled_data_dir_relative() / en_us / dict_filtered_heteronyms.tsv定位词库说明数据包必须已就位fetch 或下载测试才能完整运行。再生成校验Regeneration verificationcore/moonshine-tts/data/README.md 记录了 2026-03-30 对全部资产的可复现性审计其中与 en_us 相关的结论Recipe与仓库内文件一致备注download_cmudict_to_tsv.py→data/en_us/dict.tsv是输出与既有文件一致export_models_to_onnx.py英文 OOV是bug 修复后data/en_us/oov/与models/en_us/oov/从同一 checkpoint 再导出后一致heteronym ONNX 已从运行时移除filter_dict_by_espeak_coverage.py→dict_filtered_heteronyms.tsv未重跑依赖 eSpeak NG 语料环境相关审计给出的总原则词库类 recipe 对当前上游 URL 是确定性的而 transformer ONNX 导出不保证跨 PyTorch / transformers / 导出后端字节级稳定——字节漂移时以meta.json tokenizer 资产 parity 测试作为契约。部署与运维要点小结二进制不进 git离线构建/测试前先跑scripts/fetch-voice-assets.sh tts仓库根目录运行时 SDK 按需从 CDN 拉取g2p-config.json的uses_oov_model必须为true且oov/必须同时提供model.onnx或model.ort与onnx-config.json否则 C 工厂在初始化阶段即抛异常异形词没有独立 ONNX运行时排序取第一 美/英方言感知选择改动词库的备选顺序或 IPA 拼写会直接影响发音结果建议用 english-rule-g2p-test.cpp 的 parity 测试做回归重导出的字节稳定性不保证ONNX 导出结果可能随工具链漂移以配置 tokenizer 测试为契约而不是以字节 hash 为契约若从内存资产无磁盘布局加载请按en_us/dict_filtered_heteronyms.tsv、en_us/g2p-config.json、en_us/oov/model.ort、en_us/oov/onnx-config.json这组 canonical key 注册缓冲区工厂会自动优先使用内存资产见 rule-based-g2p-factory.cpp。【免费下载链接】moonshineVery low latency speech to text, intent recognition, and text to speech, for building voice agents and interfaces项目地址: https://gitcode.com/GitHub_Trending/moonshine3/moonshine创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考