├── .gitignore
├── Cargo.lock
├── Cargo.toml
├── README.md
├── dict.json
├── gen_polyphonic_fix.py
├── input.txt
├── polyphonic-fix.rep
├── resource
├── en_word_dict.json
├── g2pw
│ ├── CHARS.txt
│ ├── LABELS.txt
│ ├── MONOPHONIC_CHARS.txt
│ ├── POLYPHONIC_CHARS.txt
│ ├── bert-base-chinese_s2t_dict.txt
│ ├── bopomofo_to_pinyin_wo_tune_dict.json
│ ├── char_bopomofo_dict.json
│ ├── dict_mono_chars.json
│ ├── dict_poly_chars.json
│ ├── dict_poly_index_list.json
│ └── dict_poly_index_map.json
├── g2pw_tokenizer.json
├── mini-bart-g2p.pt
├── rule.pest
├── symbols_v2.json
├── tokenizer.mini-bart-g2p.json
└── zh_word_dict.json
└── src
├── gsv
├── mod.rs
└── v4.rs
├── lib.rs
├── main.rs
├── symbols.rs
└── text
├── dict.rs
├── g2p_en.rs
├── g2p_jp.rs
├── g2pw.rs
├── mod.rs
└── num.rs
/.gitignore:
--------------------------------------------------------------------------------
1 | /target
2 |
--------------------------------------------------------------------------------
/Cargo.toml:
--------------------------------------------------------------------------------
1 | [package]
2 | name = "gpt_sovits_rs"
3 | version = "0.5.0"
4 | edition = "2021"
5 | description = "A GPT_Sovits inference lib in Rust base on pytorch"
6 | license = "MIT"
7 | repository = "https://github.com/second-state/gpt_sovits_rs"
8 | authors = ["csh <458761603@qq.com>"]
9 |
10 | exclude = ["resource/mini-bart-g2p.pt"]
11 |
12 | [dependencies]
13 | anyhow = "1.0.87"
14 | # ort = { version = "2.0.0-rc.8" }
15 | tokenizers = { version = "0.20.0", default-features = false, features = [
16 | "onig",
17 | ] }
18 | tch = { version = "0.17.0" }
19 | wav_io = "0.1.14"
20 | serde_json = "1.0"
21 | jieba-rs = { version = "0.7", features = ["tfidf", "textrank"] }
22 | # grapheme_to_phoneme = "0.1"
23 | num2en = "1.0.0"
24 | log = "0.4.22"
25 | env_logger = "0.11.6"
26 | lazy_static = "1.5.0"
27 | regex = "1.11.0"
28 | pest = "2.7"
29 | pest_derive = "2.7"
30 | serde = { version = "1.0", features = ["derive"] }
31 | jpreprocess = { version = "0.12.0", default-features = false, features = [
32 | "naist-jdic",
33 | ] }
34 |
35 | [dev-dependencies]
36 | pinyin = "0.10.0"
37 |
--------------------------------------------------------------------------------
/README.md:
--------------------------------------------------------------------------------
1 | # GPT-SoVITS-rs
2 |
3 | ## Overview
4 | This Rust project provides a library for integrating [GPT-SoVITS](https://github.com/RVC-Boss/GPT-SoVITS) inference in Rust applications. GPT-Sovits is a powerful tool for speech synthesis and voice conversion. By using this library, developers can easily leverage the capabilities of GPT-Sovits within their Rust projects.
5 |
6 | ## Prerequisites
7 | Before you can use the GPT-SoVits-rs Inference Library, you must ensure that libtorch 2.4.0 is installed on your system. libtorch is the C++ frontend for PyTorch, which is required for running the GPT-Sovits models.
8 |
9 | You can download and install libtorch 2.4.0 from the official PyTorch website:
10 |
11 | Go to the [PyTorch website](https://pytorch.org/).
12 | Select the appropriate options for your system (OS, Package Manager, Python version, etc.), making sure to choose the "LibTorch" option.
13 | Scroll down to the "Install" section and run the provided command to download and install libtorch 2.4.0.
14 |
15 | For example, on a Linux system with CUDA support, the command might look like this:
16 |
17 | ```bash
18 | wget https://download.pytorch.org/libtorch/cu124/libtorch-cxx11-abi-shared-with-deps-2.4.0%2Bcu124.zip
19 | unzip libtorch-cxx11-abi-shared-with-deps-2.4.0+cu124.zip
20 | ```
21 |
22 | After downloading and extracting the library, you may need to set environment variables to include the libtorch library path. For example:
23 | ```bash
24 | export LIBTORCH=/path/to/libtorch
25 | export LD_LIBRARY_PATH=$LIBTORCH/lib:$LD_LIBRARY_PATH
26 | ```
27 | Replace /path/to/libtorch with the actual path where you extracted libtorch.
28 |
29 | ## Installation
30 | To use this library, add the following dependency to your `Cargo.toml` file:
31 | ```toml
32 | [dependencies]
33 | gpt_sovits_rs = "0.1.0"
34 | ```
35 | Replace "0.1.0" with the latest version of the library.
36 |
37 | ## Usage
38 |
39 | ```rust
40 | use gpt_sovits_rs::GPTSovitsConfig;
41 |
42 | fn main() {
43 | env_logger::init();
44 |
45 | let gpt_config = GPTSovitsConfig::new(
46 | "path/to/ssl_model.pt".to_string(),
47 | ).with_chinese(
48 | "path/to/g2pw.pt".to_string(),
49 | "path/to/bert_model.pt".to_string(),
50 | "path/to/tokenizer.json".to_string());
51 | // If you don't need to Chinese, you can not call `with_chinese`
52 |
53 | let device = gpt_sovits_rs::Device::cuda_if_available();
54 | log::info!("device: {:?}", device);
55 |
56 | let mut gpt_sovits = gpt_config.build(device).unwrap();
57 |
58 | let ref_text = "Speaker1 Reference Text";
59 | let ref_path = "path/to/speaker1/reference_voice.wav";
60 | let file = std::fs::File::open(ref_path).unwrap();
61 | let (head, ref_audio_samples) = wav_io::read_from_file(file).unwrap();
62 |
63 | log::info!("load ref_1 done");
64 |
65 | gpt_sovits
66 | .create_speaker(
67 | "speaker1",
68 | "path/to/speaker1/gpt_sovits_model.pt",
69 | &ref_audio_samples,
70 | head.sample_rate as usize,
71 | ref_text,
72 | )
73 | .unwrap();
74 | log::info!("init speaker1 done");
75 |
76 | let ref_text = "Speaker2 Reference Text";
77 | let ref_path = "path/to/speaker2/reference_voice.wav";
78 | let file = std::fs::File::open(ref_path).unwrap();
79 | let (head, ref_audio_samples) = wav_io::read_from_file(file).unwrap();
80 |
81 | log::info!("load ref_2 done");
82 |
83 | gpt_sovits
84 | .create_speaker(
85 | "speaker2",
86 | "path/to/speaker2/gpt_sovits_model.pt",
87 | &ref_audio_samples,
88 | head.sample_rate as usize,
89 | ref_text,
90 | )
91 | .unwrap();
92 | log::info!("init speaker2 done");
93 |
94 | let text1 = "What you want speaker1 to say";
95 | let text2 = "What you want speaker2 to say";
96 |
97 | let audio1 = gpt_sovits.infer("speaker1",text1).unwrap();
98 | let audio2 = gpt_sovits.infer("speaker2",text2).unwrap();
99 |
100 | log::info!("start write file");
101 |
102 | let output1 = "speaker1.wav";
103 | let output2 = "speaker2.wav";
104 |
105 | let audio1_size = audio1.size1().unwrap() as usize;
106 | let audio2_size = audio1.size1().unwrap() as usize;
107 |
108 | // save speaker1.wav
109 | let mut samples1 = vec![0f32; audio1_size];
110 | audio1.f_copy_data(&mut samples1, audio1_size).unwrap();
111 | let mut file_out = std::fs::File::create(output1).unwrap();
112 |
113 | let header = wav_io::new_header(32000, 16, false, true);
114 | wav_io::write_to_file(&mut file_out, &header, &samples1).unwrap();
115 |
116 | // save speaker2.wav
117 | let mut samples2 = vec![0f32; audio2_size];
118 | audio1.f_copy_data(&mut samples2, audio2_size).unwrap();
119 | let mut file_out = std::fs::File::create(output2).unwrap();
120 |
121 | let header = wav_io::new_header(32000, 16, false, true);
122 | wav_io::write_to_file(&mut file_out, &header, &samples2).unwrap();
123 |
124 | }
125 |
126 | ```
127 |
128 | ### Turn on Japanese support
129 |
130 | > [!NOTE]
131 | > Currently the text frontend could only parse kana as Japanese. However, the Japanese g2p should support kanji as well. You might want to fork this repo if your use case have no Chinese input.
132 |
133 | ```rust
134 | use gpt_sovits_rs::GPTSovitsConfig;
135 |
136 | fn main() {
137 | env_logger::init();
138 |
139 | let gpt_config = GPTSovitsConfig::new(
140 | "path/to/ssl_model.pt".to_string(),
141 | ).with_chinese(
142 | "path/to/g2pw.pt".to_string(),
143 | "path/to/bert_model.pt".to_string(),
144 | "path/to/tokenizer.json".to_string()
145 | )
146 | .with_jp(true);
147 |
148 | // init gpt_sovits with config
149 | // ...
150 | }
151 | ```
152 |
153 | ## Exporting GPT-Sovits Training Results
154 | After completing the training of a GPT-Sovits model, you might need to export the training results to a .pt (PyTorch) file for use in other environments. Below are the detailed steps to export the trained model:
155 |
156 | #### Step 1: Confirm Training Completion
157 | Ensure that your GPT-Sovits model has finished training and that you have a trained model file available.
158 |
159 | #### Step 2: Run the Export Script
160 | Use the following command to run the export script and export the training results to gpt_sovits_model.pt:
161 | ```bash
162 | python GPT_SoVITS/export_torch_script.py --gpt_model GPT_weights_v2/xxx-e15.ckpt --sovits_model SoVITS_weights_v2/xxx_e8_s248.pth --ref_audio ref.wav --ref_text 'Reference Text' --output_path output --export_common_model
163 | ```
164 |
165 | Now you can find `gpt_sovits_model.pt`, `ssl_model.pt`, and `bert_model.pt` in the `output` directory.
166 |
167 | The `ssl_model.pt` and `bert_model.pt` are common model files, determined by the option `--export_common_model` for whether to export, and they are not related to the trained model. Therefore, they do not need to be exported every time.
168 | If you do not wish to export, you can go to Hugging Face to [download](https://huggingface.co/L-jasmine/GPT_Sovits/tree/main) the resource.zip that I have already exported. And remove the `--export_common_model` when export model.
169 |
170 | You can download `g2pw.pt` from my Hugging Face [repo](https://huggingface.co/L-jasmine/GPT_Sovits/tree/main)
171 |
--------------------------------------------------------------------------------
/dict.json:
--------------------------------------------------------------------------------
1 | {
2 | "ㄅㄚ1": 0,
3 | "ㄅㄚ2": 1,
4 | "ㄅㄚ3": 2,
5 | "ㄅㄚ4": 3,
6 | "ㄅㄚ5": 4,
7 | "ㄅㄛ1": 5,
8 | "ㄅㄛ2": 6,
9 | "ㄅㄛ3": 7,
10 | "ㄅㄛ4": 8,
11 | "ㄅㄛ5": 9,
12 | "ㄅㄞ2": 10,
13 | "ㄅㄞ3": 11,
14 | "ㄅㄞ4": 12,
15 | "ㄅㄟ1": 13,
16 | "ㄅㄟ3": 14,
17 | "ㄅㄟ4": 15,
18 | "ㄅㄠ1": 16,
19 | "ㄅㄠ2": 17,
20 | "ㄅㄠ3": 18,
21 | "ㄅㄠ4": 19,
22 | "ㄅㄠ5": 20,
23 | "ㄅㄢ1": 21,
24 | "ㄅㄢ3": 22,
25 | "ㄅㄢ4": 23,
26 | "ㄅㄣ1": 24,
27 | "ㄅㄣ4": 25,
28 | "ㄅㄤ1": 26,
29 | "ㄅㄤ3": 27,
30 | "ㄅㄤ4": 28,
31 | "ㄅㄥ1": 29,
32 | "ㄅㄥ3": 30,
33 | "ㄅㄥ4": 31,
34 | "ㄅㄧ1": 32,
35 | "ㄅㄧ2": 33,
36 | "ㄅㄧ3": 34,
37 | "ㄅㄧ4": 35,
38 | "ㄅㄧㄝ2": 36,
39 | "ㄅㄧㄝ3": 37,
40 | "ㄅㄧㄝ4": 38,
41 | "ㄅㄧㄠ1": 39,
42 | "ㄅㄧㄠ3": 40,
43 | "ㄅㄧㄠ4": 41,
44 | "ㄅㄧㄢ1": 42,
45 | "ㄅㄧㄢ3": 43,
46 | "ㄅㄧㄢ4": 44,
47 | "ㄅㄧㄣ1": 45,
48 | "ㄅㄧㄣ4": 46,
49 | "ㄅㄧㄥ1": 47,
50 | "ㄅㄧㄥ3": 48,
51 | "ㄅㄧㄥ4": 49,
52 | "ㄅㄨ1": 50,
53 | "ㄅㄨ2": 51,
54 | "ㄅㄨ3": 52,
55 | "ㄅㄨ4": 53,
56 | "ㄆㄚ1": 54,
57 | "ㄆㄚ2": 55,
58 | "ㄆㄚ4": 56,
59 | "ㄆㄚ5": 57,
60 | "ㄆㄛ1": 58,
61 | "ㄆㄛ2": 59,
62 | "ㄆㄛ3": 60,
63 | "ㄆㄛ4": 61,
64 | "ㄆㄛ5": 62,
65 | "ㄆㄞ1": 63,
66 | "ㄆㄞ2": 64,
67 | "ㄆㄞ3": 65,
68 | "ㄆㄟ1": 66,
69 | "ㄆㄟ2": 67,
70 | "ㄆㄟ3": 68,
71 | "ㄆㄟ4": 69,
72 | "ㄆㄠ1": 70,
73 | "ㄆㄠ2": 71,
74 | "ㄆㄠ3": 72,
75 | "ㄆㄠ4": 73,
76 | "ㄆㄡ1": 74,
77 | "ㄆㄡ2": 75,
78 | "ㄆㄡ3": 76,
79 | "ㄆㄢ1": 77,
80 | "ㄆㄢ2": 78,
81 | "ㄆㄢ3": 79,
82 | "ㄆㄢ4": 80,
83 | "ㄆㄣ1": 81,
84 | "ㄆㄣ2": 82,
85 | "ㄆㄣ4": 83,
86 | "ㄆㄤ1": 84,
87 | "ㄆㄤ2": 85,
88 | "ㄆㄤ4": 86,
89 | "ㄆㄥ1": 87,
90 | "ㄆㄥ2": 88,
91 | "ㄆㄥ3": 89,
92 | "ㄆㄥ4": 90,
93 | "ㄆㄧ1": 91,
94 | "ㄆㄧ2": 92,
95 | "ㄆㄧ3": 93,
96 | "ㄆㄧ4": 94,
97 | "ㄆㄧㄝ1": 95,
98 | "ㄆㄧㄝ3": 96,
99 | "ㄆㄧㄝ4": 97,
100 | "ㄆㄧㄠ1": 98,
101 | "ㄆㄧㄠ2": 99,
102 | "ㄆㄧㄠ3": 100,
103 | "ㄆㄧㄠ4": 101,
104 | "ㄆㄧㄢ1": 102,
105 | "ㄆㄧㄢ2": 103,
106 | "ㄆㄧㄢ3": 104,
107 | "ㄆㄧㄢ4": 105,
108 | "ㄆㄧㄣ1": 106,
109 | "ㄆㄧㄣ2": 107,
110 | "ㄆㄧㄣ4": 108,
111 | "ㄆㄧㄥ1": 109,
112 | "ㄆㄧㄥ2": 110,
113 | "ㄆㄧㄥ3": 111,
114 | "ㄆㄧㄥ4": 112,
115 | "ㄆㄨ1": 113,
116 | "ㄆㄨ2": 114,
117 | "ㄆㄨ3": 115,
118 | "ㄆㄨ4": 116,
119 | "ㄇㄚ1": 117,
120 | "ㄇㄚ2": 118,
121 | "ㄇㄚ3": 119,
122 | "ㄇㄚ4": 120,
123 | "ㄇㄚ5": 121,
124 | "ㄇㄛ1": 122,
125 | "ㄇㄛ2": 123,
126 | "ㄇㄛ3": 124,
127 | "ㄇㄛ4": 125,
128 | "ㄇㄛ5": 126,
129 | "ㄇㄜ5": 127,
130 | "ㄇㄞ2": 128,
131 | "ㄇㄞ4": 129,
132 | "ㄇㄟ2": 130,
133 | "ㄇㄟ4": 131,
134 | "ㄇㄟ5": 132,
135 | "ㄇㄠ1": 133,
136 | "ㄇㄠ2": 134,
137 | "ㄇㄠ3": 135,
138 | "ㄇㄠ4": 136,
139 | "ㄇㄡ2": 137,
140 | "ㄇㄡ3": 138,
141 | "ㄇㄡ4": 139,
142 | "ㄇㄢ1": 140,
143 | "ㄇㄢ2": 141,
144 | "ㄇㄢ3": 142,
145 | "ㄇㄢ4": 143,
146 | "ㄇㄣ1": 144,
147 | "ㄇㄣ2": 145,
148 | "ㄇㄣ4": 146,
149 | "ㄇㄣ5": 147,
150 | "ㄇㄤ2": 148,
151 | "ㄇㄤ3": 149,
152 | "ㄇㄥ1": 150,
153 | "ㄇㄥ2": 151,
154 | "ㄇㄥ3": 152,
155 | "ㄇㄥ4": 153,
156 | "ㄇㄧ1": 154,
157 | "ㄇㄧ2": 155,
158 | "ㄇㄧ3": 156,
159 | "ㄇㄧ4": 157,
160 | "ㄇㄧㄝ1": 158,
161 | "ㄇㄧㄝ4": 159,
162 | "ㄇㄧㄠ3": 160,
163 | "ㄇㄧㄠ4": 161,
164 | "ㄇㄧㄡ1": 162,
165 | "ㄇㄧㄡ4": 163,
166 | "ㄇㄧㄢ2": 164,
167 | "ㄇㄧㄢ3": 165,
168 | "ㄇㄧㄢ4": 166,
169 | "ㄇㄧㄣ2": 167,
170 | "ㄇㄧㄣ3": 168,
171 | "ㄇㄧㄥ2": 169,
172 | "ㄇㄧㄥ3": 170,
173 | "ㄇㄧㄥ4": 171,
174 | "ㄇㄨ2": 172,
175 | "ㄇㄨ3": 173,
176 | "ㄇㄨ4": 174,
177 | "ㄈㄚ1": 175,
178 | "ㄈㄚ2": 176,
179 | "ㄈㄚ3": 177,
180 | "ㄈㄚ4": 178,
181 | "ㄈㄛ2": 179,
182 | "ㄈㄛ4": 180,
183 | "ㄈㄟ1": 181,
184 | "ㄈㄟ2": 182,
185 | "ㄈㄟ3": 183,
186 | "ㄈㄟ4": 184,
187 | "ㄈㄡ1": 185,
188 | "ㄈㄡ2": 186,
189 | "ㄈㄡ3": 187,
190 | "ㄈㄡ4": 188,
191 | "ㄈㄢ1": 189,
192 | "ㄈㄢ2": 190,
193 | "ㄈㄢ3": 191,
194 | "ㄈㄢ4": 192,
195 | "ㄈㄣ1": 193,
196 | "ㄈㄣ2": 194,
197 | "ㄈㄣ4": 195,
198 | "ㄈㄣ5": 196,
199 | "ㄈㄤ1": 197,
200 | "ㄈㄤ2": 198,
201 | "ㄈㄤ3": 199,
202 | "ㄈㄤ4": 200,
203 | "ㄈㄥ1": 201,
204 | "ㄈㄥ2": 202,
205 | "ㄈㄥ3": 203,
206 | "ㄈㄥ4": 204,
207 | "ㄈㄨ1": 205,
208 | "ㄈㄨ2": 206,
209 | "ㄈㄨ3": 207,
210 | "ㄈㄨ4": 208,
211 | "ㄈㄨ5": 209,
212 | "ㄈㄨㄥ4": 210,
213 | "ㄉㄚ1": 211,
214 | "ㄉㄚ2": 212,
215 | "ㄉㄚ3": 213,
216 | "ㄉㄚ4": 214,
217 | "ㄉㄚ5": 215,
218 | "ㄉㄜ2": 216,
219 | "ㄉㄜ5": 217,
220 | "ㄉㄞ1": 218,
221 | "ㄉㄞ3": 219,
222 | "ㄉㄞ4": 220,
223 | "ㄉㄟ3": 221,
224 | "ㄉㄠ1": 222,
225 | "ㄉㄠ2": 223,
226 | "ㄉㄠ3": 224,
227 | "ㄉㄠ4": 225,
228 | "ㄉㄡ1": 226,
229 | "ㄉㄡ3": 227,
230 | "ㄉㄡ4": 228,
231 | "ㄉㄢ1": 229,
232 | "ㄉㄢ3": 230,
233 | "ㄉㄢ4": 231,
234 | "ㄉㄤ1": 232,
235 | "ㄉㄤ3": 233,
236 | "ㄉㄤ4": 234,
237 | "ㄉㄥ1": 235,
238 | "ㄉㄥ4": 236,
239 | "ㄉㄧ1": 237,
240 | "ㄉㄧ2": 238,
241 | "ㄉㄧ3": 239,
242 | "ㄉㄧ4": 240,
243 | "ㄉㄧ5": 241,
244 | "ㄉㄧㄚ1": 242,
245 | "ㄉㄧㄝ1": 243,
246 | "ㄉㄧㄝ2": 244,
247 | "ㄉㄧㄝ5": 245,
248 | "ㄉㄧㄠ1": 246,
249 | "ㄉㄧㄠ3": 247,
250 | "ㄉㄧㄠ4": 248,
251 | "ㄉㄧㄡ1": 249,
252 | "ㄉㄧㄢ1": 250,
253 | "ㄉㄧㄢ3": 251,
254 | "ㄉㄧㄢ4": 252,
255 | "ㄉㄧㄤ1": 253,
256 | "ㄉㄧㄥ1": 254,
257 | "ㄉㄧㄥ3": 255,
258 | "ㄉㄧㄥ4": 256,
259 | "ㄉㄨ1": 257,
260 | "ㄉㄨ2": 258,
261 | "ㄉㄨ3": 259,
262 | "ㄉㄨ4": 260,
263 | "ㄉㄨㄛ1": 261,
264 | "ㄉㄨㄛ2": 262,
265 | "ㄉㄨㄛ3": 263,
266 | "ㄉㄨㄛ4": 264,
267 | "ㄉㄨㄛ5": 265,
268 | "ㄉㄨㄟ1": 266,
269 | "ㄉㄨㄟ4": 267,
270 | "ㄉㄨㄢ1": 268,
271 | "ㄉㄨㄣ1": 269,
272 | "ㄉㄨㄣ3": 270,
273 | "ㄉㄨㄣ4": 271,
274 | "ㄉㄨㄥ1": 272,
275 | "ㄉㄨㄥ3": 273,
276 | "ㄉㄨㄥ4": 274,
277 | "ㄊㄚ1": 275,
278 | "ㄊㄚ3": 276,
279 | "ㄊㄚ4": 277,
280 | "ㄊㄜ1": 278,
281 | "ㄊㄜ4": 279,
282 | "ㄊㄞ1": 280,
283 | "ㄊㄞ2": 281,
284 | "ㄊㄞ4": 282,
285 | "ㄊㄞ5": 283,
286 | "ㄊㄠ1": 284,
287 | "ㄊㄠ2": 285,
288 | "ㄊㄡ1": 286,
289 | "ㄊㄡ2": 287,
290 | "ㄊㄡ3": 288,
291 | "ㄊㄡ5": 289,
292 | "ㄊㄢ1": 290,
293 | "ㄊㄢ2": 291,
294 | "ㄊㄢ3": 292,
295 | "ㄊㄢ4": 293,
296 | "ㄊㄤ1": 294,
297 | "ㄊㄤ2": 295,
298 | "ㄊㄤ3": 296,
299 | "ㄊㄤ4": 297,
300 | "ㄊㄥ1": 298,
301 | "ㄊㄥ2": 299,
302 | "ㄊㄥ5": 300,
303 | "ㄊㄧ1": 301,
304 | "ㄊㄧ2": 302,
305 | "ㄊㄧ3": 303,
306 | "ㄊㄧ4": 304,
307 | "ㄊㄧㄝ1": 305,
308 | "ㄊㄧㄝ3": 306,
309 | "ㄊㄧㄝ4": 307,
310 | "ㄊㄧㄠ1": 308,
311 | "ㄊㄧㄠ2": 309,
312 | "ㄊㄧㄠ3": 310,
313 | "ㄊㄧㄠ4": 311,
314 | "ㄊㄧㄢ2": 312,
315 | "ㄊㄧㄢ3": 313,
316 | "ㄊㄧㄢ4": 314,
317 | "ㄊㄧㄥ1": 315,
318 | "ㄊㄧㄥ2": 316,
319 | "ㄊㄧㄥ3": 317,
320 | "ㄊㄧㄥ4": 318,
321 | "ㄊㄨ1": 319,
322 | "ㄊㄨ2": 320,
323 | "ㄊㄨ3": 321,
324 | "ㄊㄨ4": 322,
325 | "ㄊㄨㄛ1": 323,
326 | "ㄊㄨㄛ2": 324,
327 | "ㄊㄨㄛ3": 325,
328 | "ㄊㄨㄛ4": 326,
329 | "ㄊㄨㄟ1": 327,
330 | "ㄊㄨㄟ2": 328,
331 | "ㄊㄨㄟ3": 329,
332 | "ㄊㄨㄟ4": 330,
333 | "ㄊㄨㄢ2": 331,
334 | "ㄊㄨㄢ3": 332,
335 | "ㄊㄨㄣ1": 333,
336 | "ㄊㄨㄣ2": 334,
337 | "ㄊㄨㄣ3": 335,
338 | "ㄊㄨㄣ4": 336,
339 | "ㄊㄨㄥ1": 337,
340 | "ㄊㄨㄥ2": 338,
341 | "ㄊㄨㄥ3": 339,
342 | "ㄊㄨㄥ4": 340,
343 | "ㄋㄚ1": 341,
344 | "ㄋㄚ2": 342,
345 | "ㄋㄚ3": 343,
346 | "ㄋㄚ4": 344,
347 | "ㄋㄚ5": 345,
348 | "ㄋㄜ1": 346,
349 | "ㄋㄜ2": 347,
350 | "ㄋㄜ4": 348,
351 | "ㄋㄜ5": 349,
352 | "ㄋㄞ3": 350,
353 | "ㄋㄞ4": 351,
354 | "ㄋㄞ5": 352,
355 | "ㄋㄟ3": 353,
356 | "ㄋㄟ4": 354,
357 | "ㄋㄠ1": 355,
358 | "ㄋㄠ2": 356,
359 | "ㄋㄠ3": 357,
360 | "ㄋㄠ4": 358,
361 | "ㄋㄡ2": 359,
362 | "ㄋㄡ4": 360,
363 | "ㄋㄢ1": 361,
364 | "ㄋㄢ2": 362,
365 | "ㄋㄢ3": 363,
366 | "ㄋㄢ4": 364,
367 | "ㄋㄤ1": 365,
368 | "ㄋㄤ2": 366,
369 | "ㄋㄤ5": 367,
370 | "ㄋㄥ2": 368,
371 | "ㄋㄥ4": 369,
372 | "ㄋㄧ2": 370,
373 | "ㄋㄧ3": 371,
374 | "ㄋㄧ4": 372,
375 | "ㄋㄧㄝ1": 373,
376 | "ㄋㄧㄝ2": 374,
377 | "ㄋㄧㄝ4": 375,
378 | "ㄋㄧㄠ3": 376,
379 | "ㄋㄧㄠ4": 377,
380 | "ㄋㄧㄡ3": 378,
381 | "ㄋㄧㄡ4": 379,
382 | "ㄋㄧㄢ1": 380,
383 | "ㄋㄧㄢ2": 381,
384 | "ㄋㄧㄢ3": 382,
385 | "ㄋㄧㄢ4": 383,
386 | "ㄋㄧㄣ2": 384,
387 | "ㄋㄧㄥ2": 385,
388 | "ㄋㄧㄥ3": 386,
389 | "ㄋㄧㄥ4": 387,
390 | "ㄋㄨ2": 388,
391 | "ㄋㄨㄛ2": 389,
392 | "ㄋㄨㄛ3": 390,
393 | "ㄋㄨㄛ4": 391,
394 | "ㄋㄨㄢ2": 392,
395 | "ㄋㄨㄢ3": 393,
396 | "ㄋㄨㄥ2": 394,
397 | "ㄋㄨㄥ3": 395,
398 | "ㄋㄨㄥ4": 396,
399 | "ㄋㄩ3": 397,
400 | "ㄋㄩ4": 398,
401 | "ㄌㄚ1": 399,
402 | "ㄌㄚ2": 400,
403 | "ㄌㄚ3": 401,
404 | "ㄌㄚ4": 402,
405 | "ㄌㄚ5": 403,
406 | "ㄌㄛ5": 404,
407 | "ㄌㄜ1": 405,
408 | "ㄌㄜ4": 406,
409 | "ㄌㄜ5": 407,
410 | "ㄌㄞ2": 408,
411 | "ㄌㄞ4": 409,
412 | "ㄌㄟ1": 410,
413 | "ㄌㄟ2": 411,
414 | "ㄌㄟ3": 412,
415 | "ㄌㄟ4": 413,
416 | "ㄌㄠ1": 414,
417 | "ㄌㄠ2": 415,
418 | "ㄌㄠ3": 416,
419 | "ㄌㄠ4": 417,
420 | "ㄌㄠ5": 418,
421 | "ㄌㄡ1": 419,
422 | "ㄌㄡ2": 420,
423 | "ㄌㄡ3": 421,
424 | "ㄌㄡ4": 422,
425 | "ㄌㄡ5": 423,
426 | "ㄌㄢ2": 424,
427 | "ㄌㄢ3": 425,
428 | "ㄌㄢ4": 426,
429 | "ㄌㄤ1": 427,
430 | "ㄌㄤ2": 428,
431 | "ㄌㄤ3": 429,
432 | "ㄌㄤ4": 430,
433 | "ㄌㄥ1": 431,
434 | "ㄌㄥ2": 432,
435 | "ㄌㄥ4": 433,
436 | "ㄌㄧ1": 434,
437 | "ㄌㄧ2": 435,
438 | "ㄌㄧ3": 436,
439 | "ㄌㄧ4": 437,
440 | "ㄌㄧ5": 438,
441 | "ㄌㄧㄚ3": 439,
442 | "ㄌㄧㄝ1": 440,
443 | "ㄌㄧㄝ2": 441,
444 | "ㄌㄧㄝ3": 442,
445 | "ㄌㄧㄝ4": 443,
446 | "ㄌㄧㄝ5": 444,
447 | "ㄌㄧㄠ1": 445,
448 | "ㄌㄧㄠ2": 446,
449 | "ㄌㄧㄠ3": 447,
450 | "ㄌㄧㄠ4": 448,
451 | "ㄌㄧㄡ1": 449,
452 | "ㄌㄧㄡ2": 450,
453 | "ㄌㄧㄡ3": 451,
454 | "ㄌㄧㄡ4": 452,
455 | "ㄌㄧㄢ2": 453,
456 | "ㄌㄧㄢ3": 454,
457 | "ㄌㄧㄢ4": 455,
458 | "ㄌㄧㄣ2": 456,
459 | "ㄌㄧㄣ3": 457,
460 | "ㄌㄧㄣ4": 458,
461 | "ㄌㄧㄤ2": 459,
462 | "ㄌㄧㄤ3": 460,
463 | "ㄌㄧㄤ4": 461,
464 | "ㄌㄧㄥ2": 462,
465 | "ㄌㄧㄥ3": 463,
466 | "ㄌㄧㄥ4": 464,
467 | "ㄌㄨ2": 465,
468 | "ㄌㄨ3": 466,
469 | "ㄌㄨ4": 467,
470 | "ㄌㄨㄛ1": 468,
471 | "ㄌㄨㄛ2": 469,
472 | "ㄌㄨㄛ3": 470,
473 | "ㄌㄨㄛ4": 471,
474 | "ㄌㄨㄛ5": 472,
475 | "ㄌㄨㄢ2": 473,
476 | "ㄌㄨㄢ3": 474,
477 | "ㄌㄨㄢ4": 475,
478 | "ㄌㄨㄣ1": 476,
479 | "ㄌㄨㄣ2": 477,
480 | "ㄌㄨㄣ4": 478,
481 | "ㄌㄨㄥ2": 479,
482 | "ㄌㄨㄥ3": 480,
483 | "ㄌㄨㄥ4": 481,
484 | "ㄌㄩ2": 482,
485 | "ㄌㄩ3": 483,
486 | "ㄌㄩ4": 484,
487 | "ㄌㄩㄝ4": 485,
488 | "ㄌㄩㄢ2": 486,
489 | "ㄌㄩㄢ3": 487,
490 | "ㄌㄩㄣ2": 488,
491 | "ㄍㄚ1": 489,
492 | "ㄍㄚ2": 490,
493 | "ㄍㄚ4": 491,
494 | "ㄍㄚ5": 492,
495 | "ㄍㄜ1": 493,
496 | "ㄍㄜ2": 494,
497 | "ㄍㄜ3": 495,
498 | "ㄍㄜ4": 496,
499 | "ㄍㄜ5": 497,
500 | "ㄍㄞ1": 498,
501 | "ㄍㄞ3": 499,
502 | "ㄍㄞ4": 500,
503 | "ㄍㄟ3": 501,
504 | "ㄍㄠ1": 502,
505 | "ㄍㄠ3": 503,
506 | "ㄍㄠ4": 504,
507 | "ㄍㄡ1": 505,
508 | "ㄍㄡ3": 506,
509 | "ㄍㄡ4": 507,
510 | "ㄍㄢ1": 508,
511 | "ㄍㄢ3": 509,
512 | "ㄍㄢ4": 510,
513 | "ㄍㄣ3": 511,
514 | "ㄍㄣ4": 512,
515 | "ㄍㄤ1": 513,
516 | "ㄍㄤ3": 514,
517 | "ㄍㄤ4": 515,
518 | "ㄍㄥ1": 516,
519 | "ㄍㄥ2": 517,
520 | "ㄍㄥ3": 518,
521 | "ㄍㄥ4": 519,
522 | "ㄍㄧ2": 520,
523 | "ㄍㄨ1": 521,
524 | "ㄍㄨ2": 522,
525 | "ㄍㄨ3": 523,
526 | "ㄍㄨ4": 524,
527 | "ㄍㄨ5": 525,
528 | "ㄍㄨㄚ1": 526,
529 | "ㄍㄨㄚ4": 527,
530 | "ㄍㄨㄛ1": 528,
531 | "ㄍㄨㄛ2": 529,
532 | "ㄍㄨㄛ3": 530,
533 | "ㄍㄨㄛ4": 531,
534 | "ㄍㄨㄞ1": 532,
535 | "ㄍㄨㄞ4": 533,
536 | "ㄍㄨㄟ1": 534,
537 | "ㄍㄨㄟ3": 535,
538 | "ㄍㄨㄟ4": 536,
539 | "ㄍㄨㄢ1": 537,
540 | "ㄍㄨㄢ3": 538,
541 | "ㄍㄨㄢ4": 539,
542 | "ㄍㄨㄣ3": 540,
543 | "ㄍㄨㄣ4": 541,
544 | "ㄍㄨㄤ1": 542,
545 | "ㄍㄨㄤ3": 543,
546 | "ㄍㄨㄤ4": 544,
547 | "ㄍㄨㄥ1": 545,
548 | "ㄍㄨㄥ3": 546,
549 | "ㄍㄨㄥ4": 547,
550 | "ㄍㄨㄥ5": 548,
551 | "ㄎㄚ1": 549,
552 | "ㄎㄚ3": 550,
553 | "ㄎㄚ4": 551,
554 | "ㄎㄜ1": 552,
555 | "ㄎㄜ2": 553,
556 | "ㄎㄜ3": 554,
557 | "ㄎㄜ4": 555,
558 | "ㄎㄞ1": 556,
559 | "ㄎㄞ3": 557,
560 | "ㄎㄞ4": 558,
561 | "ㄎㄠ1": 559,
562 | "ㄎㄠ4": 560,
563 | "ㄎㄡ1": 561,
564 | "ㄎㄡ4": 562,
565 | "ㄎㄢ1": 563,
566 | "ㄎㄢ3": 564,
567 | "ㄎㄢ4": 565,
568 | "ㄎㄣ3": 566,
569 | "ㄎㄣ4": 567,
570 | "ㄎㄤ1": 568,
571 | "ㄎㄤ2": 569,
572 | "ㄎㄤ3": 570,
573 | "ㄎㄤ4": 571,
574 | "ㄎㄥ1": 572,
575 | "ㄎㄥ3": 573,
576 | "ㄎㄨ1": 574,
577 | "ㄎㄨ3": 575,
578 | "ㄎㄨ4": 576,
579 | "ㄎㄨㄚ1": 577,
580 | "ㄎㄨㄚ3": 578,
581 | "ㄎㄨㄛ4": 579,
582 | "ㄎㄨㄞ1": 580,
583 | "ㄎㄨㄞ3": 581,
584 | "ㄎㄨㄞ4": 582,
585 | "ㄎㄨㄟ1": 583,
586 | "ㄎㄨㄟ2": 584,
587 | "ㄎㄨㄟ3": 585,
588 | "ㄎㄨㄟ4": 586,
589 | "ㄎㄨㄢ3": 587,
590 | "ㄎㄨㄣ1": 588,
591 | "ㄎㄨㄣ3": 589,
592 | "ㄎㄨㄤ1": 590,
593 | "ㄎㄨㄤ3": 591,
594 | "ㄎㄨㄤ4": 592,
595 | "ㄎㄨㄥ1": 593,
596 | "ㄎㄨㄥ3": 594,
597 | "ㄎㄨㄥ4": 595,
598 | "ㄏㄚ1": 596,
599 | "ㄏㄚ2": 597,
600 | "ㄏㄚ3": 598,
601 | "ㄏㄜ1": 599,
602 | "ㄏㄜ2": 600,
603 | "ㄏㄜ4": 601,
604 | "ㄏㄞ1": 602,
605 | "ㄏㄞ2": 603,
606 | "ㄏㄞ4": 604,
607 | "ㄏㄟ1": 605,
608 | "ㄏㄟ3": 606,
609 | "ㄏㄠ1": 607,
610 | "ㄏㄠ2": 608,
611 | "ㄏㄠ3": 609,
612 | "ㄏㄠ4": 610,
613 | "ㄏㄡ1": 611,
614 | "ㄏㄡ2": 612,
615 | "ㄏㄡ3": 613,
616 | "ㄏㄡ4": 614,
617 | "ㄏㄢ1": 615,
618 | "ㄏㄢ2": 616,
619 | "ㄏㄢ3": 617,
620 | "ㄏㄢ4": 618,
621 | "ㄏㄣ2": 619,
622 | "ㄏㄣ3": 620,
623 | "ㄏㄤ1": 621,
624 | "ㄏㄤ2": 622,
625 | "ㄏㄤ3": 623,
626 | "ㄏㄤ4": 624,
627 | "ㄏㄥ1": 625,
628 | "ㄏㄥ2": 626,
629 | "ㄏㄥ4": 627,
630 | "ㄏㄨ1": 628,
631 | "ㄏㄨ2": 629,
632 | "ㄏㄨ3": 630,
633 | "ㄏㄨ4": 631,
634 | "ㄏㄨㄚ1": 632,
635 | "ㄏㄨㄚ2": 633,
636 | "ㄏㄨㄚ3": 634,
637 | "ㄏㄨㄚ4": 635,
638 | "ㄏㄨㄛ1": 636,
639 | "ㄏㄨㄛ2": 637,
640 | "ㄏㄨㄛ3": 638,
641 | "ㄏㄨㄛ4": 639,
642 | "ㄏㄨㄛ5": 640,
643 | "ㄏㄨㄞ2": 641,
644 | "ㄏㄨㄞ4": 642,
645 | "ㄏㄨㄟ1": 643,
646 | "ㄏㄨㄟ2": 644,
647 | "ㄏㄨㄟ3": 645,
648 | "ㄏㄨㄟ4": 646,
649 | "ㄏㄨㄢ1": 647,
650 | "ㄏㄨㄢ2": 648,
651 | "ㄏㄨㄢ3": 649,
652 | "ㄏㄨㄢ4": 650,
653 | "ㄏㄨㄣ1": 651,
654 | "ㄏㄨㄣ2": 652,
655 | "ㄏㄨㄣ3": 653,
656 | "ㄏㄨㄣ4": 654,
657 | "ㄏㄨㄤ1": 655,
658 | "ㄏㄨㄤ2": 656,
659 | "ㄏㄨㄤ3": 657,
660 | "ㄏㄨㄤ4": 658,
661 | "ㄏㄨㄤ5": 659,
662 | "ㄏㄨㄥ1": 660,
663 | "ㄏㄨㄥ2": 661,
664 | "ㄏㄨㄥ3": 662,
665 | "ㄏㄨㄥ4": 663,
666 | "ㄐㄧ1": 664,
667 | "ㄐㄧ2": 665,
668 | "ㄐㄧ3": 666,
669 | "ㄐㄧ4": 667,
670 | "ㄐㄧㄚ1": 668,
671 | "ㄐㄧㄚ2": 669,
672 | "ㄐㄧㄚ3": 670,
673 | "ㄐㄧㄚ4": 671,
674 | "ㄐㄧㄚ5": 672,
675 | "ㄐㄧㄝ1": 673,
676 | "ㄐㄧㄝ2": 674,
677 | "ㄐㄧㄝ3": 675,
678 | "ㄐㄧㄝ4": 676,
679 | "ㄐㄧㄝ5": 677,
680 | "ㄐㄧㄠ1": 678,
681 | "ㄐㄧㄠ2": 679,
682 | "ㄐㄧㄠ3": 680,
683 | "ㄐㄧㄠ4": 681,
684 | "ㄐㄧㄡ1": 682,
685 | "ㄐㄧㄡ3": 683,
686 | "ㄐㄧㄡ4": 684,
687 | "ㄐㄧㄡ5": 685,
688 | "ㄐㄧㄢ1": 686,
689 | "ㄐㄧㄢ3": 687,
690 | "ㄐㄧㄢ4": 688,
691 | "ㄐㄧㄣ1": 689,
692 | "ㄐㄧㄣ3": 690,
693 | "ㄐㄧㄣ4": 691,
694 | "ㄐㄧㄤ1": 692,
695 | "ㄐㄧㄤ3": 693,
696 | "ㄐㄧㄤ4": 694,
697 | "ㄐㄧㄥ1": 695,
698 | "ㄐㄧㄥ3": 696,
699 | "ㄐㄧㄥ4": 697,
700 | "ㄐㄩ1": 698,
701 | "ㄐㄩ2": 699,
702 | "ㄐㄩ3": 700,
703 | "ㄐㄩ4": 701,
704 | "ㄐㄩㄝ1": 702,
705 | "ㄐㄩㄝ2": 703,
706 | "ㄐㄩㄝ3": 704,
707 | "ㄐㄩㄝ4": 705,
708 | "ㄐㄩㄢ1": 706,
709 | "ㄐㄩㄢ3": 707,
710 | "ㄐㄩㄢ4": 708,
711 | "ㄐㄩㄣ1": 709,
712 | "ㄐㄩㄣ3": 710,
713 | "ㄐㄩㄣ4": 711,
714 | "ㄐㄩㄥ1": 712,
715 | "ㄐㄩㄥ3": 713,
716 | "ㄑㄧ1": 714,
717 | "ㄑㄧ2": 715,
718 | "ㄑㄧ3": 716,
719 | "ㄑㄧ4": 717,
720 | "ㄑㄧㄚ1": 718,
721 | "ㄑㄧㄚ2": 719,
722 | "ㄑㄧㄚ3": 720,
723 | "ㄑㄧㄚ4": 721,
724 | "ㄑㄧㄝ1": 722,
725 | "ㄑㄧㄝ2": 723,
726 | "ㄑㄧㄝ3": 724,
727 | "ㄑㄧㄝ4": 725,
728 | "ㄑㄧㄠ1": 726,
729 | "ㄑㄧㄠ2": 727,
730 | "ㄑㄧㄠ3": 728,
731 | "ㄑㄧㄠ4": 729,
732 | "ㄑㄧㄡ1": 730,
733 | "ㄑㄧㄡ2": 731,
734 | "ㄑㄧㄡ3": 732,
735 | "ㄑㄧㄢ1": 733,
736 | "ㄑㄧㄢ2": 734,
737 | "ㄑㄧㄢ3": 735,
738 | "ㄑㄧㄢ4": 736,
739 | "ㄑㄧㄣ1": 737,
740 | "ㄑㄧㄣ2": 738,
741 | "ㄑㄧㄣ3": 739,
742 | "ㄑㄧㄣ4": 740,
743 | "ㄑㄧㄤ1": 741,
744 | "ㄑㄧㄤ2": 742,
745 | "ㄑㄧㄤ3": 743,
746 | "ㄑㄧㄤ4": 744,
747 | "ㄑㄧㄥ1": 745,
748 | "ㄑㄧㄥ2": 746,
749 | "ㄑㄧㄥ3": 747,
750 | "ㄑㄧㄥ4": 748,
751 | "ㄑㄩ1": 749,
752 | "ㄑㄩ2": 750,
753 | "ㄑㄩ3": 751,
754 | "ㄑㄩ4": 752,
755 | "ㄑㄩㄝ1": 753,
756 | "ㄑㄩㄝ4": 754,
757 | "ㄑㄩㄢ1": 755,
758 | "ㄑㄩㄢ2": 756,
759 | "ㄑㄩㄢ3": 757,
760 | "ㄑㄩㄢ4": 758,
761 | "ㄑㄩㄣ1": 759,
762 | "ㄑㄩㄣ2": 760,
763 | "ㄑㄩㄥ1": 761,
764 | "ㄑㄩㄥ2": 762,
765 | "ㄑㄩㄥ3": 763,
766 | "ㄒㄧ1": 764,
767 | "ㄒㄧ2": 765,
768 | "ㄒㄧ3": 766,
769 | "ㄒㄧ4": 767,
770 | "ㄒㄧ5": 768,
771 | "ㄒㄧㄚ1": 769,
772 | "ㄒㄧㄚ2": 770,
773 | "ㄒㄧㄚ3": 771,
774 | "ㄒㄧㄚ4": 772,
775 | "ㄒㄧㄝ1": 773,
776 | "ㄒㄧㄝ2": 774,
777 | "ㄒㄧㄝ3": 775,
778 | "ㄒㄧㄝ4": 776,
779 | "ㄒㄧㄝ5": 777,
780 | "ㄒㄧㄠ1": 778,
781 | "ㄒㄧㄠ2": 779,
782 | "ㄒㄧㄠ3": 780,
783 | "ㄒㄧㄠ4": 781,
784 | "ㄒㄧㄡ1": 782,
785 | "ㄒㄧㄡ3": 783,
786 | "ㄒㄧㄡ4": 784,
787 | "ㄒㄧㄢ1": 785,
788 | "ㄒㄧㄢ2": 786,
789 | "ㄒㄧㄢ3": 787,
790 | "ㄒㄧㄢ4": 788,
791 | "ㄒㄧㄣ1": 789,
792 | "ㄒㄧㄣ2": 790,
793 | "ㄒㄧㄣ3": 791,
794 | "ㄒㄧㄣ4": 792,
795 | "ㄒㄧㄤ1": 793,
796 | "ㄒㄧㄤ2": 794,
797 | "ㄒㄧㄤ3": 795,
798 | "ㄒㄧㄤ4": 796,
799 | "ㄒㄧㄥ1": 797,
800 | "ㄒㄧㄥ2": 798,
801 | "ㄒㄧㄥ3": 799,
802 | "ㄒㄧㄥ4": 800,
803 | "ㄒㄧㄥ5": 801,
804 | "ㄒㄩ1": 802,
805 | "ㄒㄩ2": 803,
806 | "ㄒㄩ3": 804,
807 | "ㄒㄩ4": 805,
808 | "ㄒㄩㄝ1": 806,
809 | "ㄒㄩㄝ2": 807,
810 | "ㄒㄩㄝ3": 808,
811 | "ㄒㄩㄝ4": 809,
812 | "ㄒㄩㄢ1": 810,
813 | "ㄒㄩㄢ2": 811,
814 | "ㄒㄩㄢ3": 812,
815 | "ㄒㄩㄢ4": 813,
816 | "ㄒㄩㄣ1": 814,
817 | "ㄒㄩㄣ2": 815,
818 | "ㄒㄩㄣ4": 816,
819 | "ㄒㄩㄥ1": 817,
820 | "ㄒㄩㄥ2": 818,
821 | "ㄒㄩㄥ3": 819,
822 | "ㄒㄩㄥ4": 820,
823 | "ㄓ1": 821,
824 | "ㄓ2": 822,
825 | "ㄓ3": 823,
826 | "ㄓ4": 824,
827 | "ㄓㄚ1": 825,
828 | "ㄓㄚ2": 826,
829 | "ㄓㄚ3": 827,
830 | "ㄓㄚ4": 828,
831 | "ㄓㄜ1": 829,
832 | "ㄓㄜ2": 830,
833 | "ㄓㄜ3": 831,
834 | "ㄓㄜ4": 832,
835 | "ㄓㄜ5": 833,
836 | "ㄓㄞ1": 834,
837 | "ㄓㄞ2": 835,
838 | "ㄓㄞ3": 836,
839 | "ㄓㄞ4": 837,
840 | "ㄓㄟ4": 838,
841 | "ㄓㄠ1": 839,
842 | "ㄓㄠ2": 840,
843 | "ㄓㄠ3": 841,
844 | "ㄓㄠ4": 842,
845 | "ㄓㄡ1": 843,
846 | "ㄓㄡ2": 844,
847 | "ㄓㄡ3": 845,
848 | "ㄓㄡ4": 846,
849 | "ㄓㄢ1": 847,
850 | "ㄓㄢ3": 848,
851 | "ㄓㄢ4": 849,
852 | "ㄓㄣ1": 850,
853 | "ㄓㄣ3": 851,
854 | "ㄓㄣ4": 852,
855 | "ㄓㄤ1": 853,
856 | "ㄓㄤ3": 854,
857 | "ㄓㄤ4": 855,
858 | "ㄓㄥ1": 856,
859 | "ㄓㄥ3": 857,
860 | "ㄓㄥ4": 858,
861 | "ㄓㄨ1": 859,
862 | "ㄓㄨ2": 860,
863 | "ㄓㄨ3": 861,
864 | "ㄓㄨ4": 862,
865 | "ㄓㄨㄚ1": 863,
866 | "ㄓㄨㄚ3": 864,
867 | "ㄓㄨㄛ1": 865,
868 | "ㄓㄨㄛ2": 866,
869 | "ㄓㄨㄞ1": 867,
870 | "ㄓㄨㄞ3": 868,
871 | "ㄓㄨㄞ4": 869,
872 | "ㄓㄨㄟ1": 870,
873 | "ㄓㄨㄟ4": 871,
874 | "ㄓㄨㄢ1": 872,
875 | "ㄓㄨㄢ3": 873,
876 | "ㄓㄨㄢ4": 874,
877 | "ㄓㄨㄣ1": 875,
878 | "ㄓㄨㄣ3": 876,
879 | "ㄓㄨㄣ4": 877,
880 | "ㄓㄨㄤ1": 878,
881 | "ㄓㄨㄤ3": 879,
882 | "ㄓㄨㄤ4": 880,
883 | "ㄓㄨㄥ1": 881,
884 | "ㄓㄨㄥ3": 882,
885 | "ㄓㄨㄥ4": 883,
886 | "ㄔ1": 884,
887 | "ㄔ2": 885,
888 | "ㄔ3": 886,
889 | "ㄔ4": 887,
890 | "ㄔㄚ1": 888,
891 | "ㄔㄚ2": 889,
892 | "ㄔㄚ3": 890,
893 | "ㄔㄚ4": 891,
894 | "ㄔㄜ1": 892,
895 | "ㄔㄜ3": 893,
896 | "ㄔㄜ4": 894,
897 | "ㄔㄞ1": 895,
898 | "ㄔㄞ2": 896,
899 | "ㄔㄞ3": 897,
900 | "ㄔㄞ4": 898,
901 | "ㄔㄠ1": 899,
902 | "ㄔㄠ2": 900,
903 | "ㄔㄠ3": 901,
904 | "ㄔㄠ4": 902,
905 | "ㄔㄡ1": 903,
906 | "ㄔㄡ2": 904,
907 | "ㄔㄡ3": 905,
908 | "ㄔㄡ4": 906,
909 | "ㄔㄢ1": 907,
910 | "ㄔㄢ2": 908,
911 | "ㄔㄢ3": 909,
912 | "ㄔㄢ4": 910,
913 | "ㄔㄣ1": 911,
914 | "ㄔㄣ2": 912,
915 | "ㄔㄣ3": 913,
916 | "ㄔㄣ4": 914,
917 | "ㄔㄤ1": 915,
918 | "ㄔㄤ2": 916,
919 | "ㄔㄤ3": 917,
920 | "ㄔㄤ4": 918,
921 | "ㄔㄥ1": 919,
922 | "ㄔㄥ2": 920,
923 | "ㄔㄥ3": 921,
924 | "ㄔㄥ4": 922,
925 | "ㄔㄨ1": 923,
926 | "ㄔㄨ2": 924,
927 | "ㄔㄨ3": 925,
928 | "ㄔㄨ4": 926,
929 | "ㄔㄨㄚ1": 927,
930 | "ㄔㄨㄚ3": 928,
931 | "ㄔㄨㄛ4": 929,
932 | "ㄔㄨㄞ1": 930,
933 | "ㄔㄨㄞ3": 931,
934 | "ㄔㄨㄞ4": 932,
935 | "ㄔㄨㄟ1": 933,
936 | "ㄔㄨㄟ2": 934,
937 | "ㄔㄨㄟ4": 935,
938 | "ㄔㄨㄢ1": 936,
939 | "ㄔㄨㄢ2": 937,
940 | "ㄔㄨㄢ3": 938,
941 | "ㄔㄨㄢ4": 939,
942 | "ㄔㄨㄣ1": 940,
943 | "ㄔㄨㄣ2": 941,
944 | "ㄔㄨㄣ3": 942,
945 | "ㄔㄨㄤ1": 943,
946 | "ㄔㄨㄤ2": 944,
947 | "ㄔㄨㄤ3": 945,
948 | "ㄔㄨㄤ4": 946,
949 | "ㄔㄨㄥ1": 947,
950 | "ㄔㄨㄥ2": 948,
951 | "ㄔㄨㄥ4": 949,
952 | "ㄕ1": 950,
953 | "ㄕ2": 951,
954 | "ㄕ3": 952,
955 | "ㄕ4": 953,
956 | "ㄕ5": 954,
957 | "ㄕㄚ1": 955,
958 | "ㄕㄚ3": 956,
959 | "ㄕㄚ4": 957,
960 | "ㄕㄜ1": 958,
961 | "ㄕㄜ2": 959,
962 | "ㄕㄜ3": 960,
963 | "ㄕㄜ4": 961,
964 | "ㄕㄞ3": 962,
965 | "ㄕㄞ4": 963,
966 | "ㄕㄟ2": 964,
967 | "ㄕㄠ1": 965,
968 | "ㄕㄠ2": 966,
969 | "ㄕㄠ3": 967,
970 | "ㄕㄠ4": 968,
971 | "ㄕㄡ1": 969,
972 | "ㄕㄡ2": 970,
973 | "ㄕㄡ3": 971,
974 | "ㄕㄡ4": 972,
975 | "ㄕㄢ1": 973,
976 | "ㄕㄢ3": 974,
977 | "ㄕㄢ4": 975,
978 | "ㄕㄣ1": 976,
979 | "ㄕㄣ2": 977,
980 | "ㄕㄣ3": 978,
981 | "ㄕㄣ4": 979,
982 | "ㄕㄣ5": 980,
983 | "ㄕㄤ1": 981,
984 | "ㄕㄤ3": 982,
985 | "ㄕㄤ4": 983,
986 | "ㄕㄤ5": 984,
987 | "ㄕㄥ1": 985,
988 | "ㄕㄥ2": 986,
989 | "ㄕㄥ3": 987,
990 | "ㄕㄥ4": 988,
991 | "ㄕㄥ5": 989,
992 | "ㄕㄨ1": 990,
993 | "ㄕㄨ2": 991,
994 | "ㄕㄨ3": 992,
995 | "ㄕㄨ4": 993,
996 | "ㄕㄨ5": 994,
997 | "ㄕㄨㄚ1": 995,
998 | "ㄕㄨㄛ1": 996,
999 | "ㄕㄨㄛ4": 997,
1000 | "ㄕㄨㄞ1": 998,
1001 | "ㄕㄨㄞ4": 999,
1002 | "ㄕㄨㄟ2": 1000,
1003 | "ㄕㄨㄟ4": 1001,
1004 | "ㄕㄨㄢ4": 1002,
1005 | "ㄕㄨㄣ3": 1003,
1006 | "ㄕㄨㄣ4": 1004,
1007 | "ㄕㄨㄤ1": 1005,
1008 | "ㄕㄨㄤ3": 1006,
1009 | "ㄖ4": 1007,
1010 | "ㄖㄜ2": 1008,
1011 | "ㄖㄜ3": 1009,
1012 | "ㄖㄜ4": 1010,
1013 | "ㄖㄠ2": 1011,
1014 | "ㄖㄠ3": 1012,
1015 | "ㄖㄡ2": 1013,
1016 | "ㄖㄡ3": 1014,
1017 | "ㄖㄡ4": 1015,
1018 | "ㄖㄢ2": 1016,
1019 | "ㄖㄢ3": 1017,
1020 | "ㄖㄣ2": 1018,
1021 | "ㄖㄣ3": 1019,
1022 | "ㄖㄣ4": 1020,
1023 | "ㄖㄤ2": 1021,
1024 | "ㄖㄤ3": 1022,
1025 | "ㄖㄤ4": 1023,
1026 | "ㄖㄥ1": 1024,
1027 | "ㄖㄥ2": 1025,
1028 | "ㄖㄥ3": 1026,
1029 | "ㄖㄨ2": 1027,
1030 | "ㄖㄨ3": 1028,
1031 | "ㄖㄨ4": 1029,
1032 | "ㄖㄨㄛ2": 1030,
1033 | "ㄖㄨㄛ4": 1031,
1034 | "ㄖㄨㄟ2": 1032,
1035 | "ㄖㄨㄟ3": 1033,
1036 | "ㄖㄨㄟ4": 1034,
1037 | "ㄖㄨㄢ2": 1035,
1038 | "ㄖㄨㄢ3": 1036,
1039 | "ㄖㄨㄣ1": 1037,
1040 | "ㄖㄨㄣ2": 1038,
1041 | "ㄖㄨㄥ2": 1039,
1042 | "ㄖㄨㄥ3": 1040,
1043 | "ㄗ1": 1041,
1044 | "ㄗ3": 1042,
1045 | "ㄗ4": 1043,
1046 | "ㄗ5": 1044,
1047 | "ㄗㄚ1": 1045,
1048 | "ㄗㄚ2": 1046,
1049 | "ㄗㄜ2": 1047,
1050 | "ㄗㄜ3": 1048,
1051 | "ㄗㄜ4": 1049,
1052 | "ㄗㄞ1": 1050,
1053 | "ㄗㄞ3": 1051,
1054 | "ㄗㄞ4": 1052,
1055 | "ㄗㄟ2": 1053,
1056 | "ㄗㄠ1": 1054,
1057 | "ㄗㄠ2": 1055,
1058 | "ㄗㄠ3": 1056,
1059 | "ㄗㄠ4": 1057,
1060 | "ㄗㄡ1": 1058,
1061 | "ㄗㄡ3": 1059,
1062 | "ㄗㄡ4": 1060,
1063 | "ㄗㄢ1": 1061,
1064 | "ㄗㄢ2": 1062,
1065 | "ㄗㄢ3": 1063,
1066 | "ㄗㄢ4": 1064,
1067 | "ㄗㄣ1": 1065,
1068 | "ㄗㄣ3": 1066,
1069 | "ㄗㄤ1": 1067,
1070 | "ㄗㄤ3": 1068,
1071 | "ㄗㄤ4": 1069,
1072 | "ㄗㄥ1": 1070,
1073 | "ㄗㄥ4": 1071,
1074 | "ㄗㄨ2": 1072,
1075 | "ㄗㄨ3": 1073,
1076 | "ㄗㄨ4": 1074,
1077 | "ㄗㄨㄛ1": 1075,
1078 | "ㄗㄨㄛ2": 1076,
1079 | "ㄗㄨㄛ3": 1077,
1080 | "ㄗㄨㄛ4": 1078,
1081 | "ㄗㄨㄟ1": 1079,
1082 | "ㄗㄨㄟ3": 1080,
1083 | "ㄗㄨㄟ4": 1081,
1084 | "ㄗㄨㄢ1": 1082,
1085 | "ㄗㄨㄢ3": 1083,
1086 | "ㄗㄨㄢ4": 1084,
1087 | "ㄗㄨㄣ1": 1085,
1088 | "ㄗㄨㄣ3": 1086,
1089 | "ㄗㄨㄣ4": 1087,
1090 | "ㄗㄨㄥ1": 1088,
1091 | "ㄗㄨㄥ3": 1089,
1092 | "ㄗㄨㄥ4": 1090,
1093 | "ㄘ1": 1091,
1094 | "ㄘ2": 1092,
1095 | "ㄘ3": 1093,
1096 | "ㄘ4": 1094,
1097 | "ㄘㄚ1": 1095,
1098 | "ㄘㄜ4": 1096,
1099 | "ㄘㄞ1": 1097,
1100 | "ㄘㄞ3": 1098,
1101 | "ㄘㄞ4": 1099,
1102 | "ㄘㄠ1": 1100,
1103 | "ㄘㄠ3": 1101,
1104 | "ㄘㄠ4": 1102,
1105 | "ㄘㄡ4": 1103,
1106 | "ㄘㄢ1": 1104,
1107 | "ㄘㄢ2": 1105,
1108 | "ㄘㄢ3": 1106,
1109 | "ㄘㄢ4": 1107,
1110 | "ㄘㄣ1": 1108,
1111 | "ㄘㄣ2": 1109,
1112 | "ㄘㄤ1": 1110,
1113 | "ㄘㄤ2": 1111,
1114 | "ㄘㄤ3": 1112,
1115 | "ㄘㄥ2": 1113,
1116 | "ㄘㄨ1": 1114,
1117 | "ㄘㄨ2": 1115,
1118 | "ㄘㄨ4": 1116,
1119 | "ㄘㄨㄛ1": 1117,
1120 | "ㄘㄨㄛ2": 1118,
1121 | "ㄘㄨㄛ3": 1119,
1122 | "ㄘㄨㄛ4": 1120,
1123 | "ㄘㄨㄟ1": 1121,
1124 | "ㄘㄨㄟ3": 1122,
1125 | "ㄘㄨㄟ4": 1123,
1126 | "ㄘㄨㄢ1": 1124,
1127 | "ㄘㄨㄢ2": 1125,
1128 | "ㄘㄨㄢ4": 1126,
1129 | "ㄘㄨㄣ1": 1127,
1130 | "ㄘㄨㄣ2": 1128,
1131 | "ㄘㄨㄣ3": 1129,
1132 | "ㄘㄨㄣ4": 1130,
1133 | "ㄘㄨㄥ1": 1131,
1134 | "ㄘㄨㄥ2": 1132,
1135 | "ㄘㄨㄥ4": 1133,
1136 | "ㄙ1": 1134,
1137 | "ㄙ3": 1135,
1138 | "ㄙ4": 1136,
1139 | "ㄙ5": 1137,
1140 | "ㄙㄚ1": 1138,
1141 | "ㄙㄚ3": 1139,
1142 | "ㄙㄚ4": 1140,
1143 | "ㄙㄜ4": 1141,
1144 | "ㄙㄞ1": 1142,
1145 | "ㄙㄞ4": 1143,
1146 | "ㄙㄠ1": 1144,
1147 | "ㄙㄠ3": 1145,
1148 | "ㄙㄠ4": 1146,
1149 | "ㄙㄠ5": 1147,
1150 | "ㄙㄡ1": 1148,
1151 | "ㄙㄡ3": 1149,
1152 | "ㄙㄡ4": 1150,
1153 | "ㄙㄢ1": 1151,
1154 | "ㄙㄢ3": 1152,
1155 | "ㄙㄢ4": 1153,
1156 | "ㄙㄣ1": 1154,
1157 | "ㄙㄤ1": 1155,
1158 | "ㄙㄤ4": 1156,
1159 | "ㄙㄨ1": 1157,
1160 | "ㄙㄨ4": 1158,
1161 | "ㄙㄨㄛ1": 1159,
1162 | "ㄙㄨㄛ2": 1160,
1163 | "ㄙㄨㄛ3": 1161,
1164 | "ㄙㄨㄛ4": 1162,
1165 | "ㄙㄨㄟ1": 1163,
1166 | "ㄙㄨㄟ2": 1164,
1167 | "ㄙㄨㄟ3": 1165,
1168 | "ㄙㄨㄟ4": 1166,
1169 | "ㄙㄨㄢ3": 1167,
1170 | "ㄙㄨㄢ4": 1168,
1171 | "ㄙㄨㄣ1": 1169,
1172 | "ㄙㄨㄣ3": 1170,
1173 | "ㄙㄨㄣ4": 1171,
1174 | "ㄙㄨㄥ1": 1172,
1175 | "ㄙㄨㄥ2": 1173,
1176 | "ㄙㄨㄥ3": 1174,
1177 | "ㄙㄨㄥ4": 1175,
1178 | "ㄚ1": 1176,
1179 | "ㄚ2": 1177,
1180 | "ㄚ3": 1178,
1181 | "ㄚ4": 1179,
1182 | "ㄚ5": 1180,
1183 | "ㄛ1": 1181,
1184 | "ㄛ2": 1182,
1185 | "ㄛ3": 1183,
1186 | "ㄜ1": 1184,
1187 | "ㄜ2": 1185,
1188 | "ㄜ3": 1186,
1189 | "ㄜ4": 1187,
1190 | "ㄝ4": 1188,
1191 | "ㄞ1": 1189,
1192 | "ㄞ2": 1190,
1193 | "ㄞ3": 1191,
1194 | "ㄞ4": 1192,
1195 | "ㄟ4": 1193,
1196 | "ㄠ1": 1194,
1197 | "ㄠ2": 1195,
1198 | "ㄠ3": 1196,
1199 | "ㄠ4": 1197,
1200 | "ㄡ1": 1198,
1201 | "ㄡ2": 1199,
1202 | "ㄡ3": 1200,
1203 | "ㄡ4": 1201,
1204 | "ㄢ1": 1202,
1205 | "ㄢ2": 1203,
1206 | "ㄢ3": 1204,
1207 | "ㄢ4": 1205,
1208 | "ㄣ1": 1206,
1209 | "ㄣ3": 1207,
1210 | "ㄣ5": 1208,
1211 | "ㄤ1": 1209,
1212 | "ㄤ2": 1210,
1213 | "ㄤ3": 1211,
1214 | "ㄥ1": 1212,
1215 | "ㄦ1": 1213,
1216 | "ㄦ2": 1214,
1217 | "ㄦ3": 1215,
1218 | "ㄦ4": 1216,
1219 | "ㄧ1": 1217,
1220 | "ㄧ2": 1218,
1221 | "ㄧ3": 1219,
1222 | "ㄧ4": 1220,
1223 | "ㄧㄚ1": 1221,
1224 | "ㄧㄚ2": 1222,
1225 | "ㄧㄚ3": 1223,
1226 | "ㄧㄚ4": 1224,
1227 | "ㄧㄚ5": 1225,
1228 | "ㄧㄝ1": 1226,
1229 | "ㄧㄝ2": 1227,
1230 | "ㄧㄝ4": 1228,
1231 | "ㄧㄝ5": 1229,
1232 | "ㄧㄞ2": 1230,
1233 | "ㄧㄠ1": 1231,
1234 | "ㄧㄠ2": 1232,
1235 | "ㄧㄠ3": 1233,
1236 | "ㄧㄠ4": 1234,
1237 | "ㄧㄡ1": 1235,
1238 | "ㄧㄡ2": 1236,
1239 | "ㄧㄡ3": 1237,
1240 | "ㄧㄡ4": 1238,
1241 | "ㄧㄢ1": 1239,
1242 | "ㄧㄢ2": 1240,
1243 | "ㄧㄢ3": 1241,
1244 | "ㄧㄢ4": 1242,
1245 | "ㄧㄣ1": 1243,
1246 | "ㄧㄣ2": 1244,
1247 | "ㄧㄣ3": 1245,
1248 | "ㄧㄣ4": 1246,
1249 | "ㄧㄤ1": 1247,
1250 | "ㄧㄤ2": 1248,
1251 | "ㄧㄤ3": 1249,
1252 | "ㄧㄤ4": 1250,
1253 | "ㄧㄥ1": 1251,
1254 | "ㄧㄥ2": 1252,
1255 | "ㄧㄥ3": 1253,
1256 | "ㄧㄥ4": 1254,
1257 | "ㄨ1": 1255,
1258 | "ㄨ2": 1256,
1259 | "ㄨ3": 1257,
1260 | "ㄨ4": 1258,
1261 | "ㄨㄚ1": 1259,
1262 | "ㄨㄚ2": 1260,
1263 | "ㄨㄚ3": 1261,
1264 | "ㄨㄚ4": 1262,
1265 | "ㄨㄚ5": 1263,
1266 | "ㄨㄛ1": 1264,
1267 | "ㄨㄛ3": 1265,
1268 | "ㄨㄛ4": 1266,
1269 | "ㄨㄞ1": 1267,
1270 | "ㄨㄞ3": 1268,
1271 | "ㄨㄟ1": 1269,
1272 | "ㄨㄟ2": 1270,
1273 | "ㄨㄟ3": 1271,
1274 | "ㄨㄟ4": 1272,
1275 | "ㄨㄢ1": 1273,
1276 | "ㄨㄢ2": 1274,
1277 | "ㄨㄢ3": 1275,
1278 | "ㄨㄢ4": 1276,
1279 | "ㄨㄣ2": 1277,
1280 | "ㄨㄣ3": 1278,
1281 | "ㄨㄣ4": 1279,
1282 | "ㄨㄤ2": 1280,
1283 | "ㄨㄤ3": 1281,
1284 | "ㄨㄤ4": 1282,
1285 | "ㄨㄥ1": 1283,
1286 | "ㄨㄥ3": 1284,
1287 | "ㄩ1": 1285,
1288 | "ㄩ2": 1286,
1289 | "ㄩ3": 1287,
1290 | "ㄩ4": 1288,
1291 | "ㄩ5": 1289,
1292 | "ㄩㄝ1": 1290,
1293 | "ㄩㄝ4": 1291,
1294 | "ㄩㄢ1": 1292,
1295 | "ㄩㄢ2": 1293,
1296 | "ㄩㄢ3": 1294,
1297 | "ㄩㄢ4": 1295,
1298 | "ㄩㄣ1": 1296,
1299 | "ㄩㄣ2": 1297,
1300 | "ㄩㄣ3": 1298,
1301 | "ㄩㄣ4": 1299,
1302 | "ㄩㄤ4": 1300,
1303 | "ㄩㄥ1": 1301,
1304 | "ㄩㄥ2": 1302,
1305 | "ㄩㄥ3": 1303,
1306 | "ㄩㄥ4": 1304
1307 | }
--------------------------------------------------------------------------------
/gen_polyphonic_fix.py:
--------------------------------------------------------------------------------
1 | with open("polyphonic-fix.rep") as f:
2 | polyphonic_fix = f.read()
3 |
4 | lines = polyphonic_fix.split("\n")
5 |
6 | word_dict = {}
7 |
8 | for line in lines:
9 | item = line.split(":")
10 | key = item[0]
11 | value = item[1]
12 | value = eval(value)
13 | if "暴" in key:
14 | print("skip", key)
15 | continue
16 | word_dict[key] = value
17 |
18 | import json
19 |
20 | json.dump(word_dict, open("zh_word_dict.json", "w"), ensure_ascii=False, indent=2)
21 |
--------------------------------------------------------------------------------
/input.txt:
--------------------------------------------------------------------------------
1 | 叹息声一声接着一声传出,木兰对着房门织布。听不见织布机织布的声音,只听见木兰在叹息。
2 | 问木兰在想什么?问木兰在惦记什么?木兰答道:我也没有在想什么,也没有在惦记什么。
3 | 昨天晚上看见征兵文书,知道君主在大规模征兵,那么多卷征兵文册,每一卷上都有父亲的名字。
4 | 父亲没有大儿子,木兰我没有兄长,木兰愿意为此到集市上去买马鞍和马匹,就开始替代父亲去征战。
5 | 在集市各处购买马具。第二天早晨离开父母,晚上宿营在黄河边,听不见父母呼唤女儿的声音,只能听到黄河水流的水声。
6 | 第二天早晨离开黄河上路,晚上到达黑山头,听不见父母呼唤女儿的声音,只能听到燕山胡兵战马的啾啾的鸣叫声。
7 | 不远万里奔赴战场,翻越重重山峰就像飞起来那样迅速。
8 | 北方的寒气中传来打更声,月光映照着战士们的铠甲。
9 | 将士们身经百战,有的为国捐躯,有的转战多年胜利归来。
10 | 胜利归来朝见天子,天子坐在殿堂论功行赏。给木兰记很大的功勋,得到的赏赐有千百金还有余。
11 | 天子问木兰有什么要求,木兰说不愿做尚书郎,希望骑上千里马,回到故乡。
12 | 父母听说女儿回来了,互相搀扶着到城外迎接她。
13 | 姐姐听说妹妹回来了,对着门户梳妆打扮起来。
14 | 弟弟听说姐姐回来了,忙着霍霍地磨刀杀猪宰羊。
15 | 每间房都打开了门进去看看,脱去打仗时穿的战袍,穿上以前女孩子的衣裳。
16 | 当着窗子,对着镜子整理漂亮的头发,对着镜子在面部贴上装饰物。
17 | 走出去看一起打仗的伙伴,伙伴们很吃惊,都说我们同行数年之久,竟然不知木兰是女孩。
18 | 提着兔子耳朵悬在半空中时,雄兔两只前脚时时动弹、雌兔两只眼睛时常眯着,所以容易分辨。
19 | 雄雌两兔一起并排跑,怎能分辨哪个是雄兔哪个是雌兔呢?
--------------------------------------------------------------------------------
/resource/en_word_dict.json:
--------------------------------------------------------------------------------
1 | {
2 | "github": [
3 | "G",
4 | "IH1",
5 | "T",
6 | "-",
7 | "HH",
8 | "AH2",
9 | "B"
10 | ],
11 | "the": [
12 | "TH",
13 | "EH2"
14 | ],
15 | "one": [
16 | "W",
17 | "AH1",
18 | "N"
19 | ],
20 | "nineteen": [
21 | "N",
22 | "AY1",
23 | "N",
24 | "T",
25 | "IY",
26 | "N"
27 | ]
28 | }
--------------------------------------------------------------------------------
/resource/g2pw/LABELS.txt:
--------------------------------------------------------------------------------
1 | ㄅㄚ1
2 | ㄅㄚ2
3 | ㄅㄚ3
4 | ㄅㄚ4
5 | ㄅㄚ5
6 | ㄅㄛ1
7 | ㄅㄛ2
8 | ㄅㄛ3
9 | ㄅㄛ4
10 | ㄅㄛ5
11 | ㄅㄞ2
12 | ㄅㄞ3
13 | ㄅㄞ4
14 | ㄅㄟ1
15 | ㄅㄟ3
16 | ㄅㄟ4
17 | ㄅㄠ1
18 | ㄅㄠ2
19 | ㄅㄠ3
20 | ㄅㄠ4
21 | ㄅㄠ5
22 | ㄅㄢ1
23 | ㄅㄢ3
24 | ㄅㄢ4
25 | ㄅㄣ1
26 | ㄅㄣ4
27 | ㄅㄤ1
28 | ㄅㄤ3
29 | ㄅㄤ4
30 | ㄅㄥ1
31 | ㄅㄥ3
32 | ㄅㄥ4
33 | ㄅㄧ1
34 | ㄅㄧ2
35 | ㄅㄧ3
36 | ㄅㄧ4
37 | ㄅㄧㄝ2
38 | ㄅㄧㄝ3
39 | ㄅㄧㄝ4
40 | ㄅㄧㄠ1
41 | ㄅㄧㄠ3
42 | ㄅㄧㄠ4
43 | ㄅㄧㄢ1
44 | ㄅㄧㄢ3
45 | ㄅㄧㄢ4
46 | ㄅㄧㄣ1
47 | ㄅㄧㄣ4
48 | ㄅㄧㄥ1
49 | ㄅㄧㄥ3
50 | ㄅㄧㄥ4
51 | ㄅㄨ1
52 | ㄅㄨ2
53 | ㄅㄨ3
54 | ㄅㄨ4
55 | ㄆㄚ1
56 | ㄆㄚ2
57 | ㄆㄚ4
58 | ㄆㄚ5
59 | ㄆㄛ1
60 | ㄆㄛ2
61 | ㄆㄛ3
62 | ㄆㄛ4
63 | ㄆㄛ5
64 | ㄆㄞ1
65 | ㄆㄞ2
66 | ㄆㄞ3
67 | ㄆㄟ1
68 | ㄆㄟ2
69 | ㄆㄟ3
70 | ㄆㄟ4
71 | ㄆㄠ1
72 | ㄆㄠ2
73 | ㄆㄠ3
74 | ㄆㄠ4
75 | ㄆㄡ1
76 | ㄆㄡ2
77 | ㄆㄡ3
78 | ㄆㄢ1
79 | ㄆㄢ2
80 | ㄆㄢ3
81 | ㄆㄢ4
82 | ㄆㄣ1
83 | ㄆㄣ2
84 | ㄆㄣ4
85 | ㄆㄤ1
86 | ㄆㄤ2
87 | ㄆㄤ4
88 | ㄆㄥ1
89 | ㄆㄥ2
90 | ㄆㄥ3
91 | ㄆㄥ4
92 | ㄆㄧ1
93 | ㄆㄧ2
94 | ㄆㄧ3
95 | ㄆㄧ4
96 | ㄆㄧㄝ1
97 | ㄆㄧㄝ3
98 | ㄆㄧㄝ4
99 | ㄆㄧㄠ1
100 | ㄆㄧㄠ2
101 | ㄆㄧㄠ3
102 | ㄆㄧㄠ4
103 | ㄆㄧㄢ1
104 | ㄆㄧㄢ2
105 | ㄆㄧㄢ3
106 | ㄆㄧㄢ4
107 | ㄆㄧㄣ1
108 | ㄆㄧㄣ2
109 | ㄆㄧㄣ4
110 | ㄆㄧㄥ1
111 | ㄆㄧㄥ2
112 | ㄆㄧㄥ3
113 | ㄆㄧㄥ4
114 | ㄆㄨ1
115 | ㄆㄨ2
116 | ㄆㄨ3
117 | ㄆㄨ4
118 | ㄇㄚ1
119 | ㄇㄚ2
120 | ㄇㄚ3
121 | ㄇㄚ4
122 | ㄇㄚ5
123 | ㄇㄛ1
124 | ㄇㄛ2
125 | ㄇㄛ3
126 | ㄇㄛ4
127 | ㄇㄛ5
128 | ㄇㄜ5
129 | ㄇㄞ2
130 | ㄇㄞ4
131 | ㄇㄟ2
132 | ㄇㄟ4
133 | ㄇㄟ5
134 | ㄇㄠ1
135 | ㄇㄠ2
136 | ㄇㄠ3
137 | ㄇㄠ4
138 | ㄇㄡ2
139 | ㄇㄡ3
140 | ㄇㄡ4
141 | ㄇㄢ1
142 | ㄇㄢ2
143 | ㄇㄢ3
144 | ㄇㄢ4
145 | ㄇㄣ1
146 | ㄇㄣ2
147 | ㄇㄣ4
148 | ㄇㄣ5
149 | ㄇㄤ2
150 | ㄇㄤ3
151 | ㄇㄥ1
152 | ㄇㄥ2
153 | ㄇㄥ3
154 | ㄇㄥ4
155 | ㄇㄧ1
156 | ㄇㄧ2
157 | ㄇㄧ3
158 | ㄇㄧ4
159 | ㄇㄧㄝ1
160 | ㄇㄧㄝ4
161 | ㄇㄧㄠ3
162 | ㄇㄧㄠ4
163 | ㄇㄧㄡ1
164 | ㄇㄧㄡ4
165 | ㄇㄧㄢ2
166 | ㄇㄧㄢ3
167 | ㄇㄧㄢ4
168 | ㄇㄧㄣ2
169 | ㄇㄧㄣ3
170 | ㄇㄧㄥ2
171 | ㄇㄧㄥ3
172 | ㄇㄧㄥ4
173 | ㄇㄨ2
174 | ㄇㄨ3
175 | ㄇㄨ4
176 | ㄈㄚ1
177 | ㄈㄚ2
178 | ㄈㄚ3
179 | ㄈㄚ4
180 | ㄈㄛ2
181 | ㄈㄛ4
182 | ㄈㄟ1
183 | ㄈㄟ2
184 | ㄈㄟ3
185 | ㄈㄟ4
186 | ㄈㄡ1
187 | ㄈㄡ2
188 | ㄈㄡ3
189 | ㄈㄡ4
190 | ㄈㄢ1
191 | ㄈㄢ2
192 | ㄈㄢ3
193 | ㄈㄢ4
194 | ㄈㄣ1
195 | ㄈㄣ2
196 | ㄈㄣ4
197 | ㄈㄣ5
198 | ㄈㄤ1
199 | ㄈㄤ2
200 | ㄈㄤ3
201 | ㄈㄤ4
202 | ㄈㄥ1
203 | ㄈㄥ2
204 | ㄈㄥ3
205 | ㄈㄥ4
206 | ㄈㄨ1
207 | ㄈㄨ2
208 | ㄈㄨ3
209 | ㄈㄨ4
210 | ㄈㄨ5
211 | ㄈㄨㄥ4
212 | ㄉㄚ1
213 | ㄉㄚ2
214 | ㄉㄚ3
215 | ㄉㄚ4
216 | ㄉㄚ5
217 | ㄉㄜ2
218 | ㄉㄜ5
219 | ㄉㄞ1
220 | ㄉㄞ3
221 | ㄉㄞ4
222 | ㄉㄟ3
223 | ㄉㄠ1
224 | ㄉㄠ2
225 | ㄉㄠ3
226 | ㄉㄠ4
227 | ㄉㄡ1
228 | ㄉㄡ3
229 | ㄉㄡ4
230 | ㄉㄢ1
231 | ㄉㄢ3
232 | ㄉㄢ4
233 | ㄉㄤ1
234 | ㄉㄤ3
235 | ㄉㄤ4
236 | ㄉㄥ1
237 | ㄉㄥ4
238 | ㄉㄧ1
239 | ㄉㄧ2
240 | ㄉㄧ3
241 | ㄉㄧ4
242 | ㄉㄧ5
243 | ㄉㄧㄚ1
244 | ㄉㄧㄝ1
245 | ㄉㄧㄝ2
246 | ㄉㄧㄝ5
247 | ㄉㄧㄠ1
248 | ㄉㄧㄠ3
249 | ㄉㄧㄠ4
250 | ㄉㄧㄡ1
251 | ㄉㄧㄢ1
252 | ㄉㄧㄢ3
253 | ㄉㄧㄢ4
254 | ㄉㄧㄤ1
255 | ㄉㄧㄥ1
256 | ㄉㄧㄥ3
257 | ㄉㄧㄥ4
258 | ㄉㄨ1
259 | ㄉㄨ2
260 | ㄉㄨ3
261 | ㄉㄨ4
262 | ㄉㄨㄛ1
263 | ㄉㄨㄛ2
264 | ㄉㄨㄛ3
265 | ㄉㄨㄛ4
266 | ㄉㄨㄛ5
267 | ㄉㄨㄟ1
268 | ㄉㄨㄟ4
269 | ㄉㄨㄢ1
270 | ㄉㄨㄣ1
271 | ㄉㄨㄣ3
272 | ㄉㄨㄣ4
273 | ㄉㄨㄥ1
274 | ㄉㄨㄥ3
275 | ㄉㄨㄥ4
276 | ㄊㄚ1
277 | ㄊㄚ3
278 | ㄊㄚ4
279 | ㄊㄜ1
280 | ㄊㄜ4
281 | ㄊㄞ1
282 | ㄊㄞ2
283 | ㄊㄞ4
284 | ㄊㄞ5
285 | ㄊㄠ1
286 | ㄊㄠ2
287 | ㄊㄡ1
288 | ㄊㄡ2
289 | ㄊㄡ3
290 | ㄊㄡ5
291 | ㄊㄢ1
292 | ㄊㄢ2
293 | ㄊㄢ3
294 | ㄊㄢ4
295 | ㄊㄤ1
296 | ㄊㄤ2
297 | ㄊㄤ3
298 | ㄊㄤ4
299 | ㄊㄥ1
300 | ㄊㄥ2
301 | ㄊㄥ5
302 | ㄊㄧ1
303 | ㄊㄧ2
304 | ㄊㄧ3
305 | ㄊㄧ4
306 | ㄊㄧㄝ1
307 | ㄊㄧㄝ3
308 | ㄊㄧㄝ4
309 | ㄊㄧㄠ1
310 | ㄊㄧㄠ2
311 | ㄊㄧㄠ3
312 | ㄊㄧㄠ4
313 | ㄊㄧㄢ2
314 | ㄊㄧㄢ3
315 | ㄊㄧㄢ4
316 | ㄊㄧㄥ1
317 | ㄊㄧㄥ2
318 | ㄊㄧㄥ3
319 | ㄊㄧㄥ4
320 | ㄊㄨ1
321 | ㄊㄨ2
322 | ㄊㄨ3
323 | ㄊㄨ4
324 | ㄊㄨㄛ1
325 | ㄊㄨㄛ2
326 | ㄊㄨㄛ3
327 | ㄊㄨㄛ4
328 | ㄊㄨㄟ1
329 | ㄊㄨㄟ2
330 | ㄊㄨㄟ3
331 | ㄊㄨㄟ4
332 | ㄊㄨㄢ2
333 | ㄊㄨㄢ3
334 | ㄊㄨㄣ1
335 | ㄊㄨㄣ2
336 | ㄊㄨㄣ3
337 | ㄊㄨㄣ4
338 | ㄊㄨㄥ1
339 | ㄊㄨㄥ2
340 | ㄊㄨㄥ3
341 | ㄊㄨㄥ4
342 | ㄋㄚ1
343 | ㄋㄚ2
344 | ㄋㄚ3
345 | ㄋㄚ4
346 | ㄋㄚ5
347 | ㄋㄜ1
348 | ㄋㄜ2
349 | ㄋㄜ4
350 | ㄋㄜ5
351 | ㄋㄞ3
352 | ㄋㄞ4
353 | ㄋㄞ5
354 | ㄋㄟ3
355 | ㄋㄟ4
356 | ㄋㄠ1
357 | ㄋㄠ2
358 | ㄋㄠ3
359 | ㄋㄠ4
360 | ㄋㄡ2
361 | ㄋㄡ4
362 | ㄋㄢ1
363 | ㄋㄢ2
364 | ㄋㄢ3
365 | ㄋㄢ4
366 | ㄋㄤ1
367 | ㄋㄤ2
368 | ㄋㄤ5
369 | ㄋㄥ2
370 | ㄋㄥ4
371 | ㄋㄧ2
372 | ㄋㄧ3
373 | ㄋㄧ4
374 | ㄋㄧㄝ1
375 | ㄋㄧㄝ2
376 | ㄋㄧㄝ4
377 | ㄋㄧㄠ3
378 | ㄋㄧㄠ4
379 | ㄋㄧㄡ3
380 | ㄋㄧㄡ4
381 | ㄋㄧㄢ1
382 | ㄋㄧㄢ2
383 | ㄋㄧㄢ3
384 | ㄋㄧㄢ4
385 | ㄋㄧㄣ2
386 | ㄋㄧㄥ2
387 | ㄋㄧㄥ3
388 | ㄋㄧㄥ4
389 | ㄋㄨ2
390 | ㄋㄨㄛ2
391 | ㄋㄨㄛ3
392 | ㄋㄨㄛ4
393 | ㄋㄨㄢ2
394 | ㄋㄨㄢ3
395 | ㄋㄨㄥ2
396 | ㄋㄨㄥ3
397 | ㄋㄨㄥ4
398 | ㄋㄩ3
399 | ㄋㄩ4
400 | ㄌㄚ1
401 | ㄌㄚ2
402 | ㄌㄚ3
403 | ㄌㄚ4
404 | ㄌㄚ5
405 | ㄌㄛ5
406 | ㄌㄜ1
407 | ㄌㄜ4
408 | ㄌㄜ5
409 | ㄌㄞ2
410 | ㄌㄞ4
411 | ㄌㄟ1
412 | ㄌㄟ2
413 | ㄌㄟ3
414 | ㄌㄟ4
415 | ㄌㄠ1
416 | ㄌㄠ2
417 | ㄌㄠ3
418 | ㄌㄠ4
419 | ㄌㄠ5
420 | ㄌㄡ1
421 | ㄌㄡ2
422 | ㄌㄡ3
423 | ㄌㄡ4
424 | ㄌㄡ5
425 | ㄌㄢ2
426 | ㄌㄢ3
427 | ㄌㄢ4
428 | ㄌㄤ1
429 | ㄌㄤ2
430 | ㄌㄤ3
431 | ㄌㄤ4
432 | ㄌㄥ1
433 | ㄌㄥ2
434 | ㄌㄥ4
435 | ㄌㄧ1
436 | ㄌㄧ2
437 | ㄌㄧ3
438 | ㄌㄧ4
439 | ㄌㄧ5
440 | ㄌㄧㄚ3
441 | ㄌㄧㄝ1
442 | ㄌㄧㄝ2
443 | ㄌㄧㄝ3
444 | ㄌㄧㄝ4
445 | ㄌㄧㄝ5
446 | ㄌㄧㄠ1
447 | ㄌㄧㄠ2
448 | ㄌㄧㄠ3
449 | ㄌㄧㄠ4
450 | ㄌㄧㄡ1
451 | ㄌㄧㄡ2
452 | ㄌㄧㄡ3
453 | ㄌㄧㄡ4
454 | ㄌㄧㄢ2
455 | ㄌㄧㄢ3
456 | ㄌㄧㄢ4
457 | ㄌㄧㄣ2
458 | ㄌㄧㄣ3
459 | ㄌㄧㄣ4
460 | ㄌㄧㄤ2
461 | ㄌㄧㄤ3
462 | ㄌㄧㄤ4
463 | ㄌㄧㄥ2
464 | ㄌㄧㄥ3
465 | ㄌㄧㄥ4
466 | ㄌㄨ2
467 | ㄌㄨ3
468 | ㄌㄨ4
469 | ㄌㄨㄛ1
470 | ㄌㄨㄛ2
471 | ㄌㄨㄛ3
472 | ㄌㄨㄛ4
473 | ㄌㄨㄛ5
474 | ㄌㄨㄢ2
475 | ㄌㄨㄢ3
476 | ㄌㄨㄢ4
477 | ㄌㄨㄣ1
478 | ㄌㄨㄣ2
479 | ㄌㄨㄣ4
480 | ㄌㄨㄥ2
481 | ㄌㄨㄥ3
482 | ㄌㄨㄥ4
483 | ㄌㄩ2
484 | ㄌㄩ3
485 | ㄌㄩ4
486 | ㄌㄩㄝ4
487 | ㄌㄩㄢ2
488 | ㄌㄩㄢ3
489 | ㄌㄩㄣ2
490 | ㄍㄚ1
491 | ㄍㄚ2
492 | ㄍㄚ4
493 | ㄍㄚ5
494 | ㄍㄜ1
495 | ㄍㄜ2
496 | ㄍㄜ3
497 | ㄍㄜ4
498 | ㄍㄜ5
499 | ㄍㄞ1
500 | ㄍㄞ3
501 | ㄍㄞ4
502 | ㄍㄟ3
503 | ㄍㄠ1
504 | ㄍㄠ3
505 | ㄍㄠ4
506 | ㄍㄡ1
507 | ㄍㄡ3
508 | ㄍㄡ4
509 | ㄍㄢ1
510 | ㄍㄢ3
511 | ㄍㄢ4
512 | ㄍㄣ3
513 | ㄍㄣ4
514 | ㄍㄤ1
515 | ㄍㄤ3
516 | ㄍㄤ4
517 | ㄍㄥ1
518 | ㄍㄥ2
519 | ㄍㄥ3
520 | ㄍㄥ4
521 | ㄍㄧ2
522 | ㄍㄨ1
523 | ㄍㄨ2
524 | ㄍㄨ3
525 | ㄍㄨ4
526 | ㄍㄨ5
527 | ㄍㄨㄚ1
528 | ㄍㄨㄚ4
529 | ㄍㄨㄛ1
530 | ㄍㄨㄛ2
531 | ㄍㄨㄛ3
532 | ㄍㄨㄛ4
533 | ㄍㄨㄞ1
534 | ㄍㄨㄞ4
535 | ㄍㄨㄟ1
536 | ㄍㄨㄟ3
537 | ㄍㄨㄟ4
538 | ㄍㄨㄢ1
539 | ㄍㄨㄢ3
540 | ㄍㄨㄢ4
541 | ㄍㄨㄣ3
542 | ㄍㄨㄣ4
543 | ㄍㄨㄤ1
544 | ㄍㄨㄤ3
545 | ㄍㄨㄤ4
546 | ㄍㄨㄥ1
547 | ㄍㄨㄥ3
548 | ㄍㄨㄥ4
549 | ㄍㄨㄥ5
550 | ㄎㄚ1
551 | ㄎㄚ3
552 | ㄎㄚ4
553 | ㄎㄜ1
554 | ㄎㄜ2
555 | ㄎㄜ3
556 | ㄎㄜ4
557 | ㄎㄞ1
558 | ㄎㄞ3
559 | ㄎㄞ4
560 | ㄎㄠ1
561 | ㄎㄠ4
562 | ㄎㄡ1
563 | ㄎㄡ4
564 | ㄎㄢ1
565 | ㄎㄢ3
566 | ㄎㄢ4
567 | ㄎㄣ3
568 | ㄎㄣ4
569 | ㄎㄤ1
570 | ㄎㄤ2
571 | ㄎㄤ3
572 | ㄎㄤ4
573 | ㄎㄥ1
574 | ㄎㄥ3
575 | ㄎㄨ1
576 | ㄎㄨ3
577 | ㄎㄨ4
578 | ㄎㄨㄚ1
579 | ㄎㄨㄚ3
580 | ㄎㄨㄛ4
581 | ㄎㄨㄞ1
582 | ㄎㄨㄞ3
583 | ㄎㄨㄞ4
584 | ㄎㄨㄟ1
585 | ㄎㄨㄟ2
586 | ㄎㄨㄟ3
587 | ㄎㄨㄟ4
588 | ㄎㄨㄢ3
589 | ㄎㄨㄣ1
590 | ㄎㄨㄣ3
591 | ㄎㄨㄤ1
592 | ㄎㄨㄤ3
593 | ㄎㄨㄤ4
594 | ㄎㄨㄥ1
595 | ㄎㄨㄥ3
596 | ㄎㄨㄥ4
597 | ㄏㄚ1
598 | ㄏㄚ2
599 | ㄏㄚ3
600 | ㄏㄜ1
601 | ㄏㄜ2
602 | ㄏㄜ4
603 | ㄏㄞ1
604 | ㄏㄞ2
605 | ㄏㄞ4
606 | ㄏㄟ1
607 | ㄏㄟ3
608 | ㄏㄠ1
609 | ㄏㄠ2
610 | ㄏㄠ3
611 | ㄏㄠ4
612 | ㄏㄡ1
613 | ㄏㄡ2
614 | ㄏㄡ3
615 | ㄏㄡ4
616 | ㄏㄢ1
617 | ㄏㄢ2
618 | ㄏㄢ3
619 | ㄏㄢ4
620 | ㄏㄣ2
621 | ㄏㄣ3
622 | ㄏㄤ1
623 | ㄏㄤ2
624 | ㄏㄤ3
625 | ㄏㄤ4
626 | ㄏㄥ1
627 | ㄏㄥ2
628 | ㄏㄥ4
629 | ㄏㄨ1
630 | ㄏㄨ2
631 | ㄏㄨ3
632 | ㄏㄨ4
633 | ㄏㄨㄚ1
634 | ㄏㄨㄚ2
635 | ㄏㄨㄚ3
636 | ㄏㄨㄚ4
637 | ㄏㄨㄛ1
638 | ㄏㄨㄛ2
639 | ㄏㄨㄛ3
640 | ㄏㄨㄛ4
641 | ㄏㄨㄛ5
642 | ㄏㄨㄞ2
643 | ㄏㄨㄞ4
644 | ㄏㄨㄟ1
645 | ㄏㄨㄟ2
646 | ㄏㄨㄟ3
647 | ㄏㄨㄟ4
648 | ㄏㄨㄢ1
649 | ㄏㄨㄢ2
650 | ㄏㄨㄢ3
651 | ㄏㄨㄢ4
652 | ㄏㄨㄣ1
653 | ㄏㄨㄣ2
654 | ㄏㄨㄣ3
655 | ㄏㄨㄣ4
656 | ㄏㄨㄤ1
657 | ㄏㄨㄤ2
658 | ㄏㄨㄤ3
659 | ㄏㄨㄤ4
660 | ㄏㄨㄤ5
661 | ㄏㄨㄥ1
662 | ㄏㄨㄥ2
663 | ㄏㄨㄥ3
664 | ㄏㄨㄥ4
665 | ㄐㄧ1
666 | ㄐㄧ2
667 | ㄐㄧ3
668 | ㄐㄧ4
669 | ㄐㄧㄚ1
670 | ㄐㄧㄚ2
671 | ㄐㄧㄚ3
672 | ㄐㄧㄚ4
673 | ㄐㄧㄚ5
674 | ㄐㄧㄝ1
675 | ㄐㄧㄝ2
676 | ㄐㄧㄝ3
677 | ㄐㄧㄝ4
678 | ㄐㄧㄝ5
679 | ㄐㄧㄠ1
680 | ㄐㄧㄠ2
681 | ㄐㄧㄠ3
682 | ㄐㄧㄠ4
683 | ㄐㄧㄡ1
684 | ㄐㄧㄡ3
685 | ㄐㄧㄡ4
686 | ㄐㄧㄡ5
687 | ㄐㄧㄢ1
688 | ㄐㄧㄢ3
689 | ㄐㄧㄢ4
690 | ㄐㄧㄣ1
691 | ㄐㄧㄣ3
692 | ㄐㄧㄣ4
693 | ㄐㄧㄤ1
694 | ㄐㄧㄤ3
695 | ㄐㄧㄤ4
696 | ㄐㄧㄥ1
697 | ㄐㄧㄥ3
698 | ㄐㄧㄥ4
699 | ㄐㄩ1
700 | ㄐㄩ2
701 | ㄐㄩ3
702 | ㄐㄩ4
703 | ㄐㄩㄝ1
704 | ㄐㄩㄝ2
705 | ㄐㄩㄝ3
706 | ㄐㄩㄝ4
707 | ㄐㄩㄢ1
708 | ㄐㄩㄢ3
709 | ㄐㄩㄢ4
710 | ㄐㄩㄣ1
711 | ㄐㄩㄣ3
712 | ㄐㄩㄣ4
713 | ㄐㄩㄥ1
714 | ㄐㄩㄥ3
715 | ㄑㄧ1
716 | ㄑㄧ2
717 | ㄑㄧ3
718 | ㄑㄧ4
719 | ㄑㄧㄚ1
720 | ㄑㄧㄚ2
721 | ㄑㄧㄚ3
722 | ㄑㄧㄚ4
723 | ㄑㄧㄝ1
724 | ㄑㄧㄝ2
725 | ㄑㄧㄝ3
726 | ㄑㄧㄝ4
727 | ㄑㄧㄠ1
728 | ㄑㄧㄠ2
729 | ㄑㄧㄠ3
730 | ㄑㄧㄠ4
731 | ㄑㄧㄡ1
732 | ㄑㄧㄡ2
733 | ㄑㄧㄡ3
734 | ㄑㄧㄢ1
735 | ㄑㄧㄢ2
736 | ㄑㄧㄢ3
737 | ㄑㄧㄢ4
738 | ㄑㄧㄣ1
739 | ㄑㄧㄣ2
740 | ㄑㄧㄣ3
741 | ㄑㄧㄣ4
742 | ㄑㄧㄤ1
743 | ㄑㄧㄤ2
744 | ㄑㄧㄤ3
745 | ㄑㄧㄤ4
746 | ㄑㄧㄥ1
747 | ㄑㄧㄥ2
748 | ㄑㄧㄥ3
749 | ㄑㄧㄥ4
750 | ㄑㄩ1
751 | ㄑㄩ2
752 | ㄑㄩ3
753 | ㄑㄩ4
754 | ㄑㄩㄝ1
755 | ㄑㄩㄝ4
756 | ㄑㄩㄢ1
757 | ㄑㄩㄢ2
758 | ㄑㄩㄢ3
759 | ㄑㄩㄢ4
760 | ㄑㄩㄣ1
761 | ㄑㄩㄣ2
762 | ㄑㄩㄥ1
763 | ㄑㄩㄥ2
764 | ㄑㄩㄥ3
765 | ㄒㄧ1
766 | ㄒㄧ2
767 | ㄒㄧ3
768 | ㄒㄧ4
769 | ㄒㄧ5
770 | ㄒㄧㄚ1
771 | ㄒㄧㄚ2
772 | ㄒㄧㄚ3
773 | ㄒㄧㄚ4
774 | ㄒㄧㄝ1
775 | ㄒㄧㄝ2
776 | ㄒㄧㄝ3
777 | ㄒㄧㄝ4
778 | ㄒㄧㄝ5
779 | ㄒㄧㄠ1
780 | ㄒㄧㄠ2
781 | ㄒㄧㄠ3
782 | ㄒㄧㄠ4
783 | ㄒㄧㄡ1
784 | ㄒㄧㄡ3
785 | ㄒㄧㄡ4
786 | ㄒㄧㄢ1
787 | ㄒㄧㄢ2
788 | ㄒㄧㄢ3
789 | ㄒㄧㄢ4
790 | ㄒㄧㄣ1
791 | ㄒㄧㄣ2
792 | ㄒㄧㄣ3
793 | ㄒㄧㄣ4
794 | ㄒㄧㄤ1
795 | ㄒㄧㄤ2
796 | ㄒㄧㄤ3
797 | ㄒㄧㄤ4
798 | ㄒㄧㄥ1
799 | ㄒㄧㄥ2
800 | ㄒㄧㄥ3
801 | ㄒㄧㄥ4
802 | ㄒㄧㄥ5
803 | ㄒㄩ1
804 | ㄒㄩ2
805 | ㄒㄩ3
806 | ㄒㄩ4
807 | ㄒㄩㄝ1
808 | ㄒㄩㄝ2
809 | ㄒㄩㄝ3
810 | ㄒㄩㄝ4
811 | ㄒㄩㄢ1
812 | ㄒㄩㄢ2
813 | ㄒㄩㄢ3
814 | ㄒㄩㄢ4
815 | ㄒㄩㄣ1
816 | ㄒㄩㄣ2
817 | ㄒㄩㄣ4
818 | ㄒㄩㄥ1
819 | ㄒㄩㄥ2
820 | ㄒㄩㄥ3
821 | ㄒㄩㄥ4
822 | ㄓ1
823 | ㄓ2
824 | ㄓ3
825 | ㄓ4
826 | ㄓㄚ1
827 | ㄓㄚ2
828 | ㄓㄚ3
829 | ㄓㄚ4
830 | ㄓㄜ1
831 | ㄓㄜ2
832 | ㄓㄜ3
833 | ㄓㄜ4
834 | ㄓㄜ5
835 | ㄓㄞ1
836 | ㄓㄞ2
837 | ㄓㄞ3
838 | ㄓㄞ4
839 | ㄓㄟ4
840 | ㄓㄠ1
841 | ㄓㄠ2
842 | ㄓㄠ3
843 | ㄓㄠ4
844 | ㄓㄡ1
845 | ㄓㄡ2
846 | ㄓㄡ3
847 | ㄓㄡ4
848 | ㄓㄢ1
849 | ㄓㄢ3
850 | ㄓㄢ4
851 | ㄓㄣ1
852 | ㄓㄣ3
853 | ㄓㄣ4
854 | ㄓㄤ1
855 | ㄓㄤ3
856 | ㄓㄤ4
857 | ㄓㄥ1
858 | ㄓㄥ3
859 | ㄓㄥ4
860 | ㄓㄨ1
861 | ㄓㄨ2
862 | ㄓㄨ3
863 | ㄓㄨ4
864 | ㄓㄨㄚ1
865 | ㄓㄨㄚ3
866 | ㄓㄨㄛ1
867 | ㄓㄨㄛ2
868 | ㄓㄨㄞ1
869 | ㄓㄨㄞ3
870 | ㄓㄨㄞ4
871 | ㄓㄨㄟ1
872 | ㄓㄨㄟ4
873 | ㄓㄨㄢ1
874 | ㄓㄨㄢ3
875 | ㄓㄨㄢ4
876 | ㄓㄨㄣ1
877 | ㄓㄨㄣ3
878 | ㄓㄨㄣ4
879 | ㄓㄨㄤ1
880 | ㄓㄨㄤ3
881 | ㄓㄨㄤ4
882 | ㄓㄨㄥ1
883 | ㄓㄨㄥ3
884 | ㄓㄨㄥ4
885 | ㄔ1
886 | ㄔ2
887 | ㄔ3
888 | ㄔ4
889 | ㄔㄚ1
890 | ㄔㄚ2
891 | ㄔㄚ3
892 | ㄔㄚ4
893 | ㄔㄜ1
894 | ㄔㄜ3
895 | ㄔㄜ4
896 | ㄔㄞ1
897 | ㄔㄞ2
898 | ㄔㄞ3
899 | ㄔㄞ4
900 | ㄔㄠ1
901 | ㄔㄠ2
902 | ㄔㄠ3
903 | ㄔㄠ4
904 | ㄔㄡ1
905 | ㄔㄡ2
906 | ㄔㄡ3
907 | ㄔㄡ4
908 | ㄔㄢ1
909 | ㄔㄢ2
910 | ㄔㄢ3
911 | ㄔㄢ4
912 | ㄔㄣ1
913 | ㄔㄣ2
914 | ㄔㄣ3
915 | ㄔㄣ4
916 | ㄔㄤ1
917 | ㄔㄤ2
918 | ㄔㄤ3
919 | ㄔㄤ4
920 | ㄔㄥ1
921 | ㄔㄥ2
922 | ㄔㄥ3
923 | ㄔㄥ4
924 | ㄔㄨ1
925 | ㄔㄨ2
926 | ㄔㄨ3
927 | ㄔㄨ4
928 | ㄔㄨㄚ1
929 | ㄔㄨㄚ3
930 | ㄔㄨㄛ4
931 | ㄔㄨㄞ1
932 | ㄔㄨㄞ3
933 | ㄔㄨㄞ4
934 | ㄔㄨㄟ1
935 | ㄔㄨㄟ2
936 | ㄔㄨㄟ4
937 | ㄔㄨㄢ1
938 | ㄔㄨㄢ2
939 | ㄔㄨㄢ3
940 | ㄔㄨㄢ4
941 | ㄔㄨㄣ1
942 | ㄔㄨㄣ2
943 | ㄔㄨㄣ3
944 | ㄔㄨㄤ1
945 | ㄔㄨㄤ2
946 | ㄔㄨㄤ3
947 | ㄔㄨㄤ4
948 | ㄔㄨㄥ1
949 | ㄔㄨㄥ2
950 | ㄔㄨㄥ4
951 | ㄕ1
952 | ㄕ2
953 | ㄕ3
954 | ㄕ4
955 | ㄕ5
956 | ㄕㄚ1
957 | ㄕㄚ3
958 | ㄕㄚ4
959 | ㄕㄜ1
960 | ㄕㄜ2
961 | ㄕㄜ3
962 | ㄕㄜ4
963 | ㄕㄞ3
964 | ㄕㄞ4
965 | ㄕㄟ2
966 | ㄕㄠ1
967 | ㄕㄠ2
968 | ㄕㄠ3
969 | ㄕㄠ4
970 | ㄕㄡ1
971 | ㄕㄡ2
972 | ㄕㄡ3
973 | ㄕㄡ4
974 | ㄕㄢ1
975 | ㄕㄢ3
976 | ㄕㄢ4
977 | ㄕㄣ1
978 | ㄕㄣ2
979 | ㄕㄣ3
980 | ㄕㄣ4
981 | ㄕㄣ5
982 | ㄕㄤ1
983 | ㄕㄤ3
984 | ㄕㄤ4
985 | ㄕㄤ5
986 | ㄕㄥ1
987 | ㄕㄥ2
988 | ㄕㄥ3
989 | ㄕㄥ4
990 | ㄕㄥ5
991 | ㄕㄨ1
992 | ㄕㄨ2
993 | ㄕㄨ3
994 | ㄕㄨ4
995 | ㄕㄨ5
996 | ㄕㄨㄚ1
997 | ㄕㄨㄛ1
998 | ㄕㄨㄛ4
999 | ㄕㄨㄞ1
1000 | ㄕㄨㄞ4
1001 | ㄕㄨㄟ2
1002 | ㄕㄨㄟ4
1003 | ㄕㄨㄢ4
1004 | ㄕㄨㄣ3
1005 | ㄕㄨㄣ4
1006 | ㄕㄨㄤ1
1007 | ㄕㄨㄤ3
1008 | ㄖ4
1009 | ㄖㄜ2
1010 | ㄖㄜ3
1011 | ㄖㄜ4
1012 | ㄖㄠ2
1013 | ㄖㄠ3
1014 | ㄖㄡ2
1015 | ㄖㄡ3
1016 | ㄖㄡ4
1017 | ㄖㄢ2
1018 | ㄖㄢ3
1019 | ㄖㄣ2
1020 | ㄖㄣ3
1021 | ㄖㄣ4
1022 | ㄖㄤ2
1023 | ㄖㄤ3
1024 | ㄖㄤ4
1025 | ㄖㄥ1
1026 | ㄖㄥ2
1027 | ㄖㄥ3
1028 | ㄖㄨ2
1029 | ㄖㄨ3
1030 | ㄖㄨ4
1031 | ㄖㄨㄛ2
1032 | ㄖㄨㄛ4
1033 | ㄖㄨㄟ2
1034 | ㄖㄨㄟ3
1035 | ㄖㄨㄟ4
1036 | ㄖㄨㄢ2
1037 | ㄖㄨㄢ3
1038 | ㄖㄨㄣ1
1039 | ㄖㄨㄣ2
1040 | ㄖㄨㄥ2
1041 | ㄖㄨㄥ3
1042 | ㄗ1
1043 | ㄗ3
1044 | ㄗ4
1045 | ㄗ5
1046 | ㄗㄚ1
1047 | ㄗㄚ2
1048 | ㄗㄜ2
1049 | ㄗㄜ3
1050 | ㄗㄜ4
1051 | ㄗㄞ1
1052 | ㄗㄞ3
1053 | ㄗㄞ4
1054 | ㄗㄟ2
1055 | ㄗㄠ1
1056 | ㄗㄠ2
1057 | ㄗㄠ3
1058 | ㄗㄠ4
1059 | ㄗㄡ1
1060 | ㄗㄡ3
1061 | ㄗㄡ4
1062 | ㄗㄢ1
1063 | ㄗㄢ2
1064 | ㄗㄢ3
1065 | ㄗㄢ4
1066 | ㄗㄣ1
1067 | ㄗㄣ3
1068 | ㄗㄤ1
1069 | ㄗㄤ3
1070 | ㄗㄤ4
1071 | ㄗㄥ1
1072 | ㄗㄥ4
1073 | ㄗㄨ2
1074 | ㄗㄨ3
1075 | ㄗㄨ4
1076 | ㄗㄨㄛ1
1077 | ㄗㄨㄛ2
1078 | ㄗㄨㄛ3
1079 | ㄗㄨㄛ4
1080 | ㄗㄨㄟ1
1081 | ㄗㄨㄟ3
1082 | ㄗㄨㄟ4
1083 | ㄗㄨㄢ1
1084 | ㄗㄨㄢ3
1085 | ㄗㄨㄢ4
1086 | ㄗㄨㄣ1
1087 | ㄗㄨㄣ3
1088 | ㄗㄨㄣ4
1089 | ㄗㄨㄥ1
1090 | ㄗㄨㄥ3
1091 | ㄗㄨㄥ4
1092 | ㄘ1
1093 | ㄘ2
1094 | ㄘ3
1095 | ㄘ4
1096 | ㄘㄚ1
1097 | ㄘㄜ4
1098 | ㄘㄞ1
1099 | ㄘㄞ3
1100 | ㄘㄞ4
1101 | ㄘㄠ1
1102 | ㄘㄠ3
1103 | ㄘㄠ4
1104 | ㄘㄡ4
1105 | ㄘㄢ1
1106 | ㄘㄢ2
1107 | ㄘㄢ3
1108 | ㄘㄢ4
1109 | ㄘㄣ1
1110 | ㄘㄣ2
1111 | ㄘㄤ1
1112 | ㄘㄤ2
1113 | ㄘㄤ3
1114 | ㄘㄥ2
1115 | ㄘㄨ1
1116 | ㄘㄨ2
1117 | ㄘㄨ4
1118 | ㄘㄨㄛ1
1119 | ㄘㄨㄛ2
1120 | ㄘㄨㄛ3
1121 | ㄘㄨㄛ4
1122 | ㄘㄨㄟ1
1123 | ㄘㄨㄟ3
1124 | ㄘㄨㄟ4
1125 | ㄘㄨㄢ1
1126 | ㄘㄨㄢ2
1127 | ㄘㄨㄢ4
1128 | ㄘㄨㄣ1
1129 | ㄘㄨㄣ2
1130 | ㄘㄨㄣ3
1131 | ㄘㄨㄣ4
1132 | ㄘㄨㄥ1
1133 | ㄘㄨㄥ2
1134 | ㄘㄨㄥ4
1135 | ㄙ1
1136 | ㄙ3
1137 | ㄙ4
1138 | ㄙ5
1139 | ㄙㄚ1
1140 | ㄙㄚ3
1141 | ㄙㄚ4
1142 | ㄙㄜ4
1143 | ㄙㄞ1
1144 | ㄙㄞ4
1145 | ㄙㄠ1
1146 | ㄙㄠ3
1147 | ㄙㄠ4
1148 | ㄙㄠ5
1149 | ㄙㄡ1
1150 | ㄙㄡ3
1151 | ㄙㄡ4
1152 | ㄙㄢ1
1153 | ㄙㄢ3
1154 | ㄙㄢ4
1155 | ㄙㄣ1
1156 | ㄙㄤ1
1157 | ㄙㄤ4
1158 | ㄙㄨ1
1159 | ㄙㄨ4
1160 | ㄙㄨㄛ1
1161 | ㄙㄨㄛ2
1162 | ㄙㄨㄛ3
1163 | ㄙㄨㄛ4
1164 | ㄙㄨㄟ1
1165 | ㄙㄨㄟ2
1166 | ㄙㄨㄟ3
1167 | ㄙㄨㄟ4
1168 | ㄙㄨㄢ3
1169 | ㄙㄨㄢ4
1170 | ㄙㄨㄣ1
1171 | ㄙㄨㄣ3
1172 | ㄙㄨㄣ4
1173 | ㄙㄨㄥ1
1174 | ㄙㄨㄥ2
1175 | ㄙㄨㄥ3
1176 | ㄙㄨㄥ4
1177 | ㄚ1
1178 | ㄚ2
1179 | ㄚ3
1180 | ㄚ4
1181 | ㄚ5
1182 | ㄛ1
1183 | ㄛ2
1184 | ㄛ3
1185 | ㄜ1
1186 | ㄜ2
1187 | ㄜ3
1188 | ㄜ4
1189 | ㄝ4
1190 | ㄞ1
1191 | ㄞ2
1192 | ㄞ3
1193 | ㄞ4
1194 | ㄟ4
1195 | ㄠ1
1196 | ㄠ2
1197 | ㄠ3
1198 | ㄠ4
1199 | ㄡ1
1200 | ㄡ2
1201 | ㄡ3
1202 | ㄡ4
1203 | ㄢ1
1204 | ㄢ2
1205 | ㄢ3
1206 | ㄢ4
1207 | ㄣ1
1208 | ㄣ3
1209 | ㄣ5
1210 | ㄤ1
1211 | ㄤ2
1212 | ㄤ3
1213 | ㄥ1
1214 | ㄦ1
1215 | ㄦ2
1216 | ㄦ3
1217 | ㄦ4
1218 | ㄧ1
1219 | ㄧ2
1220 | ㄧ3
1221 | ㄧ4
1222 | ㄧㄚ1
1223 | ㄧㄚ2
1224 | ㄧㄚ3
1225 | ㄧㄚ4
1226 | ㄧㄚ5
1227 | ㄧㄝ1
1228 | ㄧㄝ2
1229 | ㄧㄝ4
1230 | ㄧㄝ5
1231 | ㄧㄞ2
1232 | ㄧㄠ1
1233 | ㄧㄠ2
1234 | ㄧㄠ3
1235 | ㄧㄠ4
1236 | ㄧㄡ1
1237 | ㄧㄡ2
1238 | ㄧㄡ3
1239 | ㄧㄡ4
1240 | ㄧㄢ1
1241 | ㄧㄢ2
1242 | ㄧㄢ3
1243 | ㄧㄢ4
1244 | ㄧㄣ1
1245 | ㄧㄣ2
1246 | ㄧㄣ3
1247 | ㄧㄣ4
1248 | ㄧㄤ1
1249 | ㄧㄤ2
1250 | ㄧㄤ3
1251 | ㄧㄤ4
1252 | ㄧㄥ1
1253 | ㄧㄥ2
1254 | ㄧㄥ3
1255 | ㄧㄥ4
1256 | ㄨ1
1257 | ㄨ2
1258 | ㄨ3
1259 | ㄨ4
1260 | ㄨㄚ1
1261 | ㄨㄚ2
1262 | ㄨㄚ3
1263 | ㄨㄚ4
1264 | ㄨㄚ5
1265 | ㄨㄛ1
1266 | ㄨㄛ3
1267 | ㄨㄛ4
1268 | ㄨㄞ1
1269 | ㄨㄞ3
1270 | ㄨㄟ1
1271 | ㄨㄟ2
1272 | ㄨㄟ3
1273 | ㄨㄟ4
1274 | ㄨㄢ1
1275 | ㄨㄢ2
1276 | ㄨㄢ3
1277 | ㄨㄢ4
1278 | ㄨㄣ2
1279 | ㄨㄣ3
1280 | ㄨㄣ4
1281 | ㄨㄤ2
1282 | ㄨㄤ3
1283 | ㄨㄤ4
1284 | ㄨㄥ1
1285 | ㄨㄥ3
1286 | ㄩ1
1287 | ㄩ2
1288 | ㄩ3
1289 | ㄩ4
1290 | ㄩ5
1291 | ㄩㄝ1
1292 | ㄩㄝ4
1293 | ㄩㄢ1
1294 | ㄩㄢ2
1295 | ㄩㄢ3
1296 | ㄩㄢ4
1297 | ㄩㄣ1
1298 | ㄩㄣ2
1299 | ㄩㄣ3
1300 | ㄩㄣ4
1301 | ㄩㄤ4
1302 | ㄩㄥ1
1303 | ㄩㄥ2
1304 | ㄩㄥ3
1305 | ㄩㄥ4
--------------------------------------------------------------------------------
/resource/g2pw/bert-base-chinese_s2t_dict.txt:
--------------------------------------------------------------------------------
1 | 万 萬
2 | 与 與
3 | 专 專
4 | 业 業
5 | 丛 叢
6 | 东 東
7 | 丝 絲
8 | 丢 丟
9 | 两 兩
10 | 严 嚴
11 | 丧 喪
12 | 个 個
13 | 丰 豐
14 | 临 臨
15 | 为 為
16 | 丽 麗
17 | 举 舉
18 | 么 麼
19 | 义 義
20 | 乌 烏
21 | 乐 樂
22 | 乔 喬
23 | 习 習
24 | 乡 鄉
25 | 书 書
26 | 买 買
27 | 乱 亂
28 | 争 爭
29 | 亏 虧
30 | 云 雲
31 | 亘 亙
32 | 亚 亞
33 | 产 產
34 | 亩 畝
35 | 亲 親
36 | 亵 褻
37 | 亿 億
38 | 仅 僅
39 | 仆 僕
40 | 从 從
41 | 仑 侖
42 | 仓 倉
43 | 仪 儀
44 | 们 們
45 | 价 價
46 | 众 眾
47 | 优 優
48 | 会 會
49 | 伞 傘
50 | 伟 偉
51 | 传 傳
52 | 伤 傷
53 | 伦 倫
54 | 伪 偽
55 | 伫 佇
56 | 体 體
57 | 佥 僉
58 | 侠 俠
59 | 侣 侶
60 | 侥 僥
61 | 侦 偵
62 | 侧 側
63 | 侨 僑
64 | 侬 儂
65 | 俨 儼
66 | 俩 倆
67 | 俪 儷
68 | 俭 儉
69 | 债 債
70 | 倾 傾
71 | 偻 僂
72 | 偿 償
73 | 傥 儻
74 | 储 儲
75 | 傩 儺
76 | 儿 兒
77 | 兑 兌
78 | 兖 兗
79 | 党 黨
80 | 兰 蘭
81 | 关 關
82 | 兴 興
83 | 兹 茲
84 | 养 養
85 | 兽 獸
86 | 内 內
87 | 冈 岡
88 | 册 冊
89 | 写 寫
90 | 军 軍
91 | 农 農
92 | 冯 馮
93 | 冲 衝
94 | 决 決
95 | 况 況
96 | 冻 凍
97 | 净 淨
98 | 凄 悽
99 | 准 準
100 | 凉 涼
101 | 减 減
102 | 凑 湊
103 | 凛 凜
104 | 几 幾
105 | 凤 鳳
106 | 凭 憑
107 | 凯 凱
108 | 击 擊
109 | 凿 鑿
110 | 刍 芻
111 | 划 劃
112 | 刘 劉
113 | 则 則
114 | 刚 剛
115 | 创 創
116 | 删 刪
117 | 别 別
118 | 刹 剎
119 | 刽 劊
120 | 剂 劑
121 | 剐 剮
122 | 剑 劍
123 | 剥 剝
124 | 剧 劇
125 | 劝 勸
126 | 办 辦
127 | 务 務
128 | 动 動
129 | 励 勵
130 | 劲 勁
131 | 劳 勞
132 | 势 勢
133 | 勋 勳
134 | 匀 勻
135 | 匮 匱
136 | 区 區
137 | 医 醫
138 | 华 華
139 | 协 協
140 | 单 單
141 | 卖 賣
142 | 卢 盧
143 | 卤 滷
144 | 卧 臥
145 | 卫 衛
146 | 却 卻
147 | 厂 廠
148 | 厅 廳
149 | 历 歷
150 | 厉 厲
151 | 压 壓
152 | 厌 厭
153 | 厕 廁
154 | 厘 釐
155 | 厢 廂
156 | 厦 廈
157 | 厨 廚
158 | 厩 廄
159 | 厮 廝
160 | 县 縣
161 | 叁 叄
162 | 参 參
163 | 双 雙
164 | 发 發
165 | 变 變
166 | 叙 敘
167 | 叠 疊
168 | 叶 葉
169 | 号 號
170 | 叹 嘆
171 | 叽 嘰
172 | 吁 籲
173 | 后 後
174 | 吓 嚇
175 | 吕 呂
176 | 吗 嗎
177 | 吨 噸
178 | 听 聽
179 | 启 啟
180 | 吴 吳
181 | 呐 吶
182 | 呓 囈
183 | 呕 嘔
184 | 呗 唄
185 | 员 員
186 | 呛 嗆
187 | 呜 嗚
188 | 咏 詠
189 | 咙 嚨
190 | 咛 嚀
191 | 咤 吒
192 | 响 響
193 | 哑 啞
194 | 哒 噠
195 | 哔 嗶
196 | 哗 譁
197 | 哟 喲
198 | 唠 嘮
199 | 唤 喚
200 | 啓 啟
201 | 啧 嘖
202 | 啬 嗇
203 | 啮 齧
204 | 啰 囉
205 | 啸 嘯
206 | 喫 吃
207 | 喷 噴
208 | 喽 嘍
209 | 嗳 噯
210 | 嘘 噓
211 | 嘤 嚶
212 | 嘱 囑
213 | 噜 嚕
214 | 嚣 囂
215 | 团 團
216 | 园 園
217 | 囱 囪
218 | 围 圍
219 | 国 國
220 | 图 圖
221 | 圆 圓
222 | 圣 聖
223 | 场 場
224 | 坏 壞
225 | 块 塊
226 | 坚 堅
227 | 坛 壇
228 | 坝 壩
229 | 坞 塢
230 | 坟 墳
231 | 坠 墜
232 | 垄 壟
233 | 垒 壘
234 | 垦 墾
235 | 垩 堊
236 | 垫 墊
237 | 垭 埡
238 | 堑 塹
239 | 堕 墮
240 | 墙 牆
241 | 壮 壯
242 | 声 聲
243 | 壳 殼
244 | 壶 壺
245 | 处 處
246 | 备 備
247 | 复 復
248 | 够 夠
249 | 头 頭
250 | 夹 夾
251 | 夺 奪
252 | 奂 奐
253 | 奋 奮
254 | 奖 獎
255 | 奥 奧
256 | 妆 妝
257 | 妇 婦
258 | 妈 媽
259 | 妩 嫵
260 | 妪 嫗
261 | 姗 姍
262 | 姹 奼
263 | 娄 婁
264 | 娅 婭
265 | 娆 嬈
266 | 娇 嬌
267 | 娱 娛
268 | 娲 媧
269 | 娴 嫻
270 | 婴 嬰
271 | 婵 嬋
272 | 婶 嬸
273 | 嫔 嬪
274 | 嬷 嬤
275 | 孙 孫
276 | 学 學
277 | 孪 孿
278 | 宁 寧
279 | 宝 寶
280 | 实 實
281 | 宠 寵
282 | 审 審
283 | 宪 憲
284 | 宫 宮
285 | 宽 寬
286 | 宾 賓
287 | 寝 寢
288 | 对 對
289 | 寻 尋
290 | 导 導
291 | 寿 壽
292 | 将 將
293 | 尔 爾
294 | 尘 塵
295 | 尝 嘗
296 | 尧 堯
297 | 尴 尷
298 | 尸 屍
299 | 尽 盡
300 | 层 層
301 | 屉 屜
302 | 届 屆
303 | 属 屬
304 | 屡 屢
305 | 屿 嶼
306 | 岁 歲
307 | 岂 豈
308 | 岖 嶇
309 | 岗 崗
310 | 岘 峴
311 | 岚 嵐
312 | 岛 島
313 | 峡 峽
314 | 峤 嶠
315 | 峥 崢
316 | 峦 巒
317 | 崂 嶗
318 | 崭 嶄
319 | 嵘 嶸
320 | 巅 巔
321 | 巩 鞏
322 | 币 幣
323 | 帅 帥
324 | 师 師
325 | 帐 帳
326 | 帘 簾
327 | 帜 幟
328 | 带 帶
329 | 帧 幀
330 | 帮 幫
331 | 帼 幗
332 | 幂 冪
333 | 并 並
334 | 幺 么
335 | 广 廣
336 | 庄 莊
337 | 庆 慶
338 | 庐 廬
339 | 库 庫
340 | 应 應
341 | 庙 廟
342 | 庞 龐
343 | 废 廢
344 | 开 開
345 | 异 異
346 | 弃 棄
347 | 弑 弒
348 | 张 張
349 | 弥 彌
350 | 弯 彎
351 | 弹 彈
352 | 强 強
353 | 归 歸
354 | 当 當
355 | 录 錄
356 | 彦 彥
357 | 彻 徹
358 | 征 徵
359 | 径 徑
360 | 徕 徠
361 | 忆 憶
362 | 忏 懺
363 | 忧 憂
364 | 怀 懷
365 | 态 態
366 | 怂 慫
367 | 怅 悵
368 | 怆 愴
369 | 总 總
370 | 怼 懟
371 | 恋 戀
372 | 恒 恆
373 | 恳 懇
374 | 恶 惡
375 | 恸 慟
376 | 恺 愷
377 | 恻 惻
378 | 恼 惱
379 | 悦 悅
380 | 悬 懸
381 | 悯 憫
382 | 惊 驚
383 | 惧 懼
384 | 惨 慘
385 | 惩 懲
386 | 惫 憊
387 | 惬 愜
388 | 惭 慚
389 | 惮 憚
390 | 惯 慣
391 | 愤 憤
392 | 愿 願
393 | 慑 懾
394 | 懑 懣
395 | 懒 懶
396 | 戏 戲
397 | 战 戰
398 | 戬 戩
399 | 户 戶
400 | 扑 撲
401 | 托 託
402 | 执 執
403 | 扩 擴
404 | 扪 捫
405 | 扫 掃
406 | 扬 揚
407 | 扰 擾
408 | 抚 撫
409 | 抛 拋
410 | 抟 摶
411 | 抠 摳
412 | 抡 掄
413 | 抢 搶
414 | 护 護
415 | 报 報
416 | 担 擔
417 | 拟 擬
418 | 拢 攏
419 | 拣 揀
420 | 拥 擁
421 | 拦 攔
422 | 拧 擰
423 | 拨 撥
424 | 择 擇
425 | 挂 掛
426 | 挚 摯
427 | 挛 攣
428 | 挝 撾
429 | 挞 撻
430 | 挟 挾
431 | 挠 撓
432 | 挡 擋
433 | 挣 掙
434 | 挤 擠
435 | 挥 揮
436 | 捞 撈
437 | 损 損
438 | 捡 撿
439 | 换 換
440 | 捣 搗
441 | 据 據
442 | 掳 擄
443 | 掴 摑
444 | 掷 擲
445 | 掸 撣
446 | 掺 摻
447 | 揽 攬
448 | 搀 攙
449 | 搁 擱
450 | 搂 摟
451 | 搅 攪
452 | 携 攜
453 | 摄 攝
454 | 摆 擺
455 | 摇 搖
456 | 摈 擯
457 | 摊 攤
458 | 撑 撐
459 | 撵 攆
460 | 撷 擷
461 | 撸 擼
462 | 擞 擻
463 | 擡 抬
464 | 攒 攢
465 | 敌 敵
466 | 敛 斂
467 | 数 數
468 | 斋 齋
469 | 斓 斕
470 | 斩 斬
471 | 断 斷
472 | 无 無
473 | 旧 舊
474 | 时 時
475 | 旷 曠
476 | 昙 曇
477 | 昵 暱
478 | 昼 晝
479 | 显 顯
480 | 晋 晉
481 | 晒 曬
482 | 晓 曉
483 | 晔 曄
484 | 晕 暈
485 | 晖 暉
486 | 暂 暫
487 | 暧 曖
488 | 术 術
489 | 朴 樸
490 | 机 機
491 | 杀 殺
492 | 杂 雜
493 | 权 權
494 | 杠 槓
495 | 条 條
496 | 来 來
497 | 杨 楊
498 | 杰 傑
499 | 极 極
500 | 构 構
501 | 枢 樞
502 | 枣 棗
503 | 枪 槍
504 | 枫 楓
505 | 枭 梟
506 | 柜 櫃
507 | 柠 檸
508 | 栀 梔
509 | 栅 柵
510 | 标 標
511 | 栈 棧
512 | 栉 櫛
513 | 栋 棟
514 | 栎 櫟
515 | 栏 欄
516 | 树 樹
517 | 栖 棲
518 | 样 樣
519 | 栾 欒
520 | 桠 椏
521 | 桡 橈
522 | 桢 楨
523 | 档 檔
524 | 桥 橋
525 | 桦 樺
526 | 桧 檜
527 | 桨 槳
528 | 桩 樁
529 | 梦 夢
530 | 检 檢
531 | 棂 欞
532 | 棱 稜
533 | 椁 槨
534 | 椭 橢
535 | 楼 樓
536 | 榄 欖
537 | 榈 櫚
538 | 榉 櫸
539 | 槛 檻
540 | 槟 檳
541 | 横 橫
542 | 樯 檣
543 | 樱 櫻
544 | 橱 櫥
545 | 橹 櫓
546 | 橼 櫞
547 | 檐 簷
548 | 欢 歡
549 | 欧 歐
550 | 歼 殲
551 | 殁 歿
552 | 殇 殤
553 | 残 殘
554 | 殒 殞
555 | 殓 殮
556 | 殡 殯
557 | 殴 毆
558 | 毁 毀
559 | 毂 轂
560 | 毕 畢
561 | 毙 斃
562 | 毡 氈
563 | 气 氣
564 | 氢 氫
565 | 氲 氳
566 | 汇 匯
567 | 汉 漢
568 | 污 汙
569 | 汤 湯
570 | 汹 洶
571 | 沟 溝
572 | 没 沒
573 | 沣 灃
574 | 沥 瀝
575 | 沦 淪
576 | 沧 滄
577 | 沪 滬
578 | 泄 洩
579 | 泞 濘
580 | 泪 淚
581 | 泷 瀧
582 | 泸 瀘
583 | 泻 瀉
584 | 泼 潑
585 | 泽 澤
586 | 泾 涇
587 | 洁 潔
588 | 洒 灑
589 | 洼 窪
590 | 浃 浹
591 | 浅 淺
592 | 浆 漿
593 | 浇 澆
594 | 浊 濁
595 | 测 測
596 | 济 濟
597 | 浏 瀏
598 | 浑 渾
599 | 浒 滸
600 | 浓 濃
601 | 浔 潯
602 | 涂 塗
603 | 涌 湧
604 | 涛 濤
605 | 涝 澇
606 | 涞 淶
607 | 涟 漣
608 | 涠 潿
609 | 涡 渦
610 | 涣 渙
611 | 涤 滌
612 | 润 潤
613 | 涧 澗
614 | 涨 漲
615 | 涩 澀
616 | 淀 澱
617 | 渊 淵
618 | 渍 漬
619 | 渎 瀆
620 | 渐 漸
621 | 渔 漁
622 | 渗 滲
623 | 温 溫
624 | 湾 灣
625 | 湿 溼
626 | 溃 潰
627 | 溅 濺
628 | 滚 滾
629 | 滞 滯
630 | 滟 灩
631 | 满 滿
632 | 滢 瀅
633 | 滤 濾
634 | 滥 濫
635 | 滦 灤
636 | 滨 濱
637 | 滩 灘
638 | 潆 瀠
639 | 潇 瀟
640 | 潋 瀲
641 | 潍 濰
642 | 潜 潛
643 | 潴 瀦
644 | 澜 瀾
645 | 濑 瀨
646 | 濒 瀕
647 | 灏 灝
648 | 灭 滅
649 | 灯 燈
650 | 灵 靈
651 | 灾 災
652 | 灿 燦
653 | 炀 煬
654 | 炉 爐
655 | 炖 燉
656 | 炜 煒
657 | 点 點
658 | 炼 煉
659 | 炽 熾
660 | 烁 爍
661 | 烂 爛
662 | 烃 烴
663 | 烛 燭
664 | 烟 煙
665 | 烦 煩
666 | 烧 燒
667 | 烨 燁
668 | 烩 燴
669 | 烫 燙
670 | 烬 燼
671 | 热 熱
672 | 焕 煥
673 | 焖 燜
674 | 焘 燾
675 | 熏 燻
676 | 爱 愛
677 | 爲 為
678 | 爷 爺
679 | 牍 牘
680 | 牦 犛
681 | 牵 牽
682 | 牺 犧
683 | 犊 犢
684 | 状 狀
685 | 犷 獷
686 | 犸 獁
687 | 犹 猶
688 | 狈 狽
689 | 狞 獰
690 | 独 獨
691 | 狭 狹
692 | 狮 獅
693 | 狰 猙
694 | 狱 獄
695 | 猎 獵
696 | 猕 獼
697 | 猪 豬
698 | 猫 貓
699 | 猬 蝟
700 | 献 獻
701 | 獭 獺
702 | 玑 璣
703 | 玛 瑪
704 | 玮 瑋
705 | 环 環
706 | 现 現
707 | 玺 璽
708 | 珐 琺
709 | 珑 瓏
710 | 珲 琿
711 | 琏 璉
712 | 琐 瑣
713 | 琼 瓊
714 | 瑶 瑤
715 | 璎 瓔
716 | 瓒 瓚
717 | 瓮 甕
718 | 瓯 甌
719 | 电 電
720 | 画 畫
721 | 畅 暢
722 | 畴 疇
723 | 疖 癤
724 | 疗 療
725 | 疟 瘧
726 | 疡 瘍
727 | 疮 瘡
728 | 疯 瘋
729 | 痈 癰
730 | 痉 痙
731 | 痒 癢
732 | 痨 癆
733 | 痪 瘓
734 | 痫 癇
735 | 痹 痺
736 | 瘘 瘻
737 | 瘪 癟
738 | 瘫 癱
739 | 瘾 癮
740 | 癞 癩
741 | 癡 痴
742 | 癣 癬
743 | 癫 癲
744 | 皑 皚
745 | 皱 皺
746 | 盏 盞
747 | 盐 鹽
748 | 监 監
749 | 盖 蓋
750 | 盗 盜
751 | 盘 盤
752 | 眦 眥
753 | 着 著
754 | 睁 睜
755 | 睐 睞
756 | 睑 瞼
757 | 睾 睪
758 | 瞒 瞞
759 | 瞩 矚
760 | 矫 矯
761 | 矶 磯
762 | 矾 礬
763 | 矿 礦
764 | 码 碼
765 | 砖 磚
766 | 砗 硨
767 | 砚 硯
768 | 砺 礪
769 | 砾 礫
770 | 础 礎
771 | 硕 碩
772 | 确 確
773 | 碍 礙
774 | 碛 磧
775 | 碱 鹼
776 | 礼 禮
777 | 祎 禕
778 | 祕 秘
779 | 祢 禰
780 | 祯 禎
781 | 祷 禱
782 | 祸 禍
783 | 禀 稟
784 | 禄 祿
785 | 禅 禪
786 | 离 離
787 | 秃 禿
788 | 秆 稈
789 | 种 種
790 | 积 積
791 | 称 稱
792 | 秽 穢
793 | 税 稅
794 | 稣 穌
795 | 稳 穩
796 | 穷 窮
797 | 窃 竊
798 | 窍 竅
799 | 窑 窯
800 | 窜 竄
801 | 窝 窩
802 | 窥 窺
803 | 窦 竇
804 | 竖 豎
805 | 竞 競
806 | 笃 篤
807 | 笋 筍
808 | 笔 筆
809 | 笺 箋
810 | 笼 籠
811 | 筑 築
812 | 筛 篩
813 | 筝 箏
814 | 筹 籌
815 | 签 籤
816 | 简 簡
817 | 箩 籮
818 | 箫 簫
819 | 篑 簣
820 | 篓 簍
821 | 篮 籃
822 | 篱 籬
823 | 籁 籟
824 | 类 類
825 | 籼 秈
826 | 粤 粵
827 | 粪 糞
828 | 粮 糧
829 | 糍 餈
830 | 紧 緊
831 | 纔 才
832 | 纠 糾
833 | 红 紅
834 | 纣 紂
835 | 纤 纖
836 | 约 約
837 | 级 級
838 | 纨 紈
839 | 纪 紀
840 | 纫 紉
841 | 纬 緯
842 | 纭 紜
843 | 纯 純
844 | 纰 紕
845 | 纱 紗
846 | 纲 綱
847 | 纳 納
848 | 纵 縱
849 | 纶 綸
850 | 纷 紛
851 | 纸 紙
852 | 纹 紋
853 | 纺 紡
854 | 纽 紐
855 | 纾 紓
856 | 线 線
857 | 绀 紺
858 | 练 練
859 | 组 組
860 | 绅 紳
861 | 细 細
862 | 织 織
863 | 终 終
864 | 绊 絆
865 | 绍 紹
866 | 绎 繹
867 | 经 經
868 | 绑 綁
869 | 绒 絨
870 | 结 結
871 | 绔 絝
872 | 绕 繞
873 | 绘 繪
874 | 给 給
875 | 绚 絢
876 | 绛 絳
877 | 络 絡
878 | 绝 絕
879 | 绞 絞
880 | 统 統
881 | 绡 綃
882 | 绢 絹
883 | 绣 繡
884 | 绥 綏
885 | 绦 絛
886 | 继 繼
887 | 绩 績
888 | 绪 緒
889 | 绫 綾
890 | 续 續
891 | 绮 綺
892 | 绯 緋
893 | 绰 綽
894 | 绳 繩
895 | 维 維
896 | 绵 綿
897 | 绶 綬
898 | 绷 繃
899 | 绸 綢
900 | 绻 綣
901 | 综 綜
902 | 绽 綻
903 | 绾 綰
904 | 绿 綠
905 | 缀 綴
906 | 缄 緘
907 | 缅 緬
908 | 缆 纜
909 | 缇 緹
910 | 缈 緲
911 | 缉 緝
912 | 缎 緞
913 | 缓 緩
914 | 缔 締
915 | 缕 縷
916 | 编 編
917 | 缘 緣
918 | 缙 縉
919 | 缚 縛
920 | 缜 縝
921 | 缝 縫
922 | 缠 纏
923 | 缢 縊
924 | 缤 繽
925 | 缥 縹
926 | 缨 纓
927 | 缩 縮
928 | 缪 繆
929 | 缭 繚
930 | 缮 繕
931 | 缰 韁
932 | 缱 繾
933 | 缴 繳
934 | 罂 罌
935 | 网 網
936 | 罗 羅
937 | 罚 罰
938 | 罢 罷
939 | 羁 羈
940 | 羟 羥
941 | 羡 羨
942 | 翘 翹
943 | 耸 聳
944 | 耻 恥
945 | 聂 聶
946 | 聋 聾
947 | 职 職
948 | 联 聯
949 | 聪 聰
950 | 肃 肅
951 | 肠 腸
952 | 肤 膚
953 | 肮 骯
954 | 肴 餚
955 | 肾 腎
956 | 肿 腫
957 | 胀 脹
958 | 胁 脅
959 | 胆 膽
960 | 胜 勝
961 | 胧 朧
962 | 胫 脛
963 | 胶 膠
964 | 脉 脈
965 | 脍 膾
966 | 脏 髒
967 | 脐 臍
968 | 脑 腦
969 | 脓 膿
970 | 脚 腳
971 | 脣 唇
972 | 脱 脫
973 | 脸 臉
974 | 腊 臘
975 | 腌 醃
976 | 腭 顎
977 | 腻 膩
978 | 腼 靦
979 | 腾 騰
980 | 膑 臏
981 | 膻 羶
982 | 舆 輿
983 | 舰 艦
984 | 舱 艙
985 | 艰 艱
986 | 艳 豔
987 | 艺 藝
988 | 节 節
989 | 芈 羋
990 | 芜 蕪
991 | 芦 蘆
992 | 苁 蓯
993 | 苇 葦
994 | 苋 莧
995 | 苍 蒼
996 | 苏 蘇
997 | 苹 蘋
998 | 范 範
999 | 茎 莖
1000 | 茏 蘢
1001 | 茧 繭
1002 | 荆 荊
1003 | 荐 薦
1004 | 荚 莢
1005 | 荞 蕎
1006 | 荟 薈
1007 | 荠 薺
1008 | 荡 蕩
1009 | 荣 榮
1010 | 荤 葷
1011 | 荥 滎
1012 | 荧 熒
1013 | 荨 蕁
1014 | 荪 蓀
1015 | 荫 蔭
1016 | 药 藥
1017 | 莅 蒞
1018 | 莱 萊
1019 | 莲 蓮
1020 | 莴 萵
1021 | 获 獲
1022 | 莹 瑩
1023 | 莺 鶯
1024 | 萝 蘿
1025 | 萤 螢
1026 | 营 營
1027 | 萦 縈
1028 | 萧 蕭
1029 | 萨 薩
1030 | 葱 蔥
1031 | 蒋 蔣
1032 | 蓝 藍
1033 | 蓟 薊
1034 | 蓦 驀
1035 | 蔷 薔
1036 | 蔺 藺
1037 | 蔼 藹
1038 | 蕲 蘄
1039 | 蕴 蘊
1040 | 藓 蘚
1041 | 虏 虜
1042 | 虑 慮
1043 | 虚 虛
1044 | 虫 蟲
1045 | 虬 虯
1046 | 虱 蝨
1047 | 虽 雖
1048 | 虾 蝦
1049 | 蚀 蝕
1050 | 蚁 蟻
1051 | 蚂 螞
1052 | 蚕 蠶
1053 | 蚝 蠔
1054 | 蛊 蠱
1055 | 蛎 蠣
1056 | 蛮 蠻
1057 | 蛰 蟄
1058 | 蛳 螄
1059 | 蜕 蛻
1060 | 蜗 蝸
1061 | 蜡 蠟
1062 | 蝇 蠅
1063 | 蝈 蟈
1064 | 蝉 蟬
1065 | 蝎 蠍
1066 | 蝼 螻
1067 | 螨 蟎
1068 | 衅 釁
1069 | 衆 眾
1070 | 衔 銜
1071 | 补 補
1072 | 衬 襯
1073 | 衮 袞
1074 | 袄 襖
1075 | 袅 嫋
1076 | 袜 襪
1077 | 袭 襲
1078 | 装 裝
1079 | 裆 襠
1080 | 裤 褲
1081 | 见 見
1082 | 观 觀
1083 | 规 規
1084 | 觅 覓
1085 | 视 視
1086 | 览 覽
1087 | 觉 覺
1088 | 觊 覬
1089 | 觎 覦
1090 | 觐 覲
1091 | 觑 覷
1092 | 觞 觴
1093 | 触 觸
1094 | 誉 譽
1095 | 计 計
1096 | 订 訂
1097 | 认 認
1098 | 讥 譏
1099 | 讧 訌
1100 | 讨 討
1101 | 让 讓
1102 | 讪 訕
1103 | 讫 訖
1104 | 训 訓
1105 | 议 議
1106 | 讯 訊
1107 | 记 記
1108 | 讲 講
1109 | 讳 諱
1110 | 讴 謳
1111 | 讶 訝
1112 | 讷 訥
1113 | 许 許
1114 | 讹 訛
1115 | 论 論
1116 | 讼 訟
1117 | 讽 諷
1118 | 设 設
1119 | 访 訪
1120 | 诀 訣
1121 | 证 證
1122 | 诃 訶
1123 | 评 評
1124 | 诅 詛
1125 | 识 識
1126 | 诈 詐
1127 | 诉 訴
1128 | 诊 診
1129 | 诋 詆
1130 | 词 詞
1131 | 诏 詔
1132 | 译 譯
1133 | 试 試
1134 | 诗 詩
1135 | 诘 詰
1136 | 诙 詼
1137 | 诚 誠
1138 | 诛 誅
1139 | 话 話
1140 | 诞 誕
1141 | 诟 詬
1142 | 诠 詮
1143 | 诡 詭
1144 | 询 詢
1145 | 诣 詣
1146 | 诤 諍
1147 | 该 該
1148 | 详 詳
1149 | 诧 詫
1150 | 诩 詡
1151 | 诫 誡
1152 | 诬 誣
1153 | 语 語
1154 | 误 誤
1155 | 诰 誥
1156 | 诱 誘
1157 | 诲 誨
1158 | 说 說
1159 | 诵 誦
1160 | 诶 誒
1161 | 请 請
1162 | 诸 諸
1163 | 诺 諾
1164 | 读 讀
1165 | 诽 誹
1166 | 课 課
1167 | 诿 諉
1168 | 谀 諛
1169 | 谁 誰
1170 | 调 調
1171 | 谄 諂
1172 | 谅 諒
1173 | 谆 諄
1174 | 谈 談
1175 | 谊 誼
1176 | 谋 謀
1177 | 谌 諶
1178 | 谍 諜
1179 | 谎 謊
1180 | 谏 諫
1181 | 谐 諧
1182 | 谑 謔
1183 | 谒 謁
1184 | 谓 謂
1185 | 谔 諤
1186 | 谕 諭
1187 | 谗 讒
1188 | 谘 諮
1189 | 谙 諳
1190 | 谚 諺
1191 | 谛 諦
1192 | 谜 謎
1193 | 谟 謨
1194 | 谢 謝
1195 | 谣 謠
1196 | 谤 謗
1197 | 谥 諡
1198 | 谦 謙
1199 | 谧 謐
1200 | 谨 謹
1201 | 谩 謾
1202 | 谪 謫
1203 | 谬 謬
1204 | 谭 譚
1205 | 谯 譙
1206 | 谱 譜
1207 | 谲 譎
1208 | 谴 譴
1209 | 谶 讖
1210 | 贝 貝
1211 | 贞 貞
1212 | 负 負
1213 | 贡 貢
1214 | 财 財
1215 | 责 責
1216 | 贤 賢
1217 | 败 敗
1218 | 账 賬
1219 | 货 貨
1220 | 质 質
1221 | 贩 販
1222 | 贪 貪
1223 | 贫 貧
1224 | 贬 貶
1225 | 购 購
1226 | 贮 貯
1227 | 贯 貫
1228 | 贰 貳
1229 | 贱 賤
1230 | 贲 賁
1231 | 贴 貼
1232 | 贵 貴
1233 | 贷 貸
1234 | 贸 貿
1235 | 费 費
1236 | 贺 賀
1237 | 贻 貽
1238 | 贼 賊
1239 | 贾 賈
1240 | 贿 賄
1241 | 赁 賃
1242 | 赂 賂
1243 | 赃 贓
1244 | 资 資
1245 | 赅 賅
1246 | 赈 賑
1247 | 赊 賒
1248 | 赋 賦
1249 | 赌 賭
1250 | 赎 贖
1251 | 赏 賞
1252 | 赐 賜
1253 | 赓 賡
1254 | 赔 賠
1255 | 赖 賴
1256 | 赘 贅
1257 | 赚 賺
1258 | 赛 賽
1259 | 赝 贗
1260 | 赞 贊
1261 | 赠 贈
1262 | 赡 贍
1263 | 赢 贏
1264 | 赣 贛
1265 | 赵 趙
1266 | 赶 趕
1267 | 趋 趨
1268 | 趸 躉
1269 | 跃 躍
1270 | 跄 蹌
1271 | 跖 蹠
1272 | 践 踐
1273 | 跷 蹺
1274 | 跹 躚
1275 | 跻 躋
1276 | 踊 踴
1277 | 踌 躊
1278 | 蹑 躡
1279 | 蹒 蹣
1280 | 蹿 躥
1281 | 躏 躪
1282 | 躯 軀
1283 | 车 車
1284 | 轧 軋
1285 | 轨 軌
1286 | 轩 軒
1287 | 转 轉
1288 | 轭 軛
1289 | 轮 輪
1290 | 软 軟
1291 | 轰 轟
1292 | 轲 軻
1293 | 轴 軸
1294 | 轶 軼
1295 | 轻 輕
1296 | 轼 軾
1297 | 载 載
1298 | 轿 轎
1299 | 较 較
1300 | 辄 輒
1301 | 辅 輔
1302 | 辆 輛
1303 | 辇 輦
1304 | 辈 輩
1305 | 辉 輝
1306 | 辊 輥
1307 | 辍 輟
1308 | 辐 輻
1309 | 辑 輯
1310 | 输 輸
1311 | 辕 轅
1312 | 辖 轄
1313 | 辗 輾
1314 | 辘 轆
1315 | 辙 轍
1316 | 辞 辭
1317 | 辩 辯
1318 | 辫 辮
1319 | 边 邊
1320 | 辽 遼
1321 | 达 達
1322 | 迁 遷
1323 | 过 過
1324 | 迈 邁
1325 | 运 運
1326 | 还 還
1327 | 这 這
1328 | 进 進
1329 | 远 遠
1330 | 违 違
1331 | 连 連
1332 | 迟 遲
1333 | 迩 邇
1334 | 迹 跡
1335 | 适 適
1336 | 选 選
1337 | 逊 遜
1338 | 递 遞
1339 | 逻 邏
1340 | 遗 遺
1341 | 遥 遙
1342 | 邓 鄧
1343 | 邝 鄺
1344 | 邬 鄔
1345 | 邮 郵
1346 | 邹 鄒
1347 | 邺 鄴
1348 | 邻 鄰
1349 | 郁 鬱
1350 | 郑 鄭
1351 | 郦 酈
1352 | 郧 鄖
1353 | 郸 鄲
1354 | 酝 醞
1355 | 酱 醬
1356 | 酿 釀
1357 | 采 採
1358 | 释 釋
1359 | 里 裡
1360 | 鉴 鑑
1361 | 銮 鑾
1362 | 针 針
1363 | 钉 釘
1364 | 钊 釗
1365 | 钎 釺
1366 | 钏 釧
1367 | 钒 釩
1368 | 钓 釣
1369 | 钗 釵
1370 | 钙 鈣
1371 | 钛 鈦
1372 | 钜 鉅
1373 | 钝 鈍
1374 | 钞 鈔
1375 | 钟 鍾
1376 | 钠 鈉
1377 | 钡 鋇
1378 | 钢 鋼
1379 | 钣 鈑
1380 | 钤 鈐
1381 | 钥 鑰
1382 | 钦 欽
1383 | 钧 鈞
1384 | 钨 鎢
1385 | 钩 鉤
1386 | 钮 鈕
1387 | 钯 鈀
1388 | 钰 鈺
1389 | 钱 錢
1390 | 钳 鉗
1391 | 钴 鈷
1392 | 钵 缽
1393 | 钺 鉞
1394 | 钻 鑽
1395 | 钼 鉬
1396 | 钾 鉀
1397 | 钿 鈿
1398 | 铀 鈾
1399 | 铁 鐵
1400 | 铂 鉑
1401 | 铃 鈴
1402 | 铄 鑠
1403 | 铅 鉛
1404 | 铆 鉚
1405 | 铉 鉉
1406 | 铎 鐸
1407 | 铐 銬
1408 | 铛 鐺
1409 | 铜 銅
1410 | 铝 鋁
1411 | 铠 鎧
1412 | 铡 鍘
1413 | 铢 銖
1414 | 铣 銑
1415 | 铤 鋌
1416 | 铨 銓
1417 | 铩 鎩
1418 | 铬 鉻
1419 | 铭 銘
1420 | 铮 錚
1421 | 铰 鉸
1422 | 铲 鏟
1423 | 铵 銨
1424 | 银 銀
1425 | 铸 鑄
1426 | 铺 鋪
1427 | 链 鏈
1428 | 铿 鏗
1429 | 销 銷
1430 | 锁 鎖
1431 | 锂 鋰
1432 | 锄 鋤
1433 | 锅 鍋
1434 | 锆 鋯
1435 | 锈 鏽
1436 | 锉 銼
1437 | 锋 鋒
1438 | 锌 鋅
1439 | 锏 鐧
1440 | 锐 銳
1441 | 锑 銻
1442 | 错 錯
1443 | 锚 錨
1444 | 锟 錕
1445 | 锡 錫
1446 | 锢 錮
1447 | 锣 鑼
1448 | 锤 錘
1449 | 锥 錐
1450 | 锦 錦
1451 | 锭 錠
1452 | 键 鍵
1453 | 锯 鋸
1454 | 锰 錳
1455 | 锲 鍥
1456 | 锵 鏘
1457 | 锹 鍬
1458 | 锺 鍾
1459 | 锻 鍛
1460 | 镀 鍍
1461 | 镁 鎂
1462 | 镂 鏤
1463 | 镇 鎮
1464 | 镉 鎘
1465 | 镌 鐫
1466 | 镍 鎳
1467 | 镐 鎬
1468 | 镑 鎊
1469 | 镕 鎔
1470 | 镖 鏢
1471 | 镗 鏜
1472 | 镛 鏞
1473 | 镜 鏡
1474 | 镣 鐐
1475 | 镭 鐳
1476 | 镯 鐲
1477 | 镰 鐮
1478 | 镳 鑣
1479 | 镶 鑲
1480 | 长 長
1481 | 门 門
1482 | 闪 閃
1483 | 闫 閆
1484 | 闭 閉
1485 | 问 問
1486 | 闯 闖
1487 | 闰 閏
1488 | 闲 閒
1489 | 间 間
1490 | 闵 閔
1491 | 闷 悶
1492 | 闸 閘
1493 | 闹 鬧
1494 | 闺 閨
1495 | 闻 聞
1496 | 闽 閩
1497 | 闾 閭
1498 | 阀 閥
1499 | 阁 閣
1500 | 阂 閡
1501 | 阅 閱
1502 | 阆 閬
1503 | 阇 闍
1504 | 阈 閾
1505 | 阉 閹
1506 | 阎 閻
1507 | 阐 闡
1508 | 阑 闌
1509 | 阔 闊
1510 | 阕 闋
1511 | 阖 闔
1512 | 阙 闕
1513 | 阚 闞
1514 | 队 隊
1515 | 阳 陽
1516 | 阴 陰
1517 | 阵 陣
1518 | 阶 階
1519 | 际 際
1520 | 陆 陸
1521 | 陇 隴
1522 | 陈 陳
1523 | 陕 陝
1524 | 陨 隕
1525 | 险 險
1526 | 随 隨
1527 | 隐 隱
1528 | 隶 隸
1529 | 隽 雋
1530 | 难 難
1531 | 雇 僱
1532 | 雏 雛
1533 | 雳 靂
1534 | 雾 霧
1535 | 霁 霽
1536 | 霉 黴
1537 | 霭 靄
1538 | 靓 靚
1539 | 静 靜
1540 | 靥 靨
1541 | 鞑 韃
1542 | 韦 韋
1543 | 韧 韌
1544 | 韩 韓
1545 | 韬 韜
1546 | 韵 韻
1547 | 页 頁
1548 | 顶 頂
1549 | 顷 頃
1550 | 项 項
1551 | 顺 順
1552 | 须 須
1553 | 顼 頊
1554 | 顽 頑
1555 | 顾 顧
1556 | 顿 頓
1557 | 颁 頒
1558 | 颂 頌
1559 | 预 預
1560 | 颅 顱
1561 | 领 領
1562 | 颇 頗
1563 | 颈 頸
1564 | 颉 頡
1565 | 颊 頰
1566 | 颌 頜
1567 | 颍 潁
1568 | 颐 頤
1569 | 频 頻
1570 | 颓 頹
1571 | 颔 頷
1572 | 颖 穎
1573 | 颗 顆
1574 | 题 題
1575 | 颚 顎
1576 | 颛 顓
1577 | 颜 顏
1578 | 额 額
1579 | 颞 顳
1580 | 颠 顛
1581 | 颡 顙
1582 | 颢 顥
1583 | 颤 顫
1584 | 颦 顰
1585 | 颧 顴
1586 | 风 風
1587 | 飒 颯
1588 | 飓 颶
1589 | 飕 颼
1590 | 飘 飄
1591 | 飙 飆
1592 | 飚 飈
1593 | 飞 飛
1594 | 飨 饗
1595 | 饥 飢
1596 | 饨 飩
1597 | 饪 飪
1598 | 饬 飭
1599 | 饭 飯
1600 | 饮 飲
1601 | 饯 餞
1602 | 饰 飾
1603 | 饱 飽
1604 | 饲 飼
1605 | 饴 飴
1606 | 饵 餌
1607 | 饶 饒
1608 | 饷 餉
1609 | 饺 餃
1610 | 饼 餅
1611 | 饽 餑
1612 | 饿 餓
1613 | 馀 餘
1614 | 馁 餒
1615 | 馄 餛
1616 | 馅 餡
1617 | 馆 館
1618 | 馈 饋
1619 | 馋 饞
1620 | 馍 饃
1621 | 馏 餾
1622 | 馒 饅
1623 | 馔 饌
1624 | 马 馬
1625 | 驭 馭
1626 | 驮 馱
1627 | 驯 馴
1628 | 驰 馳
1629 | 驱 驅
1630 | 驳 駁
1631 | 驴 驢
1632 | 驶 駛
1633 | 驷 駟
1634 | 驸 駙
1635 | 驹 駒
1636 | 驻 駐
1637 | 驼 駝
1638 | 驾 駕
1639 | 驿 驛
1640 | 骁 驍
1641 | 骂 罵
1642 | 骄 驕
1643 | 骅 驊
1644 | 骆 駱
1645 | 骇 駭
1646 | 骈 駢
1647 | 骊 驪
1648 | 骋 騁
1649 | 验 驗
1650 | 骏 駿
1651 | 骐 騏
1652 | 骑 騎
1653 | 骗 騙
1654 | 骚 騷
1655 | 骛 騖
1656 | 骜 驁
1657 | 骞 騫
1658 | 骠 驃
1659 | 骡 騾
1660 | 骤 驟
1661 | 骥 驥
1662 | 骧 驤
1663 | 髅 髏
1664 | 髋 髖
1665 | 鬓 鬢
1666 | 魇 魘
1667 | 鱼 魚
1668 | 鱿 魷
1669 | 鲁 魯
1670 | 鲈 鱸
1671 | 鲍 鮑
1672 | 鲑 鮭
1673 | 鲛 鮫
1674 | 鲜 鮮
1675 | 鲟 鱘
1676 | 鲢 鰱
1677 | 鲤 鯉
1678 | 鲨 鯊
1679 | 鲫 鯽
1680 | 鲱 鯡
1681 | 鲲 鯤
1682 | 鲶 鯰
1683 | 鲷 鯛
1684 | 鲸 鯨
1685 | 鳃 鰓
1686 | 鳄 鱷
1687 | 鳅 鰍
1688 | 鳌 鰲
1689 | 鳍 鰭
1690 | 鳕 鱈
1691 | 鳖 鱉
1692 | 鳗 鰻
1693 | 鳝 鱔
1694 | 鳞 鱗
1695 | 鸟 鳥
1696 | 鸠 鳩
1697 | 鸡 雞
1698 | 鸢 鳶
1699 | 鸣 鳴
1700 | 鸥 鷗
1701 | 鸦 鴉
1702 | 鸨 鴇
1703 | 鸪 鴣
1704 | 鸭 鴨
1705 | 鸯 鴦
1706 | 鸳 鴛
1707 | 鸵 鴕
1708 | 鸽 鴿
1709 | 鸾 鸞
1710 | 鸿 鴻
1711 | 鹂 鸝
1712 | 鹃 鵑
1713 | 鹄 鵠
1714 | 鹅 鵝
1715 | 鹈 鵜
1716 | 鹉 鵡
1717 | 鹊 鵲
1718 | 鹌 鵪
1719 | 鹏 鵬
1720 | 鹑 鶉
1721 | 鹕 鶘
1722 | 鹘 鶻
1723 | 鹜 鶩
1724 | 鹞 鷂
1725 | 鹤 鶴
1726 | 鹦 鸚
1727 | 鹧 鷓
1728 | 鹫 鷲
1729 | 鹭 鷺
1730 | 鹰 鷹
1731 | 鹳 鸛
1732 | 麦 麥
1733 | 麸 麩
1734 | 麺 麵
1735 | 麽 麼
1736 | 黄 黃
1737 | 鼋 黿
1738 | 鼹 鼴
1739 | 齐 齊
1740 | 齿 齒
1741 | 龄 齡
1742 | 龅 齙
1743 | 龈 齦
1744 | 龊 齪
1745 | 龋 齲
1746 | 龌 齷
1747 | 龙 龍
1748 | 龚 龔
1749 | 龛 龕
1750 | 龟 龜
--------------------------------------------------------------------------------
/resource/g2pw/bopomofo_to_pinyin_wo_tune_dict.json:
--------------------------------------------------------------------------------
1 | {
2 | "ㄌㄧㄥ": "ling",
3 | "ㄩㄢ": "yuan",
4 | "ㄒㄧㄥ": "xing",
5 | "ㄑㄧㄡ": "qiu",
6 | "ㄊㄧㄢ": "tian",
7 | "ㄎㄨㄚ": "kua",
8 | "ㄨ": "wu",
9 | "ㄧㄣ": "yin",
10 | "ㄧ": "yi",
11 | "ㄒㄧㄝ": "xie",
12 | "ㄔㄡ": "chou",
13 | "ㄋㄨㄛ": "nuo",
14 | "ㄉㄢ": "dan",
15 | "ㄒㄩ": "xu",
16 | "ㄒㄩㄥ": "xiong",
17 | "ㄌㄧㄡ": "liu",
18 | "ㄌㄧㄣ": "lin",
19 | "ㄒㄧㄤ": "xiang",
20 | "ㄩㄥ": "yong",
21 | "ㄒㄧㄣ": "xin",
22 | "ㄓㄣ": "zhen",
23 | "ㄉㄞ": "dai",
24 | "ㄆㄢ": "pan",
25 | "ㄖㄨ": "ru",
26 | "ㄇㄚ": "ma",
27 | "ㄑㄧㄢ": "qian",
28 | "ㄘ": "ci",
29 | "ㄓㄨㄥ": "zhong",
30 | "ㄋㄟ": "nei",
31 | "ㄔㄥ": "cheng",
32 | "ㄈㄥ": "feng",
33 | "ㄓㄨㄛ": "zhuo",
34 | "ㄈㄤ": "fang",
35 | "ㄠ": "ao",
36 | "ㄗㄨㄛ": "zuo",
37 | "ㄓㄡ": "zhou",
38 | "ㄉㄨㄥ": "dong",
39 | "ㄙㄨ": "su",
40 | "ㄑㄩㄥ": "qiong",
41 | "ㄎㄨㄤ": "kuang",
42 | "ㄨㄤ": "wang",
43 | "ㄌㄟ": "lei",
44 | "ㄋㄠ": "nao",
45 | "ㄓㄨ": "zhu",
46 | "ㄕㄨ": "shu",
47 | "ㄕㄣ": "shen",
48 | "ㄐㄧㄝ": "jie",
49 | "ㄉㄧㄝ": "die",
50 | "ㄔ": "chi",
51 | "ㄌㄨㄥ": "long",
52 | "ㄧㄥ": "ying",
53 | "ㄅㄥ": "beng",
54 | "ㄌㄢ": "lan",
55 | "ㄇㄧㄠ": "miao",
56 | "ㄌㄧ": "li",
57 | "ㄐㄧ": "ji",
58 | "ㄩ": "yu",
59 | "ㄌㄨㄛ": "luo",
60 | "ㄔㄞ": "chai",
61 | "ㄏㄨㄣ": "hun",
62 | "ㄏㄨㄟ": "hui",
63 | "ㄖㄠ": "rao",
64 | "ㄏㄢ": "han",
65 | "ㄒㄧ": "xi",
66 | "ㄊㄞ": "tai",
67 | "ㄧㄠ": "yao",
68 | "ㄐㄩㄣ": "jun",
69 | "ㄌㄩㄝ": "lve",
70 | "ㄊㄤ": "tang",
71 | "ㄓㄠ": "zhao",
72 | "ㄓㄞ": "zhai",
73 | "ㄓㄚ": "zha",
74 | "ㄦ": "er",
75 | "ㄖㄢ": "ran",
76 | "ㄑㄧ": "qi",
77 | "ㄙㄜ": "se",
78 | "ㄙ": "si",
79 | "ㄙㄚ": "sa",
80 | "ㄎㄨㄟ": "kui",
81 | "ㄆㄨ": "pu",
82 | "ㄊㄚ": "ta",
83 | "ㄉㄨ": "du",
84 | "ㄊㄨ": "tu",
85 | "ㄧㄤ": "yang",
86 | "ㄡ": "ou",
87 | "ㄇㄧㄢ": "mian",
88 | "ㄨㄣ": "wen",
89 | "ㄉㄧㄠ": "diao",
90 | "ㄇㄧㄝ": "mie",
91 | "ㄨㄚ": "wa",
92 | "ㄋㄧㄠ": "niao",
93 | "ㄧㄡ": "you",
94 | "ㄔㄜ": "che",
95 | "ㄑㄩㄢ": "quan",
96 | "ㄘㄞ": "cai",
97 | "ㄌㄧㄤ": "liang",
98 | "ㄍㄨ": "gu",
99 | "ㄇㄠ": "mao",
100 | "ㄍㄨㄚ": "gua",
101 | "ㄙㄨㄟ": "sui",
102 | "ㄇㄢ": "man",
103 | "ㄕ": "shi",
104 | "ㄎㄡ": "kou",
105 | "ㄊㄧㄥ": "ting",
106 | "ㄅㄧㄥ": "bing",
107 | "ㄏㄨㄛ": "huo",
108 | "ㄍㄨㄥ": "gong",
109 | "ㄑㄧㄣ": "qin",
110 | "ㄐㄩㄥ": "jiong",
111 | "ㄌㄨ": "lu",
112 | "ㄋㄢ": "nan",
113 | "ㄅㄧ": "bi",
114 | "ㄑㄧㄚ": "qia",
115 | "ㄆㄧ": "pi",
116 | "ㄉㄧㄢ": "dian",
117 | "ㄈㄨ": "fu",
118 | "ㄍㄜ": "ge",
119 | "ㄅㄞ": "bai",
120 | "ㄍㄢ": "gan",
121 | "ㄒㄩㄢ": "xuan",
122 | "ㄌㄤ": "lang",
123 | "ㄕㄜ": "she",
124 | "ㄏㄨㄚ": "hua",
125 | "ㄊㄡ": "tou",
126 | "ㄆㄧㄢ": "pian",
127 | "ㄉㄧ": "di",
128 | "ㄖㄨㄢ": "ruan",
129 | "ㄜ": "e",
130 | "ㄑㄧㄝ": "qie",
131 | "ㄉㄡ": "dou",
132 | "ㄖㄨㄟ": "rui",
133 | "ㄘㄨㄟ": "cui",
134 | "ㄐㄧㄢ": "jian",
135 | "ㄔㄨㄥ": "chong",
136 | "ㄉㄥ": "deng",
137 | "ㄐㄩㄝ": "jue",
138 | "ㄒㄩㄝ": "xue",
139 | "ㄒㄧㄠ": "xiao",
140 | "ㄗㄢ": "zan",
141 | "ㄓㄢ": "zhan",
142 | "ㄗㄡ": "zou",
143 | "ㄘㄡ": "cou",
144 | "ㄔㄨㄚ": "chua",
145 | "ㄈㄟ": "fei",
146 | "ㄅㄟ": "bei",
147 | "ㄔㄨ": "chu",
148 | "ㄅㄚ": "ba",
149 | "ㄎㄨㄞ": "kuai",
150 | "ㄒㄧㄚ": "xia",
151 | "ㄏㄜ": "he",
152 | "ㄅㄧㄝ": "bie",
153 | "ㄌㄩ": "lv",
154 | "ㄙㄨㄢ": "suan",
155 | "ㄏㄥ": "heng",
156 | "ㄍㄨㄟ": "gui",
157 | "ㄌㄡ": "lou",
158 | "ㄊㄧ": "ti",
159 | "ㄌㄜ": "le",
160 | "ㄙㄨㄣ": "sun",
161 | "ㄒㄧㄢ": "xian",
162 | "ㄑㄩㄝ": "que",
163 | "ㄓ": "zhi",
164 | "ㄐㄧㄚ": "jia",
165 | "ㄏㄨ": "hu",
166 | "ㄌㄚ": "la",
167 | "ㄎㄜ": "ke",
168 | "ㄞ": "ai",
169 | "ㄨㄟ": "wei",
170 | "ㄏㄨㄢ": "huan",
171 | "ㄕㄨㄚ": "shua",
172 | "ㄕㄨㄤ": "shuang",
173 | "ㄍㄞ": "gai",
174 | "ㄏㄞ": "hai",
175 | "ㄧㄢ": "yan",
176 | "ㄈㄢ": "fan",
177 | "ㄆㄤ": "pang",
178 | "ㄙㄨㄥ": "song",
179 | "ㄋㄜ": "ne",
180 | "ㄔㄣ": "chen",
181 | "ㄍㄨㄛ": "guo",
182 | "ㄣ": "en",
183 | "ㄋㄍ": "ng",
184 | "ㄆㄚ": "pa",
185 | "ㄈㄚ": "fa",
186 | "ㄆㄡ": "pou",
187 | "ㄏㄡ": "hou",
188 | "ㄑㄩ": "qu",
189 | "ㄒㄩㄣ": "xun",
190 | "ㄋㄧㄝ": "nie",
191 | "ㄏㄨㄥ": "hong",
192 | "ㄊㄨㄣ": "tun",
193 | "ㄨㄞ": "wai",
194 | "ㄕㄡ": "shou",
195 | "ㄧㄝ": "ye",
196 | "ㄐㄩ": "ju",
197 | "ㄙㄡ": "sou",
198 | "ㄌㄨㄣ": "lun",
199 | "ㄋㄧㄚ": "nia",
200 | "ㄆㄣ": "pen",
201 | "ㄈㄣ": "fen",
202 | "ㄔㄨㄣ": "chun",
203 | "ㄋㄧㄡ": "niu",
204 | "ㄖㄡ": "rou",
205 | "ㄉㄨㄛ": "duo",
206 | "ㄗㄜ": "ze",
207 | "ㄕㄥ": "sheng",
208 | "ㄎㄨ": "ku",
209 | "ㄧㄚ": "ya",
210 | "ㄓㄨㄟ": "zhui",
211 | "ㄍㄡ": "gou",
212 | "ㄅㄛ": "bo",
213 | "ㄋㄚ": "na",
214 | "ㄒㄧㄡ": "xiu",
215 | "ㄘㄨ": "cu",
216 | "ㄎㄨㄛ": "kuo",
217 | "ㄌㄠ": "lao",
218 | "ㄘㄨㄥ": "cong",
219 | "ㄉㄚ": "da",
220 | "ㄆㄛ": "po",
221 | "ㄙㄞ": "sai",
222 | "ㄌㄥ": "leng",
223 | "ㄖㄨㄥ": "rong",
224 | "ㄋㄧ": "ni",
225 | "ㄆㄠ": "pao",
226 | "ㄎㄢ": "kan",
227 | "ㄨㄥ": "weng",
228 | "ㄨㄢ": "wan",
229 | "ㄏㄠ": "hao",
230 | "ㄐㄧㄥ": "jing",
231 | "ㄊㄢ": "tan",
232 | "ㄅㄨ": "bu",
233 | "ㄗㄤ": "zang",
234 | "ㄐㄧㄡ": "jiu",
235 | "ㄇㄟ": "mei",
236 | "ㄇㄨ": "mu",
237 | "ㄉㄨㄟ": "dui",
238 | "ㄅㄤ": "bang",
239 | "ㄅㄠ": "bao",
240 | "ㄔㄤ": "chang",
241 | "ㄓㄤ": "zhang",
242 | "ㄗㄨㄥ": "zong",
243 | "ㄍㄨㄣ": "gun",
244 | "ㄌㄧㄠ": "liao",
245 | "ㄔㄢ": "chan",
246 | "ㄓㄜ": "zhe",
247 | "ㄇㄥ": "meng",
248 | "ㄑㄧㄠ": "qiao",
249 | "ㄋㄤ": "nang",
250 | "ㄩㄣ": "yun",
251 | "ㄎㄞ": "kai",
252 | "ㄍㄠ": "gao",
253 | "ㄊㄠ": "tao",
254 | "ㄕㄢ": "shan",
255 | "ㄌㄞ": "lai",
256 | "ㄅㄢ": "ban",
257 | "ㄎㄨㄥ": "kong",
258 | "ㄔㄨㄛ": "chuo",
259 | "ㄋㄨ": "nu",
260 | "ㄆㄟ": "pei",
261 | "ㄆㄥ": "peng",
262 | "ㄘㄢ": "can",
263 | "ㄙㄨㄛ": "suo",
264 | "ㄊㄨㄥ": "tong",
265 | "ㄑㄧㄤ": "qiang",
266 | "ㄙㄠ": "sao",
267 | "ㄓㄨㄢ": "zhuan",
268 | "ㄢ": "an",
269 | "ㄔㄚ": "cha",
270 | "ㄕㄚ": "sha",
271 | "ㄌㄧㄢ": "lian",
272 | "ㄇㄧ": "mi",
273 | "ㄋㄡ": "nou",
274 | "ㄘㄠ": "cao",
275 | "ㄙㄣ": "sen",
276 | "ㄋㄣ": "nen",
277 | "ㄋㄧㄢ": "nian",
278 | "ㄇㄞ": "mai",
279 | "ㄩㄝ": "yue",
280 | "ㄋㄞ": "nai",
281 | "ㄏㄨㄞ": "huai",
282 | "ㄗ": "zi",
283 | "ㄌㄨㄢ": "luan",
284 | "ㄉㄧㄥ": "ding",
285 | "ㄇㄤ": "mang",
286 | "ㄋㄧㄥ": "ning",
287 | "ㄇㄧㄥ": "ming",
288 | "ㄗㄨㄟ": "zui",
289 | "ㄎㄤ": "kang",
290 | "ㄉㄜ": "de",
291 | "ㄅㄧㄢ": "bian",
292 | "ㄐㄧㄣ": "jin",
293 | "ㄔㄨㄟ": "chui",
294 | "ㄊㄨㄟ": "tui",
295 | "ㄗㄚ": "za",
296 | "ㄘㄣ": "cen",
297 | "ㄇㄧㄣ": "min",
298 | "ㄏㄨㄤ": "huang",
299 | "ㄗㄨ": "zu",
300 | "ㄘㄨㄛ": "cuo",
301 | "ㄊㄨㄛ": "tuo",
302 | "ㄑㄩㄣ": "qun",
303 | "ㄅㄧㄣ": "bin",
304 | "ㄊㄧㄠ": "tiao",
305 | "ㄍㄤ": "gang",
306 | "ㄉㄨㄢ": "duan",
307 | "ㄅㄧㄠ": "biao",
308 | "ㄉㄠ": "dao",
309 | "ㄖㄨㄣ": "run",
310 | "ㄐㄧㄠ": "jiao",
311 | "ㄨㄛ": "wo",
312 | "ㄘㄨㄢ": "cuan",
313 | "ㄖㄣ": "ren",
314 | "ㄇㄣ": "men",
315 | "ㄓㄨㄣ": "zhun",
316 | "ㄎㄨㄣ": "kun",
317 | "ㄔㄨㄤ": "chuang",
318 | "ㄗㄠ": "zao",
319 | "ㄓㄥ": "zheng",
320 | "ㄆㄧㄣ": "pin",
321 | "ㄅㄣ": "ben",
322 | "ㄐㄧㄤ": "jiang",
323 | "ㄐㄩㄢ": "juan",
324 | "ㄘㄥ": "ceng",
325 | "ㄏㄤ": "hang",
326 | "ㄋㄧㄣ": "nin",
327 | "ㄌㄧㄝ": "lie",
328 | "ㄍㄨㄤ": "guang",
329 | "ㄙㄢ": "san",
330 | "ㄊㄜ": "te",
331 | "ㄕㄨㄣ": "shun",
332 | "ㄕㄨㄟ": "shui",
333 | "ㄔㄠ": "chao",
334 | "ㄘㄜ": "ce",
335 | "ㄍㄨㄞ": "guai",
336 | "ㄎㄥ": "keng",
337 | "ㄕㄞ": "shai",
338 | "ㄉㄣ": "den",
339 | "ㄊㄨㄢ": "tuan",
340 | "ㄆㄧㄠ": "piao",
341 | "ㄑㄧㄥ": "qing",
342 | "ㄍㄥ": "geng",
343 | "ㄔㄨㄞ": "chuai",
344 | "ㄕㄠ": "shao",
345 | "ㄍㄣ": "gen",
346 | "ㄋㄨㄢ": "nuan",
347 | "ㄖㄥ": "reng",
348 | "ㄇㄡ": "mou",
349 | "ㄆㄞ": "pai",
350 | "ㄤ": "ang",
351 | "ㄎㄚ": "ka",
352 | "ㄍㄨㄢ": "guan",
353 | "ㄕㄨㄛ": "shuo",
354 | "ㄏㄣ": "hen",
355 | "ㄔㄨㄢ": "chuan",
356 | "ㄎㄨㄢ": "kuan",
357 | "ㄏㄟ": "hei",
358 | "ㄇㄛ": "mo",
359 | "ㄗㄞ": "zai",
360 | "ㄋㄥ": "neng",
361 | "ㄕㄨㄞ": "shuai",
362 | "ㄖㄜ": "re",
363 | "ㄋㄩ": "nv",
364 | "ㄆㄧㄥ": "ping",
365 | "ㄘㄤ": "cang",
366 | "ㄋㄨㄥ": "nong",
367 | "ㄎㄠ": "kao",
368 | "ㄗㄨㄢ": "zuan",
369 | "ㄎㄣ": "ken",
370 | "ㄍㄚ": "ga",
371 | "ㄗㄣ": "zen",
372 | "ㄉㄤ": "dang",
373 | "ㄗㄥ": "zeng",
374 | "ㄉㄨㄣ": "dun",
375 | "ㄘㄚ": "ca",
376 | "ㄖㄤ": "rang",
377 | "ㄘㄨㄣ": "cun",
378 | "ㄖㄨㄛ": "ruo",
379 | "ㄊㄧㄝ": "tie",
380 | "ㄊㄥ": "teng",
381 | "ㄙㄥ": "seng",
382 | "ㄖ": "ri",
383 | "ㄗㄨㄣ": "zun",
384 | "ㄋㄧㄤ": "niang",
385 | "ㄋㄩㄝ": "nve",
386 | "ㄙㄤ": "sang",
387 | "ㄓㄨㄤ": "zhuang",
388 | "ㄕㄤ": "shang",
389 | "ㄆㄧㄝ": "pie",
390 | "ㄕㄨㄢ": "shuan",
391 | "ㄈㄡ": "fou",
392 | "ㄉㄧㄡ": "diu",
393 | "ㄇㄜ": "me",
394 | "ㄈㄛ": "fo",
395 | "ㄌㄧㄚ": "lia",
396 | "ㄎㄟ": "kei",
397 | "ㄏㄚ": "ha",
398 | "ㄚ": "a",
399 | "ㄌㄛ": "lo",
400 | "ㄧㄛ": "yo",
401 | "ㄛ": "o",
402 | "ㄏㄋㄍ": "hng",
403 | "ㄋ": "n",
404 | "ㄌㄣ": "len",
405 | "ㄉㄧㄚ": "dia",
406 | "ㄇㄧㄡ": "miu",
407 | "ㄉㄟ": "dei",
408 | "ㄏㄇ": "hm",
409 | "ㄋㄨㄣ": "nun",
410 | "ㄓㄨㄞ": "zhuai",
411 | "ㄊㄟ": "tei",
412 | "ㄗㄟ": "zei",
413 | "ㄓㄨㄚ": "zhua",
414 | "ㄖㄨㄚ": "rua",
415 | "ê": "ê",
416 | "ㄟ": "ei",
417 | "ㄍㄟ": "gei",
418 | "ㄈㄧㄠ": "fiao",
419 | "ㄕㄟ": "shei",
420 | "ㄓㄟ": "zhei",
421 | "ㄥ": "eng",
422 | "ㄘㄟ": "cei",
423 | "ㄉㄧㄣ": "din",
424 | "ㄅㄧㄤ": "biang",
425 | "ㄧㄞ": "yai"
426 | }
--------------------------------------------------------------------------------
/resource/g2pw/dict_poly_index_list.json:
--------------------------------------------------------------------------------
1 | [
2 | "ba1",
3 | "ba2",
4 | "ba3",
5 | "ba4",
6 | "ba5",
7 | "bo1",
8 | "bo2",
9 | "bo3",
10 | "bo4",
11 | "bo5",
12 | "bai2",
13 | "bai3",
14 | "bai4",
15 | "bei1",
16 | "bei3",
17 | "bei4",
18 | "bao1",
19 | "bao2",
20 | "bao3",
21 | "bao4",
22 | "bao5",
23 | "ban1",
24 | "ban3",
25 | "ban4",
26 | "ben1",
27 | "ben4",
28 | "bang1",
29 | "bang3",
30 | "bang4",
31 | "beng1",
32 | "beng3",
33 | "beng4",
34 | "bi1",
35 | "bi2",
36 | "bi3",
37 | "bi4",
38 | "bie2",
39 | "bie3",
40 | "bie4",
41 | "biao1",
42 | "biao3",
43 | "biao4",
44 | "bian1",
45 | "bian3",
46 | "bian4",
47 | "bin1",
48 | "bin4",
49 | "bing1",
50 | "bing3",
51 | "bing4",
52 | "bu1",
53 | "bu2",
54 | "bu3",
55 | "bu4",
56 | "pa1",
57 | "pa2",
58 | "pa4",
59 | "pa5",
60 | "po1",
61 | "po2",
62 | "po3",
63 | "po4",
64 | "po5",
65 | "pai1",
66 | "pai2",
67 | "pai3",
68 | "pei1",
69 | "pei2",
70 | "pei3",
71 | "pei4",
72 | "pao1",
73 | "pao2",
74 | "pao3",
75 | "pao4",
76 | "pou1",
77 | "pou2",
78 | "pou3",
79 | "pan1",
80 | "pan2",
81 | "pan3",
82 | "pan4",
83 | "pen1",
84 | "pen2",
85 | "pen4",
86 | "pang1",
87 | "pang2",
88 | "pang4",
89 | "peng1",
90 | "peng2",
91 | "peng3",
92 | "peng4",
93 | "pi1",
94 | "pi2",
95 | "pi3",
96 | "pi4",
97 | "pie1",
98 | "pie3",
99 | "pie4",
100 | "piao1",
101 | "piao2",
102 | "piao3",
103 | "piao4",
104 | "pian1",
105 | "pian2",
106 | "pian3",
107 | "pian4",
108 | "pin1",
109 | "pin2",
110 | "pin4",
111 | "ping1",
112 | "ping2",
113 | "ping3",
114 | "ping4",
115 | "pu1",
116 | "pu2",
117 | "pu3",
118 | "pu4",
119 | "ma1",
120 | "ma2",
121 | "ma3",
122 | "ma4",
123 | "ma5",
124 | "mo1",
125 | "mo2",
126 | "mo3",
127 | "mo4",
128 | "mo5",
129 | "me5",
130 | "mai2",
131 | "mai4",
132 | "mei2",
133 | "mei4",
134 | "mei5",
135 | "mao1",
136 | "mao2",
137 | "mao3",
138 | "mao4",
139 | "mou2",
140 | "mou3",
141 | "mou4",
142 | "man1",
143 | "man2",
144 | "man3",
145 | "man4",
146 | "men1",
147 | "men2",
148 | "men4",
149 | "men5",
150 | "mang2",
151 | "mang3",
152 | "meng1",
153 | "meng2",
154 | "meng3",
155 | "meng4",
156 | "mi1",
157 | "mi2",
158 | "mi3",
159 | "mi4",
160 | "mie1",
161 | "mie4",
162 | "miao3",
163 | "miao4",
164 | "miu1",
165 | "miu4",
166 | "mian2",
167 | "mian3",
168 | "mian4",
169 | "min2",
170 | "min3",
171 | "ming2",
172 | "ming3",
173 | "ming4",
174 | "mu2",
175 | "mu3",
176 | "mu4",
177 | "fa1",
178 | "fa2",
179 | "fa3",
180 | "fa4",
181 | "fo2",
182 | "fo4",
183 | "fei1",
184 | "fei2",
185 | "fei3",
186 | "fei4",
187 | "fou1",
188 | "fou2",
189 | "fou3",
190 | "fou4",
191 | "fan1",
192 | "fan2",
193 | "fan3",
194 | "fan4",
195 | "fen1",
196 | "fen2",
197 | "fen4",
198 | "fen5",
199 | "fang1",
200 | "fang2",
201 | "fang3",
202 | "fang4",
203 | "feng1",
204 | "feng2",
205 | "feng3",
206 | "feng4",
207 | "fu1",
208 | "fu2",
209 | "fu3",
210 | "fu4",
211 | "fu5",
212 | "ㄈㄨㄥ4",
213 | "da1",
214 | "da2",
215 | "da3",
216 | "da4",
217 | "da5",
218 | "de2",
219 | "de5",
220 | "dai1",
221 | "dai3",
222 | "dai4",
223 | "dei3",
224 | "dao1",
225 | "dao2",
226 | "dao3",
227 | "dao4",
228 | "dou1",
229 | "dou3",
230 | "dou4",
231 | "dan1",
232 | "dan3",
233 | "dan4",
234 | "dang1",
235 | "dang3",
236 | "dang4",
237 | "deng1",
238 | "deng4",
239 | "di1",
240 | "di2",
241 | "di3",
242 | "di4",
243 | "di5",
244 | "dia1",
245 | "die1",
246 | "die2",
247 | "die5",
248 | "diao1",
249 | "diao3",
250 | "diao4",
251 | "diu1",
252 | "dian1",
253 | "dian3",
254 | "dian4",
255 | "ㄉㄧㄤ1",
256 | "ding1",
257 | "ding3",
258 | "ding4",
259 | "du1",
260 | "du2",
261 | "du3",
262 | "du4",
263 | "duo1",
264 | "duo2",
265 | "duo3",
266 | "duo4",
267 | "duo5",
268 | "dui1",
269 | "dui4",
270 | "duan1",
271 | "dun1",
272 | "dun3",
273 | "dun4",
274 | "dong1",
275 | "dong3",
276 | "dong4",
277 | "ta1",
278 | "ta3",
279 | "ta4",
280 | "te1",
281 | "te4",
282 | "tai1",
283 | "tai2",
284 | "tai4",
285 | "tai5",
286 | "tao1",
287 | "tao2",
288 | "tou1",
289 | "tou2",
290 | "tou3",
291 | "tou5",
292 | "tan1",
293 | "tan2",
294 | "tan3",
295 | "tan4",
296 | "tang1",
297 | "tang2",
298 | "tang3",
299 | "tang4",
300 | "teng1",
301 | "teng2",
302 | "teng5",
303 | "ti1",
304 | "ti2",
305 | "ti3",
306 | "ti4",
307 | "tie1",
308 | "tie3",
309 | "tie4",
310 | "tiao1",
311 | "tiao2",
312 | "tiao3",
313 | "tiao4",
314 | "tian2",
315 | "tian3",
316 | "tian4",
317 | "ting1",
318 | "ting2",
319 | "ting3",
320 | "ting4",
321 | "tu1",
322 | "tu2",
323 | "tu3",
324 | "tu4",
325 | "tuo1",
326 | "tuo2",
327 | "tuo3",
328 | "tuo4",
329 | "tui1",
330 | "tui2",
331 | "tui3",
332 | "tui4",
333 | "tuan2",
334 | "tuan3",
335 | "tun1",
336 | "tun2",
337 | "tun3",
338 | "tun4",
339 | "tong1",
340 | "tong2",
341 | "tong3",
342 | "tong4",
343 | "na1",
344 | "na2",
345 | "na3",
346 | "na4",
347 | "na5",
348 | "ne1",
349 | "ne2",
350 | "ne4",
351 | "ne5",
352 | "nai3",
353 | "nai4",
354 | "nai5",
355 | "nei3",
356 | "nei4",
357 | "nao1",
358 | "nao2",
359 | "nao3",
360 | "nao4",
361 | "nou2",
362 | "nou4",
363 | "nan1",
364 | "nan2",
365 | "nan3",
366 | "nan4",
367 | "nang1",
368 | "nang2",
369 | "nang5",
370 | "neng2",
371 | "neng4",
372 | "ni2",
373 | "ni3",
374 | "ni4",
375 | "nie1",
376 | "nie2",
377 | "nie4",
378 | "niao3",
379 | "niao4",
380 | "niu3",
381 | "niu4",
382 | "nian1",
383 | "nian2",
384 | "nian3",
385 | "nian4",
386 | "nin2",
387 | "ning2",
388 | "ning3",
389 | "ning4",
390 | "nu2",
391 | "nuo2",
392 | "nuo3",
393 | "nuo4",
394 | "nuan2",
395 | "nuan3",
396 | "nong2",
397 | "nong3",
398 | "nong4",
399 | "nv3",
400 | "nv4",
401 | "la1",
402 | "la2",
403 | "la3",
404 | "la4",
405 | "la5",
406 | "lo5",
407 | "le1",
408 | "le4",
409 | "le5",
410 | "lai2",
411 | "lai4",
412 | "lei1",
413 | "lei2",
414 | "lei3",
415 | "lei4",
416 | "lao1",
417 | "lao2",
418 | "lao3",
419 | "lao4",
420 | "lao5",
421 | "lou1",
422 | "lou2",
423 | "lou3",
424 | "lou4",
425 | "lou5",
426 | "lan2",
427 | "lan3",
428 | "lan4",
429 | "lang1",
430 | "lang2",
431 | "lang3",
432 | "lang4",
433 | "leng1",
434 | "leng2",
435 | "leng4",
436 | "li1",
437 | "li2",
438 | "li3",
439 | "li4",
440 | "li5",
441 | "lia3",
442 | "lie1",
443 | "lie2",
444 | "lie3",
445 | "lie4",
446 | "lie5",
447 | "liao1",
448 | "liao2",
449 | "liao3",
450 | "liao4",
451 | "liu1",
452 | "liu2",
453 | "liu3",
454 | "liu4",
455 | "lian2",
456 | "lian3",
457 | "lian4",
458 | "lin2",
459 | "lin3",
460 | "lin4",
461 | "liang2",
462 | "liang3",
463 | "liang4",
464 | "ling2",
465 | "ling3",
466 | "ling4",
467 | "lu2",
468 | "lu3",
469 | "lu4",
470 | "luo1",
471 | "luo2",
472 | "luo3",
473 | "luo4",
474 | "luo5",
475 | "luan2",
476 | "luan3",
477 | "luan4",
478 | "lun1",
479 | "lun2",
480 | "lun4",
481 | "long2",
482 | "long3",
483 | "long4",
484 | "lv2",
485 | "lv3",
486 | "lv4",
487 | "lve4",
488 | "ㄌㄩㄢ2",
489 | "ㄌㄩㄢ3",
490 | "ㄌㄩㄣ2",
491 | "ga1",
492 | "ga2",
493 | "ga4",
494 | "ga5",
495 | "ge1",
496 | "ge2",
497 | "ge3",
498 | "ge4",
499 | "ge5",
500 | "gai1",
501 | "gai3",
502 | "gai4",
503 | "gei3",
504 | "gao1",
505 | "gao3",
506 | "gao4",
507 | "gou1",
508 | "gou3",
509 | "gou4",
510 | "gan1",
511 | "gan3",
512 | "gan4",
513 | "gen3",
514 | "gen4",
515 | "gang1",
516 | "gang3",
517 | "gang4",
518 | "geng1",
519 | "geng2",
520 | "geng3",
521 | "geng4",
522 | "ㄍㄧ2",
523 | "gu1",
524 | "gu2",
525 | "gu3",
526 | "gu4",
527 | "gu5",
528 | "gua1",
529 | "gua4",
530 | "guo1",
531 | "guo2",
532 | "guo3",
533 | "guo4",
534 | "guai1",
535 | "guai4",
536 | "gui1",
537 | "gui3",
538 | "gui4",
539 | "guan1",
540 | "guan3",
541 | "guan4",
542 | "gun3",
543 | "gun4",
544 | "guang1",
545 | "guang3",
546 | "guang4",
547 | "gong1",
548 | "gong3",
549 | "gong4",
550 | "gong5",
551 | "ka1",
552 | "ka3",
553 | "ka4",
554 | "ke1",
555 | "ke2",
556 | "ke3",
557 | "ke4",
558 | "kai1",
559 | "kai3",
560 | "kai4",
561 | "kao1",
562 | "kao4",
563 | "kou1",
564 | "kou4",
565 | "kan1",
566 | "kan3",
567 | "kan4",
568 | "ken3",
569 | "ken4",
570 | "kang1",
571 | "kang2",
572 | "kang3",
573 | "kang4",
574 | "keng1",
575 | "keng3",
576 | "ku1",
577 | "ku3",
578 | "ku4",
579 | "kua1",
580 | "kua3",
581 | "kuo4",
582 | "kuai1",
583 | "kuai3",
584 | "kuai4",
585 | "kui1",
586 | "kui2",
587 | "kui3",
588 | "kui4",
589 | "kuan3",
590 | "kun1",
591 | "kun3",
592 | "kuang1",
593 | "kuang3",
594 | "kuang4",
595 | "kong1",
596 | "kong3",
597 | "kong4",
598 | "ha1",
599 | "ha2",
600 | "ha3",
601 | "he1",
602 | "he2",
603 | "he4",
604 | "hai1",
605 | "hai2",
606 | "hai4",
607 | "hei1",
608 | "hei3",
609 | "hao1",
610 | "hao2",
611 | "hao3",
612 | "hao4",
613 | "hou1",
614 | "hou2",
615 | "hou3",
616 | "hou4",
617 | "han1",
618 | "han2",
619 | "han3",
620 | "han4",
621 | "hen2",
622 | "hen3",
623 | "hang1",
624 | "hang2",
625 | "hang3",
626 | "hang4",
627 | "heng1",
628 | "heng2",
629 | "heng4",
630 | "hu1",
631 | "hu2",
632 | "hu3",
633 | "hu4",
634 | "hua1",
635 | "hua2",
636 | "hua3",
637 | "hua4",
638 | "huo1",
639 | "huo2",
640 | "huo3",
641 | "huo4",
642 | "huo5",
643 | "huai2",
644 | "huai4",
645 | "hui1",
646 | "hui2",
647 | "hui3",
648 | "hui4",
649 | "huan1",
650 | "huan2",
651 | "huan3",
652 | "huan4",
653 | "hun1",
654 | "hun2",
655 | "hun3",
656 | "hun4",
657 | "huang1",
658 | "huang2",
659 | "huang3",
660 | "huang4",
661 | "huang5",
662 | "hong1",
663 | "hong2",
664 | "hong3",
665 | "hong4",
666 | "ji1",
667 | "ji2",
668 | "ji3",
669 | "ji4",
670 | "jia1",
671 | "jia2",
672 | "jia3",
673 | "jia4",
674 | "jia5",
675 | "jie1",
676 | "jie2",
677 | "jie3",
678 | "jie4",
679 | "jie5",
680 | "jiao1",
681 | "jiao2",
682 | "jiao3",
683 | "jiao4",
684 | "jiu1",
685 | "jiu3",
686 | "jiu4",
687 | "jiu5",
688 | "jian1",
689 | "jian3",
690 | "jian4",
691 | "jin1",
692 | "jin3",
693 | "jin4",
694 | "jiang1",
695 | "jiang3",
696 | "jiang4",
697 | "jing1",
698 | "jing3",
699 | "jing4",
700 | "ju1",
701 | "ju2",
702 | "ju3",
703 | "ju4",
704 | "jue1",
705 | "jue2",
706 | "jue3",
707 | "jue4",
708 | "juan1",
709 | "juan3",
710 | "juan4",
711 | "jun1",
712 | "jun3",
713 | "jun4",
714 | "jiong1",
715 | "jiong3",
716 | "qi1",
717 | "qi2",
718 | "qi3",
719 | "qi4",
720 | "qia1",
721 | "qia2",
722 | "qia3",
723 | "qia4",
724 | "qie1",
725 | "qie2",
726 | "qie3",
727 | "qie4",
728 | "qiao1",
729 | "qiao2",
730 | "qiao3",
731 | "qiao4",
732 | "qiu1",
733 | "qiu2",
734 | "qiu3",
735 | "qian1",
736 | "qian2",
737 | "qian3",
738 | "qian4",
739 | "qin1",
740 | "qin2",
741 | "qin3",
742 | "qin4",
743 | "qiang1",
744 | "qiang2",
745 | "qiang3",
746 | "qiang4",
747 | "qing1",
748 | "qing2",
749 | "qing3",
750 | "qing4",
751 | "qu1",
752 | "qu2",
753 | "qu3",
754 | "qu4",
755 | "que1",
756 | "que4",
757 | "quan1",
758 | "quan2",
759 | "quan3",
760 | "quan4",
761 | "qun1",
762 | "qun2",
763 | "qiong1",
764 | "qiong2",
765 | "qiong3",
766 | "xi1",
767 | "xi2",
768 | "xi3",
769 | "xi4",
770 | "xi5",
771 | "xia1",
772 | "xia2",
773 | "xia3",
774 | "xia4",
775 | "xie1",
776 | "xie2",
777 | "xie3",
778 | "xie4",
779 | "xie5",
780 | "xiao1",
781 | "xiao2",
782 | "xiao3",
783 | "xiao4",
784 | "xiu1",
785 | "xiu3",
786 | "xiu4",
787 | "xian1",
788 | "xian2",
789 | "xian3",
790 | "xian4",
791 | "xin1",
792 | "xin2",
793 | "xin3",
794 | "xin4",
795 | "xiang1",
796 | "xiang2",
797 | "xiang3",
798 | "xiang4",
799 | "xing1",
800 | "xing2",
801 | "xing3",
802 | "xing4",
803 | "xing5",
804 | "xu1",
805 | "xu2",
806 | "xu3",
807 | "xu4",
808 | "xue1",
809 | "xue2",
810 | "xue3",
811 | "xue4",
812 | "xuan1",
813 | "xuan2",
814 | "xuan3",
815 | "xuan4",
816 | "xun1",
817 | "xun2",
818 | "xun4",
819 | "xiong1",
820 | "xiong2",
821 | "xiong3",
822 | "xiong4",
823 | "zhi1",
824 | "zhi2",
825 | "zhi3",
826 | "zhi4",
827 | "zha1",
828 | "zha2",
829 | "zha3",
830 | "zha4",
831 | "zhe1",
832 | "zhe2",
833 | "zhe3",
834 | "zhe4",
835 | "zhe5",
836 | "zhai1",
837 | "zhai2",
838 | "zhai3",
839 | "zhai4",
840 | "zhei4",
841 | "zhao1",
842 | "zhao2",
843 | "zhao3",
844 | "zhao4",
845 | "zhou1",
846 | "zhou2",
847 | "zhou3",
848 | "zhou4",
849 | "zhan1",
850 | "zhan3",
851 | "zhan4",
852 | "zhen1",
853 | "zhen3",
854 | "zhen4",
855 | "zhang1",
856 | "zhang3",
857 | "zhang4",
858 | "zheng1",
859 | "zheng3",
860 | "zheng4",
861 | "zhu1",
862 | "zhu2",
863 | "zhu3",
864 | "zhu4",
865 | "zhua1",
866 | "zhua3",
867 | "zhuo1",
868 | "zhuo2",
869 | "zhuai1",
870 | "zhuai3",
871 | "zhuai4",
872 | "zhui1",
873 | "zhui4",
874 | "zhuan1",
875 | "zhuan3",
876 | "zhuan4",
877 | "zhun1",
878 | "zhun3",
879 | "zhun4",
880 | "zhuang1",
881 | "zhuang3",
882 | "zhuang4",
883 | "zhong1",
884 | "zhong3",
885 | "zhong4",
886 | "chi1",
887 | "chi2",
888 | "chi3",
889 | "chi4",
890 | "cha1",
891 | "cha2",
892 | "cha3",
893 | "cha4",
894 | "che1",
895 | "che3",
896 | "che4",
897 | "chai1",
898 | "chai2",
899 | "chai3",
900 | "chai4",
901 | "chao1",
902 | "chao2",
903 | "chao3",
904 | "chao4",
905 | "chou1",
906 | "chou2",
907 | "chou3",
908 | "chou4",
909 | "chan1",
910 | "chan2",
911 | "chan3",
912 | "chan4",
913 | "chen1",
914 | "chen2",
915 | "chen3",
916 | "chen4",
917 | "chang1",
918 | "chang2",
919 | "chang3",
920 | "chang4",
921 | "cheng1",
922 | "cheng2",
923 | "cheng3",
924 | "cheng4",
925 | "chu1",
926 | "chu2",
927 | "chu3",
928 | "chu4",
929 | "chua1",
930 | "chua3",
931 | "chuo4",
932 | "chuai1",
933 | "chuai3",
934 | "chuai4",
935 | "chui1",
936 | "chui2",
937 | "chui4",
938 | "chuan1",
939 | "chuan2",
940 | "chuan3",
941 | "chuan4",
942 | "chun1",
943 | "chun2",
944 | "chun3",
945 | "chuang1",
946 | "chuang2",
947 | "chuang3",
948 | "chuang4",
949 | "chong1",
950 | "chong2",
951 | "chong4",
952 | "shi1",
953 | "shi2",
954 | "shi3",
955 | "shi4",
956 | "shi5",
957 | "sha1",
958 | "sha3",
959 | "sha4",
960 | "she1",
961 | "she2",
962 | "she3",
963 | "she4",
964 | "shai3",
965 | "shai4",
966 | "shei2",
967 | "shao1",
968 | "shao2",
969 | "shao3",
970 | "shao4",
971 | "shou1",
972 | "shou2",
973 | "shou3",
974 | "shou4",
975 | "shan1",
976 | "shan3",
977 | "shan4",
978 | "shen1",
979 | "shen2",
980 | "shen3",
981 | "shen4",
982 | "shen5",
983 | "shang1",
984 | "shang3",
985 | "shang4",
986 | "shang5",
987 | "sheng1",
988 | "sheng2",
989 | "sheng3",
990 | "sheng4",
991 | "sheng5",
992 | "shu1",
993 | "shu2",
994 | "shu3",
995 | "shu4",
996 | "shu5",
997 | "shua1",
998 | "shuo1",
999 | "shuo4",
1000 | "shuai1",
1001 | "shuai4",
1002 | "shui2",
1003 | "shui4",
1004 | "shuan4",
1005 | "shun3",
1006 | "shun4",
1007 | "shuang1",
1008 | "shuang3",
1009 | "ri4",
1010 | "re2",
1011 | "re3",
1012 | "re4",
1013 | "rao2",
1014 | "rao3",
1015 | "rou2",
1016 | "rou3",
1017 | "rou4",
1018 | "ran2",
1019 | "ran3",
1020 | "ren2",
1021 | "ren3",
1022 | "ren4",
1023 | "rang2",
1024 | "rang3",
1025 | "rang4",
1026 | "reng1",
1027 | "reng2",
1028 | "reng3",
1029 | "ru2",
1030 | "ru3",
1031 | "ru4",
1032 | "ruo2",
1033 | "ruo4",
1034 | "rui2",
1035 | "rui3",
1036 | "rui4",
1037 | "ruan2",
1038 | "ruan3",
1039 | "run1",
1040 | "run2",
1041 | "rong2",
1042 | "rong3",
1043 | "zi1",
1044 | "zi3",
1045 | "zi4",
1046 | "zi5",
1047 | "za1",
1048 | "za2",
1049 | "ze2",
1050 | "ze3",
1051 | "ze4",
1052 | "zai1",
1053 | "zai3",
1054 | "zai4",
1055 | "zei2",
1056 | "zao1",
1057 | "zao2",
1058 | "zao3",
1059 | "zao4",
1060 | "zou1",
1061 | "zou3",
1062 | "zou4",
1063 | "zan1",
1064 | "zan2",
1065 | "zan3",
1066 | "zan4",
1067 | "zen1",
1068 | "zen3",
1069 | "zang1",
1070 | "zang3",
1071 | "zang4",
1072 | "zeng1",
1073 | "zeng4",
1074 | "zu2",
1075 | "zu3",
1076 | "zu4",
1077 | "zuo1",
1078 | "zuo2",
1079 | "zuo3",
1080 | "zuo4",
1081 | "zui1",
1082 | "zui3",
1083 | "zui4",
1084 | "zuan1",
1085 | "zuan3",
1086 | "zuan4",
1087 | "zun1",
1088 | "zun3",
1089 | "zun4",
1090 | "zong1",
1091 | "zong3",
1092 | "zong4",
1093 | "ci1",
1094 | "ci2",
1095 | "ci3",
1096 | "ci4",
1097 | "ca1",
1098 | "ce4",
1099 | "cai1",
1100 | "cai3",
1101 | "cai4",
1102 | "cao1",
1103 | "cao3",
1104 | "cao4",
1105 | "cou4",
1106 | "can1",
1107 | "can2",
1108 | "can3",
1109 | "can4",
1110 | "cen1",
1111 | "cen2",
1112 | "cang1",
1113 | "cang2",
1114 | "cang3",
1115 | "ceng2",
1116 | "cu1",
1117 | "cu2",
1118 | "cu4",
1119 | "cuo1",
1120 | "cuo2",
1121 | "cuo3",
1122 | "cuo4",
1123 | "cui1",
1124 | "cui3",
1125 | "cui4",
1126 | "cuan1",
1127 | "cuan2",
1128 | "cuan4",
1129 | "cun1",
1130 | "cun2",
1131 | "cun3",
1132 | "cun4",
1133 | "cong1",
1134 | "cong2",
1135 | "cong4",
1136 | "si1",
1137 | "si3",
1138 | "si4",
1139 | "si5",
1140 | "sa1",
1141 | "sa3",
1142 | "sa4",
1143 | "se4",
1144 | "sai1",
1145 | "sai4",
1146 | "sao1",
1147 | "sao3",
1148 | "sao4",
1149 | "sao5",
1150 | "sou1",
1151 | "sou3",
1152 | "sou4",
1153 | "san1",
1154 | "san3",
1155 | "san4",
1156 | "sen1",
1157 | "sang1",
1158 | "sang4",
1159 | "su1",
1160 | "su4",
1161 | "suo1",
1162 | "suo2",
1163 | "suo3",
1164 | "suo4",
1165 | "sui1",
1166 | "sui2",
1167 | "sui3",
1168 | "sui4",
1169 | "suan3",
1170 | "suan4",
1171 | "sun1",
1172 | "sun3",
1173 | "sun4",
1174 | "song1",
1175 | "song2",
1176 | "song3",
1177 | "song4",
1178 | "a1",
1179 | "a2",
1180 | "a3",
1181 | "a4",
1182 | "a5",
1183 | "o1",
1184 | "o2",
1185 | "o3",
1186 | "e1",
1187 | "e2",
1188 | "e3",
1189 | "e4",
1190 | "ㄝ4",
1191 | "ai1",
1192 | "ai2",
1193 | "ai3",
1194 | "ai4",
1195 | "ei4",
1196 | "ao1",
1197 | "ao2",
1198 | "ao3",
1199 | "ao4",
1200 | "ou1",
1201 | "ou2",
1202 | "ou3",
1203 | "ou4",
1204 | "an1",
1205 | "an2",
1206 | "an3",
1207 | "an4",
1208 | "en1",
1209 | "en3",
1210 | "en5",
1211 | "ang1",
1212 | "ang2",
1213 | "ang3",
1214 | "eng1",
1215 | "er1",
1216 | "er2",
1217 | "er3",
1218 | "er4",
1219 | "yi1",
1220 | "yi2",
1221 | "yi3",
1222 | "yi4",
1223 | "ya1",
1224 | "ya2",
1225 | "ya3",
1226 | "ya4",
1227 | "ya5",
1228 | "ye1",
1229 | "ye2",
1230 | "ye4",
1231 | "ye5",
1232 | "yai2",
1233 | "yao1",
1234 | "yao2",
1235 | "yao3",
1236 | "yao4",
1237 | "you1",
1238 | "you2",
1239 | "you3",
1240 | "you4",
1241 | "yan1",
1242 | "yan2",
1243 | "yan3",
1244 | "yan4",
1245 | "yin1",
1246 | "yin2",
1247 | "yin3",
1248 | "yin4",
1249 | "yang1",
1250 | "yang2",
1251 | "yang3",
1252 | "yang4",
1253 | "ying1",
1254 | "ying2",
1255 | "ying3",
1256 | "ying4",
1257 | "wu1",
1258 | "wu2",
1259 | "wu3",
1260 | "wu4",
1261 | "wa1",
1262 | "wa2",
1263 | "wa3",
1264 | "wa4",
1265 | "wa5",
1266 | "wo1",
1267 | "wo3",
1268 | "wo4",
1269 | "wai1",
1270 | "wai3",
1271 | "wei1",
1272 | "wei2",
1273 | "wei3",
1274 | "wei4",
1275 | "wan1",
1276 | "wan2",
1277 | "wan3",
1278 | "wan4",
1279 | "wen2",
1280 | "wen3",
1281 | "wen4",
1282 | "wang2",
1283 | "wang3",
1284 | "wang4",
1285 | "weng1",
1286 | "weng3",
1287 | "yu1",
1288 | "yu2",
1289 | "yu3",
1290 | "yu4",
1291 | "yu5",
1292 | "yue1",
1293 | "yue4",
1294 | "yuan1",
1295 | "yuan2",
1296 | "yuan3",
1297 | "yuan4",
1298 | "yun1",
1299 | "yun2",
1300 | "yun3",
1301 | "yun4",
1302 | "ㄩㄤ4",
1303 | "yong1",
1304 | "yong2",
1305 | "yong3",
1306 | "yong4"
1307 | ]
--------------------------------------------------------------------------------
/resource/g2pw/dict_poly_index_map.json:
--------------------------------------------------------------------------------
1 | {
2 | "a1": 1176,
3 | "a2": 1177,
4 | "a3": 1178,
5 | "a4": 1179,
6 | "a5": 1180,
7 | "ai1": 1189,
8 | "ai2": 1190,
9 | "ai3": 1191,
10 | "ai4": 1192,
11 | "an1": 1202,
12 | "an2": 1203,
13 | "an3": 1204,
14 | "an4": 1205,
15 | "ang1": 1209,
16 | "ang2": 1210,
17 | "ang3": 1211,
18 | "ao1": 1194,
19 | "ao2": 1195,
20 | "ao3": 1196,
21 | "ao4": 1197,
22 | "ba1": 0,
23 | "ba2": 1,
24 | "ba3": 2,
25 | "ba4": 3,
26 | "ba5": 4,
27 | "bai2": 10,
28 | "bai3": 11,
29 | "bai4": 12,
30 | "ban1": 21,
31 | "ban3": 22,
32 | "ban4": 23,
33 | "bang1": 26,
34 | "bang3": 27,
35 | "bang4": 28,
36 | "bao1": 16,
37 | "bao2": 17,
38 | "bao3": 18,
39 | "bao4": 19,
40 | "bao5": 20,
41 | "bei1": 13,
42 | "bei3": 14,
43 | "bei4": 15,
44 | "ben1": 24,
45 | "ben4": 25,
46 | "beng1": 29,
47 | "beng3": 30,
48 | "beng4": 31,
49 | "bi1": 32,
50 | "bi2": 33,
51 | "bi3": 34,
52 | "bi4": 35,
53 | "bian1": 42,
54 | "bian3": 43,
55 | "bian4": 44,
56 | "biao1": 39,
57 | "biao3": 40,
58 | "biao4": 41,
59 | "bie2": 36,
60 | "bie3": 37,
61 | "bie4": 38,
62 | "bin1": 45,
63 | "bin4": 46,
64 | "bing1": 47,
65 | "bing3": 48,
66 | "bing4": 49,
67 | "bo1": 5,
68 | "bo2": 6,
69 | "bo3": 7,
70 | "bo4": 8,
71 | "bo5": 9,
72 | "bu1": 50,
73 | "bu2": 51,
74 | "bu3": 52,
75 | "bu4": 53,
76 | "ca1": 1095,
77 | "cai1": 1097,
78 | "cai3": 1098,
79 | "cai4": 1099,
80 | "can1": 1104,
81 | "can2": 1105,
82 | "can3": 1106,
83 | "can4": 1107,
84 | "cang1": 1110,
85 | "cang2": 1111,
86 | "cang3": 1112,
87 | "cao1": 1100,
88 | "cao3": 1101,
89 | "cao4": 1102,
90 | "ce4": 1096,
91 | "cen1": 1108,
92 | "cen2": 1109,
93 | "ceng2": 1113,
94 | "cha1": 888,
95 | "cha2": 889,
96 | "cha3": 890,
97 | "cha4": 891,
98 | "chai1": 895,
99 | "chai2": 896,
100 | "chai3": 897,
101 | "chai4": 898,
102 | "chan1": 907,
103 | "chan2": 908,
104 | "chan3": 909,
105 | "chan4": 910,
106 | "chang1": 915,
107 | "chang2": 916,
108 | "chang3": 917,
109 | "chang4": 918,
110 | "chao1": 899,
111 | "chao2": 900,
112 | "chao3": 901,
113 | "chao4": 902,
114 | "che1": 892,
115 | "che3": 893,
116 | "che4": 894,
117 | "chen1": 911,
118 | "chen2": 912,
119 | "chen3": 913,
120 | "chen4": 914,
121 | "cheng1": 919,
122 | "cheng2": 920,
123 | "cheng3": 921,
124 | "cheng4": 922,
125 | "chi1": 884,
126 | "chi2": 885,
127 | "chi3": 886,
128 | "chi4": 887,
129 | "chong1": 947,
130 | "chong2": 948,
131 | "chong4": 949,
132 | "chou1": 903,
133 | "chou2": 904,
134 | "chou3": 905,
135 | "chou4": 906,
136 | "chu1": 923,
137 | "chu2": 924,
138 | "chu3": 925,
139 | "chu4": 926,
140 | "chua1": 927,
141 | "chua3": 928,
142 | "chuai1": 930,
143 | "chuai3": 931,
144 | "chuai4": 932,
145 | "chuan1": 936,
146 | "chuan2": 937,
147 | "chuan3": 938,
148 | "chuan4": 939,
149 | "chuang1": 943,
150 | "chuang2": 944,
151 | "chuang3": 945,
152 | "chuang4": 946,
153 | "chui1": 933,
154 | "chui2": 934,
155 | "chui4": 935,
156 | "chun1": 940,
157 | "chun2": 941,
158 | "chun3": 942,
159 | "chuo4": 929,
160 | "ci1": 1091,
161 | "ci2": 1092,
162 | "ci3": 1093,
163 | "ci4": 1094,
164 | "cong1": 1131,
165 | "cong2": 1132,
166 | "cong4": 1133,
167 | "cou4": 1103,
168 | "cu1": 1114,
169 | "cu2": 1115,
170 | "cu4": 1116,
171 | "cuan1": 1124,
172 | "cuan2": 1125,
173 | "cuan4": 1126,
174 | "cui1": 1121,
175 | "cui3": 1122,
176 | "cui4": 1123,
177 | "cun1": 1127,
178 | "cun2": 1128,
179 | "cun3": 1129,
180 | "cun4": 1130,
181 | "cuo1": 1117,
182 | "cuo2": 1118,
183 | "cuo3": 1119,
184 | "cuo4": 1120,
185 | "da1": 211,
186 | "da2": 212,
187 | "da3": 213,
188 | "da4": 214,
189 | "da5": 215,
190 | "dai1": 218,
191 | "dai3": 219,
192 | "dai4": 220,
193 | "dan1": 229,
194 | "dan3": 230,
195 | "dan4": 231,
196 | "dang1": 232,
197 | "dang3": 233,
198 | "dang4": 234,
199 | "dao1": 222,
200 | "dao2": 223,
201 | "dao3": 224,
202 | "dao4": 225,
203 | "de2": 216,
204 | "de5": 217,
205 | "dei3": 221,
206 | "deng1": 235,
207 | "deng4": 236,
208 | "di1": 237,
209 | "di2": 238,
210 | "di3": 239,
211 | "di4": 240,
212 | "di5": 241,
213 | "dia1": 242,
214 | "dian1": 250,
215 | "dian3": 251,
216 | "dian4": 252,
217 | "diao1": 246,
218 | "diao3": 247,
219 | "diao4": 248,
220 | "die1": 243,
221 | "die2": 244,
222 | "die5": 245,
223 | "ding1": 254,
224 | "ding3": 255,
225 | "ding4": 256,
226 | "diu1": 249,
227 | "dong1": 272,
228 | "dong3": 273,
229 | "dong4": 274,
230 | "dou1": 226,
231 | "dou3": 227,
232 | "dou4": 228,
233 | "du1": 257,
234 | "du2": 258,
235 | "du3": 259,
236 | "du4": 260,
237 | "duan1": 268,
238 | "dui1": 266,
239 | "dui4": 267,
240 | "dun1": 269,
241 | "dun3": 270,
242 | "dun4": 271,
243 | "duo1": 261,
244 | "duo2": 262,
245 | "duo3": 263,
246 | "duo4": 264,
247 | "duo5": 265,
248 | "e1": 1184,
249 | "e2": 1185,
250 | "e3": 1186,
251 | "e4": 1187,
252 | "ei4": 1193,
253 | "en1": 1206,
254 | "en3": 1207,
255 | "en5": 1208,
256 | "eng1": 1212,
257 | "er1": 1213,
258 | "er2": 1214,
259 | "er3": 1215,
260 | "er4": 1216,
261 | "fa1": 175,
262 | "fa2": 176,
263 | "fa3": 177,
264 | "fa4": 178,
265 | "fan1": 189,
266 | "fan2": 190,
267 | "fan3": 191,
268 | "fan4": 192,
269 | "fang1": 197,
270 | "fang2": 198,
271 | "fang3": 199,
272 | "fang4": 200,
273 | "fei1": 181,
274 | "fei2": 182,
275 | "fei3": 183,
276 | "fei4": 184,
277 | "fen1": 193,
278 | "fen2": 194,
279 | "fen4": 195,
280 | "fen5": 196,
281 | "feng1": 201,
282 | "feng2": 202,
283 | "feng3": 203,
284 | "feng4": 204,
285 | "fo2": 179,
286 | "fo4": 180,
287 | "fou1": 185,
288 | "fou2": 186,
289 | "fou3": 187,
290 | "fou4": 188,
291 | "fu1": 205,
292 | "fu2": 206,
293 | "fu3": 207,
294 | "fu4": 208,
295 | "fu5": 209,
296 | "ga1": 489,
297 | "ga2": 490,
298 | "ga4": 491,
299 | "ga5": 492,
300 | "gai1": 498,
301 | "gai3": 499,
302 | "gai4": 500,
303 | "gan1": 508,
304 | "gan3": 509,
305 | "gan4": 510,
306 | "gang1": 513,
307 | "gang3": 514,
308 | "gang4": 515,
309 | "gao1": 502,
310 | "gao3": 503,
311 | "gao4": 504,
312 | "ge1": 493,
313 | "ge2": 494,
314 | "ge3": 495,
315 | "ge4": 496,
316 | "ge5": 497,
317 | "gei3": 501,
318 | "gen3": 511,
319 | "gen4": 512,
320 | "geng1": 516,
321 | "geng2": 517,
322 | "geng3": 518,
323 | "geng4": 519,
324 | "gong1": 545,
325 | "gong3": 546,
326 | "gong4": 547,
327 | "gong5": 548,
328 | "gou1": 505,
329 | "gou3": 506,
330 | "gou4": 507,
331 | "gu1": 521,
332 | "gu2": 522,
333 | "gu3": 523,
334 | "gu4": 524,
335 | "gu5": 525,
336 | "gua1": 526,
337 | "gua4": 527,
338 | "guai1": 532,
339 | "guai4": 533,
340 | "guan1": 537,
341 | "guan3": 538,
342 | "guan4": 539,
343 | "guang1": 542,
344 | "guang3": 543,
345 | "guang4": 544,
346 | "gui1": 534,
347 | "gui3": 535,
348 | "gui4": 536,
349 | "gun3": 540,
350 | "gun4": 541,
351 | "guo1": 528,
352 | "guo2": 529,
353 | "guo3": 530,
354 | "guo4": 531,
355 | "ha1": 596,
356 | "ha2": 597,
357 | "ha3": 598,
358 | "hai1": 602,
359 | "hai2": 603,
360 | "hai4": 604,
361 | "han1": 615,
362 | "han2": 616,
363 | "han3": 617,
364 | "han4": 618,
365 | "hang1": 621,
366 | "hang2": 622,
367 | "hang3": 623,
368 | "hang4": 624,
369 | "hao1": 607,
370 | "hao2": 608,
371 | "hao3": 609,
372 | "hao4": 610,
373 | "he1": 599,
374 | "he2": 600,
375 | "he4": 601,
376 | "hei1": 605,
377 | "hei3": 606,
378 | "hen2": 619,
379 | "hen3": 620,
380 | "heng1": 625,
381 | "heng2": 626,
382 | "heng4": 627,
383 | "hong1": 660,
384 | "hong2": 661,
385 | "hong3": 662,
386 | "hong4": 663,
387 | "hou1": 611,
388 | "hou2": 612,
389 | "hou3": 613,
390 | "hou4": 614,
391 | "hu1": 628,
392 | "hu2": 629,
393 | "hu3": 630,
394 | "hu4": 631,
395 | "hua1": 632,
396 | "hua2": 633,
397 | "hua3": 634,
398 | "hua4": 635,
399 | "huai2": 641,
400 | "huai4": 642,
401 | "huan1": 647,
402 | "huan2": 648,
403 | "huan3": 649,
404 | "huan4": 650,
405 | "huang1": 655,
406 | "huang2": 656,
407 | "huang3": 657,
408 | "huang4": 658,
409 | "huang5": 659,
410 | "hui1": 643,
411 | "hui2": 644,
412 | "hui3": 645,
413 | "hui4": 646,
414 | "hun1": 651,
415 | "hun2": 652,
416 | "hun3": 653,
417 | "hun4": 654,
418 | "huo1": 636,
419 | "huo2": 637,
420 | "huo3": 638,
421 | "huo4": 639,
422 | "huo5": 640,
423 | "ji1": 664,
424 | "ji2": 665,
425 | "ji3": 666,
426 | "ji4": 667,
427 | "jia1": 668,
428 | "jia2": 669,
429 | "jia3": 670,
430 | "jia4": 671,
431 | "jia5": 672,
432 | "jian1": 686,
433 | "jian3": 687,
434 | "jian4": 688,
435 | "jiang1": 692,
436 | "jiang3": 693,
437 | "jiang4": 694,
438 | "jiao1": 678,
439 | "jiao2": 679,
440 | "jiao3": 680,
441 | "jiao4": 681,
442 | "jie1": 673,
443 | "jie2": 674,
444 | "jie3": 675,
445 | "jie4": 676,
446 | "jie5": 677,
447 | "jin1": 689,
448 | "jin3": 690,
449 | "jin4": 691,
450 | "jing1": 695,
451 | "jing3": 696,
452 | "jing4": 697,
453 | "jiong1": 712,
454 | "jiong3": 713,
455 | "jiu1": 682,
456 | "jiu3": 683,
457 | "jiu4": 684,
458 | "jiu5": 685,
459 | "ju1": 698,
460 | "ju2": 699,
461 | "ju3": 700,
462 | "ju4": 701,
463 | "juan1": 706,
464 | "juan3": 707,
465 | "juan4": 708,
466 | "jue1": 702,
467 | "jue2": 703,
468 | "jue3": 704,
469 | "jue4": 705,
470 | "jun1": 709,
471 | "jun3": 710,
472 | "jun4": 711,
473 | "ka1": 549,
474 | "ka3": 550,
475 | "ka4": 551,
476 | "kai1": 556,
477 | "kai3": 557,
478 | "kai4": 558,
479 | "kan1": 563,
480 | "kan3": 564,
481 | "kan4": 565,
482 | "kang1": 568,
483 | "kang2": 569,
484 | "kang3": 570,
485 | "kang4": 571,
486 | "kao1": 559,
487 | "kao4": 560,
488 | "ke1": 552,
489 | "ke2": 553,
490 | "ke3": 554,
491 | "ke4": 555,
492 | "ken3": 566,
493 | "ken4": 567,
494 | "keng1": 572,
495 | "keng3": 573,
496 | "kong1": 593,
497 | "kong3": 594,
498 | "kong4": 595,
499 | "kou1": 561,
500 | "kou4": 562,
501 | "ku1": 574,
502 | "ku3": 575,
503 | "ku4": 576,
504 | "kua1": 577,
505 | "kua3": 578,
506 | "kuai1": 580,
507 | "kuai3": 581,
508 | "kuai4": 582,
509 | "kuan3": 587,
510 | "kuang1": 590,
511 | "kuang3": 591,
512 | "kuang4": 592,
513 | "kui1": 583,
514 | "kui2": 584,
515 | "kui3": 585,
516 | "kui4": 586,
517 | "kun1": 588,
518 | "kun3": 589,
519 | "kuo4": 579,
520 | "la1": 399,
521 | "la2": 400,
522 | "la3": 401,
523 | "la4": 402,
524 | "la5": 403,
525 | "lai2": 408,
526 | "lai4": 409,
527 | "lan2": 424,
528 | "lan3": 425,
529 | "lan4": 426,
530 | "lang1": 427,
531 | "lang2": 428,
532 | "lang3": 429,
533 | "lang4": 430,
534 | "lao1": 414,
535 | "lao2": 415,
536 | "lao3": 416,
537 | "lao4": 417,
538 | "lao5": 418,
539 | "le1": 405,
540 | "le4": 406,
541 | "le5": 407,
542 | "lei1": 410,
543 | "lei2": 411,
544 | "lei3": 412,
545 | "lei4": 413,
546 | "leng1": 431,
547 | "leng2": 432,
548 | "leng4": 433,
549 | "li1": 434,
550 | "li2": 435,
551 | "li3": 436,
552 | "li4": 437,
553 | "li5": 438,
554 | "lia3": 439,
555 | "lian2": 453,
556 | "lian3": 454,
557 | "lian4": 455,
558 | "liang2": 459,
559 | "liang3": 460,
560 | "liang4": 461,
561 | "liao1": 445,
562 | "liao2": 446,
563 | "liao3": 447,
564 | "liao4": 448,
565 | "lie1": 440,
566 | "lie2": 441,
567 | "lie3": 442,
568 | "lie4": 443,
569 | "lie5": 444,
570 | "lin2": 456,
571 | "lin3": 457,
572 | "lin4": 458,
573 | "ling2": 462,
574 | "ling3": 463,
575 | "ling4": 464,
576 | "liu1": 449,
577 | "liu2": 450,
578 | "liu3": 451,
579 | "liu4": 452,
580 | "lo5": 404,
581 | "long2": 479,
582 | "long3": 480,
583 | "long4": 481,
584 | "lou1": 419,
585 | "lou2": 420,
586 | "lou3": 421,
587 | "lou4": 422,
588 | "lou5": 423,
589 | "lu2": 465,
590 | "lu3": 466,
591 | "lu4": 467,
592 | "luan2": 473,
593 | "luan3": 474,
594 | "luan4": 475,
595 | "lun1": 476,
596 | "lun2": 477,
597 | "lun4": 478,
598 | "luo1": 468,
599 | "luo2": 469,
600 | "luo3": 470,
601 | "luo4": 471,
602 | "luo5": 472,
603 | "lv2": 482,
604 | "lv3": 483,
605 | "lv4": 484,
606 | "lve4": 485,
607 | "ma1": 117,
608 | "ma2": 118,
609 | "ma3": 119,
610 | "ma4": 120,
611 | "ma5": 121,
612 | "mai2": 128,
613 | "mai4": 129,
614 | "man1": 140,
615 | "man2": 141,
616 | "man3": 142,
617 | "man4": 143,
618 | "mang2": 148,
619 | "mang3": 149,
620 | "mao1": 133,
621 | "mao2": 134,
622 | "mao3": 135,
623 | "mao4": 136,
624 | "me5": 127,
625 | "mei2": 130,
626 | "mei4": 131,
627 | "mei5": 132,
628 | "men1": 144,
629 | "men2": 145,
630 | "men4": 146,
631 | "men5": 147,
632 | "meng1": 150,
633 | "meng2": 151,
634 | "meng3": 152,
635 | "meng4": 153,
636 | "mi1": 154,
637 | "mi2": 155,
638 | "mi3": 156,
639 | "mi4": 157,
640 | "mian2": 164,
641 | "mian3": 165,
642 | "mian4": 166,
643 | "miao3": 160,
644 | "miao4": 161,
645 | "mie1": 158,
646 | "mie4": 159,
647 | "min2": 167,
648 | "min3": 168,
649 | "ming2": 169,
650 | "ming3": 170,
651 | "ming4": 171,
652 | "miu1": 162,
653 | "miu4": 163,
654 | "mo1": 122,
655 | "mo2": 123,
656 | "mo3": 124,
657 | "mo4": 125,
658 | "mo5": 126,
659 | "mou2": 137,
660 | "mou3": 138,
661 | "mou4": 139,
662 | "mu2": 172,
663 | "mu3": 173,
664 | "mu4": 174,
665 | "na1": 341,
666 | "na2": 342,
667 | "na3": 343,
668 | "na4": 344,
669 | "na5": 345,
670 | "nai3": 350,
671 | "nai4": 351,
672 | "nai5": 352,
673 | "nan1": 361,
674 | "nan2": 362,
675 | "nan3": 363,
676 | "nan4": 364,
677 | "nang1": 365,
678 | "nang2": 366,
679 | "nang5": 367,
680 | "nao1": 355,
681 | "nao2": 356,
682 | "nao3": 357,
683 | "nao4": 358,
684 | "ne1": 346,
685 | "ne2": 347,
686 | "ne4": 348,
687 | "ne5": 349,
688 | "nei3": 353,
689 | "nei4": 354,
690 | "neng2": 368,
691 | "neng4": 369,
692 | "ni2": 370,
693 | "ni3": 371,
694 | "ni4": 372,
695 | "nian1": 380,
696 | "nian2": 381,
697 | "nian3": 382,
698 | "nian4": 383,
699 | "niao3": 376,
700 | "niao4": 377,
701 | "nie1": 373,
702 | "nie2": 374,
703 | "nie4": 375,
704 | "nin2": 384,
705 | "ning2": 385,
706 | "ning3": 386,
707 | "ning4": 387,
708 | "niu3": 378,
709 | "niu4": 379,
710 | "nong2": 394,
711 | "nong3": 395,
712 | "nong4": 396,
713 | "nou2": 359,
714 | "nou4": 360,
715 | "nu2": 388,
716 | "nuan2": 392,
717 | "nuan3": 393,
718 | "nuo2": 389,
719 | "nuo3": 390,
720 | "nuo4": 391,
721 | "nv3": 397,
722 | "nv4": 398,
723 | "o1": 1181,
724 | "o2": 1182,
725 | "o3": 1183,
726 | "ou1": 1198,
727 | "ou2": 1199,
728 | "ou3": 1200,
729 | "ou4": 1201,
730 | "pa1": 54,
731 | "pa2": 55,
732 | "pa4": 56,
733 | "pa5": 57,
734 | "pai1": 63,
735 | "pai2": 64,
736 | "pai3": 65,
737 | "pan1": 77,
738 | "pan2": 78,
739 | "pan3": 79,
740 | "pan4": 80,
741 | "pang1": 84,
742 | "pang2": 85,
743 | "pang4": 86,
744 | "pao1": 70,
745 | "pao2": 71,
746 | "pao3": 72,
747 | "pao4": 73,
748 | "pei1": 66,
749 | "pei2": 67,
750 | "pei3": 68,
751 | "pei4": 69,
752 | "pen1": 81,
753 | "pen2": 82,
754 | "pen4": 83,
755 | "peng1": 87,
756 | "peng2": 88,
757 | "peng3": 89,
758 | "peng4": 90,
759 | "pi1": 91,
760 | "pi2": 92,
761 | "pi3": 93,
762 | "pi4": 94,
763 | "pian1": 102,
764 | "pian2": 103,
765 | "pian3": 104,
766 | "pian4": 105,
767 | "piao1": 98,
768 | "piao2": 99,
769 | "piao3": 100,
770 | "piao4": 101,
771 | "pie1": 95,
772 | "pie3": 96,
773 | "pie4": 97,
774 | "pin1": 106,
775 | "pin2": 107,
776 | "pin4": 108,
777 | "ping1": 109,
778 | "ping2": 110,
779 | "ping3": 111,
780 | "ping4": 112,
781 | "po1": 58,
782 | "po2": 59,
783 | "po3": 60,
784 | "po4": 61,
785 | "po5": 62,
786 | "pou1": 74,
787 | "pou2": 75,
788 | "pou3": 76,
789 | "pu1": 113,
790 | "pu2": 114,
791 | "pu3": 115,
792 | "pu4": 116,
793 | "qi1": 714,
794 | "qi2": 715,
795 | "qi3": 716,
796 | "qi4": 717,
797 | "qia1": 718,
798 | "qia2": 719,
799 | "qia3": 720,
800 | "qia4": 721,
801 | "qian1": 733,
802 | "qian2": 734,
803 | "qian3": 735,
804 | "qian4": 736,
805 | "qiang1": 741,
806 | "qiang2": 742,
807 | "qiang3": 743,
808 | "qiang4": 744,
809 | "qiao1": 726,
810 | "qiao2": 727,
811 | "qiao3": 728,
812 | "qiao4": 729,
813 | "qie1": 722,
814 | "qie2": 723,
815 | "qie3": 724,
816 | "qie4": 725,
817 | "qin1": 737,
818 | "qin2": 738,
819 | "qin3": 739,
820 | "qin4": 740,
821 | "qing1": 745,
822 | "qing2": 746,
823 | "qing3": 747,
824 | "qing4": 748,
825 | "qiong1": 761,
826 | "qiong2": 762,
827 | "qiong3": 763,
828 | "qiu1": 730,
829 | "qiu2": 731,
830 | "qiu3": 732,
831 | "qu1": 749,
832 | "qu2": 750,
833 | "qu3": 751,
834 | "qu4": 752,
835 | "quan1": 755,
836 | "quan2": 756,
837 | "quan3": 757,
838 | "quan4": 758,
839 | "que1": 753,
840 | "que4": 754,
841 | "qun1": 759,
842 | "qun2": 760,
843 | "ran2": 1016,
844 | "ran3": 1017,
845 | "rang2": 1021,
846 | "rang3": 1022,
847 | "rang4": 1023,
848 | "rao2": 1011,
849 | "rao3": 1012,
850 | "re2": 1008,
851 | "re3": 1009,
852 | "re4": 1010,
853 | "ren2": 1018,
854 | "ren3": 1019,
855 | "ren4": 1020,
856 | "reng1": 1024,
857 | "reng2": 1025,
858 | "reng3": 1026,
859 | "ri4": 1007,
860 | "rong2": 1039,
861 | "rong3": 1040,
862 | "rou2": 1013,
863 | "rou3": 1014,
864 | "rou4": 1015,
865 | "ru2": 1027,
866 | "ru3": 1028,
867 | "ru4": 1029,
868 | "ruan2": 1035,
869 | "ruan3": 1036,
870 | "rui2": 1032,
871 | "rui3": 1033,
872 | "rui4": 1034,
873 | "run1": 1037,
874 | "run2": 1038,
875 | "ruo2": 1030,
876 | "ruo4": 1031,
877 | "sa1": 1138,
878 | "sa3": 1139,
879 | "sa4": 1140,
880 | "sai1": 1142,
881 | "sai4": 1143,
882 | "san1": 1151,
883 | "san3": 1152,
884 | "san4": 1153,
885 | "sang1": 1155,
886 | "sang4": 1156,
887 | "sao1": 1144,
888 | "sao3": 1145,
889 | "sao4": 1146,
890 | "sao5": 1147,
891 | "se4": 1141,
892 | "sen1": 1154,
893 | "sha1": 955,
894 | "sha3": 956,
895 | "sha4": 957,
896 | "shai3": 962,
897 | "shai4": 963,
898 | "shan1": 973,
899 | "shan3": 974,
900 | "shan4": 975,
901 | "shang1": 981,
902 | "shang3": 982,
903 | "shang4": 983,
904 | "shang5": 984,
905 | "shao1": 965,
906 | "shao2": 966,
907 | "shao3": 967,
908 | "shao4": 968,
909 | "she1": 958,
910 | "she2": 959,
911 | "she3": 960,
912 | "she4": 961,
913 | "shei2": 964,
914 | "shen1": 976,
915 | "shen2": 977,
916 | "shen3": 978,
917 | "shen4": 979,
918 | "shen5": 980,
919 | "sheng1": 985,
920 | "sheng2": 986,
921 | "sheng3": 987,
922 | "sheng4": 988,
923 | "sheng5": 989,
924 | "shi1": 950,
925 | "shi2": 951,
926 | "shi3": 952,
927 | "shi4": 953,
928 | "shi5": 954,
929 | "shou1": 969,
930 | "shou2": 970,
931 | "shou3": 971,
932 | "shou4": 972,
933 | "shu1": 990,
934 | "shu2": 991,
935 | "shu3": 992,
936 | "shu4": 993,
937 | "shu5": 994,
938 | "shua1": 995,
939 | "shuai1": 998,
940 | "shuai4": 999,
941 | "shuan4": 1002,
942 | "shuang1": 1005,
943 | "shuang3": 1006,
944 | "shui2": 1000,
945 | "shui4": 1001,
946 | "shun3": 1003,
947 | "shun4": 1004,
948 | "shuo1": 996,
949 | "shuo4": 997,
950 | "si1": 1134,
951 | "si3": 1135,
952 | "si4": 1136,
953 | "si5": 1137,
954 | "song1": 1172,
955 | "song2": 1173,
956 | "song3": 1174,
957 | "song4": 1175,
958 | "sou1": 1148,
959 | "sou3": 1149,
960 | "sou4": 1150,
961 | "su1": 1157,
962 | "su4": 1158,
963 | "suan3": 1167,
964 | "suan4": 1168,
965 | "sui1": 1163,
966 | "sui2": 1164,
967 | "sui3": 1165,
968 | "sui4": 1166,
969 | "sun1": 1169,
970 | "sun3": 1170,
971 | "sun4": 1171,
972 | "suo1": 1159,
973 | "suo2": 1160,
974 | "suo3": 1161,
975 | "suo4": 1162,
976 | "ta1": 275,
977 | "ta3": 276,
978 | "ta4": 277,
979 | "tai1": 280,
980 | "tai2": 281,
981 | "tai4": 282,
982 | "tai5": 283,
983 | "tan1": 290,
984 | "tan2": 291,
985 | "tan3": 292,
986 | "tan4": 293,
987 | "tang1": 294,
988 | "tang2": 295,
989 | "tang3": 296,
990 | "tang4": 297,
991 | "tao1": 284,
992 | "tao2": 285,
993 | "te1": 278,
994 | "te4": 279,
995 | "teng1": 298,
996 | "teng2": 299,
997 | "teng5": 300,
998 | "ti1": 301,
999 | "ti2": 302,
1000 | "ti3": 303,
1001 | "ti4": 304,
1002 | "tian2": 312,
1003 | "tian3": 313,
1004 | "tian4": 314,
1005 | "tiao1": 308,
1006 | "tiao2": 309,
1007 | "tiao3": 310,
1008 | "tiao4": 311,
1009 | "tie1": 305,
1010 | "tie3": 306,
1011 | "tie4": 307,
1012 | "ting1": 315,
1013 | "ting2": 316,
1014 | "ting3": 317,
1015 | "ting4": 318,
1016 | "tong1": 337,
1017 | "tong2": 338,
1018 | "tong3": 339,
1019 | "tong4": 340,
1020 | "tou1": 286,
1021 | "tou2": 287,
1022 | "tou3": 288,
1023 | "tou5": 289,
1024 | "tu1": 319,
1025 | "tu2": 320,
1026 | "tu3": 321,
1027 | "tu4": 322,
1028 | "tuan2": 331,
1029 | "tuan3": 332,
1030 | "tui1": 327,
1031 | "tui2": 328,
1032 | "tui3": 329,
1033 | "tui4": 330,
1034 | "tun1": 333,
1035 | "tun2": 334,
1036 | "tun3": 335,
1037 | "tun4": 336,
1038 | "tuo1": 323,
1039 | "tuo2": 324,
1040 | "tuo3": 325,
1041 | "tuo4": 326,
1042 | "wa1": 1259,
1043 | "wa2": 1260,
1044 | "wa3": 1261,
1045 | "wa4": 1262,
1046 | "wa5": 1263,
1047 | "wai1": 1267,
1048 | "wai3": 1268,
1049 | "wan1": 1273,
1050 | "wan2": 1274,
1051 | "wan3": 1275,
1052 | "wan4": 1276,
1053 | "wang2": 1280,
1054 | "wang3": 1281,
1055 | "wang4": 1282,
1056 | "wei1": 1269,
1057 | "wei2": 1270,
1058 | "wei3": 1271,
1059 | "wei4": 1272,
1060 | "wen2": 1277,
1061 | "wen3": 1278,
1062 | "wen4": 1279,
1063 | "weng1": 1283,
1064 | "weng3": 1284,
1065 | "wo1": 1264,
1066 | "wo3": 1265,
1067 | "wo4": 1266,
1068 | "wu1": 1255,
1069 | "wu2": 1256,
1070 | "wu3": 1257,
1071 | "wu4": 1258,
1072 | "xi1": 764,
1073 | "xi2": 765,
1074 | "xi3": 766,
1075 | "xi4": 767,
1076 | "xi5": 768,
1077 | "xia1": 769,
1078 | "xia2": 770,
1079 | "xia3": 771,
1080 | "xia4": 772,
1081 | "xian1": 785,
1082 | "xian2": 786,
1083 | "xian3": 787,
1084 | "xian4": 788,
1085 | "xiang1": 793,
1086 | "xiang2": 794,
1087 | "xiang3": 795,
1088 | "xiang4": 796,
1089 | "xiao1": 778,
1090 | "xiao2": 779,
1091 | "xiao3": 780,
1092 | "xiao4": 781,
1093 | "xie1": 773,
1094 | "xie2": 774,
1095 | "xie3": 775,
1096 | "xie4": 776,
1097 | "xie5": 777,
1098 | "xin1": 789,
1099 | "xin2": 790,
1100 | "xin3": 791,
1101 | "xin4": 792,
1102 | "xing1": 797,
1103 | "xing2": 798,
1104 | "xing3": 799,
1105 | "xing4": 800,
1106 | "xing5": 801,
1107 | "xiong1": 817,
1108 | "xiong2": 818,
1109 | "xiong3": 819,
1110 | "xiong4": 820,
1111 | "xiu1": 782,
1112 | "xiu3": 783,
1113 | "xiu4": 784,
1114 | "xu1": 802,
1115 | "xu2": 803,
1116 | "xu3": 804,
1117 | "xu4": 805,
1118 | "xuan1": 810,
1119 | "xuan2": 811,
1120 | "xuan3": 812,
1121 | "xuan4": 813,
1122 | "xue1": 806,
1123 | "xue2": 807,
1124 | "xue3": 808,
1125 | "xue4": 809,
1126 | "xun1": 814,
1127 | "xun2": 815,
1128 | "xun4": 816,
1129 | "ya1": 1221,
1130 | "ya2": 1222,
1131 | "ya3": 1223,
1132 | "ya4": 1224,
1133 | "ya5": 1225,
1134 | "yai2": 1230,
1135 | "yan1": 1239,
1136 | "yan2": 1240,
1137 | "yan3": 1241,
1138 | "yan4": 1242,
1139 | "yang1": 1247,
1140 | "yang2": 1248,
1141 | "yang3": 1249,
1142 | "yang4": 1250,
1143 | "yao1": 1231,
1144 | "yao2": 1232,
1145 | "yao3": 1233,
1146 | "yao4": 1234,
1147 | "ye1": 1226,
1148 | "ye2": 1227,
1149 | "ye4": 1228,
1150 | "ye5": 1229,
1151 | "yi1": 1217,
1152 | "yi2": 1218,
1153 | "yi3": 1219,
1154 | "yi4": 1220,
1155 | "yin1": 1243,
1156 | "yin2": 1244,
1157 | "yin3": 1245,
1158 | "yin4": 1246,
1159 | "ying1": 1251,
1160 | "ying2": 1252,
1161 | "ying3": 1253,
1162 | "ying4": 1254,
1163 | "yong1": 1301,
1164 | "yong2": 1302,
1165 | "yong3": 1303,
1166 | "yong4": 1304,
1167 | "you1": 1235,
1168 | "you2": 1236,
1169 | "you3": 1237,
1170 | "you4": 1238,
1171 | "yu1": 1285,
1172 | "yu2": 1286,
1173 | "yu3": 1287,
1174 | "yu4": 1288,
1175 | "yu5": 1289,
1176 | "yuan1": 1292,
1177 | "yuan2": 1293,
1178 | "yuan3": 1294,
1179 | "yuan4": 1295,
1180 | "yue1": 1290,
1181 | "yue4": 1291,
1182 | "yun1": 1296,
1183 | "yun2": 1297,
1184 | "yun3": 1298,
1185 | "yun4": 1299,
1186 | "za1": 1045,
1187 | "za2": 1046,
1188 | "zai1": 1050,
1189 | "zai3": 1051,
1190 | "zai4": 1052,
1191 | "zan1": 1061,
1192 | "zan2": 1062,
1193 | "zan3": 1063,
1194 | "zan4": 1064,
1195 | "zang1": 1067,
1196 | "zang3": 1068,
1197 | "zang4": 1069,
1198 | "zao1": 1054,
1199 | "zao2": 1055,
1200 | "zao3": 1056,
1201 | "zao4": 1057,
1202 | "ze2": 1047,
1203 | "ze3": 1048,
1204 | "ze4": 1049,
1205 | "zei2": 1053,
1206 | "zen1": 1065,
1207 | "zen3": 1066,
1208 | "zeng1": 1070,
1209 | "zeng4": 1071,
1210 | "zha1": 825,
1211 | "zha2": 826,
1212 | "zha3": 827,
1213 | "zha4": 828,
1214 | "zhai1": 834,
1215 | "zhai2": 835,
1216 | "zhai3": 836,
1217 | "zhai4": 837,
1218 | "zhan1": 847,
1219 | "zhan3": 848,
1220 | "zhan4": 849,
1221 | "zhang1": 853,
1222 | "zhang3": 854,
1223 | "zhang4": 855,
1224 | "zhao1": 839,
1225 | "zhao2": 840,
1226 | "zhao3": 841,
1227 | "zhao4": 842,
1228 | "zhe1": 829,
1229 | "zhe2": 830,
1230 | "zhe3": 831,
1231 | "zhe4": 832,
1232 | "zhe5": 833,
1233 | "zhei4": 838,
1234 | "zhen1": 850,
1235 | "zhen3": 851,
1236 | "zhen4": 852,
1237 | "zheng1": 856,
1238 | "zheng3": 857,
1239 | "zheng4": 858,
1240 | "zhi1": 821,
1241 | "zhi2": 822,
1242 | "zhi3": 823,
1243 | "zhi4": 824,
1244 | "zhong1": 881,
1245 | "zhong3": 882,
1246 | "zhong4": 883,
1247 | "zhou1": 843,
1248 | "zhou2": 844,
1249 | "zhou3": 845,
1250 | "zhou4": 846,
1251 | "zhu1": 859,
1252 | "zhu2": 860,
1253 | "zhu3": 861,
1254 | "zhu4": 862,
1255 | "zhua1": 863,
1256 | "zhua3": 864,
1257 | "zhuai1": 867,
1258 | "zhuai3": 868,
1259 | "zhuai4": 869,
1260 | "zhuan1": 872,
1261 | "zhuan3": 873,
1262 | "zhuan4": 874,
1263 | "zhuang1": 878,
1264 | "zhuang3": 879,
1265 | "zhuang4": 880,
1266 | "zhui1": 870,
1267 | "zhui4": 871,
1268 | "zhun1": 875,
1269 | "zhun3": 876,
1270 | "zhun4": 877,
1271 | "zhuo1": 865,
1272 | "zhuo2": 866,
1273 | "zi1": 1041,
1274 | "zi3": 1042,
1275 | "zi4": 1043,
1276 | "zi5": 1044,
1277 | "zong1": 1088,
1278 | "zong3": 1089,
1279 | "zong4": 1090,
1280 | "zou1": 1058,
1281 | "zou3": 1059,
1282 | "zou4": 1060,
1283 | "zu2": 1072,
1284 | "zu3": 1073,
1285 | "zu4": 1074,
1286 | "zuan1": 1082,
1287 | "zuan3": 1083,
1288 | "zuan4": 1084,
1289 | "zui1": 1079,
1290 | "zui3": 1080,
1291 | "zui4": 1081,
1292 | "zun1": 1085,
1293 | "zun3": 1086,
1294 | "zun4": 1087,
1295 | "zuo1": 1075,
1296 | "zuo2": 1076,
1297 | "zuo3": 1077,
1298 | "zuo4": 1078,
1299 | "ㄈㄨㄥ4": 210,
1300 | "ㄉㄧㄤ1": 253,
1301 | "ㄌㄩㄢ2": 486,
1302 | "ㄌㄩㄢ3": 487,
1303 | "ㄌㄩㄣ2": 488,
1304 | "ㄍㄧ2": 520,
1305 | "ㄝ4": 1188,
1306 | "ㄩㄤ4": 1300
1307 | }
--------------------------------------------------------------------------------
/resource/mini-bart-g2p.pt:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/second-state/gpt_sovits_rs/89ae6cdee6664071077c7883f1543694369be474/resource/mini-bart-g2p.pt
--------------------------------------------------------------------------------
/resource/rule.pest:
--------------------------------------------------------------------------------
1 | alpha = { 'a'..'z' | 'A'..'Z' }
2 | greek = { 'α'..'ω' | 'Α'..'Ω' }
3 | digit = { '0'..'9' }
4 | pn = { "+"|"-"|"*"|"×"|"÷"|"="|"/" }
5 | link = {"-"|":"|"."|"_"}
6 |
7 | flag = {"-"}
8 | integer = { (digit)+ }
9 | decimals = { integer? ~ "." ~ integer | integer ~ "." }
10 | fractional = { integer ~ "/" ~ integer }
11 | percent = { (decimals|integer)~"%" }
12 |
13 | num = {" "*~flag?~ (percent|decimals|fractional|integer)~" "* }
14 | expr = { (num|"("~expr~")")~(" "*~pn~" "*~(num|"("~expr~")"))+|num }
15 | signs = { (num|pn|"("|")"|" ")+ }
16 |
17 | word = { (alpha | digit | greek)+ }
18 | ident = { !digit~word~(link+~word)* }
19 |
20 | all = {ident|signs}
--------------------------------------------------------------------------------
/resource/symbols_v2.json:
--------------------------------------------------------------------------------
1 | {
2 | "!": 0,
3 | ",": 1,
4 | "-": 2,
5 | ".": 3,
6 | "?": 4,
7 | "AA": 5,
8 | "AA0": 6,
9 | "AA1": 7,
10 | "AA2": 8,
11 | "AE0": 9,
12 | "AE1": 10,
13 | "AE2": 11,
14 | "AH0": 12,
15 | "AH1": 13,
16 | "AH2": 14,
17 | "AO0": 15,
18 | "AO1": 16,
19 | "AO2": 17,
20 | "AW0": 18,
21 | "AW1": 19,
22 | "AW2": 20,
23 | "AY0": 21,
24 | "AY1": 22,
25 | "AY2": 23,
26 | "B": 24,
27 | "CH": 25,
28 | "D": 26,
29 | "DH": 27,
30 | "E1": 28,
31 | "E2": 29,
32 | "E3": 30,
33 | "E4": 31,
34 | "E5": 32,
35 | "EE": 33,
36 | "EH0": 34,
37 | "EH1": 35,
38 | "EH2": 36,
39 | "ER": 37,
40 | "ER0": 38,
41 | "ER1": 39,
42 | "ER2": 40,
43 | "EY0": 41,
44 | "EY1": 42,
45 | "EY2": 43,
46 | "En1": 44,
47 | "En2": 45,
48 | "En3": 46,
49 | "En4": 47,
50 | "En5": 48,
51 | "F": 49,
52 | "G": 50,
53 | "HH": 51,
54 | "I": 52,
55 | "IH": 53,
56 | "IH0": 54,
57 | "IH1": 55,
58 | "IH2": 56,
59 | "IY0": 57,
60 | "IY1": 58,
61 | "IY2": 59,
62 | "JH": 60,
63 | "K": 61,
64 | "L": 62,
65 | "M": 63,
66 | "N": 64,
67 | "NG": 65,
68 | "OO": 66,
69 | "OW0": 67,
70 | "OW1": 68,
71 | "OW2": 69,
72 | "OY0": 70,
73 | "OY1": 71,
74 | "OY2": 72,
75 | "P": 73,
76 | "R": 74,
77 | "S": 75,
78 | "SH": 76,
79 | "SP": 77,
80 | "SP2": 78,
81 | "SP3": 79,
82 | "T": 80,
83 | "TH": 81,
84 | "U": 82,
85 | "UH0": 83,
86 | "UH1": 84,
87 | "UH2": 85,
88 | "UNK": 86,
89 | "UW0": 87,
90 | "UW1": 88,
91 | "UW2": 89,
92 | "V": 90,
93 | "W": 91,
94 | "Y": 92,
95 | "Z": 93,
96 | "ZH": 94,
97 | "_": 95,
98 | "a": 96,
99 | "a1": 97,
100 | "a2": 98,
101 | "a3": 99,
102 | "a4": 100,
103 | "a5": 101,
104 | "ai1": 102,
105 | "ai2": 103,
106 | "ai3": 104,
107 | "ai4": 105,
108 | "ai5": 106,
109 | "an1": 107,
110 | "an2": 108,
111 | "an3": 109,
112 | "an4": 110,
113 | "an5": 111,
114 | "ang1": 112,
115 | "ang2": 113,
116 | "ang3": 114,
117 | "ang4": 115,
118 | "ang5": 116,
119 | "ao1": 117,
120 | "ao2": 118,
121 | "ao3": 119,
122 | "ao4": 120,
123 | "ao5": 121,
124 | "b": 122,
125 | "by": 123,
126 | "c": 124,
127 | "ch": 125,
128 | "cl": 126,
129 | "d": 127,
130 | "dy": 128,
131 | "e": 129,
132 | "e1": 130,
133 | "e2": 131,
134 | "e3": 132,
135 | "e4": 133,
136 | "e5": 134,
137 | "ei1": 135,
138 | "ei2": 136,
139 | "ei3": 137,
140 | "ei4": 138,
141 | "ei5": 139,
142 | "en1": 140,
143 | "en2": 141,
144 | "en3": 142,
145 | "en4": 143,
146 | "en5": 144,
147 | "eng1": 145,
148 | "eng2": 146,
149 | "eng3": 147,
150 | "eng4": 148,
151 | "eng5": 149,
152 | "er1": 150,
153 | "er2": 151,
154 | "er3": 152,
155 | "er4": 153,
156 | "er5": 154,
157 | "f": 155,
158 | "g": 156,
159 | "gy": 157,
160 | "h": 158,
161 | "hy": 159,
162 | "i": 160,
163 | "i01": 161,
164 | "i02": 162,
165 | "i03": 163,
166 | "i04": 164,
167 | "i05": 165,
168 | "i1": 166,
169 | "i2": 167,
170 | "i3": 168,
171 | "i4": 169,
172 | "i5": 170,
173 | "ia1": 171,
174 | "ia2": 172,
175 | "ia3": 173,
176 | "ia4": 174,
177 | "ia5": 175,
178 | "ian1": 176,
179 | "ian2": 177,
180 | "ian3": 178,
181 | "ian4": 179,
182 | "ian5": 180,
183 | "iang1": 181,
184 | "iang2": 182,
185 | "iang3": 183,
186 | "iang4": 184,
187 | "iang5": 185,
188 | "iao1": 186,
189 | "iao2": 187,
190 | "iao3": 188,
191 | "iao4": 189,
192 | "iao5": 190,
193 | "ie1": 191,
194 | "ie2": 192,
195 | "ie3": 193,
196 | "ie4": 194,
197 | "ie5": 195,
198 | "in1": 196,
199 | "in2": 197,
200 | "in3": 198,
201 | "in4": 199,
202 | "in5": 200,
203 | "ing1": 201,
204 | "ing2": 202,
205 | "ing3": 203,
206 | "ing4": 204,
207 | "ing5": 205,
208 | "iong1": 206,
209 | "iong2": 207,
210 | "iong3": 208,
211 | "iong4": 209,
212 | "iong5": 210,
213 | "ir1": 211,
214 | "ir2": 212,
215 | "ir3": 213,
216 | "ir4": 214,
217 | "ir5": 215,
218 | "iu1": 216,
219 | "iu2": 217,
220 | "iu3": 218,
221 | "iu4": 219,
222 | "iu5": 220,
223 | "j": 221,
224 | "k": 222,
225 | "ky": 223,
226 | "l": 224,
227 | "m": 225,
228 | "my": 226,
229 | "n": 227,
230 | "ny": 228,
231 | "o": 229,
232 | "o1": 230,
233 | "o2": 231,
234 | "o3": 232,
235 | "o4": 233,
236 | "o5": 234,
237 | "ong1": 235,
238 | "ong2": 236,
239 | "ong3": 237,
240 | "ong4": 238,
241 | "ong5": 239,
242 | "ou1": 240,
243 | "ou2": 241,
244 | "ou3": 242,
245 | "ou4": 243,
246 | "ou5": 244,
247 | "p": 245,
248 | "py": 246,
249 | "q": 247,
250 | "r": 248,
251 | "ry": 249,
252 | "s": 250,
253 | "sh": 251,
254 | "t": 252,
255 | "ts": 253,
256 | "u": 254,
257 | "u1": 255,
258 | "u2": 256,
259 | "u3": 257,
260 | "u4": 258,
261 | "u5": 259,
262 | "ua1": 260,
263 | "ua2": 261,
264 | "ua3": 262,
265 | "ua4": 263,
266 | "ua5": 264,
267 | "uai1": 265,
268 | "uai2": 266,
269 | "uai3": 267,
270 | "uai4": 268,
271 | "uai5": 269,
272 | "uan1": 270,
273 | "uan2": 271,
274 | "uan3": 272,
275 | "uan4": 273,
276 | "uan5": 274,
277 | "uang1": 275,
278 | "uang2": 276,
279 | "uang3": 277,
280 | "uang4": 278,
281 | "uang5": 279,
282 | "ui1": 280,
283 | "ui2": 281,
284 | "ui3": 282,
285 | "ui4": 283,
286 | "ui5": 284,
287 | "un1": 285,
288 | "un2": 286,
289 | "un3": 287,
290 | "un4": 288,
291 | "un5": 289,
292 | "uo1": 290,
293 | "uo2": 291,
294 | "uo3": 292,
295 | "uo4": 293,
296 | "uo5": 294,
297 | "v": 295,
298 | "v1": 296,
299 | "v2": 297,
300 | "v3": 298,
301 | "v4": 299,
302 | "v5": 300,
303 | "van1": 301,
304 | "van2": 302,
305 | "van3": 303,
306 | "van4": 304,
307 | "van5": 305,
308 | "ve1": 306,
309 | "ve2": 307,
310 | "ve3": 308,
311 | "ve4": 309,
312 | "ve5": 310,
313 | "vn1": 311,
314 | "vn2": 312,
315 | "vn3": 313,
316 | "vn4": 314,
317 | "vn5": 315,
318 | "w": 316,
319 | "x": 317,
320 | "y": 318,
321 | "z": 319,
322 | "zh": 320,
323 | "\u2026": 321,
324 | "[": 322,
325 | "]": 323,
326 | "\u3131": 324,
327 | "\u3132": 325,
328 | "\u3134": 326,
329 | "\u3137": 327,
330 | "\u3138": 328,
331 | "\u3139": 329,
332 | "\u3141": 330,
333 | "\u3142": 331,
334 | "\u3143": 332,
335 | "\u3145": 333,
336 | "\u3146": 334,
337 | "\u3147": 335,
338 | "\u3148": 336,
339 | "\u3149": 337,
340 | "\u314a": 338,
341 | "\u314b": 339,
342 | "\u314c": 340,
343 | "\u314d": 341,
344 | "\u314e": 342,
345 | "\u314f": 343,
346 | "\u3150": 344,
347 | "\u3153": 345,
348 | "\u3154": 346,
349 | "\u3157": 347,
350 | "\u315c": 348,
351 | "\u3161": 349,
352 | "\u3163": 350,
353 | "\u505c": 351,
354 | "\u7a7a": 352,
355 | "Ya": 353,
356 | "Ya1": 354,
357 | "Ya2": 355,
358 | "Ya3": 356,
359 | "Ya4": 357,
360 | "Ya5": 358,
361 | "Ya6": 359,
362 | "Yaa": 360,
363 | "Yaa1": 361,
364 | "Yaa2": 362,
365 | "Yaa3": 363,
366 | "Yaa4": 364,
367 | "Yaa5": 365,
368 | "Yaa6": 366,
369 | "Yaai1": 367,
370 | "Yaai2": 368,
371 | "Yaai3": 369,
372 | "Yaai4": 370,
373 | "Yaai5": 371,
374 | "Yaai6": 372,
375 | "Yaak1": 373,
376 | "Yaak2": 374,
377 | "Yaak3": 375,
378 | "Yaak4": 376,
379 | "Yaak5": 377,
380 | "Yaak6": 378,
381 | "Yaam1": 379,
382 | "Yaam2": 380,
383 | "Yaam3": 381,
384 | "Yaam4": 382,
385 | "Yaam5": 383,
386 | "Yaam6": 384,
387 | "Yaan1": 385,
388 | "Yaan2": 386,
389 | "Yaan3": 387,
390 | "Yaan4": 388,
391 | "Yaan5": 389,
392 | "Yaan6": 390,
393 | "Yaang1": 391,
394 | "Yaang2": 392,
395 | "Yaang3": 393,
396 | "Yaang4": 394,
397 | "Yaang5": 395,
398 | "Yaang6": 396,
399 | "Yaap1": 397,
400 | "Yaap2": 398,
401 | "Yaap3": 399,
402 | "Yaap4": 400,
403 | "Yaap5": 401,
404 | "Yaap6": 402,
405 | "Yaat1": 403,
406 | "Yaat2": 404,
407 | "Yaat3": 405,
408 | "Yaat4": 406,
409 | "Yaat5": 407,
410 | "Yaat6": 408,
411 | "Yaau1": 409,
412 | "Yaau2": 410,
413 | "Yaau3": 411,
414 | "Yaau4": 412,
415 | "Yaau5": 413,
416 | "Yaau6": 414,
417 | "Yai": 415,
418 | "Yai1": 416,
419 | "Yai2": 417,
420 | "Yai3": 418,
421 | "Yai4": 419,
422 | "Yai5": 420,
423 | "Yai6": 421,
424 | "Yak": 422,
425 | "Yak1": 423,
426 | "Yak2": 424,
427 | "Yak3": 425,
428 | "Yak4": 426,
429 | "Yak5": 427,
430 | "Yak6": 428,
431 | "Yam1": 429,
432 | "Yam2": 430,
433 | "Yam3": 431,
434 | "Yam4": 432,
435 | "Yam5": 433,
436 | "Yam6": 434,
437 | "Yan1": 435,
438 | "Yan2": 436,
439 | "Yan3": 437,
440 | "Yan4": 438,
441 | "Yan5": 439,
442 | "Yan6": 440,
443 | "Yang1": 441,
444 | "Yang2": 442,
445 | "Yang3": 443,
446 | "Yang4": 444,
447 | "Yang5": 445,
448 | "Yang6": 446,
449 | "Yap1": 447,
450 | "Yap2": 448,
451 | "Yap3": 449,
452 | "Yap4": 450,
453 | "Yap5": 451,
454 | "Yap6": 452,
455 | "Yat1": 453,
456 | "Yat2": 454,
457 | "Yat3": 455,
458 | "Yat4": 456,
459 | "Yat5": 457,
460 | "Yat6": 458,
461 | "Yau": 459,
462 | "Yau1": 460,
463 | "Yau2": 461,
464 | "Yau3": 462,
465 | "Yau4": 463,
466 | "Yau5": 464,
467 | "Yau6": 465,
468 | "Yb": 466,
469 | "Yc": 467,
470 | "Yd": 468,
471 | "Ye": 469,
472 | "Ye1": 470,
473 | "Ye2": 471,
474 | "Ye3": 472,
475 | "Ye4": 473,
476 | "Ye5": 474,
477 | "Ye6": 475,
478 | "Yei1": 476,
479 | "Yei2": 477,
480 | "Yei3": 478,
481 | "Yei4": 479,
482 | "Yei5": 480,
483 | "Yei6": 481,
484 | "Yek1": 482,
485 | "Yek2": 483,
486 | "Yek3": 484,
487 | "Yek4": 485,
488 | "Yek5": 486,
489 | "Yek6": 487,
490 | "Yeng1": 488,
491 | "Yeng2": 489,
492 | "Yeng3": 490,
493 | "Yeng4": 491,
494 | "Yeng5": 492,
495 | "Yeng6": 493,
496 | "Yeoi1": 494,
497 | "Yeoi2": 495,
498 | "Yeoi3": 496,
499 | "Yeoi4": 497,
500 | "Yeoi5": 498,
501 | "Yeoi6": 499,
502 | "Yeon1": 500,
503 | "Yeon2": 501,
504 | "Yeon3": 502,
505 | "Yeon4": 503,
506 | "Yeon5": 504,
507 | "Yeon6": 505,
508 | "Yeot1": 506,
509 | "Yeot2": 507,
510 | "Yeot3": 508,
511 | "Yeot4": 509,
512 | "Yeot5": 510,
513 | "Yeot6": 511,
514 | "Yf": 512,
515 | "Yg": 513,
516 | "Yg1": 514,
517 | "Yg2": 515,
518 | "Yg3": 516,
519 | "Yg4": 517,
520 | "Yg5": 518,
521 | "Yg6": 519,
522 | "Ygw": 520,
523 | "Yh": 521,
524 | "Yi1": 522,
525 | "Yi2": 523,
526 | "Yi3": 524,
527 | "Yi4": 525,
528 | "Yi5": 526,
529 | "Yi6": 527,
530 | "Yik1": 528,
531 | "Yik2": 529,
532 | "Yik3": 530,
533 | "Yik4": 531,
534 | "Yik5": 532,
535 | "Yik6": 533,
536 | "Yim1": 534,
537 | "Yim2": 535,
538 | "Yim3": 536,
539 | "Yim4": 537,
540 | "Yim5": 538,
541 | "Yim6": 539,
542 | "Yin1": 540,
543 | "Yin2": 541,
544 | "Yin3": 542,
545 | "Yin4": 543,
546 | "Yin5": 544,
547 | "Yin6": 545,
548 | "Ying1": 546,
549 | "Ying2": 547,
550 | "Ying3": 548,
551 | "Ying4": 549,
552 | "Ying5": 550,
553 | "Ying6": 551,
554 | "Yip1": 552,
555 | "Yip2": 553,
556 | "Yip3": 554,
557 | "Yip4": 555,
558 | "Yip5": 556,
559 | "Yip6": 557,
560 | "Yit1": 558,
561 | "Yit2": 559,
562 | "Yit3": 560,
563 | "Yit4": 561,
564 | "Yit5": 562,
565 | "Yit6": 563,
566 | "Yiu1": 564,
567 | "Yiu2": 565,
568 | "Yiu3": 566,
569 | "Yiu4": 567,
570 | "Yiu5": 568,
571 | "Yiu6": 569,
572 | "Yj": 570,
573 | "Yk": 571,
574 | "Yk1": 572,
575 | "Yk2": 573,
576 | "Yk3": 574,
577 | "Yk4": 575,
578 | "Yk5": 576,
579 | "Yk6": 577,
580 | "Ykw": 578,
581 | "Yl": 579,
582 | "Ym": 580,
583 | "Ym1": 581,
584 | "Ym2": 582,
585 | "Ym3": 583,
586 | "Ym4": 584,
587 | "Ym5": 585,
588 | "Ym6": 586,
589 | "Yn": 587,
590 | "Yn1": 588,
591 | "Yn2": 589,
592 | "Yn3": 590,
593 | "Yn4": 591,
594 | "Yn5": 592,
595 | "Yn6": 593,
596 | "Yng": 594,
597 | "Yo": 595,
598 | "Yo1": 596,
599 | "Yo2": 597,
600 | "Yo3": 598,
601 | "Yo4": 599,
602 | "Yo5": 600,
603 | "Yo6": 601,
604 | "Yoe1": 602,
605 | "Yoe2": 603,
606 | "Yoe3": 604,
607 | "Yoe4": 605,
608 | "Yoe5": 606,
609 | "Yoe6": 607,
610 | "Yoek1": 608,
611 | "Yoek2": 609,
612 | "Yoek3": 610,
613 | "Yoek4": 611,
614 | "Yoek5": 612,
615 | "Yoek6": 613,
616 | "Yoeng1": 614,
617 | "Yoeng2": 615,
618 | "Yoeng3": 616,
619 | "Yoeng4": 617,
620 | "Yoeng5": 618,
621 | "Yoeng6": 619,
622 | "Yoi": 620,
623 | "Yoi1": 621,
624 | "Yoi2": 622,
625 | "Yoi3": 623,
626 | "Yoi4": 624,
627 | "Yoi5": 625,
628 | "Yoi6": 626,
629 | "Yok": 627,
630 | "Yok1": 628,
631 | "Yok2": 629,
632 | "Yok3": 630,
633 | "Yok4": 631,
634 | "Yok5": 632,
635 | "Yok6": 633,
636 | "Yon": 634,
637 | "Yon1": 635,
638 | "Yon2": 636,
639 | "Yon3": 637,
640 | "Yon4": 638,
641 | "Yon5": 639,
642 | "Yon6": 640,
643 | "Yong1": 641,
644 | "Yong2": 642,
645 | "Yong3": 643,
646 | "Yong4": 644,
647 | "Yong5": 645,
648 | "Yong6": 646,
649 | "Yot1": 647,
650 | "Yot2": 648,
651 | "Yot3": 649,
652 | "Yot4": 650,
653 | "Yot5": 651,
654 | "Yot6": 652,
655 | "You": 653,
656 | "You1": 654,
657 | "You2": 655,
658 | "You3": 656,
659 | "You4": 657,
660 | "You5": 658,
661 | "You6": 659,
662 | "Yp": 660,
663 | "Yp1": 661,
664 | "Yp2": 662,
665 | "Yp3": 663,
666 | "Yp4": 664,
667 | "Yp5": 665,
668 | "Yp6": 666,
669 | "Ys": 667,
670 | "Yt": 668,
671 | "Yt1": 669,
672 | "Yt2": 670,
673 | "Yt3": 671,
674 | "Yt4": 672,
675 | "Yt5": 673,
676 | "Yt6": 674,
677 | "Yu1": 675,
678 | "Yu2": 676,
679 | "Yu3": 677,
680 | "Yu4": 678,
681 | "Yu5": 679,
682 | "Yu6": 680,
683 | "Yui1": 681,
684 | "Yui2": 682,
685 | "Yui3": 683,
686 | "Yui4": 684,
687 | "Yui5": 685,
688 | "Yui6": 686,
689 | "Yuk": 687,
690 | "Yuk1": 688,
691 | "Yuk2": 689,
692 | "Yuk3": 690,
693 | "Yuk4": 691,
694 | "Yuk5": 692,
695 | "Yuk6": 693,
696 | "Yun1": 694,
697 | "Yun2": 695,
698 | "Yun3": 696,
699 | "Yun4": 697,
700 | "Yun5": 698,
701 | "Yun6": 699,
702 | "Yung1": 700,
703 | "Yung2": 701,
704 | "Yung3": 702,
705 | "Yung4": 703,
706 | "Yung5": 704,
707 | "Yung6": 705,
708 | "Yut1": 706,
709 | "Yut2": 707,
710 | "Yut3": 708,
711 | "Yut4": 709,
712 | "Yut5": 710,
713 | "Yut6": 711,
714 | "Yw": 712,
715 | "Yyu1": 713,
716 | "Yyu2": 714,
717 | "Yyu3": 715,
718 | "Yyu4": 716,
719 | "Yyu5": 717,
720 | "Yyu6": 718,
721 | "Yyun1": 719,
722 | "Yyun2": 720,
723 | "Yyun3": 721,
724 | "Yyun4": 722,
725 | "Yyun5": 723,
726 | "Yyun6": 724,
727 | "Yyut1": 725,
728 | "Yyut2": 726,
729 | "Yyut3": 727,
730 | "Yyut4": 728,
731 | "Yyut5": 729,
732 | "Yyut6": 730,
733 | "Yz": 731
734 | }
--------------------------------------------------------------------------------
/resource/tokenizer.mini-bart-g2p.json:
--------------------------------------------------------------------------------
1 | {
2 | "version": "1.0",
3 | "truncation": {
4 | "direction": "Right",
5 | "max_length": 128,
6 | "strategy": "LongestFirst",
7 | "stride": 0
8 | },
9 | "padding": null,
10 | "added_tokens": [
11 | {
12 | "id": 0,
13 | "content": "",
14 | "single_word": false,
15 | "lstrip": false,
16 | "rstrip": false,
17 | "normalized": false,
18 | "special": true
19 | },
20 | {
21 | "id": 1,
22 | "content": "",
23 | "single_word": false,
24 | "lstrip": false,
25 | "rstrip": false,
26 | "normalized": false,
27 | "special": true
28 | },
29 | {
30 | "id": 2,
31 | "content": "",
32 | "single_word": false,
33 | "lstrip": false,
34 | "rstrip": false,
35 | "normalized": false,
36 | "special": true
37 | },
38 | {
39 | "id": 3,
40 | "content": "",
41 | "single_word": false,
42 | "lstrip": false,
43 | "rstrip": false,
44 | "normalized": false,
45 | "special": true
46 | },
47 | {
48 | "id": 4,
49 | "content": "",
50 | "single_word": false,
51 | "lstrip": true,
52 | "rstrip": false,
53 | "normalized": false,
54 | "special": true
55 | }
56 | ],
57 | "normalizer": {
58 | "type": "Lowercase"
59 | },
60 | "pre_tokenizer": {
61 | "type": "Split",
62 | "pattern": {
63 | "String": ""
64 | },
65 | "behavior": "Removed",
66 | "invert": false
67 | },
68 | "post_processor": {
69 | "type": "RobertaProcessing",
70 | "sep": [
71 | "",
72 | 2
73 | ],
74 | "cls": [
75 | "",
76 | 0
77 | ],
78 | "trim_offsets": true,
79 | "add_prefix_space": false
80 | },
81 | "decoder": null,
82 | "model": {
83 | "type": "WordLevel",
84 | "vocab": {
85 | "": 0,
86 | "": 1,
87 | "": 2,
88 | "": 3,
89 | "": 4,
90 | "e": 5,
91 | "a": 6,
92 | "s": 7,
93 | "i": 8,
94 | "r": 9,
95 | "n": 10,
96 | "AH0": 11,
97 | "o": 12,
98 | "N": 13,
99 | "t": 14,
100 | "l": 15,
101 | "S": 16,
102 | "L": 17,
103 | "T": 18,
104 | "R": 19,
105 | "K": 20,
106 | "c": 21,
107 | "d": 22,
108 | "D": 23,
109 | "u": 24,
110 | "IH0": 25,
111 | "m": 26,
112 | "M": 27,
113 | "Z": 28,
114 | "h": 29,
115 | "g": 30,
116 | "p": 31,
117 | "ER0": 32,
118 | "IY0": 33,
119 | "b": 34,
120 | "B": 35,
121 | "P": 36,
122 | "EH1": 37,
123 | "AE1": 38,
124 | "AA1": 39,
125 | "y": 40,
126 | "k": 41,
127 | "IH1": 42,
128 | "F": 43,
129 | "f": 44,
130 | "G": 45,
131 | "w": 46,
132 | "V": 47,
133 | "v": 48,
134 | "NG": 49,
135 | "'": 50,
136 | "IY1": 51,
137 | "EY1": 52,
138 | "HH": 53,
139 | "W": 54,
140 | "SH": 55,
141 | "OW1": 56,
142 | "AO1": 57,
143 | "OW0": 58,
144 | "AH1": 59,
145 | "UW1": 60,
146 | "AY1": 61,
147 | "JH": 62,
148 | "z": 63,
149 | "CH": 64,
150 | "Y": 65,
151 | "AA0": 66,
152 | "ER1": 67,
153 | "EH2": 68,
154 | "IH2": 69,
155 | "TH": 70,
156 | "AY2": 71,
157 | "AE2": 72,
158 | "EY2": 73,
159 | "AA2": 74,
160 | "EH0": 75,
161 | "j": 76,
162 | "AW1": 77,
163 | "OW2": 78,
164 | "x": 79,
165 | "IY2": 80,
166 | "UW0": 81,
167 | "AO2": 82,
168 | "UH1": 83,
169 | "AE0": 84,
170 | "q": 85,
171 | "AO0": 86,
172 | "AH2": 87,
173 | "UW2": 88,
174 | "AY0": 89,
175 | "OY1": 90,
176 | "-": 91,
177 | "EY0": 92,
178 | "DH": 93,
179 | "AW2": 94,
180 | "ER2": 95,
181 | "ZH": 96,
182 | "UH2": 97,
183 | "AW0": 98,
184 | "UH0": 99,
185 | "OY2": 100,
186 | "OY0": 101,
187 | ".": 102
188 | },
189 | "unk_token": ""
190 | }
191 | }
--------------------------------------------------------------------------------
/src/gsv/mod.rs:
--------------------------------------------------------------------------------
1 | pub mod v4;
2 |
--------------------------------------------------------------------------------
/src/gsv/v4.rs:
--------------------------------------------------------------------------------
1 | use std::{fmt::Debug, sync::Arc};
2 |
3 | use tch::{IValue, Tensor};
4 |
5 | #[derive(Clone)]
6 | pub struct GPTSoVITSV4Half(Arc);
7 | impl Debug for GPTSoVITSV4Half {
8 | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
9 | write!(f, "GPTSoVITSV4Half")
10 | }
11 | }
12 |
13 | impl GPTSoVITSV4Half {
14 | pub fn new(gpt_sovits_v4_half: Arc) -> Self {
15 | Self(gpt_sovits_v4_half)
16 | }
17 |
18 | pub fn get_fea_ref(
19 | &self,
20 | ssl_content: Tensor,
21 | ref_audio_32k: Tensor,
22 | ref_phone_seq: Tensor,
23 | ) -> anyhow::Result<(Tensor, Tensor, Tensor, Tensor)> {
24 | tch::no_grad(|| {
25 | let tensors = self.0.method_is(
26 | "get_fea_ref",
27 | &[
28 | &IValue::Tensor(ssl_content),
29 | &IValue::Tensor(ref_audio_32k),
30 | &IValue::Tensor(ref_phone_seq),
31 | ],
32 | )?;
33 | if let IValue::Tuple(mut tensors) = tensors {
34 | // codes, ge, fea_ref, mel2
35 | let mel2 = tensors.pop();
36 | let fea_ref = tensors.pop();
37 | let ge = tensors.pop();
38 | let codes = tensors.pop();
39 | if let (
40 | Some(IValue::Tensor(codes)),
41 | Some(IValue::Tensor(ge)),
42 | Some(IValue::Tensor(fea_ref)),
43 | Some(IValue::Tensor(mel2)),
44 | ) = (codes, ge, fea_ref, mel2)
45 | {
46 | return Ok((codes, ge, fea_ref, mel2));
47 | } else {
48 | return Err(anyhow::anyhow!("return value is not enough tensors"));
49 | }
50 | } else {
51 | return Err(anyhow::anyhow!("expected a tuple of tensors"));
52 | }
53 | })
54 | }
55 |
56 | pub fn get_fea_todo(
57 | &self,
58 | codes: Tensor,
59 | ge: Tensor,
60 | ref_phone_seq: Tensor,
61 | text_phone_seq: Tensor,
62 | ref_bert_seq: Tensor,
63 | bert_seq: Tensor,
64 | top_k: Tensor,
65 | ) -> anyhow::Result {
66 | // get_fea_todo(self, codes, ge, phoneme_ids0, phoneme_ids1, bert1, bert2, top_k):
67 |
68 | tch::no_grad(|| {
69 | let fea_todo = self.0.method_is(
70 | "get_fea_todo",
71 | &[
72 | IValue::Tensor(codes),
73 | IValue::Tensor(ge),
74 | IValue::Tensor(ref_phone_seq),
75 | IValue::Tensor(text_phone_seq),
76 | IValue::Tensor(ref_bert_seq),
77 | IValue::Tensor(bert_seq),
78 | IValue::Tensor(top_k),
79 | ],
80 | )?;
81 | if let IValue::Tensor(fea_todo) = fea_todo {
82 | Ok(fea_todo)
83 | } else {
84 | Err(anyhow::anyhow!("expected a tensor"))
85 | }
86 | })
87 | }
88 | }
89 |
90 | pub struct StreamSpeakerV4 {
91 | gpt_sovits_v4_half: GPTSoVITSV4Half,
92 | cfm: Arc,
93 | hifigan: Arc,
94 |
95 | codes: Tensor,
96 | ge: Tensor,
97 | fea_ref: Tensor,
98 | mel2: Tensor,
99 |
100 | ref_phone_seq: Tensor,
101 | ref_bert_seq: Tensor,
102 | pub top_k: Option,
103 | pub sample_steps: Option,
104 | }
105 |
106 | impl StreamSpeakerV4 {
107 | pub fn new(
108 | gpt_sovits_v4_half: Arc,
109 | cfm: Arc,
110 | hifigan: Arc,
111 | ssl_content: Tensor,
112 | ref_audio_32k: Tensor,
113 | ref_phone_seq: Tensor,
114 | ref_bert_seq: Tensor,
115 | top_k: Option,
116 | sample_steps: Option,
117 | ) -> anyhow::Result {
118 | let gpt_sovits_v4_half = GPTSoVITSV4Half::new(gpt_sovits_v4_half);
119 |
120 | let (codes, ge, fea_ref, mel2) = gpt_sovits_v4_half.get_fea_ref(
121 | ssl_content.internal_cast_half(false),
122 | ref_audio_32k,
123 | ref_phone_seq.shallow_clone(),
124 | )?;
125 |
126 | let ref_bert_seq = ref_bert_seq.internal_cast_half(false);
127 |
128 | Ok(Self {
129 | gpt_sovits_v4_half,
130 | cfm,
131 | hifigan,
132 | ref_bert_seq,
133 | top_k,
134 | sample_steps,
135 |
136 | codes,
137 | ge,
138 | fea_ref,
139 | mel2,
140 | ref_phone_seq,
141 | })
142 | }
143 |
144 | fn get_fea_todo(
145 | &self,
146 | text_phone_seq: &Tensor,
147 | bert_seq: &Tensor,
148 | top_k: Tensor,
149 | ) -> anyhow::Result {
150 | // get_fea_todo(self, codes, ge, phoneme_ids0, phoneme_ids1, bert1, bert2, top_k):
151 | self.gpt_sovits_v4_half.get_fea_todo(
152 | self.codes.shallow_clone(),
153 | self.ge.shallow_clone(),
154 | self.ref_phone_seq.shallow_clone(),
155 | text_phone_seq.shallow_clone(),
156 | self.ref_bert_seq.shallow_clone(),
157 | bert_seq.internal_cast_half(false),
158 | top_k,
159 | )
160 | }
161 |
162 | /// return mel2_, fea_ref_, cfm_res
163 | fn cfm_forward(
164 | &self,
165 | fea_ref: Tensor,
166 | fea_todo_chunk: Tensor,
167 | mel2: Tensor,
168 | sample_steps: Tensor,
169 | ) -> anyhow::Result<(Tensor, Tensor, Tensor)> {
170 | if let IValue::Tuple(mut tuple) = self.cfm.forward_is(&[
171 | &IValue::Tensor(fea_ref),
172 | &IValue::Tensor(fea_todo_chunk),
173 | &IValue::Tensor(mel2),
174 | &IValue::Tensor(sample_steps),
175 | ])? {
176 | let mel2_ = tuple.pop();
177 | let fea_ref_ = tuple.pop();
178 | let cfm_res = tuple.pop();
179 |
180 | if let (
181 | Some(IValue::Tensor(mel2_)),
182 | Some(IValue::Tensor(fea_ref_)),
183 | Some(IValue::Tensor(cfm_res)),
184 | ) = (mel2_, fea_ref_, cfm_res)
185 | {
186 | Ok((mel2_, fea_ref_, cfm_res))
187 | } else {
188 | Err(anyhow::anyhow!("cfm return not enough tensors"))
189 | }
190 | } else {
191 | Err(anyhow::anyhow!("expected a tuple of tensors"))
192 | }
193 | }
194 |
195 | pub fn infer(
196 | &self,
197 | text_phone_seq: &Tensor,
198 | bert_seq: &Tensor,
199 | mut chunk_len: i64,
200 | mut callback: impl FnMut(tch::Tensor) -> anyhow::Result<()>,
201 | ) -> anyhow::Result<()> {
202 | log::info!("start stream infer");
203 | let top_k = self.top_k.unwrap_or(15);
204 | let top_k = Tensor::from_slice(&[top_k]);
205 |
206 | let sample_steps = self.sample_steps.unwrap_or(8);
207 | let sample_steps = Tensor::from_slice(&[sample_steps]);
208 |
209 | // fea_ref, fea_todo, mel2 = self.gpt_sovits_half(
210 | // ssl_content, ref_audio_32k, phoneme_ids0, phoneme_ids1, bert1, bert2, top_k
211 | // )
212 | log::info!("start get_fea_todo");
213 | let mut mel2 = self.mel2.shallow_clone();
214 | let mut fea_ref = self.fea_ref.shallow_clone();
215 | let fea_todo = self.get_fea_todo(text_phone_seq, bert_seq, top_k)?;
216 |
217 | log::info!("end get_fea_todo");
218 |
219 | {
220 | if chunk_len <= 0 {
221 | chunk_len = 1000 - fea_ref.size3()?.2;
222 | }
223 |
224 | let fea_todo_size = fea_todo.size3()?.2;
225 |
226 | let mut idx = 0;
227 | loop {
228 | let max_chunk_len = fea_todo_size - idx;
229 |
230 | let mut fea_todo_chunk = fea_todo.narrow(2, idx, chunk_len.min(max_chunk_len));
231 |
232 | let complete_len = chunk_len - fea_todo_chunk.size3()?.2;
233 | if complete_len != 0 {
234 | let kind = fea_todo_chunk.kind();
235 | let device = fea_todo_chunk.device();
236 |
237 | fea_todo_chunk = tch::Tensor::cat(
238 | &[
239 | fea_todo_chunk,
240 | tch::Tensor::zeros([1, 512, complete_len], (kind, device)),
241 | ],
242 | 2,
243 | );
244 | }
245 | let (mel2_, fea_ref_, cfm_res) =
246 | self.cfm_forward(fea_ref, fea_todo_chunk, mel2, sample_steps.shallow_clone())?;
247 |
248 | idx += chunk_len;
249 |
250 | // denorm_spec
251 | let cfm_res = (cfm_res + 1) / 2 * (2 - -12) + -12;
252 |
253 | let hifigen_res = self.hifigan.forward_ts(&[cfm_res])?.squeeze();
254 |
255 | mel2 = mel2_;
256 | fea_ref = fea_ref_;
257 |
258 | log::info!(
259 | "chunk_len: {}, complete_len: {}, idx: {}",
260 | chunk_len,
261 | complete_len,
262 | idx
263 | );
264 | let hifigen_res = hifigen_res.to_dtype(tch::Kind::Float, false, false);
265 |
266 | if complete_len > 0 {
267 | let hifigen_res =
268 | hifigen_res.narrow(0, 0, (chunk_len - complete_len - 5) * 480);
269 | let device = hifigen_res.device();
270 | let kind = hifigen_res.kind();
271 |
272 | callback(tch::Tensor::cat(
273 | &[
274 | hifigen_res,
275 | tch::Tensor::zeros([(0.3 * 48000.0) as i64], (kind, device)),
276 | ],
277 | 0,
278 | ))?;
279 |
280 | return Ok(());
281 | } else {
282 | callback(hifigen_res)?;
283 | }
284 | }
285 | }
286 | }
287 | }
288 |
--------------------------------------------------------------------------------
/src/lib.rs:
--------------------------------------------------------------------------------
1 | use std::{collections::HashMap, str::FromStr, sync::Arc, usize};
2 |
3 | use gsv::v4::StreamSpeakerV4;
4 | use tch::{IValue, Tensor};
5 | use text::{g2p_en::G2PEnConverter, g2p_jp::G2PJpConverter, g2pw::G2PWConverter, CNBertModel};
6 |
7 | pub mod symbols;
8 | pub mod text;
9 | pub use tch::Device;
10 | pub mod gsv;
11 |
12 | pub struct GPTSovitsConfig {
13 | pub cn_setting: Option<(String, String)>,
14 | pub g2p_en_path: String,
15 | pub ssl_path: String,
16 | pub enable_jp: bool,
17 | }
18 |
19 | impl GPTSovitsConfig {
20 | pub fn new(ssl_path: String, g2p_en_path: String) -> Self {
21 | Self {
22 | cn_setting: None,
23 | g2p_en_path,
24 | ssl_path,
25 | enable_jp: false,
26 | }
27 | }
28 |
29 | pub fn with_chinese(mut self, g2pw_path: String, cn_bert_path: String) -> Self {
30 | self.cn_setting = Some((g2pw_path, cn_bert_path));
31 | self
32 | }
33 |
34 | pub fn with_jp(self, enable_jp: bool) -> Self {
35 | Self { enable_jp, ..self }
36 | }
37 |
38 | pub fn build(&self, device: Device) -> anyhow::Result {
39 | let (cn_bert, g2pw) = match &self.cn_setting {
40 | Some((g2pw_path, cn_bert_path)) => {
41 | let tokenizer = tokenizers::Tokenizer::from_str(text::g2pw::G2PW_TOKENIZER)
42 | .map_err(|e| anyhow::anyhow!("load tokenizer error: {}", e))?;
43 | let tokenizer = Arc::new(tokenizer);
44 |
45 | let mut bert = tch::CModule::load_on_device(&cn_bert_path, device)?;
46 | bert.set_eval();
47 |
48 | let cn_bert_model = CNBertModel::new(Arc::new(bert), tokenizer.clone());
49 | let g2pw = G2PWConverter::new_with_device(g2pw_path, tokenizer.clone(), device)?;
50 |
51 | (cn_bert_model, g2pw)
52 | }
53 | _ => (CNBertModel::default(), G2PWConverter::empty()),
54 | };
55 |
56 | let mut ssl = tch::CModule::load_on_device(&self.ssl_path, device).unwrap();
57 | ssl.set_eval();
58 |
59 | Ok(GPTSovits {
60 | zh_bert: cn_bert,
61 | g2pw,
62 | g2p_en: G2PEnConverter::new(&self.g2p_en_path),
63 | g2p_jp: G2PJpConverter::new(),
64 | device,
65 | symbols: symbols::SYMBOLS.clone(),
66 | ssl,
67 | jieba: jieba_rs::Jieba::new(),
68 | speakers: HashMap::new(),
69 | stream_speaker: HashMap::new(),
70 |
71 | enable_jp: self.enable_jp,
72 | })
73 | }
74 | }
75 |
76 | #[derive(Debug, Clone, Copy)]
77 | pub enum Version {
78 | V2_0,
79 | // 由于 v3 的改动,V2.1 需要传入 top_k
80 | V2_1,
81 | V3,
82 | V4,
83 | }
84 |
85 | #[derive(Debug)]
86 | pub struct Speaker {
87 | name: String,
88 | gpt_sovits_path: String,
89 | gpt_sovits: Arc,
90 | ref_text: String,
91 | ssl_content: Tensor,
92 | ref_audio_32k: Tensor,
93 | ref_phone_seq: Tensor,
94 | ref_bert_seq: Tensor,
95 | version: Version,
96 | pub top_k: Option,
97 | pub sample_steps: Option,
98 | }
99 |
100 | impl Speaker {
101 | pub fn get_name(&self) -> &str {
102 | &self.name
103 | }
104 |
105 | pub fn version(&self) -> Version {
106 | self.version
107 | }
108 |
109 | pub fn set_top_k(&mut self, top_k: Option) {
110 | self.top_k = top_k;
111 | }
112 |
113 | pub fn set_sample_steps(&mut self, sample_steps: Option) {
114 | self.sample_steps = sample_steps;
115 | }
116 |
117 | pub fn get_ref_text(&self) -> &str {
118 | &self.ref_text
119 | }
120 |
121 | pub fn get_ref_audio_32k(&self) -> &Tensor {
122 | &self.ref_audio_32k
123 | }
124 |
125 | pub fn infer_v2(&self, text_phone_seq: &Tensor, bert_seq: &Tensor) -> anyhow::Result {
126 | let audio = self.gpt_sovits.forward_ts(&[
127 | &self.ssl_content,
128 | &self.ref_audio_32k,
129 | &self.ref_phone_seq,
130 | &text_phone_seq,
131 | &self.ref_bert_seq,
132 | &bert_seq,
133 | ])?;
134 |
135 | Ok(audio)
136 | }
137 |
138 | pub fn infer_v2_1(&self, text_phone_seq: &Tensor, bert_seq: &Tensor) -> anyhow::Result {
139 | let top_k = self.top_k.unwrap_or(15);
140 | let top_k = Tensor::from_slice(&[top_k]);
141 |
142 | let audio = self.gpt_sovits.forward_ts(&[
143 | &self.ssl_content,
144 | &self.ref_audio_32k,
145 | &self.ref_phone_seq,
146 | &text_phone_seq,
147 | &self.ref_bert_seq,
148 | &bert_seq,
149 | &top_k,
150 | ])?;
151 |
152 | Ok(audio)
153 | }
154 |
155 | pub fn infer_v3(&self, text_phone_seq: &Tensor, bert_seq: &Tensor) -> anyhow::Result {
156 | let top_k = self.top_k.unwrap_or(15);
157 | let top_k = Tensor::from_slice(&[top_k]);
158 |
159 | let sample_steps = self.sample_steps.unwrap_or(8);
160 | let sample_steps = Tensor::from_slice(&[sample_steps]);
161 |
162 | let is_cpu = bert_seq.device() == Device::Cpu;
163 |
164 | let audio = if !is_cpu {
165 | self.gpt_sovits.forward_ts(&[
166 | &self.ssl_content.internal_cast_half(false),
167 | &self.ref_audio_32k,
168 | &self.ref_phone_seq,
169 | &text_phone_seq,
170 | &self.ref_bert_seq.internal_cast_half(false),
171 | &bert_seq.internal_cast_half(false),
172 | &top_k,
173 | &sample_steps,
174 | ])?
175 | } else {
176 | self.gpt_sovits.forward_ts(&[
177 | &self.ssl_content,
178 | &self.ref_audio_32k,
179 | &self.ref_phone_seq,
180 | &text_phone_seq,
181 | &self.ref_bert_seq,
182 | &bert_seq,
183 | &top_k,
184 | &sample_steps,
185 | ])?
186 | };
187 |
188 | let audio = audio.to_dtype(tch::Kind::Float, false, false);
189 | let size = 24000.0 * 0.3;
190 | let zero = tch::Tensor::zeros([size as i64], (tch::Kind::Float, audio.device()));
191 |
192 | Ok(tch::Tensor::cat(&[audio, zero], 0))
193 | }
194 |
195 | pub fn infer_v4(&self, text_phone_seq: &Tensor, bert_seq: &Tensor) -> anyhow::Result {
196 | let top_k = self.top_k.unwrap_or(15);
197 | let top_k = Tensor::from_slice(&[top_k]);
198 |
199 | let sample_steps = self.sample_steps.unwrap_or(8);
200 | let sample_steps = Tensor::from_slice(&[sample_steps]);
201 |
202 | let is_cpu = bert_seq.device() == Device::Cpu;
203 |
204 | let audio = if !is_cpu {
205 | self.gpt_sovits.forward_ts(&[
206 | &self.ssl_content.internal_cast_half(false),
207 | &self.ref_audio_32k,
208 | &self.ref_phone_seq,
209 | &text_phone_seq,
210 | &self.ref_bert_seq.internal_cast_half(false),
211 | &bert_seq.internal_cast_half(false),
212 | &top_k,
213 | &sample_steps,
214 | ])?
215 | } else {
216 | self.gpt_sovits.forward_ts(&[
217 | &self.ssl_content,
218 | &self.ref_audio_32k,
219 | &self.ref_phone_seq,
220 | &text_phone_seq,
221 | &self.ref_bert_seq,
222 | &bert_seq,
223 | &top_k,
224 | &sample_steps,
225 | ])?
226 | };
227 |
228 | let audio = audio.to_dtype(tch::Kind::Float, false, false);
229 | let size = 48000.0 * 0.3;
230 | let zero = tch::Tensor::zeros([size as i64], (tch::Kind::Float, audio.device()));
231 |
232 | Ok(tch::Tensor::cat(&[audio, zero], 0))
233 | }
234 |
235 | pub fn infer(&self, text_phone_seq: &Tensor, bert_seq: &Tensor) -> anyhow::Result {
236 | match self.version {
237 | Version::V2_0 => self.infer_v2(text_phone_seq, bert_seq),
238 | Version::V2_1 => self.infer_v2_1(text_phone_seq, bert_seq),
239 | Version::V3 => self.infer_v3(text_phone_seq, bert_seq),
240 | Version::V4 => self.infer_v4(text_phone_seq, bert_seq),
241 | }
242 | }
243 | }
244 |
245 | pub struct GPTSovits {
246 | zh_bert: CNBertModel,
247 | g2pw: G2PWConverter,
248 | g2p_en: G2PEnConverter,
249 | g2p_jp: G2PJpConverter,
250 | device: tch::Device,
251 | symbols: HashMap,
252 | ssl: tch::CModule,
253 |
254 | speakers: HashMap,
255 | stream_speaker: HashMap,
256 |
257 | jieba: jieba_rs::Jieba,
258 |
259 | enable_jp: bool,
260 | }
261 |
262 | impl GPTSovits {
263 | pub fn new(
264 | zh_bert: CNBertModel,
265 | g2pw: G2PWConverter,
266 | g2p_en: G2PEnConverter,
267 | g2p_jp: G2PJpConverter,
268 | device: tch::Device,
269 | symbols: HashMap,
270 | ssl: tch::CModule,
271 | jieba: jieba_rs::Jieba,
272 | enable_jp: bool,
273 | ) -> Self {
274 | Self {
275 | zh_bert,
276 | g2pw,
277 | g2p_en,
278 | g2p_jp,
279 | device,
280 | symbols,
281 | speakers: HashMap::new(),
282 | stream_speaker: HashMap::new(),
283 | ssl,
284 | jieba,
285 | enable_jp,
286 | }
287 | }
288 |
289 | fn find_gpt_sovits_by_path(&self, path: &str) -> Option> {
290 | for speaker in self.speakers.values() {
291 | if speaker.gpt_sovits_path == path {
292 | return Some(speaker.gpt_sovits.clone());
293 | }
294 | }
295 | None
296 | }
297 |
298 | fn find_gpt_sovits_by_path_or_load(&self, path: &str) -> anyhow::Result> {
299 | if let Some(gpt_sovits) = self.find_gpt_sovits_by_path(path) {
300 | Ok(gpt_sovits)
301 | } else {
302 | let mut gpt_sovits;
303 | if self.device == Device::Mps {
304 | gpt_sovits = tch::CModule::load(path)?;
305 | gpt_sovits.to(self.device, tch::Kind::Half, false)
306 | } else {
307 | gpt_sovits = tch::CModule::load_on_device(path, self.device)?;
308 | }
309 | gpt_sovits.set_eval();
310 | Ok(Arc::new(gpt_sovits))
311 | }
312 | }
313 |
314 | pub fn create_speaker(
315 | &mut self,
316 | name: &str,
317 | gpt_sovits_path: &str,
318 | ref_audio_samples: &[f32],
319 | ref_audio_sr: usize,
320 | ref_text: &str,
321 | ) -> anyhow::Result<()> {
322 | tch::no_grad(|| {
323 | let gpt_sovits = self.find_gpt_sovits_by_path_or_load(gpt_sovits_path)?;
324 |
325 | // 避免句首吞字
326 | let ref_text = if !ref_text.ends_with(['。', '.']) {
327 | ref_text.to_string() + "."
328 | } else {
329 | ref_text.to_string()
330 | };
331 |
332 | let ref_audio = Tensor::from_slice(ref_audio_samples)
333 | .to_device(self.device)
334 | .unsqueeze(0);
335 |
336 | let ref_audio_16k = self.resample(&ref_audio, ref_audio_sr, 16000)?;
337 | let ref_audio_32k = self.resample(&ref_audio, ref_audio_sr, 32000)?;
338 |
339 | let ssl_content = self.ssl.forward_ts(&[&ref_audio_16k])?;
340 |
341 | let (ref_phone_seq, ref_bert_seq) = text::get_phone_and_bert(self, &ref_text)?;
342 |
343 | let speaker = Speaker {
344 | name: name.to_string(),
345 | gpt_sovits_path: gpt_sovits_path.to_string(),
346 | gpt_sovits,
347 | ref_text,
348 | ssl_content,
349 | ref_audio_32k,
350 | ref_phone_seq,
351 | ref_bert_seq,
352 | version: Version::V2_0,
353 | top_k: None,
354 | sample_steps: None,
355 | };
356 |
357 | self.speakers.insert(name.to_string(), speaker);
358 | Ok(())
359 | })
360 | }
361 |
362 | pub fn create_speaker_v2_1(
363 | &mut self,
364 | name: &str,
365 | gpt_sovits_path: &str,
366 | ref_audio_samples: &[f32],
367 | ref_audio_sr: usize,
368 | ref_text: &str,
369 | top_k: Option,
370 | ) -> anyhow::Result<()> {
371 | tch::no_grad(|| {
372 | let gpt_sovits = self.find_gpt_sovits_by_path_or_load(gpt_sovits_path)?;
373 |
374 | // 避免句首吞字
375 | let ref_text = if !ref_text.ends_with(['。', '.']) {
376 | ref_text.to_string() + "."
377 | } else {
378 | ref_text.to_string()
379 | };
380 |
381 | let ref_audio = Tensor::from_slice(ref_audio_samples)
382 | .to_device(self.device)
383 | .unsqueeze(0);
384 |
385 | let ref_audio_16k = self.resample(&ref_audio, ref_audio_sr, 16000)?;
386 | let ref_audio_32k = self.resample(&ref_audio, ref_audio_sr, 32000)?;
387 |
388 | let ssl_content = self.ssl.forward_ts(&[&ref_audio_16k])?;
389 |
390 | let (ref_phone_seq, ref_bert_seq) = text::get_phone_and_bert(self, &ref_text)?;
391 |
392 | let speaker = Speaker {
393 | name: name.to_string(),
394 | gpt_sovits_path: gpt_sovits_path.to_string(),
395 | gpt_sovits,
396 | ref_text,
397 | ssl_content,
398 | ref_audio_32k,
399 | ref_phone_seq,
400 | ref_bert_seq,
401 | version: Version::V2_1,
402 | top_k,
403 | sample_steps: None,
404 | };
405 |
406 | self.speakers.insert(name.to_string(), speaker);
407 | Ok(())
408 | })
409 | }
410 |
411 | pub fn create_speaker_v3(
412 | &mut self,
413 | name: &str,
414 | gpt_sovits_path: &str,
415 | ref_audio_samples: &[f32],
416 | ref_audio_sr: usize,
417 | ref_text: &str,
418 | top_k: Option,
419 | sample_steps: Option,
420 | ) -> anyhow::Result<()> {
421 | tch::no_grad(|| {
422 | let gpt_sovits = self.find_gpt_sovits_by_path_or_load(gpt_sovits_path)?;
423 |
424 | // 避免句首吞字
425 | let ref_text = if !ref_text.ends_with(['。', '.']) {
426 | ref_text.to_string() + "."
427 | } else {
428 | ref_text.to_string()
429 | };
430 |
431 | let mut ref_audio = Tensor::from_slice(ref_audio_samples)
432 | .to_device(self.device)
433 | .unsqueeze(0);
434 | if self.device == Device::Mps {
435 | ref_audio = ref_audio.totype(tch::Kind::Half);
436 | }
437 |
438 | let ref_audio_16k = self.resample(&ref_audio, ref_audio_sr, 16000)?;
439 | let ref_audio_32k = self.resample(&ref_audio, ref_audio_sr, 32000)?;
440 |
441 | let ssl_content = self.ssl.forward_ts(&[&ref_audio_16k])?;
442 |
443 | let (ref_phone_seq, ref_bert_seq) = text::get_phone_and_bert(self, &ref_text)?;
444 |
445 | let speaker = Speaker {
446 | name: name.to_string(),
447 | gpt_sovits_path: gpt_sovits_path.to_string(),
448 | gpt_sovits,
449 | ref_text,
450 | ssl_content,
451 | ref_audio_32k,
452 | ref_phone_seq,
453 | ref_bert_seq,
454 | version: Version::V3,
455 | top_k,
456 | sample_steps,
457 | };
458 |
459 | self.speakers.insert(name.to_string(), speaker);
460 | Ok(())
461 | })
462 | }
463 |
464 | pub fn create_speaker_v4(
465 | &mut self,
466 | name: &str,
467 | gpt_sovits_path: &str,
468 | ref_audio_samples: &[f32],
469 | ref_audio_sr: usize,
470 | ref_text: &str,
471 | top_k: Option,
472 | sample_steps: Option,
473 | ) -> anyhow::Result<()> {
474 | // v3 和 v4 只有输出的采样率不同,输入相同
475 | self.create_speaker_v3(
476 | name,
477 | gpt_sovits_path,
478 | ref_audio_samples,
479 | ref_audio_sr,
480 | ref_text,
481 | top_k,
482 | sample_steps,
483 | )?;
484 | self.speakers
485 | .get_mut(name)
486 | .ok_or_else(|| anyhow::anyhow!("speaker not found"))?
487 | .version = Version::V4;
488 | Ok(())
489 | }
490 |
491 | pub fn create_stream_speaker_v4(
492 | &mut self,
493 | name: &str,
494 | gpt_sovits_path: &str,
495 | cfm_path: &str,
496 | hifigan_path: &str,
497 | ref_audio_samples: &[f32],
498 | ref_audio_sr: usize,
499 | ref_text: &str,
500 | top_k: Option,
501 | sample_steps: Option,
502 | ) -> anyhow::Result<()> {
503 | tch::no_grad(|| {
504 | let mut gpt_sovits_v4_half =
505 | tch::CModule::load_on_device(gpt_sovits_path, self.device)?;
506 | gpt_sovits_v4_half.set_eval();
507 |
508 | let mut cfm = tch::CModule::load_on_device(cfm_path, self.device)?;
509 | cfm.set_eval();
510 |
511 | let mut hifigan = tch::CModule::load_on_device(hifigan_path, self.device)?;
512 | hifigan.set_eval();
513 |
514 | // 避免句首吞字
515 | let ref_text = if !ref_text.ends_with(['。', '.']) {
516 | ref_text.to_string() + "."
517 | } else {
518 | ref_text.to_string()
519 | };
520 |
521 | let mut ref_audio = Tensor::from_slice(ref_audio_samples)
522 | .to_device(self.device)
523 | .unsqueeze(0);
524 | if self.device == Device::Mps {
525 | ref_audio = ref_audio.totype(tch::Kind::Half);
526 | }
527 |
528 | let ref_audio_16k = self.resample(&ref_audio, ref_audio_sr, 16000)?;
529 | let ref_audio_32k = self.resample(&ref_audio, ref_audio_sr, 32000)?;
530 |
531 | let ssl_content = self.ssl.forward_ts(&[&ref_audio_16k])?;
532 |
533 | let (ref_phone_seq, ref_bert_seq) = text::get_phone_and_bert(self, &ref_text)?;
534 |
535 | let speaker = StreamSpeakerV4::new(
536 | Arc::new(gpt_sovits_v4_half),
537 | Arc::new(cfm),
538 | Arc::new(hifigan),
539 | ssl_content,
540 | ref_audio_32k,
541 | ref_phone_seq,
542 | ref_bert_seq,
543 | top_k,
544 | sample_steps,
545 | )?;
546 |
547 | self.stream_speaker.insert(name.to_string(), speaker);
548 | Ok(())
549 | })
550 | }
551 |
552 | pub fn resample(&self, audio: &Tensor, sr: usize, target_sr: usize) -> anyhow::Result {
553 | tch::no_grad(|| {
554 | let resample = self.ssl.method_is(
555 | "resample",
556 | &[
557 | &IValue::Tensor(audio.shallow_clone()),
558 | &IValue::Int(sr as i64),
559 | &IValue::Int(target_sr as i64),
560 | ],
561 | )?;
562 | match resample {
563 | IValue::Tensor(resample) => Ok(resample),
564 | _ => unreachable!(),
565 | }
566 | })
567 | }
568 |
569 | /// Only V2.1 and V3 support top_k
570 | pub fn set_top_k(&mut self, speaker: &str, top_k: Option) -> anyhow::Result<()> {
571 | let speaker = self
572 | .speakers
573 | .get_mut(speaker)
574 | .ok_or_else(|| anyhow::anyhow!("speaker not found"))?;
575 | speaker.set_top_k(top_k);
576 | Ok(())
577 | }
578 |
579 | /// Only V3 V4 support sample_steps
580 | pub fn set_sample_steps(
581 | &mut self,
582 | speaker: &str,
583 | sample_steps: Option,
584 | ) -> anyhow::Result<()> {
585 | let speaker = self
586 | .speakers
587 | .get_mut(speaker)
588 | .ok_or_else(|| anyhow::anyhow!("speaker not found"))?;
589 | speaker.set_sample_steps(sample_steps);
590 | Ok(())
591 | }
592 |
593 | pub fn get_version(&self, speaker: &str) -> anyhow::Result {
594 | let speaker = self
595 | .speakers
596 | .get(speaker)
597 | .ok_or_else(|| anyhow::anyhow!("speaker not found"))?;
598 | Ok(speaker.version)
599 | }
600 |
601 | /// generate a audio tensor from text
602 | pub fn infer(&self, speaker: &str, target_text: &str) -> anyhow::Result {
603 | log::debug!("start infer");
604 | tch::no_grad(|| {
605 | let speaker = self
606 | .speakers
607 | .get(speaker)
608 | .ok_or_else(|| anyhow::anyhow!("speaker not found"))?;
609 |
610 | let (phone_seq, bert_seq) = text::get_phone_and_bert(self, target_text)?;
611 | let audio = speaker.infer(&phone_seq, &bert_seq)?;
612 | Ok(audio)
613 | })
614 | }
615 |
616 | pub fn stream_infer(
617 | &self,
618 | speaker: &str,
619 | target_text: &str,
620 | chunk_len: i64,
621 | callback: impl FnMut(tch::Tensor) -> anyhow::Result<()>,
622 | ) -> anyhow::Result<()> {
623 | tch::no_grad(|| {
624 | let speaker = self
625 | .stream_speaker
626 | .get(speaker)
627 | .ok_or_else(|| anyhow::anyhow!("speaker not found"))?;
628 |
629 | let (phone_seq, bert_seq) = text::get_phone_and_bert(self, target_text)?;
630 | speaker.infer(&phone_seq, &bert_seq, chunk_len, callback)?;
631 | Ok(())
632 | })
633 | }
634 |
635 | pub fn segment_infer(
636 | &self,
637 | speaker: &str,
638 | target_text: &str,
639 | split_chunk_size: usize,
640 | ) -> anyhow::Result {
641 | tch::no_grad(|| {
642 | let mut audios = vec![];
643 | let split_chunk_size = if split_chunk_size == 0 {
644 | 50
645 | } else {
646 | split_chunk_size
647 | };
648 | let chunks = crate::text::split_text(target_text, split_chunk_size);
649 | log::debug!("segment_infer split_text result: {:#?}", chunks);
650 | for target_text in chunks {
651 | match self.infer(speaker, target_text) {
652 | Ok(audio) => {
653 | audios.push(audio);
654 | }
655 | Err(e) => {
656 | log::warn!("SKIP segment_infer chunk:{target_text} error: {:?}", e);
657 | }
658 | }
659 | }
660 | if !audios.is_empty() {
661 | Ok(Tensor::cat(&audios, 0))
662 | } else {
663 | Err(anyhow::anyhow!("no audio generated"))
664 | }
665 | })
666 | }
667 | }
668 |
--------------------------------------------------------------------------------
/src/main.rs:
--------------------------------------------------------------------------------
1 | use std::vec;
2 |
3 | use gpt_sovits_rs::GPTSovitsConfig;
4 |
5 | fn main() {
6 | env_logger::init();
7 |
8 | // "../python/GPT-SoVITS/onnx/xww/gpt_sovits_model.pt".to_string(),
9 | let gpt_config = GPTSovitsConfig::new(
10 | "../python/GPT-SoVITS/onnx/xww/ssl_model.pt".to_string(),
11 | "./resource/mini-bart-g2p.pt".to_string(),
12 | )
13 | .with_chinese(
14 | "../python/g2pW/onnx/g2pw.pt".to_string(),
15 | "../python/GPT-SoVITS/onnx/bert_model.pt".to_string(),
16 | );
17 |
18 | let device = gpt_sovits_rs::Device::cuda_if_available();
19 | log::info!("device: {:?}", device);
20 |
21 | let mut gpt_sovits = gpt_config.build(device).unwrap();
22 |
23 | // let ref_text = "声音,是有温度的.夜晚的声音,会发光.";
24 | let ref_text = "在参加rust春晚的时候,听到有人问了这样一个问题.";
25 | let ref_path = "../python/GPT-SoVITS/onnx/xww/ref.wav";
26 | let file = std::fs::File::open(ref_path).unwrap();
27 | let (head, ref_audio_samples) = wav_io::read_from_file(file).unwrap();
28 |
29 | log::info!("load wx ref done");
30 |
31 | gpt_sovits
32 | .create_speaker(
33 | "xw",
34 | "../python/GPT-SoVITS/onnx/xww/gpt_sovits_model.pt",
35 | &ref_audio_samples,
36 | head.sample_rate as usize,
37 | ref_text,
38 | )
39 | .unwrap();
40 |
41 | log::info!("init wx done");
42 |
43 | let ref_text = "说真的,这件衣服才配得上本小姐嘛。";
44 | let ref_path = "../python/GPT-SoVITS/output/denoise_opt/ht/ht.mp4_0000026560_0000147200.wav";
45 | let file = std::fs::File::open(ref_path).unwrap();
46 | let (head, ref_audio_samples) = wav_io::read_from_file(file).unwrap();
47 |
48 | log::info!("load ht ref done");
49 |
50 | gpt_sovits
51 | .create_speaker(
52 | "ht",
53 | "../python/GPT-SoVITS/onnx/htt/gpt_sovits_model.pt",
54 | &ref_audio_samples,
55 | head.sample_rate as usize,
56 | ref_text,
57 | )
58 | .unwrap();
59 |
60 | log::info!("init ht done");
61 |
62 | let text = std::fs::read_to_string("./input.txt").unwrap();
63 |
64 | let header = wav_io::new_header(32000, 16, false, true);
65 |
66 | let audio = gpt_sovits.segment_infer("xw", &text, 50).unwrap();
67 | let audio2 = gpt_sovits.segment_infer("ht", &text, 50).unwrap();
68 |
69 | log::info!("start write file");
70 |
71 | let output = "out.wav";
72 | let output2 = "out2.wav";
73 |
74 | let audio_size = audio.size1().unwrap() as usize;
75 | let audio2_size = audio2.size1().unwrap() as usize;
76 | println!("audio size: {}", audio_size);
77 | println!("audio2 size: {}", audio2_size);
78 |
79 | println!("start save audio {output}");
80 | let mut samples = vec![0f32; audio_size];
81 | audio.f_copy_data(&mut samples, audio_size).unwrap();
82 | println!("start write file {output}");
83 | let mut file_out = std::fs::File::create(output).unwrap();
84 | wav_io::write_to_file(&mut file_out, &header, &samples).unwrap();
85 | log::info!("write file done");
86 |
87 | println!("start save audio {output2}");
88 | let mut samples2 = vec![0f32; audio2_size];
89 | audio2.f_copy_data(&mut samples2, audio2_size).unwrap();
90 | println!("start write file {output2}");
91 | let mut file_out2 = std::fs::File::create(output2).unwrap();
92 | wav_io::write_to_file(&mut file_out2, &header, &samples2).unwrap();
93 | log::info!("write file done");
94 | }
95 |
--------------------------------------------------------------------------------
/src/symbols.rs:
--------------------------------------------------------------------------------
1 | use std::collections::HashMap;
2 |
3 | use lazy_static::lazy_static;
4 |
5 | static SYMBOLS_V2: &str = include_str!("../resource/symbols_v2.json");
6 |
7 | lazy_static! {
8 | pub static ref SYMBOLS: HashMap = {
9 | let mut symbols: HashMap = serde_json::from_str(SYMBOLS_V2).unwrap();
10 | symbols.insert(" ".to_string(), symbols["\u{7a7a}"]);
11 | symbols.insert("'".to_string(), symbols["-"]);
12 | symbols
13 | };
14 | }
15 |
--------------------------------------------------------------------------------
/src/text/dict.rs:
--------------------------------------------------------------------------------
1 | use std::collections::HashMap;
2 |
3 | use lazy_static::lazy_static;
4 | use std::path::PathBuf;
5 |
6 | static DEFAULT_ZH_WORD_DICT: &str = include_str!("../../resource/zh_word_dict.json");
7 |
8 | lazy_static! {
9 | static ref ZN_DICT: HashMap> = {
10 | let word_dict_path = std::env::var("GPT_SOVITS_DICT_PATH").unwrap_or(".".to_string());
11 | let path = PathBuf::from(word_dict_path.as_str()).join("zh_word_dict.json");
12 | if path.is_file() {
13 | let zh_word_dict = std::fs::read_to_string(path).unwrap();
14 | serde_json::from_str(&zh_word_dict).unwrap()
15 | } else {
16 | serde_json::from_str(DEFAULT_ZH_WORD_DICT).unwrap()
17 | }
18 | };
19 | static ref EN_DICT: HashMap> = {
20 | let word_dict_path = std::env::var("GPT_SOVITS_DICT_PATH").unwrap_or(".".to_string());
21 | let path = PathBuf::from(word_dict_path.as_str()).join("en_word_dict.json");
22 | if path.is_file() {
23 | let en_word_dict = std::fs::read_to_string(path).unwrap();
24 | serde_json::from_str(&en_word_dict).unwrap()
25 | } else {
26 | HashMap::default()
27 | }
28 | };
29 | }
30 |
31 | pub fn zh_word_dict(word: &str) -> Option<&'static [String]> {
32 | ZN_DICT.get(word).map(|s| s.as_slice())
33 | }
34 |
35 | pub fn en_word_dict(word: &str) -> Option<&'static [String]> {
36 | EN_DICT.get(word).map(|s| s.as_slice())
37 | }
38 |
--------------------------------------------------------------------------------
/src/text/g2p_en.rs:
--------------------------------------------------------------------------------
1 | // model from cisco-ai/mini-bart-g2p
2 |
3 | use std::{str::FromStr, sync::Arc};
4 |
5 | static MINI_BART_G2P_TOKENIZER: &str = include_str!("../../resource/tokenizer.mini-bart-g2p.json");
6 |
7 | static DECODER_START_TOKEN_ID: u32 = 2;
8 |
9 | #[allow(unused)]
10 | static BOS_TOKEN: &str = "";
11 | #[allow(unused)]
12 | static EOS_TOKEN: &str = "";
13 |
14 | #[allow(unused)]
15 | static BOS_TOKEN_ID: u32 = 0;
16 | static EOS_TOKEN_ID: u32 = 2;
17 |
18 | pub struct G2PEnConverter {
19 | model: Arc,
20 | tokenizer: Arc,
21 | device: crate::Device,
22 | }
23 |
24 | impl G2PEnConverter {
25 | pub fn new(model_path: &str) -> Self {
26 | let device = crate::Device::Cpu;
27 | Self::new_with_device(model_path, device)
28 | }
29 |
30 | fn new_with_device(model_path: &str, device: crate::Device) -> Self {
31 | let tokenizer = tokenizers::Tokenizer::from_str(MINI_BART_G2P_TOKENIZER)
32 | .map_err(|e| anyhow::anyhow!("load g2p_en tokenizer error: {}", e))
33 | .unwrap();
34 | let tokenizer = Arc::new(tokenizer);
35 |
36 | let mut model = tch::CModule::load_on_device(model_path, device)
37 | .map_err(|e| anyhow::anyhow!("load g2p_en model error: {}", e))
38 | .unwrap();
39 | model.set_eval();
40 |
41 | Self {
42 | model: Arc::new(model),
43 | tokenizer,
44 | device,
45 | }
46 | }
47 |
48 | pub fn get_phoneme(&self, text: &str) -> anyhow::Result {
49 | let c = self
50 | .tokenizer
51 | .encode(text, true)
52 | .map_err(|e| anyhow::anyhow!("encode error: {}", e))?;
53 | let input_ids = c.get_ids().iter().map(|x| *x as i64).collect::>();
54 | let mut decoder_input_ids = vec![DECODER_START_TOKEN_ID as i64];
55 |
56 | for _ in 0..50 {
57 | let input = tch::Tensor::from_slice(&input_ids)
58 | .to_device(self.device)
59 | .unsqueeze(0);
60 | let decoder_input = tch::Tensor::from_slice(&decoder_input_ids)
61 | .to_device(self.device)
62 | .unsqueeze(0);
63 |
64 | let output = self
65 | .model
66 | .forward_ts(&[input, decoder_input])
67 | .map_err(|e| anyhow::anyhow!("g2p_en forward error: {}", e))?;
68 |
69 | let next_token_logits = output.get(0).get(-1);
70 |
71 | let next_token_id = next_token_logits.argmax(0, true).int64_value(&[]);
72 | decoder_input_ids.push(next_token_id);
73 | if next_token_id == EOS_TOKEN_ID as i64 {
74 | break;
75 | }
76 | }
77 |
78 | let decoder_input_ids = decoder_input_ids
79 | .iter()
80 | .map(|x| *x as u32)
81 | .collect::>();
82 | Ok(self
83 | .tokenizer
84 | .decode(&decoder_input_ids, true)
85 | .map_err(|e| anyhow::anyhow!("g2p_en decode error: {}", e))?)
86 | }
87 | }
88 |
89 | // cargo test --package gpt_sovits_rs --lib -- text::g2p_en::test_g2p_en_converter --exact --show-output
90 | #[test]
91 | fn test_g2p_en_converter() {
92 | let g2p_en = G2PEnConverter::new("./resource/mini-bart-g2p.pt");
93 | let phoneme = g2p_en.get_phoneme("a hello world").unwrap();
94 | println!("{}", phoneme);
95 | let phoneme = g2p_en.get_phoneme("hello world").unwrap();
96 | println!("{}", phoneme);
97 | let phoneme = g2p_en.get_phoneme("a").unwrap();
98 | println!("{}", phoneme);
99 | let phoneme = g2p_en.get_phoneme("near-team").unwrap();
100 | println!("{}", phoneme);
101 | }
102 |
--------------------------------------------------------------------------------
/src/text/g2p_jp.rs:
--------------------------------------------------------------------------------
1 | use lazy_static::lazy_static;
2 | use std::collections::HashMap;
3 |
4 | use jpreprocess::{
5 | kind::JPreprocessDictionaryKind, DefaultTokenizer, JPreprocess, JPreprocessConfig,
6 | SystemDictionaryConfig,
7 | };
8 |
9 | fn is_sentence_char(c: char) -> bool {
10 | matches!(c,
11 | 'A'..='Z' | 'a'..='z' | '0'..='9' | // Latin letters and digits
12 | '\u{3005}' | // Ideographic iteration mark
13 | '\u{3040}'..='\u{30ff}' | // Hiragana and Katakana
14 | '\u{4e00}'..='\u{9fff}' | // CJK Unified Ideographs
15 | '\u{ff11}'..='\u{ff19}' | // Fullwidth digits
16 | '\u{ff21}'..='\u{ff3a}' | // Fullwidth Latin capital letters
17 | '\u{ff41}'..='\u{ff5a}' | // Fullwidth Latin small letters
18 | '\u{ff66}'..='\u{ff9d}' // Halfwidth Katakana
19 | )
20 | }
21 |
22 | struct TextSplitter<'t> {
23 | input: &'t str,
24 | index: usize,
25 | }
26 |
27 | impl<'t> TextSplitter<'t> {
28 | fn new(text: &'t str) -> Self {
29 | Self {
30 | input: text,
31 | index: 0,
32 | }
33 | }
34 | }
35 |
36 | impl<'t> Iterator for TextSplitter<'t> {
37 | type Item = (&'t str, bool);
38 |
39 | fn next(&mut self) -> Option {
40 | if self.index >= self.input.len() {
41 | return None;
42 | }
43 | let start = self.index;
44 | let mut chars = self.input[start..].char_indices();
45 | let (_, c) = chars.next().unwrap(); // First character at start
46 |
47 | if is_sentence_char(c) {
48 | // Find the end of consecutive sentence characters
49 | let end = chars
50 | .find(|&(_, c)| !is_sentence_char(c))
51 | .map(|(i, _)| start + i)
52 | .unwrap_or(self.input.len());
53 | let sentence = &self.input[start..end];
54 | self.index = end;
55 | Some((sentence, true))
56 | } else {
57 | // Mark is a single character
58 | let mark_end = start + c.len_utf8();
59 | let mark = &self.input[start..mark_end];
60 | self.index = mark_end;
61 | Some((mark, false))
62 | }
63 | }
64 | }
65 |
66 | fn g2p_prosody(j_preprocess: &JPreprocess, text: &str) -> Vec {
67 | let labels = j_preprocess.make_label(j_preprocess.run_frontend(text).unwrap());
68 | let n_labels = labels.len();
69 | let mut phones = vec![];
70 | for (i, label) in labels.iter().enumerate() {
71 | let p3 = label.phoneme.c.as_ref().unwrap().as_str();
72 | if p3 == "sil" {
73 | assert!(i == 0 || i == n_labels - 1);
74 | continue;
75 | } else if p3 == "pau" {
76 | phones.push("_");
77 | continue;
78 | } else {
79 | phones.push(p3);
80 | }
81 | // we could assert 1 <= i < n_labels - 1
82 | let mora = label.mora.as_ref();
83 | let a1 = mora.map_or(127, |v| v.relative_accent_position);
84 | let a2 = mora.map_or(127, |v| v.position_forward);
85 | let a3 = mora.map_or(127, |v| v.position_backward);
86 | let f1 = label
87 | .accent_phrase_curr
88 | .as_ref()
89 | .map_or(127, |v| v.mora_count);
90 | let a2_next = labels[i + 1]
91 | .mora
92 | .as_ref()
93 | .map_or(127, |v| v.position_forward);
94 |
95 | if a3 == 1 && a2_next == 1 && "aeiouAEIOUNcl".contains(p3) {
96 | phones.push("#");
97 | } else if a1 == 0 && a2_next == a2 + 1 && a2 != f1 {
98 | phones.push("]");
99 | } else if a2 == 1 && a2_next == 2 {
100 | phones.push("[");
101 | }
102 | }
103 | phones
104 | .into_iter()
105 | .map(ToOwned::to_owned)
106 | .map(|s| {
107 | if "AEIOU".contains(&s) {
108 | s.to_lowercase()
109 | } else {
110 | s
111 | }
112 | })
113 | .collect()
114 | }
115 |
116 | fn preprocess_jap(j_preprocess: &JPreprocess, text: &str) -> Vec {
117 | let mut phones = vec![];
118 | for (part, is_sentence) in TextSplitter::new(text) {
119 | if is_sentence {
120 | phones.extend(g2p_prosody(j_preprocess, part));
121 | } else if part != " " {
122 | phones.push(part.replace(" ", ""));
123 | }
124 | }
125 | phones
126 | }
127 |
128 | lazy_static! {
129 | static ref REP_MAP: HashMap<&'static str, &'static str> = {
130 | let mut map = HashMap::new();
131 | map.insert(":", ",");
132 | map.insert(";", ",");
133 | map.insert(",", ",");
134 | map.insert("。", ".");
135 | map.insert("!", "!");
136 | map.insert("?", "?");
137 | map.insert("\n", ".");
138 | map.insert("·", ",");
139 | map.insert("、", ",");
140 | map.insert("...", "…");
141 | map
142 | };
143 | }
144 |
145 | fn post_replace_ph(phone: String) -> String {
146 | REP_MAP
147 | .get(phone.as_str())
148 | .copied()
149 | .map_or(phone, ToOwned::to_owned)
150 | }
151 |
152 | pub struct G2PJpConverter {
153 | j_preprocess: JPreprocess,
154 | }
155 |
156 | impl G2PJpConverter {
157 | pub fn new() -> Self {
158 | let config = JPreprocessConfig {
159 | dictionary: SystemDictionaryConfig::Bundled(JPreprocessDictionaryKind::NaistJdic),
160 | user_dictionary: None,
161 | };
162 | let j_preprocess = JPreprocess::from_config(config).unwrap();
163 | Self { j_preprocess }
164 | }
165 |
166 | pub fn g2p(&self, text: &str) -> Vec {
167 | let phones = preprocess_jap(&self.j_preprocess, text);
168 | phones.into_iter().map(post_replace_ph).collect()
169 | }
170 | }
171 |
--------------------------------------------------------------------------------
/src/text/g2pw.rs:
--------------------------------------------------------------------------------
1 | use std::{collections::HashMap, fmt::Debug, sync::Arc};
2 |
3 | static MONO_CHARS_DIST_STR: &str = include_str!("../../resource/g2pw/dict_mono_chars.json");
4 | static POLY_CHARS_DIST_STR: &str = include_str!("../../resource/g2pw/dict_poly_chars.json");
5 | static LABELS: &str = include_str!("../../resource/g2pw/dict_poly_index_list.json");
6 | pub(crate) static G2PW_TOKENIZER: &str = include_str!("../../resource/g2pw_tokenizer.json");
7 |
8 | fn load_mono_chars() -> HashMap {
9 | if let Ok(dir) = std::env::var("G2PW_DIST_DIR") {
10 | let s = std::fs::read_to_string(format!("{}/dict_mono_chars.json", dir))
11 | .expect("dict_mono_chars.json not found");
12 | serde_json::from_str(&s).expect("dict_mono_chars.json parse error")
13 | } else {
14 | serde_json::from_str(MONO_CHARS_DIST_STR).unwrap()
15 | }
16 | }
17 |
18 | fn load_poly_chars() -> HashMap {
19 | if let Ok(dir) = std::env::var("G2PW_DIST_DIR") {
20 | let s = std::fs::read_to_string(format!("{}/dict_poly_chars.json", dir))
21 | .expect("dict_poly_chars.json not found");
22 | serde_json::from_str(&s).expect("dict_poly_chars.json parse error")
23 | } else {
24 | serde_json::from_str(POLY_CHARS_DIST_STR).unwrap()
25 | }
26 | }
27 |
28 | lazy_static::lazy_static! {
29 | static ref DICT_MONO_CHARS: HashMap =load_mono_chars();
30 | static ref DICT_POLY_CHARS: HashMap = load_poly_chars();
31 | static ref POLY_LABLES: Vec = serde_json::from_str(LABELS).unwrap();
32 | }
33 |
34 | #[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
35 | pub struct PolyChar {
36 | index: usize,
37 | phones: Vec<(String, usize)>,
38 | }
39 |
40 | #[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
41 | pub struct MonoChar {
42 | phone: String,
43 | }
44 |
45 | // cargo test --package gpt_sovits_rs --lib -- text::g2pw::build_static_resource --exact --show-output
46 | #[test]
47 | fn build_static_resource() {
48 | use std::collections::{BTreeMap, HashMap};
49 | let bopomofo_to_pinyin_dict =
50 | std::fs::read_to_string("resource/g2pw/bopomofo_to_pinyin_wo_tune_dict.json").unwrap();
51 |
52 | let dict_ = serde_json::from_str::>(&bopomofo_to_pinyin_dict).unwrap();
53 | let mut dict = HashMap::with_capacity(dict_.len() * 5);
54 | for (k, v) in dict_ {
55 | for i in 1..=5 {
56 | dict.insert(format!("{}{}", k, i), format!("{}{}", v, i));
57 | }
58 | }
59 |
60 | let labels = std::fs::read_to_string("resource/g2pw/LABELS.txt").unwrap();
61 |
62 | let mut labels_index_map = BTreeMap::new();
63 | let mut lables_list = vec![];
64 |
65 | let mut mono_btree = BTreeMap::new();
66 | let mut poly_btree = BTreeMap::new();
67 |
68 | for (i, ph) in labels.lines().enumerate() {
69 | let x = if let Some(ph_with_tone) = dict.get(ph) {
70 | lables_list.push(ph_with_tone.clone());
71 | labels_index_map.insert(ph_with_tone.clone(), i)
72 | } else {
73 | println!("{} py not found", ph);
74 | lables_list.push(ph.to_string());
75 | labels_index_map.insert(ph.to_string(), i)
76 | };
77 | if x.is_some() {
78 | panic!("{} repeat {:?}", ph, x);
79 | }
80 | }
81 | let s = serde_json::to_string_pretty(&labels_index_map).unwrap();
82 | std::fs::write("resource/g2pw/dict_poly_index_map.json", s).unwrap();
83 | let s = serde_json::to_string_pretty(&lables_list).unwrap();
84 | std::fs::write("resource/g2pw/dict_poly_index_list.json", s).unwrap();
85 | println!("#### build lables_list done ####");
86 |
87 | let char_pinyin = std::fs::read_to_string("resource/g2pw/char_bopomofo_dict.json").unwrap();
88 | let mut char_pinyin: HashMap> = serde_json::from_str(&char_pinyin).unwrap();
89 |
90 | let s = std::fs::read_to_string("resource/g2pw/bert-base-chinese_s2t_dict.txt").unwrap();
91 | let mut s2t = HashMap::new();
92 | let mut t2s = HashMap::new();
93 | for l in s.lines() {
94 | let (s, t) = l.split_once("\t").unwrap();
95 | s2t.insert(s.to_string(), t.to_string());
96 | t2s.insert(t.to_string(), s.to_string());
97 | assert!(char_pinyin.contains_key(s))
98 | }
99 |
100 | let chars = std::fs::read_to_string("resource/g2pw/CHARS.txt").unwrap();
101 | for (i, c) in chars.lines().enumerate() {
102 | if s2t.contains_key(c) {
103 | println!("[repeat] skip {}", c);
104 | continue;
105 | }
106 | poly_btree.insert(
107 | c.to_string(),
108 | PolyChar {
109 | index: i,
110 | phones: vec![],
111 | },
112 | );
113 | if let Some(s) = t2s.get(c) {
114 | poly_btree.insert(
115 | s.to_string(),
116 | PolyChar {
117 | index: i,
118 | phones: vec![],
119 | },
120 | );
121 | }
122 | }
123 |
124 | let mono = std::fs::read_to_string("resource/g2pw/MONOPHONIC_CHARS.txt").unwrap();
125 |
126 | for (_, c) in mono.lines().enumerate() {
127 | let (c, ph) = c.split_once("\t").unwrap();
128 | if s2t.contains_key(c) {
129 | println!("[repeat] skip {}", c);
130 | continue;
131 | }
132 | mono_btree.insert(
133 | c.to_string(),
134 | MonoChar {
135 | phone: ph.to_string(),
136 | },
137 | );
138 | }
139 |
140 | let poly = std::fs::read_to_string("resource/g2pw/POLYPHONIC_CHARS.txt").unwrap();
141 |
142 | for c in poly.lines() {
143 | let (c, ph) = c.split_once("\t").unwrap();
144 | if !poly_btree.contains_key(c) {
145 | println!("[skip] {c} not found in poly_btree");
146 | continue;
147 | }
148 | if s2t.contains_key(c) {
149 | println!("[repeat] skip {c} because in s2t");
150 | continue;
151 | }
152 | let item = poly_btree
153 | .get_mut(c)
154 | .expect(&format!("[warn] {c} not found in poly_btree"));
155 | let v = (ph.to_string(), 0);
156 | if !item.phones.contains(&v) {
157 | item.phones.push(v);
158 | } else {
159 | println!("[warn] poly_btree {c}:{:?} repeat", v);
160 | }
161 | if let Some(s) = t2s.get(c) {
162 | let item = poly_btree.get_mut(s).unwrap();
163 | let v = (ph.to_string(), 0);
164 | if !item.phones.contains(&v) {
165 | item.phones.push(v);
166 | } else {
167 | println!("[warn] poly_btree {c}:{:?} repeat", v);
168 | }
169 | }
170 | }
171 |
172 | println!("#### check char_pinyin ####");
173 |
174 | for (c, _) in mono_btree.iter() {
175 | if !char_pinyin.contains_key(c) {
176 | println!("mono {} not found in char_pinyin", c);
177 | }
178 | }
179 | for (c, _) in poly_btree.iter() {
180 | if !char_pinyin.contains_key(c) {
181 | println!("poly {} not found in char_pinyin", c);
182 | }
183 | }
184 | println!("#### check char_pinyin done ####");
185 |
186 | println!("#### reverse check char_pinyin ####");
187 | for (c, phs) in char_pinyin.iter_mut() {
188 | if phs.len() == 1 {
189 | mono_btree.insert(
190 | c.to_string(),
191 | MonoChar {
192 | phone: phs[0].clone(),
193 | },
194 | );
195 | poly_btree.remove(c);
196 | continue;
197 | }
198 | if !mono_btree.contains_key(c) && !poly_btree.contains_key(c) {
199 | println!("{} {phs:?} not found in any dict", c);
200 |
201 | mono_btree.insert(
202 | c.to_string(),
203 | MonoChar {
204 | phone: phs[0].clone(),
205 | },
206 | );
207 | }
208 | }
209 | println!("#### reverse check char_pinyin done ####");
210 |
211 | println!("#### build dict by char_pinyin ####");
212 |
213 | // let s = serde_json::to_string_pretty(&mono_btree).unwrap();
214 | // std::fs::write("resource/g2pw/dict_mono_chars.tmp.json", s).unwrap();
215 |
216 | // let s = serde_json::to_string_pretty(&poly_btree).unwrap();
217 | // std::fs::write("resource/g2pw/dict_poly_chars.tmp.json", s).unwrap();
218 |
219 | println!("#### translate mono_btree and poly_btree ####");
220 | // 清理多音字
221 | {
222 | for (c, mono) in mono_btree.iter_mut() {
223 | let ph = dict
224 | .get(&mono.phone)
225 | .expect(&format!("{c}->{} not found in dict", mono.phone));
226 | mono.phone = ph.clone();
227 | }
228 |
229 | let poly_keys = poly_btree
230 | .keys()
231 | .map(|x| x.clone())
232 | .collect::>();
233 |
234 | for c in poly_keys {
235 | let poly = poly_btree.get_mut(&c).unwrap();
236 | let s_pinyin = char_pinyin
237 | .get(&c)
238 | .expect(&format!("{c} not found in char_pinyin"))
239 | .clone();
240 |
241 | // for (p, _) in &mut poly.phones {
242 | // if let Some(ph) = dict.get(p) {
243 | // *p = ph.clone();
244 | // } else {
245 | // println!("[skip] {c} -> {} not found in dict", p);
246 | // }
247 | // }
248 |
249 | let mut merge_phones = vec![];
250 | for (p, _) in &mut poly.phones {
251 | if let Some(ph) = dict.get(p) {
252 | if s_pinyin.contains(p) {
253 | if let Some(index) = labels_index_map.get(ph) {
254 | merge_phones.push((ph.clone(), *index));
255 | } else {
256 | println!("[warn] {c} -> {ph:?} not found in labels_index_map");
257 | }
258 | } else {
259 | println!("[warn] {c} -> {p:?} not found in pinyin {s_pinyin:?}");
260 | }
261 | *p = ph.clone();
262 | } else {
263 | println!("[warn] {c} -> {p:?} not found in dict");
264 | }
265 | }
266 |
267 | if merge_phones.is_empty() {
268 | println!("[warn] {c} -> {s_pinyin:?} : {:?} is_empty", poly.phones);
269 | } else {
270 | poly.phones = merge_phones;
271 | };
272 |
273 | let phones = &poly.phones;
274 |
275 | if phones.len() == 1 {
276 | println!("[warn] {c} -> {s_pinyin:?} : {:?} is mono", poly.phones);
277 | mono_btree.insert(
278 | c.to_string(),
279 | MonoChar {
280 | phone: poly.phones[0].0.clone(),
281 | },
282 | );
283 | poly_btree.remove(&c);
284 | }
285 | }
286 | }
287 | let s = serde_json::to_string_pretty(&mono_btree).unwrap();
288 | std::fs::write("resource/g2pw/dict_mono_chars.json", s).unwrap();
289 |
290 | let s = serde_json::to_string_pretty(&poly_btree).unwrap();
291 | std::fs::write("resource/g2pw/dict_poly_chars.json", s).unwrap();
292 | }
293 |
294 | #[derive(Clone, Copy)]
295 | pub enum G2PWOut {
296 | Pinyin(&'static str),
297 | RawChar(char),
298 | }
299 |
300 | impl Debug for G2PWOut {
301 | fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
302 | match self {
303 | Self::Pinyin(s) => write!(f, "\"{}\"", s),
304 | Self::RawChar(s) => write!(f, "\"{}\"", s),
305 | }
306 | }
307 | }
308 |
309 | #[derive(Debug, Clone)]
310 | pub struct G2PWConverter {
311 | model: Option>,
312 | tokenizers: Option>,
313 | device: crate::Device,
314 | }
315 |
316 | pub fn str_is_chinese(s: &str) -> bool {
317 | let mut r = true;
318 | for c in s.chars() {
319 | if !DICT_MONO_CHARS.contains_key(&c) && !DICT_POLY_CHARS.contains_key(&c) {
320 | r &= false;
321 | }
322 | }
323 | r
324 | }
325 |
326 | impl G2PWConverter {
327 | pub fn empty() -> Self {
328 | Self {
329 | model: None,
330 | tokenizers: None,
331 | device: crate::Device::Cpu,
332 | }
333 | }
334 |
335 | pub fn new(model_path: &str, tokenizer: Arc) -> anyhow::Result {
336 | let device = crate::Device::Cpu;
337 | Self::new_with_device(model_path, tokenizer, device)
338 | }
339 |
340 | pub fn new_with_device(
341 | model_path: &str,
342 | tokenizer: Arc,
343 | mut device: crate::Device,
344 | ) -> anyhow::Result {
345 | if device == crate::Device::Mps {
346 | device = crate::Device::Cpu;
347 | }
348 |
349 | let mut model = tch::CModule::load_on_device(model_path, device)?;
350 |
351 | model.set_eval();
352 | Ok(Self {
353 | model: Some(Arc::new(model)),
354 | tokenizers: Some(tokenizer),
355 | device,
356 | })
357 | }
358 |
359 | pub fn get_pinyin<'s>(&self, text: &'s str) -> anyhow::Result> {
360 | if self.model.is_some() && self.tokenizers.is_some() {
361 | self.ml_get_pinyin(text)
362 | } else {
363 | Ok(self.simple_get_pinyin(text))
364 | }
365 | }
366 |
367 | pub fn simple_get_pinyin(&self, text: &str) -> Vec {
368 | let mut pre_data = vec![];
369 | for (_, c) in text.chars().enumerate() {
370 | if let Some(mono) = DICT_MONO_CHARS.get(&c) {
371 | pre_data.push(G2PWOut::Pinyin(&mono.phone));
372 | } else if let Some(poly) = DICT_POLY_CHARS.get(&c) {
373 | pre_data.push(G2PWOut::Pinyin(&poly.phones[0].0));
374 | } else {
375 | pre_data.push(G2PWOut::RawChar(c));
376 | }
377 | }
378 | pre_data
379 | }
380 |
381 | fn ml_get_pinyin<'s>(&self, text: &'s str) -> anyhow::Result> {
382 | let c = self
383 | .tokenizers
384 | .as_ref()
385 | .unwrap()
386 | .encode(text, true)
387 | .map_err(|e| anyhow::anyhow!("encode error: {}", e))?;
388 | let input_ids = c.get_ids().iter().map(|x| *x as i64).collect::>();
389 | let token_type_ids = vec![0i64; input_ids.len()];
390 | let attention_mask = vec![1i64; input_ids.len()];
391 |
392 | let mut phoneme_masks = vec![];
393 | let mut pre_data = vec![];
394 | let mut query_id = vec![];
395 | let mut chars_id = vec![];
396 |
397 | for (i, c) in text.chars().enumerate() {
398 | if let Some(mono) = DICT_MONO_CHARS.get(&c) {
399 | pre_data.push(G2PWOut::Pinyin(&mono.phone));
400 | } else if let Some(poly) = DICT_POLY_CHARS.get(&c) {
401 | pre_data.push(G2PWOut::Pinyin(""));
402 | // 这个位置是 tokens 的位置,它的前后添加了 '[CLS]' 和 '[SEP]' 两个特殊字符
403 | query_id.push(i + 1);
404 | chars_id.push(poly.index);
405 | let mut phoneme_mask = vec![0f32; POLY_LABLES.len()];
406 | for (_, i) in &poly.phones {
407 | phoneme_mask[*i] = 1.0;
408 | }
409 | phoneme_masks.push(phoneme_mask);
410 | } else {
411 | pre_data.push(G2PWOut::RawChar(c));
412 | }
413 | }
414 |
415 | let input_ids = tch::Tensor::from_slice(&input_ids)
416 | .unsqueeze(0)
417 | .to_device(self.device);
418 | let token_type_ids = tch::Tensor::from_slice(&token_type_ids)
419 | .unsqueeze(0)
420 | .to_device(self.device);
421 | let attention_mask = tch::Tensor::from_slice(&attention_mask)
422 | .unsqueeze(0)
423 | .to_device(self.device);
424 |
425 | for ((position_id, phoneme_mask), char_id) in query_id
426 | .iter()
427 | .zip(phoneme_masks.iter())
428 | .zip(chars_id.iter())
429 | {
430 | let phoneme_mask = tch::Tensor::from_slice(phoneme_mask)
431 | .unsqueeze(0)
432 | .to_device(self.device);
433 | let position_id_t =
434 | tch::Tensor::from_slice(&[*position_id as i64]).to_device(self.device);
435 | let char_id = tch::Tensor::from_slice(&[*char_id as i64]).to_device(self.device);
436 |
437 | let probs = tch::no_grad(|| {
438 | self.model.as_ref().unwrap().forward_ts(&[
439 | &input_ids,
440 | &token_type_ids,
441 | &attention_mask,
442 | &phoneme_mask,
443 | &char_id,
444 | &position_id_t,
445 | ])
446 | })?;
447 |
448 | let i = probs.argmax(-1, false).int64_value(&[]);
449 |
450 | pre_data[*position_id - 1] = G2PWOut::Pinyin(&POLY_LABLES[i as usize]);
451 | }
452 |
453 | Ok(pre_data)
454 | }
455 | }
456 |
--------------------------------------------------------------------------------