|
| 1 | +#!/usr/bin/env python3 |
| 2 | +# Copyright 2026 Xiaomi Corp. (authors: Fangjun Kuang) |
| 3 | + |
| 4 | +# It may take 100 minutes to generate the lexicon. |
| 5 | +# |
| 6 | +# You can download a pre-generated one from |
| 7 | +# https://github.com/k2-fsa/sherpa-onnx/releases/tag/tts-models |
| 8 | + |
| 9 | +from typing import List, Tuple |
| 10 | + |
| 11 | +from pypinyin import phrases_dict, pinyin_dict |
| 12 | + |
| 13 | +from piper.phonemize_chinese import ChinesePhonemizer |
| 14 | + |
| 15 | + |
| 16 | +def generate_chinese_lexicon(): |
| 17 | + word_dict = pinyin_dict.pinyin_dict |
| 18 | + phrases = phrases_dict.phrases_dict |
| 19 | + |
| 20 | + phonemizer = ChinesePhonemizer(model_dir="./abc") |
| 21 | + |
| 22 | + lexicon = [] |
| 23 | + for key in word_dict: |
| 24 | + if not (0x4E00 <= key <= 0x9FFF): |
| 25 | + continue |
| 26 | + w = chr(key) |
| 27 | + |
| 28 | + phonemes = phonemizer.phonemize(w)[0] |
| 29 | + tokens = [] |
| 30 | + for p in phonemes: |
| 31 | + tokens.append(p) |
| 32 | + if p in {"1", "2", "3", "4", "5"}: |
| 33 | + tokens.append("_") |
| 34 | + |
| 35 | + lexicon.append((w, tokens)) |
| 36 | + |
| 37 | + for key in phrases: |
| 38 | + phonemes = phonemizer.phonemize(key)[0] |
| 39 | + tokens = [] |
| 40 | + for p in phonemes: |
| 41 | + tokens.append(p) |
| 42 | + if p in {"1", "2", "3", "4", "5"}: |
| 43 | + tokens.append("_") |
| 44 | + |
| 45 | + lexicon.append((key, tokens)) |
| 46 | + |
| 47 | + return lexicon |
| 48 | + |
| 49 | + |
| 50 | +def save(filename: str, lexicon: List[Tuple[str, List[str]]]): |
| 51 | + with open(filename, "w", encoding="utf-8") as f: |
| 52 | + for word, phones in lexicon: |
| 53 | + tokens = " ".join(phones) |
| 54 | + f.write(f"{word} {tokens}\n") |
| 55 | + |
| 56 | + |
| 57 | +def main(): |
| 58 | + zh = generate_chinese_lexicon() |
| 59 | + |
| 60 | + save("lexicon-zh-g2pw.txt", zh) |
| 61 | + |
| 62 | + |
| 63 | +if __name__ == "__main__": |
| 64 | + main() |
0 commit comments