diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000000000000000000000000000000000000..1691f22a315762e154b4e48ff0b620d47d2e4003 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,2 @@ +*.png filter=lfs diff=lfs merge=lfs -text +*.jpg filter=lfs diff=lfs merge=lfs -text diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..90a702dc4f30ecbf510c62170892f580c642f472 --- /dev/null +++ b/.gitignore @@ -0,0 +1 @@ +*cache* diff --git a/offline_process/create_features.py b/offline_process/create_features.py new file mode 100644 index 0000000000000000000000000000000000000000..cd00797b50251138250730f2eb43d643ee70b356 --- /dev/null +++ b/offline_process/create_features.py @@ -0,0 +1,62 @@ +from datasets import load_dataset, concatenate_datasets + +ds = load_dataset("espnet/ace-kising-segments", cache_dir="cache") + +combined = concatenate_datasets([ds["train"], ds["validation"], ds["test"]]) + +# 2. filter rows by singer: baber +combined = combined.filter(lambda x: x["singer"] == "barber") + +# 3. create a new column, which counts the nonzero numbers in the list in the note_midi column +combined = combined.map( + lambda x: {"note_midi_length": len([n for n in x["note_midi"] if n != 0])} +) + +# 4. sort by segment_id +combined = combined.sort("segment_id") + +# 5. iterate over rows +prev_songid = None +prev_song_segment_id = None +song2note_lengths = {} +for row in combined: + # segment_id: kising_barber_{songid}_{song_segment_id} + _, _, songid, song_segment_id = row["segment_id"].split("_") + if prev_songid != songid: + if prev_songid is not None: + assert ( + song_segment_id == "001" + ), f"prev_songid: {prev_songid}, songid: {songid}, song_segment_id: {song_segment_id}" + song2note_lengths[f"kising_{songid}"] = [row["note_midi_length"]] + else: + assert ( + int(song_segment_id) >= int(prev_song_segment_id) + 1 + ), f"prev_song_segment_id: {prev_song_segment_id}, song_segment_id: {song_segment_id}" + song2note_lengths[f"kising_{songid}"].append(row["note_midi_length"]) + prev_songid = songid + prev_song_segment_id = song_segment_id + +# 6. write to json +import json + +with open("song2note_lengths.json", "w") as f: + json.dump(song2note_lengths, f, indent=4) + +# 7. convert to pandas DataFrame +import pandas as pd + +df = pd.DataFrame.from_dict(combined) +df = df.drop(columns=["audio", "singer"]) +df["segment_id"] = df["segment_id"].str.replace("kising_barber_", "kising_") +# export to csv +df.to_csv("song_db.csv", index=False) + +# 8. push score segments to hub +# remove audio and singer columns +combined = combined.remove_columns(["audio", "singer"]) +# replace kising_barber_ with kising_ +combined = combined.map( + lambda x: {"segment_id": x["segment_id"].replace("kising_barber_", "kising_")} +) +# upload to hub +combined.push_to_hub("jhansss/kising_score_segments") diff --git a/resource/__init__.py b/resource/__init__.py new file mode 100644 index 0000000000000000000000000000000000000000..e69de29bb2d1d6434b8b29ae775ad8c2e48c5391 diff --git a/resource/all_plans.json b/resource/all_plans.json new file mode 100755 index 0000000000000000000000000000000000000000..94af8af22ad17cadfaf4505caae44c71fff6561e --- /dev/null +++ b/resource/all_plans.json @@ -0,0 +1,7660 @@ +{ + "jp_word2romaji": + { + "うぁ": "wa", + "うぉ": "wo", + "ぁ": "a", + "ぃ": "i", + "ぅ": "u", + "ぇ": "e", + "ぉ": "o", + "ゃ": "ya", + "ゅ": "yu", + "ょ": "yo", + "ウァ": "wa", + "ウォ": "wo", + "ァ": "a", + "ィ": "i", + "ゥ": "u", + "ェ": "e", + "ォ": "o", + "ャ": "ya", + "ュ": "yu", + "ョ": "yo", + "ウァ": "wa", + "ウォ": "wo", + "ァ": "a", + "ィ": "i", + "ゥ": "u", + "ェ": "e", + "ォ": "o", + "ャ": "ya", + "ュ": "yu", + "ョ": "yo", + "よ": "yo", + "びゅ": "byu", + "ら": "ra", + "ジャ": "ja", + "り": "ri", + "キャ": "kya", + "ツェ": "tse", + "る": "ru", + "キュ": "kyu", + "フェ": "fe", + "れ": "re", + "びょ": "byo", + "ジュ": "ju", + "ろ": "ro", + "キュ": "kyu", + "リェ": "rye", + "ツォ": "tso", + "リャ": "rya", + "キョ": "kyo", + "フォ": "fo", + "わ": "wa", + "コ゚": "ngo", + "ジョ": "jo", + "リュ": "ryu", + "キョ": "kyo", + "リョ": "ryo", + "を": "wo", + "ク゚": "ngu", + "ん": "N", + "キ゚ャ": "ngya", + "キ゚ェ": "ngye", + "ガ": "ga", + "ふぁ": "fa", + "クァ": "kwa", + "キ゚ュ": "ngyu", + "ブ": "bu", + "ふぃ": "fi", + "キ゚ャ": "ngya", + "プ": "pu", + "クィ": "kwi", + "ア": "a", + "ふぅ": "fu", + "ズィ": "zi", + "きゃ": "kya", + "じゃ": "ja", + "ズィ": "zi", + "イ": "i", + "キ゚ョ": "ngyo", + "キ゚ュ": "ngyu", + "ブュ": "vyu", + "スィ": "si", + "ふぇ": "fe", + "ウ": "u", + "きゅ": "kyu", + "じゅ": "ju", + "イェ": "ye", + "イェ": "ye", + "キ゚ョ": "ngyo", + "エ": "e", + "きょ": "kyo", + "ふぉ": "fo", + "じょ": "jo", + "オ": "o", + "カ": "ka", + "ガ": "ga", + "キ": "ki", + "ピャ": "pya", + "ギ": "gi", + "ク": "ku", + "ミャ": "mya", + "グ": "gu", + "リャ": "rya", + "ケ": "ke", + "ピュ": "pyu", + "ゲ": "ge", + "ミュ": "myu", + "コ": "ko", + "リュ": "ryu", + "ゴ": "go", + "ピョ": "pyo", + "サ": "sa", + "ミョ": "myo", + "ザ": "za", + "ドゥ": "du", + "リョ": "ryo", + "シ": "shi", + "くぁ": "kwa", + "ジ": "ji", + "ス": "su", + "ズ": "zu", + "セ": "se", + "くぃ": "kwi", + "ゼ": "ze", + "ずぃ": "zi", + "ソ": "so", + "ジ": "ji", + "ゾ": "zo", + "タ": "ta", + "ダ": "da", + "いぇ": "ye", + "チ": "chi", + "ヲ": "wo", + "くぇ": "kwe", + "ッ": "cl", + "ツ": "tsu", + "クァ": "kwa", + "くぉ": "kwo", + "クィ": "kwi", + "テ": "te", + "ティ": "ti", + "デ": "de", + "ぴゃ": "pya", + "ト": "to", + "き゚": "ngi", + "ド": "do", + "みゃ": "mya", + "ギャ": "gya", + "りゃ": "rya", + "ナ": "na", + "ぴゅ": "pyu", + "ニ": "ni", + "テェ": "tye", + "ヴぁ": "va", + "ア": "a", + "ヌ": "nu", + "ネ": "ne", + "イ": "i", + "りゅ": "ryu", + "テャ": "tya", + "ギュ": "gyu", + "ぴょ": "pyo", + "ノ": "no", + "ヴぃ": "vi", + "ハ": "ha", + "バ": "ba", + "みゅ": "myu", + "ギョ": "gyo", + "りょ": "ryo", + "カ": "ka", + "パ": "pa", + "ヒ": "hi", + "キ": "ki", + "みょ": "myo", + "ビ": "bi", + "ニェ": "nye", + "ビャ": "bya", + "ピ": "pi", + "ウ": "u", + "テュ": "tyu", + "フ": "hu", + "ビュ": "byu", + "ク": "ku", + "ヴぇ": "ve", + "サ": "sa", + "ブ": "bu", + "プ": "pu", + "シ": "shi", + "エ": "e", + "ヘ": "he", + "ス": "su", + "ケ": "ke", + "ベ": "be", + "ヴぉ": "vo", + "セ": "se", + "ペ": "pe", + "ジェ": "je", + "ビェ": "bye", + "ホ": "ho", + "タ": "ta", + "オ": "o", + "ボ": "bo", + "チ": "chi", + "コ": "ko", + "ポ": "po", + "ツ": "tsu", + "ギ": "gi", + "マ": "ma", + "テ": "te", + "ソ": "so", + "ミ": "mi", + "ト": "to", + "ジャ": "ja", + "グァ": "gwa", + "ナ": "na", + "ム": "mu", + "メ": "me", + "ニ": "ni", + "ベ": "be", + "モ": "mo", + "ヌ": "nu", + "ジュ": "ju", + "ペ": "pe", + "グィ": "gwi", + "ネ": "ne", + "ヤ": "ya", + "ぎゃ": "gya", + "ディ": "di", + "ノ": "no", + "ハ": "ha", + "ジョ": "jo", + "ウィ": "wi", + "ヒ": "hi", + "にぇ": "nye", + "ティ": "ti", + "ユ": "yu", + "ぎゅ": "gyu", + "ヨ": "yo", + "フ": "hu", + "ヘ": "he", + "ラ": "ra", + "ウェ": "we", + "ホ": "ho", + "こ゚": "ngo", + "マ": "ma", + "リ": "ri", + "ル": "ru", + "ミ": "mi", + "ぎょ": "gyo", + "レ": "re", + "ム": "mu", + "テェ": "tye", + "ロ": "ro", + "グォ": "gwo", + "メ": "me", + "デェ": "de", + "カ゚": "nga", + "モ": "mo", + "ワ": "wa", + "ヤ": "ya", + "フャ": "fya", + "ビョ": "byo", + "ユ": "yu", + "デャ": "dya", + "ッ": "cl", + "ヨ": "yo", + "ヲ": "wo", + "ラ": "ra", + "フュ": "fyu", + "リ": "ri", + "ン": "N", + "ヴ": "vu", + "ル": "ru", + "カ゚": "nga", + "デュ": "dyu", + "レ": "re", + "フョ": "fyo", + "ロ": "ro", + "デョ": "tyo", + "ワ": "wa", + "ン": "N", + "ピェ": "pye", + "ぐぁ": "gwa", + "き゚ゃ": "ngya", + "ぐぃ": "gwi", + "ピャ": "pya", + "ズ": "zu", + "てぃ": "ti", + "ピュ": "pyu", + "き゚ゅ": "ngyu", + "ぐぇ": "gwe", + "ピョ": "pyo", + "てぇ": "tye", + "ぐぉ": "gwo", + "き゚ょ": "ngyo", + "ふゃ": "fya", + "トゥ": "tu", + "ふゅ": "fyu", + "チェ": "che", + "ふょ": "fyo", + "ケ゚": "nge", + "グ": "gu", + "ヴァ": "va", + "ボ": "bo", + "ウィ": "wi", + "ポ": "po", + "ヴィ": "vi", + "ちぇ": "che", + "ディ": "di", + "ウェ": "we", + "ヴェ": "ve", + "ヴォ": "vo", + "デェ": "dye", + "ヒェ": "hye", + "キ゚": "ngi", + "ニャ": "nya", + "ヴャ": "vya", + "ニュ": "nyu", + "ブュ": "vyu", + "ニョ": "nyo", + "ヴゃ": "vya", + "ヴゅ": "vyu", + "うぃ": "wi", + "ヴ": "vu", + "ヴょ": "vyo", + "ゼ": "ze", + "でぃ": "di", + "うぇ": "we", + "でぇ": "dye", + "ひぇ": "hye", + "にゃ": "nya", + "く゚": "ngu", + "にゅ": "nyu", + "シェ": "she", + "キ゚ェ": "ngye", + "コォ": "kwo", + "ミェ": "mye", + "テャ": "tya", + "にょ": "nyo", + "ミャ": "mya", + "テュ": "tyu", + "ミュ": "myu", + "ミョ": "myo", + "ゲ": "ge", + "ド": "do", + "しぇ": "she", + "ぢぇ": "dye", + "てゃ": "tya", + "ヴァ": "va", + "トゥ": "tu", + "てゅ": "tyu", + "ヴィ": "vi", + "ヒェ": "hye", + "チャ": "cha", + "てょ": "tyo", + "ビェ": "bye", + "ク゚": "ngu", + "ヒャ": "hya", + "チュ": "chu", + "ヒュ": "hyu", + "ヴェ": "ve", + "ヒョ": "hyo", + "チョ": "cho", + "キ゚": "ngi", + "ヴォ": "vo", + "ゾ": "zo", + "バ": "ba", + "パ": "pa", + "とぅ": "tu", + "ちゃ": "cha", + "びぇ": "bye", + "ちゅ": "chu", + "キェ": "kye", + "ジェ": "je", + "ニェ": "nye", + "ちょ": "cho", + "デャ": "dya", + "ニャ": "nya", + "ヒャ": "hya", + "ニュ": "nyu", + "デュ": "dyu", + "グァ": "gwa", + "ニョ": "nyo", + "ヒュ": "hyu", + "グィ": "gwi", + "デョ": "tyo", + "コ゚": "ngo", + "ヒョ": "hyo", + "グォ": "gwo", + "ゴ": "go", + "きぇ": "kye", + "じぇ": "je", + "あ": "a", + "でゃ": "dya", + "ファ": "fa", + "ひゃ": "hya", + "い": "i", + "フィ": "fi", + "か゚": "nga", + "ドゥ": "du", + "でゅ": "dyu", + "う": "u", + "フゥ": "fu", + "チェ": "che", + "ひゅ": "hyu", + "シャ": "sha", + "フェ": "fe", + "き゚ぇ": "ngye", + "え": "e", + "コォ": "kwo", + "フォ": "fo", + "チャ": "cha", + "ピェ": "pye", + "ひょ": "hyo", + "シュ": "shu", + "か": "ka", + "フャ": "fya", + "ミェ": "mye", + "が": "ga", + "リェ": "rye", + "お": "o", + "き": "ki", + "チュ": "chu", + "フュ": "fyu", + "ぎ": "gi", + "ショ": "sho", + "ケ゚": "nge", + "く": "ku", + "チョ": "cho", + "フョ": "fyo", + "ぐ": "gu", + "け": "ke", + "げ": "ge", + "こ": "ko", + "ご": "go", + "さ": "sa", + "ざ": "za", + "し": "shi", + "じ": "ji", + "す": "su", + "ず": "zu", + "せ": "se", + "ダ": "da", + "ぜ": "ze", + "ビ": "bi", + "そ": "so", + "ぞ": "zo", + "ピ": "pi", + "ツァ": "tsa", + "た": "ta", + "どぅ": "du", + "だ": "da", + "スィ": "si", + "ち": "chi", + "しゃ": "sha", + "ツィ": "tsi", + "っ": "cl", + "ぴぇ": "pye", + "つ": "tsu", + "しゅ": "shu", + "みぇ": "mye", + "て": "te", + "け゚": "nge", + "りぇ": "rye", + "で": "de", + "ギェ": "gye", + "シェ": "she", + "と": "to", + "しょ": "sho", + "ツェ": "tse", + "ど": "do", + "ぢょ": "dyo", + "ギェ": "gye", + "な": "na", + "シャ": "sha", + "に": "ni", + "ビャ": "bya", + "ぬ": "nu", + "ツォ": "tso", + "ギャ": "gya", + "ね": "ne", + "シュ": "shu", + "ショ": "sho", + "の": "no", + "は": "ha", + "ビュ": "byu", + "ヴャ": "vya", + "ば": "ba", + "ギュ": "gyu", + "ぱ": "pa", + "ひ": "hi", + "ビョ": "byo", + "ギョ": "gyo", + "び": "bi", + "ぴ": "pi", + "ふ": "hu", + "ぶ": "bu", + "ぷ": "pu", + "へ": "he", + "つぁ": "tsa", + "べ": "be", + "ぺ": "pe", + "すぃ": "si", + "ほ": "ho", + "ザ": "za", + "つぃ": "tsi", + "ぼ": "bo", + "ぽ": "po", + "ま": "ma", + "み": "mi", + "む": "mu", + "ぎぇ": "gye", + "め": "me", + "ファ": "fa", + "も": "mo", + "つぇ": "tse", + "ツァ": "tsa", + "や": "ya", + "ツィ": "tsi", + "フィ": "fi", + "びゃ": "bya", + "つぉ": "tso", + "ゆ": "yu", + "キェ": "kye", + "キャ": "kya", + "フゥ": "fu", + "づ": "zu" + }, + "plans": + [ + { + "language": "zh", + "syllable_alias": + { + "lue": "lve", + "m": "mm", + "n": "nn", + "yvan": "yuan", + "yv": "yu", + "qvan": "quan", + "xv": "xu", + "qv": "qu", + "jve": "jue", + "xvn": "xun", + "qve": "que", + "xvan": "xuan", + "qvn": "qun", + "jvn": "jun", + "xve": "xue", + "yve": "yue", + "yvn": "yun", + "jvan": "juan" + }, + "dict": + { + "zi": + [ + "z", + "ii" + ], + "ci": + [ + "c", + "ii" + ], + "si": + [ + "s", + "ii" + ], + "ii": + [ + "ii" + ], + "zhi": + [ + "zh", + "iii" + ], + "chi": + [ + "ch", + "iii" + ], + "shi": + [ + "sh", + "iii" + ], + "ri": + [ + "r", + "iii" + ], + "iii": + [ + "iii" + ], + "bi": + [ + "b", + "i" + ], + "pi": + [ + "p", + "i" + ], + "mi": + [ + "m", + "i" + ], + "fi": + [ + "f", + "i" + ], + "di": + [ + "d", + "i" + ], + "ti": + [ + "t", + "i" + ], + "ni": + [ + "n", + "i" + ], + "li": + [ + "l", + "i" + ], + "zyi": + [ + "z", + "i" + ], + "cyi": + [ + "c", + "i" + ], + "syi": + [ + "s", + "i" + ], + "zhyi": + [ + "zh", + "i" + ], + "chyi": + [ + "ch", + "i" + ], + "shyi": + [ + "sh", + "i" + ], + "ji": + [ + "j", + "i" + ], + "qi": + [ + "q", + "i" + ], + "xi": + [ + "x", + "i" + ], + "gi": + [ + "g", + "i" + ], + "ki": + [ + "k", + "i" + ], + "hi": + [ + "h", + "i" + ], + "ryi": + [ + "r", + "i" + ], + "yi": + [ + "y", + "i" + ], + "i": + [ + "i" + ], + "bu": + [ + "b", + "u" + ], + "pu": + [ + "p", + "u" + ], + "mu": + [ + "m", + "u" + ], + "fu": + [ + "f", + "u" + ], + "du": + [ + "d", + "u" + ], + "tu": + [ + "t", + "u" + ], + "nu": + [ + "n", + "u" + ], + "lu": + [ + "l", + "u" + ], + "zu": + [ + "z", + "u" + ], + "cu": + [ + "c", + "u" + ], + "su": + [ + "s", + "u" + ], + "zhu": + [ + "zh", + "u" + ], + "chu": + [ + "ch", + "u" + ], + "shu": + [ + "sh", + "u" + ], + "gu": + [ + "g", + "u" + ], + "ku": + [ + "k", + "u" + ], + "hu": + [ + "h", + "u" + ], + "ru": + [ + "r", + "u" + ], + "wu": + [ + "w", + "u" + ], + "u": + [ + "u" + ], + "bv": + [ + "b", + "v" + ], + "pv": + [ + "p", + "v" + ], + "mv": + [ + "m", + "v" + ], + "fv": + [ + "f", + "v" + ], + "dv": + [ + "d", + "v" + ], + "tv": + [ + "t", + "v" + ], + "nv": + [ + "n", + "v" + ], + "lv": + [ + "l", + "v" + ], + "zv": + [ + "z", + "v" + ], + "cv": + [ + "c", + "v" + ], + "sv": + [ + "s", + "v" + ], + "zhv": + [ + "zh", + "v" + ], + "chv": + [ + "ch", + "v" + ], + "shv": + [ + "sh", + "v" + ], + "ju": + [ + "j", + "v" + ], + "qu": + [ + "q", + "v" + ], + "xu": + [ + "x", + "v" + ], + "gv": + [ + "g", + "v" + ], + "kv": + [ + "k", + "v" + ], + "hv": + [ + "h", + "v" + ], + "rv": + [ + "r", + "v" + ], + "yu": + [ + "y", + "v" + ], + "v": + [ + "v" + ], + "ba": + [ + "b", + "a" + ], + "pa": + [ + "p", + "a" + ], + "ma": + [ + "m", + "a" + ], + "fa": + [ + "f", + "a" + ], + "da": + [ + "d", + "a" + ], + "ta": + [ + "t", + "a" + ], + "na": + [ + "n", + "a" + ], + "la": + [ + "l", + "a" + ], + "za": + [ + "z", + "a" + ], + "ca": + [ + "c", + "a" + ], + "sa": + [ + "s", + "a" + ], + "zha": + [ + "zh", + "a" + ], + "cha": + [ + "ch", + "a" + ], + "sha": + [ + "sh", + "a" + ], + "ga": + [ + "g", + "a" + ], + "ka": + [ + "k", + "a" + ], + "ha": + [ + "h", + "a" + ], + "ra": + [ + "r", + "a" + ], + "a": + [ + "a" + ], + "bia": + [ + "b", + "ia" + ], + "pia": + [ + "p", + "ia" + ], + "mia": + [ + "m", + "ia" + ], + "fia": + [ + "f", + "ia" + ], + "dia": + [ + "d", + "ia" + ], + "tia": + [ + "t", + "ia" + ], + "nia": + [ + "n", + "ia" + ], + "lia": + [ + "l", + "ia" + ], + "zia": + [ + "z", + "ia" + ], + "cia": + [ + "c", + "ia" + ], + "sia": + [ + "s", + "ia" + ], + "jia": + [ + "j", + "ia" + ], + "qia": + [ + "q", + "ia" + ], + "xia": + [ + "x", + "ia" + ], + "gia": + [ + "g", + "ia" + ], + "kia": + [ + "k", + "ia" + ], + "hia": + [ + "h", + "ia" + ], + "ya": + [ + "y", + "ia" + ], + "ia": + [ + "ia" + ], + "bua": + [ + "b", + "ua" + ], + "pua": + [ + "p", + "ua" + ], + "mua": + [ + "m", + "ua" + ], + "fua": + [ + "f", + "ua" + ], + "dua": + [ + "d", + "ua" + ], + "tua": + [ + "t", + "ua" + ], + "nua": + [ + "n", + "ua" + ], + "lua": + [ + "l", + "ua" + ], + "zua": + [ + "z", + "ua" + ], + "cua": + [ + "c", + "ua" + ], + "sua": + [ + "s", + "ua" + ], + "zhua": + [ + "zh", + "ua" + ], + "chua": + [ + "ch", + "ua" + ], + "shua": + [ + "sh", + "ua" + ], + "gua": + [ + "g", + "ua" + ], + "kua": + [ + "k", + "ua" + ], + "hua": + [ + "h", + "ua" + ], + "rua": + [ + "r", + "ua" + ], + "wa": + [ + "w", + "ua" + ], + "ua": + [ + "ua" + ], + "beh": + [ + "b", + "eh" + ], + "peh": + [ + "p", + "eh" + ], + "meh": + [ + "m", + "eh" + ], + "feh": + [ + "f", + "eh" + ], + "deh": + [ + "d", + "eh" + ], + "teh": + [ + "t", + "eh" + ], + "neh": + [ + "n", + "eh" + ], + "leh": + [ + "l", + "eh" + ], + "zeh": + [ + "z", + "eh" + ], + "ceh": + [ + "c", + "eh" + ], + "seh": + [ + "s", + "eh" + ], + "zheh": + [ + "zh", + "eh" + ], + "cheh": + [ + "ch", + "eh" + ], + "sheh": + [ + "sh", + "eh" + ], + "geh": + [ + "g", + "eh" + ], + "keh": + [ + "k", + "eh" + ], + "heh": + [ + "h", + "eh" + ], + "reh": + [ + "r", + "eh" + ], + "eh": + [ + "eh" + ], + "be": + [ + "b", + "e" + ], + "pe": + [ + "p", + "e" + ], + "me": + [ + "m", + "e" + ], + "fe": + [ + "f", + "e" + ], + "de": + [ + "d", + "e" + ], + "te": + [ + "t", + "e" + ], + "ne": + [ + "n", + "e" + ], + "le": + [ + "l", + "e" + ], + "ze": + [ + "z", + "e" + ], + "ce": + [ + "c", + "e" + ], + "se": + [ + "s", + "e" + ], + "zhe": + [ + "zh", + "e" + ], + "che": + [ + "ch", + "e" + ], + "she": + [ + "sh", + "e" + ], + "ge": + [ + "g", + "e" + ], + "ke": + [ + "k", + "e" + ], + "he": + [ + "h", + "e" + ], + "re": + [ + "r", + "e" + ], + "e": + [ + "e" + ], + "bo": + [ + "b", + "uo" + ], + "po": + [ + "p", + "uo" + ], + "mo": + [ + "m", + "uo" + ], + "fo": + [ + "f", + "uo" + ], + "duo": + [ + "d", + "uo" + ], + "tuo": + [ + "t", + "uo" + ], + "nuo": + [ + "n", + "uo" + ], + "luo": + [ + "l", + "uo" + ], + "zuo": + [ + "z", + "uo" + ], + "cuo": + [ + "c", + "uo" + ], + "suo": + [ + "s", + "uo" + ], + "zhuo": + [ + "zh", + "uo" + ], + "chuo": + [ + "ch", + "uo" + ], + "shuo": + [ + "sh", + "uo" + ], + "guo": + [ + "g", + "uo" + ], + "kuo": + [ + "k", + "uo" + ], + "huo": + [ + "h", + "uo" + ], + "ruo": + [ + "r", + "uo" + ], + "wo": + [ + "w", + "uo" + ], + "uo": + [ + "uo" + ], + "no": + [ + "n", + "o" + ], + "lo": + [ + "l", + "o" + ], + "so": + [ + "s", + "o" + ], + "go": + [ + "g", + "o" + ], + "ko": + [ + "k", + "o" + ], + "ho": + [ + "h", + "o" + ], + "o": + [ + "o" + ], + "yo": + [ + "y", + "io" + ], + "io": + [ + "io" + ], + "bae": + [ + "b", + "ae" + ], + "pae": + [ + "p", + "ae" + ], + "mae": + [ + "m", + "ae" + ], + "fae": + [ + "f", + "ae" + ], + "dae": + [ + "d", + "ae" + ], + "tae": + [ + "t", + "ae" + ], + "nae": + [ + "n", + "ae" + ], + "lae": + [ + "l", + "ae" + ], + "zae": + [ + "z", + "ae" + ], + "cae": + [ + "c", + "ae" + ], + "sae": + [ + "s", + "ae" + ], + "zhae": + [ + "zh", + "ae" + ], + "chae": + [ + "ch", + "ae" + ], + "shae": + [ + "sh", + "ae" + ], + "gae": + [ + "g", + "ae" + ], + "kae": + [ + "k", + "ae" + ], + "hae": + [ + "h", + "ae" + ], + "rae": + [ + "r", + "ae" + ], + "ae": + [ + "ae" + ], + "bie": + [ + "b", + "ie" + ], + "pie": + [ + "p", + "ie" + ], + "mie": + [ + "m", + "ie" + ], + "fie": + [ + "f", + "ie" + ], + "die": + [ + "d", + "ie" + ], + "tie": + [ + "t", + "ie" + ], + "nie": + [ + "n", + "ie" + ], + "lie": + [ + "l", + "ie" + ], + "zie": + [ + "z", + "ie" + ], + "cie": + [ + "c", + "ie" + ], + "sie": + [ + "s", + "ie" + ], + "zhie": + [ + "zh", + "ie" + ], + "chie": + [ + "ch", + "ie" + ], + "shie": + [ + "sh", + "ie" + ], + "jie": + [ + "j", + "ie" + ], + "qie": + [ + "q", + "ie" + ], + "xie": + [ + "x", + "ie" + ], + "gie": + [ + "g", + "ie" + ], + "kie": + [ + "k", + "ie" + ], + "hie": + [ + "h", + "ie" + ], + "rie": + [ + "r", + "ie" + ], + "ye": + [ + "y", + "ie" + ], + "ie": + [ + "ie" + ], + "ruae": + [ + "r", + "uae" + ], + "wae": + [ + "w", + "uae" + ], + "uae": + [ + "uae" + ], + "bve": + [ + "b", + "ve" + ], + "pve": + [ + "p", + "ve" + ], + "mve": + [ + "m", + "ve" + ], + "fve": + [ + "f", + "ve" + ], + "dve": + [ + "d", + "ve" + ], + "tve": + [ + "t", + "ve" + ], + "nve": + [ + "n", + "ve" + ], + "lve": + [ + "l", + "ve" + ], + "chue": + [ + "ch", + "ve" + ], + "jue": + [ + "j", + "ve" + ], + "que": + [ + "q", + "ve" + ], + "xue": + [ + "x", + "ve" + ], + "gve": + [ + "g", + "ve" + ], + "kve": + [ + "k", + "ve" + ], + "hve": + [ + "h", + "ve" + ], + "rue": + [ + "r", + "ve" + ], + "yue": + [ + "y", + "ve" + ], + "ve": + [ + "ve" + ], + "bai": + [ + "b", + "ai" + ], + "pai": + [ + "p", + "ai" + ], + "mai": + [ + "m", + "ai" + ], + "fai": + [ + "f", + "ai" + ], + "dai": + [ + "d", + "ai" + ], + "tai": + [ + "t", + "ai" + ], + "nai": + [ + "n", + "ai" + ], + "lai": + [ + "l", + "ai" + ], + "zai": + [ + "z", + "ai" + ], + "cai": + [ + "c", + "ai" + ], + "sai": + [ + "s", + "ai" + ], + "zhai": + [ + "zh", + "ai" + ], + "chai": + [ + "ch", + "ai" + ], + "shai": + [ + "sh", + "ai" + ], + "gai": + [ + "g", + "ai" + ], + "kai": + [ + "k", + "ai" + ], + "hai": + [ + "h", + "ai" + ], + "rai": + [ + "r", + "ai" + ], + "ai": + [ + "ai" + ], + "yai": + [ + "y", + "iai" + ], + "iai": + [ + "iai" + ], + "buai": + [ + "b", + "uai" + ], + "puai": + [ + "p", + "uai" + ], + "muai": + [ + "m", + "uai" + ], + "fuai": + [ + "f", + "uai" + ], + "duai": + [ + "d", + "uai" + ], + "tuai": + [ + "t", + "uai" + ], + "nuai": + [ + "n", + "uai" + ], + "luai": + [ + "l", + "uai" + ], + "zuai": + [ + "z", + "uai" + ], + "cuai": + [ + "c", + "uai" + ], + "suai": + [ + "s", + "uai" + ], + "zhuai": + [ + "zh", + "uai" + ], + "chuai": + [ + "ch", + "uai" + ], + "shuai": + [ + "sh", + "uai" + ], + "guai": + [ + "g", + "uai" + ], + "kuai": + [ + "k", + "uai" + ], + "huai": + [ + "h", + "uai" + ], + "ruai": + [ + "r", + "uai" + ], + "wai": + [ + "w", + "uai" + ], + "uai": + [ + "uai" + ], + "bei": + [ + "b", + "ei" + ], + "pei": + [ + "p", + "ei" + ], + "mei": + [ + "m", + "ei" + ], + "fei": + [ + "f", + "ei" + ], + "dei": + [ + "d", + "ei" + ], + "tei": + [ + "t", + "ei" + ], + "nei": + [ + "n", + "ei" + ], + "lei": + [ + "l", + "ei" + ], + "zei": + [ + "z", + "ei" + ], + "cei": + [ + "c", + "ei" + ], + "sei": + [ + "s", + "ei" + ], + "zhei": + [ + "zh", + "ei" + ], + "chei": + [ + "ch", + "ei" + ], + "shei": + [ + "sh", + "ei" + ], + "gei": + [ + "g", + "ei" + ], + "kei": + [ + "k", + "ei" + ], + "hei": + [ + "h", + "ei" + ], + "rei": + [ + "r", + "ei" + ], + "ei": + [ + "ei" + ], + "yei": + [ + "y", + "iei" + ], + "iei": + [ + "iei" + ], + "bui": + [ + "b", + "uei" + ], + "pui": + [ + "p", + "uei" + ], + "mui": + [ + "m", + "uei" + ], + "fui": + [ + "f", + "uei" + ], + "dui": + [ + "d", + "uei" + ], + "tui": + [ + "t", + "uei" + ], + "nui": + [ + "n", + "uei" + ], + "lui": + [ + "l", + "uei" + ], + "zui": + [ + "z", + "uei" + ], + "cui": + [ + "c", + "uei" + ], + "sui": + [ + "s", + "uei" + ], + "zhui": + [ + "zh", + "uei" + ], + "chui": + [ + "ch", + "uei" + ], + "shui": + [ + "sh", + "uei" + ], + "gui": + [ + "g", + "uei" + ], + "kui": + [ + "k", + "uei" + ], + "hui": + [ + "h", + "uei" + ], + "rui": + [ + "r", + "uei" + ], + "wei": + [ + "w", + "uei" + ], + "uei": + [ + "uei" + ], + "bao": + [ + "b", + "ao" + ], + "pao": + [ + "p", + "ao" + ], + "mao": + [ + "m", + "ao" + ], + "fao": + [ + "f", + "ao" + ], + "dao": + [ + "d", + "ao" + ], + "tao": + [ + "t", + "ao" + ], + "nao": + [ + "n", + "ao" + ], + "lao": + [ + "l", + "ao" + ], + "zao": + [ + "z", + "ao" + ], + "cao": + [ + "c", + "ao" + ], + "sao": + [ + "s", + "ao" + ], + "zhao": + [ + "zh", + "ao" + ], + "chao": + [ + "ch", + "ao" + ], + "shao": + [ + "sh", + "ao" + ], + "gao": + [ + "g", + "ao" + ], + "kao": + [ + "k", + "ao" + ], + "hao": + [ + "h", + "ao" + ], + "rao": + [ + "r", + "ao" + ], + "ao": + [ + "ao" + ], + "biao": + [ + "b", + "iao" + ], + "piao": + [ + "p", + "iao" + ], + "miao": + [ + "m", + "iao" + ], + "fiao": + [ + "f", + "iao" + ], + "diao": + [ + "d", + "iao" + ], + "tiao": + [ + "t", + "iao" + ], + "niao": + [ + "n", + "iao" + ], + "liao": + [ + "l", + "iao" + ], + "ziao": + [ + "z", + "iao" + ], + "ciao": + [ + "c", + "iao" + ], + "siao": + [ + "s", + "iao" + ], + "jiao": + [ + "j", + "iao" + ], + "qiao": + [ + "q", + "iao" + ], + "xiao": + [ + "x", + "iao" + ], + "giao": + [ + "g", + "iao" + ], + "kiao": + [ + "k", + "iao" + ], + "hiao": + [ + "h", + "iao" + ], + "yao": + [ + "y", + "iao" + ], + "iao": + [ + "iao" + ], + "wao": + [ + "w", + "uao" + ], + "uao": + [ + "uao" + ], + "bou": + [ + "b", + "ou" + ], + "pou": + [ + "p", + "ou" + ], + "mou": + [ + "m", + "ou" + ], + "fou": + [ + "f", + "ou" + ], + "dou": + [ + "d", + "ou" + ], + "tou": + [ + "t", + "ou" + ], + "nou": + [ + "n", + "ou" + ], + "lou": + [ + "l", + "ou" + ], + "zou": + [ + "z", + "ou" + ], + "cou": + [ + "c", + "ou" + ], + "sou": + [ + "s", + "ou" + ], + "zhou": + [ + "zh", + "ou" + ], + "chou": + [ + "ch", + "ou" + ], + "shou": + [ + "sh", + "ou" + ], + "gou": + [ + "g", + "ou" + ], + "kou": + [ + "k", + "ou" + ], + "hou": + [ + "h", + "ou" + ], + "rou": + [ + "r", + "ou" + ], + "ou": + [ + "ou" + ], + "biu": + [ + "b", + "iou" + ], + "piu": + [ + "p", + "iou" + ], + "miu": + [ + "m", + "iou" + ], + "fiu": + [ + "f", + "iou" + ], + "diu": + [ + "d", + "iou" + ], + "tiu": + [ + "t", + "iou" + ], + "niu": + [ + "n", + "iou" + ], + "liu": + [ + "l", + "iou" + ], + "jiu": + [ + "j", + "iou" + ], + "qiu": + [ + "q", + "iou" + ], + "xiu": + [ + "x", + "iou" + ], + "kiu": + [ + "k", + "iou" + ], + "you": + [ + "y", + "iou" + ], + "iou": + [ + "iou" + ], + "wou": + [ + "w", + "uou" + ], + "uou": + [ + "uou" + ], + "ban": + [ + "b", + "an" + ], + "pan": + [ + "p", + "an" + ], + "man": + [ + "m", + "an" + ], + "fan": + [ + "f", + "an" + ], + "dan": + [ + "d", + "an" + ], + "tan": + [ + "t", + "an" + ], + "nan": + [ + "n", + "an" + ], + "lan": + [ + "l", + "an" + ], + "zan": + [ + "z", + "an" + ], + "can": + [ + "c", + "an" + ], + "san": + [ + "s", + "an" + ], + "zhan": + [ + "zh", + "an" + ], + "chan": + [ + "ch", + "an" + ], + "shan": + [ + "sh", + "an" + ], + "gan": + [ + "g", + "an" + ], + "kan": + [ + "k", + "an" + ], + "han": + [ + "h", + "an" + ], + "ran": + [ + "r", + "an" + ], + "an": + [ + "an" + ], + "buan": + [ + "b", + "uan" + ], + "puan": + [ + "p", + "uan" + ], + "muan": + [ + "m", + "uan" + ], + "fuan": + [ + "f", + "uan" + ], + "duan": + [ + "d", + "uan" + ], + "tuan": + [ + "t", + "uan" + ], + "nuan": + [ + "n", + "uan" + ], + "luan": + [ + "l", + "uan" + ], + "zuan": + [ + "z", + "uan" + ], + "cuan": + [ + "c", + "uan" + ], + "suan": + [ + "s", + "uan" + ], + "zhuan": + [ + "zh", + "uan" + ], + "chuan": + [ + "ch", + "uan" + ], + "shuan": + [ + "sh", + "uan" + ], + "guan": + [ + "g", + "uan" + ], + "kuan": + [ + "k", + "uan" + ], + "huan": + [ + "h", + "uan" + ], + "ruan": + [ + "r", + "uan" + ], + "wan": + [ + "w", + "uan" + ], + "uan": + [ + "uan" + ], + "kaen": + [ + "k", + "aen" + ], + "haen": + [ + "h", + "aen" + ], + "aen": + [ + "aen" + ], + "bian": + [ + "b", + "ian" + ], + "pian": + [ + "p", + "ian" + ], + "mian": + [ + "m", + "ian" + ], + "fian": + [ + "f", + "ian" + ], + "dian": + [ + "d", + "ian" + ], + "tian": + [ + "t", + "ian" + ], + "nian": + [ + "n", + "ian" + ], + "lian": + [ + "l", + "ian" + ], + "zian": + [ + "z", + "ian" + ], + "cian": + [ + "c", + "ian" + ], + "sian": + [ + "s", + "ian" + ], + "zhian": + [ + "zh", + "ian" + ], + "jian": + [ + "j", + "ian" + ], + "qian": + [ + "q", + "ian" + ], + "xian": + [ + "x", + "ian" + ], + "kian": + [ + "k", + "ian" + ], + "yan": + [ + "y", + "ian" + ], + "ian": + [ + "ian" + ], + "juan": + [ + "j", + "van" + ], + "quan": + [ + "q", + "van" + ], + "xuan": + [ + "x", + "van" + ], + "yuan": + [ + "y", + "van" + ], + "van": + [ + "van" + ], + "ben": + [ + "b", + "en" + ], + "pen": + [ + "p", + "en" + ], + "men": + [ + "m", + "en" + ], + "fen": + [ + "f", + "en" + ], + "den": + [ + "d", + "en" + ], + "ten": + [ + "t", + "en" + ], + "nen": + [ + "n", + "en" + ], + "len": + [ + "l", + "en" + ], + "zen": + [ + "z", + "en" + ], + "cen": + [ + "c", + "en" + ], + "sen": + [ + "s", + "en" + ], + "zhen": + [ + "zh", + "en" + ], + "chen": + [ + "ch", + "en" + ], + "shen": + [ + "sh", + "en" + ], + "xen": + [ + "x", + "en" + ], + "gen": + [ + "g", + "en" + ], + "ken": + [ + "k", + "en" + ], + "hen": + [ + "h", + "en" + ], + "ren": + [ + "r", + "en" + ], + "en": + [ + "en" + ], + "bun": + [ + "b", + "uen" + ], + "pun": + [ + "p", + "uen" + ], + "mun": + [ + "m", + "uen" + ], + "fun": + [ + "f", + "uen" + ], + "dun": + [ + "d", + "uen" + ], + "tun": + [ + "t", + "uen" + ], + "nun": + [ + "n", + "uen" + ], + "lun": + [ + "l", + "uen" + ], + "zun": + [ + "z", + "uen" + ], + "cun": + [ + "c", + "uen" + ], + "sun": + [ + "s", + "uen" + ], + "zhun": + [ + "zh", + "uen" + ], + "chun": + [ + "ch", + "uen" + ], + "shun": + [ + "sh", + "uen" + ], + "gun": + [ + "g", + "uen" + ], + "kun": + [ + "k", + "uen" + ], + "hun": + [ + "h", + "uen" + ], + "run": + [ + "r", + "uen" + ], + "wen": + [ + "w", + "uen" + ], + "uen": + [ + "uen" + ], + "bin": + [ + "b", + "in" + ], + "pin": + [ + "p", + "in" + ], + "min": + [ + "m", + "in" + ], + "fin": + [ + "f", + "in" + ], + "din": + [ + "d", + "in" + ], + "tin": + [ + "t", + "in" + ], + "nin": + [ + "n", + "in" + ], + "lin": + [ + "l", + "in" + ], + "zin": + [ + "z", + "in" + ], + "cin": + [ + "c", + "in" + ], + "sin": + [ + "s", + "in" + ], + "jin": + [ + "j", + "in" + ], + "qin": + [ + "q", + "in" + ], + "xin": + [ + "x", + "in" + ], + "yin": + [ + "y", + "in" + ], + "in": + [ + "in" + ], + "jun": + [ + "j", + "vn" + ], + "qun": + [ + "q", + "vn" + ], + "xun": + [ + "x", + "vn" + ], + "yun": + [ + "y", + "vn" + ], + "vn": + [ + "vn" + ], + "bang": + [ + "b", + "ang" + ], + "pang": + [ + "p", + "ang" + ], + "mang": + [ + "m", + "ang" + ], + "fang": + [ + "f", + "ang" + ], + "dang": + [ + "d", + "ang" + ], + "tang": + [ + "t", + "ang" + ], + "nang": + [ + "n", + "ang" + ], + "lang": + [ + "l", + "ang" + ], + "zang": + [ + "z", + "ang" + ], + "cang": + [ + "c", + "ang" + ], + "sang": + [ + "s", + "ang" + ], + "zhang": + [ + "zh", + "ang" + ], + "chang": + [ + "ch", + "ang" + ], + "shang": + [ + "sh", + "ang" + ], + "gang": + [ + "g", + "ang" + ], + "kang": + [ + "k", + "ang" + ], + "hang": + [ + "h", + "ang" + ], + "rang": + [ + "r", + "ang" + ], + "ang": + [ + "ang" + ], + "biang": + [ + "b", + "iang" + ], + "piang": + [ + "p", + "iang" + ], + "miang": + [ + "m", + "iang" + ], + "fiang": + [ + "f", + "iang" + ], + "diang": + [ + "d", + "iang" + ], + "tiang": + [ + "t", + "iang" + ], + "niang": + [ + "n", + "iang" + ], + "liang": + [ + "l", + "iang" + ], + "ziang": + [ + "z", + "iang" + ], + "ciang": + [ + "c", + "iang" + ], + "siang": + [ + "s", + "iang" + ], + "jiang": + [ + "j", + "iang" + ], + "qiang": + [ + "q", + "iang" + ], + "xiang": + [ + "x", + "iang" + ], + "yang": + [ + "y", + "iang" + ], + "iang": + [ + "iang" + ], + "luang": + [ + "l", + "uang" + ], + "zuang": + [ + "z", + "uang" + ], + "cuang": + [ + "c", + "uang" + ], + "suang": + [ + "s", + "uang" + ], + "zhuang": + [ + "zh", + "uang" + ], + "chuang": + [ + "ch", + "uang" + ], + "shuang": + [ + "sh", + "uang" + ], + "guang": + [ + "g", + "uang" + ], + "kuang": + [ + "k", + "uang" + ], + "huang": + [ + "h", + "uang" + ], + "ruang": + [ + "r", + "uang" + ], + "wang": + [ + "w", + "uang" + ], + "uang": + [ + "uang" + ], + "beng": + [ + "b", + "eng" + ], + "peng": + [ + "p", + "eng" + ], + "meng": + [ + "m", + "eng" + ], + "feng": + [ + "f", + "eng" + ], + "deng": + [ + "d", + "eng" + ], + "teng": + [ + "t", + "eng" + ], + "neng": + [ + "n", + "eng" + ], + "leng": + [ + "l", + "eng" + ], + "zeng": + [ + "z", + "eng" + ], + "ceng": + [ + "c", + "eng" + ], + "seng": + [ + "s", + "eng" + ], + "zheng": + [ + "zh", + "eng" + ], + "cheng": + [ + "ch", + "eng" + ], + "sheng": + [ + "sh", + "eng" + ], + "geng": + [ + "g", + "eng" + ], + "keng": + [ + "k", + "eng" + ], + "heng": + [ + "h", + "eng" + ], + "reng": + [ + "r", + "eng" + ], + "eng": + [ + "eng" + ], + "weng": + [ + "w", + "ueng" + ], + "ueng": + [ + "ueng" + ], + "bing": + [ + "b", + "ing" + ], + "ping": + [ + "p", + "ing" + ], + "ming": + [ + "m", + "ing" + ], + "fing": + [ + "f", + "ing" + ], + "ding": + [ + "d", + "ing" + ], + "ting": + [ + "t", + "ing" + ], + "ning": + [ + "n", + "ing" + ], + "ling": + [ + "l", + "ing" + ], + "zing": + [ + "z", + "ing" + ], + "cing": + [ + "c", + "ing" + ], + "sing": + [ + "s", + "ing" + ], + "jing": + [ + "j", + "ing" + ], + "qing": + [ + "q", + "ing" + ], + "xing": + [ + "x", + "ing" + ], + "ging": + [ + "g", + "ing" + ], + "king": + [ + "k", + "ing" + ], + "hing": + [ + "h", + "ing" + ], + "ying": + [ + "y", + "ing" + ], + "ing": + [ + "ing" + ], + "bong": + [ + "b", + "ong" + ], + "pong": + [ + "p", + "ong" + ], + "mong": + [ + "m", + "ong" + ], + "fong": + [ + "f", + "ong" + ], + "dong": + [ + "d", + "ong" + ], + "tong": + [ + "t", + "ong" + ], + "nong": + [ + "n", + "ong" + ], + "long": + [ + "l", + "ong" + ], + "zong": + [ + "z", + "ong" + ], + "cong": + [ + "c", + "ong" + ], + "song": + [ + "s", + "ong" + ], + "zhong": + [ + "zh", + "ong" + ], + "chong": + [ + "ch", + "ong" + ], + "shong": + [ + "sh", + "ong" + ], + "gong": + [ + "g", + "ong" + ], + "kong": + [ + "k", + "ong" + ], + "hong": + [ + "h", + "ong" + ], + "rong": + [ + "r", + "ong" + ], + "ong": + [ + "ong" + ], + "jiong": + [ + "j", + "iong" + ], + "qiong": + [ + "q", + "iong" + ], + "xiong": + [ + "x", + "iong" + ], + "yong": + [ + "y", + "iong" + ], + "iong": + [ + "iong" + ], + "bar": + [ + "b", + "ar" + ], + "par": + [ + "p", + "ar" + ], + "mar": + [ + "m", + "ar" + ], + "far": + [ + "f", + "ar" + ], + "dar": + [ + "d", + "ar" + ], + "tar": + [ + "t", + "ar" + ], + "nar": + [ + "n", + "ar" + ], + "lar": + [ + "l", + "ar" + ], + "zar": + [ + "z", + "ar" + ], + "car": + [ + "c", + "ar" + ], + "sar": + [ + "s", + "ar" + ], + "zhar": + [ + "zh", + "ar" + ], + "char": + [ + "ch", + "ar" + ], + "shar": + [ + "sh", + "ar" + ], + "gar": + [ + "g", + "ar" + ], + "kar": + [ + "k", + "ar" + ], + "har": + [ + "h", + "ar" + ], + "rar": + [ + "r", + "ar" + ], + "ar": + [ + "ar" + ], + "biar": + [ + "b", + "iar" + ], + "piar": + [ + "p", + "iar" + ], + "miar": + [ + "m", + "iar" + ], + "fiar": + [ + "f", + "iar" + ], + "diar": + [ + "d", + "iar" + ], + "tiar": + [ + "t", + "iar" + ], + "niar": + [ + "n", + "iar" + ], + "liar": + [ + "l", + "iar" + ], + "jiar": + [ + "j", + "iar" + ], + "qiar": + [ + "q", + "iar" + ], + "xiar": + [ + "x", + "iar" + ], + "yar": + [ + "y", + "iar" + ], + "iar": + [ + "iar" + ], + "juar": + [ + "j", + "var" + ], + "quar": + [ + "q", + "var" + ], + "xuar": + [ + "x", + "var" + ], + "yuar": + [ + "y", + "var" + ], + "var": + [ + "var" + ], + "duar": + [ + "d", + "uar" + ], + "tuar": + [ + "t", + "uar" + ], + "nuar": + [ + "n", + "uar" + ], + "luar": + [ + "l", + "uar" + ], + "zuar": + [ + "z", + "uar" + ], + "cuar": + [ + "c", + "uar" + ], + "suar": + [ + "s", + "uar" + ], + "zhuar": + [ + "zh", + "uar" + ], + "chuar": + [ + "ch", + "uar" + ], + "shuar": + [ + "sh", + "uar" + ], + "guar": + [ + "g", + "uar" + ], + "kuar": + [ + "k", + "uar" + ], + "huar": + [ + "h", + "uar" + ], + "ruar": + [ + "r", + "uar" + ], + "war": + [ + "w", + "uar" + ], + "uar": + [ + "uar" + ], + "baor": + [ + "b", + "aor" + ], + "paor": + [ + "p", + "aor" + ], + "maor": + [ + "m", + "aor" + ], + "faor": + [ + "f", + "aor" + ], + "daor": + [ + "d", + "aor" + ], + "taor": + [ + "t", + "aor" + ], + "naor": + [ + "n", + "aor" + ], + "laor": + [ + "l", + "aor" + ], + "zaor": + [ + "z", + "aor" + ], + "caor": + [ + "c", + "aor" + ], + "saor": + [ + "s", + "aor" + ], + "zhaor": + [ + "zh", + "aor" + ], + "chaor": + [ + "ch", + "aor" + ], + "shaor": + [ + "sh", + "aor" + ], + "gaor": + [ + "g", + "aor" + ], + "kaor": + [ + "k", + "aor" + ], + "haor": + [ + "h", + "aor" + ], + "raor": + [ + "r", + "aor" + ], + "aor": + [ + "aor" + ], + "biaor": + [ + "b", + "iaor" + ], + "piaor": + [ + "p", + "iaor" + ], + "miaor": + [ + "m", + "iaor" + ], + "fiaor": + [ + "f", + "iaor" + ], + "diaor": + [ + "d", + "iaor" + ], + "tiaor": + [ + "t", + "iaor" + ], + "niaor": + [ + "n", + "iaor" + ], + "liaor": + [ + "l", + "iaor" + ], + "jiaor": + [ + "j", + "iaor" + ], + "qiaor": + [ + "q", + "iaor" + ], + "xiaor": + [ + "x", + "iaor" + ], + "yaor": + [ + "y", + "iaor" + ], + "iaor": + [ + "iaor" + ], + "beer": + [ + "b", + "eer" + ], + "peer": + [ + "p", + "eer" + ], + "meer": + [ + "m", + "eer" + ], + "feer": + [ + "f", + "eer" + ], + "deer": + [ + "d", + "eer" + ], + "teer": + [ + "t", + "eer" + ], + "neer": + [ + "n", + "eer" + ], + "leer": + [ + "l", + "eer" + ], + "zeer": + [ + "z", + "eer" + ], + "ceer": + [ + "c", + "eer" + ], + "seer": + [ + "s", + "eer" + ], + "zheer": + [ + "zh", + "eer" + ], + "cheer": + [ + "ch", + "eer" + ], + "sheer": + [ + "sh", + "eer" + ], + "geer": + [ + "g", + "eer" + ], + "keer": + [ + "k", + "eer" + ], + "heer": + [ + "h", + "eer" + ], + "reer": + [ + "r", + "eer" + ], + "eer": + [ + "eer" + ], + "bier": + [ + "b", + "ier" + ], + "pier": + [ + "p", + "ier" + ], + "mier": + [ + "m", + "ier" + ], + "fier": + [ + "f", + "ier" + ], + "dier": + [ + "d", + "ier" + ], + "tier": + [ + "t", + "ier" + ], + "nier": + [ + "n", + "ier" + ], + "lier": + [ + "l", + "ier" + ], + "jier": + [ + "j", + "ier" + ], + "qier": + [ + "q", + "ier" + ], + "xier": + [ + "x", + "ier" + ], + "yer": + [ + "y", + "ier" + ], + "ier": + [ + "ier" + ], + "nver": + [ + "n", + "ver" + ], + "lver": + [ + "l", + "ver" + ], + "juer": + [ + "j", + "ver" + ], + "quer": + [ + "q", + "ver" + ], + "xuer": + [ + "x", + "ver" + ], + "yuer": + [ + "y", + "ver" + ], + "ver": + [ + "ver" + ], + "bour": + [ + "b", + "our" + ], + "pour": + [ + "p", + "our" + ], + "mour": + [ + "m", + "our" + ], + "four": + [ + "f", + "our" + ], + "dour": + [ + "d", + "our" + ], + "tour": + [ + "t", + "our" + ], + "nour": + [ + "n", + "our" + ], + "lour": + [ + "l", + "our" + ], + "zour": + [ + "z", + "our" + ], + "cour": + [ + "c", + "our" + ], + "sour": + [ + "s", + "our" + ], + "zhour": + [ + "zh", + "our" + ], + "chour": + [ + "ch", + "our" + ], + "shour": + [ + "sh", + "our" + ], + "gour": + [ + "g", + "our" + ], + "kour": + [ + "k", + "our" + ], + "hour": + [ + "h", + "our" + ], + "rour": + [ + "r", + "our" + ], + "our": + [ + "our" + ], + "biur": + [ + "b", + "iour" + ], + "piur": + [ + "p", + "iour" + ], + "miur": + [ + "m", + "iour" + ], + "fiur": + [ + "f", + "iour" + ], + "diur": + [ + "d", + "iour" + ], + "tiur": + [ + "t", + "iour" + ], + "niur": + [ + "n", + "iour" + ], + "liur": + [ + "l", + "iour" + ], + "jiur": + [ + "j", + "iour" + ], + "qiur": + [ + "q", + "iour" + ], + "xiur": + [ + "x", + "iour" + ], + "your": + [ + "y", + "iour" + ], + "iour": + [ + "iour" + ], + "bor": + [ + "b", + "uor" + ], + "por": + [ + "p", + "uor" + ], + "mor": + [ + "m", + "uor" + ], + "for": + [ + "f", + "uor" + ], + "duor": + [ + "d", + "uor" + ], + "tuor": + [ + "t", + "uor" + ], + "nuor": + [ + "n", + "uor" + ], + "luor": + [ + "l", + "uor" + ], + "zuor": + [ + "z", + "uor" + ], + "cuor": + [ + "c", + "uor" + ], + "suor": + [ + "s", + "uor" + ], + "zhuor": + [ + "zh", + "uor" + ], + "chuor": + [ + "ch", + "uor" + ], + "shuor": + [ + "sh", + "uor" + ], + "guor": + [ + "g", + "uor" + ], + "kuor": + [ + "k", + "uor" + ], + "huor": + [ + "h", + "uor" + ], + "ruor": + [ + "r", + "uor" + ], + "wor": + [ + "w", + "uor" + ], + "uor": + [ + "uor" + ], + "ber": + [ + "b", + "er" + ], + "per": + [ + "p", + "er" + ], + "mer": + [ + "m", + "er" + ], + "fer": + [ + "f", + "er" + ], + "der": + [ + "d", + "er" + ], + "ter": + [ + "t", + "er" + ], + "ner": + [ + "n", + "er" + ], + "ler": + [ + "l", + "er" + ], + "zer": + [ + "z", + "er" + ], + "cer": + [ + "c", + "er" + ], + "ser": + [ + "s", + "er" + ], + "zher": + [ + "zh", + "er" + ], + "cher": + [ + "ch", + "er" + ], + "sher": + [ + "sh", + "er" + ], + "ger": + [ + "g", + "er" + ], + "ker": + [ + "k", + "er" + ], + "her": + [ + "h", + "er" + ], + "rer": + [ + "r", + "er" + ], + "er": + [ + "er" + ], + "bir": + [ + "b", + "ir" + ], + "pir": + [ + "p", + "ir" + ], + "mir": + [ + "m", + "ir" + ], + "fir": + [ + "f", + "ir" + ], + "dir": + [ + "d", + "ir" + ], + "tir": + [ + "t", + "ir" + ], + "nir": + [ + "n", + "ir" + ], + "lir": + [ + "l", + "ir" + ], + "jir": + [ + "j", + "ir" + ], + "qir": + [ + "q", + "ir" + ], + "xir": + [ + "x", + "ir" + ], + "yir": + [ + "y", + "ir" + ], + "ir": + [ + "ir" + ], + "nvr": + [ + "n", + "vr" + ], + "lvr": + [ + "l", + "vr" + ], + "jur": + [ + "j", + "vr" + ], + "qur": + [ + "q", + "vr" + ], + "xur": + [ + "x", + "vr" + ], + "yur": + [ + "y", + "vr" + ], + "vr": + [ + "vr" + ], + "duer": + [ + "d", + "uer" + ], + "tuer": + [ + "t", + "uer" + ], + "nuer": + [ + "n", + "uer" + ], + "luer": + [ + "l", + "uer" + ], + "zuer": + [ + "z", + "uer" + ], + "cuer": + [ + "c", + "uer" + ], + "suer": + [ + "s", + "uer" + ], + "zhuer": + [ + "zh", + "uer" + ], + "chuer": + [ + "ch", + "uer" + ], + "shuer": + [ + "sh", + "uer" + ], + "guer": + [ + "g", + "uer" + ], + "kuer": + [ + "k", + "uer" + ], + "huer": + [ + "h", + "uer" + ], + "ruer": + [ + "r", + "uer" + ], + "wer": + [ + "w", + "uer" + ], + "uer": + [ + "uer" + ], + "bur": + [ + "b", + "ur" + ], + "pur": + [ + "p", + "ur" + ], + "mur": + [ + "m", + "ur" + ], + "fur": + [ + "f", + "ur" + ], + "dur": + [ + "d", + "ur" + ], + "tur": + [ + "t", + "ur" + ], + "nur": + [ + "n", + "ur" + ], + "lur": + [ + "l", + "ur" + ], + "zur": + [ + "z", + "ur" + ], + "cur": + [ + "c", + "ur" + ], + "sur": + [ + "s", + "ur" + ], + "zhur": + [ + "zh", + "ur" + ], + "chur": + [ + "ch", + "ur" + ], + "shur": + [ + "sh", + "ur" + ], + "gur": + [ + "g", + "ur" + ], + "kur": + [ + "k", + "ur" + ], + "hur": + [ + "h", + "ur" + ], + "rur": + [ + "r", + "ur" + ], + "wur": + [ + "w", + "ur" + ], + "ur": + [ + "ur" + ], + "bangr": + [ + "b", + "angr" + ], + "pangr": + [ + "p", + "angr" + ], + "mangr": + [ + "m", + "angr" + ], + "fangr": + [ + "f", + "angr" + ], + "dangr": + [ + "d", + "angr" + ], + "tangr": + [ + "t", + "angr" + ], + "nangr": + [ + "n", + "angr" + ], + "langr": + [ + "l", + "angr" + ], + "zangr": + [ + "z", + "angr" + ], + "cangr": + [ + "c", + "angr" + ], + "sangr": + [ + "s", + "angr" + ], + "zhangr": + [ + "zh", + "angr" + ], + "changr": + [ + "ch", + "angr" + ], + "shangr": + [ + "sh", + "angr" + ], + "gangr": + [ + "g", + "angr" + ], + "kangr": + [ + "k", + "angr" + ], + "hangr": + [ + "h", + "angr" + ], + "rangr": + [ + "r", + "angr" + ], + "angr": + [ + "angr" + ], + "biangr": + [ + "b", + "iangr" + ], + "niangr": + [ + "n", + "iangr" + ], + "liangr": + [ + "l", + "iangr" + ], + "jiangr": + [ + "j", + "iangr" + ], + "qiangr": + [ + "q", + "iangr" + ], + "xiangr": + [ + "x", + "iangr" + ], + "yangr": + [ + "y", + "iangr" + ], + "iangr": + [ + "iangr" + ], + "zhuangr": + [ + "zh", + "uangr" + ], + "chuangr": + [ + "ch", + "uangr" + ], + "shuangr": + [ + "sh", + "uangr" + ], + "guangr": + [ + "g", + "uangr" + ], + "kuangr": + [ + "k", + "uangr" + ], + "huangr": + [ + "h", + "uangr" + ], + "ruangr": + [ + "r", + "uangr" + ], + "wangr": + [ + "w", + "uangr" + ], + "uangr": + [ + "uangr" + ], + "bengr": + [ + "b", + "engr" + ], + "pengr": + [ + "p", + "engr" + ], + "mengr": + [ + "m", + "engr" + ], + "fengr": + [ + "f", + "engr" + ], + "dengr": + [ + "d", + "engr" + ], + "tengr": + [ + "t", + "engr" + ], + "nengr": + [ + "n", + "engr" + ], + "lengr": + [ + "l", + "engr" + ], + "zengr": + [ + "z", + "engr" + ], + "cengr": + [ + "c", + "engr" + ], + "sengr": + [ + "s", + "engr" + ], + "zhengr": + [ + "zh", + "engr" + ], + "chengr": + [ + "ch", + "engr" + ], + "shengr": + [ + "sh", + "engr" + ], + "gengr": + [ + "g", + "engr" + ], + "kengr": + [ + "k", + "engr" + ], + "hengr": + [ + "h", + "engr" + ], + "rengr": + [ + "r", + "engr" + ], + "engr": + [ + "engr" + ], + "bingr": + [ + "b", + "ingr" + ], + "pingr": + [ + "p", + "ingr" + ], + "mingr": + [ + "m", + "ingr" + ], + "fingr": + [ + "f", + "ingr" + ], + "dingr": + [ + "d", + "ingr" + ], + "tingr": + [ + "t", + "ingr" + ], + "ningr": + [ + "n", + "ingr" + ], + "lingr": + [ + "l", + "ingr" + ], + "jingr": + [ + "j", + "ingr" + ], + "qingr": + [ + "q", + "ingr" + ], + "xingr": + [ + "x", + "ingr" + ], + "yingr": + [ + "y", + "ingr" + ], + "ingr": + [ + "ingr" + ], + "wengr": + [ + "w", + "uengr" + ], + "uengr": + [ + "uengr" + ], + "dongr": + [ + "d", + "ongr" + ], + "tongr": + [ + "t", + "ongr" + ], + "nongr": + [ + "n", + "ongr" + ], + "longr": + [ + "l", + "ongr" + ], + "zongr": + [ + "z", + "ongr" + ], + "congr": + [ + "c", + "ongr" + ], + "songr": + [ + "s", + "ongr" + ], + "zhongr": + [ + "zh", + "ongr" + ], + "chongr": + [ + "ch", + "ongr" + ], + "shongr": + [ + "sh", + "ongr" + ], + "gongr": + [ + "g", + "ongr" + ], + "kongr": + [ + "k", + "ongr" + ], + "hongr": + [ + "h", + "ongr" + ], + "rongr": + [ + "r", + "ongr" + ], + "ongr": + [ + "ongr" + ], + "jiongr": + [ + "j", + "iongr" + ], + "qiongr": + [ + "q", + "iongr" + ], + "xiongr": + [ + "x", + "iongr" + ], + "yongr": + [ + "y", + "iongr" + ], + "iongr": + [ + "iongr" + ], + "mm": + [ + "mm" + ], + "nn": + [ + "nn" + ], + "ng": + [ + "ng" + ] + }, + "phon_class": + { + "head": + [ + "b", + "z", + "l", + "sh", + "p", + "d", + "m", + "x", + "s", + "y", + "r", + "f", + "n", + "h", + "c", + "j", + "zh", + "ch", + "t", + "g", + "q", + "w", + "k" + ], + "tail": + [ + "ia", + "i", + "ua", + "ei", + "van", + "iang", + "a", + "iong", + "uar", + "angr", + "nn", + "uengr", + "ng", + "ao", + "uo", + "iou", + "en", + "uang", + "er", + "eh", + "ier", + "v", + "ae", + "aor", + "vr", + "ing", + "iao", + "in", + "our", + "uei", + "ir", + "eer", + "iii", + "ong", + "ver", + "iour", + "iai", + "u", + "io", + "ie", + "aen", + "ueng", + "ur", + "engr", + "ingr", + "ongr", + "eng", + "ou", + "uen", + "o", + "uae", + "e", + "uao", + "ar", + "ve", + "iangr", + "ii", + "var", + "iar", + "iongr", + "uer", + "iei", + "iaor", + "uou", + "uan", + "ang", + "ai", + "uor", + "uangr", + "mm", + "an", + "uai", + "ian", + "vn" + ] + } + }, + { + "language": "jp", + "syllable_alias": + { + "n": "nv", + "m": "mv", + "N": "nv", + "M": "mv", + "la": "ra", + "A": "ax", + "I": "ix", + "U": "ux", + "E": "ex", + "O": "ox", + "t": "cl", + "jya": "ja", + "jyu": "ju", + "jye": "je", + "jyo": "jo", + "sya": "sha", + "syu": "shu", + "sye": "she", + "syo": "sho", + "cya": "cha", + "cyu": "chu", + "cye": "che", + "cyo": "cho", + "kA": "kax", + "kE": "kex", + "kO": "kox", + "sA": "sax", + "sI": "six", + "sU": "sux", + "sE": "sex", + "sO": "sox", + "tA": "tax", + "tU": "tux", + "tE": "tex", + "tO": "tox", + "nA": "nax", + "nU": "nux", + "nE": "nex", + "nO": "nox", + "hA": "hax", + "hU": "hux", + "hE": "hex", + "hO": "hox", + "mA": "max", + "mU": "mux", + "mE": "mex", + "mO": "mox", + "yA": "yax", + "yU": "yux", + "yE": "yex", + "yO": "yox", + "rA": "rax", + "rU": "rux", + "rE": "rex", + "rO": "rox", + "rrA": "rrax", + "rrI": "rrix", + "rrU": "rrux", + "rrE": "rrex", + "rrO": "rrox", + "wA": "wax", + "wI": "wix", + "wE": "wex", + "wO": "wox", + "gA": "gax", + "gE": "gex", + "gO": "gox", + "zA": "zax", + "zI": "zix", + "zU": "zux", + "zE": "zex", + "zO": "zox", + "jA": "jax", + "jyA": "jax", + "jI": "jix", + "jU": "jux", + "jyU": "jux", + "jE": "jex", + "jyE": "jex", + "jO": "jox", + "jyO": "jox", + "dA": "dax", + "dU": "dux", + "dE": "dex", + "dO": "dox", + "bA": "bax", + "bU": "bux", + "bE": "bex", + "bO": "box", + "pA": "pax", + "pU": "pux", + "pE": "pex", + "pO": "pox", + "fA": "fax", + "fU": "fux", + "fE": "fex", + "fO": "fox", + "vA": "vax", + "vU": "vux", + "vE": "vex", + "vO": "vox", + "tsA": "tsax", + "tsI": "tsix", + "tsU": "tsux", + "tsE": "tsex", + "tsO": "tsox", + "ngA": "ngax", + "ngU": "ngux", + "ngE": "ngex", + "ngO": "ngox", + "shA": "shax", + "syA": "shax", + "shI": "shix", + "shU": "shux", + "syU": "shux", + "shE": "shex", + "syE": "shex", + "shO": "shox", + "syO": "shox", + "chA": "chax", + "cyA": "chax", + "chI": "chix", + "chU": "chux", + "cyU": "chux", + "chE": "chex", + "cyE": "chex", + "chO": "chox", + "cyO": "chox", + "kyA": "kyax", + "kI": "kix", + "kyU": "kyux", + "kyE": "kyex", + "kyO": "kyox", + "tyA": "tyax", + "tI": "tix", + "tyU": "tyux", + "tyE": "tyex", + "tyO": "tyox", + "myA": "myax", + "mI": "mix", + "myU": "myux", + "myE": "myex", + "myO": "myox", + "nyA": "nyax", + "nI": "nix", + "nyU": "nyux", + "nyE": "nyex", + "nyO": "nyox", + "hyA": "hyax", + "hI": "hix", + "hyU": "hyux", + "hyE": "hyex", + "hyO": "hyox", + "ryA": "ryax", + "rI": "rix", + "ryU": "ryux", + "ryE": "ryex", + "ryO": "ryox", + "gyA": "gyax", + "gI": "gix", + "gyU": "gyux", + "gyE": "gyex", + "gyO": "gyox", + "byA": "byax", + "bI": "bix", + "byU": "byux", + "byE": "byex", + "byO": "byox", + "pyA": "pyax", + "pI": "pix", + "pyU": "pyux", + "pyE": "pyex", + "pyO": "pyox", + "ngyA": "ngyax", + "ngI": "ngix", + "ngyU": "ngyux", + "ngyE": "ngyex", + "ngyO": "ngyox", + "fyA": "fyax", + "fI": "fix", + "fyU": "fyux", + "fyE": "fyex", + "fyO": "fyox", + "vyA": "vyax", + "vI": "vix", + "vyU": "vyux", + "vyE": "vyex", + "vyO": "vyox", + "kwA": "kwax", + "kwI": "kwix", + "kU": "kux", + "kwE": "kwex", + "kwO": "kwox", + "gwA": "gwax", + "gwI": "gwix", + "gU": "gux", + "gwE": "gwex", + "gwO": "gwox" + }, + "dict": + { + "a": + [ + "a" + ], + "i": + [ + "i" + ], + "u": + [ + "u" + ], + "e": + [ + "e" + ], + "o": + [ + "o" + ], + "ax": + [ + "ax" + ], + "ix": + [ + "ix" + ], + "ux": + [ + "ux" + ], + "ex": + [ + "ex" + ], + "ox": + [ + "ox" + ], + "nv": + [ + "nv" + ], + "mv": + [ + "mv" + ], + "cl": + [ + "cl" + ], + "ka": + [ + "k", + "a" + ], + "ke": + [ + "k", + "e" + ], + "ko": + [ + "k", + "o" + ], + "kax": + [ + "k", + "ax" + ], + "kex": + [ + "k", + "ex" + ], + "kox": + [ + "k", + "ox" + ], + "sa": + [ + "s", + "a" + ], + "si": + [ + "s", + "i" + ], + "su": + [ + "s", + "u" + ], + "se": + [ + "s", + "e" + ], + "so": + [ + "s", + "o" + ], + "sax": + [ + "s", + "ax" + ], + "six": + [ + "s", + "ix" + ], + "sux": + [ + "s", + "ux" + ], + "sex": + [ + "s", + "ex" + ], + "sox": + [ + "s", + "ox" + ], + "ta": + [ + "t", + "a" + ], + "tu": + [ + "t", + "u" + ], + "te": + [ + "t", + "e" + ], + "to": + [ + "t", + "o" + ], + "tax": + [ + "t", + "ax" + ], + "tux": + [ + "t", + "ux" + ], + "tex": + [ + "t", + "ex" + ], + "tox": + [ + "t", + "ox" + ], + "na": + [ + "n", + "a" + ], + "nu": + [ + "n", + "u" + ], + "ne": + [ + "n", + "e" + ], + "no": + [ + "n", + "o" + ], + "nax": + [ + "n", + "ax" + ], + "nux": + [ + "n", + "ux" + ], + "nex": + [ + "n", + "ex" + ], + "nox": + [ + "n", + "ox" + ], + "ha": + [ + "h", + "a" + ], + "hu": + [ + "h", + "u" + ], + "he": + [ + "h", + "e" + ], + "ho": + [ + "h", + "o" + ], + "hax": + [ + "h", + "ax" + ], + "hux": + [ + "h", + "ux" + ], + "hex": + [ + "h", + "ex" + ], + "hox": + [ + "h", + "ox" + ], + "ma": + [ + "m", + "a" + ], + "mu": + [ + "m", + "u" + ], + "me": + [ + "m", + "e" + ], + "mo": + [ + "m", + "o" + ], + "max": + [ + "m", + "ax" + ], + "mux": + [ + "m", + "ux" + ], + "mex": + [ + "m", + "ex" + ], + "mox": + [ + "m", + "ox" + ], + "ya": + [ + "y", + "a" + ], + "yu": + [ + "y", + "u" + ], + "ye": + [ + "y", + "e" + ], + "yo": + [ + "y", + "o" + ], + "yax": + [ + "y", + "ax" + ], + "yux": + [ + "y", + "ux" + ], + "yex": + [ + "y", + "ex" + ], + "yox": + [ + "y", + "ox" + ], + "ra": + [ + "r", + "a" + ], + "ru": + [ + "r", + "u" + ], + "re": + [ + "r", + "e" + ], + "ro": + [ + "r", + "o" + ], + "rax": + [ + "r", + "ax" + ], + "rux": + [ + "r", + "ux" + ], + "rex": + [ + "r", + "ex" + ], + "rox": + [ + "r", + "ox" + ], + "rra": + [ + "rr", + "a" + ], + "rri": + [ + "rr", + "i" + ], + "rru": + [ + "rr", + "u" + ], + "rre": + [ + "rr", + "e" + ], + "rro": + [ + "rr", + "o" + ], + "rrax": + [ + "rr", + "ax" + ], + "rrix": + [ + "rr", + "ix" + ], + "rrux": + [ + "rr", + "ux" + ], + "rrex": + [ + "rr", + "ex" + ], + "rrox": + [ + "rr", + "ox" + ], + "wa": + [ + "w", + "a" + ], + "wi": + [ + "w", + "i" + ], + "we": + [ + "w", + "e" + ], + "wo": + [ + "w", + "o" + ], + "wax": + [ + "w", + "ax" + ], + "wix": + [ + "w", + "ix" + ], + "wex": + [ + "w", + "ex" + ], + "wox": + [ + "w", + "ox" + ], + "ga": + [ + "g", + "a" + ], + "ge": + [ + "g", + "e" + ], + "go": + [ + "g", + "o" + ], + "gax": + [ + "g", + "ax" + ], + "gex": + [ + "g", + "ex" + ], + "gox": + [ + "g", + "ox" + ], + "za": + [ + "z", + "a" + ], + "zi": + [ + "z", + "i" + ], + "zu": + [ + "z", + "u" + ], + "ze": + [ + "z", + "e" + ], + "zo": + [ + "z", + "o" + ], + "zax": + [ + "z", + "ax" + ], + "zix": + [ + "z", + "ix" + ], + "zux": + [ + "z", + "ux" + ], + "zex": + [ + "z", + "ex" + ], + "zox": + [ + "z", + "ox" + ], + "ja": + [ + "j", + "a" + ], + "ji": + [ + "j", + "i" + ], + "ju": + [ + "j", + "u" + ], + "je": + [ + "j", + "e" + ], + "jo": + [ + "j", + "o" + ], + "jax": + [ + "j", + "ax" + ], + "jix": + [ + "j", + "ix" + ], + "jux": + [ + "j", + "ux" + ], + "jex": + [ + "j", + "ex" + ], + "jox": + [ + "j", + "ox" + ], + "da": + [ + "d", + "a" + ], + "du": + [ + "d", + "u" + ], + "de": + [ + "d", + "e" + ], + "do": + [ + "d", + "o" + ], + "dax": + [ + "d", + "ax" + ], + "dux": + [ + "d", + "ux" + ], + "dex": + [ + "d", + "ex" + ], + "dox": + [ + "d", + "ox" + ], + "ba": + [ + "b", + "a" + ], + "bu": + [ + "b", + "u" + ], + "be": + [ + "b", + "e" + ], + "bo": + [ + "b", + "o" + ], + "bax": + [ + "b", + "ax" + ], + "bux": + [ + "b", + "ux" + ], + "bex": + [ + "b", + "ex" + ], + "box": + [ + "b", + "ox" + ], + "pa": + [ + "p", + "a" + ], + "pu": + [ + "p", + "u" + ], + "pe": + [ + "p", + "e" + ], + "po": + [ + "p", + "o" + ], + "pax": + [ + "p", + "ax" + ], + "pux": + [ + "p", + "ux" + ], + "pex": + [ + "p", + "ex" + ], + "pox": + [ + "p", + "ox" + ], + "fa": + [ + "f", + "a" + ], + "fu": + [ + "f", + "u" + ], + "fe": + [ + "f", + "e" + ], + "fo": + [ + "f", + "o" + ], + "fax": + [ + "f", + "ax" + ], + "fux": + [ + "f", + "ux" + ], + "fex": + [ + "f", + "ex" + ], + "fox": + [ + "f", + "ox" + ], + "va": + [ + "v", + "a" + ], + "vu": + [ + "v", + "u" + ], + "ve": + [ + "v", + "e" + ], + "vo": + [ + "v", + "o" + ], + "vax": + [ + "v", + "ax" + ], + "vux": + [ + "v", + "ux" + ], + "vex": + [ + "v", + "ex" + ], + "vox": + [ + "v", + "ox" + ], + "tsa": + [ + "ts", + "a" + ], + "tsi": + [ + "ts", + "i" + ], + "tsu": + [ + "ts", + "u" + ], + "tse": + [ + "ts", + "e" + ], + "tso": + [ + "ts", + "o" + ], + "tsax": + [ + "ts", + "ax" + ], + "tsix": + [ + "ts", + "ix" + ], + "tsux": + [ + "ts", + "ux" + ], + "tsex": + [ + "ts", + "ex" + ], + "tsox": + [ + "ts", + "ox" + ], + "nga": + [ + "ng", + "a" + ], + "ngu": + [ + "ng", + "u" + ], + "nge": + [ + "ng", + "e" + ], + "ngo": + [ + "ng", + "o" + ], + "ngax": + [ + "ng", + "ax" + ], + "ngux": + [ + "ng", + "ux" + ], + "ngex": + [ + "ng", + "ex" + ], + "ngox": + [ + "ng", + "ox" + ], + "sha": + [ + "sh", + "a" + ], + "shi": + [ + "sh", + "i" + ], + "shu": + [ + "sh", + "u" + ], + "she": + [ + "sh", + "e" + ], + "sho": + [ + "sh", + "o" + ], + "shax": + [ + "sh", + "ax" + ], + "shix": + [ + "sh", + "ix" + ], + "shux": + [ + "sh", + "ux" + ], + "shex": + [ + "sh", + "ex" + ], + "shox": + [ + "sh", + "ox" + ], + "cha": + [ + "ch", + "a" + ], + "chi": + [ + "ch", + "i" + ], + "chu": + [ + "ch", + "u" + ], + "che": + [ + "ch", + "e" + ], + "cho": + [ + "ch", + "o" + ], + "chax": + [ + "ch", + "ax" + ], + "chix": + [ + "ch", + "ix" + ], + "chux": + [ + "ch", + "ux" + ], + "chex": + [ + "ch", + "ex" + ], + "chox": + [ + "ch", + "ox" + ], + "kya": + [ + "ky", + "a" + ], + "ki": + [ + "ky", + "i" + ], + "kyu": + [ + "ky", + "u" + ], + "kye": + [ + "ky", + "e" + ], + "kyo": + [ + "ky", + "o" + ], + "kyax": + [ + "ky", + "ax" + ], + "kix": + [ + "ky", + "ix" + ], + "kyux": + [ + "ky", + "ux" + ], + "kyex": + [ + "ky", + "ex" + ], + "kyox": + [ + "ky", + "ox" + ], + "tya": + [ + "ty", + "a" + ], + "ti": + [ + "ty", + "i" + ], + "tyu": + [ + "ty", + "u" + ], + "tye": + [ + "ty", + "e" + ], + "tyo": + [ + "ty", + "o" + ], + "tyax": + [ + "ty", + "ax" + ], + "tix": + [ + "ty", + "ix" + ], + "tyux": + [ + "ty", + "ux" + ], + "tyex": + [ + "ty", + "ex" + ], + "tyox": + [ + "ty", + "ox" + ], + "mya": + [ + "my", + "a" + ], + "mi": + [ + "my", + "i" + ], + "myu": + [ + "my", + "u" + ], + "mye": + [ + "my", + "e" + ], + "myo": + [ + "my", + "o" + ], + "myax": + [ + "my", + "ax" + ], + "mix": + [ + "my", + "ix" + ], + "myux": + [ + "my", + "ux" + ], + "myex": + [ + "my", + "ex" + ], + "myox": + [ + "my", + "ox" + ], + "nya": + [ + "ny", + "a" + ], + "ni": + [ + "ny", + "i" + ], + "nyu": + [ + "ny", + "u" + ], + "nye": + [ + "ny", + "e" + ], + "nyo": + [ + "ny", + "o" + ], + "nyax": + [ + "ny", + "ax" + ], + "nix": + [ + "ny", + "ix" + ], + "nyux": + [ + "ny", + "ux" + ], + "nyex": + [ + "ny", + "ex" + ], + "nyox": + [ + "ny", + "ox" + ], + "hya": + [ + "hy", + "a" + ], + "hi": + [ + "hy", + "i" + ], + "hyu": + [ + "hy", + "u" + ], + "hye": + [ + "hy", + "e" + ], + "hyo": + [ + "hy", + "o" + ], + "hyax": + [ + "hy", + "ax" + ], + "hix": + [ + "hy", + "ix" + ], + "hyux": + [ + "hy", + "ux" + ], + "hyex": + [ + "hy", + "ex" + ], + "hyox": + [ + "hy", + "ox" + ], + "rya": + [ + "ry", + "a" + ], + "ri": + [ + "ry", + "i" + ], + "ryu": + [ + "ry", + "u" + ], + "rye": + [ + "ry", + "e" + ], + "ryo": + [ + "ry", + "o" + ], + "ryax": + [ + "ry", + "ax" + ], + "rix": + [ + "ry", + "ix" + ], + "ryux": + [ + "ry", + "ux" + ], + "ryex": + [ + "ry", + "ex" + ], + "ryox": + [ + "ry", + "ox" + ], + "gya": + [ + "gy", + "a" + ], + "gi": + [ + "gy", + "i" + ], + "gyu": + [ + "gy", + "u" + ], + "gye": + [ + "gy", + "e" + ], + "gyo": + [ + "gy", + "o" + ], + "gyax": + [ + "gy", + "ax" + ], + "gix": + [ + "gy", + "ix" + ], + "gyux": + [ + "gy", + "ux" + ], + "gyex": + [ + "gy", + "ex" + ], + "gyox": + [ + "gy", + "ox" + ], + "bya": + [ + "by", + "a" + ], + "bi": + [ + "by", + "i" + ], + "byu": + [ + "by", + "u" + ], + "bye": + [ + "by", + "e" + ], + "byo": + [ + "by", + "o" + ], + "byax": + [ + "by", + "ax" + ], + "bix": + [ + "by", + "ix" + ], + "byux": + [ + "by", + "ux" + ], + "byex": + [ + "by", + "ex" + ], + "byox": + [ + "by", + "ox" + ], + "pya": + [ + "py", + "a" + ], + "pi": + [ + "py", + "i" + ], + "pyu": + [ + "py", + "u" + ], + "pye": + [ + "py", + "e" + ], + "pyo": + [ + "py", + "o" + ], + "pyax": + [ + "py", + "ax" + ], + "pix": + [ + "py", + "ix" + ], + "pyux": + [ + "py", + "ux" + ], + "pyex": + [ + "py", + "ex" + ], + "pyox": + [ + "py", + "ox" + ], + "dya": + [ + "dy", + "a" + ], + "di": + [ + "dy", + "i" + ], + "dyu": + [ + "dy", + "u" + ], + "dye": + [ + "dy", + "e" + ], + "dyo": + [ + "dy", + "o" + ], + "dyax": + [ + "dy", + "ax" + ], + "dix": + [ + "dy", + "ix" + ], + "dyux": + [ + "dy", + "ux" + ], + "dyex": + [ + "dy", + "ex" + ], + "dyox": + [ + "dy", + "ox" + ], + "ngya": + [ + "ngy", + "a" + ], + "ngi": + [ + "ngy", + "i" + ], + "ngyu": + [ + "ngy", + "u" + ], + "ngye": + [ + "ngy", + "e" + ], + "ngyo": + [ + "ngy", + "o" + ], + "ngyax": + [ + "ngy", + "ax" + ], + "ngix": + [ + "ngy", + "ix" + ], + "ngyux": + [ + "ngy", + "ux" + ], + "ngyex": + [ + "ngy", + "ex" + ], + "ngyox": + [ + "ngy", + "ox" + ], + "fya": + [ + "fy", + "a" + ], + "fi": + [ + "fy", + "i" + ], + "fyu": + [ + "fy", + "u" + ], + "fye": + [ + "fy", + "e" + ], + "fyo": + [ + "fy", + "o" + ], + "fyax": + [ + "fy", + "ax" + ], + "fix": + [ + "fy", + "ix" + ], + "fyux": + [ + "fy", + "ux" + ], + "fyex": + [ + "fy", + "ex" + ], + "fyox": + [ + "fy", + "ox" + ], + "vya": + [ + "vy", + "a" + ], + "vi": + [ + "vy", + "i" + ], + "vyu": + [ + "vy", + "u" + ], + "vye": + [ + "vy", + "e" + ], + "vyo": + [ + "vy", + "o" + ], + "vyax": + [ + "vy", + "ax" + ], + "vix": + [ + "vy", + "ix" + ], + "vyux": + [ + "vy", + "ux" + ], + "vyex": + [ + "vy", + "ex" + ], + "vyox": + [ + "vy", + "ox" + ], + "kwa": + [ + "kw", + "a" + ], + "kwi": + [ + "kw", + "i" + ], + "ku": + [ + "kw", + "u" + ], + "kwe": + [ + "kw", + "e" + ], + "kwo": + [ + "kw", + "o" + ], + "kwax": + [ + "kw", + "ax" + ], + "kwix": + [ + "kw", + "ix" + ], + "kux": + [ + "kw", + "ux" + ], + "kwex": + [ + "kw", + "ex" + ], + "kwox": + [ + "kw", + "ox" + ], + "gwa": + [ + "gw", + "a" + ], + "gwi": + [ + "gw", + "i" + ], + "gu": + [ + "gw", + "u" + ], + "gwe": + [ + "gw", + "e" + ], + "gwo": + [ + "gw", + "o" + ], + "gwax": + [ + "gw", + "ax" + ], + "gwix": + [ + "gw", + "ix" + ], + "gux": + [ + "gw", + "ux" + ], + "gwex": + [ + "gw", + "ex" + ], + "gwox": + [ + "gw", + "ox" + ] + }, + "phon_class": + { + "head": + [ + "k", + "s", + "sh", + "t", + "ch", + "ts", + "n", + "h", + "f", + "m", + "y", + "r", + "rr", + "w", + "g", + "z", + "j", + "d", + "b", + "p", + "ky", + "ty", + "ny", + "hy", + "my", + "ry", + "by", + "gy", + "py", + "dy", + "vy", + "fy", + "kw", + "gw", + "ng", + "ngy", + "v" + ], + "tail": + [ + "a", + "i", + "u", + "e", + "o", + "nv", + "mv", + "ax", + "ix", + "ux", + "ex", + "ox", + "cl" + ] + } + }, + { + "language": "eng", + "dict": + {}, + "phon_class": + { + "tail": + [ + "aa", + "ae", + "ah", + "ao", + "aw", + "ay", + "eh", + "er", + "ey", + "ih", + "iy", + "ow", + "oy", + "uh", + "uw", + "mv", + "nv", + "ngv" + ], + "head": + [ + "b", + "ch", + "d", + "dh", + "f", + "g", + "hh", + "jh", + "k", + "l", + "m", + "n", + "ng", + "p", + "r", + "s", + "sh", + "t", + "th", + "v", + "w", + "y", + "z", + "zh", + "dx", + "dr", + "tr" + ] + } + } + ] +} \ No newline at end of file diff --git a/resource/midi-note.scp b/resource/midi-note.scp new file mode 100755 index 0000000000000000000000000000000000000000..45113e930ae15c3145cf22df63108ffdea719743 --- /dev/null +++ b/resource/midi-note.scp @@ -0,0 +1,152 @@ +G9 127 +F#9 126 +Gb9 126 +F9 125 +E9 124 +D#9 123 +Eb9 123 +D9 122 +C#9 121 +Db9 121 +C9 120 +B8 119 +A#8 118 +Bb8 118 +A8 117 +G#8 116 +Ab8 116 +G8 115 +F#8 114 +Gb8 114 +F8 113 +E8 112 +D#8 111 +Eb8 111 +D8 110 +C#8 109 +Db8 109 +C8 108 +B7 107 +A#7 106 +Bb7 106 +A7 105 +G#7 104 +Ab7 104 +G7 103 +F#7 102 +Gb7 102 +F7 101 +E7 100 +D#7 99 +Eb7 99 +D7 98 +C#7 97 +Db7 97 +C7 96 +B6 95 +A#6 94 +Bb6 94 +A6 93 +G#6 92 +Ab6 92 +G6 91 +F#6 90 +Gb6 90 +F6 89 +E6 88 +D#6 87 +Eb6 87 +D6 86 +C#6 85 +Db6 85 +C6 84 +B5 83 +A#5 82 +Bb5 82 +A5 81 +G#5 80 +Ab5 80 +G5 79 +F#5 78 +Gb5 78 +F5 77 +E5 76 +D#5 75 +Eb5 75 +D5 74 +C#5 73 +Db5 73 +C5 72 +B4 71 +A#4 70 +Bb4 70 +A4 69 +G#4 68 +Ab4 68 +G4 67 +F#4 66 +Gb4 66 +F4 65 +E4 64 +D#4 63 +Eb4 63 +D4 62 +C#4 61 +Db4 61 +C4 60 +B3 59 +A#3 58 +Bb3 58 +A3 57 +G#3 56 +Ab3 56 +G3 55 +F#3 54 +Gb3 54 +F3 53 +E3 52 +D#3 51 +Eb3 51 +D3 50 +C#3 49 +Db3 49 +C3 48 +B2 47 +A#2 46 +Bb2 46 +A2 45 +G#2 44 +Ab2 44 +G2 43 +F#2 42 +Gb2 42 +F2 41 +E2 40 +D#2 39 +Eb2 39 +D2 38 +C#2 37 +Db2 37 +C2 36 +B1 35 +A#1 34 +Bb1 34 +A1 33 +G#1 32 +Ab1 32 +G1 31 +F#1 30 +Gb1 30 +F1 29 +E1 28 +D#1 27 +Eb1 27 +D1 26 +C#1 25 +Db1 25 +C1 24 +B0 23 +A#0 22 +Bb0 22 +A0 21 +rest 0 diff --git a/resource/pinyin_dict.py b/resource/pinyin_dict.py new file mode 100755 index 0000000000000000000000000000000000000000..535e11160d5d28a92be7b508ddb01ab5f6b008d1 --- /dev/null +++ b/resource/pinyin_dict.py @@ -0,0 +1,423 @@ +# Adapted from Opencpop's pinyin to phoneme mapping table: +# https://wenet.org.cn/opencpop/resources/annotationformat/ +PINYIN_DICT = { + "a": ("a",), + "ai": ("ai",), + "an": ("an",), + "ang": ("ang",), + "ao": ("ao",), + "ba": ("b", "a"), + "bai": ("b", "ai"), + "ban": ("b", "an"), + "bang": ("b", "ang"), + "bao": ("b", "ao"), + "bei": ("b", "ei"), + "ben": ("b", "en"), + "beng": ("b", "eng"), + "bi": ("b", "i"), + "bian": ("b", "ian"), + "biao": ("b", "iao"), + "bie": ("b", "ie"), + "bin": ("b", "in"), + "bing": ("b", "ing"), + "bo": ("b", "o"), + "bu": ("b", "u"), + "ca": ("c", "a"), + "cai": ("c", "ai"), + "can": ("c", "an"), + "cang": ("c", "ang"), + "cao": ("c", "ao"), + "ce": ("c", "e"), + "cei": ("c", "ei"), + "cen": ("c", "en"), + "ceng": ("c", "eng"), + "cha": ("ch", "a"), + "chai": ("ch", "ai"), + "chan": ("ch", "an"), + "chang": ("ch", "ang"), + "chao": ("ch", "ao"), + "che": ("ch", "e"), + "chen": ("ch", "en"), + "cheng": ("ch", "eng"), + "chi": ("ch", "i"), + "chong": ("ch", "ong"), + "chou": ("ch", "ou"), + "chu": ("ch", "u"), + "chua": ("ch", "ua"), + "chuai": ("ch", "uai"), + "chuan": ("ch", "uan"), + "chuang": ("ch", "uang"), + "chui": ("ch", "ui"), + "chun": ("ch", "un"), + "chuo": ("ch", "uo"), + "ci": ("c", "i"), + "cong": ("c", "ong"), + "cou": ("c", "ou"), + "cu": ("c", "u"), + "cuan": ("c", "uan"), + "cui": ("c", "ui"), + "cun": ("c", "un"), + "cuo": ("c", "uo"), + "da": ("d", "a"), + "dai": ("d", "ai"), + "dan": ("d", "an"), + "dang": ("d", "ang"), + "dao": ("d", "ao"), + "de": ("d", "e"), + "dei": ("d", "ei"), + "den": ("d", "en"), + "deng": ("d", "eng"), + "di": ("d", "i"), + "dia": ("d", "ia"), + "dian": ("d", "ian"), + "diao": ("d", "iao"), + "die": ("d", "ie"), + "ding": ("d", "ing"), + "diu": ("d", "iu"), + "dong": ("d", "ong"), + "dou": ("d", "ou"), + "du": ("d", "u"), + "duan": ("d", "uan"), + "dui": ("d", "ui"), + "dun": ("d", "un"), + "duo": ("d", "uo"), + "e": ("e",), + "ei": ("ei",), + "en": ("en",), + "eng": ("eng",), + "er": ("er",), + "fa": ("f", "a"), + "fan": ("f", "an"), + "fang": ("f", "ang"), + "fei": ("f", "ei"), + "fen": ("f", "en"), + "feng": ("f", "eng"), + "fo": ("f", "o"), + "fou": ("f", "ou"), + "fu": ("f", "u"), + "ga": ("g", "a"), + "gai": ("g", "ai"), + "gan": ("g", "an"), + "gang": ("g", "ang"), + "gao": ("g", "ao"), + "ge": ("g", "e"), + "gei": ("g", "ei"), + "gen": ("g", "en"), + "geng": ("g", "eng"), + "gong": ("g", "ong"), + "gou": ("g", "ou"), + "gu": ("g", "u"), + "gua": ("g", "ua"), + "guai": ("g", "uai"), + "guan": ("g", "uan"), + "guang": ("g", "uang"), + "gui": ("g", "ui"), + "gun": ("g", "un"), + "guo": ("g", "uo"), + "ha": ("h", "a"), + "hai": ("h", "ai"), + "han": ("h", "an"), + "hang": ("h", "ang"), + "hao": ("h", "ao"), + "he": ("h", "e"), + "hei": ("h", "ei"), + "hen": ("h", "en"), + "heng": ("h", "eng"), + "hm": ("h", "m"), + "hng": ("h", "ng"), + "hong": ("h", "ong"), + "hou": ("h", "ou"), + "hu": ("h", "u"), + "hua": ("h", "ua"), + "huai": ("h", "uai"), + "huan": ("h", "uan"), + "huang": ("h", "uang"), + "hui": ("h", "ui"), + "hun": ("h", "un"), + "huo": ("h", "uo"), + "ji": ("j", "i"), + "jia": ("j", "ia"), + "jian": ("j", "ian"), + "jiang": ("j", "iang"), + "jiao": ("j", "iao"), + "jie": ("j", "ie"), + "jin": ("j", "in"), + "jing": ("j", "ing"), + "jiong": ("j", "iong"), + "jiu": ("j", "iu"), + "ju": ("j", "v"), + "juan": ("j", "van"), + "jue": ("j", "ve"), + "jun": ("j", "vn"), + "ka": ("k", "a"), + "kai": ("k", "ai"), + "kan": ("k", "an"), + "kang": ("k", "ang"), + "kao": ("k", "ao"), + "ke": ("k", "e"), + "kei": ("k", "ei"), + "ken": ("k", "en"), + "keng": ("k", "eng"), + "kong": ("k", "ong"), + "kou": ("k", "ou"), + "ku": ("k", "u"), + "kua": ("k", "ua"), + "kuai": ("k", "uai"), + "kuan": ("k", "uan"), + "kuang": ("k", "uang"), + "kui": ("k", "ui"), + "kun": ("k", "un"), + "kuo": ("k", "uo"), + "la": ("l", "a"), + "lai": ("l", "ai"), + "lan": ("l", "an"), + "lang": ("l", "ang"), + "lao": ("l", "ao"), + "le": ("l", "e"), + "lei": ("l", "ei"), + "leng": ("l", "eng"), + "li": ("l", "i"), + "lia": ("l", "ia"), + "lian": ("l", "ian"), + "liang": ("l", "iang"), + "liao": ("l", "iao"), + "lie": ("l", "ie"), + "lin": ("l", "in"), + "ling": ("l", "ing"), + "liu": ("l", "iu"), + "lo": ("l", "o"), + "long": ("l", "ong"), + "lou": ("l", "ou"), + "lu": ("l", "u"), + "luan": ("l", "uan"), + "lun": ("l", "un"), + "luo": ("l", "uo"), + "lv": ("l", "v"), + "lve": ("l", "ve"), + "m": ("m",), + "ma": ("m", "a"), + "mai": ("m", "ai"), + "man": ("m", "an"), + "mang": ("m", "ang"), + "mao": ("m", "ao"), + "me": ("m", "e"), + "mei": ("m", "ei"), + "men": ("m", "en"), + "meng": ("m", "eng"), + "mi": ("m", "i"), + "mian": ("m", "ian"), + "miao": ("m", "iao"), + "mie": ("m", "ie"), + "min": ("m", "in"), + "ming": ("m", "ing"), + "miu": ("m", "iu"), + "mo": ("m", "o"), + "mou": ("m", "ou"), + "mu": ("m", "u"), + "n": ("n",), + "na": ("n", "a"), + "nai": ("n", "ai"), + "nan": ("n", "an"), + "nang": ("n", "ang"), + "nao": ("n", "ao"), + "ne": ("n", "e"), + "nei": ("n", "ei"), + "nen": ("n", "en"), + "neng": ("n", "eng"), + "ng": ("n", "g"), + "ni": ("n", "i"), + "nian": ("n", "ian"), + "niang": ("n", "iang"), + "niao": ("n", "iao"), + "nie": ("n", "ie"), + "nin": ("n", "in"), + "ning": ("n", "ing"), + "niu": ("n", "iu"), + "nong": ("n", "ong"), + "nou": ("n", "ou"), + "nu": ("n", "u"), + "nuan": ("n", "uan"), + "nun": ("n", "un"), + "nuo": ("n", "uo"), + "nv": ("n", "v"), + "nve": ("n", "ve"), + "o": ("o",), + "ou": ("ou",), + "pa": ("p", "a"), + "pai": ("p", "ai"), + "pan": ("p", "an"), + "pang": ("p", "ang"), + "pao": ("p", "ao"), + "pei": ("p", "ei"), + "pen": ("p", "en"), + "peng": ("p", "eng"), + "pi": ("p", "i"), + "pian": ("p", "ian"), + "piao": ("p", "iao"), + "pie": ("p", "ie"), + "pin": ("p", "in"), + "ping": ("p", "ing"), + "po": ("p", "o"), + "pou": ("p", "ou"), + "pu": ("p", "u"), + "qi": ("q", "i"), + "qia": ("q", "ia"), + "qian": ("q", "ian"), + "qiang": ("q", "iang"), + "qiao": ("q", "iao"), + "qie": ("q", "ie"), + "qin": ("q", "in"), + "qing": ("q", "ing"), + "qiong": ("q", "iong"), + "qiu": ("q", "iu"), + "qu": ("q", "v"), + "quan": ("q", "van"), + "que": ("q", "ve"), + "qun": ("q", "vn"), + "ran": ("r", "an"), + "rang": ("r", "ang"), + "rao": ("r", "ao"), + "re": ("r", "e"), + "ren": ("r", "en"), + "reng": ("r", "eng"), + "ri": ("r", "i"), + "rong": ("r", "ong"), + "rou": ("r", "ou"), + "ru": ("r", "u"), + "rua": ("r", "ua"), + "ruan": ("r", "uan"), + "rui": ("r", "ui"), + "run": ("r", "un"), + "ruo": ("r", "uo"), + "sa": ("s", "a"), + "sai": ("s", "ai"), + "san": ("s", "an"), + "sang": ("s", "ang"), + "sao": ("s", "ao"), + "se": ("s", "e"), + "sen": ("s", "en"), + "seng": ("s", "eng"), + "sha": ("sh", "a"), + "shai": ("sh", "ai"), + "shan": ("sh", "an"), + "shang": ("sh", "ang"), + "shao": ("sh", "ao"), + "she": ("sh", "e"), + "shei": ("sh", "ei"), + "shen": ("sh", "en"), + "sheng": ("sh", "eng"), + "shi": ("sh", "i"), + "shou": ("sh", "ou"), + "shu": ("sh", "u"), + "shua": ("sh", "ua"), + "shuai": ("sh", "uai"), + "shuan": ("sh", "uan"), + "shuang": ("sh", "uang"), + "shui": ("sh", "ui"), + "shun": ("sh", "un"), + "shuo": ("sh", "uo"), + "si": ("s", "i"), + "song": ("s", "ong"), + "sou": ("s", "ou"), + "su": ("s", "u"), + "suan": ("s", "uan"), + "sui": ("s", "ui"), + "sun": ("s", "un"), + "suo": ("s", "uo"), + "ta": ("t", "a"), + "tai": ("t", "ai"), + "tan": ("t", "an"), + "tang": ("t", "ang"), + "tao": ("t", "ao"), + "te": ("t", "e"), + "tei": ("t", "ei"), + "teng": ("t", "eng"), + "ti": ("t", "i"), + "tian": ("t", "ian"), + "tiao": ("t", "iao"), + "tie": ("t", "ie"), + "ting": ("t", "ing"), + "tong": ("t", "ong"), + "tou": ("t", "ou"), + "tu": ("t", "u"), + "tuan": ("t", "uan"), + "tui": ("t", "ui"), + "tun": ("t", "un"), + "tuo": ("t", "uo"), + "wa": ("w", "a"), + "wai": ("w", "ai"), + "wan": ("w", "an"), + "wang": ("w", "ang"), + "wei": ("w", "ei"), + "wen": ("w", "en"), + "weng": ("w", "eng"), + "wo": ("w", "o"), + "wu": ("w", "u"), + "xi": ("x", "i"), + "xia": ("x", "ia"), + "xian": ("x", "ian"), + "xiang": ("x", "iang"), + "xiao": ("x", "iao"), + "xie": ("x", "ie"), + "xin": ("x", "in"), + "xing": ("x", "ing"), + "xiong": ("x", "iong"), + "xiu": ("x", "iu"), + "xu": ("x", "v"), + "xuan": ("x", "van"), + "xue": ("x", "ve"), + "xun": ("x", "vn"), + "ya": ("y", "a"), + "yan": ("y", "an"), + "yang": ("y", "ang"), + "yao": ("y", "ao"), + "ye": ("y", "e"), + "yi": ("y", "i"), + "yin": ("y", "in"), + "ying": ("y", "ing"), + "yo": ("y", "o"), + "yong": ("y", "ong"), + "you": ("y", "ou"), + "yu": ("y", "v"), + "yuan": ("y", "van"), + "yue": ("y", "ve"), + "yun": ("y", "vn"), + "za": ("z", "a"), + "zai": ("z", "ai"), + "zan": ("z", "an"), + "zang": ("z", "ang"), + "zao": ("z", "ao"), + "ze": ("z", "e"), + "zei": ("z", "ei"), + "zen": ("z", "en"), + "zeng": ("z", "eng"), + "zha": ("zh", "a"), + "zhai": ("zh", "ai"), + "zhan": ("zh", "an"), + "zhang": ("zh", "ang"), + "zhao": ("zh", "ao"), + "zhe": ("zh", "e"), + "zhei": ("zh", "ei"), + "zhen": ("zh", "en"), + "zheng": ("zh", "eng"), + "zhi": ("zh", "i"), + "zhong": ("zh", "ong"), + "zhou": ("zh", "ou"), + "zhu": ("zh", "u"), + "zhua": ("zh", "ua"), + "zhuai": ("zh", "uai"), + "zhuan": ("zh", "uan"), + "zhuang": ("zh", "uang"), + "zhui": ("zh", "ui"), + "zhun": ("zh", "un"), + "zhuo": ("zh", "uo"), + "zi": ("z", "i"), + "zong": ("z", "ong"), + "zou": ("z", "ou"), + "zu": ("z", "u"), + "zuan": ("z", "uan"), + "zui": ("z", "ui"), + "zun": ("z", "un"), + "zuo": ("z", "uo"), +} + diff --git a/resource/singer/singer_embedding_ace-1.npy b/resource/singer/singer_embedding_ace-1.npy new file mode 100644 index 0000000000000000000000000000000000000000..bcf53dc839633170e51a9061c5303c8b024c023a Binary files /dev/null and b/resource/singer/singer_embedding_ace-1.npy differ diff --git a/resource/singer/singer_embedding_ace-10.npy b/resource/singer/singer_embedding_ace-10.npy new file mode 100644 index 0000000000000000000000000000000000000000..b70e7d7d76a1d5b20a73983fd7cfd4256a9dc605 Binary files /dev/null and b/resource/singer/singer_embedding_ace-10.npy differ diff --git a/resource/singer/singer_embedding_ace-11.npy b/resource/singer/singer_embedding_ace-11.npy new file mode 100644 index 0000000000000000000000000000000000000000..dda4402b98d35d6a3d95a9b86be433d522e98c25 Binary files /dev/null and b/resource/singer/singer_embedding_ace-11.npy differ diff --git a/resource/singer/singer_embedding_ace-12.npy b/resource/singer/singer_embedding_ace-12.npy new file mode 100644 index 0000000000000000000000000000000000000000..4aefc7b82933efb1e824979dce81ead3ec4ada14 Binary files /dev/null and b/resource/singer/singer_embedding_ace-12.npy differ diff --git a/resource/singer/singer_embedding_ace-13.npy b/resource/singer/singer_embedding_ace-13.npy new file mode 100644 index 0000000000000000000000000000000000000000..50194bb9f997203a6f5818b97cee6c03c935353b Binary files /dev/null and b/resource/singer/singer_embedding_ace-13.npy differ diff --git a/resource/singer/singer_embedding_ace-14.npy b/resource/singer/singer_embedding_ace-14.npy new file mode 100644 index 0000000000000000000000000000000000000000..fa8172ff128f08d13f9e4b2106ceeb744acc77d9 Binary files /dev/null and b/resource/singer/singer_embedding_ace-14.npy differ diff --git a/resource/singer/singer_embedding_ace-15.npy b/resource/singer/singer_embedding_ace-15.npy new file mode 100644 index 0000000000000000000000000000000000000000..ca446855bb325d79ac9d05a27d87d754dc91121f Binary files /dev/null and b/resource/singer/singer_embedding_ace-15.npy differ diff --git a/resource/singer/singer_embedding_ace-16.npy b/resource/singer/singer_embedding_ace-16.npy new file mode 100644 index 0000000000000000000000000000000000000000..7fa21fb45607c86967e22b83bb2ea347188d1966 Binary files /dev/null and b/resource/singer/singer_embedding_ace-16.npy differ diff --git a/resource/singer/singer_embedding_ace-17.npy b/resource/singer/singer_embedding_ace-17.npy new file mode 100644 index 0000000000000000000000000000000000000000..02e825edd28647acd72f387eb48779f0f2c01d78 Binary files /dev/null and b/resource/singer/singer_embedding_ace-17.npy differ diff --git a/resource/singer/singer_embedding_ace-18.npy b/resource/singer/singer_embedding_ace-18.npy new file mode 100644 index 0000000000000000000000000000000000000000..b4774adf0eca0691bd8aa0e1f402c4dae0c066ee Binary files /dev/null and b/resource/singer/singer_embedding_ace-18.npy differ diff --git a/resource/singer/singer_embedding_ace-19.npy b/resource/singer/singer_embedding_ace-19.npy new file mode 100644 index 0000000000000000000000000000000000000000..b0772e3cdcac17f3c00ef340f6834c50277ba54a Binary files /dev/null and b/resource/singer/singer_embedding_ace-19.npy differ diff --git a/resource/singer/singer_embedding_ace-2.npy b/resource/singer/singer_embedding_ace-2.npy new file mode 100644 index 0000000000000000000000000000000000000000..04c90403d8f91ec5d4e27c0e805141cfcc603931 Binary files /dev/null and b/resource/singer/singer_embedding_ace-2.npy differ diff --git a/resource/singer/singer_embedding_ace-20.npy b/resource/singer/singer_embedding_ace-20.npy new file mode 100644 index 0000000000000000000000000000000000000000..edd12dbf60a622fdefbe38fbf08169a3393ccdc0 Binary files /dev/null and b/resource/singer/singer_embedding_ace-20.npy differ diff --git a/resource/singer/singer_embedding_ace-21.npy b/resource/singer/singer_embedding_ace-21.npy new file mode 100644 index 0000000000000000000000000000000000000000..6d67b0b04c71f7895442d4978256b8f21645f92e Binary files /dev/null and b/resource/singer/singer_embedding_ace-21.npy differ diff --git a/resource/singer/singer_embedding_ace-22.npy b/resource/singer/singer_embedding_ace-22.npy new file mode 100644 index 0000000000000000000000000000000000000000..ecc2fd87f531cdb267b8d8aedf89e9e2e22ff2e6 Binary files /dev/null and b/resource/singer/singer_embedding_ace-22.npy differ diff --git a/resource/singer/singer_embedding_ace-23.npy b/resource/singer/singer_embedding_ace-23.npy new file mode 100644 index 0000000000000000000000000000000000000000..62eec12eb2667e0144808caf69fa5a5bb8fd1e85 Binary files /dev/null and b/resource/singer/singer_embedding_ace-23.npy differ diff --git a/resource/singer/singer_embedding_ace-24.npy b/resource/singer/singer_embedding_ace-24.npy new file mode 100644 index 0000000000000000000000000000000000000000..f2f0cb0d5b1e345a39e6abe626dabe1c73b8a701 Binary files /dev/null and b/resource/singer/singer_embedding_ace-24.npy differ diff --git a/resource/singer/singer_embedding_ace-25.npy b/resource/singer/singer_embedding_ace-25.npy new file mode 100644 index 0000000000000000000000000000000000000000..70d09eda6e5f3eff4d5586d5b00f15ec71e3b275 Binary files /dev/null and b/resource/singer/singer_embedding_ace-25.npy differ diff --git a/resource/singer/singer_embedding_ace-26.npy b/resource/singer/singer_embedding_ace-26.npy new file mode 100644 index 0000000000000000000000000000000000000000..5a7e31925d89afdfc76bcd85a05a870d4d7dc7d5 Binary files /dev/null and b/resource/singer/singer_embedding_ace-26.npy differ diff --git a/resource/singer/singer_embedding_ace-27.npy b/resource/singer/singer_embedding_ace-27.npy new file mode 100644 index 0000000000000000000000000000000000000000..d89aec7016b214f66f5e7202a0660601700d8d61 Binary files /dev/null and b/resource/singer/singer_embedding_ace-27.npy differ diff --git a/resource/singer/singer_embedding_ace-28.npy b/resource/singer/singer_embedding_ace-28.npy new file mode 100644 index 0000000000000000000000000000000000000000..44e43d68ee6ae13f14da85cef25cb2512696fd3b Binary files /dev/null and b/resource/singer/singer_embedding_ace-28.npy differ diff --git a/resource/singer/singer_embedding_ace-29.npy b/resource/singer/singer_embedding_ace-29.npy new file mode 100644 index 0000000000000000000000000000000000000000..8a4818a7781a32e4dac1344f61fa3fe4d713b9f2 Binary files /dev/null and b/resource/singer/singer_embedding_ace-29.npy differ diff --git a/resource/singer/singer_embedding_ace-3.npy b/resource/singer/singer_embedding_ace-3.npy new file mode 100644 index 0000000000000000000000000000000000000000..0b24b17cbf8583de74c4b2116d09a6758d79f99a Binary files /dev/null and b/resource/singer/singer_embedding_ace-3.npy differ diff --git a/resource/singer/singer_embedding_ace-30.npy b/resource/singer/singer_embedding_ace-30.npy new file mode 100644 index 0000000000000000000000000000000000000000..8063c55d7b3e2c7e7fd8e414dd23b7901dd8d18f Binary files /dev/null and b/resource/singer/singer_embedding_ace-30.npy differ diff --git a/resource/singer/singer_embedding_ace-4.npy b/resource/singer/singer_embedding_ace-4.npy new file mode 100644 index 0000000000000000000000000000000000000000..f83574ef0d7a837e710ac4df083913424e772214 Binary files /dev/null and b/resource/singer/singer_embedding_ace-4.npy differ diff --git a/resource/singer/singer_embedding_ace-5.npy b/resource/singer/singer_embedding_ace-5.npy new file mode 100644 index 0000000000000000000000000000000000000000..fdfd952e2e911a7527ab3e234451fa88cf27bab7 Binary files /dev/null and b/resource/singer/singer_embedding_ace-5.npy differ diff --git a/resource/singer/singer_embedding_ace-6.npy b/resource/singer/singer_embedding_ace-6.npy new file mode 100644 index 0000000000000000000000000000000000000000..a32a1c2d29880ee2b7f031d7b3e21d5a4d0a90cc Binary files /dev/null and b/resource/singer/singer_embedding_ace-6.npy differ diff --git a/resource/singer/singer_embedding_ace-7.npy b/resource/singer/singer_embedding_ace-7.npy new file mode 100644 index 0000000000000000000000000000000000000000..7a9d988dddd336537e7b850b397b5424aaac5aa9 Binary files /dev/null and b/resource/singer/singer_embedding_ace-7.npy differ diff --git a/resource/singer/singer_embedding_ace-8.npy b/resource/singer/singer_embedding_ace-8.npy new file mode 100644 index 0000000000000000000000000000000000000000..3b746ff661ca1759d4813c3a2abec61883173ca9 Binary files /dev/null and b/resource/singer/singer_embedding_ace-8.npy differ diff --git a/resource/singer/singer_embedding_ace-9.npy b/resource/singer/singer_embedding_ace-9.npy new file mode 100644 index 0000000000000000000000000000000000000000..888ddbc48a1b2f2e9c42bb3f2e74337e6afc06be Binary files /dev/null and b/resource/singer/singer_embedding_ace-9.npy differ diff --git a/resource/singer/singer_embedding_ameboshi.npy b/resource/singer/singer_embedding_ameboshi.npy new file mode 100644 index 0000000000000000000000000000000000000000..2f84c027cc345c0b936b29788be95126845aa0ef Binary files /dev/null and b/resource/singer/singer_embedding_ameboshi.npy differ diff --git a/resource/singer/singer_embedding_itako.npy b/resource/singer/singer_embedding_itako.npy new file mode 100644 index 0000000000000000000000000000000000000000..969983b6bb0475f479153871a05b402b90fac44e Binary files /dev/null and b/resource/singer/singer_embedding_itako.npy differ diff --git a/resource/singer/singer_embedding_kiritan.npy b/resource/singer/singer_embedding_kiritan.npy new file mode 100644 index 0000000000000000000000000000000000000000..21793e6058eb2dd782ae5a9b811478f62d3b5e45 Binary files /dev/null and b/resource/singer/singer_embedding_kiritan.npy differ diff --git a/resource/singer/singer_embedding_kising_barber.npy b/resource/singer/singer_embedding_kising_barber.npy new file mode 100644 index 0000000000000000000000000000000000000000..c6c291b3e8ca0a1ae0c2faae45838d906292e29f Binary files /dev/null and b/resource/singer/singer_embedding_kising_barber.npy differ diff --git a/resource/singer/singer_embedding_kising_blanca.npy b/resource/singer/singer_embedding_kising_blanca.npy new file mode 100644 index 0000000000000000000000000000000000000000..83fd08f72d789f345999ba36bdf1dbcdffe02336 Binary files /dev/null and b/resource/singer/singer_embedding_kising_blanca.npy differ diff --git a/resource/singer/singer_embedding_kising_changge.npy b/resource/singer/singer_embedding_kising_changge.npy new file mode 100644 index 0000000000000000000000000000000000000000..7e11359105327fd8a46ec9fd7170e44f9e9a6c1a Binary files /dev/null and b/resource/singer/singer_embedding_kising_changge.npy differ diff --git a/resource/singer/singer_embedding_kising_chuci.npy b/resource/singer/singer_embedding_kising_chuci.npy new file mode 100644 index 0000000000000000000000000000000000000000..c5046d4e5f4fc7b883baa4685e7ae2d34e46cb49 Binary files /dev/null and b/resource/singer/singer_embedding_kising_chuci.npy differ diff --git a/resource/singer/singer_embedding_kising_chuming.npy b/resource/singer/singer_embedding_kising_chuming.npy new file mode 100644 index 0000000000000000000000000000000000000000..c0de4520dc9c89fd480ac6c9a2e465b0edb0259d Binary files /dev/null and b/resource/singer/singer_embedding_kising_chuming.npy differ diff --git a/resource/singer/singer_embedding_kising_crimson.npy b/resource/singer/singer_embedding_kising_crimson.npy new file mode 100644 index 0000000000000000000000000000000000000000..a784cead39b5b684ab23371fba1ee04280a0e2cf Binary files /dev/null and b/resource/singer/singer_embedding_kising_crimson.npy differ diff --git a/resource/singer/singer_embedding_kising_david.npy b/resource/singer/singer_embedding_kising_david.npy new file mode 100644 index 0000000000000000000000000000000000000000..79d9fee41ab7c6b57a9549e03577762999d624ef Binary files /dev/null and b/resource/singer/singer_embedding_kising_david.npy differ diff --git a/resource/singer/singer_embedding_kising_dvaid.npy b/resource/singer/singer_embedding_kising_dvaid.npy new file mode 100644 index 0000000000000000000000000000000000000000..cc2ccb69f271d4c46eded6748c44a084b1c083d8 Binary files /dev/null and b/resource/singer/singer_embedding_kising_dvaid.npy differ diff --git a/resource/singer/singer_embedding_kising_ghost.npy b/resource/singer/singer_embedding_kising_ghost.npy new file mode 100644 index 0000000000000000000000000000000000000000..0aec7a0d427bb39bc590ad0757ba755218a61cd7 Binary files /dev/null and b/resource/singer/singer_embedding_kising_ghost.npy differ diff --git a/resource/singer/singer_embedding_kising_growl.npy b/resource/singer/singer_embedding_kising_growl.npy new file mode 100644 index 0000000000000000000000000000000000000000..ae8f4746a46bf874076a23304db6951397568653 Binary files /dev/null and b/resource/singer/singer_embedding_kising_growl.npy differ diff --git a/resource/singer/singer_embedding_kising_hiragi-yuki.npy b/resource/singer/singer_embedding_kising_hiragi-yuki.npy new file mode 100644 index 0000000000000000000000000000000000000000..45860450be6e2f6491eaaa97c0065047af5ffb11 Binary files /dev/null and b/resource/singer/singer_embedding_kising_hiragi-yuki.npy differ diff --git a/resource/singer/singer_embedding_kising_huolian.npy b/resource/singer/singer_embedding_kising_huolian.npy new file mode 100644 index 0000000000000000000000000000000000000000..2adf64a4bb0cfa810f7583d8ef3ae007f0b5f5b3 Binary files /dev/null and b/resource/singer/singer_embedding_kising_huolian.npy differ diff --git a/resource/singer/singer_embedding_kising_kuro.npy b/resource/singer/singer_embedding_kising_kuro.npy new file mode 100644 index 0000000000000000000000000000000000000000..532d152a0aa0b367616c8988bf13606da7db2889 Binary files /dev/null and b/resource/singer/singer_embedding_kising_kuro.npy differ diff --git a/resource/singer/singer_embedding_kising_lien.npy b/resource/singer/singer_embedding_kising_lien.npy new file mode 100644 index 0000000000000000000000000000000000000000..0f64cca9fb42d32f0bc145364da167b6ab39cc72 Binary files /dev/null and b/resource/singer/singer_embedding_kising_lien.npy differ diff --git a/resource/singer/singer_embedding_kising_liyuan.npy b/resource/singer/singer_embedding_kising_liyuan.npy new file mode 100644 index 0000000000000000000000000000000000000000..774180098e718a6af9aea5d61558bfe472eaf228 Binary files /dev/null and b/resource/singer/singer_embedding_kising_liyuan.npy differ diff --git a/resource/singer/singer_embedding_kising_luanming.npy b/resource/singer/singer_embedding_kising_luanming.npy new file mode 100644 index 0000000000000000000000000000000000000000..0da825b1b513b776d34ee8597ca4beb2283b0aff Binary files /dev/null and b/resource/singer/singer_embedding_kising_luanming.npy differ diff --git a/resource/singer/singer_embedding_kising_luotianyi.npy b/resource/singer/singer_embedding_kising_luotianyi.npy new file mode 100644 index 0000000000000000000000000000000000000000..741ef91112e61316a233ac2bedfeb440bfe7d961 Binary files /dev/null and b/resource/singer/singer_embedding_kising_luotianyi.npy differ diff --git a/resource/singer/singer_embedding_kising_namine.npy b/resource/singer/singer_embedding_kising_namine.npy new file mode 100644 index 0000000000000000000000000000000000000000..d01cb9f509fb4f71acd332ecd89b0f8e96a64320 Binary files /dev/null and b/resource/singer/singer_embedding_kising_namine.npy differ diff --git a/resource/singer/singer_embedding_kising_orange.npy b/resource/singer/singer_embedding_kising_orange.npy new file mode 100644 index 0000000000000000000000000000000000000000..1d3cb14da0288bed62f1434880bb6c3b35f6a4f8 Binary files /dev/null and b/resource/singer/singer_embedding_kising_orange.npy differ diff --git a/resource/singer/singer_embedding_kising_qifu.npy b/resource/singer/singer_embedding_kising_qifu.npy new file mode 100644 index 0000000000000000000000000000000000000000..de1fdee0bb7e89636dcf727aa07f51f62f645dce Binary files /dev/null and b/resource/singer/singer_embedding_kising_qifu.npy differ diff --git a/resource/singer/singer_embedding_kising_qili.npy b/resource/singer/singer_embedding_kising_qili.npy new file mode 100644 index 0000000000000000000000000000000000000000..ac5ca989d1be7501382b787b94d7124ea9c99d09 Binary files /dev/null and b/resource/singer/singer_embedding_kising_qili.npy differ diff --git a/resource/singer/singer_embedding_kising_qixuan.npy b/resource/singer/singer_embedding_kising_qixuan.npy new file mode 100644 index 0000000000000000000000000000000000000000..4c9544d8dec798068e07d5a67f3cd81b6557e455 Binary files /dev/null and b/resource/singer/singer_embedding_kising_qixuan.npy differ diff --git a/resource/singer/singer_embedding_kising_quehe.npy b/resource/singer/singer_embedding_kising_quehe.npy new file mode 100644 index 0000000000000000000000000000000000000000..4476da317210045d9405d6f70ea1ab1e41b16489 Binary files /dev/null and b/resource/singer/singer_embedding_kising_quehe.npy differ diff --git a/resource/singer/singer_embedding_kising_ranhuhu.npy b/resource/singer/singer_embedding_kising_ranhuhu.npy new file mode 100644 index 0000000000000000000000000000000000000000..8f99364aa09e3006228adef774d11fc5614ee76a Binary files /dev/null and b/resource/singer/singer_embedding_kising_ranhuhu.npy differ diff --git a/resource/singer/singer_embedding_kising_steel.npy b/resource/singer/singer_embedding_kising_steel.npy new file mode 100644 index 0000000000000000000000000000000000000000..b63ad3e667cb4307e5fd8743f149e1878ca6fb02 Binary files /dev/null and b/resource/singer/singer_embedding_kising_steel.npy differ diff --git a/resource/singer/singer_embedding_kising_tangerine.npy b/resource/singer/singer_embedding_kising_tangerine.npy new file mode 100644 index 0000000000000000000000000000000000000000..3282e4c87e7340f1afb6153f2cb21b28b36efa41 Binary files /dev/null and b/resource/singer/singer_embedding_kising_tangerine.npy differ diff --git a/resource/singer/singer_embedding_kising_tarara.npy b/resource/singer/singer_embedding_kising_tarara.npy new file mode 100644 index 0000000000000000000000000000000000000000..ea009a444c233a37295072a5ff74527e5830d64f Binary files /dev/null and b/resource/singer/singer_embedding_kising_tarara.npy differ diff --git a/resource/singer/singer_embedding_kising_tuyuan.npy b/resource/singer/singer_embedding_kising_tuyuan.npy new file mode 100644 index 0000000000000000000000000000000000000000..18a4794d51c12f01125a04fbfa4757347a24ba52 Binary files /dev/null and b/resource/singer/singer_embedding_kising_tuyuan.npy differ diff --git a/resource/singer/singer_embedding_kising_wenli.npy b/resource/singer/singer_embedding_kising_wenli.npy new file mode 100644 index 0000000000000000000000000000000000000000..c75c34aa6944c4b5fef86710ec094454d9d80355 Binary files /dev/null and b/resource/singer/singer_embedding_kising_wenli.npy differ diff --git a/resource/singer/singer_embedding_kising_xiaomo.npy b/resource/singer/singer_embedding_kising_xiaomo.npy new file mode 100644 index 0000000000000000000000000000000000000000..b586f446137638cc9a7737df33a1253edf235357 Binary files /dev/null and b/resource/singer/singer_embedding_kising_xiaomo.npy differ diff --git a/resource/singer/singer_embedding_kising_xiaoye.npy b/resource/singer/singer_embedding_kising_xiaoye.npy new file mode 100644 index 0000000000000000000000000000000000000000..1dcea1c6345d6782954305262fa93389fb042931 Binary files /dev/null and b/resource/singer/singer_embedding_kising_xiaoye.npy differ diff --git a/resource/singer/singer_embedding_kising_yanhe.npy b/resource/singer/singer_embedding_kising_yanhe.npy new file mode 100644 index 0000000000000000000000000000000000000000..629336158074ed476450b6a6ede47ad96af82c39 Binary files /dev/null and b/resource/singer/singer_embedding_kising_yanhe.npy differ diff --git a/resource/singer/singer_embedding_kising_yuezhengling.npy b/resource/singer/singer_embedding_kising_yuezhengling.npy new file mode 100644 index 0000000000000000000000000000000000000000..fa64f23eb68d7be3306fedb814116583a3e7af75 Binary files /dev/null and b/resource/singer/singer_embedding_kising_yuezhengling.npy differ diff --git a/resource/singer/singer_embedding_kising_yunhao.npy b/resource/singer/singer_embedding_kising_yunhao.npy new file mode 100644 index 0000000000000000000000000000000000000000..85b9b1fca5a2bbe8d3266eabb372c334bd62fa28 Binary files /dev/null and b/resource/singer/singer_embedding_kising_yunhao.npy differ diff --git a/resource/singer/singer_embedding_m4singer_Alto-1.npy b/resource/singer/singer_embedding_m4singer_Alto-1.npy new file mode 100644 index 0000000000000000000000000000000000000000..a9ffc2fdb6bda345d192628f0573168cac0b6d80 Binary files /dev/null and b/resource/singer/singer_embedding_m4singer_Alto-1.npy differ diff --git a/resource/singer/singer_embedding_m4singer_Alto-2.npy b/resource/singer/singer_embedding_m4singer_Alto-2.npy new file mode 100644 index 0000000000000000000000000000000000000000..cd82b9603219338f81ba5b4807fc01052837ffde Binary files /dev/null and b/resource/singer/singer_embedding_m4singer_Alto-2.npy differ diff --git a/resource/singer/singer_embedding_m4singer_Alto-3.npy b/resource/singer/singer_embedding_m4singer_Alto-3.npy new file mode 100644 index 0000000000000000000000000000000000000000..f37bf6cc49095f24de0d69f0425c6bd0f76c22b3 Binary files /dev/null and b/resource/singer/singer_embedding_m4singer_Alto-3.npy differ diff --git a/resource/singer/singer_embedding_m4singer_Alto-4.npy b/resource/singer/singer_embedding_m4singer_Alto-4.npy new file mode 100644 index 0000000000000000000000000000000000000000..9349ad3c103b978851a2a47d8412486ca45493a9 Binary files /dev/null and b/resource/singer/singer_embedding_m4singer_Alto-4.npy differ diff --git a/resource/singer/singer_embedding_m4singer_Alto-5.npy b/resource/singer/singer_embedding_m4singer_Alto-5.npy new file mode 100644 index 0000000000000000000000000000000000000000..545369e8c98d8d12272f73ef0e8918c0b87baf7b Binary files /dev/null and b/resource/singer/singer_embedding_m4singer_Alto-5.npy differ diff --git a/resource/singer/singer_embedding_m4singer_Alto-6.npy b/resource/singer/singer_embedding_m4singer_Alto-6.npy new file mode 100644 index 0000000000000000000000000000000000000000..a02ccdcbadb15f3f705116de9d197ef2711332f5 Binary files /dev/null and b/resource/singer/singer_embedding_m4singer_Alto-6.npy differ diff --git a/resource/singer/singer_embedding_m4singer_Alto-7.npy b/resource/singer/singer_embedding_m4singer_Alto-7.npy new file mode 100644 index 0000000000000000000000000000000000000000..742b568e6a2fade3e4ebd2bafc178ff55e25bf55 Binary files /dev/null and b/resource/singer/singer_embedding_m4singer_Alto-7.npy differ diff --git a/resource/singer/singer_embedding_m4singer_Bass-1.npy b/resource/singer/singer_embedding_m4singer_Bass-1.npy new file mode 100644 index 0000000000000000000000000000000000000000..9acc74a9fdea925312f5b39ee585978f1fc76948 Binary files /dev/null and b/resource/singer/singer_embedding_m4singer_Bass-1.npy differ diff --git a/resource/singer/singer_embedding_m4singer_Bass-2.npy b/resource/singer/singer_embedding_m4singer_Bass-2.npy new file mode 100644 index 0000000000000000000000000000000000000000..b222f9c97ca9b958df2681cf15fe94a8c2e2aaa3 Binary files /dev/null and b/resource/singer/singer_embedding_m4singer_Bass-2.npy differ diff --git a/resource/singer/singer_embedding_m4singer_Bass-3.npy b/resource/singer/singer_embedding_m4singer_Bass-3.npy new file mode 100644 index 0000000000000000000000000000000000000000..af552370d4135395e2a50b2b37ab094fb7a5c186 Binary files /dev/null and b/resource/singer/singer_embedding_m4singer_Bass-3.npy differ diff --git a/resource/singer/singer_embedding_m4singer_Soprano-1.npy b/resource/singer/singer_embedding_m4singer_Soprano-1.npy new file mode 100644 index 0000000000000000000000000000000000000000..c7c3b8974c22ca8296be7983c214b299432963e2 Binary files /dev/null and b/resource/singer/singer_embedding_m4singer_Soprano-1.npy differ diff --git a/resource/singer/singer_embedding_m4singer_Soprano-2.npy b/resource/singer/singer_embedding_m4singer_Soprano-2.npy new file mode 100644 index 0000000000000000000000000000000000000000..cde51838c768ba6500384416cb614c9000309d09 Binary files /dev/null and b/resource/singer/singer_embedding_m4singer_Soprano-2.npy differ diff --git a/resource/singer/singer_embedding_m4singer_Soprano-3.npy b/resource/singer/singer_embedding_m4singer_Soprano-3.npy new file mode 100644 index 0000000000000000000000000000000000000000..41b9c5b004c1d32127239b5863146e3eb511344a Binary files /dev/null and b/resource/singer/singer_embedding_m4singer_Soprano-3.npy differ diff --git a/resource/singer/singer_embedding_m4singer_Tenor-1.npy b/resource/singer/singer_embedding_m4singer_Tenor-1.npy new file mode 100644 index 0000000000000000000000000000000000000000..d09f263e4497d29588185147b3948ca7dfdf416a Binary files /dev/null and b/resource/singer/singer_embedding_m4singer_Tenor-1.npy differ diff --git a/resource/singer/singer_embedding_m4singer_Tenor-2.npy b/resource/singer/singer_embedding_m4singer_Tenor-2.npy new file mode 100644 index 0000000000000000000000000000000000000000..49920b9925c065050a615fe53e8c9cee42d36c27 Binary files /dev/null and b/resource/singer/singer_embedding_m4singer_Tenor-2.npy differ diff --git a/resource/singer/singer_embedding_m4singer_Tenor-3.npy b/resource/singer/singer_embedding_m4singer_Tenor-3.npy new file mode 100644 index 0000000000000000000000000000000000000000..bcf99b3bb1b171128e4f6e8ec5406fdaed61cc68 Binary files /dev/null and b/resource/singer/singer_embedding_m4singer_Tenor-3.npy differ diff --git a/resource/singer/singer_embedding_m4singer_Tenor-4.npy b/resource/singer/singer_embedding_m4singer_Tenor-4.npy new file mode 100644 index 0000000000000000000000000000000000000000..b1526311a1d16782174ff00ab5da4dc081bd4678 Binary files /dev/null and b/resource/singer/singer_embedding_m4singer_Tenor-4.npy differ diff --git a/resource/singer/singer_embedding_m4singer_Tenor-5.npy b/resource/singer/singer_embedding_m4singer_Tenor-5.npy new file mode 100644 index 0000000000000000000000000000000000000000..72428d2487df5356fbaab6a87493ea49d60d94d2 Binary files /dev/null and b/resource/singer/singer_embedding_m4singer_Tenor-5.npy differ diff --git a/resource/singer/singer_embedding_m4singer_Tenor-6.npy b/resource/singer/singer_embedding_m4singer_Tenor-6.npy new file mode 100644 index 0000000000000000000000000000000000000000..d4cd6fe1318c283605c31aa8dec6d45a468d0f40 Binary files /dev/null and b/resource/singer/singer_embedding_m4singer_Tenor-6.npy differ diff --git a/resource/singer/singer_embedding_m4singer_Tenor-7.npy b/resource/singer/singer_embedding_m4singer_Tenor-7.npy new file mode 100644 index 0000000000000000000000000000000000000000..dc2f261f0c7c92d6c9060519628b816d77b579a0 Binary files /dev/null and b/resource/singer/singer_embedding_m4singer_Tenor-7.npy differ diff --git a/resource/singer/singer_embedding_namine.npy b/resource/singer/singer_embedding_namine.npy new file mode 100644 index 0000000000000000000000000000000000000000..65047d9df875865acd3d21b9f46ddfd9547bb1f0 Binary files /dev/null and b/resource/singer/singer_embedding_namine.npy differ diff --git a/resource/singer/singer_embedding_ofuton.npy b/resource/singer/singer_embedding_ofuton.npy new file mode 100644 index 0000000000000000000000000000000000000000..af10bc5b9ffeb45bac3e67b1ca5948dab499b529 Binary files /dev/null and b/resource/singer/singer_embedding_ofuton.npy differ diff --git a/resource/singer/singer_embedding_oniku.npy b/resource/singer/singer_embedding_oniku.npy new file mode 100644 index 0000000000000000000000000000000000000000..003d791f607eb9805f3357af3346440698835108 Binary files /dev/null and b/resource/singer/singer_embedding_oniku.npy differ diff --git a/resource/singer/singer_embedding_opencpop.npy b/resource/singer/singer_embedding_opencpop.npy new file mode 100644 index 0000000000000000000000000000000000000000..a77f5cbd077162c269034262e91b73a9e8ae51ff Binary files /dev/null and b/resource/singer/singer_embedding_opencpop.npy differ diff --git a/resource/singer/singer_embedding_pjs.npy b/resource/singer/singer_embedding_pjs.npy new file mode 100644 index 0000000000000000000000000000000000000000..f6d05aea11f8c16198c0a1e011a3aa629813cf54 Binary files /dev/null and b/resource/singer/singer_embedding_pjs.npy differ diff --git a/song2note_lengths.json b/song2note_lengths.json new file mode 100644 index 0000000000000000000000000000000000000000..485acc5abf442c8fc930941976ad542bcb338a94 --- /dev/null +++ b/song2note_lengths.json @@ -0,0 +1,871 @@ +{ + "kising_421": [ + 12, + 14, + 5, + 8, + 9, + 4, + 15, + 16, + 11, + 11, + 10, + 10, + 4, + 4, + 6, + 6, + 3, + 6, + 6, + 12, + 21, + 10, + 8, + 9, + 13, + 15, + 8, + 10, + 10, + 10, + 11, + 10, + 8, + 10, + 9, + 9, + 8, + 10, + 9, + 12, + 9, + 7, + 8, + 9, + 14, + 14, + 11, + 12, + 13 + ], + "kising_422": [ + 13, + 14, + 14, + 14, + 14, + 12, + 16, + 12, + 12, + 13, + 12, + 12, + 12, + 13, + 13, + 9, + 10, + 16, + 12, + 18, + 12, + 12, + 13, + 13, + 12, + 12, + 13, + 12, + 8, + 11, + 14, + 12, + 14, + 10, + 12, + 13, + 12, + 7, + 11, + 8, + 6 + ], + "kising_423": [ + 2, + 4, + 5, + 2, + 2, + 3, + 4, + 6, + 2, + 6, + 3, + 4, + 7, + 5, + 7, + 20, + 21, + 21, + 20, + 3, + 4, + 7, + 14, + 4, + 1, + 4, + 4, + 4, + 2, + 5, + 7, + 6, + 5, + 4, + 8, + 3, + 8, + 5, + 6, + 20, + 23, + 21, + 21, + 5, + 6, + 8, + 16, + 4, + 7, + 17, + 7, + 5, + 4, + 5 + ], + "kising_424": [ + 5, + 7, + 5, + 6, + 5, + 7, + 7, + 5, + 7, + 5, + 6, + 4, + 6, + 6, + 6, + 4, + 3, + 6, + 4, + 7, + 8, + 7, + 10, + 8, + 8, + 5, + 8, + 5, + 6, + 4, + 6, + 5, + 6, + 5, + 3, + 8, + 9, + 8, + 11, + 8, + 8, + 7, + 4, + 3, + 3, + 3, + 8, + 6, + 7, + 8, + 8, + 10, + 8, + 12, + 9, + 7, + 6, + 7 + ], + "kising_425": [ + 6, + 6, + 7, + 7, + 10, + 5, + 8, + 16, + 4, + 4, + 6, + 7, + 4, + 9, + 7, + 11, + 10, + 5, + 10, + 8, + 16, + 10, + 8, + 3, + 5, + 6, + 5, + 6, + 5, + 6, + 5, + 8, + 15, + 4, + 6, + 6, + 5, + 4, + 8, + 8, + 11, + 10, + 5, + 10, + 10, + 16, + 8, + 10, + 16, + 10, + 8, + 14, + 7, + 8, + 11, + 4, + 8, + 7, + 13, + 8, + 7, + 7, + 5, + 2 + ], + "kising_426": [ + 4, + 8, + 8, + 17, + 3, + 9, + 11, + 18, + 37, + 6, + 36, + 19, + 14, + 17, + 7, + 3, + 5, + 4, + 16, + 3, + 8, + 8, + 18, + 3, + 9, + 11, + 18, + 36, + 6, + 35, + 21, + 14, + 16, + 7, + 10, + 9 + ], + "kising_427": [ + 9, + 8, + 12, + 10, + 8, + 8, + 11, + 10, + 7, + 6, + 16, + 20, + 21, + 23, + 16, + 9, + 8, + 11, + 15, + 7, + 4, + 9, + 8, + 22, + 6, + 7, + 14, + 20, + 22, + 22, + 16, + 7, + 6, + 11, + 16, + 7, + 27, + 23, + 22, + 14, + 7, + 8, + 27, + 5, + 5, + 19, + 21, + 12, + 8, + 13, + 7, + 7, + 22, + 5, + 5, + 14, + 9, + 4, + 23, + 13, + 3 + ], + "kising_428": [ + 8, + 3, + 14, + 12, + 12, + 6, + 15, + 12, + 13, + 6, + 23, + 4, + 13, + 3, + 21, + 3, + 15, + 14, + 10, + 26, + 11, + 12, + 15, + 9, + 8, + 4, + 16, + 12, + 19, + 23, + 4, + 14, + 2, + 20, + 3, + 14, + 13, + 12, + 12, + 8, + 13, + 14, + 14, + 6, + 11, + 13, + 14, + 11, + 15, + 7, + 14, + 12, + 15, + 7, + 6, + 6, + 2 + ], + "kising_429": [ + 6, + 5, + 8, + 6, + 9, + 6, + 9, + 7, + 18, + 8, + 7, + 3, + 13, + 6, + 5, + 2, + 10, + 11, + 24, + 12, + 11, + 29, + 7, + 1, + 5, + 9, + 8, + 7, + 5, + 8, + 8, + 9, + 4, + 11, + 9, + 4, + 15, + 6, + 5, + 10, + 9, + 24, + 10, + 10, + 29, + 10, + 10, + 39, + 10, + 26, + 4, + 4, + 13, + 13, + 12, + 10, + 10, + 27, + 12, + 8, + 24, + 6, + 11, + 12, + 6, + 6, + 10, + 15, + 1, + 13 + ], + "kising_430": [ + 8, + 10, + 6, + 10, + 19, + 5, + 6, + 7, + 9, + 6, + 9, + 19, + 4, + 6, + 5, + 9, + 10, + 12, + 4, + 8, + 10, + 32, + 10, + 20, + 8, + 23, + 16, + 3, + 9, + 9, + 11, + 16, + 8, + 10, + 28, + 9, + 19, + 40, + 10, + 2, + 4, + 11, + 9, + 19, + 9, + 24, + 5, + 8, + 7, + 3, + 10 + ], + "kising_431": [ + 11, + 7, + 11, + 8, + 12, + 9, + 16, + 7, + 8, + 4, + 8, + 5, + 4, + 3, + 5, + 6, + 13, + 10, + 5, + 3, + 10, + 7, + 10, + 8, + 14, + 9, + 14, + 9, + 12, + 9, + 13, + 5, + 6, + 13, + 4, + 5, + 5, + 3, + 10, + 2, + 4, + 4 + ], + "kising_432": [ + 11, + 7, + 11, + 8, + 12, + 8, + 15, + 7, + 7, + 5, + 7, + 5, + 6, + 3, + 5, + 5, + 5, + 8, + 6, + 5, + 5, + 3, + 10, + 7, + 10, + 8, + 14, + 11, + 14, + 8, + 6, + 5, + 8, + 5, + 5, + 3, + 5, + 6, + 4, + 6, + 5, + 5, + 6, + 6, + 5, + 7, + 4, + 6 + ], + "kising_433": [ + 18, + 18, + 15, + 35, + 18, + 10, + 8, + 12, + 9, + 8, + 16, + 10, + 9, + 13, + 20, + 13, + 12, + 8, + 10, + 8, + 17, + 18, + 17, + 14, + 20, + 16, + 9, + 7, + 11, + 10, + 9, + 15, + 17, + 13, + 18, + 12, + 16, + 15, + 19, + 20, + 17, + 14, + 19, + 13, + 12, + 4, + 12, + 4 + ], + "kising_434": [ + 14, + 3, + 12, + 16, + 7, + 14, + 19, + 12, + 17, + 15, + 9, + 13, + 6, + 8, + 4, + 10, + 10, + 6, + 10, + 9, + 10, + 8, + 12, + 17, + 8, + 15, + 10, + 9, + 22, + 19, + 16, + 5, + 9, + 11, + 14, + 4, + 10, + 9, + 6, + 9, + 9, + 9, + 9, + 4, + 10, + 4, + 9, + 9, + 4, + 9, + 11 + ], + "kising_441-2": [ + 16, + 9, + 17, + 8, + 8, + 7, + 9, + 18, + 13, + 32, + 14, + 5 + ], + "kising_441": [ + 7, + 8, + 8, + 6, + 22, + 4, + 28, + 7, + 14, + 13, + 15, + 4, + 11, + 7, + 17, + 7, + 7, + 7, + 26, + 16, + 8, + 7, + 15, + 22, + 5, + 28, + 7, + 14, + 13, + 14, + 5 + ], + "kising_442": [ + 9, + 10, + 8, + 13, + 9, + 10, + 22, + 10, + 10, + 12, + 11, + 10, + 10, + 8, + 13, + 9, + 10, + 22, + 10, + 10, + 12, + 13, + 10, + 10, + 26, + 10, + 10, + 9, + 13, + 10, + 10, + 12, + 13, + 10, + 10, + 26 + ], + "kising_443": [ + 10, + 30, + 12, + 16, + 13, + 5, + 2, + 5, + 6, + 47, + 49, + 11, + 29, + 6, + 11, + 14, + 14, + 4, + 47, + 49, + 2, + 16, + 7, + 3 + ] +} \ No newline at end of file diff --git a/svs_utils.py b/svs_utils.py new file mode 100755 index 0000000000000000000000000000000000000000..e2c2948789fa6150373978498351a3260bc81a84 --- /dev/null +++ b/svs_utils.py @@ -0,0 +1,331 @@ +from util import preprocess_input, postprocess_phn, get_tokenizer, load_pitch_dict, get_pinyin +from espnet_model_zoo.downloader import ModelDownloader +from espnet2.bin.svs_inference import SingingGenerate +import librosa +import torch +import numpy as np +import random +import json +from datasets import load_dataset +# the code below should be in app.py than svs_utils.py +# espnet_model_dict = { +# "Model①(Chinese)-zh": "espnet/aceopencpop_svs_visinger2_40singer_pretrain", +# "Model②(Multilingual)-zh": "espnet/mixdata_svs_visinger2_spkembed_lang_pretrained", +# "Model②(Multilingual)-jp": "espnet/mixdata_svs_visinger2_spkembed_lang_pretrained", +# } + +espnet_downloader = ModelDownloader() + +singer_embeddings = { + "espnet/aceopencpop_svs_visinger2_40singer_pretrain": { + "singer1 (male)": 1, + "singer2 (female)": 12, + "singer3 (male)": 23, + "singer4 (female)": 29, + "singer5 (male)": 18, + "singer6 (female)": 8, + "singer7 (male)": 25, + "singer8 (female)": 5, + "singer9 (male)": 10, + "singer10 (female)": 15, + }, + "espnet/mixdata_svs_visinger2_spkembed_lang_pretrained": { + "singer1 (male)": "resource/singer/singer_embedding_ace-1.npy", + "singer2 (female)": "resource/singer/singer_embedding_ace-2.npy", + "singer3 (male)": "resource/singer/singer_embedding_ace-3.npy", + "singer4 (female)": "resource/singer/singer_embedding_ace-8.npy", + "singer5 (male)": "resource/singer/singer_embedding_ace-7.npy", + "singer6 (female)": "resource/singer/singer_embedding_itako.npy", + "singer7 (male)": "resource/singer/singer_embedding_ofuton.npy", + "singer8 (female)": "resource/singer/singer_embedding_kising_orange.npy", + "singer9 (male)": "resource/singer/singer_embedding_m4singer_Tenor-1.npy", + "singer10 (female)": "resource/singer/singer_embedding_m4singer_Alto-4.npy", + }, +} + + +def svs_warmup(config): + """ + What: module loading, and model loading + Input: config dict/namespace (e.g., model path, cache dir, device, language, possibly speaker selection) + Return: the inference prototype function (which creates pitch/duration and runs model-specific inference) + """ + if config.model_path.startswith("espnet"): + downloaded = espnet_downloader.download_and_unpack( + config.model_path, config.cache_dir) + model = SingingGenerate( + train_config=downloaded["train_config"], + model_file=downloaded["model_file"], + device=config.device + ) + else: + raise NotImplementedError(f"Model {config.model_path} not supported") + return model + + +def svs_text_preprocessor(model_path, texts, lang): + ''' + Input: + - model_path (str), for getting the corresponding tokenizer + - texts (str), in Chinese character or Japanese character + - lang (str), language label jp/zh, input if is not espnet model + + Output: + - lyric_ls (lyric list), each element as 'k@zhe@zh' + - sybs (phn w/ _ list), each element as 'k@zh_e@zh' + - labels (phn w/o _ list), each element as 'k@zh' + + ''' + fs = 44100 + + if texts is None: + return (fs, np.array([0.0])), "Error: No Text provided!" + + # preprocess + if lang == "zh": + texts = preprocess_input(texts, "") + text_list = get_pinyin(texts) + elif lang == "jp": + texts = preprocess_input(texts, " ") + text_list = texts.strip().split() + + # text to phoneme + tokenizer = get_tokenizer(model_path, lang) + sybs = [] # phoneme list + for text in text_list: + if text == "AP" or text == "SP": + rev = [text] + elif text == "-" or text == "——": + rev = [text] + else: + rev = tokenizer(text) + if rev == False: + return (fs, np.array([0.0])), f"Error: text `{text}` is invalid!" + rev = postprocess_phn(rev, model_path, lang) + phns = "_".join(rev) + sybs.append(phns) + + lyric_ls = [] + labels = [] + pre_phn = "" + for phns in sybs: + if phns == "-" or phns == "——": + phns = pre_phn + + phn_list = phns.split("_") + lyric = "".join(phn_list) + for phn in phn_list: + labels.append(phn) + pre_phn = labels[-1] + lyric_ls.append(lyric) + + return lyric_ls, sybs, labels + + +def svs_get_batch(model_path, answer_text, lang, random_gen=True): + ''' + Input: + - answer_text (str), in Chinese character or Japanese character + - model_path (str), loaded pretrained model name + - lang (str), language label jp/zh, input if is not espnet model + Output: + - batch (dict) + + {'score': (75, [[0, 0.48057527844210024, 'n@zhi@zh', 66, 'n@zh_i@zh'], + [0.48057527844210024, 0.8049310140914353, 'k@zhe@zh', 57, 'k@zh_e@zh'], + [0.8049310140914353, 1.1905956333296641, 'm@zhei@zh', 64, 'm@zh_ei@zh']]), + 'text': 'n@zh i@zh k@zh e@zh m@zh ei@zh'} + ''' + tempo = 120 + lyric_ls, sybs, labels = svs_text_preprocessor( + model_path, answer_text, lang) + len_note = len(lyric_ls) + notes = [] + if random_gen: + # midi_range = (57,69) + st = 0 + for id_lyric in range(len_note): + pitch = random.randint(57, 69) + period = round(random.uniform(0.1, 0.5), 4) + ed = st+period + note = [st, ed, lyric_ls[id_lyric], pitch, sybs[id_lyric]] + st = ed + notes.append(note) + + phns_str = " ".join(labels) + batch = { + "score": ( + int(tempo), + notes, + ), + "text": phns_str, + } + + print(batch) + return batch + + +langs = { + "zh": 2, + "jp": 1, + "en": 2, +} + +exist_model = "Null" +svs = None + + +def svs_inference(model_name, model_svs, answer_text, lang, random_gen=True, fs=44100): + batch = svs_get_batch(model_name, answer_text, lang, + random_gen=random_gen) + + # Infer + spk = "singer1 (male)" + global exist_model + global svs + svs = model_svs + exist_model = model_name + # if exist_model == "Null" or exist_model != model_name: + # # device = "cpu" + # device = "cuda" if torch.cuda.is_available() else "cpu" + # d = ModelDownloader(cachedir="./cache") + # pretrain_downloaded = d.download_and_unpack(model_name) + # svs = SingingGenerate( + # train_config = pretrain_downloaded["train_config"], + # model_file = pretrain_downloaded["model_file"], + # device = device + # ) + # exist_model = model_name + if model_name == "Model①(Chinese)-zh": + sid = np.array([singer_embeddings[model_name][spk]]) + output_dict = svs(batch, sids=sid) + else: + lid = np.array([langs[lang]]) + spk_embed = np.load("resource/singer/singer_embedding_ace-1.npy") + output_dict = svs(batch, lids=lid, spembs=spk_embed) + wav_info = output_dict["wav"].cpu().numpy() + + return wav_info + + +def singmos_warmup(config): + predictor = torch.hub.load( + "South-Twilight/SingMOS:v0.2.0", "singing_ssl_mos", trust_repo=True) + return predictor, "South-Twilight/SingMOS:v0.2.0" + + +def singmos_evaluation(predictor, wav_info, fs): + wav_mos = librosa.resample(wav_info, orig_sr=fs, target_sr=16000) + wav_mos = torch.from_numpy(wav_mos).unsqueeze(0) + len_mos = torch.tensor([wav_mos.shape[1]]) + score = predictor(wav_mos, len_mos) + return score + + +def estimate_sentence_length(query, config, song2note_lengths): + if config.melody_source == "random_select": + # random select a song from database, and return its value in the phrase_length column + # return phrase_length column and song name + song_name = random.choice(list(song2note_lengths.keys())) + phrase_length = song2note_lengths[song_name] + metadata = {"song_name": song_name} + return phrase_length, metadata + else: + raise NotImplementedError( + f"melody source {config.melody_source} not supported") + + +def align_score_and_text(segment_iterator, lyric_ls, sybs, labels): + text = [] + lyric_idx = 0 + notes_info = [] + while lyric_idx < len(lyric_ls): + score = next(segment_iterator) + for note_start_time, note_end_time, reference_note_lyric, note_midi in zip(score['note_start_times'], score['note_end_times'], score["note_lyrics"], score['note_midi']): + if reference_note_lyric in ["", ""]: + notes_info.append([note_start_time, note_end_time, reference_note_lyric.strip("<>"), note_midi, reference_note_lyric.strip("<>")]) + text.append(reference_note_lyric.strip("<>")) + else: + notes_info.append([note_start_time, note_end_time, lyric_ls[lyric_idx], note_midi, sybs[lyric_idx]]) + text += sybs[lyric_idx].split("_") + lyric_idx += 1 + if lyric_idx >= len(lyric_ls): + break + batch = { + "score": ( + score['tempo'], # Assume the tempo is the same for all segments + notes_info + ), + "text": " ".join(text) + } + return batch + + +def song_segment_iterator(song_db, metadata): + song_name = metadata["song_name"] + if song_name.startswith("kising_"): + # return a iterator that load from song_name_{001} and increment + segment_id = 1 + while f"{song_name}_{segment_id:03d}" in song_db.index: + yield song_db.loc[f"{song_name}_{segment_id:03d}"] + segment_id += 1 + else: + raise NotImplementedError(f"song name {song_name} not supported") + + +def load_song_database(): + song_db = load_dataset("jhansss/kising_score_segments", + cache_dir="cache")["train"].to_pandas() + song_db.set_index("segment_id", inplace=True) + + with open("data/song2note_lengths.json", "r") as f: + song2note_lengths = json.load(f) + return song2note_lengths,song_db + +if __name__ == '__main__': + import argparse + + # -------- demo code for generate audio from randomly selected song ---------# + config = argparse.Namespace( + model_path="espnet/mixdata_svs_visinger2_spkembed_lang_pretrained", + cache_dir="cache", + device="cpu", + melody_source="random_select", + lang="zh", + ) + + # load model + model = svs_warmup(config) + + # load song database: jhansss/kising_score_segments + song2note_lengths, song_db = load_song_database() + + # get song_name and phrase_length + phrase_length, metadata = estimate_sentence_length( + None, config, song2note_lengths) + + # then, phrase_length info should be added to llm prompt, and get the answer lyrics from llm + # e.g. answer_text = "天气真好\n空气清新" + answer_text = "天气真好\n空气清新" + lyric_ls, sybs, labels = svs_text_preprocessor( + config.model_path, answer_text, config.lang) + segment_iterator = song_segment_iterator(song_db, metadata) + batch = align_score_and_text(segment_iterator, lyric_ls, sybs, labels) + singer_embedding = np.load( + singer_embeddings[config.model_path]["singer2 (female)"]) + lid = np.array([langs[config.lang]]) + output_dict = model(batch, lids=lid, spembs=singer_embedding) + wav_info = output_dict["wav"].cpu().numpy() + # write wav to output_retrieved.wav + import soundfile as sf + sf.write("output_retrieved.wav", wav_info, samplerate=44100) + + # -------- some other processes ---------# + # get answer text from LLM + answer_text = "你真是太美啦" + lang = "zh" + sample_rate = 44100 + model_path = "espnet/mixdata_svs_visinger2_spkembed_lang_pretrained" # temp hard code + wav_info = svs_inference(config.model_path, model, answer_text, lang=config.lang, random_gen=True, fs=sample_rate) + wav_info = wav_info * 32767 + wav.write("output_random.wav", sample_rate, wav_info.astype('int16')) diff --git a/util.py b/util.py new file mode 100755 index 0000000000000000000000000000000000000000..c436a905f95dde58dc893f3b88588d712f340e9f --- /dev/null +++ b/util.py @@ -0,0 +1,93 @@ +import os +import json +import warnings +from typing import List +import re + +import pyopenjtalk +from resource.pinyin_dict import PINYIN_DICT +from pypinyin import lazy_pinyin + +def preprocess_input(src_str, seg_syb=" "): + src_str = src_str.replace("\n", seg_syb) + src_str = src_str.replace(" ", seg_syb) + return src_str + + +def postprocess_phn(phns, model_name, lang): + if "Chinese" in model_name: + return phns + return [phn + "@" + lang for phn in phns] + + +def pyopenjtalk_g2p(text) -> List[str]: + with warnings.catch_warnings(record=True) as w: + warnings.simplefilter("always") + # phones is a str object separated by space + phones = pyopenjtalk.g2p(text, kana=False) + if len(w) > 0: + for warning in w: + if "No phoneme" in str(warning.message): + return False + + phones = phones.split(" ") + return phones + + +def split_pinyin_ace(pinyin: str, zh_plan: dict) -> tuple[str]: + # load pinyin dict from local/pinyin.dict + pinyin = pinyin.lower() + if pinyin in zh_plan["dict"]: + return zh_plan["dict"][pinyin] + elif pinyin in zh_plan["syllable_alias"]: + return zh_plan["dict"][zh_plan["syllable_alias"][pinyin]] + else: + return False + + +def split_pinyin_py(pinyin: str) -> tuple[str]: + pinyin = pinyin.lower() + if pinyin in PINYIN_DICT: + return PINYIN_DICT[pinyin] + else: + return False + + +def get_tokenizer(model, lang): + if lang == "zh": + if "Chinese" in model: + print("hello") + return lambda text: split_pinyin_py(text) + else: + with open(os.path.join("resource/all_plans.json"), "r") as f: + all_plan_dict = json.load(f) + for plan in all_plan_dict["plans"]: + if plan["language"] == "zh": + zh_plan = plan + return lambda text: split_pinyin_ace(text, zh_plan) + elif lang == "jp": + return pyopenjtalk_g2p + + +def get_pinyin(texts): + pinyin_list = lazy_pinyin(texts) + text_list = [] + for text in pinyin_list: + if text[0] == "S" or text[0] == "A" or text[0] == '-': + sp_strs = re.findall(r'-|AP|SP', text) + for phn in sp_strs: + text_list.append(phn) + else: + text_list.append(text) + return text_list + + +def load_pitch_dict(file_path = "resource/midi-note.scp"): + pitch_dict = {} + with open(file_path, "r", encoding="utf-8") as f: + for line in f: + items = line.strip().split() + pitch_dict[items[0]] = int(items[1]) + pitch_dict[items[1]] = int(items[1]) + return pitch_dict +