From c5e8c4c9997524070e05c38aab19a66230d78729 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Tue, 5 Sep 2023 00:50:02 +0800 Subject: [PATCH 001/102] Create .gitkeep --- bert/bert-base-japanese-v3/.gitkeep | 1 + 1 file changed, 1 insertion(+) create mode 100644 bert/bert-base-japanese-v3/.gitkeep diff --git a/bert/bert-base-japanese-v3/.gitkeep b/bert/bert-base-japanese-v3/.gitkeep new file mode 100644 index 000000000..8b1378917 --- /dev/null +++ b/bert/bert-base-japanese-v3/.gitkeep @@ -0,0 +1 @@ + From 972fd2ca1a6356b919d448737e164604b918d50f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Tue, 5 Sep 2023 00:50:37 +0800 Subject: [PATCH 002/102] Create config.json --- bert/bert-base-japanese-v3/config.json | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) create mode 100644 bert/bert-base-japanese-v3/config.json diff --git a/bert/bert-base-japanese-v3/config.json b/bert/bert-base-japanese-v3/config.json new file mode 100644 index 000000000..65a2f3322 --- /dev/null +++ b/bert/bert-base-japanese-v3/config.json @@ -0,0 +1,19 @@ +{ + "architectures": [ + "BertForPreTraining" + ], + "attention_probs_dropout_prob": 0.1, + "hidden_act": "gelu", + "hidden_dropout_prob": 0.1, + "hidden_size": 768, + "initializer_range": 0.02, + "intermediate_size": 3072, + "layer_norm_eps": 1e-12, + "max_position_embeddings": 512, + "model_type": "bert", + "num_attention_heads": 12, + "num_hidden_layers": 12, + "pad_token_id": 0, + "type_vocab_size": 2, + "vocab_size": 32768 +} From bfb39cc1142392200dc512f57d68bb23d1b01377 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Tue, 5 Sep 2023 00:50:55 +0800 Subject: [PATCH 003/102] Create README.md --- bert/bert-base-japanese-v3/README.md | 53 ++++++++++++++++++++++++++++ 1 file changed, 53 insertions(+) create mode 100644 bert/bert-base-japanese-v3/README.md diff --git a/bert/bert-base-japanese-v3/README.md b/bert/bert-base-japanese-v3/README.md new file mode 100644 index 000000000..c5b345671 --- /dev/null +++ b/bert/bert-base-japanese-v3/README.md @@ -0,0 +1,53 @@ +--- +license: apache-2.0 +datasets: +- cc100 +- wikipedia +language: +- ja +widget: +- text: 東北大学で[MASK]の研究をしています。 +--- + +# BERT base Japanese (unidic-lite with whole word masking, CC-100 and jawiki-20230102) + +This is a [BERT](https://github.com/google-research/bert) model pretrained on texts in the Japanese language. + +This version of the model processes input texts with word-level tokenization based on the Unidic 2.1.2 dictionary (available in [unidic-lite](https://pypi.org/project/unidic-lite/) package), followed by the WordPiece subword tokenization. +Additionally, the model is trained with the whole word masking enabled for the masked language modeling (MLM) objective. + +The codes for the pretraining are available at [cl-tohoku/bert-japanese](https://github.com/cl-tohoku/bert-japanese/). + +## Model architecture + +The model architecture is the same as the original BERT base model; 12 layers, 768 dimensions of hidden states, and 12 attention heads. + +## Training Data + +The model is trained on the Japanese portion of [CC-100 dataset](https://data.statmt.org/cc-100/) and the Japanese version of Wikipedia. +For Wikipedia, we generated a text corpus from the [Wikipedia Cirrussearch dump file](https://dumps.wikimedia.org/other/cirrussearch/) as of January 2, 2023. +The corpus files generated from CC-100 and Wikipedia are 74.3GB and 4.9GB in size and consist of approximately 392M and 34M sentences, respectively. + +For the purpose of splitting texts into sentences, we used [fugashi](https://github.com/polm/fugashi) with [mecab-ipadic-NEologd](https://github.com/neologd/mecab-ipadic-neologd) dictionary (v0.0.7). + +## Tokenization + +The texts are first tokenized by MeCab with the Unidic 2.1.2 dictionary and then split into subwords by the WordPiece algorithm. +The vocabulary size is 32768. + +We used [fugashi](https://github.com/polm/fugashi) and [unidic-lite](https://github.com/polm/unidic-lite) packages for the tokenization. + +## Training + +We trained the model first on the CC-100 corpus for 1M steps and then on the Wikipedia corpus for another 1M steps. +For training of the MLM (masked language modeling) objective, we introduced whole word masking in which all of the subword tokens corresponding to a single word (tokenized by MeCab) are masked at once. + +For training of each model, we used a v3-8 instance of Cloud TPUs provided by [TPU Research Cloud](https://sites.research.google/trc/about/). + +## Licenses + +The pretrained models are distributed under the Apache License 2.0. + +## Acknowledgments + +This model is trained with Cloud TPUs provided by [TPU Research Cloud](https://sites.research.google/trc/about/) program. From 80a50f87685673acd33891cff49f11ba7126b8b8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Tue, 5 Sep 2023 00:51:17 +0800 Subject: [PATCH 004/102] Create vocab.txt --- bert/bert-base-japanese-v3/vocab.txt | 32768 +++++++++++++++++++++++++ 1 file changed, 32768 insertions(+) create mode 100644 bert/bert-base-japanese-v3/vocab.txt diff --git a/bert/bert-base-japanese-v3/vocab.txt b/bert/bert-base-japanese-v3/vocab.txt new file mode 100644 index 000000000..421500f13 --- /dev/null +++ b/bert/bert-base-japanese-v3/vocab.txt @@ -0,0 +1,32768 @@ +[PAD] +[UNK] +[CLS] +[SEP] +[MASK] +[unused0] +[unused1] +[unused2] +[unused3] +[unused4] +[unused5] +[unused6] +[unused7] +[unused8] +[unused9] + +! +" +# +$ +% +& +' +( +) +* ++ +, +- +. +/ +0 +1 +2 +3 +4 +5 +6 +7 +8 +9 +: +; +< += +> +? +@ +A +B +C +D +E +F +G +H +I +J +K +L +M +N +O +P +Q +R +S +T +U +V +W +X +Y +Z +[ +\ +] +^ +_ +` +a +b +c +d +e +f +g +h +i +j +k +l +m +n +o +p +q +r +s +t +u +v +w +x +y +z +{ +| +} +~ +¡ +¢ +£ +¤ +¥ +¦ +§ +© +« +¬ +® +° +± +¶ +· +» +¿ +Å +× +÷ +ÿ +ħ +Γ +Δ +Θ +Λ +Ξ +Ο +Π +Σ +Φ +Ψ +Ω +α +β +γ +δ +ε +ζ +η +θ +ι +κ +λ +μ +ν +ξ +π +ρ +σ +τ +υ +φ +χ +ψ +ω +Д +Щ +д +з +щ +ъ +ё +א +ิ +ლ +‐ +– +— +― +‖ +‘ +’ +“ +” +† +‡ +• +‰ +′ +※ +‿ +⁂ +⁑ +€ +℧ +← +↑ +→ +↓ +↔ +↖ +↗ +↘ +↙ +⇄ +⇒ +⇔ +⇦ +⇧ +⇨ +⇩ +∀ +∂ +∃ +∅ +∇ +∈ +∉ +∋ +− +∓ +√ +∝ +∞ +∟ +∠ +∥ +∦ +∧ +∨ +∩ +∪ +∫ +∮ +∴ +∵ +∽ +≃ +≅ +≈ +≒ +≠ +≡ +≢ +≦ +≧ +≪ +≫ +≶ +≷ +⊂ +⊃ +⊄ +⊅ +⊆ +⊇ +⊊ +⊋ +⊕ +⊖ +⊗ +⊥ +⊿ +⋚ +⋛ +⌅ +⌆ +⌒ +⌘ +⎾ +⎿ +⏀ +⏁ +⏂ +⏃ +⏄ +⏅ +⏆ +⏇ +⏈ +⏉ +⏊ +⏋ +⏌ +⏎ +⓫ +⓬ +⓭ +⓮ +⓯ +⓰ +⓱ +⓲ +⓳ +⓴ +⓵ +⓶ +⓷ +⓸ +⓹ +⓺ +⓻ +⓼ +⓽ +⓾ +─ +━ +┌ +┐ +┘ +├ +╹ +■ +□ +▱ +▲ +△ +▶ +▷ +▼ +▽ +◀ +◁ +◆ +◇ +◉ +○ +◎ +● +◐ +◑ +◒ +◓ +◡ +◦ +◯ +☀ +☁ +☂ +☃ +★ +☆ +☎ +☖ +☗ +☞ +♀ +♂ +♠ +♡ +♢ +♣ +♤ +♥ +♦ +♧ +♨ +♩ +♪ +♫ +♬ +♭ +♮ +♯ +✓ +❖ +❶ +❷ +❸ +❹ +❺ +❻ +❼ +❽ +❾ +❿ +⤴ +⤵ +⦅ +⦆ +⦿ +⧺ +⧻ +、 +。 +〃 +〄 +々 +〆 +〇 +〈 +〉 +《 +》 +「 +」 +『 +』 +【 +】 +〒 +〓 +〔 +〕 +〖 +〗 +〘 +〙 +〜 +〝 +〟 +〠 +〳 +〴 +〵 +〻 +〼 +〽 +ぁ +あ +ぃ +い +ぅ +う +ぇ +え +ぉ +お +か +が +き +ぎ +く +ぐ +け +げ +こ +ご +さ +ざ +し +じ +す +ず +せ +ぜ +そ +ぞ +た +だ +ち +ぢ +っ +つ +づ +て +で +と +ど +な +に +ぬ +ね +の +は +ば +ぱ +ひ +び +ぴ +ふ +ぶ +ぷ +へ +べ +ぺ +ほ +ぼ +ぽ +ま +み +む +め +も +ゃ +や +ゅ +ゆ +ょ +よ +ら +り +る +れ +ろ +ゎ +わ +ゐ +ゑ +を +ん +ゝ +ゞ +゠ +ァ +ア +ィ +イ +ゥ +ウ +ェ +エ +ォ +オ +カ +ガ +キ +ギ +ク +グ +ケ +ゲ +コ +ゴ +サ +ザ +シ +ジ +ス +ズ +セ +ゼ +ソ +ゾ +タ +ダ +チ +ヂ +ッ +ツ +ヅ +テ +デ +ト +ド +ナ +ニ +ヌ +ネ +ノ +ハ +バ +パ +ヒ +ビ +ピ +フ +ブ +プ +ヘ +ベ +ペ +ホ +ボ +ポ +マ +ミ +ム +メ +モ +ャ +ヤ +ュ +ユ +ョ +ヨ +ラ +リ +ル +レ +ロ +ヮ +ワ +ヰ +ヱ +ヲ +ン +ヴ +ヵ +ヶ +ヷ +ヸ +・ +ー +ヽ +ヾ +ㇲ +ㇻ +㓛 +㮶 +一 +丁 +丂 +七 +万 +丈 +三 +上 +下 +不 +与 +丐 +丑 +且 +丕 +世 +丘 +丙 +丞 +両 +並 +个 +中 +丰 +串 +丸 +丹 +主 +丼 +丿 +乂 +乃 +久 +之 +乍 +乎 +乏 +乕 +乖 +乗 +乘 +乙 +九 +乞 +也 +乢 +乱 +乳 +乾 +亀 +亂 +了 +予 +争 +事 +二 +于 +云 +互 +五 +井 +亘 +亙 +些 +亜 +亞 +亟 +亡 +亢 +交 +亥 +亦 +亨 +享 +京 +亭 +亮 +亳 +亶 +人 +亻 +什 +仁 +仄 +仆 +仇 +今 +介 +仍 +从 +仏 +仔 +仕 +他 +仗 +付 +仙 +仝 +仞 +代 +令 +以 +仭 +仮 +仰 +仲 +仵 +件 +价 +任 +份 +仿 +企 +伉 +伊 +伋 +伍 +伎 +伏 +伐 +休 +会 +伜 +伝 +伯 +估 +伴 +伶 +伸 +伺 +似 +伽 +佃 +但 +佇 +位 +低 +住 +佐 +佑 +体 +何 +佗 +余 +佚 +佛 +作 +佝 +佞 +佟 +佤 +佩 +佯 +佳 +併 +佶 +佻 +佼 +使 +侃 +來 +侈 +例 +侍 +侏 +侑 +侖 +侗 +侘 +供 +依 +侠 +価 +侫 +侭 +侮 +侯 +侵 +侶 +便 +係 +促 +俄 +俅 +俊 +俎 +俐 +俑 +俔 +俗 +俘 +俚 +俛 +保 +俟 +俠 +信 +俣 +俤 +俥 +修 +俯 +俱 +俳 +俵 +俶 +俸 +俺 +俾 +倂 +倅 +倆 +倉 +個 +倍 +倏 +們 +倒 +倔 +倖 +候 +倚 +借 +倣 +値 +倥 +倦 +倨 +倩 +倪 +倫 +倭 +倶 +倹 +倻 +偃 +假 +偈 +偉 +偏 +偐 +偕 +偖 +做 +停 +健 +偬 +偲 +側 +偵 +偶 +偸 +偽 +傀 +傅 +傍 +傑 +傕 +傘 +備 +傚 +傪 +催 +傭 +傲 +傳 +傴 +債 +傷 +傾 +僂 +僅 +僉 +僊 +働 +像 +僑 +僔 +僕 +僖 +僚 +僞 +僣 +僥 +僧 +僭 +僮 +價 +僻 +儀 +儁 +儂 +億 +儉 +儋 +儒 +儔 +儕 +儘 +儚 +儛 +儞 +償 +儡 +優 +儲 +儷 +儺 +儻 +儼 +兀 +允 +元 +兄 +充 +兆 +兇 +先 +光 +兊 +克 +兌 +免 +兎 +児 +兒 +兔 +兕 +兗 +党 +兜 +兢 +入 +內 +全 +兩 +兪 +八 +公 +六 +兮 +共 +兵 +其 +具 +典 +兼 +冀 +内 +円 +冉 +冊 +册 +再 +冐 +冑 +冒 +冕 +冗 +写 +冠 +冢 +冤 +冥 +冦 +冨 +冩 +冪 +冬 +冰 +冱 +冲 +决 +冴 +况 +冶 +冷 +冼 +冽 +凄 +准 +凉 +凋 +凌 +凍 +凖 +凛 +凜 +凝 +凞 +几 +凡 +処 +凧 +凩 +凪 +凭 +凮 +凰 +凱 +凶 +凸 +凹 +出 +函 +凾 +刀 +刃 +刄 +分 +切 +刈 +刊 +刋 +刎 +刑 +刕 +列 +初 +判 +別 +利 +刪 +刮 +到 +刳 +制 +刷 +券 +刹 +刺 +刻 +剃 +剄 +則 +削 +剋 +剌 +前 +剔 +剖 +剛 +剝 +剣 +剤 +剥 +剪 +副 +剰 +剱 +割 +剴 +創 +剽 +剿 +劃 +劇 +劈 +劉 +劍 +劒 +劔 +力 +功 +加 +劣 +助 +努 +劫 +劬 +劭 +励 +労 +効 +劻 +劾 +勁 +勃 +勅 +勇 +勉 +勒 +動 +勘 +務 +勛 +勝 +勞 +募 +勢 +勣 +勤 +勧 +勰 +勲 +勳 +勵 +勸 +勺 +勾 +勿 +匀 +匁 +匂 +包 +匆 +匈 +匍 +匏 +匐 +匕 +化 +北 +匙 +匝 +匠 +匡 +匣 +匪 +匯 +匱 +匹 +区 +医 +匾 +匿 +區 +十 +千 +卅 +卆 +升 +午 +卉 +半 +卍 +卑 +卒 +卓 +協 +南 +単 +博 +卜 +卞 +占 +卣 +卦 +卩 +卮 +卯 +印 +危 +即 +却 +卵 +卷 +卸 +卻 +卽 +卿 +厄 +厓 +厖 +厘 +厚 +原 +厠 +厥 +厦 +厨 +厩 +厭 +厰 +厲 +厳 +厷 +去 +参 +參 +又 +叉 +及 +友 +双 +反 +収 +叔 +取 +受 +叙 +叛 +叟 +叡 +叢 +口 +古 +句 +叩 +只 +叫 +召 +叭 +叮 +可 +台 +叱 +史 +右 +叶 +号 +司 +叺 +吁 +吃 +各 +合 +吉 +吊 +同 +名 +后 +吏 +吐 +向 +君 +吝 +吞 +吟 +吠 +否 +吩 +含 +听 +吶 +吸 +吹 +吻 +吼 +吽 +吾 +呀 +呂 +呆 +呈 +呉 +告 +呍 +呑 +呕 +呟 +周 +呪 +呰 +呱 +味 +呵 +呶 +呷 +呻 +呼 +命 +咀 +咄 +咆 +咈 +咋 +和 +咎 +咏 +咐 +咒 +咜 +咤 +咥 +咨 +咩 +咫 +咬 +咯 +咲 +咳 +咸 +咽 +哀 +品 +哄 +哆 +哇 +哈 +哉 +員 +哥 +哨 +哭 +哮 +哲 +哺 +哿 +唄 +唆 +唇 +唎 +唐 +唔 +唖 +售 +唯 +唱 +唳 +唸 +唹 +唼 +唾 +啀 +啄 +商 +問 +啐 +啓 +啖 +啜 +啞 +啣 +啻 +啼 +啾 +喀 +喃 +善 +喆 +喇 +喉 +喊 +喋 +喎 +喘 +喙 +喚 +喜 +喝 +喟 +喧 +喨 +喩 +喪 +喫 +喬 +單 +喰 +営 +嗄 +嗅 +嗇 +嗔 +嗚 +嗜 +嗟 +嗣 +嗤 +嗷 +嗽 +嗾 +嘆 +嘉 +嘎 +嘔 +嘖 +嘗 +嘘 +嘩 +嘯 +嘱 +嘲 +嘴 +嘶 +嘸 +噂 +噉 +噌 +噎 +噓 +噛 +噤 +噦 +器 +噪 +噫 +噬 +噯 +噲 +噴 +噶 +噸 +噺 +嚀 +嚆 +嚇 +嚊 +嚏 +嚔 +嚙 +嚠 +嚢 +嚥 +嚭 +嚮 +嚴 +嚶 +嚼 +囀 +囁 +囂 +囃 +囈 +囊 +囎 +囓 +囗 +囘 +囚 +四 +回 +因 +団 +囮 +困 +囲 +図 +囹 +固 +国 +囿 +圀 +圃 +圄 +國 +圍 +圏 +園 +圓 +圖 +團 +圜 +土 +圦 +圧 +在 +圭 +地 +圳 +圷 +圻 +址 +坂 +均 +坊 +坍 +坎 +坏 +坐 +坑 +坡 +坤 +坦 +坨 +坩 +坪 +垂 +垈 +型 +垓 +垜 +垠 +垢 +垣 +垰 +垸 +埃 +埋 +城 +埒 +埓 +埔 +埜 +域 +埠 +埣 +埤 +埴 +埵 +執 +培 +基 +埼 +堀 +堂 +堅 +堆 +堊 +堕 +堙 +堝 +堡 +堤 +堪 +堯 +堰 +報 +場 +堵 +堺 +塀 +塁 +塊 +塋 +塌 +塑 +塒 +塔 +塗 +塘 +塙 +塚 +塞 +塡 +塢 +塩 +填 +塰 +塲 +塵 +塹 +塼 +塾 +境 +墅 +墉 +墓 +増 +墜 +增 +墟 +墨 +墳 +墺 +墻 +墾 +壁 +壅 +壇 +壊 +壌 +壑 +壒 +壓 +壕 +壘 +壙 +壜 +壟 +壤 +士 +壬 +壮 +壯 +声 +壱 +売 +壷 +壹 +壺 +壻 +壼 +壽 +変 +夋 +夏 +夔 +夕 +外 +夙 +多 +夛 +夜 +夢 +夥 +大 +天 +太 +夫 +夬 +夭 +央 +失 +夷 +夾 +奄 +奇 +奈 +奉 +奎 +奏 +契 +奔 +奕 +套 +奘 +奚 +奝 +奠 +奢 +奥 +奧 +奨 +奪 +奬 +奭 +奮 +女 +奴 +奶 +奸 +好 +妁 +如 +妃 +妄 +妊 +妍 +妓 +妖 +妙 +妣 +妥 +妨 +妬 +妲 +妹 +妺 +妻 +妾 +姆 +姉 +始 +姐 +姑 +姒 +姓 +委 +姙 +姚 +姜 +姣 +姥 +姦 +姧 +姨 +姪 +姫 +姶 +姸 +姻 +姿 +威 +娃 +娍 +娑 +娘 +娜 +娟 +娠 +娥 +娩 +娯 +娵 +娶 +娼 +婀 +婁 +婆 +婉 +婚 +婢 +婣 +婦 +婪 +婬 +婿 +媄 +媒 +媚 +媛 +媧 +媳 +媼 +媽 +媾 +嫁 +嫂 +嫄 +嫉 +嫋 +嫌 +嫐 +嫖 +嫗 +嫡 +嫣 +嫦 +嫩 +嫵 +嫺 +嬉 +嬋 +嬌 +嬖 +嬢 +嬥 +嬪 +嬬 +嬰 +嬲 +嬴 +嬶 +孀 +孁 +孃 +孅 +孌 +子 +孑 +孔 +孕 +字 +存 +孚 +孛 +孜 +孝 +孟 +季 +孤 +学 +孩 +孫 +孰 +孵 +學 +孺 +孽 +宀 +宅 +宇 +守 +安 +宋 +完 +宍 +宏 +宓 +宕 +宗 +官 +宙 +定 +宛 +宜 +宝 +実 +客 +宣 +室 +宥 +宦 +宮 +宰 +害 +宴 +宵 +家 +宸 +容 +宿 +寂 +寃 +寄 +寅 +密 +寇 +富 +寐 +寒 +寓 +寔 +寛 +寝 +寞 +察 +寡 +寢 +寤 +寥 +實 +寧 +寨 +審 +寫 +寮 +寰 +寳 +寵 +寶 +寸 +寺 +対 +寿 +封 +専 +射 +将 +將 +專 +尉 +尊 +尋 +對 +導 +小 +少 +尓 +尖 +尚 +尠 +尤 +尨 +尩 +尫 +尭 +就 +尸 +尹 +尺 +尻 +尼 +尽 +尾 +尿 +局 +屁 +居 +屈 +届 +屋 +屍 +屎 +屏 +屐 +屑 +屓 +展 +屛 +属 +屠 +屡 +屢 +層 +履 +屬 +屮 +屯 +山 +屹 +岌 +岐 +岑 +岡 +岨 +岩 +岫 +岬 +岱 +岳 +岷 +岸 +岺 +岻 +峅 +峙 +峠 +峡 +峨 +峩 +峪 +峭 +峯 +峰 +峴 +島 +峻 +峽 +崇 +崋 +崎 +崑 +崔 +崕 +崖 +崗 +崘 +崙 +崛 +崟 +崧 +崩 +嵆 +嵋 +嵌 +嵎 +嵐 +嵜 +嵩 +嵬 +嵯 +嶂 +嶄 +嶇 +嶋 +嶌 +嶠 +嶮 +嶲 +嶺 +嶼 +嶽 +巉 +巌 +巍 +巎 +巒 +巓 +巖 +川 +州 +巡 +巢 +巣 +工 +左 +巧 +巨 +巫 +差 +己 +已 +巳 +巴 +巷 +巻 +巽 +巾 +市 +布 +帆 +希 +帑 +帕 +帖 +帙 +帚 +帛 +帝 +帥 +師 +席 +帮 +帯 +帰 +帳 +帶 +帷 +常 +帽 +幀 +幄 +幅 +幇 +幌 +幎 +幔 +幕 +幖 +幗 +幘 +幟 +幡 +幢 +幣 +幫 +干 +平 +年 +并 +幷 +幸 +幹 +幻 +幼 +幽 +幾 +庁 +広 +庄 +庇 +床 +序 +底 +庖 +店 +庚 +府 +庠 +度 +座 +庫 +庭 +庵 +庶 +康 +庸 +庾 +廁 +廂 +廃 +廈 +廉 +廊 +廋 +廏 +廐 +廓 +廖 +廚 +廛 +廟 +廠 +廡 +廢 +廣 +廩 +廬 +廰 +廳 +廴 +延 +廷 +廸 +建 +廻 +廼 +廿 +弁 +弄 +弉 +弊 +弋 +弌 +式 +弐 +弑 +弓 +弔 +引 +弖 +弗 +弘 +弛 +弟 +弥 +弦 +弧 +弩 +弭 +弯 +弱 +弴 +張 +強 +弼 +弾 +彅 +彈 +彊 +彌 +彎 +当 +彗 +彙 +彝 +彡 +形 +彣 +彤 +彦 +彧 +彩 +彪 +彫 +彬 +彭 +彰 +影 +彳 +彷 +役 +彼 +彿 +往 +征 +徂 +徃 +径 +待 +徇 +徊 +律 +後 +徐 +徒 +従 +得 +徘 +徙 +從 +徠 +御 +徧 +徨 +復 +循 +徭 +微 +徳 +徴 +徵 +德 +徹 +徽 +心 +必 +忉 +忌 +忍 +忖 +志 +忘 +忙 +応 +忝 +忠 +忤 +忩 +快 +忯 +忰 +忱 +念 +忸 +忽 +忿 +怏 +怐 +怒 +怕 +怖 +怙 +怛 +怜 +思 +怠 +怡 +急 +性 +怨 +怩 +怪 +怫 +怯 +怱 +怺 +恁 +恂 +恃 +恆 +恊 +恋 +恍 +恐 +恒 +恕 +恙 +恚 +恟 +恠 +恢 +恣 +恤 +恥 +恨 +恩 +恪 +恫 +恬 +恭 +息 +恰 +恵 +悃 +悄 +悅 +悉 +悋 +悌 +悍 +悔 +悖 +悚 +悛 +悝 +悟 +悠 +患 +悦 +悧 +悩 +悪 +悰 +悲 +悳 +悴 +悵 +悶 +悸 +悼 +悽 +情 +惇 +惑 +惓 +惔 +惕 +惘 +惚 +惜 +惟 +惠 +惡 +惣 +惧 +惨 +惰 +惱 +想 +惴 +惶 +惹 +惺 +惻 +愁 +愆 +愈 +愉 +愍 +愎 +意 +愕 +愚 +愛 +感 +愡 +愧 +愨 +愬 +愴 +愷 +愼 +愾 +愿 +慂 +慄 +慇 +慈 +慊 +態 +慌 +慍 +慎 +慓 +慕 +慘 +慙 +慚 +慟 +慢 +慣 +慥 +慧 +慨 +慫 +慮 +慰 +慳 +慴 +慶 +慷 +慾 +憂 +憊 +憍 +憎 +憐 +憑 +憔 +憖 +憙 +憚 +憤 +憧 +憩 +憫 +憬 +憮 +憲 +憶 +憺 +憾 +懃 +懆 +懇 +懈 +應 +懊 +懋 +懌 +懐 +懣 +懦 +懲 +懴 +懶 +懷 +懸 +懺 +懼 +懽 +懾 +懿 +戀 +戈 +戉 +戊 +戌 +戍 +戎 +成 +我 +戒 +戔 +或 +戚 +戛 +戞 +戟 +戡 +戦 +戩 +截 +戮 +戯 +戰 +戲 +戴 +戸 +戻 +房 +所 +扁 +扇 +扈 +扉 +手 +才 +扎 +打 +払 +托 +扛 +扞 +扠 +扣 +扨 +扮 +扱 +扶 +批 +扼 +承 +技 +抂 +抃 +抄 +抉 +把 +抑 +抒 +抓 +抔 +投 +抖 +抗 +折 +抛 +抜 +択 +披 +抬 +抱 +抵 +抹 +押 +抽 +拂 +担 +拆 +拇 +拈 +拉 +拌 +拍 +拏 +拐 +拒 +拓 +拔 +拕 +拗 +拘 +拙 +招 +拜 +拝 +拠 +拡 +括 +拭 +拮 +拯 +拱 +拳 +拵 +拶 +拷 +拼 +拾 +拿 +持 +挂 +指 +挈 +按 +挊 +挌 +挍 +挐 +挑 +挘 +挙 +挟 +挨 +挫 +振 +挵 +挹 +挺 +挽 +挾 +挿 +捉 +捌 +捍 +捏 +捐 +捕 +捗 +捜 +捥 +捧 +捨 +捩 +据 +捲 +捶 +捷 +捺 +捻 +掃 +授 +掉 +掌 +掏 +排 +掖 +掘 +掛 +掟 +掠 +採 +探 +掣 +接 +控 +推 +掩 +措 +掬 +掲 +掴 +掻 +掾 +揃 +揄 +揆 +揉 +描 +提 +插 +揖 +揚 +換 +握 +揣 +揭 +揮 +援 +揶 +揷 +揺 +搆 +損 +搏 +搔 +搖 +搗 +搜 +搦 +搨 +搩 +搬 +搭 +携 +搾 +摂 +摑 +摘 +摠 +摧 +摩 +摭 +摯 +摶 +摸 +摹 +摺 +撃 +撈 +撒 +撓 +撕 +撚 +撝 +撞 +撤 +撥 +撩 +撫 +播 +撮 +撰 +撲 +撹 +撻 +撼 +撾 +撿 +擁 +擂 +擅 +擇 +操 +擒 +擔 +擘 +據 +擠 +擡 +擢 +擣 +擤 +擦 +擧 +擬 +擯 +擱 +擲 +擴 +擺 +擻 +擽 +擾 +攀 +攅 +攘 +攝 +攣 +攪 +攫 +攬 +支 +攴 +攵 +收 +攷 +攸 +改 +攻 +放 +政 +故 +效 +敍 +敎 +敏 +救 +敕 +敖 +敗 +教 +敝 +敢 +散 +敦 +敧 +敬 +数 +敲 +整 +敵 +敷 +數 +斂 +斃 +文 +斉 +斌 +斎 +斐 +斑 +斗 +料 +斛 +斜 +斟 +斡 +斤 +斥 +斧 +斫 +斬 +断 +斯 +新 +斷 +方 +於 +施 +旁 +旄 +旅 +旆 +旋 +旌 +族 +旒 +旗 +旛 +无 +既 +日 +旦 +旧 +旨 +早 +旬 +旭 +旱 +旺 +旻 +旼 +昂 +昆 +昇 +昉 +昊 +昌 +明 +昏 +易 +昔 +昕 +星 +映 +春 +昧 +昨 +昭 +是 +昱 +昴 +昵 +昶 +昺 +昼 +晁 +時 +晃 +晄 +晉 +晋 +晏 +晒 +晝 +晟 +晢 +晤 +晦 +晧 +晨 +晩 +普 +景 +晰 +晴 +晶 +晷 +智 +暁 +暇 +暈 +暉 +暎 +暑 +暖 +暗 +暘 +暝 +暠 +暢 +暦 +暫 +暮 +暴 +暸 +暹 +暻 +暼 +暾 +曁 +曄 +曇 +曈 +曉 +曖 +曙 +曜 +曝 +曠 +曦 +曩 +曰 +曲 +曳 +更 +曵 +曷 +書 +曹 +曺 +曻 +曼 +曽 +曾 +替 +最 +會 +朅 +月 +有 +朋 +服 +朔 +朕 +朖 +朗 +望 +朝 +期 +朦 +朧 +木 +未 +末 +本 +札 +朮 +朱 +朴 +朶 +朸 +机 +朽 +杆 +杈 +杉 +李 +杏 +材 +村 +杓 +杖 +杙 +杜 +杞 +束 +杠 +条 +杢 +杣 +杤 +来 +杭 +杮 +杯 +杰 +東 +杲 +杳 +杵 +杷 +杼 +松 +板 +枇 +枉 +枋 +枌 +析 +枕 +林 +枘 +枚 +果 +枝 +枠 +枡 +枢 +枯 +枲 +枳 +枴 +架 +枷 +枸 +枹 +枻 +柁 +柄 +柊 +柏 +某 +柑 +染 +柔 +柘 +柚 +柝 +柞 +柢 +柩 +柬 +柯 +柱 +柳 +柴 +柵 +査 +柾 +柿 +栂 +栃 +栄 +栓 +栖 +栗 +栞 +校 +栢 +栩 +株 +栫 +栱 +栲 +栴 +核 +根 +格 +栽 +栾 +桀 +桁 +桂 +桃 +桅 +框 +案 +桎 +桐 +桑 +桒 +桓 +桔 +桛 +桜 +桝 +桟 +档 +桧 +桴 +桶 +桿 +梁 +梃 +梅 +梏 +梓 +梔 +梗 +梛 +條 +梟 +梠 +梢 +梦 +梧 +梨 +梭 +梯 +械 +梱 +梲 +梳 +梵 +梶 +梼 +棃 +棄 +棉 +棊 +棋 +棍 +棐 +棒 +棕 +棖 +棗 +棘 +棚 +棟 +棠 +棡 +棣 +棧 +棭 +森 +棰 +棱 +棲 +棹 +棺 +椀 +椅 +椋 +植 +椎 +椏 +椒 +椙 +椚 +椛 +検 +椥 +椨 +椰 +椴 +椵 +椹 +椽 +椿 +楂 +楊 +楓 +楔 +楕 +楚 +楝 +楞 +楠 +楡 +楢 +楣 +楨 +楪 +楫 +業 +楮 +楯 +楳 +極 +楷 +楸 +楹 +楼 +楽 +榀 +概 +榊 +榎 +榑 +榔 +榕 +榛 +榜 +榧 +榮 +榲 +榴 +榻 +榾 +槁 +槃 +槇 +槊 +構 +槌 +槍 +槎 +槐 +槓 +様 +槙 +槧 +槨 +槫 +槲 +槵 +槹 +槻 +槽 +槿 +樂 +樅 +樊 +樋 +樒 +樓 +樗 +標 +樞 +樟 +模 +樣 +権 +横 +樫 +樵 +樸 +樹 +樺 +樽 +橄 +橅 +橇 +橈 +橋 +橘 +橙 +橛 +機 +橡 +橢 +橫 +橳 +橿 +檀 +檄 +檍 +檎 +檐 +檔 +檗 +檜 +檞 +檠 +檢 +檣 +檪 +檫 +檬 +檮 +檳 +檸 +檻 +櫂 +櫃 +櫑 +櫓 +櫚 +櫛 +櫞 +櫟 +櫨 +櫪 +櫬 +櫺 +櫻 +欄 +欅 +權 +欒 +欖 +欝 +欠 +次 +欣 +欧 +欲 +欵 +欷 +欹 +欺 +欽 +款 +歃 +歇 +歌 +歎 +歐 +歓 +歔 +歙 +歛 +歟 +歡 +止 +正 +此 +步 +武 +歩 +歪 +歯 +歳 +歴 +歷 +歸 +死 +歿 +殃 +殄 +殆 +殉 +殊 +残 +殖 +殘 +殞 +殤 +殪 +殯 +殱 +殲 +殳 +殴 +段 +殷 +殺 +殻 +殼 +殿 +毀 +毅 +毉 +毋 +母 +毎 +每 +毒 +毓 +比 +毖 +毗 +毘 +毛 +毟 +毫 +毬 +毮 +毯 +毳 +氈 +氏 +氐 +民 +氓 +气 +気 +氣 +水 +氵 +氷 +永 +氾 +汀 +汁 +求 +汎 +汐 +汕 +汗 +汙 +汚 +汜 +汝 +汞 +江 +池 +汪 +汰 +汲 +汳 +汴 +汶 +決 +汽 +汾 +沁 +沂 +沃 +沅 +沈 +沌 +沍 +沐 +沒 +沓 +沖 +沙 +沚 +沛 +没 +沢 +沪 +沫 +沮 +沱 +河 +沸 +油 +治 +沼 +沽 +沾 +沿 +況 +泄 +泉 +泊 +泌 +泓 +泔 +法 +泗 +泛 +泝 +泡 +波 +泣 +泥 +注 +泪 +泰 +泳 +洋 +洌 +洎 +洒 +洗 +洙 +洛 +洞 +洟 +津 +洩 +洪 +洫 +洮 +洱 +洲 +洵 +洶 +洸 +洹 +活 +洽 +派 +流 +浄 +浅 +浙 +浚 +浜 +浣 +浦 +浩 +浪 +浬 +浮 +浴 +海 +浸 +涂 +涅 +涇 +消 +涌 +涎 +涓 +涕 +涙 +涛 +涜 +涪 +涯 +液 +涵 +涸 +涼 +涿 +淀 +淄 +淅 +淆 +淇 +淋 +淑 +淘 +淙 +淚 +淛 +淝 +淞 +淡 +淤 +淦 +淨 +淪 +淫 +淮 +深 +淳 +淵 +混 +淹 +淺 +添 +淼 +清 +渇 +済 +渉 +渋 +渓 +渕 +渙 +渚 +減 +渝 +渟 +渠 +渡 +渣 +渤 +渥 +渦 +渧 +温 +渫 +測 +渭 +港 +游 +渺 +渾 +湃 +湄 +湊 +湍 +湎 +湑 +湖 +湘 +湛 +湣 +湧 +湫 +湮 +湯 +湲 +湾 +湿 +満 +溂 +溌 +源 +準 +溘 +溜 +溝 +溟 +溢 +溥 +溪 +溫 +溯 +溲 +溶 +溷 +溺 +滂 +滄 +滅 +滇 +滉 +滋 +滌 +滎 +滑 +滓 +滔 +滕 +滙 +滝 +滞 +滬 +滲 +滴 +滸 +滾 +滿 +漁 +漂 +漆 +漉 +漏 +漑 +漓 +演 +漕 +漠 +漢 +漣 +漪 +漫 +漬 +漱 +漲 +漳 +漸 +漾 +漿 +潁 +潅 +潑 +潔 +潘 +潙 +潜 +潞 +潟 +潤 +潦 +潭 +潮 +潯 +潰 +潴 +潸 +潺 +潼 +潾 +澀 +澁 +澂 +澄 +澆 +澈 +澎 +澗 +澠 +澡 +澣 +澤 +澪 +澱 +澳 +澶 +澹 +激 +濁 +濂 +濃 +濊 +濕 +濘 +濛 +濟 +濠 +濡 +濤 +濫 +濮 +濯 +濱 +濳 +濵 +濶 +濹 +濾 +瀆 +瀉 +瀋 +瀏 +瀑 +瀕 +瀚 +瀛 +瀝 +瀞 +瀟 +瀦 +瀧 +瀨 +瀬 +瀰 +瀾 +灌 +灑 +灘 +灝 +灣 +灤 +火 +灯 +灰 +灸 +灼 +災 +炉 +炊 +炎 +炒 +炕 +炙 +炫 +炬 +炭 +炮 +炯 +炳 +炷 +炸 +点 +為 +炻 +烈 +烏 +烔 +烙 +烝 +烟 +烬 +烱 +烹 +烽 +焉 +焔 +焙 +焚 +焜 +無 +焦 +焰 +然 +焼 +煆 +煇 +煉 +煊 +煌 +煎 +煕 +煖 +煙 +煜 +煞 +煠 +煤 +煥 +煦 +照 +煩 +煬 +煮 +煽 +熄 +熇 +熈 +熊 +熏 +熒 +熔 +熕 +熙 +熟 +熨 +熬 +熱 +熹 +熾 +燁 +燃 +燈 +燎 +燐 +燒 +燔 +燕 +燗 +營 +燠 +燥 +燦 +燧 +燬 +燭 +燮 +燵 +燹 +燻 +燼 +燾 +燿 +爆 +爐 +爛 +爨 +爪 +爬 +爭 +爰 +爲 +爵 +父 +爸 +爹 +爺 +爻 +爼 +爽 +爾 +牀 +牆 +片 +版 +牋 +牌 +牒 +牓 +牘 +牙 +牛 +牝 +牟 +牡 +牢 +牧 +物 +牯 +牲 +牴 +特 +牽 +牾 +犀 +犁 +犂 +犇 +犍 +犒 +犠 +犢 +犧 +犬 +犯 +状 +狀 +狂 +狃 +狄 +狆 +狎 +狐 +狒 +狗 +狙 +狛 +狡 +狢 +狩 +独 +狭 +狷 +狸 +狹 +狼 +狽 +猊 +猖 +猙 +猛 +猜 +猝 +猟 +猥 +猨 +猩 +猪 +猫 +献 +猯 +猴 +猶 +猷 +猹 +猾 +猿 +獄 +獅 +獏 +獒 +獗 +獣 +獦 +獨 +獪 +獰 +獲 +獵 +獸 +獺 +玄 +玅 +率 +玉 +王 +玕 +玖 +玘 +玟 +玩 +玫 +玲 +玳 +玷 +玻 +珀 +珂 +珈 +珉 +珊 +珍 +珎 +珞 +珠 +珥 +珩 +珪 +班 +珮 +現 +球 +琅 +理 +琉 +琊 +琛 +琢 +琥 +琦 +琨 +琪 +琫 +琬 +琮 +琰 +琲 +琳 +琴 +琵 +琶 +琺 +瑀 +瑁 +瑇 +瑕 +瑗 +瑙 +瑚 +瑛 +瑜 +瑞 +瑟 +瑠 +瑣 +瑤 +瑩 +瑪 +瑫 +瑯 +瑰 +瑳 +瑶 +瑾 +璃 +璇 +璈 +璉 +璋 +璐 +璘 +璜 +璞 +璟 +璣 +璧 +璫 +環 +璽 +璿 +瓊 +瓏 +瓔 +瓚 +瓜 +瓠 +瓢 +瓣 +瓦 +瓩 +瓮 +瓲 +瓶 +瓷 +甃 +甄 +甌 +甍 +甎 +甑 +甕 +甗 +甘 +甚 +甜 +生 +産 +甥 +甦 +用 +甪 +甫 +甬 +田 +由 +甲 +申 +男 +甸 +町 +画 +畊 +界 +畏 +畑 +畔 +留 +畚 +畜 +畝 +畠 +畢 +畤 +略 +畦 +畧 +番 +畫 +畭 +畯 +異 +畳 +畴 +當 +畷 +畸 +畿 +疆 +疇 +疊 +疋 +疎 +疏 +疑 +疔 +疚 +疝 +疣 +疥 +疫 +疱 +疲 +疳 +疵 +疸 +疹 +疼 +疽 +疾 +痂 +痃 +病 +症 +痍 +痎 +痒 +痔 +痕 +痘 +痙 +痛 +痞 +痢 +痣 +痤 +痩 +痰 +痲 +痳 +痴 +痺 +痼 +痾 +痿 +瘀 +瘁 +瘋 +瘍 +瘖 +瘙 +瘞 +瘠 +瘡 +瘢 +瘤 +瘦 +瘧 +瘭 +瘰 +瘳 +瘴 +瘻 +療 +癆 +癇 +癈 +癋 +癌 +癒 +癖 +癘 +癜 +癡 +癢 +癧 +癩 +癪 +癬 +癭 +癰 +癲 +癸 +発 +登 +發 +白 +百 +皃 +的 +皆 +皇 +皈 +皋 +皎 +皐 +皓 +皕 +皖 +皙 +皚 +皮 +皰 +皴 +皷 +皸 +皹 +皺 +皿 +盂 +盃 +盆 +盈 +盉 +益 +盒 +盔 +盖 +盗 +盛 +盜 +盞 +盟 +盡 +監 +盤 +盥 +盦 +盧 +盪 +目 +盱 +盲 +直 +相 +盻 +盼 +盾 +省 +眄 +眇 +眈 +眉 +看 +県 +眙 +眛 +眞 +真 +眠 +眥 +眦 +眩 +眶 +眷 +眸 +眺 +眼 +着 +睛 +睜 +睡 +睢 +督 +睥 +睦 +睨 +睫 +睹 +睺 +睾 +睿 +瞀 +瞋 +瞑 +瞞 +瞠 +瞥 +瞬 +瞭 +瞰 +瞳 +瞶 +瞻 +瞼 +瞽 +瞿 +矍 +矗 +矛 +矜 +矢 +矣 +知 +矧 +矩 +短 +矮 +矯 +石 +砂 +砌 +砒 +研 +砕 +砖 +砥 +砦 +砧 +砭 +砲 +破 +砺 +硅 +硏 +硝 +硨 +硫 +硬 +确 +硯 +硴 +硼 +碁 +碆 +碇 +碌 +碍 +碎 +碑 +碓 +碕 +碗 +碣 +碧 +碩 +碪 +確 +碾 +磁 +磊 +磋 +磌 +磐 +磔 +磚 +磧 +磨 +磬 +磯 +磲 +磴 +磽 +礁 +礎 +礑 +礒 +礙 +礦 +礪 +礫 +礬 +礮 +示 +礼 +社 +祀 +祁 +祅 +祆 +祇 +祈 +祉 +祐 +祓 +祕 +祖 +祗 +祚 +祛 +祝 +神 +祟 +祠 +祢 +祥 +票 +祭 +祷 +祺 +祿 +禀 +禁 +禄 +禅 +禊 +禍 +禎 +福 +禛 +禝 +禦 +禧 +禪 +禮 +禰 +禱 +禴 +禹 +禺 +禽 +禾 +禿 +秀 +私 +秉 +秋 +种 +科 +秒 +秕 +秘 +秞 +租 +秡 +秣 +秤 +秦 +秧 +秩 +称 +移 +稀 +稈 +程 +稍 +税 +稔 +稗 +稙 +稚 +稜 +稟 +稠 +種 +稱 +稲 +稷 +稹 +稻 +稼 +稽 +稿 +穀 +穂 +穆 +穉 +積 +穎 +穏 +穐 +穗 +穡 +穢 +穣 +穫 +穰 +穴 +穵 +究 +穹 +空 +穽 +穿 +突 +窃 +窄 +窈 +窒 +窓 +窕 +窖 +窗 +窘 +窟 +窠 +窩 +窪 +窬 +窮 +窯 +窰 +窶 +窺 +窿 +竃 +竄 +竅 +竇 +竈 +竊 +立 +竎 +站 +竜 +竝 +竟 +章 +竢 +竣 +童 +竦 +竪 +竫 +竭 +端 +競 +竸 +竹 +竺 +竿 +笄 +笈 +笊 +笋 +笏 +笑 +笘 +笙 +笛 +笞 +笠 +笥 +符 +笨 +第 +笮 +笵 +笹 +筅 +筆 +筈 +等 +筋 +筌 +筍 +筏 +筐 +筑 +筒 +答 +策 +筝 +筠 +筥 +筧 +筬 +筭 +筮 +筰 +筱 +筵 +筺 +筿 +箆 +箇 +箋 +箍 +箏 +箒 +箔 +箕 +算 +箙 +箚 +箜 +箝 +箞 +管 +箪 +箭 +箱 +箴 +箸 +節 +篁 +範 +篆 +篇 +築 +篋 +篌 +篏 +篙 +篝 +篠 +篤 +篥 +篦 +篩 +篭 +篳 +篶 +篷 +簀 +簁 +簃 +簇 +簋 +簍 +簑 +簒 +簓 +簔 +簗 +簞 +簟 +簠 +簡 +簣 +簧 +簪 +簫 +簳 +簶 +簷 +簸 +簽 +簾 +簿 +籀 +籃 +籌 +籍 +籏 +籐 +籔 +籖 +籙 +籟 +籠 +籤 +籬 +米 +籾 +粂 +粃 +粉 +粋 +粍 +粏 +粒 +粕 +粗 +粘 +粛 +粟 +粡 +粢 +粤 +粥 +粦 +粧 +粮 +粱 +粲 +粳 +粹 +粼 +粽 +精 +糀 +糂 +糅 +糊 +糒 +糕 +糖 +糜 +糝 +糞 +糟 +糠 +糢 +糧 +糯 +糲 +糴 +糶 +糸 +糺 +系 +糾 +紀 +紂 +約 +紅 +紆 +紇 +紈 +紊 +紋 +納 +紐 +紒 +純 +紗 +紘 +紙 +級 +紛 +紜 +素 +紡 +索 +紫 +紬 +紮 +累 +細 +紲 +紳 +紹 +紺 +絁 +終 +絃 +組 +絅 +絆 +経 +絎 +絏 +結 +絓 +絖 +絛 +絜 +絞 +絡 +絢 +絣 +給 +絨 +絮 +統 +絲 +絳 +絵 +絶 +絹 +絽 +綉 +綏 +經 +継 +続 +綛 +綜 +綟 +綠 +綢 +綦 +綫 +綬 +維 +綮 +綯 +綰 +綱 +網 +綴 +綵 +綸 +綺 +綻 +綽 +綾 +綿 +緂 +緇 +緊 +緋 +総 +緑 +緒 +緖 +緘 +線 +緜 +緝 +緞 +締 +緡 +緣 +編 +緩 +緬 +緯 +緲 +練 +緻 +縁 +縄 +縅 +縉 +縊 +縋 +縑 +縒 +縕 +縛 +縞 +縟 +縢 +縣 +縦 +縫 +縬 +縮 +縱 +縲 +縵 +縷 +縹 +縺 +縻 +總 +績 +繁 +繃 +繅 +繆 +繇 +繊 +繋 +繍 +織 +繕 +繙 +繚 +繝 +繞 +繡 +繧 +繩 +繪 +繫 +繭 +繰 +繹 +繻 +繼 +繽 +纂 +纈 +纉 +續 +纍 +纏 +纐 +纒 +纓 +纔 +纛 +纜 +缶 +缺 +罄 +罅 +罌 +罎 +罐 +罔 +罕 +罘 +罠 +罡 +罣 +罨 +罩 +罪 +罫 +置 +罰 +署 +罵 +罷 +罸 +罹 +羂 +羅 +羆 +羇 +羈 +羊 +羌 +美 +羚 +羞 +羣 +群 +羨 +義 +羮 +羯 +羲 +羸 +羹 +羽 +羿 +翁 +翅 +翆 +翊 +翌 +翎 +習 +翔 +翕 +翛 +翟 +翠 +翡 +翦 +翩 +翫 +翰 +翳 +翹 +翻 +翼 +耀 +老 +考 +耄 +者 +耆 +耋 +而 +耐 +耒 +耕 +耗 +耘 +耙 +耡 +耤 +耨 +耳 +耶 +耻 +耽 +耿 +聃 +聆 +聊 +聖 +聘 +聚 +聞 +聟 +聡 +聢 +聨 +聯 +聰 +聱 +聲 +聳 +聴 +聶 +職 +聽 +聾 +聿 +肄 +肅 +肆 +肇 +肉 +肋 +肌 +肓 +肖 +肘 +肚 +肛 +肝 +股 +肢 +肥 +肩 +肪 +肭 +肯 +肱 +育 +肴 +肺 +胃 +胄 +胆 +背 +胎 +胖 +胚 +胛 +胝 +胞 +胡 +胤 +胥 +胯 +胱 +胴 +胸 +胼 +能 +脂 +脅 +脆 +脇 +脈 +脉 +脊 +脘 +脚 +脛 +脞 +脣 +脩 +脯 +脱 +脳 +脹 +脾 +腆 +腊 +腋 +腎 +腐 +腑 +腓 +腔 +腕 +腟 +腥 +腦 +腫 +腮 +腰 +腱 +腴 +腸 +腹 +腺 +腿 +膀 +膂 +膃 +膅 +膈 +膊 +膏 +膓 +膕 +膚 +膜 +膝 +膠 +膣 +膨 +膩 +膰 +膳 +膵 +膸 +膺 +膻 +膽 +膾 +膿 +臀 +臂 +臆 +臈 +臉 +臍 +臏 +臑 +臓 +臘 +臙 +臚 +臟 +臠 +臣 +臥 +臧 +臨 +自 +臬 +臭 +至 +致 +臺 +臼 +臾 +舁 +舂 +舅 +與 +興 +舉 +舊 +舌 +舍 +舎 +舐 +舒 +舗 +舘 +舛 +舜 +舞 +舟 +舩 +航 +舫 +般 +舲 +舳 +舵 +舶 +舷 +舸 +船 +艀 +艇 +艘 +艙 +艚 +艜 +艟 +艣 +艤 +艦 +艨 +艪 +艫 +艮 +良 +艱 +色 +艶 +艷 +艸 +艾 +芋 +芍 +芎 +芒 +芙 +芝 +芟 +芥 +芦 +芨 +芩 +芬 +芭 +芯 +花 +芳 +芷 +芸 +芹 +芻 +芽 +芾 +芿 +苅 +苑 +苒 +苓 +苔 +苕 +苗 +苛 +苜 +苞 +苟 +苡 +苣 +若 +苦 +苧 +苫 +英 +苳 +苴 +苹 +苺 +苻 +茂 +范 +茄 +茅 +茆 +茉 +茎 +茗 +茘 +茜 +茣 +茨 +茫 +茯 +茱 +茲 +茴 +茵 +茶 +茸 +茹 +荀 +荃 +草 +荊 +荏 +荒 +荔 +荘 +荳 +荵 +荷 +荻 +荼 +莅 +莆 +莉 +莊 +莎 +莒 +莓 +莕 +莖 +莘 +莚 +莞 +莟 +莠 +莢 +莧 +莨 +莩 +莪 +莫 +莱 +莵 +莽 +菀 +菁 +菅 +菇 +菊 +菌 +菎 +菓 +菖 +菘 +菜 +菟 +菠 +菩 +菫 +華 +菰 +菱 +菲 +菴 +萃 +萄 +萇 +萊 +萌 +萍 +萎 +萓 +萠 +萢 +萩 +萪 +萬 +萱 +萵 +萸 +萼 +落 +葆 +葈 +葉 +葎 +著 +葛 +葡 +葢 +董 +葦 +葩 +葫 +葬 +葭 +葯 +葱 +葵 +葷 +葺 +蒂 +蒋 +蒐 +蒔 +蒙 +蒜 +蒟 +蒡 +蒯 +蒲 +蒸 +蒻 +蒼 +蒾 +蒿 +蓀 +蓁 +蓂 +蓄 +蓆 +蓉 +蓊 +蓋 +蓍 +蓐 +蓑 +蓖 +蓙 +蓚 +蓬 +蓮 +蓯 +蓴 +蓼 +蓿 +蔀 +蔑 +蔓 +蔔 +蔕 +蔗 +蔘 +蔚 +蔟 +蔡 +蔣 +蔦 +蔬 +蔭 +蔲 +蔵 +蔽 +蕁 +蕃 +蕈 +蕉 +蕊 +蕋 +蕎 +蕗 +蕙 +蕚 +蕣 +蕨 +蕩 +蕪 +蕭 +蕷 +蕾 +薀 +薄 +薇 +薈 +薊 +薏 +薐 +薑 +薔 +薗 +薙 +薛 +薜 +薟 +薤 +薦 +薨 +薩 +薪 +薫 +薬 +薭 +薮 +薯 +薹 +薺 +藁 +藉 +藍 +藏 +藐 +藕 +藜 +藝 +藤 +藥 +藦 +藩 +藪 +藷 +藹 +藺 +藻 +藿 +蘂 +蘄 +蘆 +蘇 +蘊 +蘋 +蘐 +蘑 +蘖 +蘗 +蘚 +蘞 +蘭 +蘯 +蘿 +虎 +虐 +虔 +處 +虗 +虚 +虜 +虞 +號 +虢 +虧 +虫 +虬 +虱 +虹 +虻 +蚊 +蚋 +蚓 +蚕 +蚣 +蚤 +蚩 +蚪 +蚫 +蚯 +蚰 +蛄 +蛆 +蛇 +蛉 +蛋 +蛍 +蛎 +蛔 +蛙 +蛛 +蛞 +蛟 +蛤 +蛩 +蛭 +蛮 +蛯 +蛸 +蛹 +蛻 +蛾 +蜀 +蜂 +蜃 +蜆 +蜈 +蜉 +蜊 +蜍 +蜑 +蜒 +蜓 +蜘 +蜚 +蜜 +蜥 +蜩 +蜱 +蜴 +蜷 +蜺 +蜻 +蜾 +蜿 +蝀 +蝃 +蝉 +蝋 +蝌 +蝎 +蝓 +蝕 +蝗 +蝙 +蝟 +蝠 +蝣 +蝦 +蝨 +蝪 +蝮 +蝯 +蝴 +蝶 +蝸 +蝿 +螂 +融 +螟 +螢 +螫 +螭 +螳 +螺 +螻 +螽 +蟀 +蟄 +蟇 +蟋 +蟎 +蟐 +蟒 +蟠 +蟥 +蟬 +蟯 +蟲 +蟷 +蟹 +蟻 +蟾 +蠃 +蠅 +蠍 +蠕 +蠖 +蠟 +蠡 +蠢 +蠣 +蠧 +蠱 +蠶 +蠻 +血 +衄 +衆 +行 +衍 +衒 +術 +街 +衙 +衛 +衝 +衞 +衡 +衢 +衣 +衤 +表 +衫 +衰 +衲 +衵 +衷 +衽 +衾 +衿 +袁 +袂 +袈 +袋 +袍 +袒 +袖 +袗 +袘 +袙 +袞 +袢 +袤 +袪 +被 +袮 +袰 +袱 +袴 +袵 +袷 +袿 +裁 +裂 +裃 +裄 +装 +裏 +裒 +裔 +裕 +裘 +裙 +裛 +補 +裝 +裟 +裡 +裨 +裰 +裱 +裲 +裳 +裴 +裵 +裸 +裼 +製 +裾 +褂 +褄 +複 +褊 +褌 +褐 +褒 +褓 +褘 +褙 +褚 +褥 +褪 +褫 +褲 +褶 +褸 +褻 +襁 +襄 +襖 +襞 +襟 +襠 +襤 +襦 +襲 +襴 +襷 +襾 +西 +要 +覃 +覆 +覇 +覈 +覊 +見 +規 +覓 +視 +覗 +覘 +覚 +覡 +覦 +覧 +覩 +親 +覬 +覯 +覲 +観 +覺 +覽 +覿 +觀 +角 +觔 +觚 +觜 +觝 +解 +触 +觴 +觸 +觿 +言 +訂 +訃 +計 +訊 +訌 +討 +訓 +託 +記 +訛 +訝 +訟 +訢 +訣 +訥 +訪 +設 +許 +訳 +訴 +訶 +診 +註 +証 +詁 +詆 +詈 +詐 +詒 +詔 +評 +詛 +詞 +詠 +詡 +詢 +詣 +試 +詩 +詫 +詬 +詭 +詮 +詰 +話 +該 +詳 +詵 +詹 +詼 +誂 +誄 +誅 +誇 +誉 +誌 +認 +誑 +誓 +誕 +誘 +語 +誠 +誡 +誣 +誤 +誥 +誦 +誨 +説 +読 +誰 +課 +誹 +誼 +誾 +調 +諂 +諄 +談 +請 +諌 +諍 +諏 +諒 +論 +諗 +諚 +諛 +諜 +諡 +諢 +諤 +諦 +諧 +諫 +諭 +諮 +諱 +諳 +諶 +諷 +諸 +諺 +諾 +謀 +謁 +謂 +謄 +謌 +謎 +謐 +謔 +謖 +謗 +謙 +謚 +講 +謝 +謟 +謠 +謡 +謦 +謨 +謫 +謬 +謳 +謹 +謾 +譃 +證 +譌 +譎 +譏 +譔 +識 +譙 +譚 +譜 +警 +譫 +譬 +譯 +議 +譲 +譴 +護 +譽 +讀 +讃 +變 +讌 +讎 +讐 +讒 +讓 +讖 +讙 +讚 +讜 +谷 +谺 +谿 +豁 +豆 +豈 +豉 +豊 +豌 +豎 +豐 +豕 +豚 +象 +豨 +豪 +豫 +豬 +豳 +豸 +豹 +豺 +豼 +貂 +貅 +貉 +貌 +貎 +貔 +貘 +貝 +貞 +負 +財 +貢 +貧 +貨 +販 +貪 +貫 +責 +貮 +貯 +貰 +貴 +貶 +買 +貸 +費 +貼 +貽 +貿 +賀 +賁 +賂 +賃 +賄 +資 +賈 +賊 +賍 +賎 +賑 +賓 +賚 +賛 +賜 +賞 +賠 +賡 +賢 +賣 +賤 +賦 +質 +賭 +賺 +購 +賽 +贄 +贅 +贇 +贈 +贊 +贋 +贍 +贏 +贐 +贓 +贔 +贖 +贛 +赤 +赦 +赧 +赫 +赭 +走 +赳 +赴 +起 +趁 +超 +越 +趙 +趣 +趨 +足 +趺 +趾 +跋 +跌 +跎 +跏 +跑 +跖 +跚 +跛 +距 +跟 +跡 +跣 +跨 +跪 +跫 +路 +跳 +践 +跼 +踈 +踉 +踊 +踏 +踐 +踝 +踞 +踠 +踪 +踰 +踵 +蹂 +蹄 +蹇 +蹈 +蹉 +蹊 +蹌 +蹐 +蹕 +蹙 +蹟 +蹠 +蹣 +蹤 +蹬 +蹲 +蹴 +蹶 +蹼 +躁 +躄 +躅 +躇 +躊 +躋 +躍 +躑 +躓 +躔 +躙 +躡 +躪 +身 +躬 +躯 +躰 +躱 +躶 +躾 +軀 +軈 +車 +軋 +軌 +軍 +軒 +軛 +軟 +転 +軫 +軸 +軺 +軻 +軼 +軽 +軾 +較 +載 +輊 +輌 +輒 +輓 +輔 +輕 +輗 +輛 +輜 +輝 +輞 +輦 +輩 +輪 +輯 +輳 +輸 +輻 +輾 +輿 +轂 +轄 +轅 +轆 +轉 +轍 +轎 +轔 +轗 +轜 +轟 +轡 +轢 +轤 +辛 +辜 +辞 +辟 +辣 +辦 +辧 +辨 +辭 +辮 +辯 +辰 +辱 +農 +辶 +辷 +辺 +辻 +込 +辿 +迂 +迄 +迅 +迎 +近 +返 +迚 +迢 +迦 +迩 +迪 +迫 +迭 +迯 +述 +迴 +迷 +迸 +迹 +迺 +追 +退 +送 +适 +逃 +逅 +逆 +逈 +逋 +逍 +透 +逐 +逑 +逓 +途 +逕 +逗 +這 +通 +逝 +逞 +速 +造 +逡 +逢 +連 +逮 +週 +進 +逵 +逸 +逹 +逼 +遁 +遂 +遅 +遇 +遉 +遊 +運 +遍 +過 +遏 +遐 +遑 +道 +達 +違 +遖 +遙 +遜 +遞 +遠 +遡 +遣 +遥 +適 +遭 +遮 +遯 +遲 +遵 +遶 +遷 +選 +遺 +遼 +遽 +避 +邀 +邁 +邂 +邃 +還 +邇 +邈 +邉 +邊 +邏 +邑 +邕 +邙 +邢 +那 +邦 +邨 +邪 +邯 +邱 +邳 +邵 +邶 +邸 +邾 +郁 +郈 +郊 +郎 +郗 +郝 +郞 +郡 +郢 +部 +郭 +郯 +郵 +郷 +都 +郿 +鄂 +鄒 +鄕 +鄘 +鄙 +鄧 +鄭 +鄯 +鄰 +鄲 +鄴 +酈 +酉 +酊 +酋 +酌 +配 +酎 +酒 +酔 +酖 +酘 +酛 +酡 +酢 +酣 +酤 +酥 +酩 +酪 +酬 +酲 +酵 +酷 +酸 +醂 +醇 +醉 +醋 +醍 +醐 +醒 +醗 +醜 +醢 +醤 +醪 +醫 +醬 +醱 +醴 +醵 +醸 +醺 +釀 +釁 +釆 +采 +釈 +釉 +釋 +里 +重 +野 +量 +釐 +金 +釗 +釘 +釜 +針 +釟 +釡 +釣 +釦 +釧 +釭 +釵 +釼 +鈍 +鈎 +鈑 +鈔 +鈕 +鈞 +鈴 +鈷 +鈸 +鈺 +鈿 +鉄 +鉅 +鉇 +鉈 +鉉 +鉋 +鉏 +鉗 +鉛 +鉞 +鉢 +鉤 +鉦 +鉧 +鉱 +鉾 +銀 +銃 +銅 +銈 +銍 +銑 +銓 +銕 +銖 +銘 +銙 +銚 +銛 +銜 +銭 +銷 +銹 +鋏 +鋒 +鋤 +鋧 +鋩 +鋪 +鋭 +鋲 +鋳 +鋸 +鋹 +鋺 +鋼 +錄 +錆 +錐 +錕 +錘 +錙 +錚 +錠 +錡 +錢 +錣 +錦 +錨 +錫 +錬 +錮 +錯 +録 +錵 +錺 +錻 +鍈 +鍋 +鍍 +鍑 +鍔 +鍛 +鍜 +鍬 +鍮 +鍵 +鍼 +鍾 +鎌 +鎔 +鎖 +鎗 +鎚 +鎛 +鎧 +鎬 +鎭 +鎮 +鎰 +鎹 +鏃 +鏈 +鏑 +鏖 +鏗 +鏘 +鏝 +鏞 +鏟 +鏡 +鏢 +鏤 +鏧 +鏨 +鏱 +鏻 +鏽 +鐃 +鐐 +鐓 +鐔 +鐗 +鐘 +鐙 +鐚 +鐡 +鐫 +鐵 +鐶 +鐸 +鐺 +鑁 +鑄 +鑑 +鑒 +鑓 +鑚 +鑛 +鑞 +鑠 +鑢 +鑫 +鑰 +鑵 +鑷 +鑼 +鑽 +鑾 +鑿 +長 +镹 +門 +閂 +閃 +閇 +閉 +閊 +開 +閎 +閏 +閑 +閒 +間 +閔 +閖 +閘 +閙 +関 +閣 +閤 +閥 +閦 +閧 +閨 +閩 +閭 +閲 +閹 +閻 +閼 +閽 +閾 +闇 +闊 +闌 +闍 +闐 +闔 +闕 +闖 +闘 +關 +闡 +闢 +闥 +阜 +阡 +阨 +阪 +阮 +阯 +防 +阳 +阻 +阿 +陀 +附 +陋 +陌 +降 +限 +陖 +陘 +陛 +陜 +陝 +陞 +陟 +院 +陣 +除 +陥 +陪 +陬 +陰 +陲 +陳 +陵 +陶 +陷 +陸 +険 +陽 +隂 +隄 +隅 +隆 +隈 +隊 +隋 +隍 +階 +随 +隔 +隕 +隗 +隘 +隙 +際 +障 +隠 +隣 +隧 +隨 +險 +隱 +隲 +隴 +隷 +隸 +隹 +隺 +隻 +隼 +雀 +雁 +雄 +雅 +集 +雇 +雉 +雋 +雌 +雍 +雎 +雑 +雒 +雖 +雙 +雛 +雜 +雝 +雞 +離 +難 +雨 +雩 +雪 +雫 +雯 +雰 +雲 +零 +雷 +雹 +電 +需 +霄 +霆 +震 +霊 +霍 +霏 +霑 +霓 +霖 +霙 +霜 +霞 +霧 +霰 +露 +霹 +霽 +靁 +靂 +靄 +靆 +靈 +靉 +靑 +青 +靖 +静 +靚 +靛 +靜 +非 +靠 +靡 +面 +靤 +靨 +革 +靫 +靭 +靱 +靳 +靴 +靹 +靺 +靼 +鞁 +鞄 +鞅 +鞆 +鞋 +鞍 +鞏 +鞘 +鞜 +鞠 +鞢 +鞣 +鞦 +鞨 +鞭 +鞮 +鞳 +鞴 +鞺 +韃 +韆 +韋 +韓 +韜 +韞 +韮 +音 +韴 +韵 +韶 +韻 +響 +頁 +頂 +頃 +項 +順 +須 +頊 +頌 +頎 +頏 +預 +頑 +頒 +頓 +頗 +領 +頚 +頞 +頡 +頣 +頤 +頫 +頬 +頭 +頰 +頴 +頷 +頸 +頻 +頼 +頽 +顆 +顋 +題 +額 +顎 +顏 +顓 +顔 +顕 +顗 +願 +顚 +顛 +類 +顥 +顧 +顫 +顬 +顯 +顰 +顱 +顳 +顴 +風 +颪 +颯 +颱 +颶 +颷 +颼 +飄 +飆 +飛 +飜 +食 +飡 +飢 +飩 +飫 +飭 +飮 +飯 +飰 +飲 +飴 +飼 +飽 +飾 +餃 +餅 +餉 +養 +餌 +餐 +餒 +餓 +餘 +餝 +餞 +餠 +餡 +餤 +館 +餬 +餮 +饂 +饅 +饉 +饋 +饌 +饐 +饑 +饒 +饕 +饗 +首 +馗 +馘 +香 +馞 +馥 +馨 +馬 +馭 +馮 +馳 +馴 +駁 +駄 +駅 +駆 +駈 +駐 +駑 +駒 +駕 +駘 +駛 +駝 +駟 +駢 +駭 +駮 +駱 +駸 +駻 +駿 +騁 +騅 +騎 +騏 +騒 +験 +騙 +騨 +騫 +騰 +騷 +騾 +驀 +驃 +驍 +驒 +驕 +驗 +驚 +驛 +驟 +驢 +驤 +驥 +驩 +驪 +骨 +骰 +骶 +骸 +骼 +髀 +髄 +髏 +髑 +髓 +體 +高 +髙 +髞 +髠 +髢 +髣 +髦 +髪 +髫 +髭 +髯 +髱 +髴 +髷 +髻 +鬆 +鬐 +鬘 +鬚 +鬟 +鬢 +鬣 +鬧 +鬨 +鬩 +鬪 +鬮 +鬱 +鬲 +鬻 +鬼 +魁 +魂 +魃 +魄 +魅 +魋 +魍 +魎 +魏 +魑 +魔 +魘 +魚 +魯 +魳 +魴 +魹 +鮃 +鮄 +鮎 +鮑 +鮒 +鮓 +鮟 +鮠 +鮧 +鮨 +鮪 +鮫 +鮭 +鮮 +鮴 +鮹 +鯆 +鯉 +鯊 +鯎 +鯒 +鯔 +鯖 +鯛 +鯡 +鯢 +鯣 +鯥 +鯨 +鯯 +鯰 +鯱 +鯵 +鰆 +鰈 +鰉 +鰊 +鰌 +鰍 +鰐 +鰒 +鰓 +鰕 +鰣 +鰤 +鰥 +鰭 +鰮 +鰯 +鰰 +鰱 +鰲 +鰹 +鰺 +鰻 +鱁 +鱇 +鱈 +鱉 +鱏 +鱒 +鱗 +鱚 +鱠 +鱧 +鱮 +鱲 +鱶 +鱷 +鱸 +鳥 +鳧 +鳩 +鳰 +鳳 +鳴 +鳶 +鴃 +鴇 +鴈 +鴉 +鴎 +鴒 +鴗 +鴛 +鴟 +鴣 +鴦 +鴨 +鴫 +鴬 +鴻 +鴾 +鴿 +鵄 +鵐 +鵑 +鵙 +鵜 +鵝 +鵞 +鵠 +鵡 +鵤 +鵬 +鵯 +鵲 +鵺 +鵼 +鵾 +鶉 +鶏 +鶚 +鶩 +鶫 +鶯 +鶲 +鶴 +鶸 +鶺 +鶿 +鷀 +鷁 +鷄 +鷓 +鷗 +鷙 +鷦 +鷧 +鷭 +鷯 +鷲 +鷸 +鷹 +鷺 +鷽 +鸕 +鸚 +鸛 +鸞 +鹵 +鹸 +鹹 +鹼 +鹽 +鹿 +麁 +麈 +麋 +麒 +麓 +麕 +麗 +麝 +麟 +麤 +麥 +麦 +麩 +麪 +麭 +麴 +麵 +麸 +麹 +麺 +麻 +麼 +麽 +麾 +麿 +黄 +黌 +黍 +黎 +黐 +黑 +黒 +黔 +默 +黙 +黛 +黜 +黝 +點 +黠 +黥 +黨 +黯 +黴 +黷 +黻 +黽 +鼇 +鼈 +鼎 +鼓 +鼕 +鼙 +鼠 +鼬 +鼯 +鼹 +鼻 +鼽 +鼾 +齊 +齋 +齎 +齒 +齕 +齟 +齡 +齢 +齣 +齦 +齧 +齪 +齬 +齲 +齶 +齷 +龍 +龐 +龔 +龕 +龗 +龜 +龝 +龠 +龢 +﨑 +﨟 +﹅ +﹆ +𢌞 +𣗄 +𥝱 +##レ +##ッ +##タ +##・ +##セ +##ラ +##シ +##エ +##N +##V +##I +##T +##O +##ル +##ズ +##バ +##a +##n +##s +##t +##i +##r +##ス +##ジ +##話 +##デ +##ー +##ヌ +##え +##る +##ン +##サ +##プ +##ポ +##ギ +##ハ +##メ +##モ +##リ +##ア +##ュ +##ミ +##u +##w +##l +##瀬 +##m +##b +##o +##フ +##S +##X +##9 +##6 +##5 +##0 +##3 +##e +##p +##勝 +##マ +##ド +##ャ +##ァ +##M +##E +##y +##d +##h +##ク +##R +##K +##k +##U +##A +##虫 +##ム +##況 +##c +##イ +##ビ +##ソ +##ヴ +##ォ +##ろ +##う +##g +##ピ +##ザ +##玖 +##ヤ +##コ +##ェ +##ト +##ィ +##ナ +##ニ +##拡 +##が +##っ +##1 +##介 +##兎 +##喜 +##ユ +##弐 +##ウ +##カ +##P +##テ +##き +##ぬ +##け +##ブ +##ワ +##ペ +##キ +##ツ +##ケ +##ヒ +##v +##ふ +##く +##張 +##z +##j +##ヂ +##ベ +##ち +##消 +##せ +##ボ +##L +##G +##ダ +##ゥ +##C +##行 +##耳 +##古 +##ガ +##ョ +##ロ +##2 +##で +##か +##し +##チ +##わ +##言 +##ヨ +##ネ +##Y +##F +##H +##グ +##永 +##パ +##B +##Z +##8 +##7 +##山 +##段 +##オ +##ノ +##ゴ +##ゲ +##D +##立 +##4 +##尾 +##当 +##て +##兄 +##ゾ +##れ +##論 +##傷 +##ヘ +##希 +##目 +##q +##簡 +##Q +##島 +##み +##ら +##仲 +##宗 +##根 +##歌 +##吾 +##ぎ +##取 +##f +##ど +##ま +##友 +##× +##合 +##い +##格 +##ゼ +##域 +##め +##禁 +##り +##д +##豆 +##色 +##鹽 +##吉 +##げ +##止 +##挟 +##す +##送 +##釈 +##つ +##氏 +##柄 +##緑 +##口 +##飛 +##ば +##九 +##上 +##じ +##ホ +##房 +##技 +##x +##土 +##θ +##作 +##さ +##ご +##こ +##流 +##淆 +##里 +##子 +##断 +##光 +##芳 +##腕 +##び +##と +##大 +##仕 +##駝 +##麿 +##辰 +##や +##留 +##身 +##声 +##指 +##庵 +##会 +##印 +##文 +##羊 +##深 +##彦 +##座 +##鑫 +##明 +##鶴 +##蛤 +##出 +##頭 +##/ +##' +##朗 +##王 +##之 +##助 +##秀 +##ず +##軸 +##長 +##щ +##序 +##λ +##δ +##α +##込 +##軽 +##酒 +##臘 +##朝 +##越 +##そ +##笑 +##返 +##風 +##お +##絹 +##遇 +##集 +##" +##ひ +##仁 +##造 +##川 +##抜 +##卸 +##野 +##達 +##. +##) +##} +##袖 +##も +##新 +##宅 +##巻 +##丞 +##晒 +##臣 +##む +##ヅ +##召 +##梁 +##ъ +##з +##引 +##袋 +##清 +##郎 +##兵 +##衛 +##谷 +##は +##航 +##あ +##州 +##( +##だ +##太 +##能 +##外 +##面 +##甚 +##〜 +##ん +##ν +##μ +##η +##年 +##実 +##岡 +##装 +##歩 +##ぶ +##旦 +##空 +##生 +##木 +##鋼 +##記 +##広 +##団 +##治 +##直 +##よ +##汁 +##廻 +##物 +##; +##に +##修 +##河 +##射 +##林 +##節 +##田 +##W +##塚 +##町 +##鳥 +##帰 +##粮 +##西 +##重 +##精 +##一 +##柳 +##雨 +##堤 +##掛 +##車 +##曲 +##京 +##陽 +##廠 +##報 +##髭 +##憑 +##平 +##台 +##奸 +##鑵 +##ヲ +##た +##切 +##脇 +##な +##爆 +##爪 +##回 +##以 +##都 +##美 +##笛 +##誨 +##和 +##ほ +##類 +##考 +##官 +##κ +##υ +##所 +##江 +##ぐ +##ρ +##σ +##看 +##睨 +##定 +##番 +##難 +##の +##用 +##六 +##体 +##世 +##ヶ +##崎 +##湊 +##ι +##入 +##的 +##潤 +##門 +##三 +##線 +##音 +##蹴 +##注 +##退 +##着 +##峠 +##蕎 +##麦 +##点 +##反 +##茗 +##ё +##昭 +##草 +##白 +##球 +##箱 +##次 +##利 +##逃 +##館 +##原 +##敷 +##乱 +##沈 +##程 +##斎 +##書 +##忠 +##依 +##乳 +##! +##- +##」 +##寄 +##殺 +##胤 +##代 +##筋 +##落 +##東 +##路 +##店 +##邦 +##仄 +##心 +##昌 +##許 +##福 +##打 +##ゅ +##液 +##娯 +##憲 +##針 +##刑 +##ぼ +##天 +##来 +##堂 +##寇 +##鴨 +##費 +##地 +##机 +##ω +##法 +##付 +##肉 +##本 +##ヮ +##々 +##皮 +##葺 +##茶 +##春 +##圧 +##撃 +##設 +##J +##磴 +##、 +##彤 +##是 +##万 +##尹 +##務 +##説 +##備 +##分 +##鳴 +##計 +##高 +##織 +##間 +##莪 +##彌 +##那 +##ิ +##信 +##観 +##票 +##蛎 +##市 +##減 +##使 +##鏡 +##亥 +##駅 +##哭 +##除 +##雲 +##ぃ +##教 +##寺 +##轍 +##毛 +##肘 +##南 +##雄 +##閣 +##示 +##種 +##寔 +##蜘 +##蛛 +##咽 +##橋 +##神 +##噺 +##科 +##鳳 +##湿 +##嶺 +##豪 +##英 +##焼 +##死 +##鈴 +##村 +##幸 +##街 +##版 +##弁 +##員 +##獣 +##韓 +##将 +##酸 +##捨 +##瞰 +##枝 +##倉 +##語 +##名 +##内 +##晶 +##岳 +##腐 +##加 +##孝 +##童 +##小 +##金 +##井 +##人 +##郷 +##賛 +##鰐 +##払 +##φ +##』 +##『 +##詰 +##烟 +##悪 +##章 +##諭 +##芸 +##膳 +##戻 +##緒 +##紙 +##旭 +##弾 +##開 +##津 +##淑 +##尊 +##手 +##四 +##杯 +##比 +##邇 +##輯 +##狸 +##殻 +##貨 +##願 +##中 +##礼 +##油 +##刻 +##支 +##訓 +##ゃ +##梅 +##● +##洗 +##客 +##談 +##包 +##令 +##茸 +##札 +##奴 +##替 +##鸞 +##氷 +##扉 +##魔 +##民 +##脂 +##与 +##経 +##督 +##禎 +##仙 +##者 +##ぜ +##壺 +##諸 +##米 +##伊 +##國 +##意 +##知 +##商 +##家 +##貝 +##灯 +##岩 +##τ +##膜 +##海 +##久 +##憐 +##阿 +##弥 +##牧 +##国 +##摩 +##半 +##保 +##術 +##例 +##毒 +##栄 +##池 +##嘗 +##食 +##絵 +##ね +##べ +##場 +##財 +##薬 +##成 +##鍾 +##羽 +##続 +##存 +##水 +##星 +##前 +##勤 +##見 +##我 +##鱗 +##籠 +##澤 +##命 +##療 +##菜 +##布 +##旗 +##ざ +##餅 +##力 +##+ +##影 +##琬 +##邊 +##居 +##骨 +##脳 +##気 +##鷹 +##別 +##欠 +##栗 +##羅 +##, +##→ +##[ +##律 +##玄 +##母 +##ぞ +##二 +##裂 +##歪 +##糸 +##弦 +##ぽ +##床 +##扇 +##渋 +##嬢 +##俊 +##辺 +##壁 +##沓 +##史 +##釧 +##植 +##賜 +##堀 +##祚 +##元 +##━ +##襟 +##筒 +##烏 +##弧 +##浦 +##粟 +##司 +##洲 +##滑 +##義 +##丈 +##夫 +##塾 +##汗 +##ε +##好 +##媧 +##残 +##狭 +##康 +##丸 +##躾 +##船 +##ぁ +##結 +##冀 +##埔 +##時 +##隆 +##下 +##Д +##焦 +##麻 +##折 +##Σ +##Λ +##Ω +##証 +##乃 +##糖 +##役 +##起 +##答 +##葉 +##局 +##ヽ +##] +##β +##肥 +##并 +##夏 +##茂 +##鎬 +##控 +##沢 +##沙 +##溟 +##選 +##遊 +##淵 +##連 +##述 +##違 +##鎮 +##月 +##殴 +##肝 +##校 +##龍 +##饅 +##純 +##敏 +##虐 +##彬 +##露 +##拳 +##左 +##桃 +##学 +##陰 +##拓 +##懇 +##屋 +##沌 +##頒 +##髪 +##良 +##則 +##責 +##飼 +##致 +##※ +##樹 +##耶 +##判 +##也 +##縁 +##更 +##儀 +##火 +##窓 +##工 +##甲 +##増 +##】 +##。 +##帆 +##稿 +##π +##γ +##角 +##院 +##公 +##男 +##認 +##炎 +##浜 +##求 +##禍 +##傅 +##換 +##陸 +##遣 +##占 +##売 +##伸 +##寵 +##郡 +##ぺ +##果 +##析 +##汶 +##熙 +##詳 +##苑 +##積 +##侠 +##蔵 +##条 +##城 +##按 +##妨 +##承 +##道 +##府 +##県 +##営 +##孜 +##泊 +##藏 +##鷲 +##ょ +##釜 +##裏 +##劇 +##渓 +##鼓 +##熊 +##竹 +##芥 +##式 +##歳 +##{ +##接 +##麼 +##第 +##彊 +##笠 +##片 +##敗 +##聞 +##産 +##隋 +##華 +##ゆ +##づ +##松 +##器 +##字 +##差 +##厚 +##穂 +##部 +##糧 +##掲 +##χ +##禄 +##季 +##図 +##鎖 +##日 +##給 +##宮 +##剤 +##賢 +##帝 +##桶 +##疹 +##向 +##佳 +##持 +##靡 +##無 +##浩 +##剣 +##繁 +##竜 +##損 +##快 +##覚 +##添 +##正 +##石 +##厳 +##塁 +##患 +##掻 +##鶏 +##酷 +##熱 +##昱 +##洋 +##茎 +##苞 +##継 +##議 +##斉 +##臭 +##矢 +##ξ +##暦 +##性 +##追 +##首 +##桜 +##運 +##謎 +##闘 +##裾 +##安 +##政 +##攻 +##拉 +##競 +##底 +##斌 +##鐘 +### +##沖 +##繭 +##緲 +##制 +##案 +##亀 +##碁 +##藻 +##貪 +##業 +##呂 +##蛆 +##姦 +##幅 +##環 +##型 +##品 +##蝉 +##揚 +##杓 +##想 +##纛 +##約 +##霊 +##慄 +##尽 +##苗 +##: +##主 +##奈 +##勢 +##漉 +##扱 +##紀 +##脱 +##篭 +##銃 +##杉 +##量 +##相 +##岱 +##灘 +##姫 +##模 +##網 +##錬 +##派 +##七 +##庶 +##女 +##姿 +##* +##称 +##味 +##往 +##基 +##破 +##随 +##賊 +##琴 +##絶 +##動 +##席 +##凪 +##貞 +##椅 +##甘 +##卵 +##寿 +##施 +##協 +##_ +##| +##紫 +##害 +##騎 +##花 +##去 +##? +##幇 +##機 +##状 +##垂 +##孫 +##参 +##譜 +##獲 +##帳 +##砥 +##鋒 +##染 +##抑 +##枚 +##泉 +##肌 +##眼 +##若 +##翻 +##叉 +##溝 +##舎 +##垣 +##坂 +##渡 +##多 +##± +##潺 +##価 +##漬 +##偏 +##五 +##א +##郊 +##件 +##桑 +##恥 +##勳 +##錦 +##疏 +##† +##蘂 +##任 +##弟 +##免 +##崙 +##放 +##孩 +##響 +##階 +##滝 +##恩 +##刊 +##区 +##質 +##右 +##竿 +##寧 +##へ +##転 +##防 +##核 +##善 +##飯 +##牛 +##湖 +##十 +##− +##硫 +##為 +##煮 +##麗 +##鍋 +##納 +##争 +##極 +##揮 +##園 +##盛 +##壊 +##伐 +##詩 +##只 +##潮 +##細 +##帖 +##粉 +##勲 +##繋 +##銀 +##攫 +##愚 +##束 +##訴 +##弱 +##哲 +##丘 +##來 +##詞 +##皇 +##途 +##復 +##甕 +##@ +##武 +##避 +##寛 +##板 +##湘 +##須 +##形 +##端 +##亭 +##徳 +##等 +##祖 +##楓 +##散 +##算 +##材 +##智 +##至 +##室 +##搗 +##変 +##祝 +##危 +##哉 +##志 +##磨 +##舟 +##顛 +##未 +##叩 +##息 +##解 +##構 +##圭 +##帶 +##惜 +##誉 +##横 +##\ +##由 +##貴 +##茅 +##祷 +##養 +##共 +##〆 +##菊 +##甫 +##煥 +##琳 +##提 +##筆 +##欷 +##畑 +##寥 +##暮 +##函 +##燥 +##「 +##壇 +##鍵 +##綬 +##要 +##八 +##戸 +##僧 +##改 +##管 +##雛 +##巡 +##録 +##ゑ +##餘 +##望 +##交 +##先 +##締 +##臥 +##葡 +##伝 +##超 +##欧 +##豊 +##郭 +##溜 +##受 +##睡 +##伯 +##補 +##通 +##働 +##廣 +##表 +##組 +##暁 +##児 +##姆 +##籍 +##短 +##両 +##労 +##溪 +##強 +##縞 +##匠 +##幡 +##淳 +##冷 +##港 +##恵 +##蹟 +##犯 +##輝 +##欲 +##満 +##秋 +##威 +##邪 +##蒲 +##方 +##罵 +##疆 +##吶 +##宿 +##演 +##被 +##塀 +##咩 +##坐 +##恕 +##辣 +##拂 +##護 +##吽 +##譲 +##瑠 +##蝕 +##融 +##站 +##槍 +##茹 +##数 +##皋 +##群 +##権 +##愛 +##速 +##藩 +##毅 +##諏 +##訪 +##盧 +##親 +##拝 +##聴 +##事 +##興 +##隊 +##徹 +##‘ +##詣 +##荷 +##梨 +##雉 +##戌 +##側 +##圏 +##博 +##巴 +##蟠 +##ゝ +##洪 +##艦 +##憶 +##椎 +##様 +##齢 +##嶋 +##桂 +##櫃 +##< +##憎 +##度 +##^ +##變 +##兒 +##守 +##央 +##廟 +##然 +##肚 +##頼 +##克 +##■ +##雪 +##鰭 +##雅 +##履 +##云 +##割 +##資 +##囚 +##催 +##軍 +##封 +##玉 +##崩 +##誌 +##削 +##豚 +##塩 +##殿 +##討 +##専 +##挙 +##及 +##告 +##佐 +##仮 +##父 +##摂 +##震 +##筏 +##胆 +##降 +##拠 +##闊 +##近 +##陀 +##獄 +##埠 +##丹 +##買 +##亮 +##製 +##老 +##領 +##烙 +##ヱ +##枉 +##鰹 +##真 +##刀 +##巣 +##鞋 +##刷 +##洛 +##伍 +##綾 +##淋 +##跡 +##呵 +##俣 +##翼 +##医 +##ぱ +##周 +##循 +##躬 +##没 +##失 +##発 +##盤 +##固 +##銭 +##蛙 +##澄 +##忍 +##飴 +##ლ +##鱈 +##嘆 +##径 +##軟 +##絞 +##璃 +##服 +##崇 +##禅 +##香 +##滓 +##顔 +##隣 +##森 +##徒 +##読 +##庭 +##躓 +##宣 +##荒 +##侯 +##鉄 +##陵 +##汀 +##鴎 +##輪 +##済 +##尺 +##襲 +##講 +##兼 +##踏 +##浄 +##馬 +##登 +##陣 +##後 +##皐 +##足 +##砲 +##鹿 +##灸 +##脈 +##跳 +##魚 +##虎 +##便 +##建 +##唇 +##魂 +##君 +##腰 +##戒 +##胎 +##醒 +##夷 +##蘇 +##映 +##顕 +##恋 +##唆 +##却 +##覧 +##叡 +##濠 +##誤 +##可 +##化 +##題 +##燕 +##嗚 +##巳 +##有 +##ヰ +##祭 +##慧 +##辱 +##弘 +##癌 +##活 +##仏 +##編 +##視 +##鑑 +##爛 +##薪 +##請 +##象 +##含 +##德 +##千 +##漢 +##列 +##莱 +##典 +##敦 +##附 +##疑 +##ㇲ +##系 +##遺 +##丁 +##拭 +##棚 +##押 +##候 +##踊 +##負 +##將 +##歯 +##感 +##痒 +##彝 +##舌 +##宏 +##寸 +##蛇 +##慢 +##繕 +##戍 +##烈 +##莉 +##箋 +##ぇ +##撤 +##萬 +##孔 +##碕 +##汐 +##磁 +##浅 +##漁 +##楽 +##離 +##蔭 +##累 +##士 +##ぷ +##騒 +##曇 +##繰 +##售 +##摺 +##洙 +##岬 +##慶 +##僂 +##帽 +##粘 +##惚 +##霆 +##維 +##埃 +##突 +##芽 +##彫 +##碑 +##衣 +##還 +##鵞 +##` +##狀 +##瓜 +##悟 +##脚 +##調 +##誼 +##故 +##愁 +##宜 +##層 +##戦 +##輔 +##閩 +##瓦 +##態 +##斡 +##縫 +##奔 +##熬 +##蝗 +##姓 +##讃 +##惣 +##妄 +##窯 +##柴 +##駒 +##項 +##帯 +##○ +##温 +##股 +##延 +##譚 +##當 +##蒼 +##源 +##埒 +##曽 +##侑 +##如 +##柱 +##税 +##料 +##像 +##綴 +##裡 +##冲 +##慨 +##百 +##展 +##囲 +##喝 +##懋 +##顧 +##丰 +##幌 +##賃 +##吐 +##画 +##仇 +##狂 +##巌 +##紗 +##投 +##哈 +##婆 +##岐 +##理 +##境 +##額 +##= +##ぴ +##覆 +##詠 +##珞 +##病 +##位 +##念 +##呼 +##待 +##婚 +##妻 +##ぢ +##菓 +##涙 +##頂 +##宝 +##萃 +##貸 +##標 +##溥 +##黒 +##賀 +##倒 +##慈 +##轄 +##情 +##粤 +##沿 +##岸 +##嚢 +##矩 +##処 +##恒 +##箕 +##犬 +##借 +##奏 +##濃 +##珠 +##戎 +##臺 +##坤 +##収 +##誣 +##珍 +##隠 +##災 +##築 +##炉 +##溺 +##髷 +##進 +##鈸 +##艶 +##陶 +##剥 +##賞 +##紐 +##排 +##住 +##轉 +##号 +##署 +##夕 +##坊 +##翅 +##柯 +##富 +##絨 +##崗 +##祐 +##栩 +##塞 +##窺 +##“ +##” +##曾 +##血 +##潰 +##社 +##寶 +##喰 +##蘭 +##蝶 +##株 +##毘 +##賣 +##浸 +##描 +##灰 +##壮 +##匿 +##予 +##電 +##俗 +##抗 +##自 +##郵 +##欽 +##円 +##尚 +##烱 +##婦 +##究 +##対 +##籟 +##妃 +##眉 +##波 +##鉦 +##鼠 +##配 +##塡 +##萊 +##概 +##優 +##鬘 +##婢 +##鶯 +##棹 +##楼 +##率 +##涌 +##遷 +##最 +##頸 +##戯 +##撫 +##妹 +##鉢 +##遭 +##棒 +##价 +##撥 +##》 +##審 +##煙 +##逐 +##農 +##晴 +##篇 +##輩 +##唄 +##槽 +##忌 +##槻 +##又 +##舞 +##伎 +##歴 +##峯 +##同 +##貢 +##鰍 +##撒 +##迫 +##玩 +##藤 +##粒 +##聊 +##璋 +##冠 +##卿 +##斐 +##宴 +##己 +##際 +##党 +##而 +##鼻 +##週 +##鬼 +##熟 +##乾 +##墨 +##鬱 +##終 +##疔 +##團 +##邑 +##識 +##燭 +##裕 +##洞 +##穴 +##鮫 +##屈 +##捻 +##Δ +##塵 +##聖 +##筵 +##駆 +##牟 +##遅 +##伽 +##堅 +##規 +##庁 +##豸 +##> +##景 +##蓋 +##衫 +##問 +##得 +##隅 +##痢 +##宋 +##罪 +##鐸 +##鍮 +##軌 +##體 +##幀 +##悲 +##絲 +##鵲 +##琉 +##壑 +##申 +##稜 +##沼 +##挫 +##祀 +##躍 +##筑 +##充 +##縄 +##饌 +##屏 +##惶 +##耀 +##鞘 +##魯 +##駕 +##菌 +##杜 +##鍍 +##酢 +##匙 +##過 +##蛟 +##阪 +##劣 +##杭 +##瘤 +##栓 +##刈 +##溢 +##串 +##思 +##艮 +##才 +##稔 +##浚 +##瑣 +##翔 +##軒 +##彩 +##貂 +##乎 +##埜 +##椿 +##夜 +##現 +##學 +##北 +##潭 +##董 +##礙 +##霜 +##咋 +##娘 +##棲 +##棣 +##嵐 +##閉 +##畫 +##矛 +##阳 +##膝 +##亦 +##旨 +##狩 +##託 +##鑒 +##界 +##濡 +##紅 +##Ο +##順 +##謙 +##廬 +##綱 +##炭 +##瑩 +##彧 +##紋 +##擬 +##琰 +##叙 +##腹 +##鐙 +##賦 +##應 +##瑀 +##硯 +##燃 +##彪 +##族 +##句 +##灼 +##迪 +##唱 +##瑞 +##沸 +##革 +##賓 +##芝 +##因 +##置 +##卒 +##初 +##趣 +##僔 +##荘 +##芋 +##肺 +##榻 +##効 +##无 +##褒 +##銅 +##〉 +##÷ +##銘 +##吻 +##冊 +##振 +##$ +##啼 +##鋸 +##辭 +##倪 +##碧 +##並 +##輸 +##牌 +##斤 +##蝋 +##煤 +##早 +##容 +##娥 +##襷 +##租 +##峰 +##障 +##爵 +##揃 +##枕 +##徙 +##献 +##易 +##症 +##濱 +##伏 +##涼 +##· +##∇ +##龜 +##梓 +##坪 +##祺 +##毀 +##斑 +##瓶 +##該 +##糠 +##韻 +##括 +##常 +##勇 +##簫 +##訳 +##堰 +##寮 +##吸 +##験 +##練 +##泰 +##燾 +##胡 +##櫓 +##塗 +##透 +##薫 +##勒 +##干 +##鯛 +##載 +##煎 +##佛 +##弓 +##衆 +##姉 +##尖 +##掘 +##崖 +##浪 +##綰 +##楨 +##苦 +##貌 +##條 +##砕 +##朱 +##萍 +##暴 +##亡 +##届 +##粋 +##喙 +##関 +##籤 +##泛 +##熈 +##腥 +##慕 +##杖 +##腑 +##蒂 +##猨 +##椥 +##祥 +##丑 +##縮 +##貫 +##蜜 +##羌 +##昴 +##≧ +##≦ +##躙 +##恢 +##姜 +##冑 +##奎 +##謡 +##拾 +##移 +##畝 +##泥 +##走 +##猫 +##腸 +##芯 +##遠 +##悩 +##尻 +##隔 +##謬 +##独 +##暑 +##策 +##柿 +##撮 +##釘 +##急 +##簞 +##御 +##雷 +##具 +##範 +##鬟 +##羮 +##兜 +##捕 +##猿 +##腎 +##懷 +##莫 +##祟 +##睦 +##敬 +##粛 +##蟋 +##完 +##暈 +##〇 +##孤 +##宇 +##芬 +##弊 +##衷 +##舜 +##覲 +##販 +##嫁 +##亜 +##稱 +##撰 +##堕 +##著 +##従 +##紳 +##吏 +##否 +##侵 +##剌 +##誓 +##健 +##逸 +##爾 +##臂 +##痘 +##滴 +##決 +##璽 +##夢 +##青 +##癖 +##朶 +##娜 +##圃 +##紇 +##粕 +##異 +##赤 +##僑 +##懐 +##庸 +##頃 +##値 +##♪ +##涇 +##胃 +##纂 +##□ +##竄 +##賚 +##尼 +##鉞 +##桁 +##‖ +##腺 +##榮 +##∞ +##妓 +##昼 +##釣 +##秘 +##喬 +##什 +##巖 +##私 +##° +##簀 +##儲 +##衞 +##密 +##垢 +##豹 +##焙 +##盟 +##据 +##迎 +##仔 +##牘 +##益 +##滅 +##拒 +##冨 +##旬 +##姑 +##胞 +##彰 +##鏝 +##擁 +##淛 +##距 +##涯 +##憂 +##湯 +##統 +##余 +##葛 +##幕 +##黄 +##怖 +##盗 +##坡 +##嘉 +##慮 +##苛 +##允 +##珈 +##爬 +##陥 +##壱 +##寒 +##掠 +##屑 +##剃 +##筠 +##盃 +##期 +##證 +##濁 +##葵 +##墓 +##導 +##其 +##趙 +##尉 +##鵡 +##秤 +##據 +##綏 +##滔 +##倍 +##訛 +##了 +##吹 +##于 +##総 +##奇 +##驗 +##賈 +##泣 +##鯨 +##抄 +##隙 +##唯 +##ゞ +##鉾 +##糞 +##纏 +##低 +##聯 +##各 +##汰 +##嵜 +##痛 +##貿 +##庫 +##在 +##蒙 +##寨 +##朋 +##潜 +##肆 +##棋 +##賽 +##乗 +##診 +##蕉 +##探 +##邸 +##泡 +##閑 +##躰 +##廷 +##蕃 +##蔑 +##琛 +##践 +##師 +##哥 +##毬 +##遍 +##檬 +##凡 +##抵 +##ÿ +##胝 +##鰻 +##默 +##漠 +##廊 +##照 +##且 +##挽 +##誕 +##虬 +##璟 +##渦 +##圍 +##綿 +##級 +##楚 +##汲 +##卉 +##漆 +##牙 +##奪 +##特 +##祓 +##摘 +##枠 +##挑 +##咲 +##卯 +##侍 +##胱 +##鮴 +##阻 +##肴 +##寂 +##庚 +##舉 +##盈 +##瑟 +##旺 +##畳 +##不 +##亞 +##胥 +##静 +##胴 +##試 +##濫 +##⌒ +##魅 +##券 +##篠 +##瑚 +##倫 +##薯 +##祠 +##斗 +##崑 +##飾 +##誅 +##末 +##辞 +##触 +##仰 +##巽 +##嗣 +##埋 +##頓 +##鶉 +##偵 +##蹙 +##準 +##少 +##蟹 +##塔 +##舩 +##叢 +##猛 +##鮭 +##濟 +##狄 +##察 +##羯 +##孚 +##蝨 +##蕾 +##藍 +##叫 +##唾 +##適 +##択 +##鳩 +##肩 +##猜 +##脩 +##輓 +##坑 +##飲 +##妬 +##般 +##褻 +##晦 +##淫 +##礬 +##觀 +##諦 +##壌 +##捏 +##醴 +##讐 +##於 +##企 +##怨 +##准 +##鍛 +##冶 +##孽 +##顎 +##翰 +##惰 +##潔 +##頬 +##橇 +##職 +##需 +##傳 +##珂 +##惑 +##搦 +##黍 +##餐 +##揄 +##幽 +##歎 +##痕 +##盲 +##價 +##逢 +##渺 +##賎 +##午 +##蘚 +##休 +##旅 +##揖 +##迅 +##廼 +##漏 +##趾 +##升 +##応 +##蜂 +##慣 +##敵 +##省 +##艇 +##蜉 +##葬 +##梗 +##箇 +##矣 +##腿 +##磐 +##黛 +##熔 +##双 +##蓉 +##磊 +##樋 +##焰 +##萱 +##似 +##惨 +##彗 +##庇 +##凌 +##背 +##悴 +##徽 +##飽 +##庄 +##蹠 +##貯 +##酪 +##箸 +##鋤 +##秣 +##採 +##蟲 +##〔 +##┐ +##訊 +##匡 +##麺 +##穏 +##踪 +##捌 +##邃 +##慰 +##韆 +##袒 +##△ +##嚴 +##讀 +##鹹 +##禹 +##錠 +##【 +##育 +##% +##を +##素 +##蒸 +##播 +##搖 +##躯 +##諫 +##袴 +##穎 +##諤 +##衰 +##捺 +##鮑 +##畜 +##衡 +##腫 +##欄 +##宰 +##緩 +##吞 +##兩 +##礪 +##馴 +##帛 +##吟 +##幣 +##喫 +##聲 +##兪 +##穆 +##葆 +##舵 +##黙 +##橘 +##暢 +##塑 +##椰 +##鍬 +##略 +##梶 +##銛 +##昇 +##弯 +##錫 +##媛 +##檣 +##呑 +##呀 +##駄 +##監 +##穀 +##琅 +##韋 +##叱 +##虚 +##醬 +##窪 +##隧 +##箪 +##渠 +##鄂 +##玻 +##柔 +##囃 +##攬 +##隨 +##佩 +##涸 +##虱 +##砂 +##斯 +##諌 +##褐 +##測 +##璿 +##全 +##斬 +##栖 +##虔 +##曳 +##辛 +##枯 +##卓 +##Π +##櫛 +##炙 +##傑 +##蓮 +##鴉 +##棍 +##躇 +##册 +##篌 +##凜 +##勅 +##棘 +##謀 +##債 +##蚕 +##槌 +##熏 +##ぅ +##評 +##汜 +##蕨 +##瑪 +##霞 +##筮 +##裘 +##塘 +##弼 +##權 +##習 +##桓 +##澠 +##茄 +##蕩 +##彎 +##辻 +##冕 +##狛 +##眠 +##縦 +##匱 +##鱒 +##燵 +##顫 +##箔 +##爲 +##蓼 +##励 +##薨 +##椒 +##砧 +##渕 +##遂 +##藪 +##粧 +##研 +##蛄 +##浮 +##奮 +##翁 +##就 +##桟 +##酉 +##餌 +##蹇 +##縛 +##限 +##實 +##闍 +##騙 +##凶 +##謨 +##觚 +##俵 +##戚 +##捜 +##秒 +##睫 +##尿 +##牢 +##臓 +##〵 +##ゐ +##酌 +##鋏 +##既 +##刺 +##檜 +##哆 +##唎 +##篤 +##簾 +##惠 +##募 +##狗 +##祢 +##始 +##曹 +##癪 +##罰 +##殖 +##佑 +##李 +##唐 +##丕 +##雀 +##峪 +##娠 +##嫌 +##懸 +##雞 +##琪 +##瀾 +##尋 +##詁 +##緻 +##廈 +##牲 +##岑 +##~ +##猶 +##膏 +##翠 +##焜 +##糊 +##恨 +##朔 +##閔 +##寞 +##悍 +##峡 +##斃 +##菅 +##﨟 +##屎 +##凄 +##鄰 +##鮎 +##秩 +##非 +##厭 +##遵 +##妙 +##靖 +##鮮 +##樂 +##醸 +##皿 +##會 +##聚 +##舶 +##此 +##箒 +##梛 +##冥 +##沱 +##謝 +##★ +##▼ +##〓 +##裁 +##砦 +##湛 +##燮 +##瀆 +##蒜 +##∠ +##聳 +##埼 +##洟 +##經 +##弗 +##他 +##写 +##擦 +##旻 +##猟 +##泳 +##颪 +##凍 +##稼 +##紹 +##堯 +##笏 +##架 +##薄 +##毎 +##嗜 +##掌 +##竈 +##甜 +##愴 +##赫 +##薹 +##汪 +##覇 +##喪 +##塙 +##絣 +##倶 +##紛 +##伴 +##刃 +##桧 +##痰 +##竦 +##啓 +##喩 +##芦 +##豬 +##杏 +##拇 +##俘 +##后 +##豫 +##怠 +##坎 +##征 +##誾 +##混 +##劉 +##疾 +##輦 +##涂 +##鐵 +##鼬 +##昔 +##凝 +##紡 +##措 +##鰌 +##籏 +##到 +##墾 +##听 +##裳 +##濯 +##髄 +##酔 +##忘 +##漫 +##浴 +##攣 +##鴻 +##罫 +##諾 +##宕 +##邨 +##潟 +##痣 +##喉 +##淄 +##俐 +##贅 +##籌 +##媼 +##寝 +##鑿 +##游 +##– +##杵 +##戴 +##雜 +##淡 +##裸 +##對 +##凋 +##柏 +##擇 +##雑 +##膠 +##衝 +##整 +##誇 +##騰 +##絖 +##涎 +##痤 +##縷 +##叔 +##撓 +##彼 +##鄙 +##磯 +##婁 +##鉱 +##恭 +##噛 +##Щ +##嬰 +##晩 +##課 +##ζ +##礫 +##圳 +##蝣 +##簋 +##挺 +##弩 +##雍 +##苔 +##坦 +##鯰 +##☆ +##逆 +##薦 +##窃 +##啞 +##晃 +##蒡 +##淙 +##醍 +##醐 +##嘎 +##駁 +##勿 +##阡 +##焚 +##撲 +##靳 +##披 +##埓 +##顯 +##乙 +##吊 +##剛 +##盆 +##朽 +##杰 +##蛉 +##単 +##嘴 +##鎧 +##諱 +##葦 +##嬪 +##峻 +##秦 +##碩 +##賤 +##培 +##刕 +##汚 +##停 +##綢 +##宸 +##峨 +##謂 +##托 +##緋 +##属 +##戩 +##▲ +##麵 +##籃 +##隈 +##皓 +##稲 +##斜 +##羲 +##幹 +##墳 +##鞍 +##厩 +##葱 +##遥 +##帙 +##蓄 +##瑤 +##鷺 +##猊 +##繪 +##祇 +##綺 +##廓 +##框 +##奨 +##畯 +##拙 +##膨 +##咄 +##怡 +##燈 +##劫 +##操 +##糲 +##迷 +##玲 +##霧 +##靈 +##狼 +##鍼 +##肪 +##朴 +##紮 +##蕙 +##皖 +##咳 +##焔 +##圓 +##怒 +##頌 +##訶 +##缺 +##佞 +##箏 +##謁 +##嫡 +##鵬 +##韜 +##功 +##傘 +##奥 +##併 +##贛 +##艾 +##檗 +##畤 +##這 +##奚 +##滞 +##必 +##駐 +##個 +##蹄 +##檀 +##揺 +##恐 +##蓬 +##廉 +##薔 +##薇 +##ヵ +##醤 +##頽 +##迦 +##﨑 +##旋 +##笵 +##碓 +##緣 +##炒 +##勘 +##艫 +##廃 +##徴 +##痺 +##疫 +##拗 +##棉 +##刹 +##供 +##欣 +##襄 +##宍 +##鮨 +##樵 +##奉 +##倩 +##撼 +##酛 +##墟 +##縣 +##褪 +##釉 +##瀉 +##蕊 +##僊 +##幾 +##瀛 +##卑 +##⤴ +##碎 +##堪 +##笙 +##瞳 +##亂 +##槎 +##湾 +##曜 +##渤 +##槨 +##褄 +##抱 +##俳 +##丼 +##壷 +##∅ +##狙 +##脾 +##厄 +##套 +##嶠 +##梦 +##儒 +##誦 +##傭 +##蜓 +##◇ +##壽 +##罷 +##陌 +##汝 +##援 +##冬 +##硝 +##迹 +##萎 +##鯖 +##襖 +##紘 +##袞 +##瀧 +##伶 +##廳 +##屯 +##蛾 +##邕 +##抹 +##咎 +##憤 +##綽 +##亟 +##鵠 +##梟 +##鎔 +##蝦 +##弔 +##靜 +##娩 +##険 +##匪 +##享 +##拌 +##茫 +##奭 +##步 +##澳 +##麹 +##凛 +##吼 +##炮 +##礒 +##杼 +##湍 +##菫 +##楊 +##墅 +##柵 +##嗇 +##榜 +##藥 +##犠 +##垠 +##瑜 +##琢 +##符 +##確 +##紊 +##創 +##傾 +##絡 +##嶽 +##斥 +##脆 +##與 +##傍 +##⇒ +##厓 +##倹 +##冰 +##蛮 +##桐 +##萌 +##錯 +##碗 +##疱 +##恃 +##麒 +##禰 +##仞 +##谿 +##噲 +##薗 +##副 +##萩 +##輿 +##繹 +##齊 +##忽 +##椀 +##瀝 +##鏈 +##舘 +##妣 +##噴 +##⤵ +##検 +##績 +##釵 +##蔬 +##畔 +##謹 +##袍 +##吠 +##嵌 +##戮 +##贏 +##做 +##戰 +##歓 +##誠 +##驒 +##焉 +##懿 +##宵 +##賑 +##棄 +##袱 +##蟻 +##ヷ +##戟 +##礁 +##餓 +##晋 +##棺 +##簶 +##鈔 +##窟 +##臼 +##瘡 +##麟 +##譙 +##漱 +##煩 +##訣 +##摯 +##瘍 +##紬 +##慎 +##煊 +##翎 +##辦 +##歸 +##莒 +##呆 +##黎 +##躑 +##躅 +##零 +##瞼 +##棟 +##舷 +##曰 +##禀 +##′ +##薙 +##塰 +##楯 +##狐 +##鰲 +##薩 +##臨 +##幄 +##纓 +##邵 +##鬢 +##毯 +##貧 +##紺 +##苓 +##辨 +##鈍 +##堆 +##↓ +##諛 +##慾 +##尭 +##萢 +##螺 +##’ +##驚 +##鏃 +##陳 +##餡 +##鵜 +##怪 +##雁 +##〈 +##麝 +##緬 +##訟 +##蠟 +##眞 +##鉤 +##悶 +##楢 +##輛 +##妖 +##悌 +##偃 +##缶 +##剖 +##劒 +##憚 +##鞭 +##杞 +##再 +##菲 +##杢 +##〳 +##暉 +##彡 +##轅 +##燻 +##犀 +##芹 +##欅 +##炳 +##腔 +##隹 +##魋 +##畷 +##預 +##蛋 +##聡 +##倭 +##鈞 +##瑳 +##梳 +##罕 +##├ +##霑 +##蝙 +##款 +##葭 +##鞆 +##委 +##雙 +##鼎 +##澗 +##屠 +##註 +##啄 +##鉈 +##脞 +##脹 +##脛 +##癒 +##禿 +##査 +##耕 +##逝 +##巍 +##愕 +##勉 +##蔓 +##肖 +##均 +##幢 +##胸 +##謌 +##窖 +##魃 +##巧 +##薐 +##莞 +##萄 +##匯 +##愈 +##乞 +##頡 +##陲 +##齡 +##畠 +##悦 +##昧 +##暗 +##蟇 +##翩 +##貽 +##疎 +##梏 +##痔 +##宛 +##巾 +##瞑 +##遁 +##寅 +##挿 +##髏 +##索 +##懲 +##鴿 +##幗 +##¥ +##睛 +##旧 +##熕 +##恚 +##疽 +##皴 +##劭 +##薮 +##漕 +##凉 +##幼 +##豉 +##哀 +##今 +##癸 +##錐 +##髻 +##弖 +##警 +##晁 +##蝮 +##媒 +##燗 +##蝠 +##卅 +##痴 +##即 +##甑 +##苺 +##鞴 +##渾 +##斷 +##誡 +##蚊 +##怯 +##宥 +##凱 +##獅 +##綸 +##瀨 +##稚 +##鷦 +##鷯 +##微 +##倣 +##詢 +##寡 +##謖 +##朮 +##兮 +##凧 +##稈 +##疇 +##契 +##» +##樽 +##芎 +##剝 +##槫 +##滉 +##疳 +##虞 +##巫 +##燐 +##曼 +##苫 +##戛 +##喇 +##痙 +##踞 +##¤ +##& +##瓏 +##捐 +##墻 +##暇 +##猷 +##― +##墜 +##數 +##頊 +##塊 +##昶 +##鞮 +##芩 +##貼 +##轡 +##鞏 +##懌 +##叭 +##⏌ +##救 +##竝 +##伺 +##粥 +##鬚 +##哇 +##埴 +##♀ +##♂ +##鋪 +##奢 +##霏 +##爐 +##Γ +##Ξ +##羹 +##鑞 +##舁 +##籐 +##覺 +##昏 +##猴 +##推 +##關 +##沃 +##穢 +##遼 +##柬 +##翳 +##悔 +##瑶 +##揉 +##洩 +##蹲 +##圀 +##荼 +##彭 +##棱 +##係 +##幟 +##笘 +##燼 +##楡 +##茨 +##籬 +##扶 +##媚 +##螂 +##彈 +##諧 +##峅 +##玕 +##巨 +##僚 +##靴 +##菱 +##陷 +##呈 +##闕 +##癩 +##硬 +##侗 +##幻 +##珊 +##艸 +##担 +##殘 +##闇 +##牝 +##鹼 +##杲 +##慌 +##蟬 +##卦 +##娼 +##藁 +##廡 +##舒 +##毫 +##虜 +##— +##囊 +##握 +##蔽 +##尤 +##巓 +##躁 +##炊 +##咐 +##鬆 +##堵 +##叟 +##隻 +##錮 +##壹 +##梯 +##汽 +##龕 +##璇 +##閃 +##蛸 +##← +##↑ +##妾 +##罠 +##螳 +##鶚 +##昂 +##朦 +##餮 +##椽 +##麩 +##詔 +##膚 +##ㇻ +##穡 +##簿 +##樣 +##澹 +##衾 +##藺 +##旛 +##跚 +##糟 +##窮 +##緜 +##瓊 +##窩 +##縋 +##緞 +##剋 +##阯 +##汞 +##肭 +##¿ +##鉛 +##灌 +##帥 +##£ +##槓 +##禾 +##鴣 +##恤 +##拐 +##涅 +##曄 +##▽ +##訂 +##擲 +##罸 +##舊 +##捉 +##馳 +##辟 +##鈎 +##壙 +##婉 +##號 +##蛍 +##捶 +##饉 +##澈 +##蒻 +##邉 +##厲 +##溶 +##韶 +##聾 +##獺 +##鈑 +##敖 +##哨 +##驛 +##脊 +##敢 +##瞭 +##已 +##儘 +##畿 +##贈 +##徨 +##雇 +##瓢 +##兆 +##喊 +##諶 +##箚 +##倆 +##喆 +##侶 +##陝 +##鉉 +##璘 +##愧 +##鴒 +##址 +##濂 +##瞬 +##眷 +##銓 +##塲 +##《 +##蘊 +##汎 +##∀ +##骸 +##誂 +##酵 +##壻 +##跨 +##諄 +##錨 +##熹 +##迭 +##盔 +##嵩 +##犧 +##楠 +##髴 +##釋 +##執 +##爺 +##滸 +##漸 +##繼 +##徐 +##祉 +##牽 +##舅 +##籀 +##撻 +##絃 +##驩 +##卜 +##禦 +##滾 +##拼 +##疋 +##蓑 +##莢 +##跋 +##悠 +##饒 +##茉 +##瑾 +##區 +##覡 +##芭 +##枷 +##劍 +##舗 +##屍 +##咤 +##琦 +##馗 +##贊 +##鹸 +##截 +##嵎 +##厥 +##廿 +##瑗 +##欒 +##嘘 +##聟 +##裔 +##篋 +##糶 +##∓ +##遮 +##菁 +##粢 +##樫 +##錚 +##矧 +##鏞 +##鎭 +##暎 +##閘 +##偽 +##廁 +##鷗 +##奠 +##亨 +##把 +##鰈 +##頤 +##眩 +##漂 +##肛 +##蔡 +##咫 +##何 +##騨 +##巷 +##阜 +##猾 +##撞 +##蔀 +##戈 +##怙 +##樟 +##餉 +##禽 +##☁ +##☂ +##蘗 +##蝿 +##狽 +##ψ +##瀑 +##刎 +##爽 +##陬 +##粱 +##蕷 +##激 +##呍 +##煕 +##顆 +##隴 +##褥 +##朕 +##摧 +##鎚 +##斧 +##逓 +##釗 +##嘯 +##渇 +##繇 +##飩 +##授 +##悸 +##牀 +##鬪 +##喘 +##樊 +##嘩 +##鞜 +##悛 +##嬋 +##雯 +##蝓 +##宙 +##倻 +##榴 +##蛹 +##蜀 +##梱 +##氐 +##菴 +##處 +##堡 +##靭 +##彙 +##醢 +##俄 +##漿 +##穿 +##徠 +##縅 +##喚 +##邈 +##帑 +##芻 +##邏 +##磔 +##謗 +##笹 +##决 +##擾 +##寫 +##闡 +##√ +##• +##弄 +##盾 +##獨 +##頚 +##醉 +##ħ +##峙 +##某 +##普 +##苅 +##恂 +##鋭 +##靄 +##複 +##睿 +##圖 +##夭 +##隸 +##呉 +##蔟 +##賄 +##掃 +##雋 +##俸 +##馭 +##淇 +##撕 +##賠 +##浙 +##恣 +##裒 +##膿 +##僖 +##贄 +##芾 +##藝 +##些 +##嶌 +##岨 +##肢 +##棊 +##毟 +##掬 +##緯 +##湮 +##蠅 +##瑰 +##疲 +##梧 +##鵑 +##廂 +##潸 +##篩 +##貔 +##柑 +##飡 +##啾 +##鑰 +##淮 +##卷 +##槐 +##樓 +##晏 +##甸 +##酥 +##諜 +##歡 +##鄕 +##蘋 +##酬 +##瑛 +##耗 +##癇 +##迄 +##扁 +##嗟 +##攸 +##瞥 +##抽 +##衍 +##洒 +##鎌 +##垜 +##黑 +##羞 +##嘲 +##瞋 +##儡 +##祁 +##澂 +##盡 +##竃 +##淹 +##琶 +##渫 +##聰 +##嘔 +##佯 +##惧 +##禺 +##襞 +##蓿 +##杙 +##霓 +##鄭 +##臾 +##ゎ +##陟 +##佗 +##溌 +##ぉ +##嬬 +##壬 +##骰 +##霄 +##褌 +##穗 +##頑 +##險 +##潼 +##煌 +##臧 +##忙 +##杷 +##憾 +##掾 +##鰯 +##彅 +##掴 +##灝 +##叛 +##跌 +##從 +##俎 +##梵 +##崛 +##¡ +##鬨 +##槙 +##擔 +##纈 +##怕 +##睺 +##諚 +##╹ +##撈 +##« +##耨 +##班 +##捷 +##紂 +##豁 +##惇 +##魎 +##疵 +##鯒 +##廩 +##赦 +##瓠 +##劾 +##稹 +##堺 +##逍 +##鴈 +##洽 +##姒 +##鏘 +##Θ +##臈 +##搔 +##甥 +##喧 +##粗 +##嘱 +##儉 +##靱 +##晷 +##羚 +##爻 +##詹 +##呰 +##孟 +##閲 +##劃 +##肋 +##裝 +##隷 +##渣 +##礦 +##猪 +##邱 +##魁 +##恬 +##篦 +##〕 +##盒 +##隲 +##茱 +##萸 +##囂 +##蜒 +##采 +##琵 +##兗 +##櫞 +##濤 +##沫 +##璐 +##奕 +##覩 +##澣 +##簪 +##脘 +##馨 +##儺 +##暖 +##兀 +##顚 +##凭 +##眈 +##揆 +##縵 +##錄 +##♠ +##瞞 +##淞 +##嶂 +##夾 +##筝 +##晨 +##Å +##儞 +##銷 +##勧 +##俅 +##勃 +##渉 +##杈 +##閭 +##齋 +##鞁 +##靼 +##痩 +##舫 +##© +##尸 +##籾 +##栽 +##丙 +##蕪 +##蜷 +##慟 +##婿 +##氣 +##曁 +##鉋 +##踝 +##歟 +##偶 +##箭 +##狡 +##娃 +##俠 +##潑 +##霖 +##籙 +##昉 +##氈 +##拵 +##龢 +##况 +##們 +##蜍 +##熨 +##厦 +##兇 +##軛 +##颯 +##溯 +##佃 +##歷 +##璞 +##枢 +##頻 +##搬 +##牒 +##滿 +##♥ +##錢 +##鼈 +##麋 +##櫚 +##崋 +##翊 +##泗 +##臚 +##莎 +##兌 +##禮 +##發 +##聽 +##詮 +##嶇 +##♦ +##♣ +##駱 +##腮 +##斂 +##勞 +##旁 +##榑 +##紆 +##飄 +##烹 +##琮 +##徃 +##碍 +##昊 +##篁 +##擧 +##‡ +##繞 +##‐ +##蹤 +##濛 +##莧 +##禧 +##墉 +##褸 +##閥 +##◆ +##遏 +##韮 +##鈷 +##葩 +##悼 +##侮 +##窒 +##頰 +##葎 +##砌 +##闔 +##槿 +##憊 +##蟎 +##侃 +##錘 +##煽 +##莊 +##偉 +##殊 +##桿 +##巒 +##儁 +##圻 +##峴 +##崧 +##剰 +##滋 +##肯 +##諺 +##晝 +##闥 +##鳶 +##隱 +##痞 +##恪 +##慙 +##浣 +##蜻 +##顰 +##稷 +##倚 +##蔘 +##虹 +##懦 +##翦 +##砺 +##歿 +##欝 +##⓷ +##❹ +##❺ +##几 +##燁 +##縱 +##湫 +##艚 +##仗 +##麓 +##或 +##騏 +##泌 +##冽 +##巎 +##袁 +##沁 +##礎 +##冢 +##億 +##竟 +##鰓 +##芿 +##渟 +##悳 +##菟 +##擅 +##漪 +##癬 +##簣 +##凹 +##泄 +##錕 +##§ +##蠻 +##褓 +##簽 +##努 +##慳 +##鰆 +##跑 +##祿 +##粹 +##閾 +##衙 +##孛 +##匝 +##个 +##椋 +##搭 +##菰 +##壕 +##妁 +##鈿 +##蜥 +##蜴 +##滬 +##◯ +##嗽 +##憺 +##楮 +##淚 +##韞 +##姚 +##覯 +##閇 +##閨 +##禱 +##楷 +##珪 +##隼 +##≪ +##招 +##凰 +##涛 +##薊 +##跪 +##詐 +##樺 +##妊 +##稀 +##惟 +##諡 +##穽 +##倅 +##骼 +##爰 +##嵬 +##嶼 +##苣 +##酎 +##拍 +##篆 +##婪 +##藹 +##繊 +##陋 +##蒔 +##閤 +##笥 +##唔 +##冒 +##齧 +##旱 +##楂 +##曝 +##Φ +##償 +##煉 +##靂 +##傪 +##咨 +##穫 +##徊 +##雫 +##腓 +##槃 +##侈 +##攘 +##囘 +##潦 +##璉 +##肄 +##螟 +##畴 +##穣 +##驤 +##鯉 +##哺 +##扎 +##剄 +##笈 +##裙 +##漑 +##纜 +##蹊 +##駿 +##蘿 +##姥 +##輕 +##梭 +##抓 +##筅 +##薺 +##愍 +##份 +##祗 +##狃 +##洮 +##駟 +##耆 +##∽ +##⊿ +##逵 +##壤 +##但 +##皆 +##駑 +##棗 +##蠱 +##隗 +##杣 +##沚 +##暠 +##衢 +##疼 +##筌 +##凸 +##冪 +##坏 +##癭 +##姐 +##紈 +##睹 +##傲 +##胛 +##襴 +##剪 +##厨 +##沂 +##殃 +##嵋 +##捗 +##蠃 +##錆 +##痾 +##櫻 +##瓷 +##壓 +##弉 +##玅 +##嚮 +##踵 +##詛 +##拜 +##竺 +##冤 +##肇 +##誰 +##毓 +##魄 +##總 +##惔 +##馥 +##茜 +##茘 +##騫 +##飭 +##兔 +##彳 +##匈 +##渙 +##堊 +##匣 +##詡 +##郁 +##僕 +##嚼 +##懣 +##祈 +##袤 +##卍 +##忱 +##毳 +##罩 +##鋲 +##媽 +##♭ +##瞻 +##怩 +##秉 +##楝 +##矯 +##涜 +##乏 +##促 +##銜 +##竊 +##禝 +##蔗 +##俚 +##皺 +##窬 +##∩ +##〃 +##殼 +##辯 +##扼 +##罐 +##皙 +##劻 +##鯱 +##郢 +##汴 +##鞨 +##姻 +##鄲 +##舐 +##曙 +##孺 +##珉 +##筐 +##徭 +##軀 +##璧 +##櫨 +##稙 +##栂 +##翹 +##爼 +##茲 +##珀 +##柘 +##犢 +##諍 +##亙 +##鎗 +##梃 +##塢 +##娑 +##鑽 +##磧 +##獗 +##摸 +##蘆 +##孕 +##俱 +##遐 +##癧 +##⎿ +##奘 +##贋 +##龗 +##昺 +##榊 +##填 +##駈 +##憩 +##翌 +##甦 +##黜 +##詵 +##殷 +##俑 +##氓 +##峭 +##隘 +##赭 +##昆 +##逞 +##辜 +##癲 +##〝 +##榕 +##箍 +##耐 +##壜 +##欖 +##遜 +##蠡 +##稽 +##孑 +##乘 +##枡 +##灣 +##懼 +##誘 +##虻 +##欺 +##▷ +##◁ +##洱 +##滄 +##抬 +##酊 +##〘 +##〖 +##侭 +##咬 +##撚 +##鞠 +##癘 +##尓 +##醇 +##沐 +##覓 +##爭 +##嶮 +##懃 +##≡ +##廸 +##膣 +##駭 +##胖 +##娶 +##儂 +##續 +##奶 +##瓮 +##炫 +##∥ +##牡 +##蠣 +##拱 +##蹕 +##絮 +##檮 +##愷 +##倖 +##气 +##諂 +##蓴 +##獦 +##枇 +##痍 +##濶 +##蹼 +##罔 +##壯 +##仆 +##泓 +##鸚 +##猥 +##頴 +##遙 +##惡 +##擺 +##濘 +##¬ +##奧 +##洹 +##嗾 +##裴 +##棠 +##誄 +##耽 +##嫉 +##愾 +##槹 +##堝 +##嚇 +##稻 +##鏑 +##轢 +##轎 +##檸 +##嚥 +##鶫 +##擻 +##蓂 +##盞 +##鍑 +##勁 +##槁 +##甌 +##邀 +##購 +##帷 +##鑾 +##鮪 +##冉 +##譯 +##臍 +##檻 +##劔 +##痲 +##瀏 +##縹 +##仭 +##懈 +##豈 +##茯 +##檎 +##咯 +##互 +##琨 +##詫 +##譽 +##蹌 +##范 +##穵 +##芒 +##諮 +##繍 +##駸 +##瓚 +##罡 +##飜 +##瑙 +##髯 +##絆 +##諒 +##覽 +##訥 +##贖 +##匂 +##姪 +##梢 +##鶿 +##兢 +##拯 +##踠 +##柚 +##蔔 +##讖 +##拏 +##傕 +##荻 +##蔦 +##坨 +##瑁 +##淀 +##暹 +##竇 +##趺 +##翫 +##鞄 +##稟 +##詈 +##鱚 +##衿 +##鐐 +##蠍 +##皰 +##掉 +##毖 +##謐 +##淨 +##雹 +##赴 +##湃 +##鹵 +##涓 +##蓙 +##孁 +##埤 +##珥 +##蠢 +##敲 +##蘖 +##齕 +##嬖 +##閦 +##雌 +##塹 +##枳 +##畢 +##誥 +##佚 +##縻 +##拔 +##醜 +##刄 +##呪 +##齦 +##簃 +##攀 +##啖 +##♡ +##械 +##蔣 +##屢 +##黐 +##逑 +##畏 +##渚 +##郞 +##燦 +##效 +##拆 +##犁 +##牋 +##枲 +##屬 +##跎 +##騷 +##竭 +##蔚 +##彿 +##聃 +##淺 +##梠 +##繩 +##捲 +##邳 +##淼 +##嶲 +##敎 +##匆 +##∫ +##⊥ +##∵ +##∪ +##荃 +##糜 +##緊 +##篥 +##賁 +##莚 +##擴 +##卻 +##擂 +##蝎 +##臏 +##芨 +##漣 +##綜 +##盂 +##皎 +##艟 +##荳 +##譴 +##暻 +##猩 +##牆 +##縟 +##淅 +##唳 +##醺 +##鉇 +##炸 +##搏 +##縒 +##鏖 +##閏 +##璜 +##逅 +##咀 +##Ψ +##携 +##銑 +##藜 +##袷 +##營 +##栱 +##貅 +##藷 +##嚶 +##雖 +##舍 +##灤 +##瀞 +##鈺 +##膊 +##暘 +##蒾 +##批 +##戊 +##轟 +##鋳 +##袂 +##沮 +##憫 +##嫋 +##歇 +##軋 +##每 +##忩 +##泪 +##掖 +##弭 +##鞅 +##腴 +##斛 +##亘 +##轆 +##齬 +##罘 +##綻 +##魏 +##乖 +##塒 +##穹 +##胚 +##椏 +##踐 +##剱 +##煦 +##嚭 +##糾 +##儻 +##甄 +##顏 +##訌 +##档 +##簸 +##顗 +##雎 +##芷 +##膺 +##攷 +##縊 +##寐 +##咸 +##毗 +##匹 +##燧 +##嫂 +##嬌 +##綵 +##唖 +##冴 +##櫂 +##軾 +##邁 +##滌 +##點 +##掟 +##繃 +##瀚 +##麴 +##腦 +##羨 +##穰 +##驟 +##寓 +##闢 +##飫 +##嘖 +##桔 +##娟 +##繆 +##鑼 +##臑 +##瘻 +##佻 +##抉 +##衲 +##莽 +##鮒 +##駮 +##窠 +##訝 +##邙 +##蚯 +##蚓 +##湲 +##鋺 +##柁 +##嵯 +##橙 +##戔 +##豳 +##檄 +##諗 +##盥 +##淘 +##肱 +##歐 +##譔 +##沛 +##榎 +##柝 +##鰤 +##倦 +##琊 +##筈 +##瑕 +##妍 +##岻 +##藉 +##綫 +##餞 +##頗 +##駘 +##恰 +##嬉 +##擘 +##〒 +##搾 +##粲 +##濕 +##豨 +##咆 +##沒 +##鑢 +##遽 +##縺 +##磋 +##僉 +##腋 +##樸 +##獵 +##弑 +##鑚 +##珮 +##褘 +##痂 +##鑁 +##耄 +##丿 +##顥 +##噌 +##萇 +##鷀 +##黻 +##驍 +##瑯 +##薑 +##擢 +##羿 +##碾 +##沽 +##鰕 +##噶 +##遞 +##踉 +##勣 +##廛 +##捥 +##逮 +##錡 +##贇 +##銹 +##掩 +##釐 +##巢 +##捍 +##疸 +##跛 +##盪 +##銖 +##戲 +##軻 +##苧 +##蹐 +##窄 +##棕 +##墺 +##璣 +##緘 +##蜊 +##瑫 +##惕 +##翡 +##靆 +##蒿 +##腟 +##昕 +##琲 +##喋 +##晟 +##厘 +##昨 +##汾 +##屁 +##眙 +##夛 +##窕 +##趨 +##僞 +##霰 +##參 +##莘 +##糕 +##幫 +##烽 +##湧 +##佶 +##皷 +##糒 +##咒 +##邯 +##緝 +##郝 +##畦 +##鏢 +##噪 +##炯 +##刳 +##狹 +##襠 +##閒 +##驥 +##橡 +##箆 +##儔 +##臆 +##≒ +##柢 +##蔲 +##訢 +##膽 +##鎰 +##貰 +##榔 +##紜 +##懶 +##跏 +##桝 +##假 +##羣 +##樞 +##蒋 +##茵 +##柩 +##齪 +##煜 +##雒 +##朧 +##燹 +##姨 +##怛 +##⇧ +##蟄 +##蚰 +##勰 +##謾 +##寤 +##憬 +##蟾 +##輊 +##辿 +##圄 +##窗 +##悝 +##宓 +##鮄 +##哿 +##醫 +##种 +##澱 +##蠖 +##禛 +##絏 +##罅 +##騁 +##僥 +##貶 +##菖 +##滇 +##悉 +##蠕 +##酘 +##鵄 +##鳧 +##苴 +##衽 +##梔 +##飢 +##棰 +##狒 +##亢 +##謫 +##陞 +##殆 +##橿 +##輌 +##蜩 +##濮 +##湎 +##醋 +##鄧 +##徧 +##輳 +##蛭 +##菇 +##閼 +##璫 +##隍 +##燎 +##觴 +##扈 +##歙 +##忸 +##蝌 +##檢 +##喃 +##笄 +##碌 +##拶 +##侘 +##髀 +##黴 +##幷 +##縢 +##祕 +##襦 +##袢 +##黔 +##裟 +##蚪 +##煬 +##啜 +##洸 +##筰 +##荊 +##淪 +##困 +##鱇 +##蕭 +##仿 +##∈ +##殉 +##繡 +##埵 +##悅 +##耘 +##鮃 +##鑠 +##荀 +##窿 +##厠 +##骶 +##叮 +##貮 +##陘 +##怜 +##鈕 +##迩 +##鍔 +##∂ +##晰 +##袈 +##闖 +##灑 +##旆 +##◎ +##〻 +##衒 +##玘 +##鑓 +##潯 +##跖 +##檐 +##耿 +##獏 +##兊 +##愿 +##¢ +##毋 +##癈 +##沅 +##敕 +##嫣 +##觸 +##潴 +##旄 +##菩 +##蟀 +##筍 +##謔 +##鱮 +##瘁 +##褚 +##‰ +##稠 +##眸 +##腱 +##聘 +##燠 +##鸕 +##挂 +##唹 +##沪 +##鳰 +##鴦 +##渭 +##爨 +##嚀 +##豐 +##摶 +##熄 +##阮 +##勵 +##岌 +##眄 +##叺 +##弋 +##賂 +##黽 +##瘠 +##驢 +##誑 +##寳 +##芙 +##繝 +##緖 +##悰 +##漳 +##屓 +##慂 +##艘 +##逼 +##廋 +##麭 +##栢 +##蕗 +##儚 +##蕈 +##鐡 +##跟 +##喨 +##羈 +##耋 +##醂 +##潘 +##艙 +##刮 +##擒 +##嫗 +##簇 +##岷 +##憖 +##鋩 +##貉 +##廢 +##豕 +##瀟 +##溂 +##瘦 +##蚣 +##涕 +##睢 +##适 +##◦ +##轂 +##頎 +##珎 +##匐 +##艷 +##偸 +##饗 +##觜 +##頫 +##玳 +##哮 +##爸 +##鯥 +##蜿 +##叶 +##鴫 +##頁 +##儷 +##儼 +##笋 +##覈 +##闐 +##弌 +##婬 +##丐 +##廚 +##鷄 +##碇 +##孃 +##悧 +##仝 +##黨 +##嫩 +##褙 +##慚 +##磚 +##繚 +##麈 +##璈 +##渥 +##鴬 +##囀 +##碣 +##瀦 +##藐 +##轤 +##闌 +##苡 +##枋 +##較 +##垈 +##獪 +##偈 +##洌 +いる +する +ある +20 +19 +から +こと +201 +その +れる +なっ +ない +ため +など +200 +##ール +この +日本 +##ック +##ター +##リー +られ +より +10 +##ット +##ング +いう +なる +##ラン +##スト +##ート +あっ +よう +また +あり +もの +まで +##ュー +##ーム +##ード +##ント +18 +12 +##ティ +##ージ +##ョン +11 +199 +学校 +##ンド +大学 +##00 +でき +おり +##かっ +これ +##イン +##ース +##ディ +よる +##リア +##er +放送 +それ +198 +昭和 +よっ +##ップ +##ション +##ーク +プロ +##リカ +##ーズ +##する +##ーン +15 +アル +受け +##イト +197 +だっ +なく +現在 +英語 +なり +##on +東京 +しか +202 +##バー +アメ +キャ +世界 +17 +##in +アメリカ +場合 +##える +なかっ +時代 +16 +つい +##an +使用 +会社 +ファ +196 +テレ +できる +平成 +登場 +おい +##レー +##ープ +られる +行わ +イン +コン +選手 +##ライ +テレビ +##ラー +研究 +ジャ +13 +##ar +しかし +##める +作品 +##しい +##ンス +14 +ライ +30 +##リス +194 +195 +##en +##ッド +番組 +##リン +##or +可能 +たち +発売 +##ンジ +存在 +##イル +多く +映画 +とも +開始 +##ランド +活動 +##カー +##ルト +リー +クラ +##ナー +およ +##ーマ +同じ +##ンク +のみ +当時 +##at +フラン +ページ +チャ +##al +##れる +25 +フィ +および +バス +しま +対し +呼ば +明治 +発表 +にて +##シュ +鉄道 +一部 +チーム +21 +##es +スタ +時間 +##ダー +##ックス +タイ +行っ +代表 +大き +##ニア +ディ +開発 +ゲーム +22 +取り +開催 +##ける +出演 +##シア +同年 +なお +##リーズ +##ic +アルバ +ドラ +##イツ +オー +以降 +大会 +地域 +193 +スト +変更 +ニュー +24 +参加 +関係 +フォ +持つ +##シャ +##ステ +だけ +アイ +##がら +さら +23 +##ナル +出場 +##it +##レイ +シリーズ +試合 +おけ +以下 +所属 +用い +担当 +##ンター +たり +##オン +せる +アルバム +自分 +##ロー +記録 +ドイツ +ながら +##クター +いっ +##ッチ +以上 +設置 +##is +##サー +利用 +中国 +コー +さらに +音楽 +中心 +##ーズン +192 +フランス +##ニー +自身 +株式 +シーズン +事業 +国際 +出身 +大阪 +リーグ +##ャー +##ウン +かつ +##クト +なら +26 +引き +一般 +28 +##ンバー +考え +監督 +2010 +多い +ステ +##しく +##ょう +生ま +##ブル +攻撃 +異な +アン +27 +人物 +行う +##フィ +ウィ +##ビュー +優勝 +かけ +女性 +委員 +グル +収録 +##ングル +アニ +##el +サン +高等 +31 +卒業 +##ーツ +務め +必要 +##ソン +フェ +中央 +29 +2011 +文化 +知ら +##デル +##ジオ +教育 +2009 +2012 +マン +社会 +##ベル +##パー +ジェ +設立 +情報 +スペ +2008 +##スタ +##まり +##ウス +問題 +2007 +意味 +##he +事件 +##レス +##le +ジョ +地方 +##ファ +2014 +サー +通り +2015 +##めて +位置 +うち +イギ +##フト +##フォ +ほか +2013 +シングル +2016 +イギリス +##ou +いく +都市 +##ion +##ネル +##マン +ブラ +2019 +自動 +アニメ +2017 +キャラ +##ールド +##上げ +##ーション +##さい +2018 +##して +影響 +結果 +計画 +ただ +##as +ほど +2006 +同様 +2020 +高校 +最終 +191 +終了 +世紀 +とき +##ol +##わっ +##ラス +ウェ +##わり +サイ +戦争 +##ータ +ショ +最初 +販売 +当初 +シャ +##ヴァ +##ッカー +場所 +##ヴィ +##ウェ +ラン +グループ +##ころ +獲得 +選挙 +一方 +##ロン +作曲 +メンバー +生まれ +100 +及び +##よう +建設 +センター +2021 +##om +##キー +一覧 +km +制作 +##ーター +部分 +アー +そして +##ンタ +##ジア +人間 +政府 +スター +地区 +##わせ +2005 +##まっ +かつて +##re +最後 +発生 +以外 +機関 +リンク +状態 +特に +2000 +彼女 +関する +##ステム +技術 +調査 +##リング +年間 +##am +経済 +就任 +スポ +まま +全国 +システム +廃止 +##カル +##ぞれ +##スター +##メント +持ち +それぞれ +施設 +デビュー +50 +政治 +ところ +決定 +契約 +野球 +公開 +##il +##et +マイ +モデル +教授 +ブル +年度 +異なる +記念 +航空 +しまう +##レン +##イス +##ッシュ +キャラクター +向け +ます +##ac +ロシア +主義 +女子 +歴史 +40 +##アン +構成 +##us +オリ +##ro +##ラム +持っ +名前 +実施 +合衆 +戦闘 +##ケット +ヴァ +##ビー +複数 +京都 +チェ +路線 +2004 +##ザー +##ジェ +議員 +ただし +管理 +##イド +同時 +##デン +デザ +たい +製造 +全て +能力 +高い +相手 +入り +です +さん +設定 +##シー +こう +##テン +##フェ +カー +190 +ドラマ +初めて +2022 +スー +記事 +##ルス +本作 +生活 +採用 +果た +組織 +対する +機能 +ホーム +車両 +##つけ +指定 +最も +ダイ +特別 +運行 +起こ +##替え +リリー +帝国 +##エル +##ing +列車 +戦い +公式 +目的 +あた +合併 +##リスト +##出し +ロー +エンジ +受賞 +丁目 +##ートル +ヴィ +##海道 +シュ +ベル +通常 +##ーロ +名称 +##ビス +ライブ +##んど +##ろう +イタ +出版 +出来 +勝利 +クロ +始め +IS +サッカー +道路 +協会 +##ンプ +##スク +企業 +最大 +トラ +##かり +生産 +##ンチ +与え +科学 +リリース +共和 +2003 +##ンダ +##リオ +対応 +たら +##ッツ +結婚 +##クション +クラブ +交通 +ラジオ +部隊 +そこ +コミ +続け +事務 +最高 +漫画 +使わ +##ーナ +00 +含む +イタリア +##タル +少な +##ER +##ンガ +189 +188 +##ニング +パー +警察 +伴い +##わる +自由 +ハイ +##ch +公園 +運動 +海軍 +##ディング +##コン +営業 +大きな +製作 +アナ +マル +もっ +カード +総合 +独立 +完成 +搭載 +一人 +デザイン +予定 +##アー +近い +時期 +主人 +運転 +2002 +時点 +主に +基本 +バイ +##イトル +##アル +バンド +提供 +プレイ +##ter +移籍 +ほと +ユニ +2001 +##テル +発見 +##モン +大正 +北海道 +江戸 +##ッパ +サービス +ティ +以前 +成功 +内容 +##かけ +飛行 +人口 +マー +新聞 +実際 +##AN +##チャ +経営 +宇宙 +##ルフ +加え +ほとんど +完全 +チャン +JR +特徴 +ミュー +ジュ +期間 +専門 +カップ +重要 +活躍 +理由 +評価 +タイトル +##ッグ +ウォ +小説 +##がっ +##ヤー +神社 +バー +運営 +レー +##ay +自ら +ソフト +プレ +##ed +述べ +##ビア +連続 +000 +挙げ +編成 +企画 +##ディア +決勝 +エンジン +35 +インター +入っ +ビル +イベ +作詞 +いわ +撮影 +オープ +187 +様々 +##リック +対象 +再び +構造 +導入 +##ad +子供 +##付け +スポーツ +新た +##ギー +ネット +##ティー +1990 +行動 +##nd +初期 +支援 +すべ +連合 +性格 +of +参照 +##ワー +指導 +病院 +##ig +スーパー +イベント +設計 +##id +しまっ +すべて +認め +ファン +よく +開業 +ライン +##古屋 +##IN +スク +もと +楽曲 +付け +人気 +データ +文字 +名古屋 +言わ +改称 +ちゃ +##まる +規模 +とっ +##クス +レース +そう +##ピック +表記 +45 +##タン +不明 +移動 +法人 +##000 +以来 +紹介 +##ーカー +指揮 +案内 +1999 +非常 +男性 +##バル +配信 +##ミー +大きく +展開 +ブロ +環境 +工業 +国家 +ひと +##ur +追加 +関連 +下さい +ボー +共同 +団体 +ミュージ +物語 +##プリ +##ot +##os +労働 +##ation +教会 +##ent +##入れ +レコ +##リンピック +##トル +国民 +結成 +ここ +議会 +フリー +プラ +舞台 +番号 +程度 +##BN +グラ +テーマ +ジョン +##ッジ +のち +項目 +クラス +##ON +##わら +回避 +cm +競技 +限定 +##ゅう +工場 +レイ +変化 +果たし +由来 +CD +##ストラ +文学 +広島 +ISBN +会議 +死去 +銀行 +写真 +32 +##AR +電気 +##ンパ +表示 +カル +候補 +mm +距離 +装備 +美術 +St +##らか +全体 +会長 +60 +多数 +##込ん +##ボール +インド +ドル +探し +方法 +##um +過去 +##じめ +サイト +##キング +1998 +アレ +コーナー +国道 +1980 +息子 +天皇 +一番 +いず +##じる +##シャル +言葉 +The +NH +思い +学園 +演奏 +大統 +大統領 +ヨーロ +##マー +試験 +アク +社長 +##ウンド +##らし +連邦 +乗り +ローマ +建築 +裁判 +福岡 +ヨーロッパ +韓国 +登録 +県道 +ぶり +##込み +オリジ +選ん +地下 +##ウム +##iv +少年 +##ッセ +引退 +強い +打ち +空港 +地球 +入れ +横浜 +##ルド +事故 +##ir +スペイン +協力 +支配 +適切 +見せ +国内 +作戦 +どう +##ag +ユー +周辺 +##けれ +統合 +1997 +有する +ワールド +くる +自治 +オリジナル +仕事 +立ち +発行 +ほぼ +48 +区間 +見つけ +自然 +オリンピック +##ドル +##り替え +行い +陸軍 +##チェ +NHK +基づ +高速 +整備 +##BS +##ギュ +民主 +##込ま +対戦 +##いは +経験 +##リエ +1996 +工事 +初代 +形式 +アジア +通信 +##ow +映像 +アップ +ロック +いずれ +##ショ +##イズ +##ジー +主張 +べき +##ヴェ +##メージ +エン +##太郎 +状況 +ホール +しよう +##んな +大戦 +1995 +誕生 +朝鮮 +大臣 +掲載 +##げる +組み +含ま +ター +劇場 +36 +##ec +トン +確認 +移転 +学生 +ちゃん +使っ +効果 +少女 +##シン +##78 +##なり +同じく +装置 +好き +わた +33 +1970 +報告 +動物 +曖昧 +表現 +ベース +##なっ +II +産業 +あるいは +発足 +タイム +原作 +##デュー +専用 +##ネス +部門 +普通 +元年 +ハー +運用 +##ガー +1994 +エル +取得 +シェ +##im +種類 +生徒 +破壊 +本部 +方面 +ニュース +出し +形成 +人々 +##かる +千葉 +なけれ +生き +##ゴン +唯一 +トップ +##ia +新しい +繰り +死亡 +メートル +1993 +##em +受ける +制度 +家族 +##レーション +186 +ニューヨ +##un +個人 +成立 +モン +ステージ +輸送 +ヴェ +##ジャー +比較 +ニューヨーク +編集 +プロデュー +##st +行政 +タイプ +合わせ +やす +付近 +##イント +ファイ +##AS +1992 +FC +地名 +途中 +##ウト +##ジャ +スピ +郵便 +保護 +ごと +反対 +勝ち +選出 +業務 +王国 +県立 +現代 +アフ +条件 +##ネット +正式 +##えば +朝日 +フレ +##AT +系統 +入る +##od +##スコ +34 +IC +近く +いい +##ティング +##パン +図書 +拡大 +用語 +プレー +付き +博士 +オープン +復帰 +##ルム +1991 +発展 +##OR +##ばし +成績 +続い +競馬 +スカ +主要 +ゴール +##ッション +##ap +編曲 +##ut +クレ +公演 +##サン +開設 +##ちら +##クロ +以後 +バージ +呼び +追い +中継 +1989 +##ダル +55 +店舗 +フル +求め +周年 +38 +##ラル +##ーリー +描か +料理 +ベスト +直接 +本人 +コース +##リティ +観光 +500 +方向 +##ントン +分類 +父親 +芸術 +1987 +フロ +##ポート +オン +方式 +取締 +国立 +きっ +はじめ +目指 +##デオ +##セン +後半 +In +##がる +##ジェクト +本社 +連載 +愛知 +務める +食べ +もう +スタジオ +言う +アド +##プト +水先 +1988 +張り替え +##ズム +男子 +生物 +##ul +Ch +迎え +含め +##リーン +魔法 +九州 +武器 +カナ +細胞 +電話 +スコ +つけ +##かし +##キシ +メイン +所在 +当た +オブ +俳優 +80 +施行 +有名 +選ば +シン +##合わせ +つつ +パイ +言語 +使い +選択 +よれ +地元 +デジ +##oc +批判 +平均 +精神 +雑誌 +##ub +大型 +カリ +作ら +41 +##こう +ガン +流れ +率い +##and +コロ +特定 +市民 +示す +##ールズ +進出 +事実 +ジャン +支持 +ツアー +被害 +行き +南部 +42 +バル +新潟 +##チュ +##キュ +37 +関し +ギャ +編入 +##がり +地上 +アカ +人民 +組合 +司令 +##ンドン +ピア +作家 +ワン +##ES +安全 +プログ +##BC +加入 +イス +すぐ +翌年 +神戸 +##らい +やっ +所有 +##ジュ +復活 +1960 +得点 +向か +the +説明 +##セス +本線 +カン +女優 +増加 +クリス +アラ +原因 +##ゆる +小さ +あまり +決め +コンピ +外国 +1986 +ドライ +アンド +##ークス +ポイント +43 +政策 +市場 +直後 +1985 +建物 +##リート +配置 +将軍 +離れ +##レット +##せる +植物 +王座 +あたる +設け +入学 +購入 +防衛 +台湾 +ビデオ +改正 +39 +医療 +ルー +明らか +70 +パリ +ホテル +思わ +敗れ +##らく +グラン +バック +44 +##ースト +##メン +神奈 +シーン +##ak +##IC +障害 +語っ +通じ +ゲスト +フラ +仲間 +##合い +商品 +1984 +化学 +##EN +電子 +関東 +ハン +##50 +東北 +理事 +キー +静岡 +パン +ロンドン +DV +##AL +惑星 +達成 +リン +行為 +トレ +##イア +中学 +特殊 +バラ +メディア +##ウェー +メーカー +土地 +成長 +なか +神奈川 +内閣 +実験 +艦隊 +沖縄 +住民 +プロジェクト +##なる +温泉 +エネル +レベル +46 +レコード +レギュ +派遣 +代わり +##トロ +従来 +##ers +失敗 +記述 +関西 +トリ +系列 +スケ +##なわ +978 +##イク +##AM +カメ +##ピー +kg +in +指摘 +拠点 +基地 +##ガン +##ウル +年代 +各地 +高く +標準 +富士 +ブランド +出会 +##シング +フジ +プリ +エネルギー +仕様 +形態 +DVD +強化 +残し +軍事 +イメージ +##出す +太平 +建て +1983 +グレ +投票 +ダム +製品 +CM +作り +作業 +記載 +コンピュー +電車 +ユニット +福島 +##IS +政権 +示し +##av +##op +90 +トラン +オフ +切り +作成 +きっかけ +イラ +延長 +発電 +同社 +##ルク +兄弟 +規定 +一時 +ソング +長野 +ミュージック +山口 +1982 +海外 +##ri +北部 +モード +巨大 +使う +レギュラー +##ュニ +バージョン +##スタン +報道 +くだ +停止 +無い +##ゲン +改造 +##ッケ +呼ぶ +シー +##ov +機械 +経由 +ガス +米国 +資料 +処理 +47 +300 +速度 +トラック +商業 +セル +例えば +言っ +披露 +制御 +オール +伝え +連盟 +残っ +統一 +埼玉 +主演 +##og +競走 +パラ +法律 +創設 +##スティ +アイドル +分離 +##ウンサー +歌手 +##ストン +1972 +上記 +独自 +##ロス +TO +言い +ギリ +描い +太陽 +アナウンサー +ポー +th +##込む +少ない +博物 +住宅 +スパ +実現 +##VE +脚本 +プレイヤー +1981 +ロボ +長崎 +少なく +1979 +落ち +デジタル +違い +集団 +戦後 +母親 +昇格 +継承 +軌道 +なし +新設 +51 +空間 +ミニ +定期 +解散 +中華 +おら +クリ +旅客 +##AC +強く +接続 +マーク +部屋 +比べ +優秀 +##ard +トゥ +現れ +革命 +制限 +置か +感じ +##ab +殺害 +集め +##ルー +##ランダ +分野 +安定 +スタート +作っ +スキ +カナダ +周囲 +貢献 +名誉 +展示 +##ニュー +責任 +伝統 +条約 +書か +参戦 +##ミア +##ッフ +ブリ +面積 +##ピオン +機構 +ヒット +令和 +##ブルク +パート +至る +##ce +まと +友人 +いつ +1978 +##ロット +感染 +維持 +1975 +##ウィ +かなり +工学 +意識 +農業 +交流 +ジョージ +##ーフ +交換 +停車 +相当 +要素 +医学 +続く +##ダム +52 +書き +カラー +##ID +49 +ライト +##ニック +##返し +##リアム +詳細 +##HE +1973 +二人 +1950 +シティ +54 +エレ +基準 +限り +役割 +操作 +反応 +勢力 +見る +ください +予選 +共通 +学院 +紀元 +##ファー +民族 +機体 +##FA +刊行 +古代 +現役 +##OM +振り +取引 +##掛け +##ie +地震 +本来 +段階 +ランド +主催 +##ンズ +TV +理論 +コミュニ +進め +岡山 +用法 +範囲 +1974 +思っ +岐阜 +1976 +##th +ブルー +##バイ +ダン +禁止 +校舎 +レス +兵庫 +長い +##くり +1971 +##ブリ +コード +##ウェア +ボール +ポジ +ST +##シェ +自体 +全員 +オーストラ +治療 +貨物 +鹿児 +##OS +鹿児島 +命令 +体制 +イング +1969 +継続 +1945 +まし +体育 +大陸 +キング +通称 +メダル +交差 +もら +同盟 +エア +##ill +毎年 +皇帝 +オーストラリア +貴族 +行く +熊本 +観測 +さま +扱い +##ワード +読み +##ッキ +##ガル +訓練 +内部 +陸上 +コーチ +チャンピオン +提案 +訪れ +主な +減少 +向上 +##EC +みな +認定 +逮捕 +判断 +1977 +アト +ダイヤ +1968 +起き +ストーリー +ルート +宗教 +家庭 +あれ +##eb +##ミング +コンサ +演出 +ちな +挑戦 +宣言 +動き +せい +キリスト +田中 +対策 +性能 +課程 +首相 +##ディー +##ライナ +フォー +週間 +再開 +プロデューサー +鈴木 +語句 +近年 +オランダ +##ell +TBS +改革 +仙台 +解説 +前作 +エリア +札幌 +53 +モー +文庫 +ブラック +セット +de +##igh +一緒 +得る +##ジョン +##しくは +)- +##イルス +ギター +連絡 +##ワーク +要求 +##AP +通過 +職能 +始める +つな +小学 +生まれる +スペシャル +フィリ +回転 +首都 +インタ +##ッサ +良い +##切り +##マス +ウィリアム +しまい +まだ +##ッカ +起こし +##エン +アフリカ +##ra +移行 +依頼 +##立て +制定 +原子 +ヶ月 +進学 +広く +62 +スタッフ +定め +プログラム +185 +当選 +発言 +中村 +ショー +終わっ +スタイル +開通 +カメラ +58 +##チン +ノー +衆議 +単位 +You +セント +知っ +奈良 +声優 +出来る +マネ +1000 +1964 +キロ +コンピュータ +全く +しばし +ポジション +##ッキー +##ずか +結ぶ +世代 +防御 +大字 +ソ連 +56 +##ショナル +伝説 +ソロ +前後 +st +投手 +戻っ +向かっ +自己 +##ボン +書い +##ist +ミサ +##ok +メジャー +##ine +やま +レッド +勤務 +危険 +得意 +チャンネル +本名 +かか +秋田 +ダウン +分か +備え +1967 +ランキング +毎日 +亡く +立て +定義 +欧州 +しばしば +除く +児童 +グリ +ロード +会員 +中止 +##やか +異なり +推進 +帰国 +更に +負け +区域 +身長 +指す +##est +資格 +##クラ +キャン +指名 +押し +用いる +しょう +電力 +隣接 +知り +あら +更新 +Al +佐藤 +コンビ +##続き +学会 +保存 +作用 +長男 +飛び +THE +既に +##ーネ +同一 +パワー +小型 +主題 +##ン・ +##そう +カバー +改良 +##ニス +ヴォ +始まっ +Re +SP +もしくは +後述 +エピ +1965 +ペン +分割 +到着 +戦車 +視聴 +建造 +##ナム +トル +##ジン +消滅 +1966 +様子 +理解 +名乗 +基礎 +デイ +オス +回復 +兵器 +単独 +けん +共産 +つく +連れ +エイ +知事 +リア +東海 +小さな +ブレ +本塁 +起用 +チョ +サイズ +ピアノ +か月 +##バート +置く +##出さ +ヘル +すれ +##ミン +184 +巻き +ずつ +始まる +演じ +後継 +創立 +収め +400 +消費 +会場 +ラー +任務 +練習 +ハウス +旅行 +##ビン +##レンジ +##ess +57 +デュ +##トゥ +文書 +ダンス +西部 +##all +対立 +応じ +平和 +後期 +長官 +発射 +##ティスト +開幕 +一定 +海岸 +ウイルス +エド +騎士 +土曜 +近代 +##とう +目標 +アマ +年齢 +##ip +諸島 +##おり +記憶 +機器 +消防 +イングランド +オル +ユダ +バン +##IT +コント +ニコ +任命 +半島 +1955 +大量 +あたり +意見 +前述 +サポート +助け +##ダン +ドラゴン +1947 +フォン +##AD +乗車 +管轄 +ポーランド +吉田 +捜査 +供給 +実行 +カラ +命名 +##らす +180 +困難 +国鉄 +幕府 +en +出る +教師 +オペ +ナイト +アス +芸能 +通算 +FI +##NA +##ーニ +車体 +##ind +##ーチ +パーク +##トン +がっ +富山 +資金 +##かい +向かう +##フォル +##ストリア +与える +身体 +立場 +59 +作る +##30 +出現 +やすい +なさ +確保 +話し +らしい +1963 +PC +趣味 +##・ア +75 +山田 +著作 +##ンスター +判定 +##ッコ +マク +解放 +##取り +在籍 +リーダー +憲法 +青年 +##ジル +##ーラ +石川 +マシン +アカデ +すぎ +64 +投げ +師団 +An +##ッター +スマ +ラグ +保険 +ボス +階級 +物質 +##ct +低い +##レント +##ob +##OL +教え +画面 +同日 +徒歩 +##テナ +ジャパン +##テム +吸収 +ユダヤ +わけ +##10 +##ゼル +注目 +1962 +進行 +金曜 +##ケーション +##ノン +阪神 +傾向 +弁護 +コレ +目指し +設備 +##ブン +球団 +ほう +無く +インターネット +元々 +##ヴォ +##ルン +物理 +ブロック +刑事 +##art +リス +わずか +領域 +##UR +分け +いわゆる +1944 +直前 +戦士 +ルール +撤退 +##リーム +ネットワーク +売り +ゆう +前年 +準備 +計算 +執筆 +通し +東部 +合計 +未来 +河川 +1948 +天文 +##ツィ +##BA +検査 +タウン +初回 +交渉 +上位 +日曜 +ミサイル +両親 +トロ +処分 +##換え +##ッピ +##ET +記者 +動画 +アリ +対抗 +属する +グリーン +##ざま +解決 +民国 +判明 +健康 +連隊 +エンディング +##ジアム +伴う +##ik +ウク +ロボット +価格 +金属 +##カン +許可 +ルイ +アーティスト +民間 +思想 +##ーブ +残り +1954 +置き +1961 +入団 +遺跡 +登板 +もっと +寺院 +もた +入社 +アシ +Ar +イラスト +歌詞 +いち +日間 +サラ +##ザン +##ソード +医師 +なん +##ケル +伊勢 +1949 +松本 +変え +##ンサー +休止 +地位 +新宿 +模様 +どの +引き継 +##if +##80 +##ーブル +取っ +ナイ +出す +生命 +和歌 +形状 +ばかり +ファミ +大使 +表明 +検討 +アイテム +##バン +持た +再生 +学科 +##US +1958 +街道 +##ども +##ポン +出力 +##セル +1941 +1956 +普及 +エリ +一種 +くれ +##リアン +呼ん +テスト +##イオ +過ぎ +インタビュー +##たり +##ンマ +自衛 +ヘン +徳島 +急行 +61 +##ーンズ +南北 +駆逐 +認識 +機動 +1959 +期待 +創業 +Bl +バトル +信号 +犯罪 +占領 +どちら +ブラジル +愛称 +##ant +方針 +US +##トリック +ビジ +名義 +ウクライナ +新人 +##ルツ +固定 +アカデミー +襲撃 +ヒロ +率いる +##もと +結ん +今日 +審査 +1940 +ブレー +##ルトラ +幹線 +特急 +##ノー +ポール +高橋 +講師 +and +べく +アプリ +分析 +ベイ +開校 +トンネル +##キシコ +背景 +##シャン +ガー +爆発 +とり +##20 +63 +機会 +##フォルニア +##ティブ +AT +新型 +見える +65 +公共 +Sh +だろう +サブ +市長 +少し +ライダー +##グラ +エピソード +大きい +クロス +本格 +##OW +権利 +香港 +山本 +パス +川崎 +エス +##ンタル +##持ち +崩壊 +続ける +FM +適用 +前半 +シナ +マスター +オーストリア +停留 +徳川 +現場 +提出 +遺伝 +コンサート +##シス +コマ +宮城 +買収 +シル +知識 +イオン +分布 +仮面 +加盟 +患者 +互い +体重 +##ud +1943 +ライフ +##メートル +リング +食品 +##ive +先発 +失っ +組み合わせ +カリフォルニア +調整 +Pl +十分 +否定 +果たす +哲学 +負傷 +チャート +アイル +神経 +パーソ +ヤマ +##一郎 +Sp +伊藤 +青森 +大幅 +合格 +送り +##ight +合流 +サイド +推定 +##衛門 +##ミュ +小林 +市街 +同士 +藤原 +宮崎 +収容 +トレー +必ず +##ウント +大和 +潜水 +##ne +危機 +無料 +##かさ +##ort +アウト +敗北 +逃げ +##ッテ +ジュニア +1952 +せん +グランプリ +##サス +やや +結局 +録音 +執行 +始まり +臨時 +空軍 +改善 +古墳 +殺人 +メイ +スウェー +ウルトラ +画家 +希望 +乗っ +スイ +書店 +150 +十字 +##チャー +##io +姉妹 +##UN +つき +免許 +上昇 +財団 +オーディ +落と +武装 +合成 +##ろし +インディ +スウェーデン +進ん +まず +イスラ +##サル +鎌倉 +不足 +##ue +用意 +公立 +概念 +##エスト +スコット +命じ +拒否 +基づく +大分 +カール +バンク +注意 +多かっ +シンガ +プライ +1957 +おお +だい +侵攻 +前身 +優れ +統治 +##ビエ +まつ +深夜 +じゃ +##ルタ +自宅 +戦う +##リュー +183 +やり +ボク +ヘッド +##ーグ +弟子 +楽し +オート +さまざま +一族 +論文 +竣工 +試み +##ティック +##イヤ +北緯 +##イム +あい +清水 +閉鎖 +スクール +結合 +##レート +承認 +呼称 +拡張 +専攻 +##っと +1953 +衛星 +地点 +1942 +金融 +オープニング +ハード +マリ +支店 +1951 +次第 +ころ +##ブラ +1930 +ちょう +##起こ +##でに +マイル +##FC +場面 +##トリ +1946 +Ne +さい +祖父 +ホワ +学習 +##11 +しん +共演 +サウンド +スペース +##ッタ +ノル +すでに +コンク +モンスター +やが +BS +兵士 +同名 +ジャンプ +次い +描写 +たく +##ッハ +強制 +##シック +指示 +##ドリ +置い +##パス +過ご +秘密 +De +##ge +##ロール +クー +かかわら +表す +現象 +藩主 +改名 +アイルランド +ミス +区別 +ダブル +実業 +増え +左右 +広告 +メキシコ +通っ +ポルト +ビジネス +フィールド +有効 +こそ +##ピン +略称 +##レーター +毎週 +古い +燃料 +##ティア +判決 +三菱 +変身 +プロレス +スキー +アレク +国会 +##ran +各種 +三重 +現地 +守る +軍人 +人類 +メモ +積極 +歴任 +作中 +生じ +コラ +携帯 +流れる +##てる +やがて +リスト +価値 +見つ +相互 +支払 +低下 +興味 +##リーナ +よし +メル +移管 +ケース +武蔵 +原則 +短期 +山形 +##ity +司会 +規制 +事態 +加藤 +改修 +PS +差し +信頼 +テロ +ボーカル +付属 +ウェブ +法学 +いき +南西 +住む +##ターン +往復 +##ian +##OC +Mar +戦略 +##クル +小田 +モノ +完了 +自転 +手段 +バレー +称し +##ペン +翻訳 +カット +福祉 +ラテン +ヒト +あと +##ナイ +マッチ +死後 +タレント +##デス +GP +かん +現実 +駅前 +わたっ +ターミ +中部 +##ベルク +数多 +歩兵 +シア +テキ +職員 +すなわ +すなわち +ディー +イエ +ダー +育成 +テク +##次郎 +##スタント +遺産 +ホワイト +結び +フランク +うえ +植民 +海上 +投資 +76 +協議 +マラ +福井 +求める +SH +ベト +走行 +属し +貿易 +送っ +証明 +外交 +抵抗 +##our +長く +クリア +コム +##組み +##ッズ +##クシー +Pro +留学 +##ティン +考える +数学 +Com +集落 +若い +プレミア +ドア +ワシ +大半 +LI +修道 +ソフトウェア +アクション +超え +こちら +##チュア +有し +コミック +募集 +申し +##デー +##ry +##ゼン +北西 +移住 +高度 +フライ +英国 +ヒュー +渋谷 +##シャー +空気 +見え +広場 +マス +反乱 +トーク +大賞 +ヒル +遅れ +##ントリー +Th +##キン +知る +##ate +めぐ +まさ +クル +もつ +人名 +クライ +超える +##リコ +パイロット +住ん +##AG +生息 +話題 +表面 +開か +資本 +至っ +感情 +集中 +Le +メッセ +装甲 +レコー +まとめ +マグ +予備 +東洋 +120 +##ib +数多く +ファイル +プラン +掛け +月曜 +ジャック +基づい +本拠 +##ED +将来 +護衛 +179 +Un +アクセス +1889 +突き +1920 +フィン +取材 +役所 +楽器 +はず +##ich +再建 +エジ +ボタン +平日 +暮らし +マリア +震災 +代理 +どこ +戦隊 +笑い +スタジアム +スプ +国王 +残る +##モンド +99 +東経 +ターミナル +##ーマン +バレ +満た +王者 +格闘 +チュー +規格 +がっこう +ムー +##から +八幡 +体験 +相撲 +聞い +衝突 +相談 +事情 +学者 +##ゼルス +テン +いか +コス +正体 +終わり +東西 +パーソナ +放射 +茨城 +議長 +先生 +##フレ +コロナ +電鉄 +中間 +72 +##ジット +引き続き +ベトナム +キャリア +議論 +ハリ +きょう +吹き +北東 +強力 +訪問 +終え +フット +手法 +##やし +教室 +名付け +##ログ +##フォード +##ect +締結 +##取っ +井上 +分子 +渡辺 +本編 +ロケット +ケン +ドン +過程 +##IR +##ーマー +保有 +##ニュ +01 +協定 +##トラ +##LE +諸国 +##ゴル +カタ +##ord +##ランス +##ph +個体 +集合 +居住 +記さ +北京 +提携 +##ビル +ネーム +エク +オーバー +1939 +##II +シート +当たる +##ワイ +##40 +ウェイ +目指す +重量 +しゃ +##タイ +応援 +次元 +##ack +##ねる +群馬 +600 +達し +週刊 +残さ +##合っ +受け入れ +##ンダム +暗殺 +レーベル +##レッジ +音声 +人形 +182 +カイ +翌日 +800 +深い +要請 +##OT +警備 +##ームズ +発達 +譲渡 +学ん +実力 +流行 +プロデュース +着用 +ハンガ +つまり +従っ +ポルトガル +オフィ +77 +ソビエ +##なた +地帯 +人生 +##ION +証券 +出さ +##リウス +箇所 +部下 +ワシントン +シャー +殺し +進化 +##AK +##ナン +動作 +早く +##カイ +各国 +ソビエト +際し +軍団 +取り上げ +生み +養子 +カトリック +歴代 +バスケット +さく +85 +戻る +クイズ +ごろ +天然 +ラグビー +##ff +181 +コミュニティ +守備 +入手 +男女 +##60 +ビッグ +ブラン +統計 +昇進 +世帯 +午後 +信仰 +悪魔 +傘下 +1937 +脱出 +##ass +公表 +和歌山 +幹部 +そんな +観客 +転換 +##違い +変わっ +従事 +確立 +##IM +ハル +ゴルフ +駅舎 +渡り +##ハー +アメリカン +限ら +グロー +ベルリン +##カス +##ヌス +初頭 +##ain +ペル +じょう +コメント +プロダ +おか +##ows +西側 +とう +売却 +離脱 +投入 +PR +買い +ドー +繰り返し +タン +ベン +幼少 +伸び +##AY +NE +発着 +手が +心理 +緊急 +両方 +平方 +多様 +手紙 +四国 +生成 +ソー +操縦 +ボーイ +沿い +##キャ +ユーザー +進む +終盤 +##per +普段 +中世 +池田 +活用 +モチ +描く +無線 +演劇 +史上 +良く +##チュー +長期 +##プス +王子 +義務 +##ドゥ +ソウル +##end +連携 +くん +規則 +収入 +境界 +初め +エジプト +##ast +全米 +Cl +側面 +敷地 +コラボ +取る +セレ +岩手 +解体 +スイス +セイ +末期 +ドゥ +ロバート +南東 +##ハン +サム +No +上映 +アイス +##Tub +ロサン +書籍 +##EL +ドライバー +投稿 +##ING +あげ +戦艦 +1936 +##プロ +選抜 +打率 +ギリシャ +たま +メガ +一切 +ロサンゼルス +参議 +ヒー +上げ +徐々 +興行 +商店 +##兵衛 +輸入 +先行 +Wind +コピー +女王 +##ーナメント +たと +正確 +政党 +上野 +社員 +ロス +88 +##ボード +人工 +発揮 +画像 +補助 +##ッピング +##フィア +ハンド +起こっ +全長 +接触 +リニュー +争い +手術 +##ーリ +##テイン +グランド +AC +ガンダム +現存 +ボディ +新田 +##IG +マジ +##ッス +アント +午前 +リニューアル +スティー +合意 +古く +キュー +爆弾 +大人 +ロング +態度 +栃木 +栽培 +パートナー +ウル +プラス +恐れ +1938 +##ボー +スピード +巨人 +リュ +暴力 +モスク +附属 +顧問 +##ベルト +国勢 +##pp +##立つ +レオ +実質 +ディレ +最多 +##マル +半分 +86 +機種 +伯爵 +はる +人員 +答え +ハンガリー +##分け +トーナメント +ネタ +働き +約束 +酸化 +構想 +アウ +解釈 +下記 +95 +コロン +社名 +##バス +##ヴァー +仏教 +職業 +73 +##70 +西武 +##コール +メール +働い +太郎 +金沢 +モーター +子ども +高知 +YouTub +戦死 +66 +終点 +授業 +自殺 +178 +ミュ +国境 +同期 +Am +BO +エース +##レル +##ver +##te +中山 +ランク +財政 +具体 +死ん +ヤン +シュー +予想 +殺さ +ブレイ +ブレーキ +コル +ジョー +しば +悪い +##の子 +複雑 +よい +現れる +防止 +連結 +赤い +##セント +頭部 +明る +クイ +渡っ +##シップ +アム +トルコ +パル +大手 +##ブレ +##ah +夫人 +評論 +78 +交代 +##ピア +##ey +隠し +ちなみ +SS +ファッション +##wit +付い +##たい +順位 +com +創刊 +##セプト +フィルム +北朝 +尋常 +構築 +##合う +##RE +下り +材料 +分かれ +160 +合同 +絶対 +授与 +活性 +守護 +恋人 +冒険 +##ロード +ドーム +キャッチ +バスケットボール +レコーディング +出走 +続き +割り +料金 +かわ +##立っ +修正 +神話 +災害 +ダメージ +寄せ +ロゴ +来る +アニメーション +駐車 +必殺 +決意 +性質 +ロン +##ミス +モチーフ +##ライト +##ly +ポリ +武田 +サル +会話 +MS +コメ +沿岸 +アタ +ハート +悪化 +類似 +##ens +扱う +##プレ +##稲田 +脱退 +##ルトン +たる +トヨ +保持 +##az +明確 +本当 +68 +##キア +修了 +##ルター +ドラム +整理 +ホイ +聞き +パーソナリティ +一致 +##ミニ +##入り +アート +バラエ +MC +AS +タンパ +在学 +##もり +両者 +キン +曰く +1935 +標高 +コア +措置 +ドラフト +81 +早稲田 +ステーション +シカ +単行 +オペラ +佐賀 +##ベット +##オス +##パート +02 +銀河 +##ない +1933 +Go +芸人 +様式 +辞典 +ヘンリー +違反 +血液 +##コー +止め +プロダクション +極めて +決まっ +起点 +関与 +##チス +小さい +メッセージ +公認 +##ウェイ +大将 +戦国 +退職 +勝負 +1934 +確定 +講談 +病気 +跡地 +エンター +圧倒 +監視 +上海 +経緯 +あらゆる +混乱 +出会い +Su +振興 +##つき +瀬戸 +優先 +74 +数字 +たび +回数 +上陸 +71 +コレクション +テニス +パフォ +レスト +称さ +ギリシア +再度 +会館 +次男 +対決 +トライ +マイケル +当日 +##越し +##シュタ +姿勢 +とど +改め +予算 +装着 +1932 +新規 +Con +いえ +絵画 +SC +放映 +Windows +看護 +リード +##レンス +モンゴル +82 +古典 +##ix +1928 +づけ +異常 +##ーナス +##テインメント +ラブ +大隊 +加工 +亡くなっ +利益 +##フィック +##オー +たか +アレンジ +センチ +時計 +発動 +引き起こ +見せる +##ニャ +ライバル +まっ +以内 +作者 +てる +EX +遠征 +印刷 +激しい +##サイ +著書 +差別 +主力 +木曜 +組ん +輸出 +支部 +ナンバー +後方 +フェル +##ld +##々木 +ゼロ +容易 +##どり +山梨 +申請 +通う +重視 +あなた +##なし +98 +鳥取 +帰還 +短い +生涯 +デス +##直し +ジャケット +収集 +書房 +本体 +##ージュ +団地 +即位 +しばらく +##上げる +開い +ガラス +ヴァン +##ore +石油 +##シル +1929 +戦線 +ウィル +柔道 +フィリピン +##ンバ +メロ +先輩 +劇団 +およそ +言及 +外部 +権力 +誘導 +関心 +推薦 +もっとも +上下 +ストリート +##90 +##プラ +違う +あき +滞在 +小野 +解除 +北朝鮮 +##ang +ボル +有力 +##セット +##三郎 +称号 +##ッパー +木村 +一員 +1923 +改札 +不詳 +測定 +下部 +ポート +先端 +SU +##ial +##クソン +##らえ +トランス +ワイド +深く +保守 +変換 +Gr +##フィー +恋愛 +##TR +FIFA +一家 +04 +北側 +復興 +05 +コート +象徴 +フリ +奴隷 +問わ +イー +イスラエル +印象 +とおり +##・デ +トヨタ +再現 +私立 +けい +##ツェ +Pr +1931 +##チョ +東側 +ディスク +##フォーム +スケート +子孫 +リチャ +参謀 +ジム +ブログ +信じ +依存 +半ば +すら +さえ +球場 +##回り +トム +学び +該当 +1927 +一体 +過ごし +著名 +##サイト +スカイ +させ +##たま +スラ +搭乗 +1924 +駆け +ニッ +アミ +スポンサー +振る +おこ +##oh +区分 +デモ +ジェームズ +出発 +千代 +06 +マガ +爆撃 +ミラ +併設 +インチ +楽団 +証拠 +##フス +空中 +##ケン +除い +ショップ +蒸気 +触れ +重ね +追放 +##之助 +白い +ひろ +出馬 +ゴールデン +ローカル +かかる +費用 +考慮 +有限 +ジャンル +火災 +劇中 +コンセプト +意思 +III +プリン +オーディション +中野 +黄色 +##メイト +上部 +ヒーロー +学ぶ +Be +敗退 +道具 +##ber +##んじ +##uc +気象 +電動 +##クタ +盛り +##GM +##ice +平安 +メカ +交響 +意図 +##age +ジャズ +for +高松 +##テッド +ミュージシャン +いけ +抱い +##ide +タッグ +出来事 +侵入 +黒い +下車 +くれる +ハム +同月 +太田 +03 +離婚 +外見 +打撃 +フロント +戻り +##センス +##ss +##ボル +##べる +願い +ソン +170 +国土 +キック +ヒロイン +##EST +83 +当該 +メン +辞任 +短編 +##AA +##しみ +ゴールド +##ッシ +##ノス +##ナルド +プール +幼い +##たく +流通 +ディズ +08 +単純 +もともと +不可 +引っ +再会 +複合 +長年 +直通 +当主 +リスナー +バイパス +GT +ファミリー +屋敷 +##ラント +異なっ +最近 +歌っ +ゴー +まち +ピン +ワイン +戦っ +##IL +学術 +委託 +入れる +##ST +ごう +##ンパス +修理 +抑え +故障 +コール +屋根 +上り +En +最低 +##ーマンス +##ライズ +クレジット +愛媛 +東映 +ノース +##ストロ +スコットランド +資源 +マネージ +87 +スパイ +許さ +探偵 +直線 +主体 +タンパク +部品 +にく +負担 +トイ +##リット +思う +示さ +エディ +台風 +1926 +TR +チャールズ +盛ん +96 +##向き +キャンプ +ドロ +保障 +##ルズ +移り +250 +通行 +YouTube +代替 +月刊 +音源 +シナリオ +##・マ +前期 +##ドン +##立ち +犠牲 +市内 +##リル +文献 +パフォーマンス +夫婦 +AV +一環 +抜け +##アイ +##one +92 +起源 +ませ +ユース +取り扱 +モスクワ +効率 +幼稚 +自民 +ディス +分岐 +気持ち +##ブス +同級 +ドライブ +突然 +記し +食べる +##OK +攻略 +nd +##ナス +ディレクター +84 +##iz +天正 +##ステル +怒り +ラウンド +当て +区画 +到達 +1925 +SF +快速 +入口 +キャンパス +批評 +突破 +伝える +大橋 +クラシック +##ヴァン +バラエティ +親友 +発掘 +##ジョ +##ネシア +ジェット +滋賀 +漢字 +700 +自社 +終わる +ポル +特性 +関数 +##ートン +##ザベ +中期 +地理 +##プター +##チェンジ +失わ +あろう +語り +言え +##ティス +報じ +スーツ +##サンド +信用 +って +菓子 +衣装 +とる +もし +コスト +分解 +育て +沿っ +##ft +Br +幅広 +##NS +住居 +ステークス +ウイ +パターン +ダーク +110 +67 +次々 +##EM +援助 +症状 +入力 +##ure +##ッケージ +ビー +マスコ +経路 +レストラン +リチャード +温度 +ポスト +今後 +全域 +南側 +##ong +起こる +射撃 +演技 +聖書 +ヴィル +訴訟 +配備 +ブラウン +合戦 +基づき +##ッティ +ケーブル +##かす +前方 +親王 +##ージェ +伴っ +タンク +##ポール +##ith +学年 +循環 +マイクロ +山脈 +発音 +単に +おそ +##ンチン +CO +91 +まる +研修 +近鉄 +春日 +ディズニー +175 +取り戻 +当たり +パッケージ +ケイ +ホル +##ンマーク +期限 +##KY +コンテ +デンマーク +解消 +ビーム +観察 +教員 +処刑 +ニッポン +並び +生じる +分裂 +##ンジャ +無人 +資産 +ピエ +故郷 +続編 +線路 +食事 +取り入れ +包囲 +日常 +国防 +なぜ +OS +会見 +あたっ +出席 +促進 +ファンタ +##qu +事前 +アブ +##PG +ジェイ +校長 +天使 +次ぐ +ライオン +スマート +1922 +オプ +全面 +たけ +行方 +既存 +ブック +閉店 +##ミネ +ナポ +落とし +シカゴ +エンド +総督 +松山 +##フル +動産 +##bo +借り +兼ね +##くま +抗議 +メタル +犯人 +建立 +平野 +英雄 +議席 +##下げ +89 +接近 +##UT +##ies +来日 +##ニン +回収 +##イナー +共有 +気候 +香川 +##・カ +神宮 +変形 +推測 +キャスト +領土 +Co +下位 +後ろ +進み +ピーター +みんな +文部 +家臣 +撤去 +受験 +折り +庁舎 +177 +診断 +塗装 +NT +##リズム +織田 +訴え +退団 +##受け +CH +司法 +タワー +デー +代わっ +NP +さくら +つか +マルチ +クリー +101 +角川 +ファースト +ベルギー +もち +##クトル +ミッション +Se +##ペーン +任意 +再編 +読売 +##っき +送ら +文明 +マイナー +5000 +##aw +1918 +ゆえ +立っ +日記 +水曜 +上演 +1919 +定着 +伝承 +79 +パソ +保安 +肉体 +##ちゃ +うる +ソニー +学区 +避難 +チェコ +決戦 +マガジン +##須賀 +##ite +総務 +タクシー +ラム +##モア +閲覧 +69 +エクス +中島 +93 +周り +##ウルス +とて +観音 +##man +所持 +##ire +継い +トレード +働く +スキル +発明 +##ポーター +ライセンス +インターチェンジ +地図 +DJ +走る +##止め +スリー +簡単 +在住 +##ウッド +中隊 +連覇 +ナショナル +##回る +バレーボール +ノン +国有 +##フェン +妖怪 +送信 +09 +キュ +気づ +らしく +忘れ +##ary +##ust +出資 +アマチュア +一連 +最新 +CP +前田 +3000 +後任 +1921 +功績 +##66 +フットボール +##アス +冒頭 +でし +抱え +開店 +##おう +怪我 +ドキュ +ミリ +疑問 +##ock +加わっ +双方 +宝塚 +##IP +特典 +ML +LO +##ネマ +岡田 +シリア +養成 +占め +取扱 +ファイナル +審議 +造船 +ショート +今回 +スタン +火山 +焼き +##OP +##なか +##つい +書記 +##47 +##しろ +不良 +挿入 +DS +ヤング +##シスコ +デル +SM +証言 +した +LIVE +記号 +出会っ +か所 +##ヘン +130 +ギャラ +いた +説得 +##当たり +ビット +安打 +FA +奪わ +かた +教皇 +AK +修行 +開館 +財産 +はじ +トー +攻め +##witter +独特 +ボックス +イスラム +試作 +Play +コンテン +AR +##アリー +##ジラ +##22 +ON +助手 +##まら +才能 +ラスト +最強 +バイオ +##oy +課題 +示唆 +##ug +宣伝 +想定 +演じる +海洋 +##チア +原題 +##ディングス +甲子 +##プル +##ンジャー +怪獣 +解析 +シャル +変わら +フォード +ツー +天王 +詩人 +##ond +近畿 +マレー +##ウォ +キャンペーン +用途 +仕え +スロ +架空 +Tr +##ニスト +ホー +ポップ +高級 +降伏 +ヤク +ガル +全線 +移民 +参考 +マリオ +##33 +##NN +フレーム +ざる +##ドロ +プロモ +実家 +捨て +キャスター +越え +三角 +##OD +ガイド +信長 +##ゾン +ch +経過 +素材 +カテ +工作 +ボーナス +##IA +チャレンジ +フィリップ +ラス +##WA +駆動 +成分 +認可 +##ish +##ach +表彰 +むら +厳しい +死者 +除き +死刑 +ポケ +フィンランド +北条 +しょ +リスク +パソコン +属性 +to +佐々木 +広い +打点 +##ル・ +##ica +ブライ +評し +実装 +大佐 +たとえば +テキサス +将棋 +He +選定 +##ミック +大名 +先頭 +短縮 +##ソー +のり +##tt +火曜 +実績 +あの +話す +士官 +リアル +正面 +退任 +##ase +ひとり +New +ガイ +言える +後者 +番地 +別名 +##se +ゲート +埋め +座席 +##ライン +自主 +ロイヤ +大野 +宇都 +男爵 +キャプ +田村 +カレッジ +固有 +1914 +味方 +プレゼ +要塞 +黄金 +えき +ニー +扱わ +ユーロ +手掛け +融合 +しも +チェンジ +AM +森林 +カウ +##バラ +決める +##チル +題材 +落語 +衛生 +セミ +ミッド +賞金 +Ex +ハワイ +派生 +並行 +戦時 +イラン +コミュニケーション +応用 +掲げ +質問 +無かっ +見解 +防ぐ +プラット +相続 +相模 +入院 +ウィーン +モル +歌唱 +起こす +パーツ +創造 +少将 +大西 +##バイス +北陸 +図る +コンパ +台車 +総理 +メトロ +通る +保健 +アシスタント +転じ +トレーニング +リオ +##当て +宇都宮 +##・ス +158 +勉強 +Wor +##ational +近郊 +粒子 +##取る +マスク +倒し +SE +取り付け +##っくり +アルゼ +##ャン +人数 +方言 +トラブル +##・エ +##ace +やすく +恐怖 +電波 +師範 +ウィン +スリ +歌う +上田 +##レオ +エー +運航 +厚生 +浴び +運輸 +##しま +出張 +難しい +外務 +近隣 +巻き込ま +警視 +キロメートル +回答 +需要 +ワイ +移植 +ジャイ +UE +1912 +ちゅう +端末 +遺体 +司教 +一帯 +140 +ロケ +##カラ +レジ +少数 +損傷 +提示 +Mus +駐屯 +スライ +疾患 +破り +地形 +受け継 +Twitter +いえる +郊外 +開拓 +ボン +封印 +想い +##sh +176 +AL +1900 +しれ +ガード +取り組 +ピンク +マリー +乗客 +非難 +例外 +従業 +##ヒー +アダ +若手 +送る +広域 +不満 +##上がっ +##つける +降格 +衝撃 +捕虜 +秀吉 +事例 +##イラー +##好き +主導 +多摩 +損害 +持ち主 +接し +売上 +特集 +関わっ +支え +戦力 +低く +##わし +##ジュール +別れ +提唱 +##らさ +救出 +併せ +努力 +1910 +KO +当局 +武将 +祭り +勃発 +正義 +カフェ +終戦 +とても +##ロジー +ノルウェー +国外 +合唱 +特技 +##しん +##やく +暫定 +##書き +最中 +秘書 +市川 +##ェル +体系 +##ory +1917 +雇用 +##tern +聖堂 +アルゼンチン +夜間 +MV +急速 +足利 +##KO +ローズ +行なっ +うま +連勝 +エンタ +グロ +放つ +数々 +反発 +##48 +つける +存続 +民営 +##ギュア +上級 +未満 +総称 +##ook +役員 +就職 +青山 +くらい +生存 +##フラン +おも +しゅ +IN +マイク +慶長 +若干 +Ph +##ージー +コンテンツ +成田 +要因 +##ラ・ +##UM +日々 +栄養 +わたり +合体 +苦手 +かける +ロール +##ove +ルイス +暴走 +分校 +町名 +Vol +ポンド +ごく +北米 +阻止 +改編 +##しゃ +空襲 +パック +ファイター +現行 +競争 +西洋 +友達 +アレクサンド +商人 +もらっ +ポン +Te +ヴェル +##ッキング +松平 +クリスマス +周波 +Dr +モール +海賊 +##われ +描き +レーザー +他人 +彫刻 +成果 +村上 +小倉 +サウス +CS +偶然 +エレクト +##ナショナル +ゆき +##21 +UEFA +山崎 +##ークル +南海 +二十 +紛争 +帰っ +中日 +大宮 +水素 +##エー +07 +軍隊 +向かい +ベー +迎える +一貫 +##ment +コムーネ +手がけ +97 +関わる +中川 +デザイナー +高田 +会計 +容疑 +##入れる +トーマ +阪急 +ウォー +三井 +##St +フィギュア +及ぶ +かかっ +特許 +がん +圧力 +簡易 +ゲル +バリ +日中 +若者 +ゾーン +##ワン +##int +ちなん +ガール +感謝 +##ッセル +ウェスト +長女 +##ai +女の子 +BL +1913 +ストライ +##ゲル +ヨー +上流 +検出 +##寄り +橋本 +ウェブサイト +同僚 +語る +ボクシング +切れ +Web +占める +##返す +表し +長谷 +168 +琉球 +近づ +1911 +サス +登山 +騎兵 +テープ +勲章 +レスラー +師事 +運賃 +取ら +##ヨン +ビール +美しい +車線 +##トー +並ん +立ち上げ +コントロール +アキ +##エフ +##VA +水戸 +##ert +カム +雰囲 +雰囲気 +##44 +オプション +したがっ +小川 +##ick +倒す +騒動 +てん +パネル +ポケモン +戦前 +評議 +Sc +マサ +##pe +##FL +Sch +読者 +##イルド +市営 +テル +レンズ +グレイ +開局 +和田 +レーダー +競輪 +##・ド +ヘビー +レン +威力 +五十 +インドネシア +オフィス +高齢 +And +家督 +逃亡 +CR +シンガポール +航海 +ふく +任じ +一旦 +##iss +サンタ +オリコン +上京 +ショッピング +インディアン +学位 +家康 +打ち上げ +カロ +決議 +構内 +憧れ +Me +風景 +##レード +権限 +高山 +延期 +じゅ +ついに +##ツァ +この頃 +救助 +北方 +コメディ +実用 +修復 +ベルト +改めて +うた +頻繁 +コンクリート +ソース +招待 +逆転 +かい +まん +王朝 +社団 +##タウン +スミス +召喚 +根拠 +反映 +打者 +JAP +アサ +立つ +財務 +HD +ホールディングス +出典 +間違 +保育 +高原 +官僚 +署名 +正月 +##リフ +ジャーナ +Ad +165 +坂本 +引用 +##ath +協同 +マックス +やる +タイヤ +降り +全身 +本店 +##まえ +豊か +仕掛け +オーク +ベンチ +出産 +##ッシャー +認める +相対 +小山 +応募 +指し +ショット +気付 +倒れ +削減 +請求 +ミュージカル +三振 +接する +マラソン +あくま +告げ +1908 +カンパ +船団 +##エット +修士 +海峡 +アンダー +もらう +小さく +終結 +トーマス +マニ +移っ +スカウト +医薬 +勧め +質量 +オーケ +ミル +##41 +空母 +排除 +##スラ +トイレ +コミックス +豊富 +放出 +Ed +補給 +函館 +大島 +当地 +宮殿 +供用 +Sy +豊田 +とら +目撃 +東海道 +##ジーランド +タッチ +療法 +##ドウ +ジャー +大韓 +繁殖 +創作 +老人 +ニュ +ペア +航路 +施さ +サイン +山陽 +エドワード +al +中断 +ニュージーランド +入門 +コマンド +繰り広 +旅団 +横須賀 +開放 +パンチ +走り +動員 +山下 +中将 +##イセン +マネージャー +オレンジ +喫し +ちょ +ボート +一郎 +行事 +ステップ +マップ +##レム +悪く +IT +国連 +小松 +##プレイ +##かける +ウッド +史料 +行なわ +BGM +訪れる +おく +##pt +関わら +野村 +##uk +##チック +カス +フー +プレゼント +メタ +岡崎 +魚雷 +本土 +編纂 +##フラ +イラク +いま +##九州 +コロンビア +北九州 +実況 +撃破 +挙げる +国籍 +装飾 +スタンド +ディーゼル +受信 +##メンタ +IB +##久保 +待ち +認知 +出土 +##ケード +##かく +##イラ +夫妻 +制覇 +半年 +有料 +閉じ +ネイ +##リダ +##・オ +ショック +JAPAN +あくまで +クリエ +##たび +東方 +##oun +##99 +##45 +度々 +浜松 +変わる +意向 +酵素 +プロセス +覚え +三十 +##ベン +一面 +1915 +わたる +ペット +地獄 +##ーノ +セルビア +名乗っ +縮小 +##切っ +Car +前日 +Col +ツール +保管 +##っかり +コンテスト +NC +義塾 +エリザベ +基盤 +語ら +補佐 +ドリーム +嫌い +同行 +心臓 +主流 +##ii +1907 +チェーン +##テーション +シンガー +感覚 +アルファ +魔女 +炭素 +##ヴィッド +インターナショナル +番線 +量産 +ねん +セー +##カリ +奉行 +強調 +踏み +大気 +告白 +瞬間 +飼育 +##スティバル +乗降 +高野 +落選 +ふる +HP +放棄 +125 +##apan +ギア +クロー +ウラ +レンタル +遭遇 +騎手 +キャプテン +女神 +三郎 +無視 +延伸 +マド +避け +上場 +式典 +徹底 +メモリ +積み +皇后 +妨害 +庭園 +##レオン +171 +ニック +配属 +##ースター +配布 +番台 +破っ +鉱山 +アリス +吉野 +君主 +##なう +MLB +名乗る +エキ +慶應 +アナログ +バイク +##ivers +好意 +OF +都合 +##ガス +品種 +##ネイ +##ence +-) +##ile +プロモーション +寄り +オスマン +ネオ +バレエ +渡る +正規 +クール +ビュー +不安 +伊達 +加速 +薩摩 +##ロウ +控え +移し +偵察 +フォーク +ヴァイオ +##むら +総会 +切っ +艦長 +飲み +魔術 +人種 +埋葬 +ワー +講演 +レディ +山地 +##まれ +亡命 +##61 +倒さ +##ps +ブーム +戦術 +削除 +変動 +突入 +##ae +ヴァル +##っきり +あさ +リク +制し +検索 +米軍 +限界 +フェア +不能 +My +船舶 +155 +寄付 +兼任 +161 +時刻 +乗せ +守り +魔王 +##わさ +##TC +休日 +容姿 +アトラン +ダニ +つれ +敗戦 +日産 +石井 +山岳 +ルーム +1906 +AP +容量 +UN +木造 +DC +通貨 +##EE +##ier +境内 +予約 +密度 +王位 +島根 +ロイヤル +発覚 +##28 +弱い +諏訪 +##上がり +墓地 +前提 +なくなっ +予測 +考案 +なれ +ないし +廃車 +張り +ダウンロード +##ee +##DS +アラビア +ランプ +日立 +1916 +先駆 +割合 +三浦 +担っ +##ラク +アラブ +評さ +##右衛門 +900 +オーナー +転向 +##取ら +実践 +後藤 +不正 +##クセン +回路 +プレス +アプリケーション +水産 +プロイセン +DNA +流域 +遊び +天体 +かね +激しく +フィル +##31 +確率 +##サウルス +入場 +集まっ +##ime +オーケストラ +戦場 +近藤 +成り +カテゴ +リバ +奏者 +直径 +カップリング +毎回 +壊滅 +マツ +広がっ +バランス +魅力 +種族 +##35 +改装 +1909 +東急 +外観 +##エラ +刑務 +レール +総裁 +157 +スロー +陥っ +ボード +変える +審判 +生き残 +ヤード +公社 +歌劇 +動力 +美濃 +シド +維新 +農民 +講座 +失い +イル +世話 +所蔵 +落下 +消え +ほしい +##エム +##マイ +##AX +##キスタン +ユニバー +下し +地中 +##アフ +外科 +混合 +おそらく +賛成 +入賞 +出店 +臨床 +cc +後輩 +アポ +河内 +##ont +##メンタリー +結ば +余儀 +##グル +ハンター +会津 +Ver +理想 +テクノ +斎藤 +フェスティバル +日野 +室町 +##KYO +##渡し +最小 +流し +スイッチ +ブルース +三島 +晩年 +マンション +着手 +博多 +スコア +ニン +横断 +領主 +##ブロ +征服 +##バーグ +当たっ +コンクール +##シオ +##IV +##とめ +La +成人 +黒人 +##ミル +ディア +ギル +謝罪 +りゅう +##思議 +宿泊 +##メル +ストーン +福山 +階段 +##テス +数値 +絶滅 +##ペル +大谷 +##付ける +フリードリ +りん +手伝 +パーティー +復讐 +独占 +車内 +隠れ +-』 +初演 +ガリ +もたらし +ラーメン +オレ +放っ +東宝 +背中 +売り上げ +叩き +環状 +Par +選ぶ +リミ +大切 +セブン +前線 +小屋 +妊娠 +自称 +配給 +コーヒー +レビュー +##ハラ +フェリー +視点 +主任 +Man +通学 +ドクター +墜落 +抑制 +##ニコ +誇る +ダービー +あわせ +図っ +着陸 +##ッソ +##ケート +婦人 +支流 +重賞 +##リヒ +on +逃れ +Joh +原理 +百貨 +陥落 +内蔵 +にくい +正解 +武士 +吹替 +ボストン +##25 +天才 +ベネ +プレミアム +みや +天保 +電源 +ようやく +サークル +尽力 +ドキュメンタリー +ゲイ +AN +##ium +159 +##チャン +久保 +文芸 +警戒 +公爵 +交点 +どんな +数え +ID +ハーフ +エンジニア +師匠 +拘束 +クラウ +TOKYO +置き換え +交際 +旧制 +観点 +##ニオ +比例 +Or +学名 +真実 +ルーマ +##エンス +SD +イリ +表題 +##ドラ +##モス +##もん +##バード +##ノール +ノート +##TA +イェ +並ぶ +運命 +##IX +IP +エージェ +教科 +カプ +##フィール +ルーマニア +ジャーナリスト +World +##Station +##ハウ +Japan +アーム +ファー +気温 +チップ +性的 +推移 +文章 +##アップ +メス +乾燥 +さいたま +CL +##がい +負っ +1905 +ヘリコ +向き +##rom +じゅう +##ニックス +94 +内務 +失点 +開き +座標 +水系 +青い +##TV +##・ク +##アニア +##美子 +スティ +いろ +変わり +山頂 +甲斐 +任期 +##はり +ナビ +リゾ +##掛ける +1897 +野田 +##テイ +ファンタジー +去っ +##ベニア +使える +体力 +役場 +間隔 +アプ +浦和 +武道 +釣り +##ost +##フォン +とく +上杉 +両国 +避ける +スピン +ワーク +##ニカ +ラップ +荷物 +パナ +不思議 +種目 +書く +引き継い +調理 +ナチス +ラウ +牽引 +##ネー +焼失 +踊り +プロテ +和解 +##リード +つもり +リト +##ound +酸素 +水上 +飾っ +内側 +グラス +##ail +App +##ナイテッド +大津 +調達 +##BO +馬場 +伊豆 +藤田 +死ぬ +囲ま +PlayStation +Fl +##IO +##ビリ +上手 +力士 +築い +ゴル +前回 +フリードリヒ +上院 +典型 +捜索 +同人 +定員 +物資 +##ライター +襲わ +JC +リベ +1903 +フロリダ +太字 +熱帯 +むしろ +安倍 +##ical +濃度 +珍しい +IM +##ux +双子 +ターン +1896 +##シュタイン +道場 +実在 +含ん +消し +紋章 +調教 +##ッスル +バカ +儀式 +伝わる +刺激 +歌舞 +源氏 +我々 +やはり +バット +加賀 +選考 +せよう +ミシ +アラン +##38 +##バイル +化合 +確実 +##oo +ツイン +保証 +##日市 +液体 +##詰め +##ann +化石 +無理 +キル +プル +在位 +##ビング +##TS +##チナ +プロト +##ウロ +前面 +夕方 +総長 +ヘリコプター +##デア +ゲージ +叔父 +表紙 +鹿島 +##セロ +近江 +レーシング +対照 +105 +スポット +リズム +介し +重力 +Ser +愛し +シルバー +喧嘩 +##かん +出入 +##UE +プラザ +予告 +神田 +五輪 +人格 +下院 +狙っ +##ロフ +##isc +##ベース +##さん +##テク +##ern +フィート +尽く +部族 +検察 +無効 +軽量 +##カンド +チュ +はら +エリザベス +捕らえ +キム +活発 +天神 +皮膚 +青春 +##リアル +##ウィン +パロ +南方 +コウ +ナン +同等 +##ax +プログラ +チェック +有機 +Wh +明日 +空手 +出撃 +コーラス +ダイヤモンド +クルー +海戦 +1890 +下旬 +読む +##・コ +欧米 +バイエル +調べ +山中 +看板 +信濃 +宮廷 +職人 +楽章 +ゆく +元気 +町内 +すぎる +同意 +まったく +牧場 +##いち +室内 +電化 +人事 +##ットー +主役 +1500 +1901 +制服 +品質 +交戦 +懸念 +演説 +論理 +##ミネート +面白 +白人 +169 +校名 +考古 +業績 +乗り入れ +ユナイテッド +##ビュ +ラリー +正しい +##ザーズ +##楽部 +甲板 +##ぐる +ビーチ +オオ +グレート +アベ +達する +長編 +敵対 +構え +ライター +ABC +天気 +##orm +三木 +公国 +福田 +電機 +ミラー +ターボ +##落と +外れ +なき +内戦 +立地 +車庫 +167 +アーケード +##なく +シアター +ハイン +大坂 +心配 +##回っ +周期 +115 +倶楽部 +重複 +NBA +##フランシスコ +##アフリカ +シネマ +高め +配下 +気筒 +阿部 +首位 +キス +要望 +##ash +教団 +ティー +##オル +DD +##ドイツ +ダイナ +人権 +ジョーンズ +スル +セン +付与 +##ンガー +WW +GO +アリーナ +アダム +ムーン +会談 +高架 +##ナント +サンフランシスコ +レイン +吉川 +プレート +勝手 +フォース +RE +しり +担う +シャン +あん +ゴム +##39 +季節 +ピク +見な +アルコール +ストア +土佐 +結論 +##ズル +学長 +インスト +出会う +NTT +贈ら +アルバイト +クイーン +侵略 +本項 +1904 +バーン +解雇 +身分 +##ョウ +サウ +稼働 +被災 +##32 +砲撃 +純粋 +勤め +ヘイ +進める +##67 +コラボレーション +体操 +南アフリカ +全般 +学問 +山城 +昆虫 +ロッテ +三河 +135 +買っ +みる +参入 +条例 +筆頭 +##oft +後年 +飯田 +##ーバー +##ニオン +ロウ +##セイ +退社 +アグ +京阪 +広報 +起こり +回想 +水中 +けど +抱き +カンパニー +アーカイ +##ool +祖母 +近衛 +ナレーション +付ける +エフ +渡し +ノミネート +込め +圧縮 +水道 +創建 +監修 +満州 +称する +読ん +集会 +青木 +ブルガ +無事 +##ram +かみ +きれ +闘争 +司馬 +著者 +大山 +最古 +##son +褐色 +センチメートル +ロマン +りょう +レスリング +役者 +ナポレオン +事典 +ふじ +事項 +歌舞伎 +行使 +野菜 +飲食 +##エア +##ロイド +後部 +##・パ +代行 +初戦 +数十 +今作 +就い +スーパ +電池 +##バーン +史跡 +デッキ +大塚 +毛利 +##ガース +作画 +##ina +建国 +配慮 +将校 +顧客 +ガールズ +食料 +姫路 +巡洋 +大衆 +##太子 +##ずる +ヘリ +喪失 +診療 +緑色 +婚約 +シグ +EP +隊長 +ED +通勤 +ジョンソン +コネ +降板 +カスタ +辞職 +中盤 +模型 +ペース +##しかっ +AD +下流 +追っ +述べる +乗員 +ヒトラー +バッ +##やす +恒星 +##ローズ +コンテナ +単語 +定める +##コース +長岡 +整数 +Love +はっきり +モバイル +##づけ +いれ +1902 +椅子 +車種 +##五郎 +ジャクソン +##amp +##ツィア +疑い +##プレス +客車 +ずっと +ガソ +しゅう +但し +施し +眼鏡 +##ガニ +川口 +##ズミ +大公 +ロマ +人材 +決して +言動 +日光 +薬物 +ケー +OP +松竹 +##デター +EC +台詞 +外側 +前者 +操る +発し +高木 +プラットフォーム +倉庫 +ファル +地面 +認証 +次郎 +分間 +グラフィック +MP +グレード +##ハイム +ブー +講義 +名鉄 +##ーニャ +法的 +ジャイアン +エミ +救急 +##ッピー +おき +抜き +断念 +漁業 +肖像 +結晶 +##mp +広がる +予防 +透明 +##ear +##着い +きり +走っ +##ペラ +学級 +##37 +運河 +Comp +介入 +ガソリン +ジョージア +もり +##打ち +土木 +##がし +福音 +こく +##まし +はるか +IV +住み +##RC +##ばさ +ミドル +出生 +高崎 +僅か +神殿 +ならび +##ダイ +ヤマト +歯科 +分かっ +官房 +スズ +探検 +受章 +ジェネ +リゾート +チョコ +従軍 +年次 +挟ん +ミュン +確か +大蔵 +盛岡 +生きる +東武 +長らく +外野 +挙行 +##捨て +天井 +支社 +マルクス +松田 +##シエ +##ネン +きょ +カントリー +商号 +管弦 +フィラ +在任 +個別 +滅亡 +##INE +貸し +##オケ +違っ +ウェル +島津 +##しき +##ウェル +歩行 +##・ハ +##Hz +無限 +##are +1898 +真っ +スターズ +みず +ゾン +ミステ +死体 +統括 +フロー +##ve +NEW +vs +##36 +SO +大変 +通路 +##ぼし +チベット +復元 +LOVE +検証 +NA +ジー +救援 +シンボル +照明 +##ージャ +騎乗 +##らしい +COM +ポケット +細川 +覚醒 +序盤 +##ナップ +救う +王立 +##ton +千代田 +Blu +シェア +公務 +増大 +冬季 +専属 +チャンス +重傷 +理学 +開く +名詞 +UFC +そば +バイエルン +農林 +Lin +大尉 +##ビジョン +コイン +半数 +クレイ +藤井 +バージニア +エンタテインメント +がち +優しい +長谷川 +##馴染 +イースト +主宰 +##old +受容 +対処 +目覚 +##リム +##ドー +PV +寛永 +降下 +新築 +併用 +全部 +立体 +##27 +暗号 +みどり +セーブ +民俗 +返還 +起動 +##hy +カート +繊維 +##24 +キーボード +海水 +路面 +討ち +同国 +##ばす +牡馬 +金額 +命中 +##ズマ +GI +敷設 +マジック +衰退 +1899 +砂漠 +Mac +教養 +耐え +黒田 +東南 +現状 +ダル +早い +Inst +論争 +##ス・ +ドメ +元禄 +東大 +スクリーン +##ction +トウ +改組 +##HI +上がっ +出雲 +海兵 +ブルガリア +AAA +##テネ +##引き +Rec +大好き +ライナー +同作 +回り +みち +歌謡 +アタック +扱っ +rd +本種 +Music +##ワール +集める +##ヴェル +##モリ +どれ +反射 +細菌 +改築 +大い +撃墜 +洪水 +たびたび +##揚げ +##ox +##act +##ノイ +ゴジラ +上回る +抗争 +松井 +沈没 +##左衛門 +無し +##iel +##ニョ +ウォーター +汚染 +発症 +データベース +荒川 +##シュー +住人 +併合 +EM +明石 +短く +呼吸 +John +こだ +グア +しかも +インテ +ライヴ +##ics +カラオケ +流用 +滑走 +特化 +評判 +##クトリア +施工 +##ノフ +##リエーション +特異 +親子 +石田 +シュート +マンガ +ヴェネ +ラッシュ +尾張 +統制 +##ank +##ron +みなさ +余り +ブリッジ +クリエイ +投与 +もん +##PER +##au +パーティ +##stem +BM +##リティー +おう +精霊 +ホイール +着工 +##込め +1873 +ボラン +1871 +奨励 +監査 +切り替え +歌い +浅草 +DE +##コモ +##ニズム +##ヘルム +GR +or +##land +筑波 +##ろん +可愛 +##・ディ +##ッポ +##リンズ +ハロ +モニ +従い +東芝 +模し +標的 +かず +カレー +VS +##ラト +シミュ +覆わ +公益 +恐竜 +##王子 +118 +生かし +芸名 +サンド +盗塁 +りつ +拳銃 +幅広い +バード +##リラ +幼馴染 +原料 +見舞 +欲しい +フォル +大地 +治安 +行列 +株主 +セントラル +中等 +##49 +水泳 +奪い +深刻 +MO +年末 +クエスト +インディア +住友 +有利 +##69 +##att +中核 +面し +##シェル +河口 +討伐 +大田 +ヨハン +配列 +省略 +伸ばし +##メラ +Live +##キュー +350 +銀座 +同市 +本町 +##どう +SA +楽天 +##EO +##ンジェ +##せん +殆ど +ストロ +##張り +ママ +正教 +##ジュアル +サンデー +尊敬 +##コロ +口径 +携わっ +させる +水平 +##フスキー +クラン +振動 +支払い +緩和 +こな +グッズ +##ムス +熊野 +##ジメント +リトル +幕末 +早期 +エレベ +小田原 +タイガース +ジン +本物 +傍ら +八王子 +商工 +報酬 +就航 +新作 +グローバル +あや +ほん +佐世 +残留 +港湾 +至ら +ドレス +ミズ +わかる +分散 +専念 +うまく +捕手 +佐世保 +誘拐 +クロア +メアリー +##AND +国務 +残す +##グロ +ガーデン +順次 +忍者 +##ゆき +イチ +関節 +メニュー +退役 +ミネ +##29 +RPG +ボウ +聞く +しろ +小島 +##ヴィス +クリーム +バンダ +大輔 +##コス +だん +豊臣 +##ンプル +ヴァイオリン +化粧 +ピー +樹立 +ギタ +ラジ +##ゼフ +朝廷 +##・バ +獅子 +Intern +固め +変異 +##モニー +問い +検定 +##TER +##AZ +イヤー +管区 +つながっ +ソル +フード +牝馬 +##ッヒ +セカンド +交易 +封じ +常務 +ビン +進歩 +左翼 +丘陵 +当然 +友好 +大久保 +中退 +人称 +BOX +満たす +厳しく +手続き +##les +果実 +後日 +El +解任 +窓口 +鑑賞 +定年 +異名 +失う +題し +ストック +シャルル +ユニバーサル +住所 +ダニエル +招い +体内 +##ッセン +済み +もたらす +上げる +推理 +##アウト +イエス +ベア +民衆 +科目 +郷土 +##切ら +##ERO +クロアチア +品川 +チン +明かし +景観 +浮か +切断 +ネル +開け +##・ラ +ルネ +原田 +シロ +安田 +製薬 +ローン +洞窟 +習得 +##あい +MUS +五郎 +ブレイク +##リャ +モント +明るい +##65 +特撮 +ペイ +レア +違法 +Ste +ダグ +乗務 +県内 +野生 +##olog +日向 +##ロニ +箱根 +奪取 +モーニング +見つかっ +インス +グラウンド +ボブ +ミックス +##ザード +##キット +博覧 +満足 +たん +適し +ギタリスト +Met +##ult +マカ +##・サ +##ゲーム +城主 +白石 +工芸 +広げ +親交 +法則 +上述 +奪っ +##レア +佐野 +取り組み +抜擢 +望む +ハリウッド +アンケート +生え +脅威 +##ros +1872 +PL +アパート +##34 +##っこ +##ローチ +アバ +ツイ +##ACK +セール +天下 +航行 +##リーグ +##ハイ +改訂 +毎月 +追跡 +大井 +異動 +リッチ +シュタ +割り当て +西口 +永遠 +##っち +##フィン +食べ物 +筋肉 +賠償 +リトアニア +比率 +要する +阻害 +艦艇 +キューバ +SL +##たん +##ode +東山 +##ゴー +ミュンヘン +京王 +赤色 +引き継が +人質 +シャツ +ガラ +ヨハ +育っ +隊員 +kW +##ount +技法 +アーサー +反撃 +コーポ +メイド +食堂 +an +業界 +バイト +大河 +ヴォー +ジュー +礼拝 +法務 +甲府 +##ood +##ale +##ome +CPU +生前 +##ata +AKB +##ame +ライフル +耐久 +繰り広げ +春秋 +入居 +ブロード +いじめ +捕獲 +##バキア +ジェフ +トニー +121 +部位 +ペンシル +発信 +噴火 +老朽 +虐殺 +##ART +ダンサー +Gu +商標 +被告 +神聖 +経歴 +360 +カウント +ケル +把握 +旭川 +ストレート +ジャイアンツ +幹事 +表情 +シード +遠藤 +意志 +ハリー +ホラー +##チオ +##ake +テーブル +京成 +締め +貫通 +##ペット +エコ +セガ +##af +GM +かく +廃棄 +横山 +詰め +ソングライター +暮らす +メロディ +リメ +ワル +一行 +バグ +城下 +転用 +##UB +水準 +##ミット +吉本 +初日 +グレー +府中 +背後 +##ウンス +ストップ +みつ +食い +プリンス +公民 +胴体 +警告 +111 +使え +排気 +##ヴェン +強度 +なかなか +ボクサー +告知 +1868 +熱心 +狭い +立川 +##ギス +##ild +貴重 +定理 +顕著 +挨拶 +遠く +アーカイブ +免疫 +標本 +脂肪 +##面目 +ランダム +取り組ん +##ance +小笠 +葬儀 +マネジメント +ワード +殿堂 +出品 +ファイト +数百 +物体 +マウス +##ンジョン +まり +乗る +呼びかけ +先代 +2023 +展望 +MBS +誤解 +##バッハ +##セフ +ヴィルヘルム +光線 +敗れる +玩具 +少佐 +排出 +落成 +##クチン +スプリング +ドール +後退 +柴田 +流出 +フュー +地質 +所長 +##edia +互換 +ブラッド +シドニー +出口 +##ky +メダ +ロイ +上空 +上がる +109 +Fran +マクロ +##ベンチ +権威 +チリ +造ら +マレーシア +TS +石炭 +アダルト +リレー +過剰 +アシスト +動く +伝達 +1886 +桜井 +興業 +再婚 +##ict +技能 +信者 +発注 +赴任 +妖精 +生態 +西方 +##ザス +RC +EN +医科 +望ん +指令 +介護 +##シウム +幸せ +##AB +今度 +世間 +沿線 +チケット +起訴 +139 +##oll +クーデター +西村 +Ge +支線 +船体 +めい +ゲー +##ork +垂直 +##yn +##ゲット +ビス +##ホン +セキュ +曲線 +譲り +きゅう +re +アッ +勝っ +白色 +予報 +##ject +シールド +加える +##itt +CG +わかっ +不要 +完結 +同志 +##ree +魔力 +取り戻し +入ら +ケンタ +好み +除去 +種子 +クリスト +哨戒 +近世 +PD +詳しく +じん +オハ +全集 +デラ +マット +##oci +128 +療養 +1895 +極端 +職務 +##ッシー +知的 +新潮 +##ream +ES +っぽ +ミー +充実 +定数 +技師 +追わ +真理 +##68 +Ab +パレス +多用 +グッド +Bar +マドリード +##ブリン +知り合い +ロープ +売れ +海底 +借金 +助言 +##セロナ +体調 +ループ +##ition +##っぽ +冷却 +##orn +超人 +ユニオン +##らっ +伊東 +繋がっ +防災 +ピエール +仕組み +招集 +##ogle +菊池 +牧師 +遂げ +移さ +バルセロナ +チャンピオンシップ +##ヴィン +集配 +都心 +半身 +セラ +ボイス +慶応 +ショウ +声明 +##寄せ +ハウ +大王 +Qu +モロ +個性 +生み出し +ISO +たっ +庶民 +誤っ +関わり +1880 +駅名 +##ott +まい +個々 +適応 +契機 +王妃 +申し出 +神学 +##抜き +マーティン +判事 +##mer +電磁 +アルゴ +首長 +唱え +##レスト +国分 +弾薬 +ロビン +##ガイ +入植 +因子 +守っ +満了 +##ータス +ライブラ +同性 +最寄り +ぶん +支所 +浄土 +エージェント +岩波 +性別 +1875 +Sm +タマ +島田 +代々 +領地 +##ise +1892 +親衛 +セッション +太夫 +##ose +厳密 +特番 +平面 +留まっ +もらい +タル +法令 +##eat +八戸 +同型 +岡本 +スティーヴ +##えもん +拉致 +思考 +##AI +三田 +加わる +##ニーズ +##ヴィチ +立憲 +アルメ +1878 +USS +マスコミ +成し +アナウンス +ピース +中旬 +タイミング +上司 +小泉 +##アント +1893 +ブライアン +FR +原型 +突撃 +##まさ +リボン +暗黒 +1887 +108 +##ERS +マーケット +探索 +襲い +ネコ +勇者 +干渉 +捉え +摂取 +日米 +広大 +低迷 +ピッチ +いし +##pr +##まい +##切る +もちろん +付加 +チームメイト +帽子 +芝居 +NO +明かさ +都立 +骨折 +リメイク +On +所得 +海域 +ドメイン +準々 +符号 +##ベリー +##ower +Is +釈放 +##irl +精度 +ムス +キリ +##CE +備える +##シスト +##IE +まつり +##シオン +見なさ +家系 +##ヴィア +アプローチ +武蔵野 +HE +117 +水野 +For +王女 +##ホール +らん +##KE +All +##ベート +旅館 +祝日 +あお +サイクル +マスコット +##ポリス +NS +デュー +望遠 +with +ドラえもん +なす +いす +週末 +解答 +ノベル +アンナ +ワイルド +ナイフ +ナイン +夏季 +##26 +##チェスター +倫理 +視覚 +ダブルス +勢い +入れ替 +しっかり +##四郎 +本田 +自信 +不振 +##ホー +アンテナ +ひら +南極 +対面 +ワークス +サーバ +スワ +不動 +こん +新しく +エレベーター +トマス +レク +ホンダ +公的 +シャトル +メリー +正室 +##46 +増設 +台北 +届け +ヴァージ +##ナミ +##ープル +ウエ +ビート +##リオン +内野 +怪物 +##セッツ +未だ +くら +##リュ +次官 +面倒 +##ナーズ +安政 +引く +つながる +ペルシア +皇子 +豊橋 +活かし +湘南 +##ッセイ +タカ +手前 +あし +金庫 +ギャグ +小笠原 +わから +他社 +加わり +概ね +##MS +やら +美人 +アイデア +麻雀 +Op +かぶ +ひろし +オイル +カレン +セルフ +ペー +太鼓 +川越 +##メット +抽選 +マサチュー +連動 +紅白 +船橋 +マサチューセッツ +ホット +重大 +##MA +だり +東口 +金銭 +NAS +WBC +飲料 +##コル +ヤクルト +##ベンチャー +AB +右側 +##ッラ +トロン +佐久 +浅野 +Mk +列島 +爵位 +フラッシュ +Google +忠実 +##合わ +駐在 +##リアス +富田 +漫才 +1894 +メー +ブリー +良好 +ウィリアムズ +ディスプレイ +バナ +今井 +打席 +市制 +採択 +##つく +クラスメイト +AI +1884 +##・イ +パシ +YO +和泉 +越後 +サーキット +") +母音 +院長 +テキスト +パロディ +アース +競合 +症候 +ウェールズ +れい +鎮圧 +不在 +交付 +145 +ベースボール +イーグ +我が +151 +潜入 +力学 +払い +集英 +シフト +挑む +河原 +探査 +##ロック +光学 +宣教 +メディ +レオン +撃退 +アドレス +陣営 +振る舞 +対空 +年金 +根本 +神々 +農村 +パーセント +エントリー +イスラーム +薄い +難易 +アイランド +反面 +推奨 +火星 +1885 +ムービー +てつ +すみ +ナム +下関 +組み込ま +4000 +Jr +一気 +突如 +レンジャー +浮上 +立法 +##ポリ +カーブ +パンク +藤沢 +皇太子 +露出 +合理 +リタ +##ッサー +##ニル +でん +ゲン +水域 +都内 +##42 +探す +西暦 +ベッド +サンダー +バルト +懲役 +見送 +名乗り +恵まれ +アピ +##anc +剣道 +演習 +##OCK +教区 +策定 +果て +羽田 +##ous +中京 +##ッペ +##デルフィア +使者 +最適 +アール +1876 +デバイス +チャンピオンズ +##ハム +1891 +EU +基金 +電撃 +コンスタン +OVA +逃走 +頂点 +Gre +##わけ +前橋 +実戦 +フィラデルフィア +稲荷 +1874 +同校 +##ノコ +##ark +1870 +平行 +見直し +日程 +浜田 +分から +##とり +宮内 +掲示 +高める +##ンドラ +教諭 +ブルック +太子 +明け +LE +カジ +##イング +やめ +##明け +先住 +那覇 +要件 +##ッシング +##だい +任さ +右手 +絵本 +吹き替え +撃ち +駆使 +公募 +内田 +農家 +##ward +押さ +プログラミング +##すけ +引き上げ +角度 +TKO +iP +寛政 +苦し +ターゲット +ネー +##ade +##ere +焦点 +識別 +復旧 +1888 +1869 +電圧 +##リウム +テレビジョン +はな +サト +マウント +アドベンチャー +BE +熊谷 +##けん +JA +享保 +制約 +本国 +出荷 +聞か +花火 +名人 +##ames +氏族 +気圧 +陰謀 +##pl +横綱 +##ましい +##enn +対称 +119 +Apple +ヘア +ダンジョン +ピーク +辞退 +方程 +淡路 +思い出 +狙う +比べる +総額 +部長 +遅く +コンピューター +エロ +同局 +砲兵 +##がく +ドミニ +感じる +格納 +##ギン +ホークス +##oot +htt +津波 +年少 +許し +助ける +爆破 +Ac +呪い +各社 +染色 +仮想 +受け取っ +##HS +引き起こし +マリン +ココ +デン +校区 +##ピュ +##23 +クリスタル +新曲 +注文 +酒井 +ナイター +かな +会合 +##渡さ +##休み +石原 +ビジョン +誇り +町田 +##グラム +1879 +大いに +##ラド +わたし +ray +定時 +##抜け +TOUR +志願 +流さ +赤坂 +農場 +インパ +単一 +発現 +誘い +##HT +ヴェネツィア +橋梁 +習慣 +転校 +アイヌ +がわ +住吉 +消化 +CF +ボランティア +伏見 +フェイス +ブラウ +キット +売買 +##プライズ +##ung +会っ +可決 +引き起こす +取り扱い +エクスプレス +きん +すず +過激 +リモ +各駅 +背負 +調節 +改定 +燃焼 +メソ +オタ +池袋 +As +イノ +##ords +SUPER +変遷 +元素 +増し +ヴァイ +##ジェリア +お前 +工科 +最期 +##ドルフ +正当 +##ATION +集まり +退学 +寄贈 +##DA +保全 +##ミナ +帰り +債務 +市販 +想像 +累計 +射殺 +引い +増強 +密か +待っ +DR +客員 +ポスター +喫茶 +母体 +セキュリティ +##リク +##HO +##もの +pro +##コフ +タイムズ +振り返 +抱く +ウエスト +量子 +ラフ +中東 +土壌 +さき +バリア +得票 +##ちに +RS +サクラ +木材 +法廷 +しき +タブ +マキ +##上がる +山内 +音響 +たけし +##und +管制 +貨車 +就役 +トゥー +収益 +発祥 +目立つ +スモ +##ヒト +ギャラリー +拍子 +珍しく +##回し +スタンダ +苦労 +##タミン +##エゴ +##ュル +##がわ +##ley +繰り返す +本堂 +薬師 +##さと +アパ +セリフ +ワクチン +##ke +磁気 +マーケ +排水 +狙撃 +服装 +せよ +寄生 +バク +馬力 +##up +サンク +ピアニスト +IBM +不全 +##トリー +ふた +1600 +##ぐるみ +傾斜 +投球 +本郷 +たかっ +カウン +ジオ +仮説 +運搬 +##クトリー +ベリー +リース +星野 +##GA +役職 +##ハルト +とりわけ +番手 +Gl +ボリ +秋葉 +System +側近 +共著 +大神 +奪還 +打っ +127 +バッテ +欠点 +貨幣 +ケア +##ans +##row +##・デ・ +作動 +安藤 +小隊 +薬剤 +ポンプ +##ディアン +シングルス +棋士 +mi +pr +シベ +支える +新生 +あか +ヨーク +出入り +取れ +ミン +幼児 +Cr +jp +時折 +並べ +大森 +カ国 +わが +パト +右翼 +急遽 +損失 +##88 +子爵 +##ハンマ +##ぼす +##フィールド +UF +##ana +##ンスク +バート +分かる +禁じ +##ゥー +卓球 +巡る +##ジャン +南京 +##ェン +オフィシャル +本質 +自作 +シンク +弱点 +激怒 +##バマ +後楽 +##デート +##討ち +宮本 +川上 +彗星 +救済 +飾り +ニコニコ +気味 +単なる +多少 +軽減 +JRA +Off +三好 +宝石 +おと +##own +明るく +##えて +チェル +コンビニ +努め +支給 +水路 +BR +Univers +危惧 +実態 +ボルト +チャイ +MUSIC +sh +抜い +斉藤 +##ign +制圧 +弘前 +輩出 +巡っ +##LD +##よし +矛盾 +永久 +##テレ +殺す +##yl +辞め +グラフ +エスト +公会 +造り +シェル +ぞう +##iam +FL +市電 +両手 +左側 +107 +悩み +ONE +##いろ +アロ +サント +テイ +プー +寄与 +##タール +奇跡 +書類 +天国 +秩序 +##ara +エンターテインメント +ハナ +過ごす +丸山 +合い +秩父 +中田 +貧困 +##スカ +レシ +増える +惚れ +内海 +家老 +アンソ +内陸 +あだ +ボウル +所領 +移設 +##ワーズ +ぼく +ヶ所 +ウィーク +前進 +Mr +オマ +情勢 +##ジウム +##ハンマド +Ass +ビリー +出題 +早朝 +スプリ +by +真相 +越前 +プライベート +バーク +マイン +##43 +モリ +有馬 +育ち +菩薩 +クラーク +., +始動 +楽しむ +グレン +正常 +"( +##通り +寿命 +商事 +日蓮 +グラビア +##ビッド +ユーゴ +エリック +白鳥 +イレ +久留 +乗組 +ゆかり +割引 +ライオンズ +冷静 +円形 +北口 +永禄 +##UL +決着 +##和田 +具合 +旗本 +転写 +マーケティング +火力 +##押し +##リューション +名目 +絶望 +ウルフ +##シカ +幽霊 +招き +ビートル +歌わ +##ネタ +笑顔 +西鉄 +##me +宇治 +緊張 +カルロス +中立 +##・ロ +革新 +魔物 +実写 +因ん +ティア +パレード +中佐 +), +イカ +ハミ +ピット +真言 +調子 +##ックル +コック +入隊 +戸田 +括弧 +止める +付く +##ナイト +1881 +CC +##かせ +トランプ +とん +キャップ +バッテリー +サマー +モンテ +##rans +103 +##チンコ +香り +撃沈 +##ts +##ディン +学士 +##早く +リクエスト +機材 +没し +踏襲 +##ヴィヒ +さか +デッド +現職 +##ダウン +##テイメント +ドコモ +好評 +強盗 +プレーヤー +DO +三塁 +佐伯 +##ヶ谷 +1882 +発する +二塁 +##マラ +Cor +Net +外伝 +ナル +世田 +対峙 +工程 +繁栄 +##ほん +従う +被っ +西宮 +美容 +阿波 +##レール +怪人 +BB +ルパン +渓谷 +みなみ +オム +治世 +素晴 +電流 +ヴォル +コンパクト +常勤 +木曽 +##エス +斜面 +##バース +##マト +MVP +天候 +持続 +陸奥 +中原 +拒絶 +パイプ +##ife +平等 +松尾 +頻度 +げん +タバ +もうけ +バリエーション +リポーター +ポルノ +砲塔 +Air +千歳 +##ディス +Part +##ドール +シニア +起きる +先進 +功労 +専務 +知名 +転落 +Comm +つとめ +ネク +##ons +こんな +エール +任ぜ +医者 +WOR +パール +優位 +公司 +同地 +間違い +世田谷 +カブ +vol +吸血 +安芸 +Will +ゾンビ +一宮 +運休 +マルコ +マニュ +弥生 +逃し +駅伝 +梅田 +決断 +アンリ +ペンシルベニア +先祖 +トリオ +##ドニア +##ニウム +バスター +有形 +松原 +記す +バンダイ +先駆け +鶴見 +##ます +ジェン +ミラノ +厩舎 +政務 +津田 +退官 +##・モ +BBC +目論 +##タイプ +会い +校歌 +著しく +##ほど +アビ +広がり +水雷 +##ラーズ +ar +口調 +MF +好ん +起工 +DM +化し +長調 +##デント +アップデート +アーク +本数 +野党 +常識 +見学 +ストラ +後世 +中津 +ボーイズ +スケール +ゼネ +初出 +泣き +飛ぶ +フォーム +ねじ +原稿 +文政 +真珠 +##ESS +田辺 +開戦 +ジョル +返り +一見 +植え +楕円 +兵力 +帯び +##ツォ +テオ +小売 +流入 +直轄 +1200 +オリックス +ろう +リム +じょ +倉敷 +没後 +古川 +アンティ +カウンター +LP +四日市 +種別 +高岡 +##サギ +##返さ +Mic +中毒 +傭兵 +高まっ +フェリ +ゴン +重点 +領事 +社内 +隠居 +##フェル +コミュー +立た +##バック +めぐる +##ヌー +チャージ +アフガニ +コラム +兼務 +運送 +102 +141 +We +軍艦 +門下 +アトランタ +サク +盆地 +絶え +##BI +シミュレーション +気動 +アフガニスタン +つる +国語 +捕食 +首席 +ノイ +追悼 +##VER +アルメニア +近接 +Rob +リサ +##ぱい +マント +本願 +軍用 +##ナラ +継ぐ +RO +すす +再選 +現金 +金子 +次いで +こなし +オハイオ +BEST +土器 +ボーイング +スタンダード +必須 +##AF +のりば +オカ +好む +##レッド +プロテスタント +##UC +しの +ハンドル +教える +高層 +##gr +孤立 +##ニエ +落とす +丹波 +党首 +難民 +ディオ +北上 +及ん +虐待 +##way +狩り +テイラー +大川 +安価 +適合 +##のり +すけ +ウー +囲碁 +工房 +高島 +由紀 +賭け +アテネ +ツッコ +乙女 +収穫 +こども +フォーマ +稽古 +##ヴィル +ツァ +載せ +Inc +倒産 +狙い +##HC +大関 +悲劇 +英文 +帰る +プリンセス +アウグ +-」 +##ハウゼン +利根 +International +こなす +採掘 +郡区 +実証 +軍勢 +##ENT +上方 +秋山 +##チカ +##ヶ丘 +誤り +さらなる +クモ +パキスタン +如来 +播磨 +森田 +町域 +苦戦 +金剛 +##シティ +タイガー +##サンダー +Mi +ドリ +Mo +基調 +警部 +マケ +真面目 +ちょっと +##roid +金田 +日付 +##ハウス +##ino +アカウント +告発 +行進 +鳥類 +とどまっ +最上 +##UD +アンドレ +Tom +出向 +幾何 +##ブリッド +腫瘍 +通商 +##ari +##ECT +LED +実体 +動機 +##キュア +詐欺 +野外 +##フルト +司祭 +掘り +ばら +スラム +読書 +チーフ +八木 +標識 +水力 +クラフト +Pre +##ヤン +リュウ +リミックス +執政 +##KA +レーン +偉大 +##ヴァル +マニア +石垣 +PA +犯行 +##KI +##GB +##fer +伊賀 +組む +美女 +邸宅 +重い +##ナ・ +##ケイ +サロン +か国 +##ーレ +破綻 +破産 +還元 +##下ろし +再興 +奪う +牧野 +産地 +##ゆみ +でしょう +体格 +暴行 +アジ +モジュール +襲名 +##ini +サンディ +欠場 +伊予 +##ソル +小田急 +##port +##ATO +シップ +吹奏 +御所 +歩道 +白山 +博し +擁立 +造形 +河野 +町制 +赤字 +フォックス +センサー +##ツィオ +ゆり +血管 +##ave +担任 +残存 +ザン +アーチ +南口 +##リッシュ +フェニックス +インディーズ +138 +Per +スノー +ホスト +勧告 +148 +一斉 +クリスティ +##able +ピラ +##アミ +教官 +聞こ +返し +アルミ +自覚 +踏まえ +鉱物 +セリエ +忠誠 +時々 +ジェリー +作風 +理念 +酒造 +##ロル +一撃 +大石 +急激 +替え +朝倉 +ヴィン +6000 +多発 +昼間 +地蔵 +##ウマ +##づくり +陽子 +##カーン +見事 +##こと +せき +ゴースト +創始 +独裁 +蓄積 +キラ +上旬 +蜂起 +##ピング +1877 +ブン +交わし +大事 +リーチ +正しく +ブロン +入部 +##シナ +スケジュール +ワーナー +AFC +EAN +友情 +多大 +書誌 +113 +なつ +WE +生理 +間接 +投下 +船長 +プロフィール +GB +全車 +##ys +ビクター +指数 +##ダーズ +両側 +自国 +補強 +104 +ドラゴンズ +押す +##PS +フロア +at +コーン +運ば +##ある +もも +食糧 +220 +車輪 +一目 +勘違い +弾き +手続 +追う +149 +セラー +愛情 +it +視察 +進展 +カツ +ポニー +増やし +飛鳥 +ex +エマ +エグ +ルナ +ピカ +動詞 +家屋 +ウイング +ユリウス +元帥 +狩猟 +##ator +DF +西川 +高麗 +ハイブリッド +AA +裏切り +目覚め +和平 +招聘 +##we +亡くし +勇気 +ブレード +首脳 +##・ダ +137 +動脈 +Ind +初版 +客室 +広瀬 +移る +集積 +##・フ +仕える +失踪 +スープ +##はや +##ファン +名づけ +変数 +占い +検事 +代官 +液晶 +破損 +オブジェクト +とある +オファー +パパ +国産 +放置 +目黒 +負う +イブ +タケ +##トリウム +生育 +著し +訪ね +フランシス +##ato +##ローラ +旗艦 +那須 +116 +名所 +##ネーム +##ヴィー +ユーゴスラ +ささ +警官 +入れ替え +おん +すご +ハット +冠し +格好 +ペルー +ムハンマド +直営 +諦め +賃金 +Mag +学部 +触媒 +髪型 +One +セックス +四郎 +Wii +たろう +当社 +AG +FF +SNS +待機 +##ma +向い +痛み +ファミコン +タラ +官位 +尾崎 +鑑定 +ダイア +鳥居 +##ラード +1800 +Gen +ドッグ +左手 +##ジング +次期 +フォワード +Res +##ひろ +ダグラス +ブドウ +知能 +1883 +ノーベル +オーディオ +自立 +選び +##トレ +##二郎 +ハンマー +転送 +農学 +クラウド +告示 +##デリック +後援 +皮切り +##ータル +VTR +au +合法 +広まっ +手塚 +生体 +竹内 +風呂 +麻薬 +うら +銃撃 +ジョニー +クリスチャン +大村 +書簡 +豪華 +##立た +玄関 +オートバイ +バト +疑わ +平田 +##co +シェイ +エルフ +ハド +松下 +##セッサ +##ava +南端 +計測 +##作り +##ARD +僧侶 +小児 +##AGE +ばん +わか +受託 +行か +駿河 +##ぼう +堆積 +斬り +##タス +##ラスカ +TD +日高 +表さ +##ごう +Bill +ラファ +##ink +Char +ムスリム +おかげ +基幹 +##ンガム +Day +入会 +頼朝 +アントニオ +コク +ハマ +孤児 +導い +穏やか +管内 +遊撃 +引き分け +ケネ +刻ま +愛好 +最長 +三宅 +乗用 +##もそ +ベルク +##替える +特有 +運び +アーマー +セク +名門 +本尊 +ふれ +全曲 +青葉 +イエロー +がた +そもそ +そもそも +射程 +有罪 +112 +ウィルソン +モニター +フレン +テール +上限 +砂糖 +カザ +党員 +常陸 +釧路 +##ヶ原 +遂行 +##ナウ +主将 +組ま +鉄筋 +##つか +NG +フロン +Ann +皇族 +内藤 +観戦 +触れる +下げ +時空 +ニックネーム +専修 +複製 +抑える +幅広く +一塁 +脱走 +うつ +MR +オックス +石橋 +##ya +##ita +ジョン・ +ドナルド +バブル +UC +シチ +井戸 +大社 +媒体 +道徳 +メイク +主砲 +据え +食用 +##やま +210 +一門 +予言 +フォト +公布 +松浦 +##ーヌ +とくに +##マーク +武術 +がら +##ラマ +ha +リック +勾配 +南米 +##td +##her +##パール +上がり +おじ +奇妙 +閉校 +##レージ +デヴィッド +まれ +数列 +回っ +封入 +有無 +道中 +ジョセフ +ME +War +田原 +迎撃 +少尉 +年上 +百科 +##ピオ +ソード +容器 +じゅん +ミカ +相違 +ne +展覧 +換装 +異例 +レポート +平凡 +ぼう +##サイド +青色 +おさ +ノット +一角 +西ドイツ +アピール +ルーキー +同居 +本多 +ぎょう +のび +差異 +役目 +本館 +##ッケー +チーズ +750 +休暇 +多額 +順番 +ふるさと +ジル +公衆 +納言 +生没 +祖先 +バーグ +パシフィック +加熱 +意気 +##がみ +##ブール +##もう +##ett +##osh +Ag +サマ +ビア +御殿 +矢野 +追求 +##ng +にほん +出港 +ドロップ +NCID +ケンタッキー +テック +##ゾナ +登記 +カプセル +ユーゴスラビア +コンプレ +MT +ソニック +参事 +くま +屋外 +町長 +フェラー +鳥羽 +##rum +本州 +真田 +突っ +ハリス +位相 +##ka +WA +紀伊 +NFL +中型 +郡庁 +浸透 +スロット +知れ +講習 +コミューン +迫っ +##ベール +UP +伝わっ +楽譜 +131 +満たし +Android +エッセイ +遺構 +##ric +##ited +題名 +##グアイ +かかり +パウ +従兄 +くに +ダッシュ +アドバイス +きょく +コーポレーション +セグ +戻し +補償 +##yo +##ンジュ +フランツ +内装 +##ラート +侵害 +ハインリヒ +ボーン +採取 +##ビット +##LC +公安 +概要 +語源 +##LS +エビ +グレゴ +ミスター +通い +1860 +la +揃っ +郡山 +たくさん +Night +ニア +パチンコ +化け +クォ +フォール +生没年 +出血 +鎮座 +##ボーン +##フェクト +##ッケン +SR +連敗 +##ual +岩崎 +新興 +中尉 +史学 +親善 +醸造 +##焼き +シャイ +アーキ +ミステリー +ラク +営む +情熱 +拡散 +リン酸 +JP +きち +新井 +親族 +寸前 +津軽 +テネ +神道 +##ベック +たた +##デイ +特攻 +単体 +受付 +王家 +##AST +cl +複線 +##リッツ +ストレス +ウィキ +RA +改題 +木下 +決まり +##ームス +フランソ +クローン +気づい +伝記 +##切れ +小沢 +スティーブ +エフエム +工夫 +村田 +豊島 +階層 +モナ +半径 +吸い +食材 +8000 +わざ +ハイド +実務 +民事 +測量 +セールス +加茂 +抹消 +踏切 +追撃 +天平 +##ごと +プラスチック +いん +反論 +##ラシ +デジモン +始発 +演算 +ブリュ +ベクトル +全日 +服部 +疑惑 +高温 +##lex +屋上 +成る +シベリア +崩れ +閣僚 +JCT +ビートルズ +代謝 +新町 +ソマ +松江 +通知 +ゆめ +民放 +ヤマハ +あきら +擁護 +##わす +129 +ふさ +八重 +転生 +ジェイム +つながり +NET +エウ +トス +他者 +国体 +入り口 +ダイエー +##グラフ +##ナンド +ファーム +仲介 +ラインナップ +増築 +取り戻す +ボム +政界 +日本橋 +就く +一生 +協奏 +小樽 +山陰 +馬車 +106 +Open +女流 +##ゥス +パズル +大夫 +金色 +##デレ +襲っ +フェン +きら +舞鶴 +##キンス +ハーバード +動向 +国旗 +めぐみ +常磐 +##ニティ +Amer +ボケ +グローブ +NEWS +略奪 +##ALL +OB +四季 +控訴 +代役 +詳しい +難しく +PK +テー +工藤 +樺太 +侯爵 +台頭 +##box +切る +愛する +みたい +方形 +農地 +写本 +##・ブ +##ism +右腕 +製鉄 +ちょうど +Je +ソックス +列伝 +##ナタ +組み立て +インディアナ +迫る +Har +ホロ +任せ +桐生 +決まる +縄文 +デビル +ツッコミ +リハ +島式 +ドラッグ +CEO +便宜 +債権 +学芸 +紙幣 +ドラマー +バルブ +Pa +呪文 +解明 +下野 +田園 +かし +ノア +付随 +巫女 +##せい +有数 +つくば +北野 +##ントロ +喜び +武力 +エム +リフト +エリート +亡くなる +リュー +婚姻 +##ald +人文 +強引 +##なら +ニュージャ +##マックス +別府 +依然 +##デュ +サイバー +アシュ +シンプル +ナトリウム +イラストレーター +NPB +間違え +行える +Linux +久留米 +反し +木製 +ケネディ +除外 +離れる +ユニフォーム +ボイ +利点 +中西 +##ane +付き合い +常連 +究極 +あだ名 +sp +大原 +茶屋 +アルゴリズム +もはや +樹脂 +艦船 +集まる +##ナード +灰色 +薬品 +Ro +##ッテル +##バリー +天満 +母艦 +越える +ISS +ビジュアル +枚数 +与党 +図ら +##que +ダート +器具 +嫉妬 +家政 +小柄 +Her +和名 +柔らか +発車 +##ius +不利 +自在 +##カナ +##YS +147 +ウズ +当事 +##・グ +カテゴリー +仲良 +##テール +アミノ +クマ +ハンス +志摩 +クラッシュ +見つける +一色 +掌握 +軽い +在日 +NASA +家畜 +レジスタ +機銃 +王室 +途上 +Ltd +魔界 +##テラン +##じょう +見守 +##ony +アレクサンドル +戯曲 +意義 +正統 +順序 +カタル +遅い +隠さ +台地 +強豪 +骨格 +デルタ +リバー +書院 +##タゴ +##・レ +グリー +##ンドウ +ヴィクトリア +ホリ +古河 +156 +アリゾナ +フォーマット +巡回 +遊園 +ニュージャージー +占拠 +在来 +##えん +国内外 +リンカーン +プリキュア +増刊 +満点 +燃え +商会 +打た +腹部 +あて +ホッケー +等級 +鈴鹿 +本機 +分泌 +学制 +系図 +不死 +極東 +相模原 +まんが +先述 +対話 +次女 +馬身 +##ッリ +トルク +主席 +代数 +##フェンス +風俗 +450 +##ents +##ジャース +会う +旋回 +相応 +##レータ +メリ +免除 +田舎 +細長 +西経 +州都 +次長 +遺族 +##ブライ +レバ +ver +大友 +感動 +菅原 +##ノキ +バウ +バッハ +ホセ +嫌っ +論じ +##ins +かわい +DX +はい +追い詰め +トロント +足立 +進路 +ギャング +Fr +ゴミ +捧げ +立花 +##ッタン +フォーミュ +BC +et +南朝 +##延び +分かれる +School +預け +エンジェル +鎮守 +アルト +ハヤ +再発 +政令 +暴動 +輝い +所要 +見出し +##cl +Do +フォーラム +##・シ +ハードウェア +ハイパー +チョウ +##UND +廃校 +手掛ける +誘わ +一瞬 +聖職 +能登 +##ーマル +##ental +凍結 +断っ +##ゲート +##インズ +##ファレンス +リカ +休養 +定住 +理科 +進水 +バーチャ +スクエア +Records +クビ +色々 +アクア +アトラ +##落とし +足り +##リンク +追い込ま +##III +不二 +制裁 +pl +##ype +アレックス +喜多 +##落ち +レバー +永井 +肯定 +郵政 +##IDE +Sou +くろ +ミク +逸話 +Star +支払う +ホップ +栄え +硫黄 +##ビィ +##小路 +好ま +祭神 +たとえ +ザクセン +ル・ +繋がり +イリノイ +7000 +ログ +混同 +見舞わ +交互 +##・ザ +##ンジー +バース +Chr +エキス +対談 +チェロ +##ッスン +フレーズ +手がける +High +市原 +弱く +スウィ +##かわ +##払い +太守 +東亜 +##ピット +##ニッシュ +あらか +くり +スナ +中性 +答える +高額 +投じ +##・アル +ブッシュ +処置 +##モンズ +Pe +免れ +遠隔 +高地 +136 +北軍 +タバコ +営利 +##YA +ハミルトン +樹木 +##殺し +テクノロジー +エナ +大砲 +##GP +携わる +舞踊 +CV +口癖 +It +さわ +好物 +##マンド +GL +トリック +モス +近所 +##メイ +曜日 +桃山 +ステレオ +亜種 +円盤 +型式 +##リーガ +##イトン +カテゴリ +ケーキ +JST +ランス +主権 +伝道 +順調 +##ull +##ネイロ +海老 +##ger +Ma +破棄 +マネー +ぜん +Hot +執り +死に +陸地 +##やり +尽くし +ハワード +マール +生誕 +聖人 +##之介 +基部 +孤独 +祈り +##スロ +##ーシ +ブラザーズ +ウス +主教 +挿絵 +数千 +##ブリッジ +Super +Mon +タム +交え +収納 +聖母 +西郷 +Em +MHz +各々 +子女 +系譜 +緑地 +##CO +##ings +合金 +図鑑 +アンドリュー +BD +三条 +信託 +理工 +百合 +聴い +マンチェスター +GS +ぶつ +原始 +##じみ +リハビリ +炭鉱 +当てる +親戚 +マクド +ムーア +パブ +導体 +授け +240 +レアル +放ち +待つ +所管 +キャス +マーガ +外し +多彩 +大内 +ナポリ +一揆 +招か +百済 +ラト +断層 +造成 +##・ミ +ボトル +幸福 +成熟 +##ブック +グラム +喫煙 +戻す +村立 +水田 +転移 +通報 +##ノム +キャッシュ +ブロー +麻生 +##ution +哺乳 +膨大 +遭い +打ち切り +飲ん +フォーミュラ +なに +エリー +含める +歩い +高かっ +色彩 +イド +ベテラン +着け +##red +伸びる +れん +タグ +急性 +川島 +市道 +電灯 +カ月 +シール +有人 +松岡 +Colle +行なう +ラヴ +改変 +##air +166 +金山 +##alk +主婦 +TC +攻勢 +知り合っ +保っ +冷房 +日露 +最速 +洗礼 +無償 +集約 +##タナ +##MO +##ッチャー +##ason +北斗 +双葉 +墓所 +##・ヘ +あらかじめ +年始 +悟空 +裕福 +ヒント +全土 +奉納 +岡村 +アンジェ +初等 +##ードン +アルファベット +実習 +尼崎 +新制 +本家 +##51 +パレスチナ +カセット +公明 +ウォール +幻想 +歓迎 +フェス +くじ +完璧 +積ん +##chn +シーク +全滅 +大師 +打つ +##IB +##通し +サイク +##board +##換える +混ぜ +SN +一橋 +##モント +##XT +ハッピー +没収 +負荷 +マーシャル +ウォーカー +あつ +フレイ +致命 +藤本 +##ンタム +パラダ +はじめて +高まり +##リヤ +Ele +##だし +##ジャネイロ +Aut +留守 +蹴り +静か +114 +フェラーリ +役人 +消失 +真宗 +運ぶ +トレイン +イグ +オース +ラック +久米 +吾妻 +商船 +##ガメ +内科 +北極 +及ば +進軍 +難波 +Stud +ラッセル +加算 +明神 +玉川 +##ムシ +##がれ +サイエンス +ネズミ +修業 +布告 +##ぎり +##より +ステン +増殖 +高価 +1864 +パラメ +プライム +こい +のぞ +サポーター +要員 +赤軍 +カスタム +原案 +ヒューストン +##ML +スターリン +だら +深め +車輌 +厳格 +地裁 +連装 +いと +園芸 +石器 +リーガ +デイリー +ナス +浮世 +チョコレート +パワ +##リッド +##ニール +回し +撤回 +未明 +飼い +##ater +生き残っ +HT +温暖 +##並み +##ンジャーズ +中枢 +通告 +OR +ゲリラ +以南 +包括 +弾圧 +##ローグ +ゆる +MA +トキ +フィー +##ement +推し +突起 +京浜 +俳句 +出展 +山手 +日比 +録画 +ハロー +マック +千里 +外来 +湾岸 +##ene +スキャ +ROM +長老 +広東 +出世 +斜め +考察 +サスペン +##・リーグ +##ンダル +大垣 +注釈 +フォート +ひょう +夏休み +群れ +さと +はし +##ョー +サテ +二郎 +対馬 +平原 +平家 +戻さ +##ute +差し替え +上層 +確信 +薬学 +ナー +佐渡 +公職 +教職 +王族 +男優 +負い +##ンスキー +Rad +ZERO +ユウ +告げる +覚悟 +ティム +受け継い +Girl +シリン +他国 +使節 +動い +寛文 +新羅 +犯し +辺境 +安置 +##yd +生み出す +エヴァ +惹か +##セラ +オックスフォード +アオ +MB +ホーク +サーバー +徴収 +真空 +##オニア +駆けつけ +っぽい +is +のぼ +##ロメ +窒素 +同誌 +拷問 +ホームズ +引っ越し +Mc +di +ヒップ +他方 +##リンゲン +WBA +寿司 +抽出 +かえ +ピック +IR +目立っ +軽く +落ちる +カタログ +上手く +一新 +原発 +飾る +川村 +慢性 +プラハ +本気 +フェザー +手伝い +仮定 +歩く +水面 +##ema +マケドニア +本校 +財閥 +水源 +クラウン +はん +えい +イマ +千秋 +長州 +代わる +余裕 +##アンス +すい +新書 +稲葉 +オルガン +弁当 +##じっ +##替わり +汎用 +減っ +ミシガン +閉館 +アスレ +オットー +カワ +愛人 +知人 +ペーパー +TE +名声 +微分 +##ケー +スペクトル +1862 +コロム +Bo +模索 +カンザス +リンゴ +ニコラ +南軍 +相棒 +ともない +MG +かす +救わ +##ットン +FS +クワ +親しま +解剖 +踊る +邪魔 +##バイザー +メダリスト +直ちに +仕上げ +フランソワ +保つ +少なかっ +ルカ +末裔 +遺物 +##ru +CBC +元老 +健一 +語尾 +賞賛 +こうとう +TH +上越 +今川 +書物 +##どん +あず +ブース +##テンベルク +ミニゲーム +春季 +競艇 +集結 +ライアン +クルーズ +下ろし +刺史 +速い +増やす +##ki +##oup +アレン +国営 +アクティブ +体型 +異母 +語学 +センス +好調 +##ano +ジャンク +シューティング +空き +WORLD +設ける +##むね +you +たつ +中高 +成年 +##チャーズ +ドレ +現し +野口 +飛ん +ジャーナル +産出 +繋がる +##ele +ワンダー +割れ +天津 +県庁 +##バイバル +カタルーニャ +ナウ +レフ +出家 +親しく +警報 +面会 +バナナ +反省 +字幕 +村山 +National +ひど +ケリー +トミー +ロッド +自家 +別荘 +特権 +乃木 +##app +マザー +土俵 +##aster +おおむね +メガネ +気付い +強大 +趣旨 +アソ +アーツ +グルメ +アレクサンダー +ぐらい +援軍 +取り消 +コンスタンティ +文法 +ふたり +まき +回線 +1863 +マナ +Eng +店員 +景気 +あえて +召集 +白川 +結城 +タービン +1867 +コロラド +聴取 +土砂 +旧姓 +西尾 +陥る +コパ +汽船 +feat +オズ +家具 +頂上 +PH +たどり +争っ +別々 +原爆 +土屋 +復刻 +総統 +脱落 +カロライナ +ひた +サハ +哲也 +琵琶 +補充 +ソナタ +タコ +住職 +##メンタル +Mot +物流 +##サンス +リオデ +最悪 +釈迦 +フィッシュ +めぐっ +おこなっ +テリー +発作 +##・フォ +受け入れる +ルーツ +ワゴン +囚人 +寄稿 +##IZ +勝つ +娯楽 +富士見 +ヘルメット +ラング +睡眠 +降水 +アポロ +コロムビア +リオデジャネイロ +ふり +嘉永 +無数 +##ゥル +まつわる +営ん +対局 +尊重 +本山 +きわ +逃げる +Project +コンプレックス +##ep +南北朝 +ギルド +ジミー +ルーズ +出番 +四方 +##tr +レイク +NPO +マート +##ディオ +ゼネラル +Can +ビタミン +志望 +指輪 +遺言 +柔軟 +参拝 +武家 +##リッジ +オーガ +FW +ソウ +特設 +続行 +講和 +途絶 +宣告 +取り除 +Val +巡り +母方 +ハチ +灯台 +背面 +Micros +争う +動かす +合う +搬送 +称賛 +##レックス +##サーチ +ランナー +320 +スカート +ニコライ +そっくり +カエ +##ハッタン +##リントン +テナント +ニール +通じる +##91 +いっぱい +##テルブルク +受け継が +休刊 +喜劇 +特例 +夜行 +##na +単発 +ウマ +いかに +ルク +インフラ +ミルク +公正 +##uro +コンポ +ヴォーカル +人体 +参画 +##sc +店長 +##スパ +ヤクザ +POP +片側 +細かい +もたらさ +応答 +気分 +フェイ +ヒュ +日系 +石灰 +##sch +キャノン +##ウンテン +世論 +強烈 +譲っ +ディフェン +マイアミ +トレーナー +電信 +##ばら +マンハッタン +はや +デトロ +宮古 +遮断 +##ニウス +スチ +応え +進入 +SW +ボロ +レート +傑作 +通訳 +養父 +##eth +トライアル +支局 +魚類 +楽しみ +成し遂 +マシ +妄想 +砲弾 +飛騨 +SHOW +西田 +##ニカル +##去っ +デトロイト +パトリック +##テージ +##まね +エルサ +休憩 +専任 +陣地 +マーガレット +嫡男 +法政 +##rit +##しょ +##遣い +エレクトリック +MAX +氷河 +シチリア +ウサギ +サザン +満ち +知らさ +CA +ブルク +フラワー +ひさ +コング +ホス +精密 +食物 +##ソタ +##ベーション +##少年 +アイアン +取り組む +エチオ +ホーン +BN +任官 +八十 +志向 +指標 +青少年 +##・メ +アルフレ +ルートヴィヒ +フランクフルト +克服 +大国 +大勢 +##ショップ +クイーンズ +皮肉 +##ツキ +宰相 +慣習 +##ズエラ +多岐 +暗い +脅迫 +##ANG +カミ +導く +持株 +釜山 +230 +ポーズ +##コク +うか +会派 +地盤 +造営 +##メーション +バスク +ダメ +報復 +救い +生地 +アルミニ +テネシー +スネ +レッスン +左腕 +##ubl +キッド +戦法 +断絶 +ストン +ウェア +##リオール +ハーン +杉山 +異性 +##form +##さま +ファクトリー +引き受け +同梱 +巡礼 +荒木 +遥か +収める +早川 +納入 +##let +ビルボード +GK +阿弥 +離陸 +ヴァー +##フェース +天狗 +アトラクション +BA +密着 +議事 +フレンド +ミシシ +台数 +封鎖 +愛国 +豪雨 +##じり +援護 +乗り換え +いかなる +積載 +築か +防空 +まるで +給食 +アセ +次回 +##ヴィッチ +Art +優しく +高雄 +コンボ +コーラ +シアトル +アワード +馬鹿 +いろいろ +FO +よば +若松 +##コンド +##キース +セーラー +マニュアル +任天 +充電 +朗読 +条項 +素晴らしい +対岸 +産駒 +落合 +##ゲイ +1865 +見習 +配達 +合わせる +エチオピア +三原 +原画 +大洋 +##ology +Sec +Microsoft +デート +ハッチ +剣術 +大同 +板橋 +##ファイ +##ersion +トール +ドット +課税 +ウォルター +しら +崇拝 +##lymp +ろく +厚い +##ラルド +##ベイ +コスプレ +どん +コト +ドック +総数 +##urn +ブリティ +職場 +長け +テラ +点数 +##返り +##IGHT +手配 +##ヨー +いったん +ロジャー +日活 +派手 +##rap +CB +券売 +県民 +飛車 +LT +リマ +合わ +本殿 +バッファ +家事 +レーサー +天王寺 +カニ +バンタム +ボンバー +悲しみ +特命 +サスペンション +休業 +出羽 +西南 +イレブン +函数 +大敗 +明記 +起因 +##ラビア +引き換え +アイン +下さ +周回 +抱える +曹操 +神楽 +##enc +##ボルン +Count +体質 +入国 +派閥 +硬式 +築城 +##テナンス +NEC +けんど +立案 +プロセッサ +ローリング +スライド +Disc +サビ +意欲 +消息 +渋滞 +融資 +##・セ +##・ト +##ロイ +シャープ +うどん +たて +ドミ +進撃 +鋭い +頭脳 +##しょう +ビルマ +天野 +##ations +ケンブリッジ +取り扱う +リヴァ +甘い +臨ん +##ミントン +ひかり +サード +実父 +##ラフ +日清 +持ち帰 +Red +バレン +仕方 +低減 +勝者 +素直 +なくし +##ama +ファイターズ +サヨ +慎重 +片方 +##コム +##越え +チェン +クレア +常時 +##プリング +##コブ +アンダーソン +合弁 +業者 +ユーザ +もらえ +モデ +屋内 +準拠 +病死 +通用 +Java +山川 +##55 +ウィング +ウォーズ +ミネソタ +アデ +レジェ +不幸 +沼津 +着任 +##ソニック +代用 +為替 +クライアント +合宿 +常任 +殴り +バリー +クス +単式 +留まり +痛め +##シミ +宝暦 +源流 +都営 +##FE +西山 +速く +##ヶ崎 +##本木 +インク +##フォーク +一流 +挑ん +ゴッド +ロイド +亜科 +同窓 +プロペラ +主翼 +名物 +未知 +カップル +えん +常設 +形容 +河合 +特色 +諜報 +通話 +仮名 +太刀 +豊川 +##ex +##ダース +CT +調和 +金髪 +ソーシャル +メンテナンス +マツダ +国府 +等しい +##まち +##グマ +テロップ +はた +養護 +小麦 +火器 +誇っ +##ha +##ナート +##ばり +##ンクス +マニラ +イケ +奨学 +頼り +##inc +##any +取り壊 +アムステル +しめ +なな +わかり +ド・ +救っ +減らし +転身 +Black +Dav +from +郡内 +##わい +1866 +Olymp +Tour +##って +ベネズエラ +領有 +##ors +回る +志村 +日経 +米子 +抗体 +バーチャル +文久 +プリント +At +使徒 +山村 +掃除 +##IAL +##ルティング +##もっ +ROCK +遭っ +鋳造 +グラフィ +カンボ +##IME +ヘー +組成 +ライド +アルミニウム +交番 +WWE +ふみ +アコース +マフィア +旋律 +相馬 +遅延 +##CH +亡き +北端 +鉱業 +##ASH +GH +To +##por +Spec +尋ね +インパクト +ブラウザ +カーン +大崎 +決闘 +##リップ +キャニオン +##inal +ダウンタウン +サタ +出動 +天地 +小牧 +##vel +ハイム +エンターテイメント +サンディエゴ +イヌ +ウン +草津 +アンチ +##チェン +ファイブ +公使 +年長 +書紀 +流す +University +どころ +共闘 +四十 +笑っ +##ww +##ビアン +ヘッセン +ヨン +塩化 +Pol +des +振付 +##がき +近づく +ラバ +リサーチ +原産 +am +待合 +遂に +高圧 +デイヴィッド +Xbox +co +ひめ +カープ +年俸 +意匠 +興奮 +##AWA +PP +みゆき +テイク +中古 +信念 +意外 +誘致 +チョン +佐竹 +係数 +密接 +男の子 +##ネーション +アコースティック +コカ +##継ぎ +ミシシッピ +出航 +悩まさ +未遂 +潜在 +薄く +Don +fr +##ナギ +##きん +スズキ +ゴードン +ツリー +固体 +エスカ +Dream +バド +商売 +広義 +##ストル +つくる +フィルハー +レシピ +ふれあい +アズ +ウラン +指向 +賛同 +振る舞い +凱旋 +叢書 +摂津 +無罪 +盗賊 +線形 +フランシスコ +コロニー +ネパール +特記 +胞子 +Pet +ナノ +William +八代 +ソロモン +ジェイムズ +ガイア +プエ +仕立て +弾丸 +添加 +高句 +##パル +ウォン +もらえる +アイスランド +高句麗 +増田 +真似 +##gh +##ヴィエ +シンセ +フロンティア +GN +me +以っ +有志 +生ん +痕跡 +ヤンキース +ヤー +直面 +黒色 +##ler +MD +はち +廃業 +楽しめる +モロッコ +ラボ +長尾 +##リーニ +ブリティッシュ +KD +タス +チャーリー +ゴシック +去る +閉じ込め +うけ +ヵ月 +堤防 +版画 +留置 +継ぎ +グルジア +ウェーブ +バッグ +仮称 +地表 +投げる +衛門 +魔導 +##ざい +テクニック +Club +ルノー +公示 +奉仕 +小池 +育つ +##ッダ +126 +あげる +怒っ +##ble +ミュージアム +ナビゲ +ざわ +ヨシ +リヒ +単身 +谷川 +何者 +諸説 +##ランカ +##シュタット +アウグスト +Rock +やむ +ポリス +ワープ +右投 +皇室 +##わしい +##ンプソン +アーキテク +##っぱ +バルカン +##URO +キエフ +中略 +部員 +オーダー +収蔵 +湿地 +路上 +作り出し +準じ +うん +失脚 +魔神 +チェス +プラズマ +キラー +バビ +文藝 +新編 +補正 +逝去 +##直す +セントル +散歩 +木星 +##がけ +カリブ +のび太 +ひがし +トーン +党派 +左岸 +##エイ +1861 +フライト +奥州 +##71 +##らぎ +チャーチ +ウィス +フレデリック +アムステルダム +NATO +Vo +きみ +供養 +元和 +開園 +飼っ +1850 +カンボジア +かき +ツェ +劣る +小銃 +要し +別冊 +##モロ +ゼル +剥奪 +右衛門 +津山 +サイコ +試みる +ブロードウェイ +奇襲 +小室 +永田 +調印 +122 +番付 +おは +オイ +メド +反動 +寝台 +##ニク +ルネサンス +物産 +##aka +だいがく +ゆっくり +旭日 +##じて +Int +ユキ +練馬 +##かかっ +伊丹 +慰安 +##ストリ +クア +ホン +飲む +##ロド +アドルフ +刺さ +反転 +吊り +片岡 +エアロ +カメラマン +訴える +ディープ +往来 +遠い +##ボス +使命 +大沢 +愛用 +直流 +赤外 +辺り +リタイア +Christ +マッカ +断片 +渡す +適当 +飛び出し +ゼン +フアン +ロビー +なんて +入選 +操業 +牛乳 +若き +##チョウ +TAK +於い +##ダス +コンゴ +パナソニック +モア +最短 +##戻し +CBS +がく +コナン +生殖 +硬貨 +電報 +宗家 +折り返し +ネス +直樹 +資材 +立てる +ケルン +北欧 +減らす +火薬 +あゆみ +ゾイド +店主 +結核 +醤油 +##付い +ニンテン +どおり +平地 +武者 +点在 +納得 +##・リ +##fl +スピーカー +セダン +退け +クリエイティブ +ヘブライ +不法 +決済 +竹田 +築き +サンプル +##スティック +てい +直結 +##デラ +##リッヒ +##ura +握っ +驚い +キャサ +輝く +頼み +##ONE +不可欠 +信徒 +台東 +キャピ +ナチ +川内 +連ね +市中 +ジェノ +www +ミハ +国軍 +本書 +##pm +##ラーゼ +ジャニーズ +フック +松島 +洋画 +買う +たば +中堅 +手順 +神秘 +##コック +##グレ +この世 +立ち向 +大将軍 +エルサレム +Best +跳ね +連立 +北村 +即座 +天明 +打倒 +精力 +##プール +ローレンス +上原 +町立 +##ッテン +引き継ぐ +ソフィア +左派 +浄化 +田口 +新社 +経っ +フェロー +ローラ +いわき +なみ +カク +ピュ +一言 +切手 +宛て +巡査 +徴兵 +歌人 +##プライ +##oss +喜ん +年下 +書道 +つづ +なろう +擁する +ER +##張っ +ペドロ +冷凍 +強め +本文 +##DP +ノルマン +村長 +民謡 +装填 +123 +受け取る +メルセ +Bro +##ソール +アルバート +ユリ +事象 +守ら +平井 +発光 +引き継ぎ +ATM +生み出さ +##REAM +レモン +混雑 +視野 +##フィス +吉岡 +椎名 +##きょう +アルカ +ハドソン +シリ +動揺 +帰宅 +掲げる +##ビシオン +Fac +ネック +帰郷 +慣れ +臨海 +送電 +##sp +東郷 +連行 +##du +##降り +##ティエ +##ディーン +みなと +ホルモン +面白い +ミシェル +給与 +荒廃 +ありが +##ブレム +仲良く +ナレーター +桑田 +レインボー +DA +罰金 +転属 +開花 +##ille +冷戦 +##チド +##振り +VR +ヨル +リット +名残 +変装 +消す +祈願 +織り +長門 +##ブランド +##めき +エストニア +提督 +破る +グラント +テンポ +頭取 +##ボウ +コンタ +イサ +大破 +穀物 +##ese +##ンパイア +キッズ +勤める +追いかけ +作り上げ +促す +託し +シス +知恵 +JO +探知 +##ガンダ +呼び出し +無くなっ +ぐる +定番 +獲物 +隼人 +落ち着い +##ーマーケット +過酷 +##クサ +Wi +WD +ジオン +公言 +右岸 +篠原 +鶴岡 +550 +古巣 +民法 +##イクル +志賀 +転居 +##out +しゃべ +ヒート +ムシ +月間 +紳士 +スパイダー +Mod +スティック +花園 +モントリオール +ヌー +出自 +間に +カザフ +乗合 +基督 +有田 +架け +良かっ +スーパーマーケット +塗り +配分 +門司 +メルセデス +届か +##ートー +ファイア +ウズベ +浸水 +遊ぶ +ピッツ +ポッド +御前 +摩擦 +##ぐち +##のう +アイオ +Mich +佐倉 +駐留 +切り離 +祀る +##トペ +コーディ +キャンセル +Billboard +Tok +大江 +満洲 +発酵 +##ven +スロバキア +##ship +Associ +家電 +張っ +濃い +迅速 +不調 +側室 +加古 +移す +見下 +ケータ +ビュ +社殿 +置換 +製紙 +##ner +オリエ +リバウンド +動か +蝦夷 +フランチャ +SK +ムラ +幅員 +発令 +赤穂 +##ior +##75 +マイナス +あす +処女 +国宝 +腕前 +ヴァージョン +YOU +火炎 +Sal +ベール +上回っ +寄進 +局所 +舗装 +葛飾 +オールド +優勢 +匹敵 +日刊 +##シマ +##ゃく +MON +パルス +配合 +##ドア +##ばん +##じん +信州 +分かり +摂政 +末端 +黒川 +佐久間 +壊れ +水分 +聞かさ +フルート +吹き飛 +##チューム +後漢 +##ニクス +岩石 +挟ま +退場 +開山 +ロータ +公転 +細い +##まつ +パナマ +事変 +分断 +アング +分配 +可動 +台本 +清掃 +短調 +秋季 +ステータス +楽しん +プロトコル +Life +ラマ +リーズ +顔面 +##らん +サーカス +##クタール +ずれ +アゼル +画策 +##しゅ +スタメン +まさに +ヨハネ +係る +洗脳 +##LA +##ーツァ +火事 +立方 +遡る +##ざし +ジョイ +及ぼす +始末 +##INAL +1848 +アテナ +コスチューム +Geor +上皇 +分家 +目録 +##amb +三遊 +広州 +詩集 +##ミュー +なくなり +シュトゥ +##iver +いすゞ +サテライト +AF +なぞ +生母 +番外 +祖国 +稼ぎ +##ヒル +##んじゃ +メリット +採集 +##ral +##ella +イズ +アクセント +サヨナラ +ラ・ +公団 +有用 +##ンドル +ブリテン +づくり +過ぎる +テム +ロベルト +整え +貝塚 +陽性 +##ベス +ファイン +イザ +蔵書 +##クリ +いずみ +オト +元来 +幕下 +有権 +ましょう +キャサリン +イヴ +素子 +##ニバル +ウォル +SG +##さか +アンディ +be +へい +バタ +史実 +羽根 +陥り +2500 +アドバイザー +ストローク +カモ +メチル +初心 +刺し +安心 +架かる +クライマックス +河北 +##デンブルク +菩提 +調べる +転入 +##き出し +##グリ +##ンドロ +慕容 +米沢 +##eral +(- +ml +本能 +激突 +全編 +子役 +##メール +##DL +Min +一味 +##げん +##沿い +アルバニア +江戸川 +##ミュエル +松戸 +運ん +##ぐり +MM +ヘクタール +ホース +公平 +名簿 +奄美 +民家 +物件 +パンツ +フェルディ +デカ +内包 +端子 +マーチ +カンファレンス +機密 +隷下 +##ポー +大木 +有害 +盗み +頼ま +いくら +トリプル +移り住 +ヨーゼフ +並み +城壁 +除籍 +##ガタ +さす +居城 +最盛 +##ouse +ac +ノック +戴冠 +義経 +ミズーリ +以北 +古今 +合っ +若く +苦しみ +サウジア +OK +Power +モーション +放火 +疲労 +##・ウ +##きゅう +ルドルフ +雇わ +ボスニア +Sing +サントリー +炭酸 +特筆 +アベニュー +Trans +イニング +掘削 +##かう +オア +下級 +瑞穂 +義勇 +自慢 +話者 +##まわり +##ードル +fl +谷口 +包ま +発案 +Inter +原曲 +渡さ +麻痺 +##さき +パラダイス +##トペテルブルク +偽装 +内外 +燃費 +貼り +##ren +##ステン +イース +勧誘 +萩原 +赴い +##ision +ライブラリ +Nor +le +衣服 +ヴィー +##ACE +ストライク +大介 +巧み +承継 +見かけ +ノイズ +体長 +地主 +##iro +フランクリン +ロマンス +年表 +所沢 +##IK +1830 +ジャスティ +ヴェー +スローガン +久保田 +反抗 +抽象 +静止 +アルマ +ギャン +下田 +勅令 +後続 +収束 +編制 +##ero +プロフェ +##ats +レイアウト +キノコ +促し +改宗 +生駒 +開会 +サイモン +EL +アラスカ +勝率 +問う +##ショウ +インストール +コナミ +接収 +##ペスト +両端 +堀江 +崩し +白井 +耐性 +##ican +REC +サミュエル +退治 +風土 +ディーン +##ital +プラント +マクロス +イーグルス +イオ +幼虫 +煙突 +重臣 +望月 +極め +胸部 +サウジアラビア +ゲオ +パド +各所 +対外 +義理 +貯金 +エンタープライズ +ゾウ +リンパ +全権 +尻尾 +監禁 +シャッター +スパルタ +##ebook +待遇 +漏れ +##てい +Award +Time +一説 +前部 +収監 +四川 +思え +##・ボ +330 +アライ +使い手 +つぶ +ノーマル +暴露 +自伝 +長寿 +飯塚 +両腕 +動かし +商学 +恒例 +病理 +経費 +##バナ +##デンス +書き下ろし +##ャンマー +Er +マフ +カジノ +セントルイス +CON +普遍 +莫大 +Ang +まこと +全力 +坂井 +市域 +旧称 +##work +激化 +##トリア +あいだ +失格 +安土 +肺炎 +##トス +##キサ +##ICE +von +代打 +属す +承諾 +##おか +ライス +にくく +タク +一条 +変貌 +尚書 +屈指 +平塚 +急死 +退い +発砲 +見込み +##サリー +##ザール +##チネ +模倣 +##ミッド +古賀 +招く +漁港 +育てる +ショーン +伯父 +##ジック +##がん +##井沢 +インテル +##バイジャン +FOR +工廠 +関税 +高槻 +net +ホウ +民兵 +添え +優等 +ウォーク +ステンレス +フン +マヌ +ミャンマー +南下 +外さ +##メリカ +##十郎 +スプリント +アゼルバイジャン +##ze +カルシウム +たばこ +Bas +アリー +何故 +八百 +発想 +移送 +貯蔵 +起業 +酷似 +モーツァ +失業 +接種 +明和 +軽井沢 +ファラ +##ネスコ +(" +マウンテン +味噌 +##付き +un +ミヤ +持ち込ん +いきなり +生き残り +ハラ +マッカー +山麓 +ジェーン +慕っ +窮地 +読ま +LS +リエ +筐体 +達人 +##コード +キャロル +やく +茶色 +##レクト +##レーヌ +##メンテ +SON +はく +レンジ +出陣 +留め +##キル +##ノル +ベラル +ミッキー +献上 +疎開 +Reg +JS +Ter +じんじゃ +兄妹 +戦果 +貧しい +##コット +エッジ +硫酸 +誓い +クロム +庄内 +Win +全英 +法制 +##のぼ +フォント +ハリケ +伴奏 +宿主 +アンソニー +共用 +翌週 +近辺 +馴染 +成し遂げ +並木 +児玉 +渡米 +OH +再戦 +商用 +望み +遊ん +##くら +##着く +ステア +##ーニュ +パーソナル +LINE +グライ +ゴス +売っ +官職 +海運 +##オラ +##ody +売ら +早々 +マルタ +敢行 +無駄 +終始 +覆う +諸侯 +##ッロ +オーラ +ウェルター +Act +多重 +子音 +##こん +##レンツェ +パイオニア +同点 +炎上 +狙わ +退却 +Robert +少々 +水晶 +豊後 +預金 +##ij +##ギリ +ジュリア +クレーン +グスタ +便利 +晴れ +有明 +白河 +碑文 +絶賛 +サラリー +アーキテクチャ +HS +MX +われ +ロブ +塩基 +##バータ +近づい +掃海 +祇園 +驚く +アルビ +同曲 +更なる +自爆 +チャー +ファイナ +イヤ +ジーン +ミツ +崩御 +近縁 +Mor +do +ノリ +鍛え +除け +##ソス +ヒューマン +共鳴 +急増 +表向き +アレル +##ッケル +ベーシスト +GE +カヴァー +ナッシュ +##IVE +##メガ +ルス +受注 +無名 +総監 +補完 +##ミッション +Ber +中身 +本戦 +##・ム +##ぐれ +クリミア +チェコスロ +マキシ +宇部 +届く +結社 +##持つ +エンジニアリング +サンクトペテルブルク +ソラ +噛み +祀ら +めぐり +セミナー +マッ +古来 +稼動 +車掌 +養老 +##ギャ +##ノミ +出せ +新党 +織物 +##ザース +コミュニケーションズ +クリストファー +執事 +##れん +間違っ +San +セクション +混在 +部落 +飛ばし +##コーン +キン肉 +キネマ +回帰 +恨み +阿蘇 +##ダラ +##ティウス +Cent +信任 +浅井 +ジャングル +##atch +つくり +グー +ユン +戸籍 +東ドイツ +狭く +迷宮 +マルク +阿弥陀 +VHS +天台 +学期 +平坦 +##ball +##ケス +##ホルム +バラード +まとめる +だし +六角 +新造 +沼田 +##ナール +##助け +##フィールダー +がり +可変 +日報 +格子 +法華 +ミッドフィールダー +##カロ +205 +タキ +母国 +リリーフ +ハイビジョン +秋葉原 +RNA +毒性 +称え +Des +必死 +オレゴン +微妙 +終わら +迷惑 +##タリ +##プラー +##だん +##々しい +たまたま +転倒 +スミ +乱入 +奮闘 +##ッペン +カルチャー +エグゼ +大門 +撤廃 +競う +達也 +メモリー +屋台 +村人 +重ねる +集計 +黄色い +揺れ +担い +本番 +##クレ +##乗り +マウ +亀山 +宇佐 +フィクション +みなし +日韓 +首領 +ランチャー +]) +小西 +総括 +##ye +##コシ +LC +ガム +吉村 +向こう +無敵 +直撃 +##ジアナ +Rev +PAS +却下 +##ガラ +ピラミッド +三遊亭 +今治 +南道 +宿舎 +親方 +##カリスト +ギー +マシュー +処罰 +支出 +解禁 +逃れる +##イアント +さし +丹後 +##its +クオ +低地 +儀礼 +全盛 +オリン +ベビー +マテ +淡水 +眠り +納め +迫ら +パーカー +##ATE +メロディー +レバノン +きた +夢見 +##ニアン +ちなむ +バンコク +se +増幅 +延暦 +真剣 +軽巡 +Up +ペナル +開閉 +##・イン +オラ +片山 +薔薇 +西端 +##さつ +アヤ +ベラ +大火 +容赦 +山東 +ストリー +Sport +日比谷 +650 +パニック +##イルズ +##ARS +カーター +下水 +扮し +紅葉 +銘柄 +##っ子 +ディビジョン +弾道 +救命 +赴き +##マーシャル +宅地 +敦賀 +機雷 +##プトン +サング +州道 +幕内 +繰り広げる +売春 +座っ +関ヶ原 +プライド +返済 +カマ +ドリル +中頃 +支障 +騒ぎ +##ideo +News +KBS +mg +備前 +##・ファ +一騎 +入試 +反する +棄権 +知行 +防護 +フィレンツェ +コンピレーション +ハンドボール +ベラルーシ +City +アストロ +ホモ +尾道 +旗揚げ +規約 +閉塞 +執り行 +きわめて +モーツァルト +唐津 +立教 +##まま +##ージョ +マヤ +江東 +BAS +ダラス +ルビー +充分 +北見 +支払わ +##フレーズ +Song +セメント +悩ん +遠山 +遠ざ +JIS +ノウ +公家 +尾根 +岩田 +辞書 +##・ベ +コンペ +Mark +ヒルズ +進言 +##トゥス +Port +なさい +エステ +カレ +処方 +大きかっ +EMI +ロッキ +提起 +##ola +ギュ +152 +mmF +ヴェスト +艦名 +##ッチン +MY +サリ +土浦 +激減 +##83 +##食い +スキン +1859 +##ルタント +メカニズム +アリア +波長 +陰陽 +風貌 +##ンスト +リポート +例年 +別人 +図り +堀川 +##hone +ヘルマン +ロータリー +成す +絡み +見抜 +波動 +講堂 +##連れ +ふう +大胆 +平定 +爆笑 +インフル +スティーヴン +Fi +うさ +低温 +届い +教場 +説教 +##ゴス +EF +Kn +ぬい +墳丘 +消火 +##・ホ +##バーズ +ブレイン +アルフレッド +ヒンド +ユネスコ +助成 +那珂 +鉄砲 +コンサルタント +野望 +##テー +国々 +室蘭 +敬意 +自走 +麻酔 +ジャム +クロウ +スカー +帯広 +水深 +私鉄 +##ガルト +ジョナ +国政 +日テレ +発進 +##が丘 +##ボリ +器用 +欠け +藤岡 +負債 +麻衣 +##ボロ +-( +隠す +宮中 +接合 +提言 +##15 +280 +キングス +よこ +シュル +ウォッチ +ディフェンダー +リブ +反響 +含有 +杉並 +華族 +迷い +フィニッシュ +ピストン +ホールド +入所 +多々 +征伐 +選帝 +##ューズ +繰り返さ +呼び名 +ネルソン +一派 +権現 +瑞宝 +外相 +嫌悪 +連射 +##の丸 +##ico +##olution +WEB +イソ +培養 +注ぐ +スタンプ +エイジ +北川 +噴射 +死神 +終える +部数 +青梅 +願っ +##ツィヒ +ドリー +手数 +藩領 +黒髪 +##シリーズ +##カーズ +アルプス +270 +Amaz +国分寺 +オタク +内定 +吹田 +大通り +##ずら +##フォー +キャッチフレーズ +##マイカ +FBI +スカル +石碑 +連想 +1858 +投獄 +立命 +計量 +##レク +スロベニア +プロトタイプ +器官 +軌間 +バンクーバー +おこなわ +マディ +炎症 +鍛冶 +##TO +大抵 +宮川 +浪人 +調停 +迂回 +##ARA +NAID +パラメータ +Mer +大平 +歩き +流派 +フライング +TM +##メス +##ホマ +##ンガル +ハンブルク +フリゲート +延び +神父 +里見 +260 +プラグ +テロリスト +Techn +チア +レット +土井 +声楽 +隔離 +シャドウ +ベートー +アルベルト +ジェル +いざ +準急 +直列 +組長 +ブルックリン +サバ +写像 +粘土 +若年 +開口 +##ドキ +シグナル +Che +六本木 +川端 +流星 +アルテ +マクドナルド +tr +分ける +打診 +換算 +松永 +話さ +##サラ +行き来 +http +シリンダー +不当 +厚木 +四角 +攻防 +断ら +すば +アロー +終焉 +愛宕 +説い +##ントス +アクセ +フランチャイズ +中年 +放浪 +DT +バックス +健太 +本庄 +##祭り +ギン +下総 +離党 +##RO +ギブ +分化 +いな +多賀 +挑発 +砲台 +ライプ +こだわり +Sn +ノブ +栄誉 +校内 +ララ +レプ +桑名 +##to +コマーシャル +##ソウ +##ヘル +クリエイター +オムニ +注射 +カラーリング +##ハーゲン +なれる +ノード +分立 +葬ら +視界 +音色 +##カミ +##ンプトン +トランペット +Blue +希少 +演芸 +##QU +##らう +##ona +カリス +トマト +パク +有り +貸切 +##アム +##arl +##ney +サックス +反則 +発刊 +糖尿 +UFO +アソシエ +もて +代議 +参道 +櫻井 +返す +##バンス +##ush +エディション +MAN +三国 +協調 +##ワース +エイリアン +King +ソリューション +焼い +遭難 +騒音 +高砂 +##ツキー +アルジェリア +##オーバー +RECOR +RT +アッシ +付録 +旧暦 +ポルシェ +BP +Fe +エラー +パンタ +富岡 +店頭 +母校 +深川 +##ets +クリップ +##ike +知性 +許容 +クリーブランド +オウ +恐慌 +##ネード +ギャル +マスターズ +##キャップ +##uck +キリン +ケープ +一応 +体色 +司る +弾頭 +絞り +頼ん +呈し +奥田 +##yr +ステッカー +##ブリエル +オリー +不審 +##くる +シマ +刑法 +部署 +##ety +八尾 +大映 +悪役 +樋口 +演歌 +襲う +西岸 +見通し +##ific +かま +戸塚 +ハイウェイ +PRO +GA +イニ +直人 +艦載 +##シズム +##テラ +インデ +##ストラクター +Champ +デイヴィス +Sun +iOS +入線 +対潜 +独身 +迫害 +飾ら +##rop +生き延び +RAD +Soft +キース +宇和 +東端 +法定 +浮遊 +香取 +たまに +EV +サボ +ダニー +レム +大仏 +握り +速力 +コリ +学派 +寺社 +志し +消耗 +##ナーレ +盛り込ま +聞こえ +山間 +帝都 +点検 +ディフェンス +##フェルト +##ちゃん +ニーズ +開港 +##ろす +オバマ +バーナ +作物 +栗原 +カネ +勝敗 +増備 +戦記 +ファント +ファンド +ストーム +UH +えり +ケント +ポピュ +納税 +年寄 +教義 +衰え +隆盛 +隕石 +鳴門 +五十嵐 +##ield +無形 +チェコスロバキア +クック +利便 +実子 +欠陥 +美し +進級 +##ポル +##あげ +トリノ +LA +PM +アワー +抹殺 +綬章 +##witch +ドミニカ +ジブ +ヒメ +大小 +徳間 +目の +オークランド +ゴロ +公判 +教鞭 +曹洞 +USB +従兄弟 +ばね +クリーン +擁し +水族 +##あき +始祖 +延喜 +建っ +竜王 +スペック +NBC +Sum +オクラ +ブレス +ブースター +共々 +溶岩 +Str +公卿 +奔走 +自力 +スケッチ +1854 +クイン +叫び +含み +浅間 +猶予 +裏面 +##ベガス +##ちょう +ジャイアント +コンサルティング +スティーブン +そろ +前衛 +勝て +祭祀 +##VID +##チウム +##受ける +グルー +USA +##ルツェ +Thom +Tw +あふ +ボイラー +制式 +厚く +噴出 +従属 +赴く +スカパー +ミリオン +一転 +返上 +##ハル +Os +結末 +人道 +反逆 +##レナ +##シャワ +##ocal +Facebook +サラリーマン +マッド +出かけ +新宮 +##DI +##レーツ +##ナーゼ +James +察知 +尽き +患っ +産経 +空挺 +観念 +讃岐 +##タニア +##TH +##カム +##寄っ +##売り +サンパ +##イオス +BMW +ロット +同郡 +大東 +##バリ +##カレ +##びき +なくなる +コンチネ +con +メッツ +北海 +寸法 +新報 +日吉 +美味 +証人 +Tri +みき +付着 +半球 +大連 +水色 +##チー +付き合っ +アサヒ +サリー +信玄 +協賛 +##・タ +##ずみ +ストライキ +神崎 +築地 +臨む +訳さ +##98 +##za +TOP +ジュース +ナムコ +ル・マン +さよ +奈々 +さよなら +GU +ヒール +小金 +明瞭 +星座 +父子 +耐震 +##コウ +ユニーク +やり取り +見習い +ひまわり +宇野 +##強い +デビッド +ホルン +大物 +大寺 +推力 +ジュン +カレンダー +フィルハーモニー +くす +交配 +勝目 +翌月 +124 +1300 +Association +もろ +兵役 +島原 +粛清 +タウ +産物 +築造 +1400 +つなぐ +ありがとう +コンチネンタル +ブエ +リール +河南 +スクウェア +1855 +オウム +クィ +ヴュル +初音 +柔術 +極度 +物事 +##かえ +##ぼさ +GHQ +ムル +及ぼし +点灯 +##レーン +##ッティング +##カップ +振り返っ +修学 +合作 +天草 +長浜 +##リナ +##ビウス +クローズ +##クスピア +木場 +##めん +アマゾン +横手 +課長 +##ンシー +##ハマ +##グア +##巻き +##ぶり +クラリ +くさ +シラ +モモ +平山 +腐敗 +解読 +スクラ +大船 +幕張 +犬種 +紫色 +工法 +撮り +母子 +特務 +適正 +医院 +見受け +辿り +ケータイ +アザ +##フマン +##vent +思い出し +カスティー +隙間 +Sl +困っ +追及 +##プテ +イントロ +クッパ +ヶ国 +不倫 +人造 +##コト +強かっ +##oph +アッパー +新川 +溶け +照準 +苗字 +##CA +ルーズベルト +Ze +セネ +吉良 +養殖 +キューブ +ラスベガス +バファ +マリーン +劣化 +江南 +筑紫 +至り +まとも +石室 +薬局 +##ワット +ひこ +アクター +一括 +三味 +手助け +止まり +トラップ +建て替え +ヴォルフ +ダス +手足 +止まっ +##行き +ふん +直属 +##エール +##そり +##ipp +おもちゃ +American +Special +ハリケーン +吉祥 +熱血 +血統 +キャット +プラチナ +Enter +CLUB +バロック +改める +狭義 +用水 +霊場 +青銅 +##カゲ +##ワフ +ルイジアナ +メーター +横田 +観覧 +長身 +##ヘッド +##ora +カト +導き +溶接 +##ael +ウルグアイ +JT +ゲノム +シスター +ホープ +優駿 +城山 +給油 +##タリア +##りん +アンカー +クロード +バックアップ +クリーク +LD +ひな +デリ +並列 +養女 +##セックス +起こさ +コスモ +ギャラクシー +CIA +みせ +荘園 +モノレール +##iversary +ヨハネス +支那 +繰り出す +Med +du +公営 +大工 +解く +通販 +##tain +##ィー +##AMA +##ELL +iPhone +リモコン +不況 +入札 +田代 +破片 +警護 +##17 +##パルト +いまだ +カズ +シング +デパート +リソ +光景 +政宗 +若狭 +##レイク +アミューズ +Tokyo +らく +ユタ +蛍光 +連鎖 +##ジーミル +パラリンピック +DAY +ひき +図柄 +在職 +明示 +金星 +フィア +ジェイソン +デラックス +Pi +充て +熱海 +##カヤ +##ホーム +ストリーム +ナナ +一線 +着目 +請け +青島 +##ダード +##ロラ +世襲 +肥料 +##GS +ジャマイカ +埋め立て +おはよう +つば +名作 +弱体 +旧来 +祝福 +カービィ +細長い +後円 +短歌 +経理 +豪族 +##ゲス +##渡す +##OSS +MAR +bl +キプ +請願 +##my +##ena +キログラム +バッジ +ミッチ +打数 +鉄路 +顕彰 +##かつ +バーデン +So +ガリア +照射 +閣議 +サミット +円筒 +問屋 +飛躍 +##たか +アクセル +##ーチャー +レター +売店 +池上 +##ッツォ +グスタフ +ヴュルテンベルク +リビア +取れる +田川 +盗ん +兵衛 +同県 +太政 +石巻 +##さり +##変わり +勝ち越し +ドキュメント +埠頭 +ものまね +-- +NM +ボヘ +土岐 +採っ +##ham +折れ +撃た +格差 +死傷 +素顔 +##ざき +バースト +ファイヤー +こころ +大泉 +##ヴル +##ated +ベートーヴェン +まな +ルーク +健全 +愛さ +接着 +日没 +##タリー +Jo +オロ +前頭 +大黒 +楽しい +細工 +臓器 +##lt +##RNA +Fri +コスタ +ヒン +荷重 +重なっ +Amazon +フッ +下っ +##コミ +##ぜん +##去ら +フェルト +乗り込ん +デニス +積分 +西条 +##奈子 +144 +ウェン +ビック +レジャー +##んどう +SPEC +Sil +完走 +構える +##uss +##over +セレクション +外出 +文京 +水島 +補欠 +農園 +仕掛ける +公用 +律令 +絵師 +##ジェスト +##IST +org +プエルト +ペトロ +新城 +望ましい +沢田 +片手 +西欧 +##詰める +知多 +給付 +##直さ +ウッ +クン +坂口 +均一 +校地 +##モト +##リオット +##ada +##ATA +おば +浅い +##・ル +##OLD +ライブラリー +インフルエン +カバ +ロスト +童話 +自機 +貯水 +##ボーグ +##ISS +1840 +大作 +討論 +重く +##テット +Bre +供与 +入党 +共感 +寺田 +浮き +要領 +##ブリア +##ペス +##72 +##まか +##ルツブルク +トランスミッション +すり +プチ +ミキ +居る +聖地 +聴く +超過 +陣屋 +##やき +##キュラ +1857 +フェルナンド +シュタイン +乃木坂 +エステル +リプレイ +さらさ +##ello +リヤ +万葉 +各局 +廉価 +視力 +頼っ +満たさ +ft +コバ +コメンテ +口座 +##テロ +##ゴラ +アンモ +480 +Alb +Paul +Li +RK +おっ +入浴 +別途 +幽閉 +一夜 +不信 +##ジロ +##サキ +##YP +##止める +WAVE +京急 +分身 +施策 +##トロン +シェイクスピア +ピッツバーグ +アディ +剣士 +##IF +エルンスト +メリーランド +オク +モラ +紀州 +##aj +##rumental +コメンテーター +エプ +争奪 +入間 +洋子 +異端 +##コタ +クランク +サンパウロ +オセ +パトロ +ルター +万博 +東名 +ヒドロ +転職 +##mb +##ゴール +OG +降車 +つくら +Cap +ジーク +バチ +棄却 +武藤 +見知 +高倉 +ジャワ +スパイク +Bu +スチュ +受講 +安永 +岩国 +彦根 +水害 +訂正 +トラウマ +加古川 +オクラホマ +草原 +解像 +部会 +##・ビ +##illa +SV +スレ +ベリ +伊集 +吐き +大差 +登校 +肝臓 +魔族 +##よい +ディスコ +https +伊集院 +治水 +県都 +スム +断面 +月面 +派出 +諮問 +##メア +##分ける +ぬいぐるみ +DREAM +テラス +ハノー +大成 +近海 +Bi +公論 +兵装 +同上 +巡航 +行こう +見積 +フォレスト +フレッシュ +さだ +らい +ガブリエル +レック +最寄 +着ぐるみ +金利 +アーノ +ペンギン +デュオ +サファ +モンタ +リフ +久美子 +乗船 +八郎 +団長 +邦題 +##ペディア +フルーツ +コントラ +リットル +FINAL +久々 +敗者 +望ま +移築 +貞観 +MAS +Po +アクト +ラド +生還 +さんま +シンセサイ +リコ +催さ +原点 +定か +幕僚 +縁起 +1856 +トロフィー +せんしゅ +モト +議決 +##18 +マルティ +人柄 +執っ +学業 +忍び +手動 +泥棒 +肥後 +ディスカ +っ子 +へん +カラス +コリン +伝導 +挟み +水谷 +速報 +1700 +##ensis +イアン +ピュー +岸田 +クロック +##OME +モーリス +ベンツ +##endo +##デレラ +ISSN +にゃ +ブーツ +代々木 +効力 +外装 +揶揄 +祝い +銃身 +##よそ +Group +##ittle +ヒラ +疲れ +私的 +編み +裕子 +##たら +##デスリーガ +レオポ +プス +無断 +福知 +紀行 +##12 +いただ +手伝っ +由紀夫 +アイオワ +乱闘 +均衡 +手間 +##サム +##モー +ウェイン +##berg +ソマリア +小坂 +常盤 +滝川 +王宮 +算出 +緩やか +野戦 +驚き +1100 +ジャス +カルタゴ +フラット +Yah +アッシュ +エラ +光明 +小浜 +オリオン +PDF +カオス +来場 +歌声 +淀川 +David +Cy +KC +ナオ +万国 +妥協 +枠組み +##高い +ブレーブス +コイル +ダブリン +岡部 +新庄 +立派 +飲酒 +ワルシャワ +Not +ブタ +主計 +出兵 +磐田 +##ling +ディン +ジェームス +ウェスタン +ロビンソン +GC +減速 +錬金 +チャップ +持ち込ま +ローラー +##OCA +##ッシブ +宮田 +昨年 +特産 +畠山 +##ッラー +リーフ +##esents +##グラード +イワ +ケベック +元号 +神谷 +##・ナ +##UP +##仮名 +パスポート +エレクトロ +LAN +VI +岩井 +間に合わ +シンセサイザー +根岸 +欠席 +潜伏 +##タイトル +##ILE +##rain +買い物 +IMD +ルース +小平 +憑依 +細かく +ハブ +以西 +殲滅 +洗濯 +相性 +紡績 +行け +賃貸 +133 +##elle +テュー +四条 +弦楽 +後見 +栄光 +桑原 +芦屋 +##オウ +##eng +トリガー +富士通 +しお +バズ +共生 +天空 +宇多 +雑貨 +##ンドルフ +プロポ +知らせ +ブンデスリーガ +Af +TP +エーカー +クレー +ケニア +シルク +留まる +長安 +##ta +##ネスト +パブリック +PT +ブックス +マスト +一因 +工兵 +強固 +後押し +担保 +秀樹 +##ラール +スリランカ +だらけ +福知山 +Il +rpm +海面 +##ck +ヒンドゥー +おま +タスク +一層 +堀内 +家人 +強要 +滅ぼし +##オロ +##enter +アッシリア +Rem +演目 +激戦 +##de +引き取ら +振り回 +キャンベル +ナイジェリア +かたち +County +バレンシア +Sam +載っ +門前 +魔人 +##irect +AW +NWA +つと +夜中 +準州 +赤松 +重用 +##・ポ +##かかる +10000 +アトリエ +レジェンド +リオン +上水 +優子 +自害 +製菓 +##la +ラッキー +レンガ +基底 +履歴 +血圧 +闘い +驚異 +クリントン +##クラブ +覚える +##ーグル +DeNA +メルボルン +TW +同調 +後悔 +新居 +走者 +##ロア +チューブ +パーソナリティー +ジョーダン +Suica +ウラジーミル +カスティーリャ +NR +ペプ +共存 +襲来 +##ボク +グリップ +Hi +べし +兵員 +和彦 +清算 +##be +Champion +Lib +委任 +戦役 +明言 +秋元 +策略 +##掛かり +フランチェ +フィルター +クエ +刈谷 +簡素 +##・ユ +##千代 +乗馬 +劇作 +父母 +相関 +##ny +##シアム +ジャンクション +JB +いら +##EP +##END +ニュートン +Rich +Sw +キャンディ +Serv +コンタクト +インフルエンザ +gr +川西 +源泉 +筒井 +親しい +##ダスト +ティラ +##ファーソン +タール +バッド +ミミ +亀田 +壁画 +帰化 +苦しん +茨木 +闘士 +146 +##ンタイン +ケイト +ブダ +下着 +保留 +家業 +明智 +産卵 +かねて +たった +当面 +拠れ +発端 +開場 +随時 +##みつ +##倒し +##ンバーグ +##ブルドン +マッサ +丁寧 +休み +冗談 +回送 +架橋 +クーパー +IF +転々 +郡上 +ノーフォーク +発起 +社交 +身代 +##・ガ +スクロール +可愛い +ラベル +侍従 +儲け +割っ +圧迫 +揚陸 +素早く +負わ +麻布 +##ser +アレルギー +ちん +ほの +イナ +ヘルス +リッジ +伝来 +踏ん +##ルカ +アイコン +スーダン +##ANT +ドラムス +バッファロー +スルー +五島 +チャネル +引き起こさ +インテリア +バファローズ +あま +シノ +感想 +##ネーター +シュヴァ +380 +クロン +セクター +変態 +夜明け +実権 +短大 +祭壇 +IDOL +Mart +ph +パケット +後進 +熱狂 +絶大 +自生 +響き +##bur +オーブ +グラミー +グリッド +CN +刷新 +女装 +徳山 +感銘 +極限 +ウィンドウ +ティン +##iko +Pal +パウロ +人型 +和夫 +抜群 +捕ら +突出 +巻き起こ +ペナルティ +一大 +採ら +男児 +神明 +都督 +鳴き +##ごろ +NEXT +Good +エナジー +PAR +SRC +体当たり +四球 +天守 +廃線 +江川 +渡航 +近似 +##ッホ +##牟田 +ソフトボール +打ち出し +ニコラス +##OLL +サブタイトル +テュ +ワト +去り +太宰 +抜く +##重なる +##ates +心身 +艦橋 +陶器 +##iew +オスカー +インストゥル +途絶え +RECORDS +Hen +らし +パンダ +文脈 +硬化 +結界 +越中 +しげ +ほっ +赤城 +イースタン +モダン +ラプ +広め +手帳 +鳩山 +##イロ +##ウェン +##unes +グリル +GIR +気絶 +選曲 +##ザル +##さく +フィット +スワローズ +my +坂上 +強行 +強硬 +豊岡 +##ぶつ +シンデレラ +おおよそ +IMDb +メロン +モリス +回廊 +強姦 +船員 +雲南 +##・ソ +##バット +アルティ +カイロ +ウィンブルドン +シークレット +じい +カエル +乏しい +気体 +素人 +ウォルト +ノーザン +つま +ミノ +基板 +慕わ +洗浄 +苦悩 +英名 +都会 +##向け +301 +Heart +サングラス +涼子 +脊椎 +乗り場 +フットサル +入省 +同区 +水着 +Yahoo +WH +九十 +単線 +突進 +##OO +##ファーレン +よろ +ロドリ +信越 +坊主 +宝永 +対比 +府道 +浩二 +ひとみ +すすめ +WBO +ベック +売る +岩倉 +エンブレム +落とさ +オークション +##リノ +クリニック +マカオ +デコ +ピンチ +停戦 +客観 +進ま +##こく +##ative +310 +キッチン +ギミック +十郎 +津島 +キャバ +サイレント +プレゼン +スマイル +教え子 +ルクセン +国交 +業態 +銚子 +ジョブ +ランカ +フィリップス +ベンチャー +ミクロ +個展 +坂田 +奥羽 +沿革 +良き +配偶 +##79 +ウィンター +Radio +850 +共作 +劇的 +見れ +コールド +先制 +増資 +小原 +歩み +誠実 +預言 +Del +ウリ +オンタ +ワニ +吉井 +杉本 +松阪 +##キウス +##era +クラッチ +バトラー +ファントム +アガ +いや +不快 +暴れ +未亡 +秘め +艦上 +赤羽 +アトランティック +未亡人 +三沢 +土産 +映し +病原 +銃弾 +阿久 +##マール +ANN +交友 +因縁 +奇数 +帰投 +廃藩 +授賞 +##EG +##13 +受け取り +オンタリオ +Gal +ペリー +ボビー +マヨ +怒ら +東邦 +汚れ +益田 +雷撃 +162 +##ICK +ガイドライン +ゲオルク +ジョナサン +エッグ +店内 +捕縛 +教習 +滑り +##・ヴィ +##シャイン +宝物 +慈善 +野心 +両立 +両社 +握る +操り +決算 +沈ん +畜産 +##56 +##たる +134 +くち +中井 +急進 +果物 +##去る +レーニン +ざん +はっ +イモ +各務 +待た +##フー +レコーダー +Sci +押さえ +ギガ +下手 +天竜 +居酒 +帰属 +深海 +造園 +##ディウス +居酒屋 +PART +マタ +翻弄 +肥前 +阿南 +##ぱら +アンコール +たかし +伊那 +同然 +天理 +張本 +強奪 +流動 +精製 +##ミール +132 +乗り越え +キア +バター +分社 +揃え +本丸 +眠っ +##オリ +スタイ +サーチ +##ival +Fight +将兵 +ピクチャーズ +HO +オデ +フレー +光子 +清朝 +##gen +##カワ +##留め +ジャンボ +譲り受け +直し +造語 +##おる +##ILL +返り討ち +VF +叔母 +実弟 +新橋 +蘇生 +##バダ +乗り出し +SMAP +怖い +気づき +Anniversary +パトロール +カ所 +文禄 +##ITY +##オーリンズ +女児 +庇護 +木津 +理性 +税務 +複素 +##uel +##19 +1853 +ミケ +北道 +憲章 +松前 +注入 +流体 +規範 +##屋敷 +##ッツァ +##サンブル +しず +大別 +断り +解か +##ORY +フラッグ +##サック +##ぶし +プロパ +ダイジェスト +KAD +mus +下降 +介石 +島内 +恵比 +カリウム +スラヴ +ru +乱れ +堂々 +注い +熱い +##JP +シェフ +ワイヤー +ルクセンブルク +マンス +元町 +半田 +批准 +本島 +海中 +消える +緒方 +##ズス +##ci +##どか +デュエット +Ev +UR +クジラ +ルシ +上総 +推計 +芥川 +##ットガルト +話し合い +Game +カサ +変速 +大樹 +著しい +蒸留 +##・ヒ +##言葉 +ますます +アフター +##ウォー +Alex +よみ +トレイ +借用 +従え +整形 +桜花 +飛来 +##MM +ジャンヌ +Dis +見立て +##本松 +ニューオーリンズ +もっぱら +ALL +イブン +ドジャース +レシー +ロート +北魏 +原動 +名跡 +拡充 +歌曲 +輝き +##・ペ +##.. +##育て +##ima +##ense +請け負 +ロア +判別 +官吏 +##しめ +モーガン +FU +XX +音波 +PSP +カルト +ナンバ +全勝 +川田 +汽車 +赤道 +##ギニア +ワース +伝送 +有能 +石狩 +ジョゼフ +働きかけ +ピックアップ +インストゥルメンタル +あけ +さとう +サイボーグ +ハンデ +##ograp +キミ +犬山 +##アメリカ +ATP +##press +Sol +けれ +ハプス +藤村 +調布 +面接 +##JI +とどめ +エリス +コイ +今年 +多種 +漁師 +##aut +##やさ +逃げ出し +web +カノン +上る +賢者 +Park +ポピュラー +Cal +下北 +妨げ +対等 +山名 +Grand +致死 +##ロニア +Stre +##アイランド +みずほ +中道 +同族 +完封 +容認 +恵那 +爬虫 +生田 +稲垣 +譲受 +伊勢崎 +セイバー +Pat +エニックス +主戦 +嵯峨 +廃墟 +憲兵 +染め +海防 +王冠 +街区 +銀色 +ダウ +北山 +同化 +安保 +宣戦 +教材 +膨張 +買わ +##ニシ +##フェリー +ちゃんねる +##チスロ +der +原告 +着せ +##ヴン +##持っ +##暮らし +142 +##osa +ルーカス +OC +上川 +校章 +##クティブ +アニメーター +カタール +サスペ +ハプスブルク +Euro +卸売 +正直 +法科 +用地 +申告 +社屋 +竹本 +筑後 +脆弱 +身近 +鋼鉄 +##ドス +##ほう +##フォンソ +ねこ +京子 +匿名 +役立つ +溶解 +馬主 +アップル +all +シュタット +京極 +准将 +夕刊 +妻子 +##チレン +##ローラー +勝ち点 +当ては +パチスロ +即興 +政友 +顕微 +##コフスキー +しな +風刺 +##ゼー +デ・ +ムン +洛陽 +艦首 +院内 +##ッガー +Class +Ep +広げる +度重なる +甲賀 +貧乏 +##デンティ +ハス +上洛 +富豪 +トレードマーク +仁川 +他界 +血縁 +##リブ +シャーマン +##agram +カザフスタン +Hol +乗じ +代償 +信条 +同種 +若林 +葉山 +補う +関口 +アブドゥ +サトシ +時事 +王政 +脱線 +自律 +鉱石 +##置き +パスワード +サバイバル +軟式 +如く +花嫁 +苫小 +間際 +##line +##ars +##oto +苫小牧 +了承 +夏目 +##の内 +##伏せ +チェリー +シュトラ +##OKAWA +ブリュッセル +戦績 +長田 +風船 +フィッシャー +##アーノ +メモリアル +テクニカル +ばい +上がら +更生 +機甲 +瀕死 +##ho +ジャッキー +アンサンブル +作り出す +ギャンブル +大竹 +若葉 +銃器 +スライダー +Company +吉原 +羽生 +##り物 +テント +色素 +請負 +長者 +##着き +##利き +##ンジン +ステート +ジョルジュ +長島 +イーグル +シュトゥットガルト +おや +モンド +右打 +唱える +妥当 +熱田 +磁場 +舞踏 +##ison +##els +##OWN +KADOKAWA +Sk +右派 +恐ろ +憎悪 +残党 +混成 +連発 +##チモア +OL +さやか +タックル +全額 +川原 +終着 +美しく +費やし +##ブレッド +ジェンダー +スナイ +副官 +助演 +枚方 +田畑 +舞い +長良 +離反 +アスリート +ゲルマン +カフ +ボディー +国税 +沙汰 +IBF +バドミントン +尾翼 +次ぎ +田島 +監獄 +##麻呂 +アトラス +シャーロット +UTC +柏原 +できれ +ランニング +1852 +カント +下層 +学力 +布教 +曲名 +松村 +ギャップ +ふさわしい +オリーブ +Miss +倒壊 +砲身 +綴り +##なじみ +乗り物 +ハニー +受領 +命じる +軍需 +##ブー +##ノイド +##ゴメ +##ッキリ +##ference +オムニバス +Lu +コソ +仮設 +地雷 +増発 +虚偽 +触手 +153 +##ショナ +大町 +巻い +鳥栖 +いわく +よしもと +コックピット +カッター +二宮 +初年 +建つ +焼け +##どころ +##ターズ +スパーク +祈祷 +##メート +アニマル +チキン +ネガ +掛川 +見込ま +##の中 +##離れ +ジョーカー +ボルチモア +キャピタル +クラリネット +ビースト +充当 +彼氏 +高まる +##ギア +##モデル +##GE +亡くなり +スリップ +コネチカ +景勝 +着物 +##der +##ヤーズ +マーベル +##AGUE +FNN +エイト +半減 +新線 +##カール +##嫌い +杉田 +泣い +競り +防備 +風味 +パイレーツ +##AME +コネチカット +メット +ヨウ +人力 +投影 +誘惑 +遊歩 +面々 +##by +##16 +##レーティング +##キャラ +服用 +霧島 +フランケン +ローテーション +繰り上げ +ベンジャ +恋心 +震度 +##ビナ +##トム +ヌード +築く +肥満 +##366 +##いん +LEAGUE +man +ナミ +マダ +子育て +語彙 +またがる +アキラ +Of +ラット +到来 +指針 +有楽 +梗塞 +武帝 +ファウ +取り外 +ジョヴァン +カーネル +##ript +SB +スパー +ポット +大麻 +平壌 +点火 +王権 +ストックホルム +背負っ +go +レズ +催眠 +揚げ +##ks +##なぎ +おまけ +GEN +上尾 +信じる +叙任 +喋る +夕張 +重工 +##パード +コンビニエンス +Batt +Lim +TA +ドバイ +ベータ +城南 +皇女 +細部 +鬼太郎 +##58 +##がた +##リエット +気づか +くみ +とれ +ほし +聴覚 +蒲生 +##・シュ +ベルン +サラブレッド +抜け出し +9000 +吉備 +広範 +快適 +殺到 +発効 +西野 +##クロス +TT +ザク +上段 +皆無 +ダイレクト +ティル +ポートランド +スキャンダル +KE +ゼウス +開ける +高射 +##ッショナル +##ロップ +##ショー +ミラクル +おそれ +ツーリング +浮かぶ +パンタグラフ +JF +上っ +台場 +##パイ +フォア +United +モナコ +Jose +デマンド +叶わ +幸子 +幼年 +慰霊 +高台 +##・ピ +##リエン +デュアル +殺し屋 +Ju +マロ +全幅 +文句 +##ずり +##曽根 +チャット +ディーラー +Im +揖斐 +登り +##デシュ +ウィルス +いとう +てれ +パッド +両面 +品番 +貸出 +跨線 +##出る +シャワー +Ap +パッチ +休戦 +停泊 +出願 +黎明 +##OG +Arch +ボヘミア +二男 +別当 +目玉 +貰っ +##ret +カーボン +Gi +ヘレン +伐採 +株価 +直行 +線型 +翌朝 +養育 +インフォ +マシーン +レガ +産ん +遊戯 +高騰 +##ペイ +カリスマ +LM +ウイン +下がっ +囚われ +地価 +拡幅 +甲州 +賀茂 +配し +重巡 +##ラシア +##残し +##ross +##ティーノ +YouTuber +Phil +カンタ +ヒカル +停滞 +嫌う +旧道 +漬け +農産 +通達 +##マルク +##ough +##ional +カルロ +アラバマ +シンクロ +寄宿 +捕鯨 +明王 +賭博 +##yle +##ube +せつ +城内 +場外 +持参 +連帯 +門人 +降る +ウィー +Type +元首 +多項 +新春 +須賀 +飲ま +ガーディアン +ストリーミング +ライプツィヒ +目の当たり +OEM +下げる +内面 +大道 +愛子 +退去 +##ータン +1851 +享年 +信夫 +卓越 +製法 +重なり +##去り +チャリティー +##ジャック +いとこ +Fire +ちか +はつ +ラビ +壊し +懇願 +気球 +軍曹 +持ち込み +言い渡さ +催し +国定 +申し立て +いたる +さかのぼ +ばあ +バング +合間 +礼儀 +醍醐 +##ちょ +教職員 +Video +バロン +健太郎 +死因 +高値 +##バサ +##アーズ +しみ +加納 +恐らく +戦中 +本科 +灌漑 +##ートニー +パーキング +書き込み +リベラル +Nint +ぞく +備中 +冷蔵 +同定 +咲く +園内 +埴輪 +従わ +祭典 +##ワート +##ガード +取りや +つなぎ +いち早く +春日井 +##ポリタン +ベンジャミン +レッズ +余剰 +##出そう +少なから +フリーランス +##ird +WOW +原宿 +星雲 +石山 +225 +Sound +iT +リップ +ローター +同書 +大岡 +耕作 +##orld +##ister +持ち合わせ +340 +##ルンベルク +レジスタンス +EURO +健在 +嫌わ +杉浦 +荒井 +##ッチャ +Edition +けれど +BIG +たど +テッド +互角 +逆襲 +ジャガー +取り込ま +##ステークス +ローソン +Sim +コープ +パット +休館 +手下 +新星 +検知 +産生 +##che +##ージョン +##irst +1849 +コスモス +Light +そん +ルン +共学 +判例 +名字 +延べ +洗練 +矢部 +##ザック +##フォルト +苦しめ +コモン +覆い +誤差 +##モール +取り囲 +##icial +アイデンティ +スピーチ +WR +奉公 +##ズラ +##ボルト +##ッチェ +##ady +ウエスタン +JNN +ほく +##多摩 +##フィクション +ウェザー +スコープ +トゥル +オペレーティング +見送ら +ウズベキスタン +Switch +なだ +クレーター +世俗 +和子 +寺町 +本流 +終日 +##リィ +キャッスル +ウェイト +SPECIAL +メイト +レノン +右京 +枢機 +アルカリ +披露目 +ミハイル +Nintendo +UD +兼ねる +冷酷 +武官 +氏名 +狩野 +鉄鋼 +##デール +ディック +とうきょう +TB +いじ +かおり +ギネス +チュニ +入江 +戦勝 +祭礼 +赤く +飢饉 +黒幕 +##がす +##ルトゥ +MOV +割譲 +絵柄 +野々 +##ーア +##ヨシ +DIS +がる +みの +やさ +神官 +筑摩 +繊細 +配当 +カンヌ +一躍 +引か +来訪 +面識 +256 +かわり +河岸 +混血 +##キーパー +Let +Mem +エックス +増す +安達 +平戸 +戦災 +物品 +裁定 +電荷 +驚か +##がえる +##らわ +フィーチャー +Max +万能 +円谷 +列挙 +専業 +必然 +藤子 +##ko +##ヤマ +##ノア +キャスティング +バディ +欲望 +没年 +眠る +覆面 +##プラノ +富裕 +文理 +##しむ +バラバラ +プロフェッショナル +Luc +ちび +両軍 +仏像 +前向き +南町 +実録 +東岸 +楽園 +野中 +鋼製 +##タケ +##之内 +##ula +ツイート +Ca +Out +君臨 +地層 +帝王 +Instit +リサイクル +サタデー +優し +参列 +土日 +未定 +水銀 +見なし +##込める +del +導か +美和 +美智 +自我 +GPS +Da +Di +のん +ダコタ +坂東 +尋問 +町村 +百姓 +荒れ +##oon +##HA +ストレ +マグマ +タンカー +レディース +公害 +凶暴 +刺客 +収縮 +無双 +躊躇 +##ぶん +レナ +十和田 +新入 +森山 +生計 +相方 +西園 +黒木 +##キス +##チコ +##ゼット +ジョッキー +##チェル +##erson +##AMP +トゥール +Your +ウイグル +エカ +制動 +甚大 +相場 +行先 +受け止め +##ブリュ +インタフェース +マッカートニー +]、 +タカラ +ヘヴィ +リヨン +召し +左京 +日数 +登頂 +Version +商社 +嫡子 +空白 +誓っ +農協 +##li +##リアーズ +##ッカーズ +Ref +おもに +Soci +シオン +ツル +下表 +中流 +隔週 +##ベラ +果たせ +ダイビング +##ナンデス +メラ +レックス +前夜 +啓蒙 +浮気 +見逃 +限っ +##ORE +とし +ブール +世の中 +帝政 +手首 +歯車 +残骸 +筆記 +##RA +1820 +取り込ん +キプロス +ぎん +シオ +ズーム +ビクトリア +出所 +手当 +決心 +過度 +トラベル +Child +ワークショップ +ステアリング +出仕 +切ら +商法 +在庫 +壁面 +挙兵 +極秘 +略し +老舗 +高瀬 +高尾 +Corpor +宇和島 +DB +アエ +執着 +近傍 +金持ち +ハンセン +ファルコン +尾上 +本曲 +滑らか +高官 +##クシ +引き出し +ポップス +カウンセ +スチール +なぎ +らしき +大雨 +客船 +探る +解き +身柄 +##キラ +208 +##ANCE +アトレ +大倉 +纏っ +##バチ +##ノサウルス +##調べ +ラピ +ラント +千種 +譲る +##ロワ +##DER +Boy +ゆい +早世 +無力 +フェデ +セルゲイ +ニュルンベルク +主君 +拝殿 +随筆 +飛翔 +##・ヴァ +アドバンス +ネイティブ +コンポーネ +取り壊さ +Sant +オメガ +国造 +漁船 +試練 +降っ +154 +Ke +Mil +党内 +国歌 +故人 +有る +郷里 +頭蓋 +鶴田 +ジョシュ +沈黙 +近親 +あっさり +フェミニ +##イスキー +フレッド +ノンフィクション +シリアル +いさ +ばし +ケビン +勝山 +和音 +小名 +抜ける +正午 +特捜 +転任 +辞し +##ring +##モンテ +リヴァプール +May +シネ +夢中 +##ニット +##まじ +ヨルダン +恵比寿 +サスペンス +ふし +元祖 +可視 +多田 +数える +毛皮 +水質 +パンフ +いたずら +しゅん +回顧 +寒冷 +規律 +マルティン +##une +サムライ +類型 +##KS +アクシ +セス +建武 +木戸 +##ティコ +まちづくり +キツ +下士 +永正 +省庁 +託さ +##lin +FEST +Little +Na +ぶら +偽造 +傷つけ +冷たい +裏側 +##idae +ルーシ +HC +さつ +スバル +ナツ +マッハ +ミレ +リナ +因む +目前 +##TP +##モノ +ヘルシン +##aint +カエサル +IG +まえ +わん +創価 +救世 +林業 +神輿 +細く +贈っ +難航 +ことば +##ストロング +寄せる +岸和田 +矯正 +##ゼーション +スナック +ザイ +傾倒 +委ね +字体 +風間 +##59 +##わざ +コンプ +STAR +サメ +シモン +ベニ +日誌 +榎本 +聴き +通す +タブレット +Michael +SRCL +イロ +トータル +ラルフ +匂い +旅人 +病床 +##じま +SPOR +ツイッター +Nav +ゲオル +村域 +枢密 +消極 +酒場 +レプリカ +Bab +Dig +ピート +一夫 +周防 +立像 +##・テ +1846 +テンション +イルカ +ブダペスト +ベス +氾濫 +災い +転出 +##ural +追い込ん +ヴェストファーレン +プエルトリコ +iTunes +ソルト +リラ +団結 +恩恵 +捕え +直訳 +著述 +##77 +生き物 +セレクト +おこなう +##・ディビシオン +コンスタンティノ +リソース +JFL +不祥 +傷害 +太い +生後 +藤枝 +##カルド +マグネ +スティール +##ロニクス +カクテル +冊子 +官邸 +整っ +育児 +褒章 +躍進 +長江 +静脈 +##53 +##ンドー +ジュール +ETC +Fre +上告 +初恋 +年鑑 +後醍 +正徳 +滝沢 +目さ +積雪 +練り +選任 +関根 +黒崎 +##ベリ +ヴァレ +##ウィック +後醍醐 +アウェー +没落 +河村 +自発 +花序 +阿武 +##14 +##河内 +受け付け +乗り入れる +クレオ +スキャン +Charles +FE +ゲッ +老中 +##・ジュ +##合わさ +取り扱っ +メドレー +Pop +Sa +ズボン +トマ +海南 +特訓 +立山 +配線 +##olf +ダイナミック +パンフレット +はめ +検閲 +##パラ +バスケ +組み合わせる +そちら +仲裁 +劉備 +懸命 +救難 +破れ +繋ぐ +##オフ +ジェファーソン +サイコロ +シンフォ +Arc +取り上げる +COVID +Sky +山野 +##リータ +##ular +つくっ +WC +203 +##very +##ublic +Dan +Gold +トンプソン +亀井 +壱岐 +法典 +神事 +野沢 +##せつ +オーロラ +##ーツク +ガルシア +Thomas +ドリンク +七尾 +前座 +柳田 +様相 +蒲田 +##バルディア +エドゥ +ゴルゴ +オアシス +YU +みらい +セーフ +木更 +植木 +油圧 +町民 +Store +##クラテス +カウントダウン +マッカーサー +木更津 +ペダル +桃太郎 +竹中 +補修 +##ラーレン +チャック +デュエル +支払っ +ブックレット +エージェンシー +Mel +サタン +合図 +直下 +窃盗 +邪悪 +システムズ +やん +丹羽 +言論 +谷村 +タフ +ツィ +好奇 +慣例 +画期 +釜石 +##そく +##差し +ジョアン +ユーモア +ヘビ +マッキ +付さ +小豆 +島々 +未熟 +見出さ +マヌエル +産む +異議 +##スン +##ッチメント +アテナイ +例え +年限 +頓挫 +##マイズ +Mat +デフォルト +レポーター +企て +叙せ +滅び +##ナダ +Office +FNS +MH +シティー +秒間 +退位 +##クトップ +ボーカリスト +シャーシ +API +##otten +チェルシー +イケメン +モテ +茶道 +農耕 +##だち +##コンシン +FIA +デスクトップ +浴びる +IL +同法 +存命 +平城 +弾い +復員 +着い +葛西 +違和 +重度 +##ボット +##代子 +イト +城郭 +応永 +桜木 +##ん坊 +##ぶさ +ウィザード +スターリング +いわば +##OWER +ふと +アリスト +ジア +水槽 +濃く +熱中 +野手 +隔て +##ラウ +##帰り +ストリング +##APP +Direct +ブス +三上 +参詣 +叫ん +極楽 +##ery +143 +##oud +ボウリング +チャーチル +立ち向かう +Big +Lab +カッコ +修繕 +公子 +実物 +監察 +祝う +サンシャイン +スペンサー +##ハーサル +ノヴァ +ポロ +レンジャーズ +三鷹 +拾っ +絶命 +誤認 +##ien +##uch +430 +オペレーション +DOS +あかり +すく +リハーサル +光秀 +旧約 +美作 +##百合 +ジグ +戦列 +振ら +撮っ +溶液 +症例 +被爆 +電器 +##FT +##ノラマ +ついで +インテリ +イヴァン +チー +ニセ +主軸 +全高 +由美 +##ミド +ナビゲーター +こっ +ひばり +エアー +付か +有線 +正則 +水没 +##投げ +ウェルズ +key +づき +イシ +ラオス +射出 +振っ +採り +新車 +絶縁 +美穂 +賢治 +いちご +アームストロング +ウィスコンシン +ベンガル +使役 +奥義 +少量 +返答 +銅像 +龍馬 +シルエット +##bert +尽くす +うみ +戦わ +打球 +提訴 +治め +自粛 +走ら +越し +都城 +##SU +##ビッチ +##ったり +##omb +スクリ +いちろう +クロスオーバー +##・ド・ +のぼる +イスタン +モットー +レパート +十勝 +因果 +小杉 +漂流 +画質 +税金 +行え +##ME +##PC +見つから +ロースター +余地 +古事 +安い +森本 +騙さ +シンシナ +Fil +MI +NK +スン +加害 +念願 +手持ち +独断 +線維 +難い +風習 +4547 +上り線 +Franc +かれ +平衡 +脱獄 +音速 +##ボラ +##こし +アイディア +送り出し +ボリビア +おし +ぶっ +スワン +伝授 +分担 +半期 +発熱 +貫く +##バオ +パーフェクト +##ander +##IVAL +リモート +ウィキペディア +ラトビア +KB +Ob +RD +ホビー +志す +本性 +格付け +ランディ +1845 +スタンフォード +BLUE +リンダ +加担 +国文 +扶桑 +系外 +豆腐 +軍部 +ジュラ +AE +Hist +ケプラー +美咲 +##cess +##itz +##ume +Team +リグ +レフェリー +巨乳 +幼なじみ +田町 +登用 +重なる +頼む +##hr +フランコ +プリメ +4547366 +Bel +ad +ねえ +狂気 +番長 +盗ま +裏腹 +音節 +##ムラー +さほど +コブラ +ハプ +人衆 +和也 +榴弾 +親密 +フィード +##ACT +Hy +デア +ベジ +一座 +北原 +文科 +滅ぼさ +粉砕 +臨済 +ゼー +タイル +バント +モビル +視線 +持ちかけ +##ICA +シンシナティ +Roy +勇敢 +狭山 +美里 +贈呈 +鴨川 +##ga +##va +##ダンス +##之島 +##歩い +アトム +申し入れ +ケルト +三越 +博文 +本宮 +水木 +簡略 +網走 +臭い +##メト +##マネ +##gy +コースト +1843 +ヴェルディ +Kr +かさ +外壁 +市外 +日時 +時速 +眺め +芝生 +軍令 +172 +007 +ユーラシア +1837 +わざと +三和 +下がる +丸い +延宝 +恵子 +捕まえ +暗躍 +柏木 +残虐 +##ルドー +フレンチ +レパートリー +FK +執拗 +実母 +飽和 +スクラン +イエズス +アタッチメント +ひろみ +ペリ +リガ +リフレ +叩く +大当たり +新装 +聖子 +##グレード +1844 +Tim +TIME +アステ +ペレ +ワイヤ +中南 +童子 +高見 +##サール +##ルドバ +UK +Wr +そら +とに +ニャン +密集 +東国 +治癒 +登る +##メド +##lo +##ブリー +##ゲー +##寄せる +163 +##フスキ +メトロポリタン +気付き +George +Free +Land +よかっ +久慈 +内山 +募金 +##ムント +##カライズ +下り線 +のぞみ +下る +占有 +置県 +##んと +##飾り +211 +##ッツィ +##obile +大腸 +構図 +気仙 +音頭 +##アリ +Sur +サプライズ +セクシー +ドロー +加減 +民生 +緯度 +試行 +酒田 +##ばっ +ガンマ +コンポーネント +WIN +つう +ビザン +事柄 +捕まっ +街路 +遊牧 +雇っ +##メンス +##FF +サンゴ +プライス +ハノーファー +ハク +先立ち +勘定 +口腔 +失望 +石見 +肉食 +エドガー +スイング +スイート +##ンバラ +カスタマイズ +伸ばす +太一 +村井 +精通 +終末 +越谷 +ともさ +引き渡さ +1806 +グレゴリオ +TN +ザック +全焼 +八雲 +州間 +林家 +猪木 +##レッタ +チューニング +ブランデンブルク +##ツィオーネ +とにかく +おろ +ハッ +千鳥 +札所 +桟橋 +温厚 +至近 +##go +##ニェ +##ani +カイザー +Corporation +NDL +きよ +サニー +久喜 +以東 +台中 +同好 +寄港 +新道 +江原 +英米 +##PO +クーペ +しゃべり +セブ +デリー +ボンド +ミト +曽根 +白馬 +取り消し +Oper +PI +ケイン +内地 +大家 +宴会 +末尾 +萌え +##もる +ステイ +パーソン +ラファエル +Championship +コマン +変革 +宿場 +新鮮 +月光 +破滅 +部活 +打ち切ら +カタカナ +Summer +ソープ +ハビ +レトロ +先立っ +六甲 +宗派 +赤ん坊 +過失 +##uz +チャール +引き渡し +すき +サザ +令嬢 +体積 +分隊 +守山 +実効 +松坂 +物価 +##返っ +マインド +##チュエ +##ude +コフ +真ん +脊髄 +褒め +##ウイ +##すら +##んどん +##エンヌ +ブエノス +めん +オード +下山 +佐々 +体勢 +国名 +廊下 +快く +戸惑 +機首 +アーノルド +エフェクト +サガ +入港 +同郷 +同義 +小数 +環礁 +覆っ +諸葛 +議院 +酔っ +隠蔽 +##サード +##arm +ウルトラマン +##カロライナ +吉祥寺 +コソボ +ゼミ +同心 +山上 +群島 +赤ちゃん +##cin +ステファ +ミラージュ +あおい +クリック +宮島 +形質 +掴み +敷か +製鋼 +須藤 +駐日 +##ツク +キャリー +ファステ +コントローラ +争わ +健二 +児島 +別所 +包み +地頭 +拳法 +黒澤 +Elect +Wil +day +コブ +リンチ +勤労 +大英 +消去 +逓信 +長屋 +エスパー +キュア +苦しむ +ヘルシンキ +タナ +レグ +下宿 +前任 +大牟田 +悪人 +所定 +##ミオ +##ぞう +バレンタイン +コペン +タツ +幻覚 +抑圧 +撃つ +減り +黒部 +##・プ +##ca +##ピラ +##びれ +バレル +per +シモ +パブリ +中途 +垂れ +家出 +山林 +渤海 +福原 +願う +騎馬 +##ミヤ +164 +1847 +アジト +Girls +Cry +DL +ふそう +ヒゲ +反感 +合祀 +啓発 +祀っ +若しくは +##ッレ +##・キ +##放し +チャイルド +ギルバート +推し進 +リマスター +タップ +ボット +仙人 +山王 +廃し +彩色 +支庁 +苦痛 +荒野 +血球 +追贈 +雇い +離島 +負け越し +ジョヴァンニ +"、 +内訳 +皐月 +軍務 +カーニバル +ファステスト +シム +値段 +大喜 +孵化 +手形 +沢東 +渡部 +竹下 +##タム +フランチェスコ +真ん中 +RB +ゴート +丸の内 +怪力 +捧げる +##イェ +取り出し +バーガー +1841 +コレクター +##URE +Tre +アユ +山県 +方位 +破裂 +##ole +365 +##ナンシャル +あさひ +##グループ +Instagram +あかね +いの +みか +よん +トク +ドニ +官庁 +局面 +態勢 +日田 +誘発 +##ヶ岳 +持ち上げ +##ague +切り替える +トロイ +結びつい +ペルシャ +WWF +as +サヴォ +三陸 +伝染 +呼応 +国教 +水原 +組曲 +##ベー +グラハム +サウスカロライナ +he +びょう +アヴェ +ムード +小石 +布施 +或いは +##cript +##ユーズ +##xt +##ンチャ +##ーグナー +しょく +RX +トモ +名取 +嗜好 +戊辰 +榊原 +汚職 +衆院 +##rid +##マツ +キャッツ +ウィズ +スマッシュ +かぶっ +カブト +HM +Rom +しげる +にい +ひい +シンジ +伝播 +子宮 +挙句 +日置 +洋楽 +##・ジャ +Ant +モノクロ +いこう +パティ +予科 +大祭 +気質 +独り +誌上 +謀反 +間近 +##ソーム +シャム +##unt +インデックス +##ボクシング +岩本 +数量 +許す +銘打 +##リーノ +持ち出し +999 +西園寺 +KING +ピョ +ブレン +伏せ +宮沢 +豊中 +風力 +魔獣 +##太后 +デザート +メイキング +振るわ +クローバー +ガリシア +und +イジ +三宮 +古田 +呉服 +委嘱 +菊地 +陛下 +ハーバー +KT +交替 +小国 +年内 +欠い +海浜 +頻発 +##町村 +引き取っ +気付か +収支 +寄席 +暖房 +柳生 +##ストリー +レオナルド +アレクサンドリア +反復 +延岡 +従者 +206 +##ドンナ +RADIO +ps +ナイツ +ヨット +上人 +回生 +根室 +着想 +重症 +##tm +##gram +読み切り +##キンソン +バケ +バートン +ミナ +居留 +素性 +やっと +##ブラハム +マディソン +ジロ +代金 +困惑 +小谷 +水車 +青空 +##加え +##ori +ブレーメン +パルマ +WOWOW +Sel +ぐち +エタ +リル +刻印 +航続 +タイタン +##ste +浴びせ +##tainment +イスタンブール +End +Wal +上山 +多忙 +帯域 +改番 +栄町 +##キナ +プロット +Studio +mod +ハープ +今村 +名神 +式内 +成形 +殺そう +沢村 +法師 +脅し +プラットホーム +コペンハーゲン +Top +qu +保ち +敗走 +粉末 +藩政 +西原 +##リニスト +コンソール +ブラス +ヴァルト +スチュワート +ウイスキー +ノール +父方 +給料 +計上 +間柄 +飛ばさ +##シアン +ハロルド +取りやめ +Mad +パ・リーグ +談話 +##ターニュ +1815 +ホイット +FOX +大柄 +思惑 +面影 +魅了 +##ビオ +##ぶき +ルーフ +プリメーラ +ラーン +前輪 +強襲 +役柄 +私有 +被弾 +誓う +長井 +##アラ +オシ +取組 +地味 +当寺 +従前 +故意 +晋三 +民政 +水沢 +総局 +501 +##ヴェー +Jean +がかっ +キノ +バシ +ブリス +マスタ +切符 +島村 +弁天 +治虫 +添付 +精鋭 +##ッショ +##張る +リーマン +取り締 +440 +飛び降り +はじまり +エレクトロニクス +かげ +のぶ +ケロ +堀田 +尊氏 +掴ん +西北 +軍政 +退院 +送付 +ブルターニュ +目論む +College +恐ろしい +ひっ +ザル +ヤス +リキ +供述 +出征 +感知 +散布 +陽気 +黒く +GRE +くう +富ん +払っ +捉える +##メディア +##ドックス +##ange +グラブ +Sports +Street +MOVIE +アゲ +手腕 +江口 +透過 +限度 +1842 +1832 +Book +同位 +履行 +弘文 +成虫 +残酷 +##ヨウ +アルタ +サンプリング +370 +グレッグ +チューナー +NDLJP +Center +ワット +戦況 +気流 +罷免 +車輛 +##rich +##ソリ +##ホル +エディンバラ +##アイレス +成り立つ +##weet +タイト +一向 +柳川 +由利 +落札 +試し +足場 +連打 +##ウリ +エト +ニッケル +同情 +市議 +梶原 +秋月 +金賞 +##ポス +##AV +##イチ +##テュ +##ira +チンギス +ラッピング +リチウム +ロイス +圧勝 +寛容 +##PR +デューク +KS +Vir +れれ +タモリ +一杯 +動植 +塩素 +怪盗 +旧式 +死な +沙織 +清原 +誘っ +##ビック +##テリア +アーバン +こうじ +##mann +カートリッジ +Av +ポテン +京橋 +抱か +機長 +羽目 +通例 +野原 +サンズ +Si +te +ござい +ざい +化身 +平氏 +旧名 +海抜 +辰巳 +フィッツ +マルセイ +はじめる +ハント +ムーブ +レベ +囲む +拒ん +特製 +頭角 +##すぐ +##ディック +取り込み +ジュリアン +ピストル +レギ +先手 +桃子 +浦安 +生む +顔立ち +##システム +204 +##ジェット +##earch +アンソロジー +有楽町 +Home +ed +イット +山門 +聖徳 +術師 +謹慎 +##マド +##agon +追い詰める +##シェン +しのぶ +ブエノスアイレス +キヤ +下町 +四肢 +晒さ +魔道 +##シャス +マクラーレン +LIFE +とどまり +うさぎ +がたい +ザール +安城 +##・ジ +##ware +##こみ +290 +ローリー +柔らかい +##・フォン・ +全仏 +散乱 +疫病 +竜巻 +騙し +##レフ +##恵子 +ヴィラ +トラスト +すごい +ラバウル +アロン +ウミ +ポータル +ラッパー +二階 +団員 +尼子 +曾孫 +賛否 +足ら +車軸 +##57 +##ダック +フェンス +##ファル +組み込ん +おとな +Tomato +Kh +Ol +Vis +アントン +ゲット +ベオ +内心 +合致 +商科 +異星 +美貌 +骨髄 +##モフ +シュウ +グアム +サック +スギ +下落 +侮辱 +勝田 +厳重 +文武 +新製 +機嫌 +湖南 +長髪 +##ning +##gar +##シュト +ビルド +ガンバ +##ザンヌ +おおさか +イノベーション +North +VOL +ナチュ +多量 +渋川 +解け +隆起 +飛ばす +##セー +##ws +##てん +クラウス +##ida +追いや +バークレー +返り咲 +分譲 +表せる +チャーター +##ters +##ADE +スレイ +ハガ +神山 +若宮 +##ih +##カーナ +オルガ +1812 +デーモン +ロータス +刀剣 +加増 +水溶 +流路 +浙江 +経典 +込み +##・ノ +##里子 +みなす +Instrumental +きちんと +稼い +膨ら +軌跡 +重心 +防具 +##蹴り +ファイアー +CAS +ブイ +失調 +孫娘 +菅野 +誘う +駅員 +##トゥー +White +インスリン +ナガ +ロッキー +各部 +怪談 +白く +身延 +##付く +シャフト +1836 +ゲイリー +Great +動植物 +パウル +同線 +急逝 +探求 +日出 +本間 +毎時 +脇役 +##ジスタ +##リアー +ウェポン +ネクスト +セグンダ +オースティン +アクセサリー +Society +Master +Rotten +ゴット +トラス +別称 +向ける +届出 +市町村 +栄一 +螺旋 +##ple +##カデ +ニューズ +ターナー +Richard +ロドリゲス +Fer +HR +こま +やつ +バトン +劣勢 +打線 +コミカル +ティーン +##ection +KDDI +ネロ +ピル +亜美 +安部 +紫外 +苦情 +課金 +開基 +高津 +##GO +スピリッツ +アラゴン +9784 +##ITE +MAG +即ち +感度 +懲戒 +稼ぐ +切り裂 +エント +ドス +低速 +年数 +惨敗 +板垣 +橋上 +用心 +規程 +限る +随所 +##メロ +##BE +##ゴビナ +##あわせ +##ティックス +ブラザース +掛け声 +聞こえる +ミッチェル +Mal +受理 +山西 +川沿い +施す +残念 +濡れ +腎臓 +##プタ +##ちこ +アンプ +##チョフ +##ビュート +xx +塩田 +投降 +推挙 +材質 +石造 +習志 +蔓延 +転勤 +##マム +##ろさ +##テック +##けい +UFJ +##GBT +sy +シックス +分署 +東横 +機内 +熟練 +角田 +##巻く +アルス +ATS +習志野 +Cast +イデオ +参与 +城東 +売場 +愛車 +携行 +着地 +綺麗 +藤堂 +##con +##広島 +##ティクス +##ルドルフ +ルーシー +ノウハウ +ゆず +アット +クウェ +サターン +右足 +奪回 +統率 +遺し +##52 +ファンク +書き換え +トレーラー +BLACK +Lou +SI +ダック +マナー +充填 +球体 +着色 +福建 +続投 +親しみ +##フライ +##CD +##ノ島 +##ゴット +一人娘 +ハーブ +ゆうき +##ift +クォーター +ゴリ +亜鉛 +低かっ +偏見 +参院 +破ら +終身 +補習 +フラツィオーネ +ゴルファー +アバター +FX +コルト +ピオ +ラズ +上智 +宝島 +実兄 +屋号 +智子 +製剤 +速やか +鍵盤 +209 +リアス +取扱い +VO +ab +su +イデ +ボナ +円錐 +在り +転覆 +部局 +##イー +##ゴーニュ +カーテン +シンポ +1789 +ぶつけ +わら +結集 +##若松 +マクシミ +会津若松 +ひかる +セリ +再起 +悪事 +華麗 +蜘蛛 +遠江 +チェンバ +落ち込ん +1814 +SUN +nm +うめ +座敷 +本陣 +賞品 +##なべ +クララ +ストー +ゴールキーパー +キロワット +MiG +いで +和尚 +宮原 +操車 +##SA +やりとり +Year +エレン +原油 +改易 +菊花 +表れ +##aki +ヒューズ +各務原 +パース +ペガ +ロザ +土方 +安堵 +放課 +日の +葛藤 +遷移 +##ージナル +410 +##udio +突き刺 +チャイナ +##モロコシ +下す +曲げ +武雄 +死別 +知覚 +脂質 +##ペクト +##zo +##リスタ +見つかり +問い合わせ +Ger +ごみ +ヤシ +作ろう +凶悪 +水位 +訳語 +##YO +オーシャン +presents +ノルマンディー +フェルディナント +すっかり +エネ +人魚 +切腹 +失速 +村落 +開学 +##バンド +リーディング +クライン +フォロー +カルボ +バンパー +##awa +きれい +エスカレーター +Gar +Jun +ちゅ +カビ +バニ +ペイント +内乱 +嘱託 +工具 +握手 +沈着 +義父 +順子 +黒海 +##ナガ +##ケア +##oth +きっぷ +420 +Pri +バラン +対艦 +川辺 +悟り +払う +取り付ける +引き連れ +##ope +トウモロコシ +Tomatoes +Tor +コリンズ +ピーチ +本艦 +筑前 +続出 +##ザイク +##掛かっ +カリキュ +マッサージ +Bus +よら +キレ +ノーマン +中尾 +外す +要職 +謙信 +ステラ +置き換える +マリーンズ +カシ +両用 +人的 +欠番 +船内 +足跡 +連なる +##はし +いっしょ +エアバス +Cat +ソプラノ +パープル +中絶 +侵食 +女房 +幸運 +東欧 +森下 +減る +編著 +サーベル +マネージメント +シアン +蒸発 +##BL +##ニングラード +トレイル +##OTO +IW +no +林道 +湯沢 +祝賀 +訃報 +Show +ケンカ +アイデンティティ +ゆみ +マーズ +ミント +上面 +南山 +放り +栗田 +沈め +無敗 +自決 +裏切っ +財源 +迫撃 +隠岐 +館長 +##語り +ユニバース +フォーカス +NEO +ストライカー +Party +づける +ドナウ +傀儡 +分室 +止まる +無機 +返却 +通年 +頭痛 +##istr +コウモリ +ひどく +鳴き声 +Ba +GOLD +包ん +大まか +念仏 +異形 +脚部 +##ツジ +ブライト +打ち破 +Arm +エミー +リターン +ロワ +欠損 +花粉 +ディヴィ +立ち上げる +巻き込ん +バラエティー +XP +やろう +助力 +叩い +完備 +宗像 +弾く +抜か +持て +ウォーレン +ボア +士気 +県会 +ライカ +##atic +シリコン +Over +West +テンプル +一途 +便所 +商務 +悪夢 +戦功 +曳航 +確執 +##ビリティ +1818 +メカニック +PE +ゲッター +三輪 +就き +岩槻 +微小 +牽制 +現す +由良 +##クティ +##届け +##フォーマー +##iano +リミテッド +DDT +ペイン +俳人 +帝京 +序列 +戦没 +正人 +正史 +法規 +1839 +##angu +book +保た +多角 +忠告 +的確 +##gin +ブルゴーニュ +パーカ +##ova +ESP +たき +コモ +ビオ +ルック +困窮 +給水 +総武 +ローゼン +ごとく +ニーダー +出入口 +とらえ +ふつ +バーンズ +光る +吹く +松川 +検挙 +重慶 +隣国 +##ures +##irc +Leg +Island +執り行わ +Ult +アスト +モニュ +亀裂 +光年 +溢れ +牛肉 +貫い +アルフォンソ +クラスター +##シュート +##ヴィッツ +ユーリ +庶子 +書体 +空い +軍医 +##ムナ +##払っ +ロックン +スルタン +##ガイモ +Ben +Just +つね +ウシ +ニス +ムサ +ロム +創出 +安房 +独奏 +登っ +貸与 +遺骨 +##わう +引き抜 +読み上げ +1835 +##AKA +##落とさ +ソユーズ +ビアン +ロク +不定 +届ける +悪霊 +服役 +鍋島 +##・フェ +立ち会 +1803 +##obe +モニタ +シンポジウム +キティ +ペンタ +マドンナ +単装 +変電 +学説 +常用 +成瀬 +春風 +正門 +縦断 +##(" +##レーナ +Stand +バングラ +rad +パプ +##ユー +##盛り +AND +ボリス +真一 +被疑 +##・トゥ +1801 +ベイカー +1831 +カリキュラム +こめ +ベロ +写し +描画 +返事 +##ペー +キャメ +##ンチェ +オオカミ +Network +PHP +FD +RED +エリオット +ロッカー +予知 +小路 +悪かっ +書状 +##och +173 +##ランドル +ランチ +すずき +Wom +アスタ +トゲ +ドキ +ロド +埋立 +容積 +架線 +煉瓦 +現世 +触発 +関白 +電極 +##UG +##ディスク +##itar +Muse +South +ネバダ +ホステル +彼方 +相良 +齋藤 +##isch +ちゃんと +スピリット +HDD +スス +ビラ +ヨコ +分光 +利害 +島民 +特科 +童謡 +縦貫 +須磨 +ジョーク +001 +Inf +ドレスデン +950 +QB +Tu +up +えび +ラル +即時 +振舞 +細分 +##マイト +ディストリ +##ヴィング +トランスフォーマー +クルーザー +マキノ +中津川 +MK +ロリ +変光 +御堂 +心筋 +文人 +##サイユ +東大阪 +MIX +アングル +カブス +ワラ +原典 +拓也 +直系 +##リケ +##amil +##ISE +Cre +Happ +励まし +平民 +掛ける +欠如 +生家 +病棟 +習い +能代 +##ダール +コンコース +サンライズ +Mix +丸亀 +儒学 +六十 +内村 +凄まじ +素早 +すみれ +##イングランド +RAM +但馬 +停電 +増援 +昇叙 +森永 +視認 +##マイオス +##ロギー +チョーク +##・ヘルツェ +マルセイユ +公方 +本庁 +遭う +高井 +呼び出さ +OFF +General +うかがえる +取水 +市政 +恩師 +直立 +進駐 +高浜 +##キスト +##ティマ +##AYA +かわいい +どんどん +南岸 +操ら +本営 +##86 +##戻さ +スタッド +##ニアム +ニューイングランド +ダイバー +##ACH +WS +アニー +優れる +円滑 +県営 +##クトン +スマホ +セレモニー +Pan +大日 +応急 +正宗 +芳香 +長大 +開墾 +##読み +タイラー +引き下げ +メディカル +##ritic +ボスニア・ヘルツェ +ゴア +南宋 +常駐 +東野 +脚色 +飯島 +ボスニア・ヘルツェゴビナ +マッケ +ミラン +ラミ +ワーズ +ワーグナー +欠かせ +済ま +落城 +詫び +長き +面する +麻呂 +##スラー +207 +ウィッチ +気づく +明日香 +イデオロギー +エヴァン +モザイク +浄水 +病弱 +県境 +コロコロ +AX +グラー +チルド +ナゴ +ブリスト +ワンダ +大晦 +媒介 +専売 +明白 +濃厚 +神代 +諸語 +電線 +館山 +##タカ +##キュリー +##ther +ラテンアメリカ +##ather +Green +あわ +カリー +南洋 +回す +境遇 +溝口 +##トリス +##どき +off +コントローラー +##っとり +振り回さ +モニュメント +720 +HMS +ほり +カージナル +セオ +両足 +撃っ +瞬時 +連日 +##伝え +大晦日 +しつ +つぼ +ナイル +効か +抗原 +聖歌 +要約 +講道 +踊っ +##ヒム +##そば +##eck +カロリー +ヒドロキシ +じろう +入城 +千住 +否決 +平ら +那賀 +##ニヤ +##歩き +ミニチュア +ドーピング +スライム +class +Engine +せっ +アストラ +ボロー +公主 +島嶼 +技量 +斡旋 +欠く +渡来 +疾病 +神仏 +習っ +肩書き +説く +踏む +首謀 +##バシー +キングダム +御殿場 +GDP +フランドル +公約 +巨体 +##ージャー +ドローン +DP +Nat +gl +エヌ +ザ・ +ハルト +聴衆 +蕎麦 +辛い +阿賀 +1810 +アーロン +460 +エッ +前世 +山岡 +サイパン +Hal +もみ +ドク +ピリ +床下 +手榴 +植田 +薨去 +鋭く +##ris +##ids +モンテネ +メソッド +ダイアナ +スネーク +かご +くわ +井川 +如何 +実名 +殴ら +真由 +頭上 +174 +1833 +アミューズメント +Joseph +FESTIVAL +ヒスパ +ペロ +ルーン +側線 +勧請 +掛かる +水軍 +甲冑 +責め +超越 +震源 +まみ +サキ +ジングル +文春 +松崎 +片道 +アイド +こうえん +ハイチ +##aku +売り場 +づらい +ウーマン +サロ +ナマ +備後 +吸気 +埋める +矢作 +蓄え +見捨て +##net +##でる +ブリストル +"」 +Bell +ババ +二条 +偶数 +化成 +恒久 +旺盛 +注ぎ +着る +鮮やか +##ジスト +##of +スクリュー +ちゃっ +##グラフィー +グラフィックス +CAT +Mont +あべ +セ・リーグ +ペーター +大金 +嫌気 +阻ま +風邪 +ヴァンパイア +弾き語り +ひたすら +バーナード +プロポーズ +ピョートル +Rail +ギニア +生やし +矢島 +矢田 +購買 +##ヒド +##強く +##割り +##ティション +ヴェン +アダムズ +Div +まどか +ザム +名阪 +後頭 +沢山 +火葬 +空輸 +観賞 +説話 +##・ブラ +##ナリー +##ッジョ +オペレーター +Hall +ロキ +診察 +##ique +ICOCA +Metac +カージナルス +モレ +居合わせ +新選 +綴っ +酢酸 +##フリー +##gan +##ote +##ネーヴ +オマージュ +Hel +Ka +ガッツ +サティ +プトレ +一変 +動け +台枠 +大帝 +白黒 +相生 +##本町 +引き受ける +ダイエット +ビルディング +プラトン +LR +テトラ +トカゲ +今夜 +民進 +深谷 +靖国 +鮮明 +##エロ +##バイン +##バーツ +シャア +じけん +ノス +光沢 +原町 +執る +岩見 +弘化 +是非 +気配 +煙草 +義兄 +衝動 +長嶋 +兼ね備 +Angel +モンテネグロ +)" +Bur +クリン +ナックル +三枝 +会戦 +放水 +森川 +草案 +身の +関門 +##・ゴ +##TE +##ji +##ベックス +##89 +##なみ +生まれ育 +シュミット +ファイバー +スプレー +二階堂 +まじ +カイル +ハーツ +修飾 +服従 +黒沢 +黒字 +引き離 +ステルス +バーミ +北岸 +新約 +純一 +軍備 +野郎 +##ワル +##ブルック +ルイージ +シューズ +春日部 +##ウォーキー +バングラデシュ +サカ +プファ +メタン +リセット +前川 +南緯 +客演 +巻末 +花弁 +西国 +##レッシブ +##ule +思い込ん +ニュート +ひどい +Battle +Band +大軍 +大學 +強風 +本所 +深度 +生える +純子 +羽毛 +装っ +農薬 +錯誤 +##itch +打ち明け +フラグ +大和田 +気仙沼 +はり +むす +ゆか +シク +デンバー +公然 +名手 +怒る +星団 +歌集 +稲田 +終止 +総集 +##HER +##リスク +くるみ +振り付け +ぐら +なが +イク +人為 +同胞 +士族 +画素 +防い +頑丈 +##チックス +##スタイル +イベリア +フリッツ +オカルト +##ECTION +てれび +Kiss +イネ +リニア +ルミ +外傷 +天照 +封建 +崩落 +柏崎 +課せ +随一 +##キリ +##かみ +##ディション +##フィル +プラモデル +802 +Real +##UST +結びつき +エクア +MSX +かたわら +デラウェア +Metacritic +つぐ +ボギー +哲哉 +速球 +遠野 +金城 +長久 +##ja +##ZA +##にち +呼び寄せ +Album +かる +安曇 +死闘 +洋上 +諫早 +雌雄 +##かれ +##びん +プラネット +##立てる +ミッドナイト +ミルウォーキー +きく +トレン +ハジ +メテ +図形 +発布 +白血 +ライム +シェーン +チューリッヒ +Season +Brow +なめ +井口 +動的 +右肩 +名曲 +国債 +居候 +新発 +深める +送迎 +陶芸 +##開き +ウェス +積み重 +ベネディ +ゴリラ +下段 +何事 +傲慢 +南陽 +埋蔵 +懐疑 +満塁 +譲ら +造っ +##モル +##cy +プライバシー +UM +htm +おび +シダ +ハレ +リョウ +接点 +済む +転戦 +##ワンダ +##zy +スタイン +Wik +ind +ダール +ヘイズ +マトリ +伽藍 +安楽 +装束 +述懐 +##BF +レイズ +NNN +エコー +レスター +不変 +叙事 +名護 +敵機 +##ベツ +テレサ +オリバー +入れ替わる +ネクタイ +Key +カカ +不意 +不服 +亜紀 +分水 +前漢 +因み +安く +柳沢 +模範 +目立た +##ナリ +##ロク +##ford +1838 +LV +カッ +ヘアー +備わっ +四谷 +巡業 +蔵人 +##・シャ +##ローナ +ビスマルク +POWER +ぱん +偽名 +応える +日和 +朝刊 +紙面 +綾瀬 +1821 +かわし +コメディアン +フェリペ +アセン +ピザ +リリ +併記 +優遇 +北島 +大館 +学研 +干拓 +心情 +軽便 +シュガー +フリート +出塁 +定額 +拾わ +溶媒 +真人 +硬い +開示 +##カード +212 +アップロード +##チュウ +ACT +EXILE +メタリック +##っぽん +「- +テンプ +ロレン +大理 +定例 +意地 +##PA +235 +##ami +ソーラー +RKB +クウェート +マゼ +ヤギ +呈する +変奏 +慶喜 +板倉 +腐食 +高裁 +##はら +##iness +1790 +747 +リバース +ラウンジ +くさい +カド +ピレ +マム +地検 +挫折 +紅茶 +##アール +##ガルド +##シュヴァ +スタック +アイゼン +##チュード +ワーキング +AIR +Way +カヤ +リーク +宮司 +擬似 +新進 +配送 +##bps +パラレル +HY +hp +園田 +左足 +明星 +神名 +篠山 +願望 +駆除 +##・アン +チャド +フィルタ +マーカー +もとづ +プーチン +DI +min +千尋 +激闘 +焼く +高円 +ことごと +なんば +キックボクシング +ミステリ +マクシミリアン +ことごとく +たなか +壬生 +客席 +暗示 +欠ける +溜め +組員 +ジャガイモ +ストーカー +##hem +510 +マジカル +737 +MOD +mph +げき +ルリ +一同 +属州 +履い +東村 +酵母 +##63 +立ち並 +立ち入り +##ista +見守る +Games +デスク +トラム +大邱 +教訓 +武芸 +海部 +香織 +##バスティ +##ぬき +ジュネーヴ +##aph +フレンズ +HK +IA +名勝 +楽しく +気管 +要衝 +##シタ +##へい +##ぷり +##ティーナ +アンゴラ +##unic +使い分け +##ヴォン +ヴァイオリニスト +キク +シエラ +ロジ +低床 +創り +新種 +現生 +生死 +真夏 +逸脱 +##ポラ +##ゾー +なおかつ +1804 +リスボン +パートナーシップ +##プライン +BEAT +music +ケガ +タオル +叱責 +変種 +宗谷 +密輸 +旅立つ +磯部 +##出せ +##ヶ島 +起こら +##ARE +##ガスカル +Rac +変則 +屈折 +館内 +##87 +入れ替わり +フェリックス +Road +元治 +受諾 +口論 +年月 +春樹 +棋院 +混沌 +湯浅 +西新 +遠州 +##高田 +##津子 +マーキュリー +もとより +モンロー +クイック +フェンダー +セナ +マギ +千島 +欲し +氷川 +王太子 +調味 +##テレス +ローレン +カリフ +520 +マダガスカル +プトレマイオス +ひる +セロ +堪能 +御影 +挙動 +暮れ +禁煙 +空調 +船首 +高位 +##eration +##テルン +Die +位階 +佐川 +喋り +大隅 +年々 +本誌 +白金 +社民 +細野 +##まつり +SPORTS +res +宮前 +年中 +瑠璃 +要人 +##イッチ +シュト +迎え入れ +コンビネーション +##ヴォル +あすか +ワトソン +House +バイン +原文 +基質 +完売 +幻影 +村松 +義昭 +スタント +クリム +たまご +ポテンシャル +Jul +SIM +アホ +デイズ +内政 +改心 +敬愛 +有望 +鹵獲 +##62 +ホルダー +LG +だれ +下方 +倣っ +心中 +放題 +桜田 +満期 +白紙 +群衆 +##らせ +ハイランド +トリビュート +Fest +びわ +エメ +上村 +件数 +哲郎 +技研 +独学 +甲殻 +試料 +遠方 +ジュエル +ブレイド +Entertainment +pp +ダイス +外れる +文言 +港町 +滅多 +除名 +障壁 +風速 +##ザイ +##ニョン +##ケープ +1825 +なで +キール +ポーター +上官 +五男 +伊吹 +増補 +専ら +投合 +振替 +採算 +漁獲 +胎児 +衣料 +衰弱 +2024 +サンリオ +ルーレット +##vex +セグメント +ジブラル +新発田 +ハッシュ +ミゲル +一日 +小字 +弓道 +快挙 +長兄 +##Pa +ダイヤル +1834 +##ootball +かも +ロジャース +新版 +案件 +清国 +課さ +中継ぎ +1819 +ナンシー +Lv +WHO +ぶち +アノ +エリカ +グリン +ワースト +名高い +所収 +朝夕 +江蘇 +温室 +無実 +足首 +陸戦 +ステファン +アントワ +かり +セバス +倒れる +図案 +国史 +挑み +茂木 +##シク +##ンドゥ +ジャコ +ゲームズ +サイクリング +Jour +Line +hyd +中庭 +審理 +整合 +焼酎 +直子 +箕面 +##ッダー +##ラック +##94 +##ANA +見舞い +サトウ +OUT +ガーナ +亜目 +天界 +安井 +家光 +挙がっ +献身 +##po +ジェイク +##ette +##TRA +ミカエル +mac +ひで +りく +オホ +井原 +井伊 +共済 +戦乱 +模擬 +治める +烏丸 +##ーカ +##の川 +ディラン +シュレ +メンフィス +NSC +BT +First +Les From 2d2adb48119f853543ac396ef64cd21e67386519 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Tue, 5 Sep 2023 00:52:26 +0800 Subject: [PATCH 005/102] Update __init__.py --- text/__init__.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/text/__init__.py b/text/__init__.py index 7566bf351..00cf6349e 100644 --- a/text/__init__.py +++ b/text/__init__.py @@ -20,9 +20,11 @@ def cleaned_text_to_sequence(cleaned_text, tones, language): def get_bert(norm_text, word2ph, language): from .chinese_bert import get_bert_feature as zh_bert from .english_bert_mock import get_bert_feature as en_bert + from .japanese_bert import get_bert_feature as ja_bert lang_bert_func_map = { 'ZH': zh_bert, - 'EN': en_bert + 'EN': en_bert, + 'JA': ja_bert } bert = lang_bert_func_map[language](norm_text, word2ph) return bert From 134bc88822ca9e69a63126220078e9f2f91c177d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Tue, 5 Sep 2023 00:53:27 +0800 Subject: [PATCH 006/102] Update japanese.py --- text/japanese.py | 662 ++++++++++++++++++++++++++++++++++++++++------- 1 file changed, 567 insertions(+), 95 deletions(-) diff --git a/text/japanese.py b/text/japanese.py index ddedafa0c..084904c15 100644 --- a/text/japanese.py +++ b/text/japanese.py @@ -1,104 +1,576 @@ -# modified from https://github.com/CjangCjengh/vits/blob/main/text/japanese.py +# Convert Japanese text to phonemes which is +# compatible with Julius https://github.com/julius-speech/segmentation-kit +import math import re -import sys - -import pyopenjtalk - -from text import symbols - -# Regular expression matching Japanese without punctuation marks: -_japanese_characters = re.compile( - r'[A-Za-z\d\u3005\u3040-\u30ff\u4e00-\u9fff\uff11-\uff19\uff21-\uff3a\uff41-\uff5a\uff66-\uff9d]') - -# Regular expression matching non-Japanese characters or punctuation marks: -_japanese_marks = re.compile( - r'[^A-Za-z\d\u3005\u3040-\u30ff\u4e00-\u9fff\uff11-\uff19\uff21-\uff3a\uff41-\uff5a\uff66-\uff9d]') - -# List of (symbol, Japanese) pairs for marks: -_symbols_to_japanese = [(re.compile('%s' % x[0]), x[1]) for x in [ - ('%', 'パーセント') -]] - - -# List of (consonant, sokuon) pairs: -_real_sokuon = [(re.compile('%s' % x[0]), x[1]) for x in [ - (r'Q([↑↓]*[kg])', r'k#\1'), - (r'Q([↑↓]*[tdjʧ])', r't#\1'), - (r'Q([↑↓]*[sʃ])', r's\1'), - (r'Q([↑↓]*[pb])', r'p#\1') -]] - -# List of (consonant, hatsuon) pairs: -_real_hatsuon = [(re.compile('%s' % x[0]), x[1]) for x in [ - (r'N([↑↓]*[pbm])', r'm\1'), - (r'N([↑↓]*[ʧʥj])', r'n^\1'), - (r'N([↑↓]*[tdn])', r'n\1'), - (r'N([↑↓]*[kg])', r'ŋ\1') -]] - - - -def post_replace_ph(ph): - rep_map = { - ':': ',', - ';': ',', - ',': ',', - '。': '.', - '!': '!', - '?': '?', - '\n': '.', - "·": ",", - '、': ",", - '...': '…', - 'v': "V" - } - if ph in rep_map.keys(): - ph = rep_map[ph] - if ph in symbols: - return ph - if ph not in symbols: - ph = 'UNK' - return ph - -def symbols_to_japanese(text): - for regex, replacement in _symbols_to_japanese: - text = re.sub(regex, replacement, text) - return text - - -def preprocess_jap(text): - '''Reference https://r9y9.github.io/ttslearn/latest/notebooks/ch10_Recipe-Tacotron.html''' - text = symbols_to_japanese(text) - sentences = re.split(_japanese_marks, text) - marks = re.findall(_japanese_marks, text) - text = [] - for i, sentence in enumerate(sentences): - if re.match(_japanese_characters, sentence): - p = pyopenjtalk.g2p(sentence) - text += p.split(" ") - - if i < len(marks): - text += [marks[i].replace(' ', '')] - return text +import unicodedata + +from transformers import AutoTokenizer + +from text import punctuation, symbols + +try: + import MeCab +except ImportError as e: + raise ImportError("Japanese requires mecab-python3 and unidic-lite.") from e +from num2words import num2words + +_CONVRULES = [ + # Conversion of 2 letters + "アァ/ a a", + "イィ/ i i", + "イェ/ i e", + "イャ/ y a", + "ウゥ/ u:", + "エェ/ e e", + "オォ/ o:", + "カァ/ k a:", + "キィ/ k i:", + "クゥ/ k u:", + "クャ/ ky a", + "クュ/ ky u", + "クョ/ ky o", + "ケェ/ k e:", + "コォ/ k o:", + "ガァ/ g a:", + "ギィ/ g i:", + "グゥ/ g u:", + "グャ/ gy a", + "グュ/ gy u", + "グョ/ gy o", + "ゲェ/ g e:", + "ゴォ/ g o:", + "サァ/ s a:", + "シィ/ sh i:", + "スゥ/ s u:", + "スャ/ sh a", + "スュ/ sh u", + "スョ/ sh o", + "セェ/ s e:", + "ソォ/ s o:", + "ザァ/ z a:", + "ジィ/ j i:", + "ズゥ/ z u:", + "ズャ/ zy a", + "ズュ/ zy u", + "ズョ/ zy o", + "ゼェ/ z e:", + "ゾォ/ z o:", + "タァ/ t a:", + "チィ/ ch i:", + "ツァ/ ts a", + "ツィ/ ts i", + "ツゥ/ ts u:", + "ツャ/ ch a", + "ツュ/ ch u", + "ツョ/ ch o", + "ツェ/ ts e", + "ツォ/ ts o", + "テェ/ t e:", + "トォ/ t o:", + "ダァ/ d a:", + "ヂィ/ j i:", + "ヅゥ/ d u:", + "ヅャ/ zy a", + "ヅュ/ zy u", + "ヅョ/ zy o", + "デェ/ d e:", + "ドォ/ d o:", + "ナァ/ n a:", + "ニィ/ n i:", + "ヌゥ/ n u:", + "ヌャ/ ny a", + "ヌュ/ ny u", + "ヌョ/ ny o", + "ネェ/ n e:", + "ノォ/ n o:", + "ハァ/ h a:", + "ヒィ/ h i:", + "フゥ/ f u:", + "フャ/ hy a", + "フュ/ hy u", + "フョ/ hy o", + "ヘェ/ h e:", + "ホォ/ h o:", + "バァ/ b a:", + "ビィ/ b i:", + "ブゥ/ b u:", + "フャ/ hy a", + "ブュ/ by u", + "フョ/ hy o", + "ベェ/ b e:", + "ボォ/ b o:", + "パァ/ p a:", + "ピィ/ p i:", + "プゥ/ p u:", + "プャ/ py a", + "プュ/ py u", + "プョ/ py o", + "ペェ/ p e:", + "ポォ/ p o:", + "マァ/ m a:", + "ミィ/ m i:", + "ムゥ/ m u:", + "ムャ/ my a", + "ムュ/ my u", + "ムョ/ my o", + "メェ/ m e:", + "モォ/ m o:", + "ヤァ/ y a:", + "ユゥ/ y u:", + "ユャ/ y a:", + "ユュ/ y u:", + "ユョ/ y o:", + "ヨォ/ y o:", + "ラァ/ r a:", + "リィ/ r i:", + "ルゥ/ r u:", + "ルャ/ ry a", + "ルュ/ ry u", + "ルョ/ ry o", + "レェ/ r e:", + "ロォ/ r o:", + "ワァ/ w a:", + "ヲォ/ o:", + "ディ/ d i", + "デェ/ d e:", + "デャ/ dy a", + "デュ/ dy u", + "デョ/ dy o", + "ティ/ t i", + "テェ/ t e:", + "テャ/ ty a", + "テュ/ ty u", + "テョ/ ty o", + "スィ/ s i", + "ズァ/ z u a", + "ズィ/ z i", + "ズゥ/ z u", + "ズャ/ zy a", + "ズュ/ zy u", + "ズョ/ zy o", + "ズェ/ z e", + "ズォ/ z o", + "キャ/ ky a", + "キュ/ ky u", + "キョ/ ky o", + "シャ/ sh a", + "シュ/ sh u", + "シェ/ sh e", + "ショ/ sh o", + "チャ/ ch a", + "チュ/ ch u", + "チェ/ ch e", + "チョ/ ch o", + "トゥ/ t u", + "トャ/ ty a", + "トュ/ ty u", + "トョ/ ty o", + "ドァ/ d o a", + "ドゥ/ d u", + "ドャ/ dy a", + "ドュ/ dy u", + "ドョ/ dy o", + "ドォ/ d o:", + "ニャ/ ny a", + "ニュ/ ny u", + "ニョ/ ny o", + "ヒャ/ hy a", + "ヒュ/ hy u", + "ヒョ/ hy o", + "ミャ/ my a", + "ミュ/ my u", + "ミョ/ my o", + "リャ/ ry a", + "リュ/ ry u", + "リョ/ ry o", + "ギャ/ gy a", + "ギュ/ gy u", + "ギョ/ gy o", + "ヂェ/ j e", + "ヂャ/ j a", + "ヂュ/ j u", + "ヂョ/ j o", + "ジェ/ j e", + "ジャ/ j a", + "ジュ/ j u", + "ジョ/ j o", + "ビャ/ by a", + "ビュ/ by u", + "ビョ/ by o", + "ピャ/ py a", + "ピュ/ py u", + "ピョ/ py o", + "ウァ/ u a", + "ウィ/ w i", + "ウェ/ w e", + "ウォ/ w o", + "ファ/ f a", + "フィ/ f i", + "フゥ/ f u", + "フャ/ hy a", + "フュ/ hy u", + "フョ/ hy o", + "フェ/ f e", + "フォ/ f o", + "ヴァ/ b a", + "ヴィ/ b i", + "ヴェ/ b e", + "ヴォ/ b o", + "ヴュ/ by u", + # Conversion of 1 letter + "ア/ a", + "イ/ i", + "ウ/ u", + "エ/ e", + "オ/ o", + "カ/ k a", + "キ/ k i", + "ク/ k u", + "ケ/ k e", + "コ/ k o", + "サ/ s a", + "シ/ sh i", + "ス/ s u", + "セ/ s e", + "ソ/ s o", + "タ/ t a", + "チ/ ch i", + "ツ/ ts u", + "テ/ t e", + "ト/ t o", + "ナ/ n a", + "ニ/ n i", + "ヌ/ n u", + "ネ/ n e", + "ノ/ n o", + "ハ/ h a", + "ヒ/ h i", + "フ/ f u", + "ヘ/ h e", + "ホ/ h o", + "マ/ m a", + "ミ/ m i", + "ム/ m u", + "メ/ m e", + "モ/ m o", + "ラ/ r a", + "リ/ r i", + "ル/ r u", + "レ/ r e", + "ロ/ r o", + "ガ/ g a", + "ギ/ g i", + "グ/ g u", + "ゲ/ g e", + "ゴ/ g o", + "ザ/ z a", + "ジ/ j i", + "ズ/ z u", + "ゼ/ z e", + "ゾ/ z o", + "ダ/ d a", + "ヂ/ j i", + "ヅ/ z u", + "デ/ d e", + "ド/ d o", + "バ/ b a", + "ビ/ b i", + "ブ/ b u", + "ベ/ b e", + "ボ/ b o", + "パ/ p a", + "ピ/ p i", + "プ/ p u", + "ペ/ p e", + "ポ/ p o", + "ヤ/ y a", + "ユ/ y u", + "ヨ/ y o", + "ワ/ w a", + "ヰ/ i", + "ヱ/ e", + "ヲ/ o", + "ン/ N", + "ッ/ q", + "ヴ/ b u", + "ー/:", + # Try converting broken text + "ァ/ a", + "ィ/ i", + "ゥ/ u", + "ェ/ e", + "ォ/ o", + "ヮ/ w a", + "ォ/ o", + # Symbols + "、/ ,", + "。/ .", + "!/ !", + "?/ ?", + "・/ ,", +] + +_COLON_RX = re.compile(":+") +_REJECT_RX = re.compile("[^ a-zA-Z:,.?]") + + +def _makerulemap(): + l = [tuple(x.split("/")) for x in _CONVRULES] + return tuple({k: v for k, v in l if len(k) == i} for i in (1, 2)) + + +_RULEMAP1, _RULEMAP2 = _makerulemap() + + +def kata2phoneme(text: str) -> str: + """Convert katakana text to phonemes.""" + text = text.strip() + res = [] + while text: + if len(text) >= 2: + x = _RULEMAP2.get(text[:2]) + if x is not None: + text = text[2:] + res += x.split(' ')[1:] + continue + x = _RULEMAP1.get(text[0]) + if x is not None: + text = text[1:] + res += x.split(' ')[1:] + continue + res.append(text[0]) + text = text[1:] + # res = _COLON_RX.sub(":", res) + return res + + +_KATAKANA = "".join(chr(ch) for ch in range(ord("ァ"), ord("ン") + 1)) +_HIRAGANA = "".join(chr(ch) for ch in range(ord("ぁ"), ord("ん") + 1)) +_HIRA2KATATRANS = str.maketrans(_HIRAGANA, _KATAKANA) + + +def hira2kata(text: str) -> str: + text = text.translate(_HIRA2KATATRANS) + return text.replace("う゛", "ヴ") + + +_SYMBOL_TOKENS = set(list("・、。?!")) +_NO_YOMI_TOKENS = set(list("「」『』―()[][]")) +_TAGGER = MeCab.Tagger() + +def text2kata(text: str) -> str: + parsed = _TAGGER.parse(text) + res = [] + for line in parsed.split("\n"): + if line == "EOS": + break + parts = line.split("\t") + + word, yomi = parts[0], parts[1] + if yomi: + res.append(yomi) + else: + if word in _SYMBOL_TOKENS: + res.append(word) + elif word in ("っ", "ッ"): + res.append("ッ") + elif word in _NO_YOMI_TOKENS: + pass + else: + res.append(word) + return hira2kata("".join(res)) + + +_ALPHASYMBOL_YOMI = { + "#": "シャープ", + "%": "パーセント", + "&": "アンド", + "+": "プラス", + "-": "マイナス", + ":": "コロン", + ";": "セミコロン", + "<": "小なり", + "=": "イコール", + ">": "大なり", + "@": "アット", + "a": "エー", + "b": "ビー", + "c": "シー", + "d": "ディー", + "e": "イー", + "f": "エフ", + "g": "ジー", + "h": "エイチ", + "i": "アイ", + "j": "ジェー", + "k": "ケー", + "l": "エル", + "m": "エム", + "n": "エヌ", + "o": "オー", + "p": "ピー", + "q": "キュー", + "r": "アール", + "s": "エス", + "t": "ティー", + "u": "ユー", + "v": "ブイ", + "w": "ダブリュー", + "x": "エックス", + "y": "ワイ", + "z": "ゼット", + "α": "アルファ", + "β": "ベータ", + "γ": "ガンマ", + "δ": "デルタ", + "ε": "イプシロン", + "ζ": "ゼータ", + "η": "イータ", + "θ": "シータ", + "ι": "イオタ", + "κ": "カッパ", + "λ": "ラムダ", + "μ": "ミュー", + "ν": "ニュー", + "ξ": "クサイ", + "ο": "オミクロン", + "π": "パイ", + "ρ": "ロー", + "σ": "シグマ", + "τ": "タウ", + "υ": "ウプシロン", + "φ": "ファイ", + "χ": "カイ", + "ψ": "プサイ", + "ω": "オメガ", +} + + +_NUMBER_WITH_SEPARATOR_RX = re.compile("[0-9]{1,3}(,[0-9]{3})+") +_CURRENCY_MAP = {"$": "ドル", "¥": "円", "£": "ポンド", "€": "ユーロ"} +_CURRENCY_RX = re.compile(r"([$¥£€])([0-9.]*[0-9])") +_NUMBER_RX = re.compile(r"[0-9]+(\.[0-9]+)?") + + +def japanese_convert_numbers_to_words(text: str) -> str: + res = _NUMBER_WITH_SEPARATOR_RX.sub(lambda m: m[0].replace(",", ""), text) + res = _CURRENCY_RX.sub(lambda m: m[2] + _CURRENCY_MAP.get(m[1], m[1]), res) + res = _NUMBER_RX.sub(lambda m: num2words(m[0], lang="ja"), res) + return res + + +def japanese_convert_alpha_symbols_to_words(text: str) -> str: + return "".join([_ALPHASYMBOL_YOMI.get(ch, ch) for ch in text.lower()]) + + +def japanese_text_to_phonemes(text: str) -> str: + """Convert Japanese text to phonemes.""" + res = unicodedata.normalize("NFKC", text) + res = japanese_convert_numbers_to_words(res) + # res = japanese_convert_alpha_symbols_to_words(res) + res = text2kata(res) + res = kata2phoneme(res) + return res + +def is_japanese_character(char): + # 定义日语文字系统的 Unicode 范围 + japanese_ranges = [ + (0x3040, 0x309F), # 平假名 + (0x30A0, 0x30FF), # 片假名 + (0x4E00, 0x9FFF), # 汉字 (CJK Unified Ideographs) + (0x3400, 0x4DBF), # 汉字扩展 A + (0x20000, 0x2A6DF), # 汉字扩展 B + # 可以根据需要添加其他汉字扩展范围 + ] + + # 将字符的 Unicode 编码转换为整数 + char_code = ord(char) + + # 检查字符是否在任何一个日语范围内 + for start, end in japanese_ranges: + if start <= char_code <= end: + return True + + return False + +rep_map = { + ':': ',', + ';': ',', + ',': ',', + '。': '.', + '!': '!', + '?': '?', + '\n': '.', + "·": ",", + '、': ",", + '...': '…' +} +def replace_punctuation(text): + pattern = re.compile('|'.join(re.escape(p) for p in rep_map.keys())) + + replaced_text = pattern.sub(lambda x: rep_map[x.group()], text) + + replaced_text = re.sub(r'[^\u3040-\u309F\u30A0-\u30FF\u4E00-\u9FFF\u3400-\u4DBF'+"".join(punctuation)+r']+', '', replaced_text) + + return replaced_text def text_normalize(text): - # todo: jap text normalize - return text + res = unicodedata.normalize("NFKC", text) + res = japanese_convert_numbers_to_words(res) + # res = "".join([i for i in res if is_japanese_character(i)]) + res = replace_punctuation(res) + return res + +def distribute_phone(n_phone, n_word): + phones_per_word = [0] * n_word + for task in range(n_phone): + min_tasks = min(phones_per_word) + min_index = phones_per_word.index(min_tasks) + phones_per_word[min_index] += 1 + return phones_per_word +tokenizer = AutoTokenizer.from_pretrained("./pretrain/bert-base-japanese-v3") def g2p(norm_text): - phones = preprocess_jap(norm_text) - phones = [post_replace_ph(i) for i in phones] - # todo: implement tones and word2ph + tokenized = tokenizer.tokenize(norm_text) + phs = [] + ph_groups = [] + for t in tokenized: + if not t.startswith('#'): + ph_groups.append([t]) + else: + ph_groups[-1].append(t.replace("#", '')) + word2ph = [] + for group in ph_groups: + phonemes = kata2phoneme(text2kata("".join(group))) + # phonemes = [i for i in phonemes if i in symbols] + for i in phonemes: + assert i in symbols, (group, norm_text, tokenized) + phone_len = len(phonemes) + word_len = len(group) + + aaa = distribute_phone(phone_len, word_len) + word2ph += aaa + + phs += phonemes + phones = ['_'] + phs + ["_"] tones = [0 for i in phones] - word2ph = [1 for i in phones] + word2ph = [1] + word2ph + [1] return phones, tones, word2ph - if __name__ == '__main__': - for line in open("../../../Downloads/transcript_utf8.txt").readlines(): - text = line.split(":")[1] - phones, tones, word2ph = g2p(text) - for p in phones: - if p == "z": - print(text, phones) - sys.exit(0) + path = "../../../Downloads/transcript_utf8.txt" + tokenizer = AutoTokenizer.from_pretrained("./pretrain/bert-base-japanese-v3") + text = "hello,こんにちは、世界!……" + # text = 'こんにちは、末期試験に備えて、本当に気合いを入れて勉強しなきゃ。' + # text = '溺れかかっていた乗客は、すべて救助された。' + from text.japanese_bert import get_bert_feature + + text = text_normalize(text) + print(text) + phones, tones, word2ph = g2p(text) + bert = get_bert_feature(text, word2ph) + + print(phones, tones, word2ph, bert.shape) + + + From 82105b1cd7bcfa4bdf3805b4168588700712f7da Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Tue, 5 Sep 2023 00:54:00 +0800 Subject: [PATCH 007/102] Create japanese_bert.py --- text/japanese_bert.py | 26 ++++++++++++++++++++++++++ 1 file changed, 26 insertions(+) create mode 100644 text/japanese_bert.py diff --git a/text/japanese_bert.py b/text/japanese_bert.py new file mode 100644 index 000000000..304d03aeb --- /dev/null +++ b/text/japanese_bert.py @@ -0,0 +1,26 @@ +import torch +from transformers import AutoTokenizer, AutoModelForMaskedLM + +device = torch.device("cuda" if torch.cuda.is_available() else "cpu") + +tokenizer = AutoTokenizer.from_pretrained("./bert/bert-base-japanese-v3") +model = AutoModelForMaskedLM.from_pretrained("./bert/bert-base-japanese-v3").to(device) + +def get_bert_feature(text, word2ph): + with torch.no_grad(): + inputs = tokenizer(text, return_tensors='pt') + for i in inputs: + inputs[i] = inputs[i].to(device) + res = model(**inputs, output_hidden_states=True) + res = torch.cat(res['hidden_states'][-3:-2], -1)[0].cpu() + assert inputs['input_ids'].shape[-1] == len(word2ph) + word2phone = word2ph + phone_level_feature = [] + for i in range(len(word2phone)): + repeat_feature = res[i].repeat(word2phone[i], 1) + phone_level_feature.append(repeat_feature) + + phone_level_feature = torch.cat(phone_level_feature, dim=0) + + + return phone_level_feature.T From 4a1c09bf3149b27dc49d8cb959cd3103f3a163dd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Tue, 5 Sep 2023 00:56:32 +0800 Subject: [PATCH 008/102] Update train_ms.py --- train_ms.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/train_ms.py b/train_ms.py index ddf6506c8..958171eba 100644 --- a/train_ms.py +++ b/train_ms.py @@ -38,7 +38,7 @@ torch.backends.cudnn.benchmark = True torch.backends.cuda.matmul.allow_tf32 = True -torch.backends.cudnn.allow_tf32 = True +torch.backends.cudnn.allow_tf32 = True # If encontered training problem,please try to disable TF32. torch.set_float32_matmul_precision('medium') torch.backends.cuda.sdp_kernel("flash") torch.backends.cuda.enable_flash_sdp(True) From 4127f7d00aacc7e026858116b78b84187f71e6e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Tue, 5 Sep 2023 01:02:46 +0800 Subject: [PATCH 009/102] Update train_ms.py --- train_ms.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/train_ms.py b/train_ms.py index 958171eba..297fea6e3 100644 --- a/train_ms.py +++ b/train_ms.py @@ -42,7 +42,7 @@ torch.set_float32_matmul_precision('medium') torch.backends.cuda.sdp_kernel("flash") torch.backends.cuda.enable_flash_sdp(True) -torch.backends.cuda.enable_mem_efficient_sdp(True) +torch.backends.cuda.enable_mem_efficient_sdp(True) # Not avaliable if torch version is lower than 2.0 torch.backends.cuda.enable_math_sdp(True) global_step = 0 @@ -165,7 +165,7 @@ def run(rank, n_gpus, hps): epoch_str = max(epoch_str, 1) global_step = (epoch_str - 1) * len(train_loader) - except Exception as e: + except Exception as e: print(e) epoch_str = 1 global_step = 0 From d74fe531e948558fd8e70a6126d024b127cc389d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Tue, 5 Sep 2023 01:04:10 +0800 Subject: [PATCH 010/102] Update data_utils.py --- data_utils.py | 8 -------- 1 file changed, 8 deletions(-) diff --git a/data_utils.py b/data_utils.py index 19f098cfe..dddbe7281 100644 --- a/data_utils.py +++ b/data_utils.py @@ -93,12 +93,6 @@ def get_audio(self, filename): spec = torch.load(spec_filename) except: if self.use_mel_spec_posterior: - # if os.path.exists(filename.replace(".wav", ".spec.pt")): - # # spec, n_fft, num_mels, sampling_rate, fmin, fmax - # spec = spec_to_mel_torch( - # torch.load(filename.replace(".wav", ".spec.pt")), - # self.filter_length, self.n_mel_channels, self.sampling_rate, - # self.hparams.mel_fmin, self.hparams.mel_fmax) spec = mel_spectrogram_torch(audio_norm, self.filter_length, self.n_mel_channels, self.sampling_rate, self.hop_length, self.win_length, self.hparams.mel_fmin, self.hparams.mel_fmax, center=False) @@ -111,7 +105,6 @@ def get_audio(self, filename): return spec, audio_norm def get_text(self, text, word2ph, phone, tone, language_str, wav_path): - # print(text, word2ph,phone, tone, language_str) pold = phone w2pho = [i for i in word2ph] word2ph = [i for i in word2ph] @@ -136,7 +129,6 @@ def get_text(self, text, word2ph, phone, tone, language_str, wav_path): except: bert = get_bert(text, word2ph, language_str) torch.save(bert, bert_path) - #print(bert.shape[-1], bert_path, text, pold) assert bert.shape[-1] == len(phone) assert bert.shape[-1] == len(phone), ( From e7f77407d743b12d334c3580ccc0cf54e877e39a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Tue, 5 Sep 2023 01:08:42 +0800 Subject: [PATCH 011/102] Update requirements.txt --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index c437b9a0b..5d325934b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -15,3 +15,4 @@ pypinyin cn2an gradio av +mecab-python3 From 37bee28b7fab5808546ede6745c248baa13f358b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Tue, 5 Sep 2023 09:49:24 +0800 Subject: [PATCH 012/102] ad layers --- models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/models.py b/models.py index a8e1e9fae..2364d627f 100644 --- a/models.py +++ b/models.py @@ -579,7 +579,7 @@ def __init__(self, gin_channels=256, use_sdp=True, n_flow_layer = 4, - n_layers_trans_flow = 3, + n_layers_trans_flow = 6, flow_share_parameter = False, use_transformer_flow = True, **kwargs): From 02423d892f0cad05c60c547ab1c5fc35f8d6f8f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Tue, 5 Sep 2023 09:52:56 +0800 Subject: [PATCH 013/102] add bert --- data_utils.py | 24 ++++++++++++------------ 1 file changed, 12 insertions(+), 12 deletions(-) diff --git a/data_utils.py b/data_utils.py index dddbe7281..51c08621d 100644 --- a/data_utils.py +++ b/data_utils.py @@ -73,7 +73,7 @@ def get_audio_text_speaker_pair(self, audiopath_sid_text): # separate filename, speaker_id and text audiopath, sid, language, text, phones, tone, word2ph = audiopath_sid_text - bert, phones, tone, language = self.get_text(text, word2ph, phones, tone, language, audiopath) + bert, ja_bert, phones, tone, language = self.get_text(text, word2ph, phones, tone, language, audiopath) spec, wav = self.get_audio(audiopath) sid = torch.LongTensor([int(self.spk_map[sid])]) @@ -105,19 +105,10 @@ def get_audio(self, filename): return spec, audio_norm def get_text(self, text, word2ph, phone, tone, language_str, wav_path): - pold = phone - w2pho = [i for i in word2ph] - word2ph = [i for i in word2ph] phone, tone, language = cleaned_text_to_sequence(phone, tone, language_str) - pold2 = phone - if self.add_blank: - p1 = len(phone) phone = commons.intersperse(phone, 0) - p2 = len(phone) - t1 = len(tone) tone = commons.intersperse(tone, 0) - t2 = len(tone) language = commons.intersperse(language, 0) for i in range(len(word2ph)): word2ph[i] = word2ph[i] * 2 @@ -129,8 +120,17 @@ def get_text(self, text, word2ph, phone, tone, language_str, wav_path): except: bert = get_bert(text, word2ph, language_str) torch.save(bert, bert_path) - assert bert.shape[-1] == len(phone) - + assert bert.shape[-1] == len(phone), phone + + if language_str=='ZH': + zh_bert = bert + ja_bert = torch.zeros(768, len(phone)) + elif language_str=="JA": + ja_bert = bert + zh_bert = torch.zeros(1024, len(phone)) + else: + zh_bert = torch.zeros(1024, len(phone)) + ja_bert = torch.zeros(768, len(phone)) assert bert.shape[-1] == len(phone), ( bert.shape, len(phone), sum(word2ph), p1, p2, t1, t2, pold, pold2, word2ph, text, w2pho) phone = torch.LongTensor(phone) From bb4ebb80f792c90cac109a5d10193a368f5d038e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Tue, 5 Sep 2023 09:54:11 +0800 Subject: [PATCH 014/102] add bert --- data_utils.py | 15 ++++++++++----- 1 file changed, 10 insertions(+), 5 deletions(-) diff --git a/data_utils.py b/data_utils.py index 51c08621d..08906dc64 100644 --- a/data_utils.py +++ b/data_utils.py @@ -123,20 +123,20 @@ def get_text(self, text, word2ph, phone, tone, language_str, wav_path): assert bert.shape[-1] == len(phone), phone if language_str=='ZH': - zh_bert = bert + bert = bert ja_bert = torch.zeros(768, len(phone)) elif language_str=="JA": ja_bert = bert - zh_bert = torch.zeros(1024, len(phone)) + bert = torch.zeros(1024, len(phone)) else: - zh_bert = torch.zeros(1024, len(phone)) + bert = torch.zeros(1024, len(phone)) ja_bert = torch.zeros(768, len(phone)) assert bert.shape[-1] == len(phone), ( bert.shape, len(phone), sum(word2ph), p1, p2, t1, t2, pold, pold2, word2ph, text, w2pho) phone = torch.LongTensor(phone) tone = torch.LongTensor(tone) language = torch.LongTensor(language) - return bert, phone, tone, language + return bert, ja_bert, phone, tone, language def get_sid(self, sid): sid = torch.LongTensor([int(sid)]) @@ -180,6 +180,7 @@ def __call__(self, batch): tone_padded = torch.LongTensor(len(batch), max_text_len) language_padded = torch.LongTensor(len(batch), max_text_len) bert_padded = torch.FloatTensor(len(batch), 1024, max_text_len) + ja_bert_padded = torch.FloatTensor(len(batch), 768, max_text_len) spec_padded = torch.FloatTensor(len(batch), batch[0][1].size(0), max_spec_len) wav_padded = torch.FloatTensor(len(batch), 1, max_wav_len) @@ -189,6 +190,7 @@ def __call__(self, batch): spec_padded.zero_() wav_padded.zero_() bert_padded.zero_() + ja_bert_padded.zero_() for i in range(len(ids_sorted_decreasing)): row = batch[ids_sorted_decreasing[i]] @@ -215,7 +217,10 @@ def __call__(self, batch): bert = row[6] bert_padded[i, :, :bert.size(1)] = bert - return text_padded, text_lengths, spec_padded, spec_lengths, wav_padded, wav_lengths, sid, tone_padded, language_padded, bert_padded + ja_bert = row[7] + ja_bert_padded[i, :, :ja_bert.size(1)] = ja_bert + + return text_padded, text_lengths, spec_padded, spec_lengths, wav_padded, wav_lengths, sid, tone_padded, language_padded, bert_padded, ja_bert_padded class DistributedBucketSampler(torch.utils.data.distributed.DistributedSampler): From 316e0ba345f8d15925e2553db0f2081ddaf42ff2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Tue, 5 Sep 2023 09:57:08 +0800 Subject: [PATCH 015/102] add tqdm --- data_utils.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/data_utils.py b/data_utils.py index 08906dc64..0dfe1916e 100644 --- a/data_utils.py +++ b/data_utils.py @@ -4,6 +4,8 @@ import numpy as np import torch import torch.utils.data +from tqdm import tqdm + import commons from mel_processing import spectrogram_torch, mel_spectrogram_torch, spec_to_mel_torch from utils import load_wav_to_torch, load_filepaths_and_text @@ -55,7 +57,7 @@ def _filter(self): audiopaths_sid_text_new = [] lengths = [] skipped = 0 - for _id, spk, language, text, phones, tone, word2ph in self.audiopaths_sid_text: + for _id, spk, language, text, phones, tone, word2ph in tqdm(self.audiopaths_sid_text): audiopath = f'{_id}' if self.min_text_len <= len(phones) and len(phones) <= self.max_text_len: phones = phones.split(" ") From 6d4d123162d34c63ec1bbb6682e0c8b958cab204 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Tue, 5 Sep 2023 10:00:54 +0800 Subject: [PATCH 016/102] add bert --- models.py | 18 +++++++++++------- 1 file changed, 11 insertions(+), 7 deletions(-) diff --git a/models.py b/models.py index 2364d627f..9a4e1e72a 100644 --- a/models.py +++ b/models.py @@ -267,7 +267,8 @@ def __init__(self, self.language_emb = nn.Embedding(num_languages, hidden_channels) nn.init.normal_(self.language_emb.weight, 0.0, hidden_channels ** -0.5) self.bert_proj = nn.Conv1d(1024, hidden_channels, 1) - + self.ja_bert_proj = nn.Conv1d(768, hidden_channels, 1) + self.encoder = attentions.Encoder( hidden_channels, filter_channels, @@ -278,8 +279,11 @@ def __init__(self, gin_channels=self.gin_channels) self.proj = nn.Conv1d(hidden_channels, out_channels * 2, 1) - def forward(self, x, x_lengths, tone, language, bert, g=None): - x = (self.emb(x)+ self.tone_emb(tone)+ self.language_emb(language)+self.bert_proj(bert).transpose(1,2)) * math.sqrt(self.hidden_channels) # [b, t, h] + def forward(self, x, x_lengths, tone, language, bert, ja_bert, g=None): + bert_emb = self.zh_bert_proj(bert).transpose(1,2) + ja_bert_emb = = self.ja_bert_proj(ja_bert).transpose(1,2) + x = (self.emb(x)+ self.tone_emb(tone)+ self.language_emb(language) + + bert_emb +ja_bert_emb) * math.sqrt(self.hidden_channels) # [b, t, h] x = torch.transpose(x, 1, -1) # [b, h, t] x_mask = torch.unsqueeze(commons.sequence_mask(x_lengths, x.size(2)), 1).to(x.dtype) @@ -637,12 +641,12 @@ def __init__(self, else: self.ref_enc = ReferenceEncoder(spec_channels, gin_channels) - def forward(self, x, x_lengths, y, y_lengths, sid, tone, language, bert): + def forward(self, x, x_lengths, y, y_lengths, sid, tone, language, bert, ja_bert): if self.n_speakers > 0: g = self.emb_g(sid).unsqueeze(-1) # [b, h, 1] else: g = self.ref_enc(y.transpose(1,2)).unsqueeze(-1) - x, m_p, logs_p, x_mask = self.enc_p(x, x_lengths, tone, language, bert,g=g) + x, m_p, logs_p, x_mask = self.enc_p(x, x_lengths, tone, language, bert, ja_bert, g=g) z, m_q, logs_q, y_mask = self.enc_q(y, y_lengths, g=g) z_p = self.flow(z, y_mask, g=g) @@ -681,14 +685,14 @@ def forward(self, x, x_lengths, y, y_lengths, sid, tone, language, bert): o = self.dec(z_slice, g=g) return o, l_length, attn, ids_slice, x_mask, y_mask, (z, z_p, m_p, logs_p, m_q, logs_q), (x, logw, logw_) - def infer(self, x, x_lengths, sid, tone, language, bert, noise_scale=.667, length_scale=1, noise_scale_w=0.8, max_len=None, sdp_ratio=0,y=None): + def infer(self, x, x_lengths, sid, tone, language, bert, ja_bert, noise_scale=.667, length_scale=1, noise_scale_w=0.8, max_len=None, sdp_ratio=0,y=None): #x, m_p, logs_p, x_mask = self.enc_p(x, x_lengths, tone, language, bert) # g = self.gst(y) if self.n_speakers > 0: g = self.emb_g(sid).unsqueeze(-1) # [b, h, 1] else: g = self.ref_enc(y.transpose(1,2)).unsqueeze(-1) - x, m_p, logs_p, x_mask = self.enc_p(x, x_lengths, tone, language, bert,g=g) + x, m_p, logs_p, x_mask = self.enc_p(x, x_lengths, tone, language, bert, ja_bert, g=g) logw = self.sdp(x, x_mask, g=g, reverse=True, noise_scale=noise_scale_w) * (sdp_ratio) + self.dp(x, x_mask, g=g) * (1 - sdp_ratio) w = torch.exp(logw) * x_mask * length_scale w_ceil = torch.ceil(w) From b5e7aefeefc73707bbd47cfcdc3a692103a62b3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Tue, 5 Sep 2023 10:01:13 +0800 Subject: [PATCH 017/102] Update symbols.py --- text/symbols.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/text/symbols.py b/text/symbols.py index 9dfae4e63..969cb798c 100644 --- a/text/symbols.py +++ b/text/symbols.py @@ -12,8 +12,9 @@ num_zh_tones = 6 # japanese -ja_symbols = ['I', 'N', 'U', 'a', 'b', 'by', 'ch', 'cl', 'd', 'dy', 'e', 'f', 'g', 'gy', 'h', 'hy', 'i', 'j', 'k', 'ky', - 'm', 'my', 'n', 'ny', 'o', 'p', 'py', 'r', 'ry', 's', 'sh', 't', 'ts', 'u', 'V', 'w', 'y', 'z'] +ja_symbols = ['N', 'a', 'a:', 'b', 'by', 'ch', 'd', 'dy', 'e', 'e:', 'f', 'g', 'gy', 'h', 'hy', 'i', 'i:', 'j', 'k', 'ky', + 'm', 'my', 'n', 'ny', 'o', 'o:', 'p', 'py', 'q', 'r', 'ry', 's', 'sh', 't', 'ts', 'ty', 'u', 'u:', + 'w', 'y', 'z', 'zy'] num_ja_tones = 1 # English From 5b5c79dd165d43164245aa1db09bffde04422444 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Tue, 5 Sep 2023 10:02:50 +0800 Subject: [PATCH 018/102] add bert --- train_ms.py | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/train_ms.py b/train_ms.py index 297fea6e3..0568aeb36 100644 --- a/train_ms.py +++ b/train_ms.py @@ -205,7 +205,7 @@ def train_and_evaluate(rank, epoch, hps, nets, optims, schedulers, scaler, loade net_d.train() if net_dur_disc is not None: net_dur_disc.train() - for batch_idx, (x, x_lengths, spec, spec_lengths, y, y_lengths, speakers, tone, language, bert) in tqdm(enumerate(train_loader)): + for batch_idx, (x, x_lengths, spec, spec_lengths, y, y_lengths, speakers, tone, language, bert, ja_bert) in tqdm(enumerate(train_loader)): if net_g.module.use_noise_scaled_mas: current_mas_noise_scale = net_g.module.mas_noise_scale_initial - net_g.module.noise_scale_delta * global_step net_g.module.current_mas_noise_scale = max(current_mas_noise_scale, 0.0) @@ -216,10 +216,11 @@ def train_and_evaluate(rank, epoch, hps, nets, optims, schedulers, scaler, loade tone = tone.cuda(rank, non_blocking=True) language = language.cuda(rank, non_blocking=True) bert = bert.cuda(rank, non_blocking=True) + ja_bert = ja_bert.cuda(rank, non_blocking=True) with autocast(enabled=hps.train.fp16_run): y_hat, l_length, attn, ids_slice, x_mask, z_mask, \ - (z, z_p, m_p, logs_p, m_q, logs_q), (hidden_x, logw, logw_) = net_g(x, x_lengths, spec, spec_lengths, speakers, tone, language, bert) + (z, z_p, m_p, logs_p, m_q, logs_q), (hidden_x, logw, logw_) = net_g(x, x_lengths, spec, spec_lengths, speakers, tone, language, bert, ja_bert) mel = spec_to_mel_torch( spec, hps.data.filter_length, @@ -342,7 +343,7 @@ def evaluate(hps, generator, eval_loader, writer_eval): audio_dict = {} print("Evaluating ...") with torch.no_grad(): - for batch_idx, (x, x_lengths, spec, spec_lengths, y, y_lengths, speakers, tone, language, bert) in enumerate(eval_loader): + for batch_idx, (x, x_lengths, spec, spec_lengths, y, y_lengths, speakers, tone, language, bert, ja_bert) in enumerate(eval_loader): x, x_lengths = x.cuda(), x_lengths.cuda() spec, spec_lengths = spec.cuda(), spec_lengths.cuda() y, y_lengths = y.cuda(), y_lengths.cuda() @@ -351,7 +352,7 @@ def evaluate(hps, generator, eval_loader, writer_eval): tone = tone.cuda() language = language.cuda() for use_sdp in [True, False]: - y_hat, attn, mask, *_ = generator.module.infer(x, x_lengths, speakers, tone, language, bert, y=spec, max_len=1000, sdp_ratio=0.0 if not use_sdp else 1.0) + y_hat, attn, mask, *_ = generator.module.infer(x, x_lengths, speakers, tone, language, bert, ja_bert, y=spec, max_len=1000, sdp_ratio=0.0 if not use_sdp else 1.0) y_hat_lengths = mask.sum([1, 2]).long() * hps.data.hop_length mel = spec_to_mel_torch( From 2857d004d877033308e21b7bbf44e297522dde3d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Tue, 5 Sep 2023 10:19:22 +0800 Subject: [PATCH 019/102] support jp --- webui.py | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/webui.py b/webui.py index 2e6576f71..a51374dab 100644 --- a/webui.py +++ b/webui.py @@ -25,10 +25,8 @@ import gradio as gr import webbrowser - net_g = None - def get_text(text, language_str, hps): norm_text, phone, tone, word2ph = clean_text(text, language_str) phone, tone, language = cleaned_text_to_sequence(phone, tone, language_str) @@ -51,9 +49,9 @@ def get_text(text, language_str, hps): return bert, phone, tone, language -def infer(text, sdp_ratio, noise_scale, noise_scale_w, length_scale, sid): +def infer(text, sdp_ratio, noise_scale, noise_scale_w, length_scale, sid, language): global net_g - bert, phones, tones, lang_ids = get_text(text, "ZH", hps) + bert, phones, tones, lang_ids = get_text(text, language, hps) with torch.no_grad(): x_tst=phones.to(device).unsqueeze(0) tones=tones.to(device).unsqueeze(0) @@ -67,9 +65,9 @@ def infer(text, sdp_ratio, noise_scale, noise_scale_w, length_scale, sid): del x_tst, tones, lang_ids, bert, x_tst_lengths, speakers return audio -def tts_fn(text, speaker, sdp_ratio, noise_scale, noise_scale_w, length_scale): +def tts_fn(text, speaker, sdp_ratio, noise_scale, noise_scale_w, length_scale, language): with torch.no_grad(): - audio = infer(text, sdp_ratio=sdp_ratio, noise_scale=noise_scale, noise_scale_w=noise_scale_w, length_scale=length_scale, sid=speaker) + audio = infer(text, sdp_ratio=sdp_ratio, noise_scale=noise_scale, noise_scale_w=noise_scale_w, length_scale=length_scale, sid=speaker, language=language) return "Success", (hps.data.sampling_rate, audio) @@ -107,6 +105,7 @@ def tts_fn(text, speaker, sdp_ratio, noise_scale, noise_scale_w, length_scale): speaker_ids = hps.data.spk2id speakers = list(speaker_ids.keys()) + languages = ["ZH","JA"] with gr.Blocks() as app: with gr.Row(): with gr.Column(): @@ -117,6 +116,7 @@ def tts_fn(text, speaker, sdp_ratio, noise_scale, noise_scale_w, length_scale): noise_scale = gr.Slider(minimum=0.1, maximum=2, value=0.6, step=0.1, label='Noise Scale') noise_scale_w = gr.Slider(minimum=0.1, maximum=2, value=0.8, step=0.1, label='Noise Scale W') length_scale = gr.Slider(minimum=0.1, maximum=2, value=1, step=0.1, label='Length Scale') + language = gr.Dropdown(choices=languages, value=languages[0], label='Language') btn = gr.Button("Generate!", variant="primary") with gr.Column(): text_output = gr.Textbox(label="Message") From 6763e150b7d38fa95d5d036d4f2c419af10c7d4b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Tue, 5 Sep 2023 10:23:56 +0800 Subject: [PATCH 020/102] support ja --- webui.py | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/webui.py b/webui.py index a51374dab..edbf03fa4 100644 --- a/webui.py +++ b/webui.py @@ -40,27 +40,37 @@ def get_text(text, language_str, hps): word2ph[0] += 1 bert = get_bert(norm_text, word2ph, language_str) del word2ph - - assert bert.shape[-1] == len(phone) - + assert bert.shape[-1] == len(phone), phone + + if language_str=='ZH': + bert = bert + ja_bert = torch.zeros(768, len(phone)) + elif language_str=="JA": + ja_bert = bert + bert = torch.zeros(1024, len(phone)) + else: + bert = torch.zeros(1024, len(phone)) + ja_bert = torch.zeros(768, len(phone)) + assert bert.shape[-1] == len(phone), ( + bert.shape, len(phone), sum(word2ph), p1, p2, t1, t2, pold, pold2, word2ph, text, w2pho) phone = torch.LongTensor(phone) tone = torch.LongTensor(tone) language = torch.LongTensor(language) - - return bert, phone, tone, language - + return bert, ja_bert, phone, tone, language + def infer(text, sdp_ratio, noise_scale, noise_scale_w, length_scale, sid, language): global net_g - bert, phones, tones, lang_ids = get_text(text, language, hps) + bert, ja_bert, phones, tones, lang_ids = get_text(text, language, hps) with torch.no_grad(): x_tst=phones.to(device).unsqueeze(0) tones=tones.to(device).unsqueeze(0) lang_ids=lang_ids.to(device).unsqueeze(0) bert = bert.to(device).unsqueeze(0) + ja_bert = ja_bert.to(device).unsqueeze(0) x_tst_lengths = torch.LongTensor([phones.size(0)]).to(device) del phones speakers = torch.LongTensor([hps.data.spk2id[sid]]).to(device) - audio = net_g.infer(x_tst, x_tst_lengths, speakers, tones, lang_ids, bert, sdp_ratio=sdp_ratio + audio = net_g.infer(x_tst, x_tst_lengths, speakers, tones, lang_ids, bert, ja_bert, sdp_ratio=sdp_ratio , noise_scale=noise_scale, noise_scale_w=noise_scale_w, length_scale=length_scale)[0][0,0].data.cpu().float().numpy() del x_tst, tones, lang_ids, bert, x_tst_lengths, speakers return audio From 96c0a81e71b5817d204bc4b9c9bf35c7b0d49678 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Tue, 5 Sep 2023 10:24:25 +0800 Subject: [PATCH 021/102] support mps --- text/japanese_bert.py | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/text/japanese_bert.py b/text/japanese_bert.py index 304d03aeb..bb8369612 100644 --- a/text/japanese_bert.py +++ b/text/japanese_bert.py @@ -1,7 +1,15 @@ import torch from transformers import AutoTokenizer, AutoModelForMaskedLM -device = torch.device("cuda" if torch.cuda.is_available() else "cpu") +device = torch.device( + "cuda" + if torch.cuda.is_available() + else ( + "mps" + if sys.platform == "darwin" and torch.backends.mps.is_available() + else "cpu" + ) + ) tokenizer = AutoTokenizer.from_pretrained("./bert/bert-base-japanese-v3") model = AutoModelForMaskedLM.from_pretrained("./bert/bert-base-japanese-v3").to(device) From 0000785a5320e965fba7446ca4d9ec24f863be7a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Tue, 5 Sep 2023 10:28:07 +0800 Subject: [PATCH 022/102] Update server.py --- server.py | 103 ++++++++++++++++++++++++++++++------------------------ 1 file changed, 58 insertions(+), 45 deletions(-) diff --git a/server.py b/server.py index c736ca4f9..caa62387b 100644 --- a/server.py +++ b/server.py @@ -14,9 +14,9 @@ # Flask Init app = Flask(__name__) app.config['JSON_AS_ASCII'] = False + def get_text(text, language_str, hps): norm_text, phone, tone, word2ph = clean_text(text, language_str) - print([f"{p}{t}" for p, t in zip(phone, tone)]) phone, tone, language = cleaned_text_to_sequence(phone, tone, language_str) if hps.data.add_blank: @@ -27,25 +27,36 @@ def get_text(text, language_str, hps): word2ph[i] = word2ph[i] * 2 word2ph[0] += 1 bert = get_bert(norm_text, word2ph, language_str) - - assert bert.shape[-1] == len(phone) - + del word2ph + assert bert.shape[-1] == len(phone), phone + + if language_str=='ZH': + bert = bert + ja_bert = torch.zeros(768, len(phone)) + elif language_str=="JA": + ja_bert = bert + bert = torch.zeros(1024, len(phone)) + else: + bert = torch.zeros(1024, len(phone)) + ja_bert = torch.zeros(768, len(phone)) + assert bert.shape[-1] == len(phone), ( + bert.shape, len(phone), sum(word2ph), p1, p2, t1, t2, pold, pold2, word2ph, text, w2pho) phone = torch.LongTensor(phone) tone = torch.LongTensor(tone) language = torch.LongTensor(language) + return bert, ja_bert, phone, tone, language - return bert, phone, tone, language - -def infer(text, sdp_ratio, noise_scale, noise_scale_w,length_scale,sid): - bert, phones, tones, lang_ids = get_text(text,"ZH", hps,) +def infer(text, sdp_ratio, noise_scale, noise_scale_w, length_scale, sid, language): + bert, ja_bert, phones, tones, lang_ids = get_text(text, language, hps) with torch.no_grad(): x_tst=phones.to(dev).unsqueeze(0) tones=tones.to(dev).unsqueeze(0) lang_ids=lang_ids.to(dev).unsqueeze(0) bert = bert.to(dev).unsqueeze(0) + ja_bert = ja_bert.to(device).unsqueeze(0) x_tst_lengths = torch.LongTensor([phones.size(0)]).to(dev) speakers = torch.LongTensor([hps.data.spk2id[sid]]).to(dev) - audio = net_g.infer(x_tst, x_tst_lengths, speakers, tones, lang_ids,bert, sdp_ratio=sdp_ratio + audio = net_g.infer(x_tst, x_tst_lengths, speakers, tones, lang_ids, bert, ja_bert, sdp_ratio=sdp_ratio , noise_scale=noise_scale, noise_scale_w=noise_scale_w, length_scale=length_scale)[0][0,0].data.cpu().float().numpy() return audio @@ -84,40 +95,42 @@ def wav2(i, o, format): _ = utils.load_checkpoint("logs/G_649000.pth", net_g, None,skip_optimizer=True) -@app.route("/",methods=['GET','POST']) +@app.route("/") def main(): - if request.method == 'GET': - try: - speaker = request.args.get('speaker') - text = request.args.get('text').replace("/n","") - sdp_ratio = float(request.args.get("sdp_ratio", 0.2)) - noise = float(request.args.get("noise", 0.5)) - noisew = float(request.args.get("noisew", 0.6)) - length = float(request.args.get("length", 1.2)) - if length >= 2: - return "Too big length" - if len(text) >=200: - return "Too long text" - fmt = request.args.get("format", "wav") - if None in (speaker, text): - return "Missing Parameter" - if fmt not in ("mp3", "wav", "ogg"): - return "Invalid Format" - except: - return "Invalid Parameter" - - with torch.no_grad(): - audio = infer(text, sdp_ratio=sdp_ratio, noise_scale=noise, noise_scale_w=noisew, length_scale=length, sid=speaker) - - with BytesIO() as wav: - wavfile.write(wav, hps.data.sampling_rate, audio) - torch.cuda.empty_cache() - if fmt == "wav": - return Response(wav.getvalue(), mimetype="audio/wav") - wav.seek(0, 0) - with BytesIO() as ofp: - wav2(wav, ofp, fmt) - return Response( - ofp.getvalue(), - mimetype="audio/mpeg" if fmt == "mp3" else "audio/ogg" - ) + try: + speaker = request.args.get('speaker') + text = request.args.get('text').replace("/n","") + sdp_ratio = float(request.args.get("sdp_ratio", 0.2)) + noise = float(request.args.get("noise", 0.5)) + noisew = float(request.args.get("noisew", 0.6)) + length = float(request.args.get("length", 1.2)) + language = request.args.get('language') + if length >= 2: + return "Too big length" + if len(text) >=250: + return "Too long text" + fmt = request.args.get("format", "wav") + if None in (speaker, text): + return "Missing Parameter" + if fmt not in ("mp3", "wav", "ogg"): + return "Invalid Format" + if language not in ("JA", "ZH") + return "Invalid language" + except: + return "Invalid Parameter" + + with torch.no_grad(): + audio = infer(text, sdp_ratio=sdp_ratio, noise_scale=noise, noise_scale_w=noisew, length_scale=length, sid=speaker,language = language) + + with BytesIO() as wav: + wavfile.write(wav, hps.data.sampling_rate, audio) + torch.cuda.empty_cache() + if fmt == "wav": + return Response(wav.getvalue(), mimetype="audio/wav") + wav.seek(0, 0) + with BytesIO() as ofp: + wav2(wav, ofp, fmt) + return Response( + ofp.getvalue(), + mimetype="audio/mpeg" if fmt == "mp3" else "audio/ogg" + ) From 2b88603554fbe4272aecaf9c997a46842e3b53e1 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Tue, 5 Sep 2023 10:32:09 +0800 Subject: [PATCH 023/102] Delete bert/bert-base-japanese-v3/.gitkeep --- bert/bert-base-japanese-v3/.gitkeep | 1 - 1 file changed, 1 deletion(-) delete mode 100644 bert/bert-base-japanese-v3/.gitkeep diff --git a/bert/bert-base-japanese-v3/.gitkeep b/bert/bert-base-japanese-v3/.gitkeep deleted file mode 100644 index 8b1378917..000000000 --- a/bert/bert-base-japanese-v3/.gitkeep +++ /dev/null @@ -1 +0,0 @@ - From ff8469f0f6faa12267cc858239e6f6f06e86a168 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Tue, 5 Sep 2023 11:26:50 +0800 Subject: [PATCH 024/102] decrease num_worker --- train_ms.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/train_ms.py b/train_ms.py index 0568aeb36..8f732f8a2 100644 --- a/train_ms.py +++ b/train_ms.py @@ -81,9 +81,9 @@ def run(rank, n_gpus, hps): rank=rank, shuffle=True) collate_fn = TextAudioSpeakerCollate() - train_loader = DataLoader(train_dataset, num_workers=24, shuffle=False, pin_memory=True, + train_loader = DataLoader(train_dataset, num_workers=20, shuffle=False, pin_memory=True, collate_fn=collate_fn, batch_sampler=train_sampler, - persistent_workers=True,prefetch_factor=4) #256G Memory suitable loader. + persistent_workers=True,prefetch_factor=5) #128G Memory suitable loader. if rank == 0: eval_dataset = TextAudioSpeakerLoader(hps.data.validation_files, hps.data) eval_loader = DataLoader(eval_dataset, num_workers=0, shuffle=False, From 24ba0f26dff206d755b46c46858213b8c87540e4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Tue, 5 Sep 2023 11:30:28 +0800 Subject: [PATCH 025/102] Update train_ms.py --- train_ms.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/train_ms.py b/train_ms.py index 8f732f8a2..66f235d88 100644 --- a/train_ms.py +++ b/train_ms.py @@ -81,9 +81,9 @@ def run(rank, n_gpus, hps): rank=rank, shuffle=True) collate_fn = TextAudioSpeakerCollate() - train_loader = DataLoader(train_dataset, num_workers=20, shuffle=False, pin_memory=True, + train_loader = DataLoader(train_dataset, num_workers=16, shuffle=False, pin_memory=True, collate_fn=collate_fn, batch_sampler=train_sampler, - persistent_workers=True,prefetch_factor=5) #128G Memory suitable loader. + persistent_workers=True,prefetch_factor=4) #128G Memory suitable loader. if rank == 0: eval_dataset = TextAudioSpeakerLoader(hps.data.validation_files, hps.data) eval_loader = DataLoader(eval_dataset, num_workers=0, shuffle=False, From 55404f92b5d3f949ea6dcf322b19412275e0b600 Mon Sep 17 00:00:00 2001 From: Lengyue Date: Tue, 5 Sep 2023 01:08:42 -0400 Subject: [PATCH 026/102] Add reference pre-commit config --- .gitignore | 4 ++++ .pre-commit-config.yaml | 25 +++++++++++++++++++++++++ 2 files changed, 29 insertions(+) create mode 100644 .pre-commit-config.yaml diff --git a/.gitignore b/.gitignore index a7ecc1811..c4b7cbdad 100644 --- a/.gitignore +++ b/.gitignore @@ -162,3 +162,7 @@ cython_debug/ .DS_Store /models /logs + +filelists/* +!/filelists/esd.list +data/* diff --git a/.pre-commit-config.yaml b/.pre-commit-config.yaml new file mode 100644 index 000000000..090e114c1 --- /dev/null +++ b/.pre-commit-config.yaml @@ -0,0 +1,25 @@ +repos: + - repo: https://github.com/pre-commit/pre-commit-hooks + rev: v2.3.0 + hooks: + - id: check-yaml + - id: end-of-file-fixer + - id: trailing-whitespace + + - repo: https://github.com/astral-sh/ruff-pre-commit + rev: v0.0.280 + hooks: + - id: ruff + args: [ --fix ] + + - repo: https://github.com/psf/black + rev: 22.12.0 + hooks: + - id: black + + - repo: https://github.com/codespell-project/codespell + rev: v2.2.4 + hooks: + - id: codespell + files: ^.*\.(py|md|rst|yml)$ + args: [-L=fro] From eabeb72e27b272e23edf05b4d864c4b409471bea Mon Sep 17 00:00:00 2001 From: Lengyue Date: Tue, 5 Sep 2023 01:08:51 -0400 Subject: [PATCH 027/102] Optimize preprocess code --- preprocess_text.py | 114 +++++++++++++++++++++++++++++++-------------- 1 file changed, 78 insertions(+), 36 deletions(-) diff --git a/preprocess_text.py b/preprocess_text.py index 5eb0f3b9e..4bb0e23e3 100644 --- a/preprocess_text.py +++ b/preprocess_text.py @@ -1,64 +1,106 @@ import json +from collections import defaultdict from random import shuffle +from typing import Optional -import tqdm +from tqdm import tqdm +import click from text.cleaner import clean_text -from collections import defaultdict -stage = [1,2,3] - -transcription_path = 'filelists/genshin.list' -train_path = 'filelists/train.list' -val_path = 'filelists/val.list' -config_path = "configs/config.json" -val_per_spk = 4 -max_val_total = 8 - -if 1 in stage: - with open( transcription_path+'.cleaned', 'w', encoding='utf-8') as f: - for line in tqdm.tqdm(open(transcription_path, encoding='utf-8').readlines()): + + +@click.command() +@click.option( + "--transcription-path", + default="filelists/genshin.list", + type=click.Path(exists=True, file_okay=True, dir_okay=False), +) +@click.option("--cleaned-path", default=None) +@click.option("--train-path", default="filelists/train.list") +@click.option("--val-path", default="filelists/val.list") +@click.option( + "--config-path", + default="configs/config.json", + type=click.Path(exists=True, file_okay=True, dir_okay=False), +) +@click.option("--val-per-spk", default=4) +@click.option("--max-val-total", default=8) +@click.option("--clean/--no-clean", default=True) +def main( + transcription_path: str, + cleaned_path: Optional[str], + train_path: str, + val_path: str, + config_path: str, + val_per_spk: int, + max_val_total: int, + clean: bool, +): + + if cleaned_path is None: + cleaned_path = transcription_path + ".cleaned" + + if clean: + out_file = open(cleaned_path, "w", encoding="utf-8") + for line in tqdm(open(transcription_path, encoding="utf-8").readlines()): try: - utt, spk, language, text = line.strip().split('|') + utt, spk, language, text = line.strip().split("|") norm_text, phones, tones, word2ph = clean_text(text, language) - f.write('{}|{}|{}|{}|{}|{}|{}\n'.format(utt, spk, language, norm_text, ' '.join(phones), - " ".join([str(i) for i in tones]), - " ".join([str(i) for i in word2ph]))) - except Exception as error : - print("err!", utt, error) + out_file.write( + "{}|{}|{}|{}|{}|{}|{}\n".format( + utt, + spk, + language, + norm_text, + " ".join(phones), + " ".join([str(i) for i in tones]), + " ".join([str(i) for i in word2ph]), + ) + ) + except Exception as error: + print("err!", line, error) + + out_file.close() + + transcription_path = cleaned_path -if 2 in stage: spk_utt_map = defaultdict(list) spk_id_map = {} current_sid = 0 - with open( transcription_path+'.cleaned', encoding='utf-8') as f: + with open(transcription_path, encoding="utf-8") as f: for line in f.readlines(): - utt, spk, language, text, phones, tones, word2ph = line.strip().split('|') + utt, spk, language, text, phones, tones, word2ph = line.strip().split("|") spk_utt_map[spk].append(line) + if spk not in spk_id_map.keys(): spk_id_map[spk] = current_sid current_sid += 1 + train_list = [] val_list = [] - + for spk, utts in spk_utt_map.items(): shuffle(utts) - val_list+=utts[:val_per_spk] - train_list+=utts[val_per_spk:] + val_list += utts[:val_per_spk] + train_list += utts[val_per_spk:] + if len(val_list) > max_val_total: - train_list+=val_list[max_val_total:] + train_list += val_list[max_val_total:] val_list = val_list[:max_val_total] - - with open( train_path,"w", encoding='utf-8') as f: + + with open(train_path, "w", encoding="utf-8") as f: for line in train_list: f.write(line) - - with open(val_path, "w", encoding='utf-8') as f: + + with open(val_path, "w", encoding="utf-8") as f: for line in val_list: f.write(line) -if 3 in stage: - assert 2 in stage - config = json.load(open(config_path, encoding='utf-8')) - config["data"]['spk2id'] = spk_id_map - with open(config_path, 'w', encoding='utf-8') as f: + config = json.load(open(config_path, encoding="utf-8")) + config["data"]["spk2id"] = spk_id_map + with open(config_path, "w", encoding="utf-8") as f: json.dump(config, f, indent=2, ensure_ascii=False) + + +if __name__ == "__main__": + main() From d4d0082b05cb5f6d28381dcb2ed0684d7b026ba9 Mon Sep 17 00:00:00 2001 From: Lengyue Date: Tue, 5 Sep 2023 01:21:17 -0400 Subject: [PATCH 028/102] lint code (no other modify) --- models.py | 782 ++++++++++++++++++++++++++++++++++++------------------ 1 file changed, 530 insertions(+), 252 deletions(-) diff --git a/models.py b/models.py index 9a4e1e72a..cd83ea4df 100644 --- a/models.py +++ b/models.py @@ -1,4 +1,3 @@ -import copy import math import torch from torch import nn @@ -9,91 +8,102 @@ import attentions import monotonic_align -from torch.nn import Conv1d, ConvTranspose1d, AvgPool1d, Conv2d +from torch.nn import Conv1d, ConvTranspose1d, Conv2d from torch.nn.utils import weight_norm, remove_weight_norm, spectral_norm from commons import init_weights, get_padding from text import symbols, num_tones, num_languages -class DurationDiscriminator(nn.Module): #vits2 - def __init__(self, in_channels, filter_channels, kernel_size, p_dropout, gin_channels=0): - super().__init__() - - self.in_channels = in_channels - self.filter_channels = filter_channels - self.kernel_size = kernel_size - self.p_dropout = p_dropout - self.gin_channels = gin_channels - - self.drop = nn.Dropout(p_dropout) - self.conv_1 = nn.Conv1d(in_channels, filter_channels, kernel_size, padding=kernel_size//2) - self.norm_1 = modules.LayerNorm(filter_channels) - self.conv_2 = nn.Conv1d(filter_channels, filter_channels, kernel_size, padding=kernel_size//2) - self.norm_2 = modules.LayerNorm(filter_channels) - self.dur_proj = nn.Conv1d(1, filter_channels, 1) - - self.pre_out_conv_1 = nn.Conv1d(2*filter_channels, filter_channels, kernel_size, padding=kernel_size//2) - self.pre_out_norm_1 = modules.LayerNorm(filter_channels) - self.pre_out_conv_2 = nn.Conv1d(filter_channels, filter_channels, kernel_size, padding=kernel_size//2) - self.pre_out_norm_2 = modules.LayerNorm(filter_channels) - - if gin_channels != 0: - self.cond = nn.Conv1d(gin_channels, in_channels, 1) - - self.output_layer = nn.Sequential( - nn.Linear(filter_channels, 1), - nn.Sigmoid() - ) - - def forward_probability(self, x, x_mask, dur, g=None): - dur = self.dur_proj(dur) - x = torch.cat([x, dur], dim=1) - x = self.pre_out_conv_1(x * x_mask) - x = torch.relu(x) - x = self.pre_out_norm_1(x) - x = self.drop(x) - x = self.pre_out_conv_2(x * x_mask) - x = torch.relu(x) - x = self.pre_out_norm_2(x) - x = self.drop(x) - x = x * x_mask - x = x.transpose(1, 2) - output_prob = self.output_layer(x) - return output_prob - - def forward(self, x, x_mask, dur_r, dur_hat, g=None): - x = torch.detach(x) - if g is not None: - g = torch.detach(g) - x = x + self.cond(g) - x = self.conv_1(x * x_mask) - x = torch.relu(x) - x = self.norm_1(x) - x = self.drop(x) - x = self.conv_2(x * x_mask) - x = torch.relu(x) - x = self.norm_2(x) - x = self.drop(x) - - output_probs = [] - for dur in [dur_r, dur_hat]: - output_prob = self.forward_probability(x, x_mask, dur, g) - output_probs.append(output_prob) - - return output_probs + + +class DurationDiscriminator(nn.Module): # vits2 + def __init__( + self, in_channels, filter_channels, kernel_size, p_dropout, gin_channels=0 + ): + super().__init__() + + self.in_channels = in_channels + self.filter_channels = filter_channels + self.kernel_size = kernel_size + self.p_dropout = p_dropout + self.gin_channels = gin_channels + + self.drop = nn.Dropout(p_dropout) + self.conv_1 = nn.Conv1d( + in_channels, filter_channels, kernel_size, padding=kernel_size // 2 + ) + self.norm_1 = modules.LayerNorm(filter_channels) + self.conv_2 = nn.Conv1d( + filter_channels, filter_channels, kernel_size, padding=kernel_size // 2 + ) + self.norm_2 = modules.LayerNorm(filter_channels) + self.dur_proj = nn.Conv1d(1, filter_channels, 1) + + self.pre_out_conv_1 = nn.Conv1d( + 2 * filter_channels, filter_channels, kernel_size, padding=kernel_size // 2 + ) + self.pre_out_norm_1 = modules.LayerNorm(filter_channels) + self.pre_out_conv_2 = nn.Conv1d( + filter_channels, filter_channels, kernel_size, padding=kernel_size // 2 + ) + self.pre_out_norm_2 = modules.LayerNorm(filter_channels) + + if gin_channels != 0: + self.cond = nn.Conv1d(gin_channels, in_channels, 1) + + self.output_layer = nn.Sequential(nn.Linear(filter_channels, 1), nn.Sigmoid()) + + def forward_probability(self, x, x_mask, dur, g=None): + dur = self.dur_proj(dur) + x = torch.cat([x, dur], dim=1) + x = self.pre_out_conv_1(x * x_mask) + x = torch.relu(x) + x = self.pre_out_norm_1(x) + x = self.drop(x) + x = self.pre_out_conv_2(x * x_mask) + x = torch.relu(x) + x = self.pre_out_norm_2(x) + x = self.drop(x) + x = x * x_mask + x = x.transpose(1, 2) + output_prob = self.output_layer(x) + return output_prob + + def forward(self, x, x_mask, dur_r, dur_hat, g=None): + x = torch.detach(x) + if g is not None: + g = torch.detach(g) + x = x + self.cond(g) + x = self.conv_1(x * x_mask) + x = torch.relu(x) + x = self.norm_1(x) + x = self.drop(x) + x = self.conv_2(x * x_mask) + x = torch.relu(x) + x = self.norm_2(x) + x = self.drop(x) + + output_probs = [] + for dur in [dur_r, dur_hat]: + output_prob = self.forward_probability(x, x_mask, dur, g) + output_probs.append(output_prob) + + return output_probs + class TransformerCouplingBlock(nn.Module): - def __init__(self, - channels, - hidden_channels, - filter_channels, - n_heads, - n_layers, - kernel_size, - p_dropout, - n_flows=4, - gin_channels=0, - share_parameter=False - ): + def __init__( + self, + channels, + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size, + p_dropout, + n_flows=4, + gin_channels=0, + share_parameter=False, + ): super().__init__() self.channels = channels @@ -105,11 +115,36 @@ def __init__(self, self.flows = nn.ModuleList() - self.wn = attentions.FFT(hidden_channels, filter_channels, n_heads, n_layers, kernel_size, p_dropout, isflow = True, gin_channels = self.gin_channels) if share_parameter else None + self.wn = ( + attentions.FFT( + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size, + p_dropout, + isflow=True, + gin_channels=self.gin_channels, + ) + if share_parameter + else None + ) for i in range(n_flows): self.flows.append( - modules.TransformerCouplingLayer(channels, hidden_channels, kernel_size, n_layers, n_heads, p_dropout, filter_channels, mean_only=True, wn_sharing_parameter=self.wn, gin_channels = self.gin_channels)) + modules.TransformerCouplingLayer( + channels, + hidden_channels, + kernel_size, + n_layers, + n_heads, + p_dropout, + filter_channels, + mean_only=True, + wn_sharing_parameter=self.wn, + gin_channels=self.gin_channels, + ) + ) self.flows.append(modules.Flip()) def forward(self, x, x_mask, g=None, reverse=False): @@ -121,8 +156,17 @@ def forward(self, x, x_mask, g=None, reverse=False): x = flow(x, x_mask, g=g, reverse=reverse) return x + class StochasticDurationPredictor(nn.Module): - def __init__(self, in_channels, filter_channels, kernel_size, p_dropout, n_flows=4, gin_channels=0): + def __init__( + self, + in_channels, + filter_channels, + kernel_size, + p_dropout, + n_flows=4, + gin_channels=0, + ): super().__init__() filter_channels = in_channels # it needs to be removed from future version. self.in_channels = in_channels @@ -136,21 +180,29 @@ def __init__(self, in_channels, filter_channels, kernel_size, p_dropout, n_flows self.flows = nn.ModuleList() self.flows.append(modules.ElementwiseAffine(2)) for i in range(n_flows): - self.flows.append(modules.ConvFlow(2, filter_channels, kernel_size, n_layers=3)) + self.flows.append( + modules.ConvFlow(2, filter_channels, kernel_size, n_layers=3) + ) self.flows.append(modules.Flip()) self.post_pre = nn.Conv1d(1, filter_channels, 1) self.post_proj = nn.Conv1d(filter_channels, filter_channels, 1) - self.post_convs = modules.DDSConv(filter_channels, kernel_size, n_layers=3, p_dropout=p_dropout) + self.post_convs = modules.DDSConv( + filter_channels, kernel_size, n_layers=3, p_dropout=p_dropout + ) self.post_flows = nn.ModuleList() self.post_flows.append(modules.ElementwiseAffine(2)) for i in range(4): - self.post_flows.append(modules.ConvFlow(2, filter_channels, kernel_size, n_layers=3)) + self.post_flows.append( + modules.ConvFlow(2, filter_channels, kernel_size, n_layers=3) + ) self.post_flows.append(modules.Flip()) self.pre = nn.Conv1d(in_channels, filter_channels, 1) self.proj = nn.Conv1d(filter_channels, filter_channels, 1) - self.convs = modules.DDSConv(filter_channels, kernel_size, n_layers=3, p_dropout=p_dropout) + self.convs = modules.DDSConv( + filter_channels, kernel_size, n_layers=3, p_dropout=p_dropout + ) if gin_channels != 0: self.cond = nn.Conv1d(gin_channels, filter_channels, 1) @@ -171,7 +223,10 @@ def forward(self, x, x_mask, w=None, g=None, reverse=False, noise_scale=1.0): h_w = self.post_pre(w) h_w = self.post_convs(h_w, x_mask) h_w = self.post_proj(h_w) * x_mask - e_q = torch.randn(w.size(0), 2, w.size(2)).to(device=x.device, dtype=x.dtype) * x_mask + e_q = ( + torch.randn(w.size(0), 2, w.size(2)).to(device=x.device, dtype=x.dtype) + * x_mask + ) z_q = e_q for flow in self.post_flows: z_q, logdet_q = flow(z_q, x_mask, g=(x + h_w)) @@ -179,8 +234,13 @@ def forward(self, x, x_mask, w=None, g=None, reverse=False, noise_scale=1.0): z_u, z1 = torch.split(z_q, [1, 1], 1) u = torch.sigmoid(z_u) * x_mask z0 = (w - u) * x_mask - logdet_tot_q += torch.sum((F.logsigmoid(z_u) + F.logsigmoid(-z_u)) * x_mask, [1, 2]) - logq = torch.sum(-0.5 * (math.log(2 * math.pi) + (e_q ** 2)) * x_mask, [1, 2]) - logdet_tot_q + logdet_tot_q += torch.sum( + (F.logsigmoid(z_u) + F.logsigmoid(-z_u)) * x_mask, [1, 2] + ) + logq = ( + torch.sum(-0.5 * (math.log(2 * math.pi) + (e_q**2)) * x_mask, [1, 2]) + - logdet_tot_q + ) logdet_tot = 0 z0, logdet = self.log_flow(z0, x_mask) @@ -189,12 +249,18 @@ def forward(self, x, x_mask, w=None, g=None, reverse=False, noise_scale=1.0): for flow in flows: z, logdet = flow(z, x_mask, g=x, reverse=reverse) logdet_tot = logdet_tot + logdet - nll = torch.sum(0.5 * (math.log(2 * math.pi) + (z ** 2)) * x_mask, [1, 2]) - logdet_tot + nll = ( + torch.sum(0.5 * (math.log(2 * math.pi) + (z**2)) * x_mask, [1, 2]) + - logdet_tot + ) return nll + logq # [b] else: flows = list(reversed(self.flows)) flows = flows[:-2] + [flows[-1]] # remove a useless vflow - z = torch.randn(x.size(0), 2, x.size(2)).to(device=x.device, dtype=x.dtype) * noise_scale + z = ( + torch.randn(x.size(0), 2, x.size(2)).to(device=x.device, dtype=x.dtype) + * noise_scale + ) for flow in flows: z = flow(z, x_mask, g=x, reverse=reverse) z0, z1 = torch.split(z, [1, 1], 1) @@ -203,7 +269,9 @@ def forward(self, x, x_mask, w=None, g=None, reverse=False, noise_scale=1.0): class DurationPredictor(nn.Module): - def __init__(self, in_channels, filter_channels, kernel_size, p_dropout, gin_channels=0): + def __init__( + self, in_channels, filter_channels, kernel_size, p_dropout, gin_channels=0 + ): super().__init__() self.in_channels = in_channels @@ -213,9 +281,13 @@ def __init__(self, in_channels, filter_channels, kernel_size, p_dropout, gin_cha self.gin_channels = gin_channels self.drop = nn.Dropout(p_dropout) - self.conv_1 = nn.Conv1d(in_channels, filter_channels, kernel_size, padding=kernel_size // 2) + self.conv_1 = nn.Conv1d( + in_channels, filter_channels, kernel_size, padding=kernel_size // 2 + ) self.norm_1 = modules.LayerNorm(filter_channels) - self.conv_2 = nn.Conv1d(filter_channels, filter_channels, kernel_size, padding=kernel_size // 2) + self.conv_2 = nn.Conv1d( + filter_channels, filter_channels, kernel_size, padding=kernel_size // 2 + ) self.norm_2 = modules.LayerNorm(filter_channels) self.proj = nn.Conv1d(filter_channels, 1, 1) @@ -240,16 +312,18 @@ def forward(self, x, x_mask, g=None): class TextEncoder(nn.Module): - def __init__(self, - n_vocab, - out_channels, - hidden_channels, - filter_channels, - n_heads, - n_layers, - kernel_size, - p_dropout, - gin_channels=0): + def __init__( + self, + n_vocab, + out_channels, + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size, + p_dropout, + gin_channels=0, + ): super().__init__() self.n_vocab = n_vocab self.out_channels = out_channels @@ -261,14 +335,14 @@ def __init__(self, self.p_dropout = p_dropout self.gin_channels = gin_channels self.emb = nn.Embedding(len(symbols), hidden_channels) - nn.init.normal_(self.emb.weight, 0.0, hidden_channels ** -0.5) + nn.init.normal_(self.emb.weight, 0.0, hidden_channels**-0.5) self.tone_emb = nn.Embedding(num_tones, hidden_channels) - nn.init.normal_(self.tone_emb.weight, 0.0, hidden_channels ** -0.5) + nn.init.normal_(self.tone_emb.weight, 0.0, hidden_channels**-0.5) self.language_emb = nn.Embedding(num_languages, hidden_channels) - nn.init.normal_(self.language_emb.weight, 0.0, hidden_channels ** -0.5) + nn.init.normal_(self.language_emb.weight, 0.0, hidden_channels**-0.5) self.bert_proj = nn.Conv1d(1024, hidden_channels, 1) self.ja_bert_proj = nn.Conv1d(768, hidden_channels, 1) - + self.encoder = attentions.Encoder( hidden_channels, filter_channels, @@ -276,16 +350,26 @@ def __init__(self, n_layers, kernel_size, p_dropout, - gin_channels=self.gin_channels) + gin_channels=self.gin_channels, + ) self.proj = nn.Conv1d(hidden_channels, out_channels * 2, 1) def forward(self, x, x_lengths, tone, language, bert, ja_bert, g=None): - bert_emb = self.zh_bert_proj(bert).transpose(1,2) - ja_bert_emb = = self.ja_bert_proj(ja_bert).transpose(1,2) - x = (self.emb(x)+ self.tone_emb(tone)+ self.language_emb(language) - + bert_emb +ja_bert_emb) * math.sqrt(self.hidden_channels) # [b, t, h] + bert_emb = self.zh_bert_proj(bert).transpose(1, 2) + ja_bert_emb = self.ja_bert_proj(ja_bert).transpose(1, 2) + x = ( + self.emb(x) + + self.tone_emb(tone) + + self.language_emb(language) + + bert_emb + + ja_bert_emb + ) * math.sqrt( + self.hidden_channels + ) # [b, t, h] x = torch.transpose(x, 1, -1) # [b, h, t] - x_mask = torch.unsqueeze(commons.sequence_mask(x_lengths, x.size(2)), 1).to(x.dtype) + x_mask = torch.unsqueeze(commons.sequence_mask(x_lengths, x.size(2)), 1).to( + x.dtype + ) x = self.encoder(x * x_mask, x_mask, g=g) stats = self.proj(x) * x_mask @@ -295,14 +379,16 @@ def forward(self, x, x_lengths, tone, language, bert, ja_bert, g=None): class ResidualCouplingBlock(nn.Module): - def __init__(self, - channels, - hidden_channels, - kernel_size, - dilation_rate, - n_layers, - n_flows=4, - gin_channels=0): + def __init__( + self, + channels, + hidden_channels, + kernel_size, + dilation_rate, + n_layers, + n_flows=4, + gin_channels=0, + ): super().__init__() self.channels = channels self.hidden_channels = hidden_channels @@ -315,8 +401,16 @@ def __init__(self, self.flows = nn.ModuleList() for i in range(n_flows): self.flows.append( - modules.ResidualCouplingLayer(channels, hidden_channels, kernel_size, dilation_rate, n_layers, - gin_channels=gin_channels, mean_only=True)) + modules.ResidualCouplingLayer( + channels, + hidden_channels, + kernel_size, + dilation_rate, + n_layers, + gin_channels=gin_channels, + mean_only=True, + ) + ) self.flows.append(modules.Flip()) def forward(self, x, x_mask, g=None, reverse=False): @@ -330,14 +424,16 @@ def forward(self, x, x_mask, g=None, reverse=False): class PosteriorEncoder(nn.Module): - def __init__(self, - in_channels, - out_channels, - hidden_channels, - kernel_size, - dilation_rate, - n_layers, - gin_channels=0): + def __init__( + self, + in_channels, + out_channels, + hidden_channels, + kernel_size, + dilation_rate, + n_layers, + gin_channels=0, + ): super().__init__() self.in_channels = in_channels self.out_channels = out_channels @@ -348,11 +444,19 @@ def __init__(self, self.gin_channels = gin_channels self.pre = nn.Conv1d(in_channels, hidden_channels, 1) - self.enc = modules.WN(hidden_channels, kernel_size, dilation_rate, n_layers, gin_channels=gin_channels) + self.enc = modules.WN( + hidden_channels, + kernel_size, + dilation_rate, + n_layers, + gin_channels=gin_channels, + ) self.proj = nn.Conv1d(hidden_channels, out_channels * 2, 1) def forward(self, x, x_lengths, g=None): - x_mask = torch.unsqueeze(commons.sequence_mask(x_lengths, x.size(2)), 1).to(x.dtype) + x_mask = torch.unsqueeze(commons.sequence_mask(x_lengths, x.size(2)), 1).to( + x.dtype + ) x = self.pre(x) * x_mask x = self.enc(x, x_mask, g=g) stats = self.proj(x) * x_mask @@ -362,24 +466,45 @@ def forward(self, x, x_lengths, g=None): class Generator(torch.nn.Module): - def __init__(self, initial_channel, resblock, resblock_kernel_sizes, resblock_dilation_sizes, upsample_rates, - upsample_initial_channel, upsample_kernel_sizes, gin_channels=0): + def __init__( + self, + initial_channel, + resblock, + resblock_kernel_sizes, + resblock_dilation_sizes, + upsample_rates, + upsample_initial_channel, + upsample_kernel_sizes, + gin_channels=0, + ): super(Generator, self).__init__() self.num_kernels = len(resblock_kernel_sizes) self.num_upsamples = len(upsample_rates) - self.conv_pre = Conv1d(initial_channel, upsample_initial_channel, 7, 1, padding=3) - resblock = modules.ResBlock1 if resblock == '1' else modules.ResBlock2 + self.conv_pre = Conv1d( + initial_channel, upsample_initial_channel, 7, 1, padding=3 + ) + resblock = modules.ResBlock1 if resblock == "1" else modules.ResBlock2 self.ups = nn.ModuleList() for i, (u, k) in enumerate(zip(upsample_rates, upsample_kernel_sizes)): - self.ups.append(weight_norm( - ConvTranspose1d(upsample_initial_channel // (2 ** i), upsample_initial_channel // (2 ** (i + 1)), - k, u, padding=(k - u) // 2))) + self.ups.append( + weight_norm( + ConvTranspose1d( + upsample_initial_channel // (2**i), + upsample_initial_channel // (2 ** (i + 1)), + k, + u, + padding=(k - u) // 2, + ) + ) + ) self.resblocks = nn.ModuleList() for i in range(len(self.ups)): ch = upsample_initial_channel // (2 ** (i + 1)) - for j, (k, d) in enumerate(zip(resblock_kernel_sizes, resblock_dilation_sizes)): + for j, (k, d) in enumerate( + zip(resblock_kernel_sizes, resblock_dilation_sizes) + ): self.resblocks.append(resblock(ch, k, d)) self.conv_post = Conv1d(ch, 1, 7, 1, padding=3, bias=False) @@ -410,11 +535,11 @@ def forward(self, x, g=None): return x def remove_weight_norm(self): - print('Removing weight norm...') - for l in self.ups: - remove_weight_norm(l) - for l in self.resblocks: - l.remove_weight_norm() + print("Removing weight norm...") + for layer in self.ups: + remove_weight_norm(layer) + for layer in self.resblocks: + layer.remove_weight_norm() class DiscriminatorP(torch.nn.Module): @@ -422,14 +547,56 @@ def __init__(self, period, kernel_size=5, stride=3, use_spectral_norm=False): super(DiscriminatorP, self).__init__() self.period = period self.use_spectral_norm = use_spectral_norm - norm_f = weight_norm if use_spectral_norm == False else spectral_norm - self.convs = nn.ModuleList([ - norm_f(Conv2d(1, 32, (kernel_size, 1), (stride, 1), padding=(get_padding(kernel_size, 1), 0))), - norm_f(Conv2d(32, 128, (kernel_size, 1), (stride, 1), padding=(get_padding(kernel_size, 1), 0))), - norm_f(Conv2d(128, 512, (kernel_size, 1), (stride, 1), padding=(get_padding(kernel_size, 1), 0))), - norm_f(Conv2d(512, 1024, (kernel_size, 1), (stride, 1), padding=(get_padding(kernel_size, 1), 0))), - norm_f(Conv2d(1024, 1024, (kernel_size, 1), 1, padding=(get_padding(kernel_size, 1), 0))), - ]) + norm_f = weight_norm if use_spectral_norm is False else spectral_norm + self.convs = nn.ModuleList( + [ + norm_f( + Conv2d( + 1, + 32, + (kernel_size, 1), + (stride, 1), + padding=(get_padding(kernel_size, 1), 0), + ) + ), + norm_f( + Conv2d( + 32, + 128, + (kernel_size, 1), + (stride, 1), + padding=(get_padding(kernel_size, 1), 0), + ) + ), + norm_f( + Conv2d( + 128, + 512, + (kernel_size, 1), + (stride, 1), + padding=(get_padding(kernel_size, 1), 0), + ) + ), + norm_f( + Conv2d( + 512, + 1024, + (kernel_size, 1), + (stride, 1), + padding=(get_padding(kernel_size, 1), 0), + ) + ), + norm_f( + Conv2d( + 1024, + 1024, + (kernel_size, 1), + 1, + padding=(get_padding(kernel_size, 1), 0), + ) + ), + ] + ) self.conv_post = norm_f(Conv2d(1024, 1, (3, 1), 1, padding=(1, 0))) def forward(self, x): @@ -443,8 +610,8 @@ def forward(self, x): t = t + n_pad x = x.view(b, c, t // self.period, self.period) - for l in self.convs: - x = l(x) + for layer in self.convs: + x = layer(x) x = F.leaky_relu(x, modules.LRELU_SLOPE) fmap.append(x) x = self.conv_post(x) @@ -457,22 +624,24 @@ def forward(self, x): class DiscriminatorS(torch.nn.Module): def __init__(self, use_spectral_norm=False): super(DiscriminatorS, self).__init__() - norm_f = weight_norm if use_spectral_norm == False else spectral_norm - self.convs = nn.ModuleList([ - norm_f(Conv1d(1, 16, 15, 1, padding=7)), - norm_f(Conv1d(16, 64, 41, 4, groups=4, padding=20)), - norm_f(Conv1d(64, 256, 41, 4, groups=16, padding=20)), - norm_f(Conv1d(256, 1024, 41, 4, groups=64, padding=20)), - norm_f(Conv1d(1024, 1024, 41, 4, groups=256, padding=20)), - norm_f(Conv1d(1024, 1024, 5, 1, padding=2)), - ]) + norm_f = weight_norm if use_spectral_norm is False else spectral_norm + self.convs = nn.ModuleList( + [ + norm_f(Conv1d(1, 16, 15, 1, padding=7)), + norm_f(Conv1d(16, 64, 41, 4, groups=4, padding=20)), + norm_f(Conv1d(64, 256, 41, 4, groups=16, padding=20)), + norm_f(Conv1d(256, 1024, 41, 4, groups=64, padding=20)), + norm_f(Conv1d(1024, 1024, 41, 4, groups=256, padding=20)), + norm_f(Conv1d(1024, 1024, 5, 1, padding=2)), + ] + ) self.conv_post = norm_f(Conv1d(1024, 1, 3, 1, padding=1)) def forward(self, x): fmap = [] - for l in self.convs: - x = l(x) + for layer in self.convs: + x = layer(x) x = F.leaky_relu(x, modules.LRELU_SLOPE) fmap.append(x) x = self.conv_post(x) @@ -488,7 +657,9 @@ def __init__(self, use_spectral_norm=False): periods = [2, 3, 5, 7, 11] discs = [DiscriminatorS(use_spectral_norm=use_spectral_norm)] - discs = discs + [DiscriminatorP(i, use_spectral_norm=use_spectral_norm) for i in periods] + discs = discs + [ + DiscriminatorP(i, use_spectral_norm=use_spectral_norm) for i in periods + ] self.discriminators = nn.ModuleList(discs) def forward(self, y, y_hat): @@ -506,11 +677,12 @@ def forward(self, y, y_hat): return y_d_rs, y_d_gs, fmap_rs, fmap_gs + class ReferenceEncoder(nn.Module): - ''' + """ inputs --- [N, Ty/r, n_mels*r] mels outputs --- [N, ref_enc_gru_size] - ''' + """ def __init__(self, spec_channels, gin_channels=0): @@ -519,18 +691,27 @@ def __init__(self, spec_channels, gin_channels=0): ref_enc_filters = [32, 32, 64, 64, 128, 128] K = len(ref_enc_filters) filters = [1] + ref_enc_filters - convs = [weight_norm(nn.Conv2d(in_channels=filters[i], - out_channels=filters[i + 1], - kernel_size=(3, 3), - stride=(2, 2), - padding=(1, 1))) for i in range(K)] + convs = [ + weight_norm( + nn.Conv2d( + in_channels=filters[i], + out_channels=filters[i + 1], + kernel_size=(3, 3), + stride=(2, 2), + padding=(1, 1), + ) + ) + for i in range(K) + ] self.convs = nn.ModuleList(convs) - # self.wns = nn.ModuleList([weight_norm(num_features=ref_enc_filters[i]) for i in range(K)]) + # self.wns = nn.ModuleList([weight_norm(num_features=ref_enc_filters[i]) for i in range(K)]) # noqa: E501 out_channels = self.calculate_channels(spec_channels, 3, 2, 1, K) - self.gru = nn.GRU(input_size=ref_enc_filters[-1] * out_channels, - hidden_size=256 // 2, - batch_first=True) + self.gru = nn.GRU( + input_size=ref_enc_filters[-1] * out_channels, + hidden_size=256 // 2, + batch_first=True, + ) self.proj = nn.Linear(128, gin_channels) def forward(self, inputs, mask=None): @@ -559,34 +740,36 @@ def calculate_channels(self, L, kernel_size, stride, pad, n_convs): class SynthesizerTrn(nn.Module): """ - Synthesizer for Training - """ - - def __init__(self, - n_vocab, - spec_channels, - segment_size, - inter_channels, - hidden_channels, - filter_channels, - n_heads, - n_layers, - kernel_size, - p_dropout, - resblock, - resblock_kernel_sizes, - resblock_dilation_sizes, - upsample_rates, - upsample_initial_channel, - upsample_kernel_sizes, - n_speakers=256, - gin_channels=256, - use_sdp=True, - n_flow_layer = 4, - n_layers_trans_flow = 6, - flow_share_parameter = False, - use_transformer_flow = True, - **kwargs): + Synthesizer for Training + """ + + def __init__( + self, + n_vocab, + spec_channels, + segment_size, + inter_channels, + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size, + p_dropout, + resblock, + resblock_kernel_sizes, + resblock_dilation_sizes, + upsample_rates, + upsample_initial_channel, + upsample_kernel_sizes, + n_speakers=256, + gin_channels=256, + use_sdp=True, + n_flow_layer=4, + n_layers_trans_flow=6, + flow_share_parameter=False, + use_transformer_flow=True, + **kwargs + ): super().__init__() self.n_vocab = n_vocab @@ -608,7 +791,9 @@ def __init__(self, self.n_speakers = n_speakers self.gin_channels = gin_channels self.n_layers_trans_flow = n_layers_trans_flow - self.use_spk_conditioned_encoder = kwargs.get("use_spk_conditioned_encoder", True) + self.use_spk_conditioned_encoder = kwargs.get( + "use_spk_conditioned_encoder", True + ) self.use_sdp = use_sdp self.use_noise_scaled_mas = kwargs.get("use_noise_scaled_mas", False) self.mas_noise_scale_initial = kwargs.get("mas_noise_scale_initial", 0.01) @@ -616,26 +801,65 @@ def __init__(self, self.current_mas_noise_scale = self.mas_noise_scale_initial if self.use_spk_conditioned_encoder and gin_channels > 0: self.enc_gin_channels = gin_channels - self.enc_p = TextEncoder(n_vocab, - inter_channels, - hidden_channels, - filter_channels, - n_heads, - n_layers, - kernel_size, - p_dropout, - gin_channels=self.enc_gin_channels) - self.dec = Generator(inter_channels, resblock, resblock_kernel_sizes, resblock_dilation_sizes, upsample_rates, - upsample_initial_channel, upsample_kernel_sizes, gin_channels=gin_channels) - self.enc_q = PosteriorEncoder(spec_channels, inter_channels, hidden_channels, 5, 1, 16, - gin_channels=gin_channels) + self.enc_p = TextEncoder( + n_vocab, + inter_channels, + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size, + p_dropout, + gin_channels=self.enc_gin_channels, + ) + self.dec = Generator( + inter_channels, + resblock, + resblock_kernel_sizes, + resblock_dilation_sizes, + upsample_rates, + upsample_initial_channel, + upsample_kernel_sizes, + gin_channels=gin_channels, + ) + self.enc_q = PosteriorEncoder( + spec_channels, + inter_channels, + hidden_channels, + 5, + 1, + 16, + gin_channels=gin_channels, + ) if use_transformer_flow: - self.flow = TransformerCouplingBlock(inter_channels, hidden_channels, filter_channels, n_heads, n_layers_trans_flow, 5, p_dropout, n_flow_layer, gin_channels=gin_channels,share_parameter= flow_share_parameter) + self.flow = TransformerCouplingBlock( + inter_channels, + hidden_channels, + filter_channels, + n_heads, + n_layers_trans_flow, + 5, + p_dropout, + n_flow_layer, + gin_channels=gin_channels, + share_parameter=flow_share_parameter, + ) else: - self.flow = ResidualCouplingBlock(inter_channels, hidden_channels, 5, 1, n_flow_layer, gin_channels=gin_channels) - self.sdp = StochasticDurationPredictor(hidden_channels, 192, 3, 0.5, 4, gin_channels=gin_channels) - self.dp = DurationPredictor(hidden_channels, 256, 3, 0.5, gin_channels=gin_channels) - + self.flow = ResidualCouplingBlock( + inter_channels, + hidden_channels, + 5, + 1, + n_flow_layer, + gin_channels=gin_channels, + ) + self.sdp = StochasticDurationPredictor( + hidden_channels, 192, 3, 0.5, 4, gin_channels=gin_channels + ) + self.dp = DurationPredictor( + hidden_channels, 256, 3, 0.5, gin_channels=gin_channels + ) + if n_speakers > 1: self.emb_g = nn.Embedding(n_speakers, gin_channels) else: @@ -645,35 +869,54 @@ def forward(self, x, x_lengths, y, y_lengths, sid, tone, language, bert, ja_bert if self.n_speakers > 0: g = self.emb_g(sid).unsqueeze(-1) # [b, h, 1] else: - g = self.ref_enc(y.transpose(1,2)).unsqueeze(-1) - x, m_p, logs_p, x_mask = self.enc_p(x, x_lengths, tone, language, bert, ja_bert, g=g) + g = self.ref_enc(y.transpose(1, 2)).unsqueeze(-1) + x, m_p, logs_p, x_mask = self.enc_p( + x, x_lengths, tone, language, bert, ja_bert, g=g + ) z, m_q, logs_q, y_mask = self.enc_q(y, y_lengths, g=g) z_p = self.flow(z, y_mask, g=g) with torch.no_grad(): # negative cross-entropy s_p_sq_r = torch.exp(-2 * logs_p) # [b, d, t] - neg_cent1 = torch.sum(-0.5 * math.log(2 * math.pi) - logs_p, [1], keepdim=True) # [b, 1, t_s] - neg_cent2 = torch.matmul(-0.5 * (z_p ** 2).transpose(1, 2), - s_p_sq_r) # [b, t_t, d] x [b, d, t_s] = [b, t_t, t_s] - neg_cent3 = torch.matmul(z_p.transpose(1, 2), (m_p * s_p_sq_r)) # [b, t_t, d] x [b, d, t_s] = [b, t_t, t_s] - neg_cent4 = torch.sum(-0.5 * (m_p ** 2) * s_p_sq_r, [1], keepdim=True) # [b, 1, t_s] + neg_cent1 = torch.sum( + -0.5 * math.log(2 * math.pi) - logs_p, [1], keepdim=True + ) # [b, 1, t_s] + neg_cent2 = torch.matmul( + -0.5 * (z_p**2).transpose(1, 2), s_p_sq_r + ) # [b, t_t, d] x [b, d, t_s] = [b, t_t, t_s] + neg_cent3 = torch.matmul( + z_p.transpose(1, 2), (m_p * s_p_sq_r) + ) # [b, t_t, d] x [b, d, t_s] = [b, t_t, t_s] + neg_cent4 = torch.sum( + -0.5 * (m_p**2) * s_p_sq_r, [1], keepdim=True + ) # [b, 1, t_s] neg_cent = neg_cent1 + neg_cent2 + neg_cent3 + neg_cent4 if self.use_noise_scaled_mas: - epsilon = torch.std(neg_cent) * torch.randn_like(neg_cent) * self.current_mas_noise_scale - neg_cent = neg_cent + epsilon + epsilon = ( + torch.std(neg_cent) + * torch.randn_like(neg_cent) + * self.current_mas_noise_scale + ) + neg_cent = neg_cent + epsilon attn_mask = torch.unsqueeze(x_mask, 2) * torch.unsqueeze(y_mask, -1) - attn = monotonic_align.maximum_path(neg_cent, attn_mask.squeeze(1)).unsqueeze(1).detach() + attn = ( + monotonic_align.maximum_path(neg_cent, attn_mask.squeeze(1)) + .unsqueeze(1) + .detach() + ) w = attn.sum(2) l_length_sdp = self.sdp(x, x_mask, w, g=g) l_length_sdp = l_length_sdp / torch.sum(x_mask) - + logw_ = torch.log(w + 1e-6) * x_mask logw = self.dp(x, x_mask, g=g) - l_length_dp = torch.sum((logw - logw_) ** 2, [1, 2]) / torch.sum(x_mask) # for averaging + l_length_dp = torch.sum((logw - logw_) ** 2, [1, 2]) / torch.sum( + x_mask + ) # for averaging l_length = l_length_dp + l_length_sdp @@ -681,29 +924,64 @@ def forward(self, x, x_lengths, y, y_lengths, sid, tone, language, bert, ja_bert m_p = torch.matmul(attn.squeeze(1), m_p.transpose(1, 2)).transpose(1, 2) logs_p = torch.matmul(attn.squeeze(1), logs_p.transpose(1, 2)).transpose(1, 2) - z_slice, ids_slice = commons.rand_slice_segments(z, y_lengths, self.segment_size) + z_slice, ids_slice = commons.rand_slice_segments( + z, y_lengths, self.segment_size + ) o = self.dec(z_slice, g=g) - return o, l_length, attn, ids_slice, x_mask, y_mask, (z, z_p, m_p, logs_p, m_q, logs_q), (x, logw, logw_) - - def infer(self, x, x_lengths, sid, tone, language, bert, ja_bert, noise_scale=.667, length_scale=1, noise_scale_w=0.8, max_len=None, sdp_ratio=0,y=None): - #x, m_p, logs_p, x_mask = self.enc_p(x, x_lengths, tone, language, bert) + return ( + o, + l_length, + attn, + ids_slice, + x_mask, + y_mask, + (z, z_p, m_p, logs_p, m_q, logs_q), + (x, logw, logw_), + ) + + def infer( + self, + x, + x_lengths, + sid, + tone, + language, + bert, + ja_bert, + noise_scale=0.667, + length_scale=1, + noise_scale_w=0.8, + max_len=None, + sdp_ratio=0, + y=None, + ): + # x, m_p, logs_p, x_mask = self.enc_p(x, x_lengths, tone, language, bert) # g = self.gst(y) if self.n_speakers > 0: g = self.emb_g(sid).unsqueeze(-1) # [b, h, 1] else: - g = self.ref_enc(y.transpose(1,2)).unsqueeze(-1) - x, m_p, logs_p, x_mask = self.enc_p(x, x_lengths, tone, language, bert, ja_bert, g=g) - logw = self.sdp(x, x_mask, g=g, reverse=True, noise_scale=noise_scale_w) * (sdp_ratio) + self.dp(x, x_mask, g=g) * (1 - sdp_ratio) + g = self.ref_enc(y.transpose(1, 2)).unsqueeze(-1) + x, m_p, logs_p, x_mask = self.enc_p( + x, x_lengths, tone, language, bert, ja_bert, g=g + ) + logw = self.sdp(x, x_mask, g=g, reverse=True, noise_scale=noise_scale_w) * ( + sdp_ratio + ) + self.dp(x, x_mask, g=g) * (1 - sdp_ratio) w = torch.exp(logw) * x_mask * length_scale w_ceil = torch.ceil(w) y_lengths = torch.clamp_min(torch.sum(w_ceil, [1, 2]), 1).long() - y_mask = torch.unsqueeze(commons.sequence_mask(y_lengths, None), 1).to(x_mask.dtype) + y_mask = torch.unsqueeze(commons.sequence_mask(y_lengths, None), 1).to( + x_mask.dtype + ) attn_mask = torch.unsqueeze(x_mask, 2) * torch.unsqueeze(y_mask, -1) attn = commons.generate_path(w_ceil, attn_mask) - m_p = torch.matmul(attn.squeeze(1), m_p.transpose(1, 2)).transpose(1, 2) # [b, t', t], [b, t, d] -> [b, d, t'] - logs_p = torch.matmul(attn.squeeze(1), logs_p.transpose(1, 2)).transpose(1, - 2) # [b, t', t], [b, t, d] -> [b, d, t'] + m_p = torch.matmul(attn.squeeze(1), m_p.transpose(1, 2)).transpose( + 1, 2 + ) # [b, t', t], [b, t, d] -> [b, d, t'] + logs_p = torch.matmul(attn.squeeze(1), logs_p.transpose(1, 2)).transpose( + 1, 2 + ) # [b, t', t], [b, t, d] -> [b, d, t'] z_p = m_p + torch.randn_like(m_p) * torch.exp(logs_p) * noise_scale z = self.flow(z_p, y_mask, g=g, reverse=True) From 042fb96fd968119a54341926e7a04a885d2d8824 Mon Sep 17 00:00:00 2001 From: Lengyue Date: Tue, 5 Sep 2023 01:59:36 -0400 Subject: [PATCH 029/102] Lint bert gen & remove unused vars --- bert_gen.py | 25 ++++++++++++------------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/bert_gen.py b/bert_gen.py index 448147153..2259454cb 100644 --- a/bert_gen.py +++ b/bert_gen.py @@ -1,23 +1,21 @@ import torch -from torch.utils.data import DataLoader from multiprocessing import Pool import commons import utils -from data_utils import TextAudioSpeakerLoader, TextAudioSpeakerCollate from tqdm import tqdm -import warnings from text import cleaned_text_to_sequence, get_bert -config_path = 'configs/config.json' +config_path = "configs/config.json" hps = utils.get_hparams_from_file(config_path) +total_gpus = torch.cuda.device_count() + def process_line(line): - _id, spk, language_str, text, phones, tone, word2ph = line.strip().split("|") + wav_path, _, language_str, text, phones, tone, word2ph = line.strip().split("|") phone = phones.split(" ") tone = [int(i) for i in tone.split(" ")] word2ph = [int(i) for i in word2ph.split(" ")] - w2pho = [i for i in word2ph] word2ph = [i for i in word2ph] phone, tone, language = cleaned_text_to_sequence(phone, tone, language_str) @@ -28,26 +26,27 @@ def process_line(line): for i in range(len(word2ph)): word2ph[i] = word2ph[i] * 2 word2ph[0] += 1 - wav_path = f'{_id}' bert_path = wav_path.replace(".wav", ".bert.pt") + try: bert = torch.load(bert_path) assert bert.shape[-1] == len(phone) - except: + except Exception: bert = get_bert(text, word2ph, language_str) assert bert.shape[-1] == len(phone) torch.save(bert, bert_path) -if __name__ == '__main__': +if __name__ == "__main__": lines = [] - with open(hps.data.training_files, encoding='utf-8' ) as f: + with open(hps.data.training_files, encoding="utf-8") as f: lines.extend(f.readlines()) - with open(hps.data.validation_files, encoding='utf-8' ) as f: + with open(hps.data.validation_files, encoding="utf-8") as f: lines.extend(f.readlines()) - with Pool(processes=12) as pool: #A100 40GB suitable config,if coom,please decrease the processess number. - for _ in tqdm(pool.imap_unordered(process_line, lines)): + # A100 40GB suitable config, if coom, please decrease the processes number. + with Pool(processes=6) as pool: + for _ in tqdm(pool.imap_unordered(process_line, lines), total=len(lines)): pass From e86c8a8991f178ca6671e7e40bc8531f9a17374d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Tue, 5 Sep 2023 17:26:39 +0800 Subject: [PATCH 030/102] use torchrun --- train_ms.py | 26 +++++++------------------- 1 file changed, 7 insertions(+), 19 deletions(-) diff --git a/train_ms.py b/train_ms.py index 66f235d88..2e673b1bd 100644 --- a/train_ms.py +++ b/train_ms.py @@ -46,20 +46,13 @@ torch.backends.cuda.enable_math_sdp(True) global_step = 0 - -def main(): - """Assume Single Node Multi GPUs Training Only""" - assert torch.cuda.is_available(), "CPU training is not allowed." - - n_gpus = torch.cuda.device_count() - os.environ['MASTER_ADDR'] = 'localhost' - os.environ['MASTER_PORT'] = '65280' - +def run(): + dist.init_process_group(backend="nccl", init_method="env://") # Use torchrun instead of mp.spawn + rank = dist.get_rank() + n_gpus = dist.get_world_size() hps = utils.get_hparams() - mp.spawn(run, nprocs=n_gpus, args=(n_gpus, hps,)) - - -def run(rank, n_gpus, hps): + torch.manual_seed(hps.train.seed) + torch.cuda.set_device(rank) global global_step if rank == 0: logger = utils.get_logger(hps.model_dir) @@ -67,11 +60,6 @@ def run(rank, n_gpus, hps): utils.check_git_hash(hps.model_dir) writer = SummaryWriter(log_dir=hps.model_dir) writer_eval = SummaryWriter(log_dir=os.path.join(hps.model_dir, "eval")) - - dist.init_process_group(backend='nccl', init_method='env://', world_size=n_gpus, rank=rank) - torch.manual_seed(hps.train.seed) - torch.cuda.set_device(rank) - train_dataset = TextAudioSpeakerLoader(hps.data.training_files, hps.data) train_sampler = DistributedBucketSampler( train_dataset, @@ -391,4 +379,4 @@ def evaluate(hps, generator, eval_loader, writer_eval): generator.train() if __name__ == "__main__": - main() + run() From f945aa6091dc59241972390494cecff6bdae22b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Tue, 5 Sep 2023 19:31:35 +0800 Subject: [PATCH 031/102] Update bert_gen.py --- bert_gen.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bert_gen.py b/bert_gen.py index 2259454cb..f71ba7793 100644 --- a/bert_gen.py +++ b/bert_gen.py @@ -46,7 +46,7 @@ def process_line(line): with open(hps.data.validation_files, encoding="utf-8") as f: lines.extend(f.readlines()) - # A100 40GB suitable config, if coom, please decrease the processes number. + # RTX4090 24GB suitable config, if coom, please decrease the processes number. with Pool(processes=6) as pool: for _ in tqdm(pool.imap_unordered(process_line, lines), total=len(lines)): pass From d02113267b69222896c0978338387e13dd6204a5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Tue, 5 Sep 2023 19:34:28 +0800 Subject: [PATCH 032/102] =?UTF-8?q?=E5=A4=9A=E5=8D=A1=E9=A2=84=E5=A4=84?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- bert_gen.py | 10 ++++++++-- 1 file changed, 8 insertions(+), 2 deletions(-) diff --git a/bert_gen.py b/bert_gen.py index f71ba7793..861680084 100644 --- a/bert_gen.py +++ b/bert_gen.py @@ -3,7 +3,7 @@ import commons import utils from tqdm import tqdm - +from loguru import logger from text import cleaned_text_to_sequence, get_bert config_path = "configs/config.json" @@ -12,6 +12,12 @@ def process_line(line): + rank = mp.current_process()._identity + rank = rank[0] if len(rank) > 0 else 0 + if torch.cuda.is_available(): + gpu_id = rank % torch.cuda.device_count() + device = torch.device(f"cuda:{gpu_id}") + logger.info(f"Rank {rank} uses device {device}") wav_path, _, language_str, text, phones, tone, word2ph = line.strip().split("|") phone = phones.split(" ") tone = [int(i) for i in tone.split(" ")] @@ -33,7 +39,7 @@ def process_line(line): bert = torch.load(bert_path) assert bert.shape[-1] == len(phone) except Exception: - bert = get_bert(text, word2ph, language_str) + bert = get_bert(text, word2ph, language_str,device) assert bert.shape[-1] == len(phone) torch.save(bert, bert_path) From eb14f4a0b77a8effb10af1cf59854ad3ecd4cb34 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Tue, 5 Sep 2023 19:35:21 +0800 Subject: [PATCH 033/102] =?UTF-8?q?=E5=A4=9A=E5=8D=A1=E9=A2=84=E5=A4=84?= =?UTF-8?q?=E7=90=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- text/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/text/__init__.py b/text/__init__.py index 00cf6349e..be026fdcd 100644 --- a/text/__init__.py +++ b/text/__init__.py @@ -17,7 +17,7 @@ def cleaned_text_to_sequence(cleaned_text, tones, language): lang_ids = [lang_id for i in phones] return phones, tones, lang_ids -def get_bert(norm_text, word2ph, language): +def get_bert(norm_text, word2ph, language, device): from .chinese_bert import get_bert_feature as zh_bert from .english_bert_mock import get_bert_feature as en_bert from .japanese_bert import get_bert_feature as ja_bert @@ -26,5 +26,5 @@ def get_bert(norm_text, word2ph, language): 'EN': en_bert, 'JA': ja_bert } - bert = lang_bert_func_map[language](norm_text, word2ph) + bert = lang_bert_func_map[language](norm_text, word2ph, device) return bert From dcd5ed3c43400bce77b8c13e086ab763b6581b56 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Tue, 5 Sep 2023 19:38:23 +0800 Subject: [PATCH 034/102] =?UTF-8?q?=E6=96=B0=E5=A2=9Edevice=E4=BC=A0?= =?UTF-8?q?=E5=8F=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- text/chinese_bert.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/text/chinese_bert.py b/text/chinese_bert.py index 45e5e2807..38ef7d876 100644 --- a/text/chinese_bert.py +++ b/text/chinese_bert.py @@ -13,9 +13,11 @@ ) tokenizer = AutoTokenizer.from_pretrained("./bert/chinese-roberta-wwm-ext-large") -model = AutoModelForMaskedLM.from_pretrained("./bert/chinese-roberta-wwm-ext-large").to(device) -def get_bert_feature(text, word2ph): +def get_bert_feature(text, word2ph, device): + if sys.platform == "darwin" and torch.backends.mps.is_available() and device == "cpu" + device == "mps" + model = AutoModelForMaskedLM.from_pretrained("./bert/chinese-roberta-wwm-ext-large").to(device) with torch.no_grad(): inputs = tokenizer(text, return_tensors='pt') for i in inputs: From 3719c5e303724d54bd0ef8af14e7d55420c1ddff Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Tue, 5 Sep 2023 19:38:45 +0800 Subject: [PATCH 035/102] Update chinese_bert.py --- text/chinese_bert.py | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/text/chinese_bert.py b/text/chinese_bert.py index 38ef7d876..178e36d6b 100644 --- a/text/chinese_bert.py +++ b/text/chinese_bert.py @@ -2,16 +2,6 @@ import sys from transformers import AutoTokenizer, AutoModelForMaskedLM -device = torch.device( - "cuda" - if torch.cuda.is_available() - else ( - "mps" - if sys.platform == "darwin" and torch.backends.mps.is_available() - else "cpu" - ) - ) - tokenizer = AutoTokenizer.from_pretrained("./bert/chinese-roberta-wwm-ext-large") def get_bert_feature(text, word2ph, device): From 1f080322dcc484dcc86fcb052771b88b0f2d30d7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Tue, 5 Sep 2023 19:40:15 +0800 Subject: [PATCH 036/102] =?UTF-8?q?=E6=B7=BB=E5=8A=A0device=E4=BC=A0?= =?UTF-8?q?=E5=8F=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- text/japanese_bert.py | 13 +++---------- 1 file changed, 3 insertions(+), 10 deletions(-) diff --git a/text/japanese_bert.py b/text/japanese_bert.py index bb8369612..3bb86887f 100644 --- a/text/japanese_bert.py +++ b/text/japanese_bert.py @@ -1,20 +1,13 @@ import torch from transformers import AutoTokenizer, AutoModelForMaskedLM -device = torch.device( - "cuda" - if torch.cuda.is_available() - else ( - "mps" - if sys.platform == "darwin" and torch.backends.mps.is_available() - else "cpu" - ) - ) tokenizer = AutoTokenizer.from_pretrained("./bert/bert-base-japanese-v3") -model = AutoModelForMaskedLM.from_pretrained("./bert/bert-base-japanese-v3").to(device) def get_bert_feature(text, word2ph): + if sys.platform == "darwin" and torch.backends.mps.is_available() and device == "cpu" + device == "mps" + model = AutoModelForMaskedLM.from_pretrained("./bert/bert-base-japanese-v3").to(device) with torch.no_grad(): inputs = tokenizer(text, return_tensors='pt') for i in inputs: From 13c9a12573e2c88fb9306dea68d4faa063e0ded2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Tue, 5 Sep 2023 19:41:41 +0800 Subject: [PATCH 037/102] fix --- text/chinese_bert.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/text/chinese_bert.py b/text/chinese_bert.py index 178e36d6b..10864eddc 100644 --- a/text/chinese_bert.py +++ b/text/chinese_bert.py @@ -4,9 +4,11 @@ tokenizer = AutoTokenizer.from_pretrained("./bert/chinese-roberta-wwm-ext-large") -def get_bert_feature(text, word2ph, device): - if sys.platform == "darwin" and torch.backends.mps.is_available() and device == "cpu" - device == "mps" +def get_bert_feature(text, word2ph, device=None): + if sys.platform == "darwin" and torch.backends.mps.is_available() and device == "cpu": + device = "mps" + if not device: + device = "cuda" model = AutoModelForMaskedLM.from_pretrained("./bert/chinese-roberta-wwm-ext-large").to(device) with torch.no_grad(): inputs = tokenizer(text, return_tensors='pt') From 9d2ed393652f984a324867dc60546094c80847cb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Tue, 5 Sep 2023 19:41:52 +0800 Subject: [PATCH 038/102] fix jp --- text/japanese_bert.py | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/text/japanese_bert.py b/text/japanese_bert.py index 3bb86887f..4f349df4a 100644 --- a/text/japanese_bert.py +++ b/text/japanese_bert.py @@ -5,8 +5,10 @@ tokenizer = AutoTokenizer.from_pretrained("./bert/bert-base-japanese-v3") def get_bert_feature(text, word2ph): - if sys.platform == "darwin" and torch.backends.mps.is_available() and device == "cpu" - device == "mps" + if sys.platform == "darwin" and torch.backends.mps.is_available() and device == "cpu": + device = "mps" + if not device: + device = "cuda" model = AutoModelForMaskedLM.from_pretrained("./bert/bert-base-japanese-v3").to(device) with torch.no_grad(): inputs = tokenizer(text, return_tensors='pt') From 70b6e3bb9ad9da48ec6b7ec53b8964ba907d6f74 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Tue, 5 Sep 2023 19:46:39 +0800 Subject: [PATCH 039/102] Update bert_gen.py --- bert_gen.py | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) diff --git a/bert_gen.py b/bert_gen.py index 861680084..b31a8bfbb 100644 --- a/bert_gen.py +++ b/bert_gen.py @@ -5,10 +5,7 @@ from tqdm import tqdm from loguru import logger from text import cleaned_text_to_sequence, get_bert - -config_path = "configs/config.json" -hps = utils.get_hparams_from_file(config_path) -total_gpus = torch.cuda.device_count() +import argparse def process_line(line): @@ -45,6 +42,9 @@ def process_line(line): if __name__ == "__main__": + parser.add_argument('-c', '--config', type=str, default=None) + config_path = args.config + hps = utils.get_hparams_from_file(config_path) lines = [] with open(hps.data.training_files, encoding="utf-8") as f: lines.extend(f.readlines()) @@ -52,7 +52,11 @@ def process_line(line): with open(hps.data.validation_files, encoding="utf-8") as f: lines.extend(f.readlines()) - # RTX4090 24GB suitable config, if coom, please decrease the processes number. - with Pool(processes=6) as pool: + parser.add_argument( + '--num_processes', type=int, default=1, help='You are advised to set the number of processes to the same as the number of CPU cores' + ) + + num_processes = args.num_processes + with Pool(processes=num_processes) as pool: for _ in tqdm(pool.imap_unordered(process_line, lines), total=len(lines)): pass From 89b6c5d589a90c3a2452b2246f8d6f7e6b35088c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Tue, 5 Sep 2023 19:48:34 +0800 Subject: [PATCH 040/102] Update requirements.txt --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index 5d325934b..df898644a 100644 --- a/requirements.txt +++ b/requirements.txt @@ -16,3 +16,4 @@ cn2an gradio av mecab-python3 +loguru From ff0c76dccbcb5cdbb9dd222bfaa16c0c57e5f8e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Tue, 5 Sep 2023 19:50:24 +0800 Subject: [PATCH 041/102] add logger --- data_utils.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/data_utils.py b/data_utils.py index 0dfe1916e..f2e6ee85b 100644 --- a/data_utils.py +++ b/data_utils.py @@ -5,7 +5,7 @@ import torch import torch.utils.data from tqdm import tqdm - +from loguru import logger import commons from mel_processing import spectrogram_torch, mel_spectrogram_torch, spec_to_mel_torch from utils import load_wav_to_torch, load_filepaths_and_text @@ -57,6 +57,7 @@ def _filter(self): audiopaths_sid_text_new = [] lengths = [] skipped = 0 + logger.info("Init dataset...") for _id, spk, language, text, phones, tone, word2ph in tqdm(self.audiopaths_sid_text): audiopath = f'{_id}' if self.min_text_len <= len(phones) and len(phones) <= self.max_text_len: @@ -67,7 +68,7 @@ def _filter(self): lengths.append(os.path.getsize(audiopath) // (2 * self.hop_length)) else: skipped += 1 - print("skipped: ", skipped, ", total: ", len(self.audiopaths_sid_text)) + logger.info("skipped: " + skipped + ", total: " + len(self.audiopaths_sid_text)) self.audiopaths_sid_text = audiopaths_sid_text_new self.lengths = lengths From 555b1f4bb5621ad5da807e1979eca2bcc4057edb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Tue, 5 Sep 2023 19:52:00 +0800 Subject: [PATCH 042/102] clean code --- utils.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/utils.py b/utils.py index 36caec23b..a5dae7bff 100644 --- a/utils.py +++ b/utils.py @@ -36,8 +36,7 @@ def load_checkpoint(checkpoint_path, model, optimizer=None, skip_optimizer=False new_state_dict = {} for k, v in state_dict.items(): try: - #assert "emb_g" not in k - # print("load", k) + # assert "emb_g" not in k new_state_dict[k] = saved_state_dict[k] assert saved_state_dict[k].shape == v.shape, (saved_state_dict[k].shape, v.shape) except: @@ -80,7 +79,6 @@ def latest_checkpoint_path(dir_path, regex="G_*.pth"): f_list = glob.glob(os.path.join(dir_path, regex)) f_list.sort(key=lambda f: int("".join(filter(str.isdigit, f)))) x = f_list[-1] - print(x) return x From eb1a08f7d4cfda9403ec6d1a036418cb2f8b524c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Tue, 5 Sep 2023 20:15:42 +0800 Subject: [PATCH 043/102] Update bert_gen.py --- bert_gen.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bert_gen.py b/bert_gen.py index b31a8bfbb..3f10a752f 100644 --- a/bert_gen.py +++ b/bert_gen.py @@ -42,7 +42,7 @@ def process_line(line): if __name__ == "__main__": - parser.add_argument('-c', '--config', type=str, default=None) + parser.add_argument('-c', '--config', type=str, default="configs/config.json") config_path = args.config hps = utils.get_hparams_from_file(config_path) lines = [] From a716d8ef820d602f011e53a3dc13d072938c940f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Tue, 5 Sep 2023 20:17:03 +0800 Subject: [PATCH 044/102] Update bert_gen.py --- bert_gen.py | 1 + 1 file changed, 1 insertion(+) diff --git a/bert_gen.py b/bert_gen.py index 3f10a752f..9df365898 100644 --- a/bert_gen.py +++ b/bert_gen.py @@ -42,6 +42,7 @@ def process_line(line): if __name__ == "__main__": + parser = argparse.ArgumentParser() parser.add_argument('-c', '--config', type=str, default="configs/config.json") config_path = args.config hps = utils.get_hparams_from_file(config_path) From 908c0bca2cf50e128cf8db1cf4424c7fd52d9c87 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Tue, 5 Sep 2023 20:17:48 +0800 Subject: [PATCH 045/102] Update bert_gen.py --- bert_gen.py | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/bert_gen.py b/bert_gen.py index 9df365898..42dd5ada7 100644 --- a/bert_gen.py +++ b/bert_gen.py @@ -44,6 +44,10 @@ def process_line(line): if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument('-c', '--config', type=str, default="configs/config.json") + parser.add_argument( + '--num_processes', type=int, default=1, help='You are advised to set the number of processes to the same as the number of CPU cores' + ) + args = parser.parse_args() config_path = args.config hps = utils.get_hparams_from_file(config_path) lines = [] @@ -53,9 +57,6 @@ def process_line(line): with open(hps.data.validation_files, encoding="utf-8") as f: lines.extend(f.readlines()) - parser.add_argument( - '--num_processes', type=int, default=1, help='You are advised to set the number of processes to the same as the number of CPU cores' - ) num_processes = args.num_processes with Pool(processes=num_processes) as pool: From cb80c6550fcf5bbbf8d53e2ee9d9e1bea056dde4 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Tue, 5 Sep 2023 20:18:15 +0800 Subject: [PATCH 046/102] Update bert_gen.py --- bert_gen.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bert_gen.py b/bert_gen.py index 42dd5ada7..c3a32345a 100644 --- a/bert_gen.py +++ b/bert_gen.py @@ -6,7 +6,7 @@ from loguru import logger from text import cleaned_text_to_sequence, get_bert import argparse - +import torch.multiprocessing as mp def process_line(line): rank = mp.current_process()._identity From eee6e422907c23e0d63f49f9e1eaf2e2a615fca8 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Tue, 5 Sep 2023 20:24:23 +0800 Subject: [PATCH 047/102] Update japanese_bert.py --- text/japanese_bert.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/text/japanese_bert.py b/text/japanese_bert.py index 4f349df4a..d5bfa265a 100644 --- a/text/japanese_bert.py +++ b/text/japanese_bert.py @@ -4,7 +4,7 @@ tokenizer = AutoTokenizer.from_pretrained("./bert/bert-base-japanese-v3") -def get_bert_feature(text, word2ph): +def get_bert_feature(text, word2ph, device=None): if sys.platform == "darwin" and torch.backends.mps.is_available() and device == "cpu": device = "mps" if not device: From 97ec85a5100772d16214db821cadfccf8da31aa6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Tue, 5 Sep 2023 20:24:51 +0800 Subject: [PATCH 048/102] Update japanese_bert.py --- text/japanese_bert.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/text/japanese_bert.py b/text/japanese_bert.py index d5bfa265a..edc3ef353 100644 --- a/text/japanese_bert.py +++ b/text/japanese_bert.py @@ -1,6 +1,6 @@ import torch from transformers import AutoTokenizer, AutoModelForMaskedLM - +import sys tokenizer = AutoTokenizer.from_pretrained("./bert/bert-base-japanese-v3") From c7b796df778c49504454ba07fe6fa6fd060a8352 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Tue, 5 Sep 2023 20:27:00 +0800 Subject: [PATCH 049/102] Update bert_gen.py --- bert_gen.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bert_gen.py b/bert_gen.py index c3a32345a..265d09158 100644 --- a/bert_gen.py +++ b/bert_gen.py @@ -14,7 +14,7 @@ def process_line(line): if torch.cuda.is_available(): gpu_id = rank % torch.cuda.device_count() device = torch.device(f"cuda:{gpu_id}") - logger.info(f"Rank {rank} uses device {device}") + #logger.info(f"Rank {rank} uses device {device}") wav_path, _, language_str, text, phones, tone, word2ph = line.strip().split("|") phone = phones.split(" ") tone = [int(i) for i in tone.split(" ")] From 08fb63a017d28f327912429fb251709185fb6fae Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Tue, 5 Sep 2023 20:31:47 +0800 Subject: [PATCH 050/102] Update bert_gen.py --- bert_gen.py | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/bert_gen.py b/bert_gen.py index 265d09158..80a269589 100644 --- a/bert_gen.py +++ b/bert_gen.py @@ -14,7 +14,6 @@ def process_line(line): if torch.cuda.is_available(): gpu_id = rank % torch.cuda.device_count() device = torch.device(f"cuda:{gpu_id}") - #logger.info(f"Rank {rank} uses device {device}") wav_path, _, language_str, text, phones, tone, word2ph = line.strip().split("|") phone = phones.split(" ") tone = [int(i) for i in tone.split(" ")] @@ -36,9 +35,12 @@ def process_line(line): bert = torch.load(bert_path) assert bert.shape[-1] == len(phone) except Exception: - bert = get_bert(text, word2ph, language_str,device) - assert bert.shape[-1] == len(phone) - torch.save(bert, bert_path) + try: + bert = get_bert(text, word2ph, language_str,device) + assert bert.shape[-1] == len(phone) + torch.save(bert, bert_path) + except Exception: + print(text) if __name__ == "__main__": From b39eb46a166a090755b75b1a6b3df16a59d8f8e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Tue, 5 Sep 2023 20:35:05 +0800 Subject: [PATCH 051/102] clean code --- text/japanese.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/text/japanese.py b/text/japanese.py index 084904c15..577c49ea7 100644 --- a/text/japanese.py +++ b/text/japanese.py @@ -558,11 +558,8 @@ def g2p(norm_text): return phones, tones, word2ph if __name__ == '__main__': - path = "../../../Downloads/transcript_utf8.txt" tokenizer = AutoTokenizer.from_pretrained("./pretrain/bert-base-japanese-v3") text = "hello,こんにちは、世界!……" - # text = 'こんにちは、末期試験に備えて、本当に気合いを入れて勉強しなきゃ。' - # text = '溺れかかっていた乗客は、すべて救助された。' from text.japanese_bert import get_bert_feature text = text_normalize(text) From 7ba432978b762c4cb93ab082051422520b4e8a5e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Tue, 5 Sep 2023 20:39:10 +0800 Subject: [PATCH 052/102] Update chinese_bert.py --- text/chinese_bert.py | 1 - 1 file changed, 1 deletion(-) diff --git a/text/chinese_bert.py b/text/chinese_bert.py index 10864eddc..978c6f846 100644 --- a/text/chinese_bert.py +++ b/text/chinese_bert.py @@ -30,7 +30,6 @@ def get_bert_feature(text, word2ph, device=None): return phone_level_feature.T if __name__ == '__main__': - # feature = get_bert_feature('你好,我是说的道理。') import torch word_level_feature = torch.rand(38, 1024) # 12个词,每个词1024维特征 From 5adb7a11bcc70d26413ba3e8627ca72d99b01840 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Tue, 5 Sep 2023 20:39:56 +0800 Subject: [PATCH 053/102] add empty cache --- webui.py | 1 + 1 file changed, 1 insertion(+) diff --git a/webui.py b/webui.py index edbf03fa4..130ba9f8a 100644 --- a/webui.py +++ b/webui.py @@ -78,6 +78,7 @@ def infer(text, sdp_ratio, noise_scale, noise_scale_w, length_scale, sid, langua def tts_fn(text, speaker, sdp_ratio, noise_scale, noise_scale_w, length_scale, language): with torch.no_grad(): audio = infer(text, sdp_ratio=sdp_ratio, noise_scale=noise_scale, noise_scale_w=noise_scale_w, length_scale=length_scale, sid=speaker, language=language) + torch.cuda.empty_cache() return "Success", (hps.data.sampling_rate, audio) From edda628161f6e7d660e219f107dbd544511b5374 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Tue, 5 Sep 2023 20:42:25 +0800 Subject: [PATCH 054/102] Update japanese_bert.py --- text/japanese_bert.py | 1 - 1 file changed, 1 deletion(-) diff --git a/text/japanese_bert.py b/text/japanese_bert.py index edc3ef353..82bd740ac 100644 --- a/text/japanese_bert.py +++ b/text/japanese_bert.py @@ -25,5 +25,4 @@ def get_bert_feature(text, word2ph, device=None): phone_level_feature = torch.cat(phone_level_feature, dim=0) - return phone_level_feature.T From a4ea278bc3f6f9e5223b8a3d825a8e1c712533c7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Tue, 5 Sep 2023 21:53:37 +0800 Subject: [PATCH 055/102] Update __init__.py --- text/__init__.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/text/__init__.py b/text/__init__.py index be026fdcd..1392ad201 100644 --- a/text/__init__.py +++ b/text/__init__.py @@ -20,11 +20,11 @@ def cleaned_text_to_sequence(cleaned_text, tones, language): def get_bert(norm_text, word2ph, language, device): from .chinese_bert import get_bert_feature as zh_bert from .english_bert_mock import get_bert_feature as en_bert - from .japanese_bert import get_bert_feature as ja_bert + from .japanese_bert import get_bert_feature as jp_bert lang_bert_func_map = { 'ZH': zh_bert, 'EN': en_bert, - 'JA': ja_bert + 'JP': jp_bert } bert = lang_bert_func_map[language](norm_text, word2ph, device) return bert From e52acffc7f3a977e32e699772355cb213c6b26be Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Tue, 5 Sep 2023 21:59:10 +0800 Subject: [PATCH 056/102] Update esd.list --- filelists/esd.list | 1 + 1 file changed, 1 insertion(+) diff --git a/filelists/esd.list b/filelists/esd.list index 36925ae07..f573fbeef 100644 --- a/filelists/esd.list +++ b/filelists/esd.list @@ -1,2 +1,3 @@ Example: {wav_path}|{speaker_name}|{language}|{text} +派蒙_1.wav|派蒙|ZH|前面的区域,以后再来探索吧! From 6fc26aa92bff6eab7b3bce203bf0e686aee112fc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Tue, 5 Sep 2023 22:02:13 +0800 Subject: [PATCH 057/102] Update cleaner.py --- text/cleaner.py | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/text/cleaner.py b/text/cleaner.py index 64bd5f729..fd217d673 100644 --- a/text/cleaner.py +++ b/text/cleaner.py @@ -1,8 +1,9 @@ -from text import chinese, cleaned_text_to_sequence +from text import chinese, japanese, cleaned_text_to_sequence language_module_map = { - 'ZH': chinese + 'ZH': chinese, + 'JP': japanese } From de0a08df10e4531722b07d393ca159e858554450 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Tue, 5 Sep 2023 22:06:15 +0800 Subject: [PATCH 058/102] Update requirements.txt --- requirements.txt | 1 + 1 file changed, 1 insertion(+) diff --git a/requirements.txt b/requirements.txt index df898644a..17002985b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -17,3 +17,4 @@ gradio av mecab-python3 loguru +unidic-lite From 0cc7cd27595376cd059e32c06f6f563a90bd83ea Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Tue, 5 Sep 2023 22:07:55 +0800 Subject: [PATCH 059/102] Update japanese.py --- text/japanese.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/text/japanese.py b/text/japanese.py index 577c49ea7..96e85d817 100644 --- a/text/japanese.py +++ b/text/japanese.py @@ -558,7 +558,7 @@ def g2p(norm_text): return phones, tones, word2ph if __name__ == '__main__': - tokenizer = AutoTokenizer.from_pretrained("./pretrain/bert-base-japanese-v3") + tokenizer = AutoTokenizer.from_pretrained("./bert/bert-base-japanese-v3") text = "hello,こんにちは、世界!……" from text.japanese_bert import get_bert_feature From 7bdc2de090eb64a07394c9bf0da83b89ab42f45d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Tue, 5 Sep 2023 22:08:44 +0800 Subject: [PATCH 060/102] Update japanese.py --- text/japanese.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/text/japanese.py b/text/japanese.py index 96e85d817..b25f89b4a 100644 --- a/text/japanese.py +++ b/text/japanese.py @@ -529,7 +529,7 @@ def distribute_phone(n_phone, n_word): phones_per_word[min_index] += 1 return phones_per_word -tokenizer = AutoTokenizer.from_pretrained("./pretrain/bert-base-japanese-v3") +tokenizer = AutoTokenizer.from_pretrained("./bert/bert-base-japanese-v3") def g2p(norm_text): tokenized = tokenizer.tokenize(norm_text) phs = [] From ba3091241b577654083b43ba889469731636dc3e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Tue, 5 Sep 2023 22:19:54 +0800 Subject: [PATCH 061/102] Update symbols.py --- text/symbols.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/text/symbols.py b/text/symbols.py index 969cb798c..9d1f8e1dc 100644 --- a/text/symbols.py +++ b/text/symbols.py @@ -34,14 +34,14 @@ # language maps language_id_map = { 'ZH': 0, - "JA": 1, + "JP": 1, "EN": 2 } num_languages = len(language_id_map.keys()) language_tone_start_map = { 'ZH': 0, - "JA": num_zh_tones, + "JP": num_zh_tones, "EN": num_zh_tones + num_ja_tones } From f8ebfe427307d10bf6e179ac84804cf398dbdc02 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Tue, 5 Sep 2023 22:22:06 +0800 Subject: [PATCH 062/102] Update bert_gen.py --- bert_gen.py | 9 +++------ 1 file changed, 3 insertions(+), 6 deletions(-) diff --git a/bert_gen.py b/bert_gen.py index 80a269589..f13ff4d8f 100644 --- a/bert_gen.py +++ b/bert_gen.py @@ -35,12 +35,9 @@ def process_line(line): bert = torch.load(bert_path) assert bert.shape[-1] == len(phone) except Exception: - try: - bert = get_bert(text, word2ph, language_str,device) - assert bert.shape[-1] == len(phone) - torch.save(bert, bert_path) - except Exception: - print(text) + bert = get_bert(text, word2ph, language_str,device) + assert bert.shape[-1] == len(phone) + torch.save(bert, bert_path) if __name__ == "__main__": From 4c25d8aaf7aa4e987a89231818297c934e57ae68 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Tue, 5 Sep 2023 22:34:27 +0800 Subject: [PATCH 063/102] Update bert_gen.py --- bert_gen.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/bert_gen.py b/bert_gen.py index f13ff4d8f..99a7ee3d7 100644 --- a/bert_gen.py +++ b/bert_gen.py @@ -43,9 +43,7 @@ def process_line(line): if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument('-c', '--config', type=str, default="configs/config.json") - parser.add_argument( - '--num_processes', type=int, default=1, help='You are advised to set the number of processes to the same as the number of CPU cores' - ) + parser.add_argument('--num_processes', type=int, default=2') args = parser.parse_args() config_path = args.config hps = utils.get_hparams_from_file(config_path) From db7de50663558d10ac174af5e3b389101b39604e Mon Sep 17 00:00:00 2001 From: Rice Cake Date: Wed, 6 Sep 2023 05:29:16 +0800 Subject: [PATCH 064/102] fix bug --- bert_gen.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bert_gen.py b/bert_gen.py index 99a7ee3d7..d53ba326a 100644 --- a/bert_gen.py +++ b/bert_gen.py @@ -43,7 +43,7 @@ def process_line(line): if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument('-c', '--config', type=str, default="configs/config.json") - parser.add_argument('--num_processes', type=int, default=2') + parser.add_argument('--num_processes', type=int, default=2 ) args = parser.parse_args() config_path = args.config hps = utils.get_hparams_from_file(config_path) From 155a7ec30884fb4a9909325f0f15ae57c1cd8438 Mon Sep 17 00:00:00 2001 From: Rice Cake Date: Wed, 6 Sep 2023 05:29:57 +0800 Subject: [PATCH 065/102] change 'JA' to 'JP' From 41e575eb68153398965f8f44733f7913daf2ade0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Wed, 6 Sep 2023 10:03:49 +0800 Subject: [PATCH 066/102] clean --- bert_gen.py | 1 - 1 file changed, 1 deletion(-) diff --git a/bert_gen.py b/bert_gen.py index d53ba326a..0ee10fc5c 100644 --- a/bert_gen.py +++ b/bert_gen.py @@ -3,7 +3,6 @@ import commons import utils from tqdm import tqdm -from loguru import logger from text import cleaned_text_to_sequence, get_bert import argparse import torch.multiprocessing as mp From 5a4e71b6cedca58a041d9125add43c7eced0c3af Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Wed, 6 Sep 2023 10:04:14 +0800 Subject: [PATCH 067/102] Update data_utils.py --- data_utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data_utils.py b/data_utils.py index f2e6ee85b..cbd0f204d 100644 --- a/data_utils.py +++ b/data_utils.py @@ -68,7 +68,7 @@ def _filter(self): lengths.append(os.path.getsize(audiopath) // (2 * self.hop_length)) else: skipped += 1 - logger.info("skipped: " + skipped + ", total: " + len(self.audiopaths_sid_text)) + logger.info("skipped: " + str(skipped) + ", total: " + str(len(self.audiopaths_sid_text))) self.audiopaths_sid_text = audiopaths_sid_text_new self.lengths = lengths From 0afb102d4820dcabc23d021b8710fdc5c1882ede Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Wed, 6 Sep 2023 10:11:59 +0800 Subject: [PATCH 068/102] Update data_utils.py --- data_utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data_utils.py b/data_utils.py index cbd0f204d..0a3bed08d 100644 --- a/data_utils.py +++ b/data_utils.py @@ -80,7 +80,7 @@ def get_audio_text_speaker_pair(self, audiopath_sid_text): spec, wav = self.get_audio(audiopath) sid = torch.LongTensor([int(self.spk_map[sid])]) - return (phones, spec, wav, sid, tone, language, bert) + return (phones, spec, wav, sid, tone, language, bert,ja_bert) def get_audio(self, filename): audio, sampling_rate = load_wav_to_torch(filename) From 57276857d9a80b78a75c4a5966ab758ba9a086d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Wed, 6 Sep 2023 10:12:31 +0800 Subject: [PATCH 069/102] Update data_utils.py --- data_utils.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/data_utils.py b/data_utils.py index 0a3bed08d..36c362081 100644 --- a/data_utils.py +++ b/data_utils.py @@ -80,7 +80,7 @@ def get_audio_text_speaker_pair(self, audiopath_sid_text): spec, wav = self.get_audio(audiopath) sid = torch.LongTensor([int(self.spk_map[sid])]) - return (phones, spec, wav, sid, tone, language, bert,ja_bert) + return (phones, spec, wav, sid, tone, language, bert, ja_bert) def get_audio(self, filename): audio, sampling_rate = load_wav_to_torch(filename) From 9e30c85a1576921397793181bb49dba707b8eae2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Wed, 6 Sep 2023 10:13:18 +0800 Subject: [PATCH 070/102] Update models.py --- models.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/models.py b/models.py index cd83ea4df..14dd9bbed 100644 --- a/models.py +++ b/models.py @@ -355,7 +355,7 @@ def __init__( self.proj = nn.Conv1d(hidden_channels, out_channels * 2, 1) def forward(self, x, x_lengths, tone, language, bert, ja_bert, g=None): - bert_emb = self.zh_bert_proj(bert).transpose(1, 2) + bert_emb = self.bert_proj(bert).transpose(1, 2) ja_bert_emb = self.ja_bert_proj(ja_bert).transpose(1, 2) x = ( self.emb(x) From 63d6f52bef746c96b613c38cadd66b4916dcd64e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Wed, 6 Sep 2023 10:20:42 +0800 Subject: [PATCH 071/102] Update train_ms.py --- train_ms.py | 1 + 1 file changed, 1 insertion(+) diff --git a/train_ms.py b/train_ms.py index 2e673b1bd..bc7225330 100644 --- a/train_ms.py +++ b/train_ms.py @@ -337,6 +337,7 @@ def evaluate(hps, generator, eval_loader, writer_eval): y, y_lengths = y.cuda(), y_lengths.cuda() speakers = speakers.cuda() bert = bert.cuda() + ja_bert = ja_bert.cuda() tone = tone.cuda() language = language.cuda() for use_sdp in [True, False]: From b7607035cdc0f68a14fb5ea239c7739311a77be6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Wed, 6 Sep 2023 11:15:39 +0800 Subject: [PATCH 072/102] Update config.json --- configs/config.json | 1 + 1 file changed, 1 insertion(+) diff --git a/configs/config.json b/configs/config.json index 21c28e89d..d10076682 100644 --- a/configs/config.json +++ b/configs/config.json @@ -286,6 +286,7 @@ } }, "model": { + "freeze_enc": false, "use_spk_conditioned_encoder": true, "use_noise_scaled_mas": true, "use_mel_posterior_encoder": false, From a12d5086984c1a9293c9de9b27f6d76c46add22d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Wed, 6 Sep 2023 11:16:09 +0800 Subject: [PATCH 073/102] Update config.json --- configs/config.json | 1 - 1 file changed, 1 deletion(-) diff --git a/configs/config.json b/configs/config.json index d10076682..a47c4d830 100644 --- a/configs/config.json +++ b/configs/config.json @@ -20,7 +20,6 @@ "c_kl": 1.0 }, "data": { - "use_mel_posterior_encoder": false, "training_files": "filelists/train.list", "validation_files": "filelists/val.list", "max_wav_value": 32768.0, From 371ffeb98e950c8ed933fa6874aa681c2a225685 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Wed, 6 Sep 2023 11:39:01 +0800 Subject: [PATCH 074/102] del freeze enc --- configs/config.json | 1 - 1 file changed, 1 deletion(-) diff --git a/configs/config.json b/configs/config.json index a47c4d830..29a145d19 100644 --- a/configs/config.json +++ b/configs/config.json @@ -285,7 +285,6 @@ } }, "model": { - "freeze_enc": false, "use_spk_conditioned_encoder": true, "use_noise_scaled_mas": true, "use_mel_posterior_encoder": false, From 8c4316cd5e1036575a0689d400a0a06e9e745aa7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Wed, 6 Sep 2023 11:39:25 +0800 Subject: [PATCH 075/102] del freeze enc --- train_ms.py | 6 ------ 1 file changed, 6 deletions(-) diff --git a/train_ms.py b/train_ms.py index bc7225330..325bee917 100644 --- a/train_ms.py +++ b/train_ms.py @@ -114,12 +114,6 @@ def run(): noise_scale_delta = noise_scale_delta, **hps.model).cuda(rank) - freeze_enc = getattr(hps.model, "freeze_enc", False) - if freeze_enc: - print("freeze encoder !!!") - for param in net_g.enc_p.parameters(): - param.requires_grad = False - net_d = MultiPeriodDiscriminator(hps.model.use_spectral_norm).cuda(rank) optim_g = torch.optim.AdamW( filter(lambda p: p.requires_grad, net_g.parameters()), From c09f4b92ff52a14ace8c83a39a5af8c8416ec619 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Wed, 6 Sep 2023 19:50:04 +0800 Subject: [PATCH 076/102] fix --- data_utils.py | 17 +++++++++++++---- 1 file changed, 13 insertions(+), 4 deletions(-) diff --git a/data_utils.py b/data_utils.py index 36c362081..12eadccb4 100644 --- a/data_utils.py +++ b/data_utils.py @@ -254,10 +254,19 @@ def _create_buckets(self): if idx_bucket != -1: buckets[idx_bucket].append(i) - for i in range(len(buckets) - 1, 0, -1): - if len(buckets[i]) == 0: - buckets.pop(i) - self.boundaries.pop(i + 1) + try: + for i in range(len(buckets) - 1, 0, -1): + if len(buckets[i]) == 0: + buckets.pop(i) + self.boundaries.pop(i + 1) + assert all(len(bucket) > 0 for bucket in buckets) + # When one bucket is not traversed + except Exception as e: + print('Bucket warning ', e) + for i in range(len(buckets) - 1, -1, -1): + if len(buckets[i]) == 0: + buckets.pop(i) + self.boundaries.pop(i + 1) num_samples_per_bucket = [] for i in range(len(buckets)): From 11a6e9aad76913916d6e563771eb18fafea7fb5a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Wed, 6 Sep 2023 20:32:57 +0800 Subject: [PATCH 077/102] disable TF32 --- train_ms.py | 3 --- 1 file changed, 3 deletions(-) diff --git a/train_ms.py b/train_ms.py index 325bee917..7e653df6f 100644 --- a/train_ms.py +++ b/train_ms.py @@ -37,9 +37,6 @@ from text.symbols import symbols torch.backends.cudnn.benchmark = True -torch.backends.cuda.matmul.allow_tf32 = True -torch.backends.cudnn.allow_tf32 = True # If encontered training problem,please try to disable TF32. -torch.set_float32_matmul_precision('medium') torch.backends.cuda.sdp_kernel("flash") torch.backends.cuda.enable_flash_sdp(True) torch.backends.cuda.enable_mem_efficient_sdp(True) # Not avaliable if torch version is lower than 2.0 From 66db9a4c6daf3a012d52668d508db7af6882e2f9 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BA=90=E6=96=87=E9=9B=A8?= <41315874+fumiama@users.noreply.github.com> Date: Wed, 6 Sep 2023 21:28:30 +0800 Subject: [PATCH 078/102] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E6=A0=BC=E5=BC=8F=E5=8C=96=E4=BB=A3=E7=A0=81=E7=9A=84?= =?UTF-8?q?=20action?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/pull_format.yml | 43 ++++++++++++++++++++++++ .github/workflows/push_format.yml | 56 +++++++++++++++++++++++++++++++ 2 files changed, 99 insertions(+) create mode 100644 .github/workflows/pull_format.yml create mode 100644 .github/workflows/push_format.yml diff --git a/.github/workflows/pull_format.yml b/.github/workflows/pull_format.yml new file mode 100644 index 000000000..4440f6c38 --- /dev/null +++ b/.github/workflows/pull_format.yml @@ -0,0 +1,43 @@ +name: pull format + +on: [pull_request] + +permissions: + contents: write + +jobs: + pull_format: + runs-on: ${{ matrix.os }} + + strategy: + matrix: + python-version: ["3.10"] + os: [ubuntu-latest] + fail-fast: false + + continue-on-error: true + + steps: + - name: checkout + continue-on-error: true + uses: actions/checkout@v3 + with: + ref: ${{ github.head_ref }} + fetch-depth: 0 + + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v4 + with: + python-version: ${{ matrix.python-version }} + + - name: Install Black + run: pip install "black[jupyter]" + + - name: Run Black + # run: black $(git ls-files '*.py') + run: black . + + - name: Commit Back + uses: stefanzweifel/git-auto-commit-action@v4 + with: + commit_message: Apply Code Formatter Change diff --git a/.github/workflows/push_format.yml b/.github/workflows/push_format.yml new file mode 100644 index 000000000..0a727898e --- /dev/null +++ b/.github/workflows/push_format.yml @@ -0,0 +1,56 @@ +name: push format + +on: + push: + branches: + - main + +permissions: + contents: write + pull-requests: write + +jobs: + push_format: + runs-on: ${{ matrix.os }} + + strategy: + matrix: + python-version: ["3.10"] + os: [ubuntu-latest] + fail-fast: false + + steps: + - uses: actions/checkout@v3 + with: + ref: ${{github.ref_name}} + + - name: Set up Python ${{ matrix.python-version }} + uses: actions/setup-python@v4 + with: + python-version: ${{ matrix.python-version }} + + - name: Install Black + run: pip install "black[jupyter]" + + - name: Run Black + # run: black $(git ls-files '*.py') + run: black . + + - name: Commit Back + continue-on-error: true + id: commitback + run: | + git config --local user.email "github-actions[bot]@users.noreply.github.com" + git config --local user.name "github-actions[bot]" + git add --all + git commit -m "Format code" + + - name: Create Pull Request + if: steps.commitback.outcome == 'success' + continue-on-error: true + uses: peter-evans/create-pull-request@v5 + with: + delete-branch: true + body: Apply Code Formatter Change + title: Apply Code Formatter Change + commit-message: Automatic code format From d013afe621dd40bbec1f85726755662fad018857 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BA=90=E6=96=87=E9=9B=A8?= <41315874+fumiama@users.noreply.github.com> Date: Wed, 6 Sep 2023 21:29:44 +0800 Subject: [PATCH 079/102] =?UTF-8?q?feat:=20=E5=A2=9E=E5=8A=A0=E8=87=AA?= =?UTF-8?q?=E5=8A=A8=E6=A0=BC=E5=BC=8F=E5=8C=96=E4=BB=A3=E7=A0=81=E7=9A=84?= =?UTF-8?q?=20action?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .github/workflows/push_format.yml | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/.github/workflows/push_format.yml b/.github/workflows/push_format.yml index 0a727898e..64d278213 100644 --- a/.github/workflows/push_format.yml +++ b/.github/workflows/push_format.yml @@ -3,7 +3,8 @@ name: push format on: push: branches: - - main + - master + - dev permissions: contents: write From 4f1a235c265206b7f9780a7530fa708efc1de7cd Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E6=BA=90=E6=96=87=E9=9B=A8?= <41315874+fumiama@users.noreply.github.com> Date: Wed, 6 Sep 2023 21:31:22 +0800 Subject: [PATCH 080/102] fix: syntax error --- server.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server.py b/server.py index caa62387b..550db2340 100644 --- a/server.py +++ b/server.py @@ -114,7 +114,7 @@ def main(): return "Missing Parameter" if fmt not in ("mp3", "wav", "ogg"): return "Invalid Format" - if language not in ("JA", "ZH") + if language not in ("JA", "ZH"): return "Invalid language" except: return "Invalid Parameter" From eef212fd003dac199ea512d3c951588ca4eb45ee Mon Sep 17 00:00:00 2001 From: Stardust-minus Date: Wed, 6 Sep 2023 13:42:05 +0000 Subject: [PATCH 081/102] Apply Code Formatter Change --- attentions.py | 751 ++++++++++++++++++------------- bert_gen.py | 8 +- commons.py | 202 ++++----- data_utils.py | 155 +++++-- losses.py | 86 ++-- mel_processing.py | 94 ++-- models.py | 3 - modules.py | 870 +++++++++++++++++++++--------------- monotonic_align/__init__.py | 19 +- monotonic_align/core.py | 67 +-- preprocess_text.py | 1 - resample.py | 30 +- server.py | 93 +++- text/__init__.py | 35 +- text/chinese.py | 143 +++--- text/chinese_bert.py | 63 ++- text/cleaner.py | 10 +- text/english.py | 121 ++++- text/japanese.py | 54 ++- text/japanese_bert.py | 17 +- text/symbols.py | 183 +++++++- text/tone_sandhi.py | 610 +++++++++++++++++++++---- train_ms.py | 425 +++++++++++++----- transforms.py | 176 ++++---- utils.py | 175 +++++--- webui.py | 128 ++++-- 26 files changed, 3002 insertions(+), 1517 deletions(-) diff --git a/attentions.py b/attentions.py index 1192dd726..88eeb078b 100644 --- a/attentions.py +++ b/attentions.py @@ -9,336 +9,457 @@ logger = logging.getLogger(__name__) + class LayerNorm(nn.Module): - def __init__(self, channels, eps=1e-5): - super().__init__() - self.channels = channels - self.eps = eps + def __init__(self, channels, eps=1e-5): + super().__init__() + self.channels = channels + self.eps = eps + + self.gamma = nn.Parameter(torch.ones(channels)) + self.beta = nn.Parameter(torch.zeros(channels)) - self.gamma = nn.Parameter(torch.ones(channels)) - self.beta = nn.Parameter(torch.zeros(channels)) + def forward(self, x): + x = x.transpose(1, -1) + x = F.layer_norm(x, (self.channels,), self.gamma, self.beta, self.eps) + return x.transpose(1, -1) - def forward(self, x): - x = x.transpose(1, -1) - x = F.layer_norm(x, (self.channels,), self.gamma, self.beta, self.eps) - return x.transpose(1, -1) - - @torch.jit.script def fused_add_tanh_sigmoid_multiply(input_a, input_b, n_channels): - n_channels_int = n_channels[0] - in_act = input_a + input_b - t_act = torch.tanh(in_act[:, :n_channels_int, :]) - s_act = torch.sigmoid(in_act[:, n_channels_int:, :]) - acts = t_act * s_act - return acts + n_channels_int = n_channels[0] + in_act = input_a + input_b + t_act = torch.tanh(in_act[:, :n_channels_int, :]) + s_act = torch.sigmoid(in_act[:, n_channels_int:, :]) + acts = t_act * s_act + return acts + class Encoder(nn.Module): - def __init__(self, hidden_channels, filter_channels, n_heads, n_layers, kernel_size=1, p_dropout=0., window_size=4, isflow = True, **kwargs): - super().__init__() - self.hidden_channels = hidden_channels - self.filter_channels = filter_channels - self.n_heads = n_heads - self.n_layers = n_layers - self.kernel_size = kernel_size - self.p_dropout = p_dropout - self.window_size = window_size - #if isflow: - # cond_layer = torch.nn.Conv1d(256, 2*hidden_channels*n_layers, 1) - # self.cond_pre = torch.nn.Conv1d(hidden_channels, 2*hidden_channels, 1) - # self.cond_layer = weight_norm(cond_layer, name='weight') - # self.gin_channels = 256 - self.cond_layer_idx = self.n_layers - if 'gin_channels' in kwargs: - self.gin_channels = kwargs['gin_channels'] - if self.gin_channels != 0: - self.spk_emb_linear = nn.Linear(self.gin_channels, self.hidden_channels) - # vits2 says 3rd block, so idx is 2 by default - self.cond_layer_idx = kwargs['cond_layer_idx'] if 'cond_layer_idx' in kwargs else 2 - logging.debug(self.gin_channels, self.cond_layer_idx) - assert self.cond_layer_idx < self.n_layers, 'cond_layer_idx should be less than n_layers' - self.drop = nn.Dropout(p_dropout) - self.attn_layers = nn.ModuleList() - self.norm_layers_1 = nn.ModuleList() - self.ffn_layers = nn.ModuleList() - self.norm_layers_2 = nn.ModuleList() - for i in range(self.n_layers): - self.attn_layers.append(MultiHeadAttention(hidden_channels, hidden_channels, n_heads, p_dropout=p_dropout, window_size=window_size)) - self.norm_layers_1.append(LayerNorm(hidden_channels)) - self.ffn_layers.append(FFN(hidden_channels, hidden_channels, filter_channels, kernel_size, p_dropout=p_dropout)) - self.norm_layers_2.append(LayerNorm(hidden_channels)) - def forward(self, x, x_mask, g=None): - attn_mask = x_mask.unsqueeze(2) * x_mask.unsqueeze(-1) - x = x * x_mask - for i in range(self.n_layers): - if i == self.cond_layer_idx and g is not None: - g = self.spk_emb_linear(g.transpose(1, 2)) - g = g.transpose(1, 2) - x = x + g + def __init__( + self, + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size=1, + p_dropout=0.0, + window_size=4, + isflow=True, + **kwargs + ): + super().__init__() + self.hidden_channels = hidden_channels + self.filter_channels = filter_channels + self.n_heads = n_heads + self.n_layers = n_layers + self.kernel_size = kernel_size + self.p_dropout = p_dropout + self.window_size = window_size + # if isflow: + # cond_layer = torch.nn.Conv1d(256, 2*hidden_channels*n_layers, 1) + # self.cond_pre = torch.nn.Conv1d(hidden_channels, 2*hidden_channels, 1) + # self.cond_layer = weight_norm(cond_layer, name='weight') + # self.gin_channels = 256 + self.cond_layer_idx = self.n_layers + if "gin_channels" in kwargs: + self.gin_channels = kwargs["gin_channels"] + if self.gin_channels != 0: + self.spk_emb_linear = nn.Linear(self.gin_channels, self.hidden_channels) + # vits2 says 3rd block, so idx is 2 by default + self.cond_layer_idx = ( + kwargs["cond_layer_idx"] if "cond_layer_idx" in kwargs else 2 + ) + logging.debug(self.gin_channels, self.cond_layer_idx) + assert ( + self.cond_layer_idx < self.n_layers + ), "cond_layer_idx should be less than n_layers" + self.drop = nn.Dropout(p_dropout) + self.attn_layers = nn.ModuleList() + self.norm_layers_1 = nn.ModuleList() + self.ffn_layers = nn.ModuleList() + self.norm_layers_2 = nn.ModuleList() + for i in range(self.n_layers): + self.attn_layers.append( + MultiHeadAttention( + hidden_channels, + hidden_channels, + n_heads, + p_dropout=p_dropout, + window_size=window_size, + ) + ) + self.norm_layers_1.append(LayerNorm(hidden_channels)) + self.ffn_layers.append( + FFN( + hidden_channels, + hidden_channels, + filter_channels, + kernel_size, + p_dropout=p_dropout, + ) + ) + self.norm_layers_2.append(LayerNorm(hidden_channels)) + + def forward(self, x, x_mask, g=None): + attn_mask = x_mask.unsqueeze(2) * x_mask.unsqueeze(-1) x = x * x_mask - y = self.attn_layers[i](x, x, attn_mask) - y = self.drop(y) - x = self.norm_layers_1[i](x + y) - - y = self.ffn_layers[i](x, x_mask) - y = self.drop(y) - x = self.norm_layers_2[i](x + y) - x = x * x_mask - return x + for i in range(self.n_layers): + if i == self.cond_layer_idx and g is not None: + g = self.spk_emb_linear(g.transpose(1, 2)) + g = g.transpose(1, 2) + x = x + g + x = x * x_mask + y = self.attn_layers[i](x, x, attn_mask) + y = self.drop(y) + x = self.norm_layers_1[i](x + y) + + y = self.ffn_layers[i](x, x_mask) + y = self.drop(y) + x = self.norm_layers_2[i](x + y) + x = x * x_mask + return x class Decoder(nn.Module): - def __init__(self, hidden_channels, filter_channels, n_heads, n_layers, kernel_size=1, p_dropout=0., proximal_bias=False, proximal_init=True, **kwargs): - super().__init__() - self.hidden_channels = hidden_channels - self.filter_channels = filter_channels - self.n_heads = n_heads - self.n_layers = n_layers - self.kernel_size = kernel_size - self.p_dropout = p_dropout - self.proximal_bias = proximal_bias - self.proximal_init = proximal_init - - self.drop = nn.Dropout(p_dropout) - self.self_attn_layers = nn.ModuleList() - self.norm_layers_0 = nn.ModuleList() - self.encdec_attn_layers = nn.ModuleList() - self.norm_layers_1 = nn.ModuleList() - self.ffn_layers = nn.ModuleList() - self.norm_layers_2 = nn.ModuleList() - for i in range(self.n_layers): - self.self_attn_layers.append(MultiHeadAttention(hidden_channels, hidden_channels, n_heads, p_dropout=p_dropout, proximal_bias=proximal_bias, proximal_init=proximal_init)) - self.norm_layers_0.append(LayerNorm(hidden_channels)) - self.encdec_attn_layers.append(MultiHeadAttention(hidden_channels, hidden_channels, n_heads, p_dropout=p_dropout)) - self.norm_layers_1.append(LayerNorm(hidden_channels)) - self.ffn_layers.append(FFN(hidden_channels, hidden_channels, filter_channels, kernel_size, p_dropout=p_dropout, causal=True)) - self.norm_layers_2.append(LayerNorm(hidden_channels)) - - def forward(self, x, x_mask, h, h_mask): - """ - x: decoder input - h: encoder output - """ - self_attn_mask = commons.subsequent_mask(x_mask.size(2)).to(device=x.device, dtype=x.dtype) - encdec_attn_mask = h_mask.unsqueeze(2) * x_mask.unsqueeze(-1) - x = x * x_mask - for i in range(self.n_layers): - y = self.self_attn_layers[i](x, x, self_attn_mask) - y = self.drop(y) - x = self.norm_layers_0[i](x + y) - - y = self.encdec_attn_layers[i](x, h, encdec_attn_mask) - y = self.drop(y) - x = self.norm_layers_1[i](x + y) - - y = self.ffn_layers[i](x, x_mask) - y = self.drop(y) - x = self.norm_layers_2[i](x + y) - x = x * x_mask - return x + def __init__( + self, + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size=1, + p_dropout=0.0, + proximal_bias=False, + proximal_init=True, + **kwargs + ): + super().__init__() + self.hidden_channels = hidden_channels + self.filter_channels = filter_channels + self.n_heads = n_heads + self.n_layers = n_layers + self.kernel_size = kernel_size + self.p_dropout = p_dropout + self.proximal_bias = proximal_bias + self.proximal_init = proximal_init + + self.drop = nn.Dropout(p_dropout) + self.self_attn_layers = nn.ModuleList() + self.norm_layers_0 = nn.ModuleList() + self.encdec_attn_layers = nn.ModuleList() + self.norm_layers_1 = nn.ModuleList() + self.ffn_layers = nn.ModuleList() + self.norm_layers_2 = nn.ModuleList() + for i in range(self.n_layers): + self.self_attn_layers.append( + MultiHeadAttention( + hidden_channels, + hidden_channels, + n_heads, + p_dropout=p_dropout, + proximal_bias=proximal_bias, + proximal_init=proximal_init, + ) + ) + self.norm_layers_0.append(LayerNorm(hidden_channels)) + self.encdec_attn_layers.append( + MultiHeadAttention( + hidden_channels, hidden_channels, n_heads, p_dropout=p_dropout + ) + ) + self.norm_layers_1.append(LayerNorm(hidden_channels)) + self.ffn_layers.append( + FFN( + hidden_channels, + hidden_channels, + filter_channels, + kernel_size, + p_dropout=p_dropout, + causal=True, + ) + ) + self.norm_layers_2.append(LayerNorm(hidden_channels)) + + def forward(self, x, x_mask, h, h_mask): + """ + x: decoder input + h: encoder output + """ + self_attn_mask = commons.subsequent_mask(x_mask.size(2)).to( + device=x.device, dtype=x.dtype + ) + encdec_attn_mask = h_mask.unsqueeze(2) * x_mask.unsqueeze(-1) + x = x * x_mask + for i in range(self.n_layers): + y = self.self_attn_layers[i](x, x, self_attn_mask) + y = self.drop(y) + x = self.norm_layers_0[i](x + y) + + y = self.encdec_attn_layers[i](x, h, encdec_attn_mask) + y = self.drop(y) + x = self.norm_layers_1[i](x + y) + + y = self.ffn_layers[i](x, x_mask) + y = self.drop(y) + x = self.norm_layers_2[i](x + y) + x = x * x_mask + return x class MultiHeadAttention(nn.Module): - def __init__(self, channels, out_channels, n_heads, p_dropout=0., window_size=None, heads_share=True, block_length=None, proximal_bias=False, proximal_init=False): - super().__init__() - assert channels % n_heads == 0 - - self.channels = channels - self.out_channels = out_channels - self.n_heads = n_heads - self.p_dropout = p_dropout - self.window_size = window_size - self.heads_share = heads_share - self.block_length = block_length - self.proximal_bias = proximal_bias - self.proximal_init = proximal_init - self.attn = None - - self.k_channels = channels // n_heads - self.conv_q = nn.Conv1d(channels, channels, 1) - self.conv_k = nn.Conv1d(channels, channels, 1) - self.conv_v = nn.Conv1d(channels, channels, 1) - self.conv_o = nn.Conv1d(channels, out_channels, 1) - self.drop = nn.Dropout(p_dropout) - - if window_size is not None: - n_heads_rel = 1 if heads_share else n_heads - rel_stddev = self.k_channels**-0.5 - self.emb_rel_k = nn.Parameter(torch.randn(n_heads_rel, window_size * 2 + 1, self.k_channels) * rel_stddev) - self.emb_rel_v = nn.Parameter(torch.randn(n_heads_rel, window_size * 2 + 1, self.k_channels) * rel_stddev) - - nn.init.xavier_uniform_(self.conv_q.weight) - nn.init.xavier_uniform_(self.conv_k.weight) - nn.init.xavier_uniform_(self.conv_v.weight) - if proximal_init: - with torch.no_grad(): - self.conv_k.weight.copy_(self.conv_q.weight) - self.conv_k.bias.copy_(self.conv_q.bias) - - def forward(self, x, c, attn_mask=None): - q = self.conv_q(x) - k = self.conv_k(c) - v = self.conv_v(c) - - x, self.attn = self.attention(q, k, v, mask=attn_mask) - - x = self.conv_o(x) - return x - - def attention(self, query, key, value, mask=None): - # reshape [b, d, t] -> [b, n_h, t, d_k] - b, d, t_s, t_t = (*key.size(), query.size(2)) - query = query.view(b, self.n_heads, self.k_channels, t_t).transpose(2, 3) - key = key.view(b, self.n_heads, self.k_channels, t_s).transpose(2, 3) - value = value.view(b, self.n_heads, self.k_channels, t_s).transpose(2, 3) - - scores = torch.matmul(query / math.sqrt(self.k_channels), key.transpose(-2, -1)) - if self.window_size is not None: - assert t_s == t_t, "Relative attention is only available for self-attention." - key_relative_embeddings = self._get_relative_embeddings(self.emb_rel_k, t_s) - rel_logits = self._matmul_with_relative_keys(query /math.sqrt(self.k_channels), key_relative_embeddings) - scores_local = self._relative_position_to_absolute_position(rel_logits) - scores = scores + scores_local - if self.proximal_bias: - assert t_s == t_t, "Proximal bias is only available for self-attention." - scores = scores + self._attention_bias_proximal(t_s).to(device=scores.device, dtype=scores.dtype) - if mask is not None: - scores = scores.masked_fill(mask == 0, -1e4) - if self.block_length is not None: - assert t_s == t_t, "Local attention is only available for self-attention." - block_mask = torch.ones_like(scores).triu(-self.block_length).tril(self.block_length) - scores = scores.masked_fill(block_mask == 0, -1e4) - p_attn = F.softmax(scores, dim=-1) # [b, n_h, t_t, t_s] - p_attn = self.drop(p_attn) - output = torch.matmul(p_attn, value) - if self.window_size is not None: - relative_weights = self._absolute_position_to_relative_position(p_attn) - value_relative_embeddings = self._get_relative_embeddings(self.emb_rel_v, t_s) - output = output + self._matmul_with_relative_values(relative_weights, value_relative_embeddings) - output = output.transpose(2, 3).contiguous().view(b, d, t_t) # [b, n_h, t_t, d_k] -> [b, d, t_t] - return output, p_attn - - def _matmul_with_relative_values(self, x, y): - """ - x: [b, h, l, m] - y: [h or 1, m, d] - ret: [b, h, l, d] - """ - ret = torch.matmul(x, y.unsqueeze(0)) - return ret - - def _matmul_with_relative_keys(self, x, y): - """ - x: [b, h, l, d] - y: [h or 1, m, d] - ret: [b, h, l, m] - """ - ret = torch.matmul(x, y.unsqueeze(0).transpose(-2, -1)) - return ret - - def _get_relative_embeddings(self, relative_embeddings, length): - max_relative_position = 2 * self.window_size + 1 - # Pad first before slice to avoid using cond ops. - pad_length = max(length - (self.window_size + 1), 0) - slice_start_position = max((self.window_size + 1) - length, 0) - slice_end_position = slice_start_position + 2 * length - 1 - if pad_length > 0: - padded_relative_embeddings = F.pad( - relative_embeddings, - commons.convert_pad_shape([[0, 0], [pad_length, pad_length], [0, 0]])) - else: - padded_relative_embeddings = relative_embeddings - used_relative_embeddings = padded_relative_embeddings[:,slice_start_position:slice_end_position] - return used_relative_embeddings - - def _relative_position_to_absolute_position(self, x): - """ - x: [b, h, l, 2*l-1] - ret: [b, h, l, l] - """ - batch, heads, length, _ = x.size() - # Concat columns of pad to shift from relative to absolute indexing. - x = F.pad(x, commons.convert_pad_shape([[0,0],[0,0],[0,0],[0,1]])) - - # Concat extra elements so to add up to shape (len+1, 2*len-1). - x_flat = x.view([batch, heads, length * 2 * length]) - x_flat = F.pad(x_flat, commons.convert_pad_shape([[0,0],[0,0],[0,length-1]])) - - # Reshape and slice out the padded elements. - x_final = x_flat.view([batch, heads, length+1, 2*length-1])[:, :, :length, length-1:] - return x_final - - def _absolute_position_to_relative_position(self, x): - """ - x: [b, h, l, l] - ret: [b, h, l, 2*l-1] - """ - batch, heads, length, _ = x.size() - # padd along column - x = F.pad(x, commons.convert_pad_shape([[0, 0], [0, 0], [0, 0], [0, length-1]])) - x_flat = x.view([batch, heads, length**2 + length*(length -1)]) - # add 0's in the beginning that will skew the elements after reshape - x_flat = F.pad(x_flat, commons.convert_pad_shape([[0, 0], [0, 0], [length, 0]])) - x_final = x_flat.view([batch, heads, length, 2*length])[:,:,:,1:] - return x_final - - def _attention_bias_proximal(self, length): - """Bias for self-attention to encourage attention to close positions. - Args: - length: an integer scalar. - Returns: - a Tensor with shape [1, 1, length, length] - """ - r = torch.arange(length, dtype=torch.float32) - diff = torch.unsqueeze(r, 0) - torch.unsqueeze(r, 1) - return torch.unsqueeze(torch.unsqueeze(-torch.log1p(torch.abs(diff)), 0), 0) + def __init__( + self, + channels, + out_channels, + n_heads, + p_dropout=0.0, + window_size=None, + heads_share=True, + block_length=None, + proximal_bias=False, + proximal_init=False, + ): + super().__init__() + assert channels % n_heads == 0 + + self.channels = channels + self.out_channels = out_channels + self.n_heads = n_heads + self.p_dropout = p_dropout + self.window_size = window_size + self.heads_share = heads_share + self.block_length = block_length + self.proximal_bias = proximal_bias + self.proximal_init = proximal_init + self.attn = None + + self.k_channels = channels // n_heads + self.conv_q = nn.Conv1d(channels, channels, 1) + self.conv_k = nn.Conv1d(channels, channels, 1) + self.conv_v = nn.Conv1d(channels, channels, 1) + self.conv_o = nn.Conv1d(channels, out_channels, 1) + self.drop = nn.Dropout(p_dropout) + + if window_size is not None: + n_heads_rel = 1 if heads_share else n_heads + rel_stddev = self.k_channels**-0.5 + self.emb_rel_k = nn.Parameter( + torch.randn(n_heads_rel, window_size * 2 + 1, self.k_channels) + * rel_stddev + ) + self.emb_rel_v = nn.Parameter( + torch.randn(n_heads_rel, window_size * 2 + 1, self.k_channels) + * rel_stddev + ) + + nn.init.xavier_uniform_(self.conv_q.weight) + nn.init.xavier_uniform_(self.conv_k.weight) + nn.init.xavier_uniform_(self.conv_v.weight) + if proximal_init: + with torch.no_grad(): + self.conv_k.weight.copy_(self.conv_q.weight) + self.conv_k.bias.copy_(self.conv_q.bias) + + def forward(self, x, c, attn_mask=None): + q = self.conv_q(x) + k = self.conv_k(c) + v = self.conv_v(c) + + x, self.attn = self.attention(q, k, v, mask=attn_mask) + + x = self.conv_o(x) + return x + + def attention(self, query, key, value, mask=None): + # reshape [b, d, t] -> [b, n_h, t, d_k] + b, d, t_s, t_t = (*key.size(), query.size(2)) + query = query.view(b, self.n_heads, self.k_channels, t_t).transpose(2, 3) + key = key.view(b, self.n_heads, self.k_channels, t_s).transpose(2, 3) + value = value.view(b, self.n_heads, self.k_channels, t_s).transpose(2, 3) + + scores = torch.matmul(query / math.sqrt(self.k_channels), key.transpose(-2, -1)) + if self.window_size is not None: + assert ( + t_s == t_t + ), "Relative attention is only available for self-attention." + key_relative_embeddings = self._get_relative_embeddings(self.emb_rel_k, t_s) + rel_logits = self._matmul_with_relative_keys( + query / math.sqrt(self.k_channels), key_relative_embeddings + ) + scores_local = self._relative_position_to_absolute_position(rel_logits) + scores = scores + scores_local + if self.proximal_bias: + assert t_s == t_t, "Proximal bias is only available for self-attention." + scores = scores + self._attention_bias_proximal(t_s).to( + device=scores.device, dtype=scores.dtype + ) + if mask is not None: + scores = scores.masked_fill(mask == 0, -1e4) + if self.block_length is not None: + assert ( + t_s == t_t + ), "Local attention is only available for self-attention." + block_mask = ( + torch.ones_like(scores) + .triu(-self.block_length) + .tril(self.block_length) + ) + scores = scores.masked_fill(block_mask == 0, -1e4) + p_attn = F.softmax(scores, dim=-1) # [b, n_h, t_t, t_s] + p_attn = self.drop(p_attn) + output = torch.matmul(p_attn, value) + if self.window_size is not None: + relative_weights = self._absolute_position_to_relative_position(p_attn) + value_relative_embeddings = self._get_relative_embeddings( + self.emb_rel_v, t_s + ) + output = output + self._matmul_with_relative_values( + relative_weights, value_relative_embeddings + ) + output = ( + output.transpose(2, 3).contiguous().view(b, d, t_t) + ) # [b, n_h, t_t, d_k] -> [b, d, t_t] + return output, p_attn + + def _matmul_with_relative_values(self, x, y): + """ + x: [b, h, l, m] + y: [h or 1, m, d] + ret: [b, h, l, d] + """ + ret = torch.matmul(x, y.unsqueeze(0)) + return ret + + def _matmul_with_relative_keys(self, x, y): + """ + x: [b, h, l, d] + y: [h or 1, m, d] + ret: [b, h, l, m] + """ + ret = torch.matmul(x, y.unsqueeze(0).transpose(-2, -1)) + return ret + + def _get_relative_embeddings(self, relative_embeddings, length): + max_relative_position = 2 * self.window_size + 1 + # Pad first before slice to avoid using cond ops. + pad_length = max(length - (self.window_size + 1), 0) + slice_start_position = max((self.window_size + 1) - length, 0) + slice_end_position = slice_start_position + 2 * length - 1 + if pad_length > 0: + padded_relative_embeddings = F.pad( + relative_embeddings, + commons.convert_pad_shape([[0, 0], [pad_length, pad_length], [0, 0]]), + ) + else: + padded_relative_embeddings = relative_embeddings + used_relative_embeddings = padded_relative_embeddings[ + :, slice_start_position:slice_end_position + ] + return used_relative_embeddings + + def _relative_position_to_absolute_position(self, x): + """ + x: [b, h, l, 2*l-1] + ret: [b, h, l, l] + """ + batch, heads, length, _ = x.size() + # Concat columns of pad to shift from relative to absolute indexing. + x = F.pad(x, commons.convert_pad_shape([[0, 0], [0, 0], [0, 0], [0, 1]])) + + # Concat extra elements so to add up to shape (len+1, 2*len-1). + x_flat = x.view([batch, heads, length * 2 * length]) + x_flat = F.pad( + x_flat, commons.convert_pad_shape([[0, 0], [0, 0], [0, length - 1]]) + ) + + # Reshape and slice out the padded elements. + x_final = x_flat.view([batch, heads, length + 1, 2 * length - 1])[ + :, :, :length, length - 1 : + ] + return x_final + + def _absolute_position_to_relative_position(self, x): + """ + x: [b, h, l, l] + ret: [b, h, l, 2*l-1] + """ + batch, heads, length, _ = x.size() + # padd along column + x = F.pad( + x, commons.convert_pad_shape([[0, 0], [0, 0], [0, 0], [0, length - 1]]) + ) + x_flat = x.view([batch, heads, length**2 + length * (length - 1)]) + # add 0's in the beginning that will skew the elements after reshape + x_flat = F.pad(x_flat, commons.convert_pad_shape([[0, 0], [0, 0], [length, 0]])) + x_final = x_flat.view([batch, heads, length, 2 * length])[:, :, :, 1:] + return x_final + + def _attention_bias_proximal(self, length): + """Bias for self-attention to encourage attention to close positions. + Args: + length: an integer scalar. + Returns: + a Tensor with shape [1, 1, length, length] + """ + r = torch.arange(length, dtype=torch.float32) + diff = torch.unsqueeze(r, 0) - torch.unsqueeze(r, 1) + return torch.unsqueeze(torch.unsqueeze(-torch.log1p(torch.abs(diff)), 0), 0) class FFN(nn.Module): - def __init__(self, in_channels, out_channels, filter_channels, kernel_size, p_dropout=0., activation=None, causal=False): - super().__init__() - self.in_channels = in_channels - self.out_channels = out_channels - self.filter_channels = filter_channels - self.kernel_size = kernel_size - self.p_dropout = p_dropout - self.activation = activation - self.causal = causal - - if causal: - self.padding = self._causal_padding - else: - self.padding = self._same_padding - - self.conv_1 = nn.Conv1d(in_channels, filter_channels, kernel_size) - self.conv_2 = nn.Conv1d(filter_channels, out_channels, kernel_size) - self.drop = nn.Dropout(p_dropout) - - def forward(self, x, x_mask): - x = self.conv_1(self.padding(x * x_mask)) - if self.activation == "gelu": - x = x * torch.sigmoid(1.702 * x) - else: - x = torch.relu(x) - x = self.drop(x) - x = self.conv_2(self.padding(x * x_mask)) - return x * x_mask - - def _causal_padding(self, x): - if self.kernel_size == 1: - return x - pad_l = self.kernel_size - 1 - pad_r = 0 - padding = [[0, 0], [0, 0], [pad_l, pad_r]] - x = F.pad(x, commons.convert_pad_shape(padding)) - return x - - def _same_padding(self, x): - if self.kernel_size == 1: - return x - pad_l = (self.kernel_size - 1) // 2 - pad_r = self.kernel_size // 2 - padding = [[0, 0], [0, 0], [pad_l, pad_r]] - x = F.pad(x, commons.convert_pad_shape(padding)) - return x + def __init__( + self, + in_channels, + out_channels, + filter_channels, + kernel_size, + p_dropout=0.0, + activation=None, + causal=False, + ): + super().__init__() + self.in_channels = in_channels + self.out_channels = out_channels + self.filter_channels = filter_channels + self.kernel_size = kernel_size + self.p_dropout = p_dropout + self.activation = activation + self.causal = causal + + if causal: + self.padding = self._causal_padding + else: + self.padding = self._same_padding + + self.conv_1 = nn.Conv1d(in_channels, filter_channels, kernel_size) + self.conv_2 = nn.Conv1d(filter_channels, out_channels, kernel_size) + self.drop = nn.Dropout(p_dropout) + + def forward(self, x, x_mask): + x = self.conv_1(self.padding(x * x_mask)) + if self.activation == "gelu": + x = x * torch.sigmoid(1.702 * x) + else: + x = torch.relu(x) + x = self.drop(x) + x = self.conv_2(self.padding(x * x_mask)) + return x * x_mask + + def _causal_padding(self, x): + if self.kernel_size == 1: + return x + pad_l = self.kernel_size - 1 + pad_r = 0 + padding = [[0, 0], [0, 0], [pad_l, pad_r]] + x = F.pad(x, commons.convert_pad_shape(padding)) + return x + + def _same_padding(self, x): + if self.kernel_size == 1: + return x + pad_l = (self.kernel_size - 1) // 2 + pad_r = self.kernel_size // 2 + padding = [[0, 0], [0, 0], [pad_l, pad_r]] + x = F.pad(x, commons.convert_pad_shape(padding)) + return x diff --git a/bert_gen.py b/bert_gen.py index 0ee10fc5c..fb9b550f7 100644 --- a/bert_gen.py +++ b/bert_gen.py @@ -7,6 +7,7 @@ import argparse import torch.multiprocessing as mp + def process_line(line): rank = mp.current_process()._identity rank = rank[0] if len(rank) > 0 else 0 @@ -34,15 +35,15 @@ def process_line(line): bert = torch.load(bert_path) assert bert.shape[-1] == len(phone) except Exception: - bert = get_bert(text, word2ph, language_str,device) + bert = get_bert(text, word2ph, language_str, device) assert bert.shape[-1] == len(phone) torch.save(bert, bert_path) if __name__ == "__main__": parser = argparse.ArgumentParser() - parser.add_argument('-c', '--config', type=str, default="configs/config.json") - parser.add_argument('--num_processes', type=int, default=2 ) + parser.add_argument("-c", "--config", type=str, default="configs/config.json") + parser.add_argument("--num_processes", type=int, default=2) args = parser.parse_args() config_path = args.config hps = utils.get_hparams_from_file(config_path) @@ -53,7 +54,6 @@ def process_line(line): with open(hps.data.validation_files, encoding="utf-8") as f: lines.extend(f.readlines()) - num_processes = args.num_processes with Pool(processes=num_processes) as pool: for _ in tqdm(pool.imap_unordered(process_line, lines), total=len(lines)): diff --git a/commons.py b/commons.py index 9ad0444b6..21b446b6b 100644 --- a/commons.py +++ b/commons.py @@ -6,156 +6,158 @@ def init_weights(m, mean=0.0, std=0.01): - classname = m.__class__.__name__ - if classname.find("Conv") != -1: - m.weight.data.normal_(mean, std) + classname = m.__class__.__name__ + if classname.find("Conv") != -1: + m.weight.data.normal_(mean, std) def get_padding(kernel_size, dilation=1): - return int((kernel_size*dilation - dilation)/2) + return int((kernel_size * dilation - dilation) / 2) def convert_pad_shape(pad_shape): - l = pad_shape[::-1] - pad_shape = [item for sublist in l for item in sublist] - return pad_shape + l = pad_shape[::-1] + pad_shape = [item for sublist in l for item in sublist] + return pad_shape def intersperse(lst, item): - result = [item] * (len(lst) * 2 + 1) - result[1::2] = lst - return result + result = [item] * (len(lst) * 2 + 1) + result[1::2] = lst + return result def kl_divergence(m_p, logs_p, m_q, logs_q): - """KL(P||Q)""" - kl = (logs_q - logs_p) - 0.5 - kl += 0.5 * (torch.exp(2. * logs_p) + ((m_p - m_q)**2)) * torch.exp(-2. * logs_q) - return kl + """KL(P||Q)""" + kl = (logs_q - logs_p) - 0.5 + kl += ( + 0.5 * (torch.exp(2.0 * logs_p) + ((m_p - m_q) ** 2)) * torch.exp(-2.0 * logs_q) + ) + return kl def rand_gumbel(shape): - """Sample from the Gumbel distribution, protect from overflows.""" - uniform_samples = torch.rand(shape) * 0.99998 + 0.00001 - return -torch.log(-torch.log(uniform_samples)) + """Sample from the Gumbel distribution, protect from overflows.""" + uniform_samples = torch.rand(shape) * 0.99998 + 0.00001 + return -torch.log(-torch.log(uniform_samples)) def rand_gumbel_like(x): - g = rand_gumbel(x.size()).to(dtype=x.dtype, device=x.device) - return g + g = rand_gumbel(x.size()).to(dtype=x.dtype, device=x.device) + return g def slice_segments(x, ids_str, segment_size=4): - ret = torch.zeros_like(x[:, :, :segment_size]) - for i in range(x.size(0)): - idx_str = ids_str[i] - idx_end = idx_str + segment_size - ret[i] = x[i, :, idx_str:idx_end] - return ret + ret = torch.zeros_like(x[:, :, :segment_size]) + for i in range(x.size(0)): + idx_str = ids_str[i] + idx_end = idx_str + segment_size + ret[i] = x[i, :, idx_str:idx_end] + return ret def rand_slice_segments(x, x_lengths=None, segment_size=4): - b, d, t = x.size() - if x_lengths is None: - x_lengths = t - ids_str_max = x_lengths - segment_size + 1 - ids_str = (torch.rand([b]).to(device=x.device) * ids_str_max).to(dtype=torch.long) - ret = slice_segments(x, ids_str, segment_size) - return ret, ids_str - - -def get_timing_signal_1d( - length, channels, min_timescale=1.0, max_timescale=1.0e4): - position = torch.arange(length, dtype=torch.float) - num_timescales = channels // 2 - log_timescale_increment = ( - math.log(float(max_timescale) / float(min_timescale)) / - (num_timescales - 1)) - inv_timescales = min_timescale * torch.exp( - torch.arange(num_timescales, dtype=torch.float) * -log_timescale_increment) - scaled_time = position.unsqueeze(0) * inv_timescales.unsqueeze(1) - signal = torch.cat([torch.sin(scaled_time), torch.cos(scaled_time)], 0) - signal = F.pad(signal, [0, 0, 0, channels % 2]) - signal = signal.view(1, channels, length) - return signal + b, d, t = x.size() + if x_lengths is None: + x_lengths = t + ids_str_max = x_lengths - segment_size + 1 + ids_str = (torch.rand([b]).to(device=x.device) * ids_str_max).to(dtype=torch.long) + ret = slice_segments(x, ids_str, segment_size) + return ret, ids_str + + +def get_timing_signal_1d(length, channels, min_timescale=1.0, max_timescale=1.0e4): + position = torch.arange(length, dtype=torch.float) + num_timescales = channels // 2 + log_timescale_increment = math.log(float(max_timescale) / float(min_timescale)) / ( + num_timescales - 1 + ) + inv_timescales = min_timescale * torch.exp( + torch.arange(num_timescales, dtype=torch.float) * -log_timescale_increment + ) + scaled_time = position.unsqueeze(0) * inv_timescales.unsqueeze(1) + signal = torch.cat([torch.sin(scaled_time), torch.cos(scaled_time)], 0) + signal = F.pad(signal, [0, 0, 0, channels % 2]) + signal = signal.view(1, channels, length) + return signal def add_timing_signal_1d(x, min_timescale=1.0, max_timescale=1.0e4): - b, channels, length = x.size() - signal = get_timing_signal_1d(length, channels, min_timescale, max_timescale) - return x + signal.to(dtype=x.dtype, device=x.device) + b, channels, length = x.size() + signal = get_timing_signal_1d(length, channels, min_timescale, max_timescale) + return x + signal.to(dtype=x.dtype, device=x.device) def cat_timing_signal_1d(x, min_timescale=1.0, max_timescale=1.0e4, axis=1): - b, channels, length = x.size() - signal = get_timing_signal_1d(length, channels, min_timescale, max_timescale) - return torch.cat([x, signal.to(dtype=x.dtype, device=x.device)], axis) + b, channels, length = x.size() + signal = get_timing_signal_1d(length, channels, min_timescale, max_timescale) + return torch.cat([x, signal.to(dtype=x.dtype, device=x.device)], axis) def subsequent_mask(length): - mask = torch.tril(torch.ones(length, length)).unsqueeze(0).unsqueeze(0) - return mask + mask = torch.tril(torch.ones(length, length)).unsqueeze(0).unsqueeze(0) + return mask @torch.jit.script def fused_add_tanh_sigmoid_multiply(input_a, input_b, n_channels): - n_channels_int = n_channels[0] - in_act = input_a + input_b - t_act = torch.tanh(in_act[:, :n_channels_int, :]) - s_act = torch.sigmoid(in_act[:, n_channels_int:, :]) - acts = t_act * s_act - return acts + n_channels_int = n_channels[0] + in_act = input_a + input_b + t_act = torch.tanh(in_act[:, :n_channels_int, :]) + s_act = torch.sigmoid(in_act[:, n_channels_int:, :]) + acts = t_act * s_act + return acts def convert_pad_shape(pad_shape): - l = pad_shape[::-1] - pad_shape = [item for sublist in l for item in sublist] - return pad_shape + l = pad_shape[::-1] + pad_shape = [item for sublist in l for item in sublist] + return pad_shape def shift_1d(x): - x = F.pad(x, convert_pad_shape([[0, 0], [0, 0], [1, 0]]))[:, :, :-1] - return x + x = F.pad(x, convert_pad_shape([[0, 0], [0, 0], [1, 0]]))[:, :, :-1] + return x def sequence_mask(length, max_length=None): - if max_length is None: - max_length = length.max() - x = torch.arange(max_length, dtype=length.dtype, device=length.device) - return x.unsqueeze(0) < length.unsqueeze(1) + if max_length is None: + max_length = length.max() + x = torch.arange(max_length, dtype=length.dtype, device=length.device) + return x.unsqueeze(0) < length.unsqueeze(1) def generate_path(duration, mask): - """ - duration: [b, 1, t_x] - mask: [b, 1, t_y, t_x] - """ - device = duration.device - - b, _, t_y, t_x = mask.shape - cum_duration = torch.cumsum(duration, -1) - - cum_duration_flat = cum_duration.view(b * t_x) - path = sequence_mask(cum_duration_flat, t_y).to(mask.dtype) - path = path.view(b, t_x, t_y) - path = path - F.pad(path, convert_pad_shape([[0, 0], [1, 0], [0, 0]]))[:, :-1] - path = path.unsqueeze(1).transpose(2,3) * mask - return path + """ + duration: [b, 1, t_x] + mask: [b, 1, t_y, t_x] + """ + device = duration.device + + b, _, t_y, t_x = mask.shape + cum_duration = torch.cumsum(duration, -1) + + cum_duration_flat = cum_duration.view(b * t_x) + path = sequence_mask(cum_duration_flat, t_y).to(mask.dtype) + path = path.view(b, t_x, t_y) + path = path - F.pad(path, convert_pad_shape([[0, 0], [1, 0], [0, 0]]))[:, :-1] + path = path.unsqueeze(1).transpose(2, 3) * mask + return path def clip_grad_value_(parameters, clip_value, norm_type=2): - if isinstance(parameters, torch.Tensor): - parameters = [parameters] - parameters = list(filter(lambda p: p.grad is not None, parameters)) - norm_type = float(norm_type) - if clip_value is not None: - clip_value = float(clip_value) - - total_norm = 0 - for p in parameters: - param_norm = p.grad.data.norm(norm_type) - total_norm += param_norm.item() ** norm_type + if isinstance(parameters, torch.Tensor): + parameters = [parameters] + parameters = list(filter(lambda p: p.grad is not None, parameters)) + norm_type = float(norm_type) if clip_value is not None: - p.grad.data.clamp_(min=-clip_value, max=clip_value) - total_norm = total_norm ** (1. / norm_type) - return total_norm + clip_value = float(clip_value) + + total_norm = 0 + for p in parameters: + param_norm = p.grad.data.norm(norm_type) + total_norm += param_norm.item() ** norm_type + if clip_value is not None: + p.grad.data.clamp_(min=-clip_value, max=clip_value) + total_norm = total_norm ** (1.0 / norm_type) + return total_norm diff --git a/data_utils.py b/data_utils.py index 12eadccb4..45ac34ba7 100644 --- a/data_utils.py +++ b/data_utils.py @@ -16,9 +16,9 @@ class TextAudioSpeakerLoader(torch.utils.data.Dataset): """ - 1) loads audio, speaker_id, text pairs - 2) normalizes text and converts them to sequences of integers - 3) computes spectrograms from audio files. + 1) loads audio, speaker_id, text pairs + 2) normalizes text and converts them to sequences of integers + 3) computes spectrograms from audio files. """ def __init__(self, audiopaths_sid_text, hparams): @@ -32,7 +32,9 @@ def __init__(self, audiopaths_sid_text, hparams): self.spk_map = hparams.spk2id self.hparams = hparams - self.use_mel_spec_posterior = getattr(hparams, "use_mel_posterior_encoder", False) + self.use_mel_spec_posterior = getattr( + hparams, "use_mel_posterior_encoder", False + ) if self.use_mel_spec_posterior: self.n_mel_channels = getattr(hparams, "n_mel_channels", 80) @@ -58,17 +60,26 @@ def _filter(self): lengths = [] skipped = 0 logger.info("Init dataset...") - for _id, spk, language, text, phones, tone, word2ph in tqdm(self.audiopaths_sid_text): - audiopath = f'{_id}' + for _id, spk, language, text, phones, tone, word2ph in tqdm( + self.audiopaths_sid_text + ): + audiopath = f"{_id}" if self.min_text_len <= len(phones) and len(phones) <= self.max_text_len: phones = phones.split(" ") tone = [int(i) for i in tone.split(" ")] word2ph = [int(i) for i in word2ph.split(" ")] - audiopaths_sid_text_new.append([audiopath, spk, language, text, phones, tone, word2ph]) + audiopaths_sid_text_new.append( + [audiopath, spk, language, text, phones, tone, word2ph] + ) lengths.append(os.path.getsize(audiopath) // (2 * self.hop_length)) else: skipped += 1 - logger.info("skipped: " + str(skipped) + ", total: " + str(len(self.audiopaths_sid_text))) + logger.info( + "skipped: " + + str(skipped) + + ", total: " + + str(len(self.audiopaths_sid_text)) + ) self.audiopaths_sid_text = audiopaths_sid_text_new self.lengths = lengths @@ -76,7 +87,9 @@ def get_audio_text_speaker_pair(self, audiopath_sid_text): # separate filename, speaker_id and text audiopath, sid, language, text, phones, tone, word2ph = audiopath_sid_text - bert, ja_bert, phones, tone, language = self.get_text(text, word2ph, phones, tone, language, audiopath) + bert, ja_bert, phones, tone, language = self.get_text( + text, word2ph, phones, tone, language, audiopath + ) spec, wav = self.get_audio(audiopath) sid = torch.LongTensor([int(self.spk_map[sid])]) @@ -85,8 +98,11 @@ def get_audio_text_speaker_pair(self, audiopath_sid_text): def get_audio(self, filename): audio, sampling_rate = load_wav_to_torch(filename) if sampling_rate != self.sampling_rate: - raise ValueError("{} {} SR doesn't match target {} SR".format( - sampling_rate, self.sampling_rate)) + raise ValueError( + "{} {} SR doesn't match target {} SR".format( + sampling_rate, self.sampling_rate + ) + ) audio_norm = audio / self.max_wav_value audio_norm = audio_norm.unsqueeze(0) spec_filename = filename.replace(".wav", ".spec.pt") @@ -96,13 +112,26 @@ def get_audio(self, filename): spec = torch.load(spec_filename) except: if self.use_mel_spec_posterior: - spec = mel_spectrogram_torch(audio_norm, self.filter_length, - self.n_mel_channels, self.sampling_rate, self.hop_length, - self.win_length, self.hparams.mel_fmin, self.hparams.mel_fmax, center=False) + spec = mel_spectrogram_torch( + audio_norm, + self.filter_length, + self.n_mel_channels, + self.sampling_rate, + self.hop_length, + self.win_length, + self.hparams.mel_fmin, + self.hparams.mel_fmax, + center=False, + ) else: - spec = spectrogram_torch(audio_norm, self.filter_length, - self.sampling_rate, self.hop_length, self.win_length, - center=False) + spec = spectrogram_torch( + audio_norm, + self.filter_length, + self.sampling_rate, + self.hop_length, + self.win_length, + center=False, + ) spec = torch.squeeze(spec, 0) torch.save(spec, spec_filename) return spec, audio_norm @@ -125,17 +154,29 @@ def get_text(self, text, word2ph, phone, tone, language_str, wav_path): torch.save(bert, bert_path) assert bert.shape[-1] == len(phone), phone - if language_str=='ZH': + if language_str == "ZH": bert = bert ja_bert = torch.zeros(768, len(phone)) - elif language_str=="JA": + elif language_str == "JA": ja_bert = bert bert = torch.zeros(1024, len(phone)) else: bert = torch.zeros(1024, len(phone)) ja_bert = torch.zeros(768, len(phone)) assert bert.shape[-1] == len(phone), ( - bert.shape, len(phone), sum(word2ph), p1, p2, t1, t2, pold, pold2, word2ph, text, w2pho) + bert.shape, + len(phone), + sum(word2ph), + p1, + p2, + t1, + t2, + pold, + pold2, + word2ph, + text, + w2pho, + ) phone = torch.LongTensor(phone) tone = torch.LongTensor(tone) language = torch.LongTensor(language) @@ -152,9 +193,8 @@ def __len__(self): return len(self.audiopaths_sid_text) -class TextAudioSpeakerCollate(): - """ Zero-pads model inputs and targets - """ +class TextAudioSpeakerCollate: + """Zero-pads model inputs and targets""" def __init__(self, return_ids=False): self.return_ids = return_ids @@ -167,8 +207,8 @@ def __call__(self, batch): """ # Right zero-pad all one-hot text sequences to max input length _, ids_sorted_decreasing = torch.sort( - torch.LongTensor([x[1].size(1) for x in batch]), - dim=0, descending=True) + torch.LongTensor([x[1].size(1) for x in batch]), dim=0, descending=True + ) max_text_len = max([len(x[0]) for x in batch]) max_spec_len = max([x[1].size(1) for x in batch]) @@ -198,32 +238,44 @@ def __call__(self, batch): row = batch[ids_sorted_decreasing[i]] text = row[0] - text_padded[i, :text.size(0)] = text + text_padded[i, : text.size(0)] = text text_lengths[i] = text.size(0) spec = row[1] - spec_padded[i, :, :spec.size(1)] = spec + spec_padded[i, :, : spec.size(1)] = spec spec_lengths[i] = spec.size(1) wav = row[2] - wav_padded[i, :, :wav.size(1)] = wav + wav_padded[i, :, : wav.size(1)] = wav wav_lengths[i] = wav.size(1) sid[i] = row[3] tone = row[4] - tone_padded[i, :tone.size(0)] = tone + tone_padded[i, : tone.size(0)] = tone language = row[5] - language_padded[i, :language.size(0)] = language + language_padded[i, : language.size(0)] = language bert = row[6] - bert_padded[i, :, :bert.size(1)] = bert + bert_padded[i, :, : bert.size(1)] = bert ja_bert = row[7] - ja_bert_padded[i, :, :ja_bert.size(1)] = ja_bert - - return text_padded, text_lengths, spec_padded, spec_lengths, wav_padded, wav_lengths, sid, tone_padded, language_padded, bert_padded, ja_bert_padded + ja_bert_padded[i, :, : ja_bert.size(1)] = ja_bert + + return ( + text_padded, + text_lengths, + spec_padded, + spec_lengths, + wav_padded, + wav_lengths, + sid, + tone_padded, + language_padded, + bert_padded, + ja_bert_padded, + ) class DistributedBucketSampler(torch.utils.data.distributed.DistributedSampler): @@ -236,7 +288,15 @@ class DistributedBucketSampler(torch.utils.data.distributed.DistributedSampler): Ex) boundaries = [b1, b2, b3] -> any x s.t. length(x) <= b1 or length(x) > b3 are discarded. """ - def __init__(self, dataset, batch_size, boundaries, num_replicas=None, rank=None, shuffle=True): + def __init__( + self, + dataset, + batch_size, + boundaries, + num_replicas=None, + rank=None, + shuffle=True, + ): super().__init__(dataset, num_replicas=num_replicas, rank=rank, shuffle=shuffle) self.lengths = dataset.lengths self.batch_size = batch_size @@ -254,7 +314,7 @@ def _create_buckets(self): if idx_bucket != -1: buckets[idx_bucket].append(i) - try: + try: for i in range(len(buckets) - 1, 0, -1): if len(buckets[i]) == 0: buckets.pop(i) @@ -262,7 +322,7 @@ def _create_buckets(self): assert all(len(bucket) > 0 for bucket in buckets) # When one bucket is not traversed except Exception as e: - print('Bucket warning ', e) + print("Bucket warning ", e) for i in range(len(buckets) - 1, -1, -1): if len(buckets[i]) == 0: buckets.pop(i) @@ -272,7 +332,9 @@ def _create_buckets(self): for i in range(len(buckets)): len_bucket = len(buckets[i]) total_batch_size = self.num_replicas * self.batch_size - rem = (total_batch_size - (len_bucket % total_batch_size)) % total_batch_size + rem = ( + total_batch_size - (len_bucket % total_batch_size) + ) % total_batch_size num_samples_per_bucket.append(len_bucket + rem) return buckets, num_samples_per_bucket @@ -293,21 +355,30 @@ def __iter__(self): for i in range(len(self.buckets)): bucket = self.buckets[i] len_bucket = len(bucket) - if (len_bucket == 0): + if len_bucket == 0: continue ids_bucket = indices[i] num_samples_bucket = self.num_samples_per_bucket[i] # add extra samples to make it evenly divisible rem = num_samples_bucket - len_bucket - ids_bucket = ids_bucket + ids_bucket * (rem // len_bucket) + ids_bucket[:(rem % len_bucket)] + ids_bucket = ( + ids_bucket + + ids_bucket * (rem // len_bucket) + + ids_bucket[: (rem % len_bucket)] + ) # subsample - ids_bucket = ids_bucket[self.rank::self.num_replicas] + ids_bucket = ids_bucket[self.rank :: self.num_replicas] # batching for j in range(len(ids_bucket) // self.batch_size): - batch = [bucket[idx] for idx in ids_bucket[j * self.batch_size:(j + 1) * self.batch_size]] + batch = [ + bucket[idx] + for idx in ids_bucket[ + j * self.batch_size : (j + 1) * self.batch_size + ] + ] batches.append(batch) if self.shuffle: diff --git a/losses.py b/losses.py index fb22a0e83..628a4fcf1 100644 --- a/losses.py +++ b/losses.py @@ -1,61 +1,61 @@ -import torch +import torch from torch.nn import functional as F import commons def feature_loss(fmap_r, fmap_g): - loss = 0 - for dr, dg in zip(fmap_r, fmap_g): - for rl, gl in zip(dr, dg): - rl = rl.float().detach() - gl = gl.float() - loss += torch.mean(torch.abs(rl - gl)) + loss = 0 + for dr, dg in zip(fmap_r, fmap_g): + for rl, gl in zip(dr, dg): + rl = rl.float().detach() + gl = gl.float() + loss += torch.mean(torch.abs(rl - gl)) - return loss * 2 + return loss * 2 def discriminator_loss(disc_real_outputs, disc_generated_outputs): - loss = 0 - r_losses = [] - g_losses = [] - for dr, dg in zip(disc_real_outputs, disc_generated_outputs): - dr = dr.float() - dg = dg.float() - r_loss = torch.mean((1-dr)**2) - g_loss = torch.mean(dg**2) - loss += (r_loss + g_loss) - r_losses.append(r_loss.item()) - g_losses.append(g_loss.item()) + loss = 0 + r_losses = [] + g_losses = [] + for dr, dg in zip(disc_real_outputs, disc_generated_outputs): + dr = dr.float() + dg = dg.float() + r_loss = torch.mean((1 - dr) ** 2) + g_loss = torch.mean(dg**2) + loss += r_loss + g_loss + r_losses.append(r_loss.item()) + g_losses.append(g_loss.item()) - return loss, r_losses, g_losses + return loss, r_losses, g_losses def generator_loss(disc_outputs): - loss = 0 - gen_losses = [] - for dg in disc_outputs: - dg = dg.float() - l = torch.mean((1-dg)**2) - gen_losses.append(l) - loss += l + loss = 0 + gen_losses = [] + for dg in disc_outputs: + dg = dg.float() + l = torch.mean((1 - dg) ** 2) + gen_losses.append(l) + loss += l - return loss, gen_losses + return loss, gen_losses def kl_loss(z_p, logs_q, m_p, logs_p, z_mask): - """ - z_p, logs_q: [b, h, t_t] - m_p, logs_p: [b, h, t_t] - """ - z_p = z_p.float() - logs_q = logs_q.float() - m_p = m_p.float() - logs_p = logs_p.float() - z_mask = z_mask.float() - - kl = logs_p - logs_q - 0.5 - kl += 0.5 * ((z_p - m_p)**2) * torch.exp(-2. * logs_p) - kl = torch.sum(kl * z_mask) - l = kl / torch.sum(z_mask) - return l + """ + z_p, logs_q: [b, h, t_t] + m_p, logs_p: [b, h, t_t] + """ + z_p = z_p.float() + logs_q = logs_q.float() + m_p = m_p.float() + logs_p = logs_p.float() + z_mask = z_mask.float() + + kl = logs_p - logs_q - 0.5 + kl += 0.5 * ((z_p - m_p) ** 2) * torch.exp(-2.0 * logs_p) + kl = torch.sum(kl * z_mask) + l = kl / torch.sum(z_mask) + return l diff --git a/mel_processing.py b/mel_processing.py index 50435ecf8..d6f291527 100644 --- a/mel_processing.py +++ b/mel_processing.py @@ -49,22 +49,38 @@ def spectral_de_normalize_torch(magnitudes): def spectrogram_torch(y, n_fft, sampling_rate, hop_size, win_size, center=False): - if torch.min(y) < -1.: - print('min value is ', torch.min(y)) - if torch.max(y) > 1.: - print('max value is ', torch.max(y)) + if torch.min(y) < -1.0: + print("min value is ", torch.min(y)) + if torch.max(y) > 1.0: + print("max value is ", torch.max(y)) global hann_window - dtype_device = str(y.dtype) + '_' + str(y.device) - wnsize_dtype_device = str(win_size) + '_' + dtype_device + dtype_device = str(y.dtype) + "_" + str(y.device) + wnsize_dtype_device = str(win_size) + "_" + dtype_device if wnsize_dtype_device not in hann_window: - hann_window[wnsize_dtype_device] = torch.hann_window(win_size).to(dtype=y.dtype, device=y.device) - - y = torch.nn.functional.pad(y.unsqueeze(1), (int((n_fft-hop_size)/2), int((n_fft-hop_size)/2)), mode='reflect') + hann_window[wnsize_dtype_device] = torch.hann_window(win_size).to( + dtype=y.dtype, device=y.device + ) + + y = torch.nn.functional.pad( + y.unsqueeze(1), + (int((n_fft - hop_size) / 2), int((n_fft - hop_size) / 2)), + mode="reflect", + ) y = y.squeeze(1) - spec = torch.stft(y, n_fft, hop_length=hop_size, win_length=win_size, window=hann_window[wnsize_dtype_device], - center=center, pad_mode='reflect', normalized=False, onesided=True, return_complex=False) + spec = torch.stft( + y, + n_fft, + hop_length=hop_size, + win_length=win_size, + window=hann_window[wnsize_dtype_device], + center=center, + pad_mode="reflect", + normalized=False, + onesided=True, + return_complex=False, + ) spec = torch.sqrt(spec.pow(2).sum(-1) + 1e-6) return spec @@ -72,37 +88,59 @@ def spectrogram_torch(y, n_fft, sampling_rate, hop_size, win_size, center=False) def spec_to_mel_torch(spec, n_fft, num_mels, sampling_rate, fmin, fmax): global mel_basis - dtype_device = str(spec.dtype) + '_' + str(spec.device) - fmax_dtype_device = str(fmax) + '_' + dtype_device + dtype_device = str(spec.dtype) + "_" + str(spec.device) + fmax_dtype_device = str(fmax) + "_" + dtype_device if fmax_dtype_device not in mel_basis: mel = librosa_mel_fn(sampling_rate, n_fft, num_mels, fmin, fmax) - mel_basis[fmax_dtype_device] = torch.from_numpy(mel).to(dtype=spec.dtype, device=spec.device) + mel_basis[fmax_dtype_device] = torch.from_numpy(mel).to( + dtype=spec.dtype, device=spec.device + ) spec = torch.matmul(mel_basis[fmax_dtype_device], spec) spec = spectral_normalize_torch(spec) return spec -def mel_spectrogram_torch(y, n_fft, num_mels, sampling_rate, hop_size, win_size, fmin, fmax, center=False): - if torch.min(y) < -1.: - print('min value is ', torch.min(y)) - if torch.max(y) > 1.: - print('max value is ', torch.max(y)) +def mel_spectrogram_torch( + y, n_fft, num_mels, sampling_rate, hop_size, win_size, fmin, fmax, center=False +): + if torch.min(y) < -1.0: + print("min value is ", torch.min(y)) + if torch.max(y) > 1.0: + print("max value is ", torch.max(y)) global mel_basis, hann_window - dtype_device = str(y.dtype) + '_' + str(y.device) - fmax_dtype_device = str(fmax) + '_' + dtype_device - wnsize_dtype_device = str(win_size) + '_' + dtype_device + dtype_device = str(y.dtype) + "_" + str(y.device) + fmax_dtype_device = str(fmax) + "_" + dtype_device + wnsize_dtype_device = str(win_size) + "_" + dtype_device if fmax_dtype_device not in mel_basis: mel = librosa_mel_fn(sampling_rate, n_fft, num_mels, fmin, fmax) - mel_basis[fmax_dtype_device] = torch.from_numpy(mel).to(dtype=y.dtype, device=y.device) + mel_basis[fmax_dtype_device] = torch.from_numpy(mel).to( + dtype=y.dtype, device=y.device + ) if wnsize_dtype_device not in hann_window: - hann_window[wnsize_dtype_device] = torch.hann_window(win_size).to(dtype=y.dtype, device=y.device) - - y = torch.nn.functional.pad(y.unsqueeze(1), (int((n_fft-hop_size)/2), int((n_fft-hop_size)/2)), mode='reflect') + hann_window[wnsize_dtype_device] = torch.hann_window(win_size).to( + dtype=y.dtype, device=y.device + ) + + y = torch.nn.functional.pad( + y.unsqueeze(1), + (int((n_fft - hop_size) / 2), int((n_fft - hop_size) / 2)), + mode="reflect", + ) y = y.squeeze(1) - spec = torch.stft(y, n_fft, hop_length=hop_size, win_length=win_size, window=hann_window[wnsize_dtype_device], - center=center, pad_mode='reflect', normalized=False, onesided=True, return_complex=False) + spec = torch.stft( + y, + n_fft, + hop_length=hop_size, + win_length=win_size, + window=hann_window[wnsize_dtype_device], + center=center, + pad_mode="reflect", + normalized=False, + onesided=True, + return_complex=False, + ) spec = torch.sqrt(spec.pow(2).sum(-1) + 1e-6) diff --git a/models.py b/models.py index 14dd9bbed..dd9e0c087 100644 --- a/models.py +++ b/models.py @@ -104,7 +104,6 @@ def __init__( gin_channels=0, share_parameter=False, ): - super().__init__() self.channels = channels self.hidden_channels = hidden_channels @@ -685,7 +684,6 @@ class ReferenceEncoder(nn.Module): """ def __init__(self, spec_channels, gin_channels=0): - super().__init__() self.spec_channels = spec_channels ref_enc_filters = [32, 32, 64, 64, 128, 128] @@ -770,7 +768,6 @@ def __init__( use_transformer_flow=True, **kwargs ): - super().__init__() self.n_vocab = n_vocab self.spec_channels = spec_channels diff --git a/modules.py b/modules.py index 92e0f32a5..4953fb3de 100644 --- a/modules.py +++ b/modules.py @@ -16,193 +16,284 @@ LRELU_SLOPE = 0.1 + class LayerNorm(nn.Module): - def __init__(self, channels, eps=1e-5): - super().__init__() - self.channels = channels - self.eps = eps - - self.gamma = nn.Parameter(torch.ones(channels)) - self.beta = nn.Parameter(torch.zeros(channels)) - - def forward(self, x): - x = x.transpose(1, -1) - x = F.layer_norm(x, (self.channels,), self.gamma, self.beta, self.eps) - return x.transpose(1, -1) - + def __init__(self, channels, eps=1e-5): + super().__init__() + self.channels = channels + self.eps = eps + + self.gamma = nn.Parameter(torch.ones(channels)) + self.beta = nn.Parameter(torch.zeros(channels)) + + def forward(self, x): + x = x.transpose(1, -1) + x = F.layer_norm(x, (self.channels,), self.gamma, self.beta, self.eps) + return x.transpose(1, -1) + + class ConvReluNorm(nn.Module): - def __init__(self, in_channels, hidden_channels, out_channels, kernel_size, n_layers, p_dropout): - super().__init__() - self.in_channels = in_channels - self.hidden_channels = hidden_channels - self.out_channels = out_channels - self.kernel_size = kernel_size - self.n_layers = n_layers - self.p_dropout = p_dropout - assert n_layers > 1, "Number of layers should be larger than 0." - - self.conv_layers = nn.ModuleList() - self.norm_layers = nn.ModuleList() - self.conv_layers.append(nn.Conv1d(in_channels, hidden_channels, kernel_size, padding=kernel_size//2)) - self.norm_layers.append(LayerNorm(hidden_channels)) - self.relu_drop = nn.Sequential( - nn.ReLU(), - nn.Dropout(p_dropout)) - for _ in range(n_layers-1): - self.conv_layers.append(nn.Conv1d(hidden_channels, hidden_channels, kernel_size, padding=kernel_size//2)) - self.norm_layers.append(LayerNorm(hidden_channels)) - self.proj = nn.Conv1d(hidden_channels, out_channels, 1) - self.proj.weight.data.zero_() - self.proj.bias.data.zero_() - - def forward(self, x, x_mask): - x_org = x - for i in range(self.n_layers): - x = self.conv_layers[i](x * x_mask) - x = self.norm_layers[i](x) - x = self.relu_drop(x) - x = x_org + self.proj(x) - return x * x_mask + def __init__( + self, + in_channels, + hidden_channels, + out_channels, + kernel_size, + n_layers, + p_dropout, + ): + super().__init__() + self.in_channels = in_channels + self.hidden_channels = hidden_channels + self.out_channels = out_channels + self.kernel_size = kernel_size + self.n_layers = n_layers + self.p_dropout = p_dropout + assert n_layers > 1, "Number of layers should be larger than 0." + + self.conv_layers = nn.ModuleList() + self.norm_layers = nn.ModuleList() + self.conv_layers.append( + nn.Conv1d( + in_channels, hidden_channels, kernel_size, padding=kernel_size // 2 + ) + ) + self.norm_layers.append(LayerNorm(hidden_channels)) + self.relu_drop = nn.Sequential(nn.ReLU(), nn.Dropout(p_dropout)) + for _ in range(n_layers - 1): + self.conv_layers.append( + nn.Conv1d( + hidden_channels, + hidden_channels, + kernel_size, + padding=kernel_size // 2, + ) + ) + self.norm_layers.append(LayerNorm(hidden_channels)) + self.proj = nn.Conv1d(hidden_channels, out_channels, 1) + self.proj.weight.data.zero_() + self.proj.bias.data.zero_() + + def forward(self, x, x_mask): + x_org = x + for i in range(self.n_layers): + x = self.conv_layers[i](x * x_mask) + x = self.norm_layers[i](x) + x = self.relu_drop(x) + x = x_org + self.proj(x) + return x * x_mask class DDSConv(nn.Module): - """ - Dialted and Depth-Separable Convolution - """ - def __init__(self, channels, kernel_size, n_layers, p_dropout=0.): - super().__init__() - self.channels = channels - self.kernel_size = kernel_size - self.n_layers = n_layers - self.p_dropout = p_dropout - - self.drop = nn.Dropout(p_dropout) - self.convs_sep = nn.ModuleList() - self.convs_1x1 = nn.ModuleList() - self.norms_1 = nn.ModuleList() - self.norms_2 = nn.ModuleList() - for i in range(n_layers): - dilation = kernel_size ** i - padding = (kernel_size * dilation - dilation) // 2 - self.convs_sep.append(nn.Conv1d(channels, channels, kernel_size, - groups=channels, dilation=dilation, padding=padding - )) - self.convs_1x1.append(nn.Conv1d(channels, channels, 1)) - self.norms_1.append(LayerNorm(channels)) - self.norms_2.append(LayerNorm(channels)) - - def forward(self, x, x_mask, g=None): - if g is not None: - x = x + g - for i in range(self.n_layers): - y = self.convs_sep[i](x * x_mask) - y = self.norms_1[i](y) - y = F.gelu(y) - y = self.convs_1x1[i](y) - y = self.norms_2[i](y) - y = F.gelu(y) - y = self.drop(y) - x = x + y - return x * x_mask + """ + Dialted and Depth-Separable Convolution + """ + + def __init__(self, channels, kernel_size, n_layers, p_dropout=0.0): + super().__init__() + self.channels = channels + self.kernel_size = kernel_size + self.n_layers = n_layers + self.p_dropout = p_dropout + + self.drop = nn.Dropout(p_dropout) + self.convs_sep = nn.ModuleList() + self.convs_1x1 = nn.ModuleList() + self.norms_1 = nn.ModuleList() + self.norms_2 = nn.ModuleList() + for i in range(n_layers): + dilation = kernel_size**i + padding = (kernel_size * dilation - dilation) // 2 + self.convs_sep.append( + nn.Conv1d( + channels, + channels, + kernel_size, + groups=channels, + dilation=dilation, + padding=padding, + ) + ) + self.convs_1x1.append(nn.Conv1d(channels, channels, 1)) + self.norms_1.append(LayerNorm(channels)) + self.norms_2.append(LayerNorm(channels)) + + def forward(self, x, x_mask, g=None): + if g is not None: + x = x + g + for i in range(self.n_layers): + y = self.convs_sep[i](x * x_mask) + y = self.norms_1[i](y) + y = F.gelu(y) + y = self.convs_1x1[i](y) + y = self.norms_2[i](y) + y = F.gelu(y) + y = self.drop(y) + x = x + y + return x * x_mask class WN(torch.nn.Module): - def __init__(self, hidden_channels, kernel_size, dilation_rate, n_layers, gin_channels=0, p_dropout=0): - super(WN, self).__init__() - assert(kernel_size % 2 == 1) - self.hidden_channels =hidden_channels - self.kernel_size = kernel_size, - self.dilation_rate = dilation_rate - self.n_layers = n_layers - self.gin_channels = gin_channels - self.p_dropout = p_dropout - - self.in_layers = torch.nn.ModuleList() - self.res_skip_layers = torch.nn.ModuleList() - self.drop = nn.Dropout(p_dropout) - - if gin_channels != 0: - cond_layer = torch.nn.Conv1d(gin_channels, 2*hidden_channels*n_layers, 1) - self.cond_layer = torch.nn.utils.weight_norm(cond_layer, name='weight') - - for i in range(n_layers): - dilation = dilation_rate ** i - padding = int((kernel_size * dilation - dilation) / 2) - in_layer = torch.nn.Conv1d(hidden_channels, 2*hidden_channels, kernel_size, - dilation=dilation, padding=padding) - in_layer = torch.nn.utils.weight_norm(in_layer, name='weight') - self.in_layers.append(in_layer) - - # last one is not necessary - if i < n_layers - 1: - res_skip_channels = 2 * hidden_channels - else: - res_skip_channels = hidden_channels - - res_skip_layer = torch.nn.Conv1d(hidden_channels, res_skip_channels, 1) - res_skip_layer = torch.nn.utils.weight_norm(res_skip_layer, name='weight') - self.res_skip_layers.append(res_skip_layer) - - def forward(self, x, x_mask, g=None, **kwargs): - output = torch.zeros_like(x) - n_channels_tensor = torch.IntTensor([self.hidden_channels]) - - if g is not None: - g = self.cond_layer(g) - - for i in range(self.n_layers): - x_in = self.in_layers[i](x) - if g is not None: - cond_offset = i * 2 * self.hidden_channels - g_l = g[:,cond_offset:cond_offset+2*self.hidden_channels,:] - else: - g_l = torch.zeros_like(x_in) - - acts = commons.fused_add_tanh_sigmoid_multiply( - x_in, - g_l, - n_channels_tensor) - acts = self.drop(acts) - - res_skip_acts = self.res_skip_layers[i](acts) - if i < self.n_layers - 1: - res_acts = res_skip_acts[:,:self.hidden_channels,:] - x = (x + res_acts) * x_mask - output = output + res_skip_acts[:,self.hidden_channels:,:] - else: - output = output + res_skip_acts - return output * x_mask - - def remove_weight_norm(self): - if self.gin_channels != 0: - torch.nn.utils.remove_weight_norm(self.cond_layer) - for l in self.in_layers: - torch.nn.utils.remove_weight_norm(l) - for l in self.res_skip_layers: - torch.nn.utils.remove_weight_norm(l) + def __init__( + self, + hidden_channels, + kernel_size, + dilation_rate, + n_layers, + gin_channels=0, + p_dropout=0, + ): + super(WN, self).__init__() + assert kernel_size % 2 == 1 + self.hidden_channels = hidden_channels + self.kernel_size = (kernel_size,) + self.dilation_rate = dilation_rate + self.n_layers = n_layers + self.gin_channels = gin_channels + self.p_dropout = p_dropout + + self.in_layers = torch.nn.ModuleList() + self.res_skip_layers = torch.nn.ModuleList() + self.drop = nn.Dropout(p_dropout) + + if gin_channels != 0: + cond_layer = torch.nn.Conv1d( + gin_channels, 2 * hidden_channels * n_layers, 1 + ) + self.cond_layer = torch.nn.utils.weight_norm(cond_layer, name="weight") + + for i in range(n_layers): + dilation = dilation_rate**i + padding = int((kernel_size * dilation - dilation) / 2) + in_layer = torch.nn.Conv1d( + hidden_channels, + 2 * hidden_channels, + kernel_size, + dilation=dilation, + padding=padding, + ) + in_layer = torch.nn.utils.weight_norm(in_layer, name="weight") + self.in_layers.append(in_layer) + + # last one is not necessary + if i < n_layers - 1: + res_skip_channels = 2 * hidden_channels + else: + res_skip_channels = hidden_channels + + res_skip_layer = torch.nn.Conv1d(hidden_channels, res_skip_channels, 1) + res_skip_layer = torch.nn.utils.weight_norm(res_skip_layer, name="weight") + self.res_skip_layers.append(res_skip_layer) + + def forward(self, x, x_mask, g=None, **kwargs): + output = torch.zeros_like(x) + n_channels_tensor = torch.IntTensor([self.hidden_channels]) + + if g is not None: + g = self.cond_layer(g) + + for i in range(self.n_layers): + x_in = self.in_layers[i](x) + if g is not None: + cond_offset = i * 2 * self.hidden_channels + g_l = g[:, cond_offset : cond_offset + 2 * self.hidden_channels, :] + else: + g_l = torch.zeros_like(x_in) + + acts = commons.fused_add_tanh_sigmoid_multiply(x_in, g_l, n_channels_tensor) + acts = self.drop(acts) + + res_skip_acts = self.res_skip_layers[i](acts) + if i < self.n_layers - 1: + res_acts = res_skip_acts[:, : self.hidden_channels, :] + x = (x + res_acts) * x_mask + output = output + res_skip_acts[:, self.hidden_channels :, :] + else: + output = output + res_skip_acts + return output * x_mask + + def remove_weight_norm(self): + if self.gin_channels != 0: + torch.nn.utils.remove_weight_norm(self.cond_layer) + for l in self.in_layers: + torch.nn.utils.remove_weight_norm(l) + for l in self.res_skip_layers: + torch.nn.utils.remove_weight_norm(l) class ResBlock1(torch.nn.Module): def __init__(self, channels, kernel_size=3, dilation=(1, 3, 5)): super(ResBlock1, self).__init__() - self.convs1 = nn.ModuleList([ - weight_norm(Conv1d(channels, channels, kernel_size, 1, dilation=dilation[0], - padding=get_padding(kernel_size, dilation[0]))), - weight_norm(Conv1d(channels, channels, kernel_size, 1, dilation=dilation[1], - padding=get_padding(kernel_size, dilation[1]))), - weight_norm(Conv1d(channels, channels, kernel_size, 1, dilation=dilation[2], - padding=get_padding(kernel_size, dilation[2]))) - ]) + self.convs1 = nn.ModuleList( + [ + weight_norm( + Conv1d( + channels, + channels, + kernel_size, + 1, + dilation=dilation[0], + padding=get_padding(kernel_size, dilation[0]), + ) + ), + weight_norm( + Conv1d( + channels, + channels, + kernel_size, + 1, + dilation=dilation[1], + padding=get_padding(kernel_size, dilation[1]), + ) + ), + weight_norm( + Conv1d( + channels, + channels, + kernel_size, + 1, + dilation=dilation[2], + padding=get_padding(kernel_size, dilation[2]), + ) + ), + ] + ) self.convs1.apply(init_weights) - self.convs2 = nn.ModuleList([ - weight_norm(Conv1d(channels, channels, kernel_size, 1, dilation=1, - padding=get_padding(kernel_size, 1))), - weight_norm(Conv1d(channels, channels, kernel_size, 1, dilation=1, - padding=get_padding(kernel_size, 1))), - weight_norm(Conv1d(channels, channels, kernel_size, 1, dilation=1, - padding=get_padding(kernel_size, 1))) - ]) + self.convs2 = nn.ModuleList( + [ + weight_norm( + Conv1d( + channels, + channels, + kernel_size, + 1, + dilation=1, + padding=get_padding(kernel_size, 1), + ) + ), + weight_norm( + Conv1d( + channels, + channels, + kernel_size, + 1, + dilation=1, + padding=get_padding(kernel_size, 1), + ) + ), + weight_norm( + Conv1d( + channels, + channels, + kernel_size, + 1, + dilation=1, + padding=get_padding(kernel_size, 1), + ) + ), + ] + ) self.convs2.apply(init_weights) def forward(self, x, x_mask=None): @@ -230,12 +321,30 @@ def remove_weight_norm(self): class ResBlock2(torch.nn.Module): def __init__(self, channels, kernel_size=3, dilation=(1, 3)): super(ResBlock2, self).__init__() - self.convs = nn.ModuleList([ - weight_norm(Conv1d(channels, channels, kernel_size, 1, dilation=dilation[0], - padding=get_padding(kernel_size, dilation[0]))), - weight_norm(Conv1d(channels, channels, kernel_size, 1, dilation=dilation[1], - padding=get_padding(kernel_size, dilation[1]))) - ]) + self.convs = nn.ModuleList( + [ + weight_norm( + Conv1d( + channels, + channels, + kernel_size, + 1, + dilation=dilation[0], + padding=get_padding(kernel_size, dilation[0]), + ) + ), + weight_norm( + Conv1d( + channels, + channels, + kernel_size, + 1, + dilation=dilation[1], + padding=get_padding(kernel_size, dilation[1]), + ) + ), + ] + ) self.convs.apply(init_weights) def forward(self, x, x_mask=None): @@ -255,198 +364,237 @@ def remove_weight_norm(self): class Log(nn.Module): - def forward(self, x, x_mask, reverse=False, **kwargs): - if not reverse: - y = torch.log(torch.clamp_min(x, 1e-5)) * x_mask - logdet = torch.sum(-y, [1, 2]) - return y, logdet - else: - x = torch.exp(x) * x_mask - return x - + def forward(self, x, x_mask, reverse=False, **kwargs): + if not reverse: + y = torch.log(torch.clamp_min(x, 1e-5)) * x_mask + logdet = torch.sum(-y, [1, 2]) + return y, logdet + else: + x = torch.exp(x) * x_mask + return x + class Flip(nn.Module): - def forward(self, x, *args, reverse=False, **kwargs): - x = torch.flip(x, [1]) - if not reverse: - logdet = torch.zeros(x.size(0)).to(dtype=x.dtype, device=x.device) - return x, logdet - else: - return x + def forward(self, x, *args, reverse=False, **kwargs): + x = torch.flip(x, [1]) + if not reverse: + logdet = torch.zeros(x.size(0)).to(dtype=x.dtype, device=x.device) + return x, logdet + else: + return x class ElementwiseAffine(nn.Module): - def __init__(self, channels): - super().__init__() - self.channels = channels - self.m = nn.Parameter(torch.zeros(channels,1)) - self.logs = nn.Parameter(torch.zeros(channels,1)) - - def forward(self, x, x_mask, reverse=False, **kwargs): - if not reverse: - y = self.m + torch.exp(self.logs) * x - y = y * x_mask - logdet = torch.sum(self.logs * x_mask, [1,2]) - return y, logdet - else: - x = (x - self.m) * torch.exp(-self.logs) * x_mask - return x + def __init__(self, channels): + super().__init__() + self.channels = channels + self.m = nn.Parameter(torch.zeros(channels, 1)) + self.logs = nn.Parameter(torch.zeros(channels, 1)) + + def forward(self, x, x_mask, reverse=False, **kwargs): + if not reverse: + y = self.m + torch.exp(self.logs) * x + y = y * x_mask + logdet = torch.sum(self.logs * x_mask, [1, 2]) + return y, logdet + else: + x = (x - self.m) * torch.exp(-self.logs) * x_mask + return x class ResidualCouplingLayer(nn.Module): - def __init__(self, - channels, - hidden_channels, - kernel_size, - dilation_rate, - n_layers, - p_dropout=0, - gin_channels=0, - mean_only=False): - assert channels % 2 == 0, "channels should be divisible by 2" - super().__init__() - self.channels = channels - self.hidden_channels = hidden_channels - self.kernel_size = kernel_size - self.dilation_rate = dilation_rate - self.n_layers = n_layers - self.half_channels = channels // 2 - self.mean_only = mean_only - - self.pre = nn.Conv1d(self.half_channels, hidden_channels, 1) - self.enc = WN(hidden_channels, kernel_size, dilation_rate, n_layers, p_dropout=p_dropout, gin_channels=gin_channels) - self.post = nn.Conv1d(hidden_channels, self.half_channels * (2 - mean_only), 1) - self.post.weight.data.zero_() - self.post.bias.data.zero_() - - def forward(self, x, x_mask, g=None, reverse=False): - x0, x1 = torch.split(x, [self.half_channels]*2, 1) - h = self.pre(x0) * x_mask - h = self.enc(h, x_mask, g=g) - stats = self.post(h) * x_mask - if not self.mean_only: - m, logs = torch.split(stats, [self.half_channels]*2, 1) - else: - m = stats - logs = torch.zeros_like(m) - - if not reverse: - x1 = m + x1 * torch.exp(logs) * x_mask - x = torch.cat([x0, x1], 1) - logdet = torch.sum(logs, [1,2]) - return x, logdet - else: - x1 = (x1 - m) * torch.exp(-logs) * x_mask - x = torch.cat([x0, x1], 1) - return x + def __init__( + self, + channels, + hidden_channels, + kernel_size, + dilation_rate, + n_layers, + p_dropout=0, + gin_channels=0, + mean_only=False, + ): + assert channels % 2 == 0, "channels should be divisible by 2" + super().__init__() + self.channels = channels + self.hidden_channels = hidden_channels + self.kernel_size = kernel_size + self.dilation_rate = dilation_rate + self.n_layers = n_layers + self.half_channels = channels // 2 + self.mean_only = mean_only + + self.pre = nn.Conv1d(self.half_channels, hidden_channels, 1) + self.enc = WN( + hidden_channels, + kernel_size, + dilation_rate, + n_layers, + p_dropout=p_dropout, + gin_channels=gin_channels, + ) + self.post = nn.Conv1d(hidden_channels, self.half_channels * (2 - mean_only), 1) + self.post.weight.data.zero_() + self.post.bias.data.zero_() + + def forward(self, x, x_mask, g=None, reverse=False): + x0, x1 = torch.split(x, [self.half_channels] * 2, 1) + h = self.pre(x0) * x_mask + h = self.enc(h, x_mask, g=g) + stats = self.post(h) * x_mask + if not self.mean_only: + m, logs = torch.split(stats, [self.half_channels] * 2, 1) + else: + m = stats + logs = torch.zeros_like(m) + + if not reverse: + x1 = m + x1 * torch.exp(logs) * x_mask + x = torch.cat([x0, x1], 1) + logdet = torch.sum(logs, [1, 2]) + return x, logdet + else: + x1 = (x1 - m) * torch.exp(-logs) * x_mask + x = torch.cat([x0, x1], 1) + return x class ConvFlow(nn.Module): - def __init__(self, in_channels, filter_channels, kernel_size, n_layers, num_bins=10, tail_bound=5.0): - super().__init__() - self.in_channels = in_channels - self.filter_channels = filter_channels - self.kernel_size = kernel_size - self.n_layers = n_layers - self.num_bins = num_bins - self.tail_bound = tail_bound - self.half_channels = in_channels // 2 - - self.pre = nn.Conv1d(self.half_channels, filter_channels, 1) - self.convs = DDSConv(filter_channels, kernel_size, n_layers, p_dropout=0.) - self.proj = nn.Conv1d(filter_channels, self.half_channels * (num_bins * 3 - 1), 1) - self.proj.weight.data.zero_() - self.proj.bias.data.zero_() - - def forward(self, x, x_mask, g=None, reverse=False): - x0, x1 = torch.split(x, [self.half_channels]*2, 1) - h = self.pre(x0) - h = self.convs(h, x_mask, g=g) - h = self.proj(h) * x_mask - - b, c, t = x0.shape - h = h.reshape(b, c, -1, t).permute(0, 1, 3, 2) # [b, cx?, t] -> [b, c, t, ?] - - unnormalized_widths = h[..., :self.num_bins] / math.sqrt(self.filter_channels) - unnormalized_heights = h[..., self.num_bins:2*self.num_bins] / math.sqrt(self.filter_channels) - unnormalized_derivatives = h[..., 2 * self.num_bins:] - - x1, logabsdet = piecewise_rational_quadratic_transform(x1, - unnormalized_widths, - unnormalized_heights, - unnormalized_derivatives, - inverse=reverse, - tails='linear', - tail_bound=self.tail_bound - ) - - x = torch.cat([x0, x1], 1) * x_mask - logdet = torch.sum(logabsdet * x_mask, [1,2]) - if not reverse: - return x, logdet - else: - return x + def __init__( + self, + in_channels, + filter_channels, + kernel_size, + n_layers, + num_bins=10, + tail_bound=5.0, + ): + super().__init__() + self.in_channels = in_channels + self.filter_channels = filter_channels + self.kernel_size = kernel_size + self.n_layers = n_layers + self.num_bins = num_bins + self.tail_bound = tail_bound + self.half_channels = in_channels // 2 + + self.pre = nn.Conv1d(self.half_channels, filter_channels, 1) + self.convs = DDSConv(filter_channels, kernel_size, n_layers, p_dropout=0.0) + self.proj = nn.Conv1d( + filter_channels, self.half_channels * (num_bins * 3 - 1), 1 + ) + self.proj.weight.data.zero_() + self.proj.bias.data.zero_() + + def forward(self, x, x_mask, g=None, reverse=False): + x0, x1 = torch.split(x, [self.half_channels] * 2, 1) + h = self.pre(x0) + h = self.convs(h, x_mask, g=g) + h = self.proj(h) * x_mask + + b, c, t = x0.shape + h = h.reshape(b, c, -1, t).permute(0, 1, 3, 2) # [b, cx?, t] -> [b, c, t, ?] + + unnormalized_widths = h[..., : self.num_bins] / math.sqrt(self.filter_channels) + unnormalized_heights = h[..., self.num_bins : 2 * self.num_bins] / math.sqrt( + self.filter_channels + ) + unnormalized_derivatives = h[..., 2 * self.num_bins :] + + x1, logabsdet = piecewise_rational_quadratic_transform( + x1, + unnormalized_widths, + unnormalized_heights, + unnormalized_derivatives, + inverse=reverse, + tails="linear", + tail_bound=self.tail_bound, + ) + + x = torch.cat([x0, x1], 1) * x_mask + logdet = torch.sum(logabsdet * x_mask, [1, 2]) + if not reverse: + return x, logdet + else: + return x + + class TransformerCouplingLayer(nn.Module): - def __init__(self, - channels, - hidden_channels, - kernel_size, - n_layers, - n_heads, - p_dropout=0, - filter_channels=0, - mean_only=False, - wn_sharing_parameter=None, - gin_channels = 0 - ): - assert channels % 2 == 0, "channels should be divisible by 2" - super().__init__() - self.channels = channels - self.hidden_channels = hidden_channels - self.kernel_size = kernel_size - self.n_layers = n_layers - self.half_channels = channels // 2 - self.mean_only = mean_only - - self.pre = nn.Conv1d(self.half_channels, hidden_channels, 1) - self.enc = Encoder(hidden_channels, filter_channels, n_heads, n_layers, kernel_size, p_dropout, isflow = True, gin_channels = gin_channels) if wn_sharing_parameter is None else wn_sharing_parameter - self.post = nn.Conv1d(hidden_channels, self.half_channels * (2 - mean_only), 1) - self.post.weight.data.zero_() - self.post.bias.data.zero_() - - def forward(self, x, x_mask, g=None, reverse=False): - x0, x1 = torch.split(x, [self.half_channels]*2, 1) - h = self.pre(x0) * x_mask - h = self.enc(h, x_mask, g=g) - stats = self.post(h) * x_mask - if not self.mean_only: - m, logs = torch.split(stats, [self.half_channels]*2, 1) - else: - m = stats - logs = torch.zeros_like(m) - - if not reverse: - x1 = m + x1 * torch.exp(logs) * x_mask - x = torch.cat([x0, x1], 1) - logdet = torch.sum(logs, [1,2]) - return x, logdet - else: - x1 = (x1 - m) * torch.exp(-logs) * x_mask - x = torch.cat([x0, x1], 1) - return x - - x1, logabsdet = piecewise_rational_quadratic_transform(x1, - unnormalized_widths, - unnormalized_heights, - unnormalized_derivatives, - inverse=reverse, - tails='linear', - tail_bound=self.tail_bound - ) - - x = torch.cat([x0, x1], 1) * x_mask - logdet = torch.sum(logabsdet * x_mask, [1,2]) - if not reverse: - return x, logdet - else: - return x + def __init__( + self, + channels, + hidden_channels, + kernel_size, + n_layers, + n_heads, + p_dropout=0, + filter_channels=0, + mean_only=False, + wn_sharing_parameter=None, + gin_channels=0, + ): + assert channels % 2 == 0, "channels should be divisible by 2" + super().__init__() + self.channels = channels + self.hidden_channels = hidden_channels + self.kernel_size = kernel_size + self.n_layers = n_layers + self.half_channels = channels // 2 + self.mean_only = mean_only + + self.pre = nn.Conv1d(self.half_channels, hidden_channels, 1) + self.enc = ( + Encoder( + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size, + p_dropout, + isflow=True, + gin_channels=gin_channels, + ) + if wn_sharing_parameter is None + else wn_sharing_parameter + ) + self.post = nn.Conv1d(hidden_channels, self.half_channels * (2 - mean_only), 1) + self.post.weight.data.zero_() + self.post.bias.data.zero_() + + def forward(self, x, x_mask, g=None, reverse=False): + x0, x1 = torch.split(x, [self.half_channels] * 2, 1) + h = self.pre(x0) * x_mask + h = self.enc(h, x_mask, g=g) + stats = self.post(h) * x_mask + if not self.mean_only: + m, logs = torch.split(stats, [self.half_channels] * 2, 1) + else: + m = stats + logs = torch.zeros_like(m) + + if not reverse: + x1 = m + x1 * torch.exp(logs) * x_mask + x = torch.cat([x0, x1], 1) + logdet = torch.sum(logs, [1, 2]) + return x, logdet + else: + x1 = (x1 - m) * torch.exp(-logs) * x_mask + x = torch.cat([x0, x1], 1) + return x + + x1, logabsdet = piecewise_rational_quadratic_transform( + x1, + unnormalized_widths, + unnormalized_heights, + unnormalized_derivatives, + inverse=reverse, + tails="linear", + tail_bound=self.tail_bound, + ) + + x = torch.cat([x0, x1], 1) * x_mask + logdet = torch.sum(logabsdet * x_mask, [1, 2]) + if not reverse: + return x, logdet + else: + return x diff --git a/monotonic_align/__init__.py b/monotonic_align/__init__.py index 73c47de69..15d8e60c4 100644 --- a/monotonic_align/__init__.py +++ b/monotonic_align/__init__.py @@ -3,13 +3,14 @@ from .core import maximum_path_jit + def maximum_path(neg_cent, mask): - device = neg_cent.device - dtype = neg_cent.dtype - neg_cent = neg_cent.data.cpu().numpy().astype(float32) - path = zeros(neg_cent.shape, dtype=int32) - - t_t_max = mask.sum(1)[:, 0].data.cpu().numpy().astype(int32) - t_s_max = mask.sum(2)[:, 0].data.cpu().numpy().astype(int32) - maximum_path_jit(path, neg_cent, t_t_max, t_s_max) - return from_numpy(path).to(device=device, dtype=dtype) + device = neg_cent.device + dtype = neg_cent.dtype + neg_cent = neg_cent.data.cpu().numpy().astype(float32) + path = zeros(neg_cent.shape, dtype=int32) + + t_t_max = mask.sum(1)[:, 0].data.cpu().numpy().astype(int32) + t_s_max = mask.sum(2)[:, 0].data.cpu().numpy().astype(int32) + maximum_path_jit(path, neg_cent, t_t_max, t_s_max) + return from_numpy(path).to(device=device, dtype=dtype) diff --git a/monotonic_align/core.py b/monotonic_align/core.py index 67d7884e9..ffa489da5 100644 --- a/monotonic_align/core.py +++ b/monotonic_align/core.py @@ -1,35 +1,46 @@ import numba -@numba.jit(numba.void(numba.int32[:,:,::1], numba.float32[:,:,::1], numba.int32[::1], numba.int32[::1]), nopython=True, nogil=True) +@numba.jit( + numba.void( + numba.int32[:, :, ::1], + numba.float32[:, :, ::1], + numba.int32[::1], + numba.int32[::1], + ), + nopython=True, + nogil=True, +) def maximum_path_jit(paths, values, t_ys, t_xs): - b = paths.shape[0] - max_neg_val=-1e9 - for i in range(int(b)): - path = paths[i] - value = values[i] - t_y = t_ys[i] - t_x = t_xs[i] + b = paths.shape[0] + max_neg_val = -1e9 + for i in range(int(b)): + path = paths[i] + value = values[i] + t_y = t_ys[i] + t_x = t_xs[i] - v_prev = v_cur = 0.0 - index = t_x - 1 + v_prev = v_cur = 0.0 + index = t_x - 1 - for y in range(t_y): - for x in range(max(0, t_x + y - t_y), min(t_x, y + 1)): - if x == y: - v_cur = max_neg_val - else: - v_cur = value[y-1, x] - if x == 0: - if y == 0: - v_prev = 0. - else: - v_prev = max_neg_val - else: - v_prev = value[y-1, x-1] - value[y, x] += max(v_prev, v_cur) + for y in range(t_y): + for x in range(max(0, t_x + y - t_y), min(t_x, y + 1)): + if x == y: + v_cur = max_neg_val + else: + v_cur = value[y - 1, x] + if x == 0: + if y == 0: + v_prev = 0.0 + else: + v_prev = max_neg_val + else: + v_prev = value[y - 1, x - 1] + value[y, x] += max(v_prev, v_cur) - for y in range(t_y - 1, -1, -1): - path[y, index] = 1 - if index != 0 and (index == y or value[y-1, index] < value[y-1, index-1]): - index = index - 1 + for y in range(t_y - 1, -1, -1): + path[y, index] = 1 + if index != 0 and ( + index == y or value[y - 1, index] < value[y - 1, index - 1] + ): + index = index - 1 diff --git a/preprocess_text.py b/preprocess_text.py index 4bb0e23e3..e827507ce 100644 --- a/preprocess_text.py +++ b/preprocess_text.py @@ -35,7 +35,6 @@ def main( max_val_total: int, clean: bool, ): - if cleaned_path is None: cleaned_path = transcription_path + ".cleaned" diff --git a/resample.py b/resample.py index 2ed168565..9f5d5c361 100644 --- a/resample.py +++ b/resample.py @@ -13,30 +13,38 @@ def process(item): spkdir, wav_name, args = item speaker = spkdir.replace("\\", "/").split("/")[-1] wav_path = os.path.join(args.in_dir, speaker, wav_name) - if os.path.exists(wav_path) and '.wav' in wav_path: + if os.path.exists(wav_path) and ".wav" in wav_path: os.makedirs(os.path.join(args.out_dir, speaker), exist_ok=True) wav, sr = librosa.load(wav_path, sr=args.sr) - soundfile.write( - os.path.join(args.out_dir, speaker, wav_name), - wav, - sr - ) - + soundfile.write(os.path.join(args.out_dir, speaker, wav_name), wav, sr) if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument("--sr", type=int, default=44100, help="sampling rate") - parser.add_argument("--in_dir", type=str, default="./raw", help="path to source dir") - parser.add_argument("--out_dir", type=str, default="./dataset", help="path to target dir") + parser.add_argument( + "--in_dir", type=str, default="./raw", help="path to source dir" + ) + parser.add_argument( + "--out_dir", type=str, default="./dataset", help="path to target dir" + ) args = parser.parse_args() # processs = 8 - processs = cpu_count()-2 if cpu_count() >4 else 1 + processs = cpu_count() - 2 if cpu_count() > 4 else 1 pool = Pool(processes=processs) for speaker in os.listdir(args.in_dir): spk_dir = os.path.join(args.in_dir, speaker) if os.path.isdir(spk_dir): print(spk_dir) - for _ in tqdm(pool.imap_unordered(process, [(spk_dir, i, args) for i in os.listdir(spk_dir) if i.endswith("wav")])): + for _ in tqdm( + pool.imap_unordered( + process, + [ + (spk_dir, i, args) + for i in os.listdir(spk_dir) + if i.endswith("wav") + ], + ) + ): pass diff --git a/server.py b/server.py index 550db2340..b43aec624 100644 --- a/server.py +++ b/server.py @@ -13,7 +13,8 @@ # Flask Init app = Flask(__name__) -app.config['JSON_AS_ASCII'] = False +app.config["JSON_AS_ASCII"] = False + def get_text(text, language_str, hps): norm_text, phone, tone, word2ph = clean_text(text, language_str) @@ -30,84 +31,121 @@ def get_text(text, language_str, hps): del word2ph assert bert.shape[-1] == len(phone), phone - if language_str=='ZH': + if language_str == "ZH": bert = bert ja_bert = torch.zeros(768, len(phone)) - elif language_str=="JA": + elif language_str == "JA": ja_bert = bert bert = torch.zeros(1024, len(phone)) else: bert = torch.zeros(1024, len(phone)) ja_bert = torch.zeros(768, len(phone)) assert bert.shape[-1] == len(phone), ( - bert.shape, len(phone), sum(word2ph), p1, p2, t1, t2, pold, pold2, word2ph, text, w2pho) + bert.shape, + len(phone), + sum(word2ph), + p1, + p2, + t1, + t2, + pold, + pold2, + word2ph, + text, + w2pho, + ) phone = torch.LongTensor(phone) tone = torch.LongTensor(tone) language = torch.LongTensor(language) return bert, ja_bert, phone, tone, language + def infer(text, sdp_ratio, noise_scale, noise_scale_w, length_scale, sid, language): bert, ja_bert, phones, tones, lang_ids = get_text(text, language, hps) with torch.no_grad(): - x_tst=phones.to(dev).unsqueeze(0) - tones=tones.to(dev).unsqueeze(0) - lang_ids=lang_ids.to(dev).unsqueeze(0) + x_tst = phones.to(dev).unsqueeze(0) + tones = tones.to(dev).unsqueeze(0) + lang_ids = lang_ids.to(dev).unsqueeze(0) bert = bert.to(dev).unsqueeze(0) ja_bert = ja_bert.to(device).unsqueeze(0) x_tst_lengths = torch.LongTensor([phones.size(0)]).to(dev) speakers = torch.LongTensor([hps.data.spk2id[sid]]).to(dev) - audio = net_g.infer(x_tst, x_tst_lengths, speakers, tones, lang_ids, bert, ja_bert, sdp_ratio=sdp_ratio - , noise_scale=noise_scale, noise_scale_w=noise_scale_w, length_scale=length_scale)[0][0,0].data.cpu().float().numpy() + audio = ( + net_g.infer( + x_tst, + x_tst_lengths, + speakers, + tones, + lang_ids, + bert, + ja_bert, + sdp_ratio=sdp_ratio, + noise_scale=noise_scale, + noise_scale_w=noise_scale_w, + length_scale=length_scale, + )[0][0, 0] + .data.cpu() + .float() + .numpy() + ) return audio + def replace_punctuation(text, i=2): punctuation = ",。?!" for char in punctuation: text = text.replace(char, char * i) return text + def wav2(i, o, format): - inp = avopen(i, 'rb') - out = avopen(o, 'wb', format=format) - if format == "ogg": format = "libvorbis" + inp = avopen(i, "rb") + out = avopen(o, "wb", format=format) + if format == "ogg": + format = "libvorbis" ostream = out.add_stream(format) for frame in inp.decode(audio=0): - for p in ostream.encode(frame): out.mux(p) + for p in ostream.encode(frame): + out.mux(p) - for p in ostream.encode(None): out.mux(p) + for p in ostream.encode(None): + out.mux(p) out.close() inp.close() + # Load Generator hps = utils.get_hparams_from_file("./configs/config.json") -dev='cuda' +dev = "cuda" net_g = SynthesizerTrn( len(symbols), hps.data.filter_length // 2 + 1, hps.train.segment_size // hps.data.hop_length, n_speakers=hps.data.n_speakers, - **hps.model).to(dev) + **hps.model +).to(dev) _ = net_g.eval() -_ = utils.load_checkpoint("logs/G_649000.pth", net_g, None,skip_optimizer=True) +_ = utils.load_checkpoint("logs/G_649000.pth", net_g, None, skip_optimizer=True) + @app.route("/") def main(): try: - speaker = request.args.get('speaker') - text = request.args.get('text').replace("/n","") + speaker = request.args.get("speaker") + text = request.args.get("text").replace("/n", "") sdp_ratio = float(request.args.get("sdp_ratio", 0.2)) noise = float(request.args.get("noise", 0.5)) noisew = float(request.args.get("noisew", 0.6)) length = float(request.args.get("length", 1.2)) - language = request.args.get('language') + language = request.args.get("language") if length >= 2: return "Too big length" - if len(text) >=250: + if len(text) >= 250: return "Too long text" fmt = request.args.get("format", "wav") if None in (speaker, text): @@ -120,7 +158,15 @@ def main(): return "Invalid Parameter" with torch.no_grad(): - audio = infer(text, sdp_ratio=sdp_ratio, noise_scale=noise, noise_scale_w=noisew, length_scale=length, sid=speaker,language = language) + audio = infer( + text, + sdp_ratio=sdp_ratio, + noise_scale=noise, + noise_scale_w=noisew, + length_scale=length, + sid=speaker, + language=language, + ) with BytesIO() as wav: wavfile.write(wav, hps.data.sampling_rate, audio) @@ -131,6 +177,5 @@ def main(): with BytesIO() as ofp: wav2(wav, ofp, fmt) return Response( - ofp.getvalue(), - mimetype="audio/mpeg" if fmt == "mp3" else "audio/ogg" + ofp.getvalue(), mimetype="audio/mpeg" if fmt == "mp3" else "audio/ogg" ) diff --git a/text/__init__.py b/text/__init__.py index 1392ad201..8dd10db04 100644 --- a/text/__init__.py +++ b/text/__init__.py @@ -3,28 +3,27 @@ _symbol_to_id = {s: i for i, s in enumerate(symbols)} + def cleaned_text_to_sequence(cleaned_text, tones, language): - '''Converts a string of text to a sequence of IDs corresponding to the symbols in the text. + """Converts a string of text to a sequence of IDs corresponding to the symbols in the text. Args: text: string to convert to a sequence Returns: List of integers corresponding to the symbols in the text - ''' - phones = [_symbol_to_id[symbol] for symbol in cleaned_text] - tone_start = language_tone_start_map[language] - tones = [i + tone_start for i in tones] - lang_id = language_id_map[language] - lang_ids = [lang_id for i in phones] - return phones, tones, lang_ids + """ + phones = [_symbol_to_id[symbol] for symbol in cleaned_text] + tone_start = language_tone_start_map[language] + tones = [i + tone_start for i in tones] + lang_id = language_id_map[language] + lang_ids = [lang_id for i in phones] + return phones, tones, lang_ids + def get_bert(norm_text, word2ph, language, device): - from .chinese_bert import get_bert_feature as zh_bert - from .english_bert_mock import get_bert_feature as en_bert - from .japanese_bert import get_bert_feature as jp_bert - lang_bert_func_map = { - 'ZH': zh_bert, - 'EN': en_bert, - 'JP': jp_bert - } - bert = lang_bert_func_map[language](norm_text, word2ph, device) - return bert + from .chinese_bert import get_bert_feature as zh_bert + from .english_bert_mock import get_bert_feature as en_bert + from .japanese_bert import get_bert_feature as jp_bert + + lang_bert_func_map = {"ZH": zh_bert, "EN": en_bert, "JP": jp_bert} + bert = lang_bert_func_map[language](norm_text, word2ph, device) + return bert diff --git a/text/chinese.py b/text/chinese.py index 276753880..70b8feb5a 100644 --- a/text/chinese.py +++ b/text/chinese.py @@ -9,65 +9,70 @@ from text.tone_sandhi import ToneSandhi current_file_path = os.path.dirname(__file__) -pinyin_to_symbol_map = {line.split("\t")[0]: line.strip().split("\t")[1] for line in - open(os.path.join(current_file_path, 'opencpop-strict.txt')).readlines()} +pinyin_to_symbol_map = { + line.split("\t")[0]: line.strip().split("\t")[1] + for line in open(os.path.join(current_file_path, "opencpop-strict.txt")).readlines() +} import jieba.posseg as psg rep_map = { - ':': ',', - ';': ',', - ',': ',', - '。': '.', - '!': '!', - '?': '?', - '\n': '.', + ":": ",", + ";": ",", + ",": ",", + "。": ".", + "!": "!", + "?": "?", + "\n": ".", "·": ",", - '、': ",", - '...': '…', - '$': '.', - '“': "'", - '”': "'", - '‘': "'", - '’': "'", - '(': "'", - ')': "'", - '(': "'", - ')': "'", - '《': "'", - '》': "'", - '【': "'", - '】': "'", - '[': "'", - ']': "'", - '—': "-", - '~': "-", - '~': "-", - '「': "'", - '」': "'", - + "、": ",", + "...": "…", + "$": ".", + "“": "'", + "”": "'", + "‘": "'", + "’": "'", + "(": "'", + ")": "'", + "(": "'", + ")": "'", + "《": "'", + "》": "'", + "【": "'", + "】": "'", + "[": "'", + "]": "'", + "—": "-", + "~": "-", + "~": "-", + "「": "'", + "」": "'", } tone_modifier = ToneSandhi() + def replace_punctuation(text): - text = text.replace("嗯", "恩").replace("呣","母") - pattern = re.compile('|'.join(re.escape(p) for p in rep_map.keys())) + text = text.replace("嗯", "恩").replace("呣", "母") + pattern = re.compile("|".join(re.escape(p) for p in rep_map.keys())) replaced_text = pattern.sub(lambda x: rep_map[x.group()], text) - replaced_text = re.sub(r'[^\u4e00-\u9fa5'+"".join(punctuation)+r']+', '', replaced_text) + replaced_text = re.sub( + r"[^\u4e00-\u9fa5" + "".join(punctuation) + r"]+", "", replaced_text + ) return replaced_text + def g2p(text): - pattern = r'(?<=[{0}])\s*'.format(''.join(punctuation)) - sentences = [i for i in re.split(pattern, text) if i.strip()!=''] + pattern = r"(?<=[{0}])\s*".format("".join(punctuation)) + sentences = [i for i in re.split(pattern, text) if i.strip() != ""] phones, tones, word2ph = _g2p(sentences) assert sum(word2ph) == len(phones) - assert len(word2ph) == len(text) #Sometimes it will crash,you can add a try-catch. - phones = ['_'] + phones + ["_"] + assert len(word2ph) == len(text) # Sometimes it will crash,you can add a try-catch. + phones = ["_"] + phones + ["_"] tones = [0] + tones + [0] word2ph = [1] + word2ph + [1] return phones, tones, word2ph @@ -76,10 +81,10 @@ def g2p(text): def _get_initials_finals(word): initials = [] finals = [] - orig_initials = lazy_pinyin( - word, neutral_tone_with_five=True, style=Style.INITIALS) + orig_initials = lazy_pinyin(word, neutral_tone_with_five=True, style=Style.INITIALS) orig_finals = lazy_pinyin( - word, neutral_tone_with_five=True, style=Style.FINALS_TONE3) + word, neutral_tone_with_five=True, style=Style.FINALS_TONE3 + ) for c, v in zip(orig_initials, orig_finals): initials.append(c) finals.append(v) @@ -93,17 +98,16 @@ def _g2p(segments): for seg in segments: pinyins = [] # Replace all English words in the sentence - seg = re.sub('[a-zA-Z]+', '', seg) + seg = re.sub("[a-zA-Z]+", "", seg) seg_cut = psg.lcut(seg) initials = [] finals = [] seg_cut = tone_modifier.pre_merge_for_modify(seg_cut) for word, pos in seg_cut: - if pos == 'eng': + if pos == "eng": continue sub_initials, sub_finals = _get_initials_finals(word) - sub_finals = tone_modifier.modified_tone(word, pos, - sub_finals) + sub_finals = tone_modifier.modified_tone(word, pos, sub_finals) initials.append(sub_initials) finals.append(sub_finals) @@ -112,52 +116,52 @@ def _g2p(segments): finals = sum(finals, []) # for c, v in zip(initials, finals): - raw_pinyin = c+v + raw_pinyin = c + v # NOTE: post process for pypinyin outputs # we discriminate i, ii and iii if c == v: assert c in punctuation phone = [c] - tone = '0' + tone = "0" word2ph.append(1) else: v_without_tone = v[:-1] tone = v[-1] - pinyin = c+v_without_tone - assert tone in '12345' + pinyin = c + v_without_tone + assert tone in "12345" if c: # 多音节 v_rep_map = { - "uei": 'ui', - 'iou': 'iu', - 'uen': 'un', + "uei": "ui", + "iou": "iu", + "uen": "un", } if v_without_tone in v_rep_map.keys(): - pinyin = c+v_rep_map[v_without_tone] + pinyin = c + v_rep_map[v_without_tone] else: # 单音节 pinyin_rep_map = { - 'ing': 'ying', - 'i': 'yi', - 'in': 'yin', - 'u': 'wu', + "ing": "ying", + "i": "yi", + "in": "yin", + "u": "wu", } if pinyin in pinyin_rep_map.keys(): pinyin = pinyin_rep_map[pinyin] else: single_rep_map = { - 'v': 'yu', - 'e': 'e', - 'i': 'y', - 'u': 'w', + "v": "yu", + "e": "e", + "i": "y", + "u": "w", } if pinyin[0] in single_rep_map.keys(): - pinyin = single_rep_map[pinyin[0]]+pinyin[1:] + pinyin = single_rep_map[pinyin[0]] + pinyin[1:] assert pinyin in pinyin_to_symbol_map.keys(), (pinyin, seg, raw_pinyin) - phone = pinyin_to_symbol_map[pinyin].split(' ') + phone = pinyin_to_symbol_map[pinyin].split(" ") word2ph.append(len(phone)) phones_list += phone @@ -165,20 +169,23 @@ def _g2p(segments): return phones_list, tones_list, word2ph - def text_normalize(text): - numbers = re.findall(r'\d+(?:\.?\d+)?', text) + numbers = re.findall(r"\d+(?:\.?\d+)?", text) for number in numbers: text = text.replace(number, cn2an.an2cn(number), 1) text = replace_punctuation(text) return text + def get_bert_feature(text, word2ph): - from text import chinese_bert + from text import chinese_bert + return chinese_bert.get_bert_feature(text, word2ph) -if __name__ == '__main__': + +if __name__ == "__main__": from text.chinese_bert import get_bert_feature + text = "啊!但是《原神》是由,米哈\游自主, [研发]的一款全.新开放世界.冒险游戏" text = text_normalize(text) print(text) diff --git a/text/chinese_bert.py b/text/chinese_bert.py index 978c6f846..a7607198f 100644 --- a/text/chinese_bert.py +++ b/text/chinese_bert.py @@ -4,20 +4,27 @@ tokenizer = AutoTokenizer.from_pretrained("./bert/chinese-roberta-wwm-ext-large") + def get_bert_feature(text, word2ph, device=None): - if sys.platform == "darwin" and torch.backends.mps.is_available() and device == "cpu": + if ( + sys.platform == "darwin" + and torch.backends.mps.is_available() + and device == "cpu" + ): device = "mps" if not device: device = "cuda" - model = AutoModelForMaskedLM.from_pretrained("./bert/chinese-roberta-wwm-ext-large").to(device) + model = AutoModelForMaskedLM.from_pretrained( + "./bert/chinese-roberta-wwm-ext-large" + ).to(device) with torch.no_grad(): - inputs = tokenizer(text, return_tensors='pt') + inputs = tokenizer(text, return_tensors="pt") for i in inputs: inputs[i] = inputs[i].to(device) res = model(**inputs, output_hidden_states=True) - res = torch.cat(res['hidden_states'][-3:-2], -1)[0].cpu() + res = torch.cat(res["hidden_states"][-3:-2], -1)[0].cpu() - assert len(word2ph) == len(text)+2 + assert len(word2ph) == len(text) + 2 word2phone = word2ph phone_level_feature = [] for i in range(len(word2phone)): @@ -26,14 +33,53 @@ def get_bert_feature(text, word2ph, device=None): phone_level_feature = torch.cat(phone_level_feature, dim=0) - return phone_level_feature.T -if __name__ == '__main__': + +if __name__ == "__main__": import torch word_level_feature = torch.rand(38, 1024) # 12个词,每个词1024维特征 - word2phone = [1, 2, 1, 2, 2, 1, 2, 2, 1, 2, 2, 1, 2, 2, 2, 2, 2, 1, 1, 2, 2, 1, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 1] + word2phone = [ + 1, + 2, + 1, + 2, + 2, + 1, + 2, + 2, + 1, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 1, + 1, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 1, + ] # 计算总帧数 total_frames = sum(word2phone) @@ -49,4 +95,3 @@ def get_bert_feature(text, word2ph, device=None): phone_level_feature = torch.cat(phone_level_feature, dim=0) print(phone_level_feature.shape) # torch.Size([36, 1024]) - diff --git a/text/cleaner.py b/text/cleaner.py index fd217d673..3ba373981 100644 --- a/text/cleaner.py +++ b/text/cleaner.py @@ -1,10 +1,7 @@ from text import chinese, japanese, cleaned_text_to_sequence -language_module_map = { - 'ZH': chinese, - 'JP': japanese -} +language_module_map = {"ZH": chinese, "JP": japanese} def clean_text(text, language): @@ -13,6 +10,7 @@ def clean_text(text, language): phones, tones, word2ph = language_module.g2p(norm_text) return norm_text, phones, tones, word2ph + def clean_text_bert(text, language): language_module = language_module_map[language] norm_text = language_module.text_normalize(text) @@ -20,9 +18,11 @@ def clean_text_bert(text, language): bert = language_module.get_bert_feature(norm_text, word2ph) return phones, tones, bert + def text_to_sequence(text, language): norm_text, phones, tones, word2ph = clean_text(text, language) return cleaned_text_to_sequence(phones, tones, language) -if __name__ == '__main__': + +if __name__ == "__main__": pass diff --git a/text/english.py b/text/english.py index 781d0a56c..c4a053513 100644 --- a/text/english.py +++ b/text/english.py @@ -7,35 +7,108 @@ from text import symbols current_file_path = os.path.dirname(__file__) -CMU_DICT_PATH = os.path.join(current_file_path, 'cmudict.rep') -CACHE_PATH = os.path.join(current_file_path, 'cmudict_cache.pickle') +CMU_DICT_PATH = os.path.join(current_file_path, "cmudict.rep") +CACHE_PATH = os.path.join(current_file_path, "cmudict_cache.pickle") _g2p = G2p() -arpa = {'AH0', 'S', 'AH1', 'EY2', 'AE2', 'EH0', 'OW2', 'UH0', 'NG', 'B', 'G', 'AY0', 'M', 'AA0', 'F', 'AO0', 'ER2', 'UH1', 'IY1', 'AH2', 'DH', 'IY0', 'EY1', 'IH0', 'K', 'N', 'W', 'IY2', 'T', 'AA1', 'ER1', 'EH2', 'OY0', 'UH2', 'UW1', 'Z', 'AW2', 'AW1', 'V', 'UW2', 'AA2', 'ER', 'AW0', 'UW0', 'R', 'OW1', 'EH1', 'ZH', 'AE0', 'IH2', 'IH', 'Y', 'JH', 'P', 'AY1', 'EY0', 'OY2', 'TH', 'HH', 'D', 'ER0', 'CH', 'AO1', 'AE1', 'AO2', 'OY1', 'AY2', 'IH1', 'OW0', 'L', 'SH'} +arpa = { + "AH0", + "S", + "AH1", + "EY2", + "AE2", + "EH0", + "OW2", + "UH0", + "NG", + "B", + "G", + "AY0", + "M", + "AA0", + "F", + "AO0", + "ER2", + "UH1", + "IY1", + "AH2", + "DH", + "IY0", + "EY1", + "IH0", + "K", + "N", + "W", + "IY2", + "T", + "AA1", + "ER1", + "EH2", + "OY0", + "UH2", + "UW1", + "Z", + "AW2", + "AW1", + "V", + "UW2", + "AA2", + "ER", + "AW0", + "UW0", + "R", + "OW1", + "EH1", + "ZH", + "AE0", + "IH2", + "IH", + "Y", + "JH", + "P", + "AY1", + "EY0", + "OY2", + "TH", + "HH", + "D", + "ER0", + "CH", + "AO1", + "AE1", + "AO2", + "OY1", + "AY2", + "IH1", + "OW0", + "L", + "SH", +} def post_replace_ph(ph): rep_map = { - ':': ',', - ';': ',', - ',': ',', - '。': '.', - '!': '!', - '?': '?', - '\n': '.', + ":": ",", + ";": ",", + ",": ",", + "。": ".", + "!": "!", + "?": "?", + "\n": ".", "·": ",", - '、': ",", - '...': '…', - 'v': "V" + "、": ",", + "...": "…", + "v": "V", } if ph in rep_map.keys(): ph = rep_map[ph] if ph in symbols: return ph if ph not in symbols: - ph = 'UNK' + ph = "UNK" return ph + def read_dict(): g2p_dict = {} start_line = 49 @@ -45,13 +118,13 @@ def read_dict(): while line: if line_index >= start_line: line = line.strip() - word_split = line.split(' ') + word_split = line.split(" ") word = word_split[0] - syllable_split = word_split[1].split(' - ') + syllable_split = word_split[1].split(" - ") g2p_dict[word] = [] for syllable in syllable_split: - phone_split = syllable.split(' ') + phone_split = syllable.split(" ") g2p_dict[word].append(phone_split) line_index = line_index + 1 @@ -61,13 +134,13 @@ def read_dict(): def cache_dict(g2p_dict, file_path): - with open(file_path, 'wb') as pickle_file: + with open(file_path, "wb") as pickle_file: pickle.dump(g2p_dict, pickle_file) def get_dict(): if os.path.exists(CACHE_PATH): - with open(CACHE_PATH, 'rb') as pickle_file: + with open(CACHE_PATH, "rb") as pickle_file: g2p_dict = pickle.load(pickle_file) else: g2p_dict = read_dict() @@ -75,15 +148,18 @@ def get_dict(): return g2p_dict + eng_dict = get_dict() + def refine_ph(phn): tone = 0 - if re.search(r'\d$', phn): + if re.search(r"\d$", phn): tone = int(phn[-1]) + 1 phn = phn[:-1] return phn.lower(), tone + def refine_syllables(syllables): tones = [] phonemes = [] @@ -100,8 +176,8 @@ def text_normalize(text): # todo: eng text normalize return text -def g2p(text): +def g2p(text): phones = [] tones = [] words = re.split(r"([,;.\-\?\!\s+])", text) @@ -126,6 +202,7 @@ def g2p(text): phones = [post_replace_ph(i) for i in phones] return phones, tones, word2ph + if __name__ == "__main__": # print(get_dict()) # print(eng_word_to_phoneme("hello")) @@ -135,4 +212,4 @@ def g2p(text): # for group in syllables: # for ph in group: # all_phones.add(ph) - # print(all_phones) \ No newline at end of file + # print(all_phones) diff --git a/text/japanese.py b/text/japanese.py index b25f89b4a..cbb82e16f 100644 --- a/text/japanese.py +++ b/text/japanese.py @@ -331,12 +331,12 @@ def kata2phoneme(text: str) -> str: x = _RULEMAP2.get(text[:2]) if x is not None: text = text[2:] - res += x.split(' ')[1:] + res += x.split(" ")[1:] continue x = _RULEMAP1.get(text[0]) if x is not None: text = text[1:] - res += x.split(' ')[1:] + res += x.split(" ")[1:] continue res.append(text[0]) text = text[1:] @@ -358,6 +358,7 @@ def hira2kata(text: str) -> str: _NO_YOMI_TOKENS = set(list("「」『』―()[][]")) _TAGGER = MeCab.Tagger() + def text2kata(text: str) -> str: parsed = _TAGGER.parse(text) res = [] @@ -472,6 +473,7 @@ def japanese_text_to_phonemes(text: str) -> str: res = kata2phoneme(res) return res + def is_japanese_character(char): # 定义日语文字系统的 Unicode 范围 japanese_ranges = [ @@ -493,27 +495,37 @@ def is_japanese_character(char): return False + rep_map = { - ':': ',', - ';': ',', - ',': ',', - '。': '.', - '!': '!', - '?': '?', - '\n': '.', + ":": ",", + ";": ",", + ",": ",", + "。": ".", + "!": "!", + "?": "?", + "\n": ".", "·": ",", - '、': ",", - '...': '…' + "、": ",", + "...": "…", } + + def replace_punctuation(text): - pattern = re.compile('|'.join(re.escape(p) for p in rep_map.keys())) + pattern = re.compile("|".join(re.escape(p) for p in rep_map.keys())) replaced_text = pattern.sub(lambda x: rep_map[x.group()], text) - replaced_text = re.sub(r'[^\u3040-\u309F\u30A0-\u30FF\u4E00-\u9FFF\u3400-\u4DBF'+"".join(punctuation)+r']+', '', replaced_text) + replaced_text = re.sub( + r"[^\u3040-\u309F\u30A0-\u30FF\u4E00-\u9FFF\u3400-\u4DBF" + + "".join(punctuation) + + r"]+", + "", + replaced_text, + ) return replaced_text + def text_normalize(text): res = unicodedata.normalize("NFKC", text) res = japanese_convert_numbers_to_words(res) @@ -521,6 +533,7 @@ def text_normalize(text): res = replace_punctuation(res) return res + def distribute_phone(n_phone, n_word): phones_per_word = [0] * n_word for task in range(n_phone): @@ -529,16 +542,19 @@ def distribute_phone(n_phone, n_word): phones_per_word[min_index] += 1 return phones_per_word + tokenizer = AutoTokenizer.from_pretrained("./bert/bert-base-japanese-v3") + + def g2p(norm_text): tokenized = tokenizer.tokenize(norm_text) phs = [] ph_groups = [] for t in tokenized: - if not t.startswith('#'): + if not t.startswith("#"): ph_groups.append([t]) else: - ph_groups[-1].append(t.replace("#", '')) + ph_groups[-1].append(t.replace("#", "")) word2ph = [] for group in ph_groups: phonemes = kata2phoneme(text2kata("".join(group))) @@ -552,12 +568,13 @@ def g2p(norm_text): word2ph += aaa phs += phonemes - phones = ['_'] + phs + ["_"] + phones = ["_"] + phs + ["_"] tones = [0 for i in phones] word2ph = [1] + word2ph + [1] return phones, tones, word2ph -if __name__ == '__main__': + +if __name__ == "__main__": tokenizer = AutoTokenizer.from_pretrained("./bert/bert-base-japanese-v3") text = "hello,こんにちは、世界!……" from text.japanese_bert import get_bert_feature @@ -568,6 +585,3 @@ def g2p(norm_text): bert = get_bert_feature(text, word2ph) print(phones, tones, word2ph, bert.shape) - - - diff --git a/text/japanese_bert.py b/text/japanese_bert.py index 82bd740ac..5cc104da4 100644 --- a/text/japanese_bert.py +++ b/text/japanese_bert.py @@ -4,19 +4,26 @@ tokenizer = AutoTokenizer.from_pretrained("./bert/bert-base-japanese-v3") + def get_bert_feature(text, word2ph, device=None): - if sys.platform == "darwin" and torch.backends.mps.is_available() and device == "cpu": + if ( + sys.platform == "darwin" + and torch.backends.mps.is_available() + and device == "cpu" + ): device = "mps" if not device: device = "cuda" - model = AutoModelForMaskedLM.from_pretrained("./bert/bert-base-japanese-v3").to(device) + model = AutoModelForMaskedLM.from_pretrained("./bert/bert-base-japanese-v3").to( + device + ) with torch.no_grad(): - inputs = tokenizer(text, return_tensors='pt') + inputs = tokenizer(text, return_tensors="pt") for i in inputs: inputs[i] = inputs[i].to(device) res = model(**inputs, output_hidden_states=True) - res = torch.cat(res['hidden_states'][-3:-2], -1)[0].cpu() - assert inputs['input_ids'].shape[-1] == len(word2ph) + res = torch.cat(res["hidden_states"][-3:-2], -1)[0].cpu() + assert inputs["input_ids"].shape[-1] == len(word2ph) word2phone = word2ph phone_level_feature = [] for i in range(len(word2phone)): diff --git a/text/symbols.py b/text/symbols.py index 9d1f8e1dc..161ae9f71 100644 --- a/text/symbols.py +++ b/text/symbols.py @@ -1,26 +1,166 @@ -punctuation = ['!', '?', '…', ",", ".", "'", '-'] +punctuation = ["!", "?", "…", ",", ".", "'", "-"] pu_symbols = punctuation + ["SP", "UNK"] -pad = '_' +pad = "_" # chinese -zh_symbols = ['E', 'En', 'a', 'ai', 'an', 'ang', 'ao', 'b', 'c', 'ch', 'd', 'e', 'ei', 'en', 'eng', 'er', 'f', 'g', 'h', - 'i', 'i0', 'ia', 'ian', 'iang', 'iao', 'ie', 'in', 'ing', 'iong', 'ir', 'iu', 'j', 'k', 'l', 'm', 'n', 'o', - 'ong', - 'ou', 'p', 'q', 'r', 's', 'sh', 't', 'u', 'ua', 'uai', 'uan', 'uang', 'ui', 'un', 'uo', 'v', 'van', 've', 'vn', - 'w', 'x', 'y', 'z', 'zh', - "AA", "EE", "OO"] +zh_symbols = [ + "E", + "En", + "a", + "ai", + "an", + "ang", + "ao", + "b", + "c", + "ch", + "d", + "e", + "ei", + "en", + "eng", + "er", + "f", + "g", + "h", + "i", + "i0", + "ia", + "ian", + "iang", + "iao", + "ie", + "in", + "ing", + "iong", + "ir", + "iu", + "j", + "k", + "l", + "m", + "n", + "o", + "ong", + "ou", + "p", + "q", + "r", + "s", + "sh", + "t", + "u", + "ua", + "uai", + "uan", + "uang", + "ui", + "un", + "uo", + "v", + "van", + "ve", + "vn", + "w", + "x", + "y", + "z", + "zh", + "AA", + "EE", + "OO", +] num_zh_tones = 6 # japanese -ja_symbols = ['N', 'a', 'a:', 'b', 'by', 'ch', 'd', 'dy', 'e', 'e:', 'f', 'g', 'gy', 'h', 'hy', 'i', 'i:', 'j', 'k', 'ky', - 'm', 'my', 'n', 'ny', 'o', 'o:', 'p', 'py', 'q', 'r', 'ry', 's', 'sh', 't', 'ts', 'ty', 'u', 'u:', - 'w', 'y', 'z', 'zy'] +ja_symbols = [ + "N", + "a", + "a:", + "b", + "by", + "ch", + "d", + "dy", + "e", + "e:", + "f", + "g", + "gy", + "h", + "hy", + "i", + "i:", + "j", + "k", + "ky", + "m", + "my", + "n", + "ny", + "o", + "o:", + "p", + "py", + "q", + "r", + "ry", + "s", + "sh", + "t", + "ts", + "ty", + "u", + "u:", + "w", + "y", + "z", + "zy", +] num_ja_tones = 1 # English -en_symbols = ['aa', 'ae', 'ah', 'ao', 'aw', 'ay', 'b', 'ch', 'd', 'dh', 'eh', 'er', 'ey', 'f', 'g', 'hh', 'ih', 'iy', - 'jh', 'k', 'l', 'm', 'n', 'ng', 'ow', 'oy', 'p', 'r', 's', - 'sh', 't', 'th', 'uh', 'uw', 'V', 'w', 'y', 'z', 'zh'] +en_symbols = [ + "aa", + "ae", + "ah", + "ao", + "aw", + "ay", + "b", + "ch", + "d", + "dh", + "eh", + "er", + "ey", + "f", + "g", + "hh", + "ih", + "iy", + "jh", + "k", + "l", + "m", + "n", + "ng", + "ow", + "oy", + "p", + "r", + "s", + "sh", + "t", + "th", + "uh", + "uw", + "V", + "w", + "y", + "z", + "zh", +] num_en_tones = 4 # combine all symbols @@ -32,21 +172,16 @@ num_tones = num_zh_tones + num_ja_tones + num_en_tones # language maps -language_id_map = { - 'ZH': 0, - "JP": 1, - "EN": 2 -} +language_id_map = {"ZH": 0, "JP": 1, "EN": 2} num_languages = len(language_id_map.keys()) language_tone_start_map = { - 'ZH': 0, + "ZH": 0, "JP": num_zh_tones, - "EN": num_zh_tones + num_ja_tones + "EN": num_zh_tones + num_ja_tones, } -if __name__ == '__main__': +if __name__ == "__main__": a = set(zh_symbols) b = set(en_symbols) - print(sorted(a&b)) - + print(sorted(a & b)) diff --git a/text/tone_sandhi.py b/text/tone_sandhi.py index 0f45b7a72..89e34fa5e 100644 --- a/text/tone_sandhi.py +++ b/text/tone_sandhi.py @@ -19,51 +19,442 @@ from pypinyin import Style -class ToneSandhi(): +class ToneSandhi: def __init__(self): self.must_neural_tone_words = { - '麻烦', '麻利', '鸳鸯', '高粱', '骨头', '骆驼', '马虎', '首饰', '馒头', '馄饨', '风筝', - '难为', '队伍', '阔气', '闺女', '门道', '锄头', '铺盖', '铃铛', '铁匠', '钥匙', '里脊', - '里头', '部分', '那么', '道士', '造化', '迷糊', '连累', '这么', '这个', '运气', '过去', - '软和', '转悠', '踏实', '跳蚤', '跟头', '趔趄', '财主', '豆腐', '讲究', '记性', '记号', - '认识', '规矩', '见识', '裁缝', '补丁', '衣裳', '衣服', '衙门', '街坊', '行李', '行当', - '蛤蟆', '蘑菇', '薄荷', '葫芦', '葡萄', '萝卜', '荸荠', '苗条', '苗头', '苍蝇', '芝麻', - '舒服', '舒坦', '舌头', '自在', '膏药', '脾气', '脑袋', '脊梁', '能耐', '胳膊', '胭脂', - '胡萝', '胡琴', '胡同', '聪明', '耽误', '耽搁', '耷拉', '耳朵', '老爷', '老实', '老婆', - '老头', '老太', '翻腾', '罗嗦', '罐头', '编辑', '结实', '红火', '累赘', '糨糊', '糊涂', - '精神', '粮食', '簸箕', '篱笆', '算计', '算盘', '答应', '笤帚', '笑语', '笑话', '窟窿', - '窝囊', '窗户', '稳当', '稀罕', '称呼', '秧歌', '秀气', '秀才', '福气', '祖宗', '砚台', - '码头', '石榴', '石头', '石匠', '知识', '眼睛', '眯缝', '眨巴', '眉毛', '相声', '盘算', - '白净', '痢疾', '痛快', '疟疾', '疙瘩', '疏忽', '畜生', '生意', '甘蔗', '琵琶', '琢磨', - '琉璃', '玻璃', '玫瑰', '玄乎', '狐狸', '状元', '特务', '牲口', '牙碜', '牌楼', '爽快', - '爱人', '热闹', '烧饼', '烟筒', '烂糊', '点心', '炊帚', '灯笼', '火候', '漂亮', '滑溜', - '溜达', '温和', '清楚', '消息', '浪头', '活泼', '比方', '正经', '欺负', '模糊', '槟榔', - '棺材', '棒槌', '棉花', '核桃', '栅栏', '柴火', '架势', '枕头', '枇杷', '机灵', '本事', - '木头', '木匠', '朋友', '月饼', '月亮', '暖和', '明白', '时候', '新鲜', '故事', '收拾', - '收成', '提防', '挖苦', '挑剔', '指甲', '指头', '拾掇', '拳头', '拨弄', '招牌', '招呼', - '抬举', '护士', '折腾', '扫帚', '打量', '打算', '打点', '打扮', '打听', '打发', '扎实', - '扁担', '戒指', '懒得', '意识', '意思', '情形', '悟性', '怪物', '思量', '怎么', '念头', - '念叨', '快活', '忙活', '志气', '心思', '得罪', '张罗', '弟兄', '开通', '应酬', '庄稼', - '干事', '帮手', '帐篷', '希罕', '师父', '师傅', '巴结', '巴掌', '差事', '工夫', '岁数', - '屁股', '尾巴', '少爷', '小气', '小伙', '将就', '对头', '对付', '寡妇', '家伙', '客气', - '实在', '官司', '学问', '学生', '字号', '嫁妆', '媳妇', '媒人', '婆家', '娘家', '委屈', - '姑娘', '姐夫', '妯娌', '妥当', '妖精', '奴才', '女婿', '头发', '太阳', '大爷', '大方', - '大意', '大夫', '多少', '多么', '外甥', '壮实', '地道', '地方', '在乎', '困难', '嘴巴', - '嘱咐', '嘟囔', '嘀咕', '喜欢', '喇嘛', '喇叭', '商量', '唾沫', '哑巴', '哈欠', '哆嗦', - '咳嗽', '和尚', '告诉', '告示', '含糊', '吓唬', '后头', '名字', '名堂', '合同', '吆喝', - '叫唤', '口袋', '厚道', '厉害', '千斤', '包袱', '包涵', '匀称', '勤快', '动静', '动弹', - '功夫', '力气', '前头', '刺猬', '刺激', '别扭', '利落', '利索', '利害', '分析', '出息', - '凑合', '凉快', '冷战', '冤枉', '冒失', '养活', '关系', '先生', '兄弟', '便宜', '使唤', - '佩服', '作坊', '体面', '位置', '似的', '伙计', '休息', '什么', '人家', '亲戚', '亲家', - '交情', '云彩', '事情', '买卖', '主意', '丫头', '丧气', '两口', '东西', '东家', '世故', - '不由', '不在', '下水', '下巴', '上头', '上司', '丈夫', '丈人', '一辈', '那个', '菩萨', - '父亲', '母亲', '咕噜', '邋遢', '费用', '冤家', '甜头', '介绍', '荒唐', '大人', '泥鳅', - '幸福', '熟悉', '计划', '扑腾', '蜡烛', '姥爷', '照顾', '喉咙', '吉他', '弄堂', '蚂蚱', - '凤凰', '拖沓', '寒碜', '糟蹋', '倒腾', '报复', '逻辑', '盘缠', '喽啰', '牢骚', '咖喱', - '扫把', '惦记' + "麻烦", + "麻利", + "鸳鸯", + "高粱", + "骨头", + "骆驼", + "马虎", + "首饰", + "馒头", + "馄饨", + "风筝", + "难为", + "队伍", + "阔气", + "闺女", + "门道", + "锄头", + "铺盖", + "铃铛", + "铁匠", + "钥匙", + "里脊", + "里头", + "部分", + "那么", + "道士", + "造化", + "迷糊", + "连累", + "这么", + "这个", + "运气", + "过去", + "软和", + "转悠", + "踏实", + "跳蚤", + "跟头", + "趔趄", + "财主", + "豆腐", + "讲究", + "记性", + "记号", + "认识", + "规矩", + "见识", + "裁缝", + "补丁", + "衣裳", + "衣服", + "衙门", + "街坊", + "行李", + "行当", + "蛤蟆", + "蘑菇", + "薄荷", + "葫芦", + "葡萄", + "萝卜", + "荸荠", + "苗条", + "苗头", + "苍蝇", + "芝麻", + "舒服", + "舒坦", + "舌头", + "自在", + "膏药", + "脾气", + "脑袋", + "脊梁", + "能耐", + "胳膊", + "胭脂", + "胡萝", + "胡琴", + "胡同", + "聪明", + "耽误", + "耽搁", + "耷拉", + "耳朵", + "老爷", + "老实", + "老婆", + "老头", + "老太", + "翻腾", + "罗嗦", + "罐头", + "编辑", + "结实", + "红火", + "累赘", + "糨糊", + "糊涂", + "精神", + "粮食", + "簸箕", + "篱笆", + "算计", + "算盘", + "答应", + "笤帚", + "笑语", + "笑话", + "窟窿", + "窝囊", + "窗户", + "稳当", + "稀罕", + "称呼", + "秧歌", + "秀气", + "秀才", + "福气", + "祖宗", + "砚台", + "码头", + "石榴", + "石头", + "石匠", + "知识", + "眼睛", + "眯缝", + "眨巴", + "眉毛", + "相声", + "盘算", + "白净", + "痢疾", + "痛快", + "疟疾", + "疙瘩", + "疏忽", + "畜生", + "生意", + "甘蔗", + "琵琶", + "琢磨", + "琉璃", + "玻璃", + "玫瑰", + "玄乎", + "狐狸", + "状元", + "特务", + "牲口", + "牙碜", + "牌楼", + "爽快", + "爱人", + "热闹", + "烧饼", + "烟筒", + "烂糊", + "点心", + "炊帚", + "灯笼", + "火候", + "漂亮", + "滑溜", + "溜达", + "温和", + "清楚", + "消息", + "浪头", + "活泼", + "比方", + "正经", + "欺负", + "模糊", + "槟榔", + "棺材", + "棒槌", + "棉花", + "核桃", + "栅栏", + "柴火", + "架势", + "枕头", + "枇杷", + "机灵", + "本事", + "木头", + "木匠", + "朋友", + "月饼", + "月亮", + "暖和", + "明白", + "时候", + "新鲜", + "故事", + "收拾", + "收成", + "提防", + "挖苦", + "挑剔", + "指甲", + "指头", + "拾掇", + "拳头", + "拨弄", + "招牌", + "招呼", + "抬举", + "护士", + "折腾", + "扫帚", + "打量", + "打算", + "打点", + "打扮", + "打听", + "打发", + "扎实", + "扁担", + "戒指", + "懒得", + "意识", + "意思", + "情形", + "悟性", + "怪物", + "思量", + "怎么", + "念头", + "念叨", + "快活", + "忙活", + "志气", + "心思", + "得罪", + "张罗", + "弟兄", + "开通", + "应酬", + "庄稼", + "干事", + "帮手", + "帐篷", + "希罕", + "师父", + "师傅", + "巴结", + "巴掌", + "差事", + "工夫", + "岁数", + "屁股", + "尾巴", + "少爷", + "小气", + "小伙", + "将就", + "对头", + "对付", + "寡妇", + "家伙", + "客气", + "实在", + "官司", + "学问", + "学生", + "字号", + "嫁妆", + "媳妇", + "媒人", + "婆家", + "娘家", + "委屈", + "姑娘", + "姐夫", + "妯娌", + "妥当", + "妖精", + "奴才", + "女婿", + "头发", + "太阳", + "大爷", + "大方", + "大意", + "大夫", + "多少", + "多么", + "外甥", + "壮实", + "地道", + "地方", + "在乎", + "困难", + "嘴巴", + "嘱咐", + "嘟囔", + "嘀咕", + "喜欢", + "喇嘛", + "喇叭", + "商量", + "唾沫", + "哑巴", + "哈欠", + "哆嗦", + "咳嗽", + "和尚", + "告诉", + "告示", + "含糊", + "吓唬", + "后头", + "名字", + "名堂", + "合同", + "吆喝", + "叫唤", + "口袋", + "厚道", + "厉害", + "千斤", + "包袱", + "包涵", + "匀称", + "勤快", + "动静", + "动弹", + "功夫", + "力气", + "前头", + "刺猬", + "刺激", + "别扭", + "利落", + "利索", + "利害", + "分析", + "出息", + "凑合", + "凉快", + "冷战", + "冤枉", + "冒失", + "养活", + "关系", + "先生", + "兄弟", + "便宜", + "使唤", + "佩服", + "作坊", + "体面", + "位置", + "似的", + "伙计", + "休息", + "什么", + "人家", + "亲戚", + "亲家", + "交情", + "云彩", + "事情", + "买卖", + "主意", + "丫头", + "丧气", + "两口", + "东西", + "东家", + "世故", + "不由", + "不在", + "下水", + "下巴", + "上头", + "上司", + "丈夫", + "丈人", + "一辈", + "那个", + "菩萨", + "父亲", + "母亲", + "咕噜", + "邋遢", + "费用", + "冤家", + "甜头", + "介绍", + "荒唐", + "大人", + "泥鳅", + "幸福", + "熟悉", + "计划", + "扑腾", + "蜡烛", + "姥爷", + "照顾", + "喉咙", + "吉他", + "弄堂", + "蚂蚱", + "凤凰", + "拖沓", + "寒碜", + "糟蹋", + "倒腾", + "报复", + "逻辑", + "盘缠", + "喽啰", + "牢骚", + "咖喱", + "扫把", + "惦记", } self.must_not_neural_tone_words = { - "男子", "女子", "分子", "原子", "量子", "莲子", "石子", "瓜子", "电子", "人人", "虎虎" + "男子", + "女子", + "分子", + "原子", + "量子", + "莲子", + "石子", + "瓜子", + "电子", + "人人", + "虎虎", } self.punc = ":,;。?!“”‘’':,;.?!" @@ -72,14 +463,15 @@ def __init__(self): # word: "家里" # pos: "s" # finals: ['ia1', 'i3'] - def _neural_sandhi(self, word: str, pos: str, - finals: List[str]) -> List[str]: - + def _neural_sandhi(self, word: str, pos: str, finals: List[str]) -> List[str]: # reduplication words for n. and v. e.g. 奶奶, 试试, 旺旺 for j, item in enumerate(word): - if j - 1 >= 0 and item == word[j - 1] and pos[0] in { - "n", "v", "a" - } and word not in self.must_not_neural_tone_words: + if ( + j - 1 >= 0 + and item == word[j - 1] + and pos[0] in {"n", "v", "a"} + and word not in self.must_not_neural_tone_words + ): finals[j] = finals[j][:-1] + "5" ge_idx = word.find("个") if len(word) >= 1 and word[-1] in "吧呢啊呐噻嘛吖嗨呐哦哒额滴哩哟喽啰耶喔诶": @@ -89,9 +481,12 @@ def _neural_sandhi(self, word: str, pos: str, # e.g. 走了, 看着, 去过 # elif len(word) == 1 and word in "了着过" and pos in {"ul", "uz", "ug"}: # finals[-1] = finals[-1][:-1] + "5" - elif len(word) > 1 and word[-1] in "们子" and pos in { - "r", "n" - } and word not in self.must_not_neural_tone_words: + elif ( + len(word) > 1 + and word[-1] in "们子" + and pos in {"r", "n"} + and word not in self.must_not_neural_tone_words + ): finals[-1] = finals[-1][:-1] + "5" # e.g. 桌上, 地下, 家里 elif len(word) > 1 and word[-1] in "上下里" and pos in {"s", "l", "f"}: @@ -100,21 +495,26 @@ def _neural_sandhi(self, word: str, pos: str, elif len(word) > 1 and word[-1] in "来去" and word[-2] in "上下进出回过起开": finals[-1] = finals[-1][:-1] + "5" # 个做量词 - elif (ge_idx >= 1 and - (word[ge_idx - 1].isnumeric() or - word[ge_idx - 1] in "几有两半多各整每做是")) or word == '个': + elif ( + ge_idx >= 1 + and (word[ge_idx - 1].isnumeric() or word[ge_idx - 1] in "几有两半多各整每做是") + ) or word == "个": finals[ge_idx] = finals[ge_idx][:-1] + "5" else: - if word in self.must_neural_tone_words or word[ - -2:] in self.must_neural_tone_words: + if ( + word in self.must_neural_tone_words + or word[-2:] in self.must_neural_tone_words + ): finals[-1] = finals[-1][:-1] + "5" word_list = self._split_word(word) - finals_list = [finals[:len(word_list[0])], finals[len(word_list[0]):]] + finals_list = [finals[: len(word_list[0])], finals[len(word_list[0]) :]] for i, word in enumerate(word_list): # conventional neural in Chinese - if word in self.must_neural_tone_words or word[ - -2:] in self.must_neural_tone_words: + if ( + word in self.must_neural_tone_words + or word[-2:] in self.must_neural_tone_words + ): finals_list[i][-1] = finals_list[i][-1][:-1] + "5" finals = sum(finals_list, []) return finals @@ -126,15 +526,15 @@ def _bu_sandhi(self, word: str, finals: List[str]) -> List[str]: else: for i, char in enumerate(word): # "不" before tone4 should be bu2, e.g. 不怕 - if char == "不" and i + 1 < len(word) and finals[i + - 1][-1] == "4": + if char == "不" and i + 1 < len(word) and finals[i + 1][-1] == "4": finals[i] = finals[i][:-1] + "2" return finals def _yi_sandhi(self, word: str, finals: List[str]) -> List[str]: # "一" in number sequences, e.g. 一零零, 二一零 if word.find("一") != -1 and all( - [item.isnumeric() for item in word if item != "一"]): + [item.isnumeric() for item in word if item != "一"] + ): return finals # "一" between reduplication words shold be yi5, e.g. 看一看 elif len(word) == 3 and word[1] == "一" and word[0] == word[-1]: @@ -161,10 +561,10 @@ def _split_word(self, word: str) -> List[str]: first_subword = word_list[0] first_begin_idx = word.find(first_subword) if first_begin_idx == 0: - second_subword = word[len(first_subword):] + second_subword = word[len(first_subword) :] new_word_list = [first_subword, second_subword] else: - second_subword = word[:-len(first_subword)] + second_subword = word[: -len(first_subword)] new_word_list = [second_subword, first_subword] return new_word_list @@ -182,18 +582,19 @@ def _three_sandhi(self, word: str, finals: List[str]) -> List[str]: elif len(word_list[0]) == 1: finals[1] = finals[1][:-1] + "2" else: - finals_list = [ - finals[:len(word_list[0])], finals[len(word_list[0]):] - ] + finals_list = [finals[: len(word_list[0])], finals[len(word_list[0]) :]] if len(finals_list) == 2: for i, sub in enumerate(finals_list): # e.g. 所有/人 if self._all_tone_three(sub) and len(sub) == 2: finals_list[i][0] = finals_list[i][0][:-1] + "2" # e.g. 好/喜欢 - elif i == 1 and not self._all_tone_three(sub) and finals_list[i][0][-1] == "3" and \ - finals_list[0][-1][-1] == "3": - + elif ( + i == 1 + and not self._all_tone_three(sub) + and finals_list[i][0][-1] == "3" + and finals_list[0][-1][-1] == "3" + ): finals_list[0][-1] = finals_list[0][-1][:-1] + "2" finals = sum(finals_list, []) # split idiom into two words who's length is 2 @@ -222,7 +623,7 @@ def _merge_bu(self, seg: List[Tuple[str, str]]) -> List[Tuple[str, str]]: new_seg.append((word, pos)) last_word = word[:] if last_word == "不": - new_seg.append((last_word, 'd')) + new_seg.append((last_word, "d")) last_word = "" return new_seg @@ -236,12 +637,21 @@ def _merge_yi(self, seg: List[Tuple[str, str]]) -> List[Tuple[str, str]]: new_seg = [] # function 1 for i, (word, pos) in enumerate(seg): - if i - 1 >= 0 and word == "一" and i + 1 < len(seg) and seg[i - 1][ - 0] == seg[i + 1][0] and seg[i - 1][1] == "v": + if ( + i - 1 >= 0 + and word == "一" + and i + 1 < len(seg) + and seg[i - 1][0] == seg[i + 1][0] + and seg[i - 1][1] == "v" + ): new_seg[i - 1][0] = new_seg[i - 1][0] + "一" + new_seg[i - 1][0] else: - if i - 2 >= 0 and seg[i - 1][0] == "一" and seg[i - 2][ - 0] == word and pos == "v": + if ( + i - 2 >= 0 + and seg[i - 1][0] == "一" + and seg[i - 2][0] == word + and pos == "v" + ): continue else: new_seg.append([word, pos]) @@ -257,22 +667,27 @@ def _merge_yi(self, seg: List[Tuple[str, str]]) -> List[Tuple[str, str]]: # the first and the second words are all_tone_three def _merge_continuous_three_tones( - self, seg: List[Tuple[str, str]]) -> List[Tuple[str, str]]: + self, seg: List[Tuple[str, str]] + ) -> List[Tuple[str, str]]: new_seg = [] sub_finals_list = [ - lazy_pinyin( - word, neutral_tone_with_five=True, style=Style.FINALS_TONE3) + lazy_pinyin(word, neutral_tone_with_five=True, style=Style.FINALS_TONE3) for (word, pos) in seg ] assert len(sub_finals_list) == len(seg) merge_last = [False] * len(seg) for i, (word, pos) in enumerate(seg): - if i - 1 >= 0 and self._all_tone_three( - sub_finals_list[i - 1]) and self._all_tone_three( - sub_finals_list[i]) and not merge_last[i - 1]: + if ( + i - 1 >= 0 + and self._all_tone_three(sub_finals_list[i - 1]) + and self._all_tone_three(sub_finals_list[i]) + and not merge_last[i - 1] + ): # if the last word is reduplication, not merge, because reduplication need to be _neural_sandhi - if not self._is_reduplication(seg[i - 1][0]) and len( - seg[i - 1][0]) + len(seg[i][0]) <= 3: + if ( + not self._is_reduplication(seg[i - 1][0]) + and len(seg[i - 1][0]) + len(seg[i][0]) <= 3 + ): new_seg[-1][0] = new_seg[-1][0] + seg[i][0] merge_last[i] = True else: @@ -287,21 +702,27 @@ def _is_reduplication(self, word: str) -> bool: # the last char of first word and the first char of second word is tone_three def _merge_continuous_three_tones_2( - self, seg: List[Tuple[str, str]]) -> List[Tuple[str, str]]: + self, seg: List[Tuple[str, str]] + ) -> List[Tuple[str, str]]: new_seg = [] sub_finals_list = [ - lazy_pinyin( - word, neutral_tone_with_five=True, style=Style.FINALS_TONE3) + lazy_pinyin(word, neutral_tone_with_five=True, style=Style.FINALS_TONE3) for (word, pos) in seg ] assert len(sub_finals_list) == len(seg) merge_last = [False] * len(seg) for i, (word, pos) in enumerate(seg): - if i - 1 >= 0 and sub_finals_list[i - 1][-1][-1] == "3" and sub_finals_list[i][0][-1] == "3" and not \ - merge_last[i - 1]: + if ( + i - 1 >= 0 + and sub_finals_list[i - 1][-1][-1] == "3" + and sub_finals_list[i][0][-1] == "3" + and not merge_last[i - 1] + ): # if the last word is reduplication, not merge, because reduplication need to be _neural_sandhi - if not self._is_reduplication(seg[i - 1][0]) and len( - seg[i - 1][0]) + len(seg[i][0]) <= 3: + if ( + not self._is_reduplication(seg[i - 1][0]) + and len(seg[i - 1][0]) + len(seg[i][0]) <= 3 + ): new_seg[-1][0] = new_seg[-1][0] + seg[i][0] merge_last[i] = True else: @@ -313,14 +734,13 @@ def _merge_continuous_three_tones_2( def _merge_er(self, seg: List[Tuple[str, str]]) -> List[Tuple[str, str]]: new_seg = [] for i, (word, pos) in enumerate(seg): - if i - 1 >= 0 and word == "儿" and seg[i-1][0] != "#": + if i - 1 >= 0 and word == "儿" and seg[i - 1][0] != "#": new_seg[-1][0] = new_seg[-1][0] + seg[i][0] else: new_seg.append([word, pos]) return new_seg - def _merge_reduplication( - self, seg: List[Tuple[str, str]]) -> List[Tuple[str, str]]: + def _merge_reduplication(self, seg: List[Tuple[str, str]]) -> List[Tuple[str, str]]: new_seg = [] for i, (word, pos) in enumerate(seg): if new_seg and word == new_seg[-1][0]: @@ -329,8 +749,7 @@ def _merge_reduplication( new_seg.append([word, pos]) return new_seg - def pre_merge_for_modify( - self, seg: List[Tuple[str, str]]) -> List[Tuple[str, str]]: + def pre_merge_for_modify(self, seg: List[Tuple[str, str]]) -> List[Tuple[str, str]]: seg = self._merge_bu(seg) try: seg = self._merge_yi(seg) @@ -342,8 +761,7 @@ def pre_merge_for_modify( seg = self._merge_er(seg) return seg - def modified_tone(self, word: str, pos: str, - finals: List[str]) -> List[str]: + def modified_tone(self, word: str, pos: str, finals: List[str]) -> List[str]: finals = self._bu_sandhi(word, finals) finals = self._yi_sandhi(word, finals) finals = self._neural_sandhi(word, pos, finals) diff --git a/train_ms.py b/train_ms.py index 7e653df6f..a8d1eb829 100644 --- a/train_ms.py +++ b/train_ms.py @@ -14,37 +14,38 @@ from torch.cuda.amp import autocast, GradScaler from tqdm import tqdm import logging -logging.getLogger('numba').setLevel(logging.WARNING) + +logging.getLogger("numba").setLevel(logging.WARNING) import commons import utils from data_utils import ( TextAudioSpeakerLoader, TextAudioSpeakerCollate, - DistributedBucketSampler + DistributedBucketSampler, ) from models import ( SynthesizerTrn, MultiPeriodDiscriminator, DurationDiscriminator, ) -from losses import ( - generator_loss, - discriminator_loss, - feature_loss, - kl_loss -) +from losses import generator_loss, discriminator_loss, feature_loss, kl_loss from mel_processing import mel_spectrogram_torch, spec_to_mel_torch from text.symbols import symbols torch.backends.cudnn.benchmark = True torch.backends.cuda.sdp_kernel("flash") torch.backends.cuda.enable_flash_sdp(True) -torch.backends.cuda.enable_mem_efficient_sdp(True) # Not avaliable if torch version is lower than 2.0 +torch.backends.cuda.enable_mem_efficient_sdp( + True +) # Not avaliable if torch version is lower than 2.0 torch.backends.cuda.enable_math_sdp(True) global_step = 0 + def run(): - dist.init_process_group(backend="nccl", init_method="env://") # Use torchrun instead of mp.spawn + dist.init_process_group( + backend="nccl", init_method="env://" + ) # Use torchrun instead of mp.spawn rank = dist.get_rank() n_gpus = dist.get_world_size() hps = utils.get_hparams() @@ -64,17 +65,34 @@ def run(): [32, 300, 400, 500, 600, 700, 800, 900, 1000], num_replicas=n_gpus, rank=rank, - shuffle=True) + shuffle=True, + ) collate_fn = TextAudioSpeakerCollate() - train_loader = DataLoader(train_dataset, num_workers=16, shuffle=False, pin_memory=True, - collate_fn=collate_fn, batch_sampler=train_sampler, - persistent_workers=True,prefetch_factor=4) #128G Memory suitable loader. + train_loader = DataLoader( + train_dataset, + num_workers=16, + shuffle=False, + pin_memory=True, + collate_fn=collate_fn, + batch_sampler=train_sampler, + persistent_workers=True, + prefetch_factor=4, + ) # 128G Memory suitable loader. if rank == 0: eval_dataset = TextAudioSpeakerLoader(hps.data.validation_files, hps.data) - eval_loader = DataLoader(eval_dataset, num_workers=0, shuffle=False, - batch_size=1, pin_memory=True, - drop_last=False, collate_fn=collate_fn) - if "use_noise_scaled_mas" in hps.model.keys() and hps.model.use_noise_scaled_mas == True: + eval_loader = DataLoader( + eval_dataset, + num_workers=0, + shuffle=False, + batch_size=1, + pin_memory=True, + drop_last=False, + collate_fn=collate_fn, + ) + if ( + "use_noise_scaled_mas" in hps.model.keys() + and hps.model.use_noise_scaled_mas == True + ): print("Using noise scaled MAS for VITS2") use_noise_scaled_mas = True mas_noise_scale_initial = 0.01 @@ -84,19 +102,27 @@ def run(): use_noise_scaled_mas = False mas_noise_scale_initial = 0.0 noise_scale_delta = 0.0 - if "use_duration_discriminator" in hps.model.keys() and hps.model.use_duration_discriminator == True: + if ( + "use_duration_discriminator" in hps.model.keys() + and hps.model.use_duration_discriminator == True + ): print("Using duration discriminator for VITS2") use_duration_discriminator = True net_dur_disc = DurationDiscriminator( - hps.model.hidden_channels, - hps.model.hidden_channels, - 3, - 0.1, - gin_channels=hps.model.gin_channels if hps.data.n_speakers != 0 else 0, - ).cuda(rank) - if "use_spk_conditioned_encoder" in hps.model.keys() and hps.model.use_spk_conditioned_encoder == True: + hps.model.hidden_channels, + hps.model.hidden_channels, + 3, + 0.1, + gin_channels=hps.model.gin_channels if hps.data.n_speakers != 0 else 0, + ).cuda(rank) + if ( + "use_spk_conditioned_encoder" in hps.model.keys() + and hps.model.use_spk_conditioned_encoder == True + ): if hps.data.n_speakers == 0: - raise ValueError("n_speakers must be > 0 when using spk conditioned encoder to train multi-speaker model") + raise ValueError( + "n_speakers must be > 0 when using spk conditioned encoder to train multi-speaker model" + ) use_spk_conditioned_encoder = True else: print("Using normal encoder for VITS1") @@ -107,27 +133,31 @@ def run(): hps.data.filter_length // 2 + 1, hps.train.segment_size // hps.data.hop_length, n_speakers=hps.data.n_speakers, - mas_noise_scale_initial = mas_noise_scale_initial, - noise_scale_delta = noise_scale_delta, - **hps.model).cuda(rank) + mas_noise_scale_initial=mas_noise_scale_initial, + noise_scale_delta=noise_scale_delta, + **hps.model, + ).cuda(rank) net_d = MultiPeriodDiscriminator(hps.model.use_spectral_norm).cuda(rank) optim_g = torch.optim.AdamW( filter(lambda p: p.requires_grad, net_g.parameters()), hps.train.learning_rate, betas=hps.train.betas, - eps=hps.train.eps) + eps=hps.train.eps, + ) optim_d = torch.optim.AdamW( net_d.parameters(), hps.train.learning_rate, betas=hps.train.betas, - eps=hps.train.eps) + eps=hps.train.eps, + ) if net_dur_disc is not None: optim_dur_disc = torch.optim.AdamW( - net_dur_disc.parameters(), - hps.train.learning_rate, - betas=hps.train.betas, - eps=hps.train.eps) + net_dur_disc.parameters(), + hps.train.learning_rate, + betas=hps.train.betas, + eps=hps.train.eps, + ) else: optim_dur_disc = None net_g = DDP(net_g, device_ids=[rank], find_unused_parameters=True) @@ -136,40 +166,82 @@ def run(): net_dur_disc = DDP(net_dur_disc, device_ids=[rank], find_unused_parameters=True) try: if net_dur_disc is not None: - _, _, _, epoch_str = utils.load_checkpoint(utils.latest_checkpoint_path(hps.model_dir, "DUR_*.pth"), net_dur_disc, optim_dur_disc, skip_optimizer=True) - _, optim_g, _, epoch_str = utils.load_checkpoint(utils.latest_checkpoint_path(hps.model_dir, "G_*.pth"), net_g, - optim_g, skip_optimizer=True) - _, optim_d, _, epoch_str = utils.load_checkpoint(utils.latest_checkpoint_path(hps.model_dir, "D_*.pth"), net_d, - optim_d, skip_optimizer=True) - + _, _, _, epoch_str = utils.load_checkpoint( + utils.latest_checkpoint_path(hps.model_dir, "DUR_*.pth"), + net_dur_disc, + optim_dur_disc, + skip_optimizer=True, + ) + _, optim_g, _, epoch_str = utils.load_checkpoint( + utils.latest_checkpoint_path(hps.model_dir, "G_*.pth"), + net_g, + optim_g, + skip_optimizer=True, + ) + _, optim_d, _, epoch_str = utils.load_checkpoint( + utils.latest_checkpoint_path(hps.model_dir, "D_*.pth"), + net_d, + optim_d, + skip_optimizer=True, + ) + epoch_str = max(epoch_str, 1) global_step = (epoch_str - 1) * len(train_loader) except Exception as e: - print(e) - epoch_str = 1 - global_step = 0 - + print(e) + epoch_str = 1 + global_step = 0 - scheduler_g = torch.optim.lr_scheduler.ExponentialLR(optim_g, gamma=hps.train.lr_decay, last_epoch=epoch_str - 2) - scheduler_d = torch.optim.lr_scheduler.ExponentialLR(optim_d, gamma=hps.train.lr_decay, last_epoch=epoch_str - 2) + scheduler_g = torch.optim.lr_scheduler.ExponentialLR( + optim_g, gamma=hps.train.lr_decay, last_epoch=epoch_str - 2 + ) + scheduler_d = torch.optim.lr_scheduler.ExponentialLR( + optim_d, gamma=hps.train.lr_decay, last_epoch=epoch_str - 2 + ) if net_dur_disc is not None: - scheduler_dur_disc = torch.optim.lr_scheduler.ExponentialLR(optim_dur_disc, gamma=hps.train.lr_decay, last_epoch=epoch_str-2) + scheduler_dur_disc = torch.optim.lr_scheduler.ExponentialLR( + optim_dur_disc, gamma=hps.train.lr_decay, last_epoch=epoch_str - 2 + ) else: scheduler_dur_disc = None scaler = GradScaler(enabled=hps.train.fp16_run) for epoch in range(epoch_str, hps.train.epochs + 1): if rank == 0: - train_and_evaluate(rank, epoch, hps, [net_g, net_d, net_dur_disc], [optim_g, optim_d, optim_dur_disc], [scheduler_g, scheduler_d, scheduler_dur_disc], scaler, [train_loader, eval_loader], logger, [writer, writer_eval]) + train_and_evaluate( + rank, + epoch, + hps, + [net_g, net_d, net_dur_disc], + [optim_g, optim_d, optim_dur_disc], + [scheduler_g, scheduler_d, scheduler_dur_disc], + scaler, + [train_loader, eval_loader], + logger, + [writer, writer_eval], + ) else: - train_and_evaluate(rank, epoch, hps, [net_g, net_d, net_dur_disc], [optim_g, optim_d, optim_dur_disc], [scheduler_g, scheduler_d, scheduler_dur_disc], scaler, [train_loader, None], None, None) + train_and_evaluate( + rank, + epoch, + hps, + [net_g, net_d, net_dur_disc], + [optim_g, optim_d, optim_dur_disc], + [scheduler_g, scheduler_d, scheduler_dur_disc], + scaler, + [train_loader, None], + None, + None, + ) scheduler_g.step() scheduler_d.step() if net_dur_disc is not None: scheduler_dur_disc.step() -def train_and_evaluate(rank, epoch, hps, nets, optims, schedulers, scaler, loaders, logger, writers): +def train_and_evaluate( + rank, epoch, hps, nets, optims, schedulers, scaler, loaders, logger, writers +): net_g, net_d, net_dur_disc = nets optim_g, optim_d, optim_dur_disc = optims scheduler_g, scheduler_d, scheduler_dur_disc = schedulers @@ -184,13 +256,34 @@ def train_and_evaluate(rank, epoch, hps, nets, optims, schedulers, scaler, loade net_d.train() if net_dur_disc is not None: net_dur_disc.train() - for batch_idx, (x, x_lengths, spec, spec_lengths, y, y_lengths, speakers, tone, language, bert, ja_bert) in tqdm(enumerate(train_loader)): + for batch_idx, ( + x, + x_lengths, + spec, + spec_lengths, + y, + y_lengths, + speakers, + tone, + language, + bert, + ja_bert, + ) in tqdm(enumerate(train_loader)): if net_g.module.use_noise_scaled_mas: - current_mas_noise_scale = net_g.module.mas_noise_scale_initial - net_g.module.noise_scale_delta * global_step + current_mas_noise_scale = ( + net_g.module.mas_noise_scale_initial + - net_g.module.noise_scale_delta * global_step + ) net_g.module.current_mas_noise_scale = max(current_mas_noise_scale, 0.0) - x, x_lengths = x.cuda(rank, non_blocking=True), x_lengths.cuda(rank, non_blocking=True) - spec, spec_lengths = spec.cuda(rank, non_blocking=True), spec_lengths.cuda(rank, non_blocking=True) - y, y_lengths = y.cuda(rank, non_blocking=True), y_lengths.cuda(rank, non_blocking=True) + x, x_lengths = x.cuda(rank, non_blocking=True), x_lengths.cuda( + rank, non_blocking=True + ) + spec, spec_lengths = spec.cuda(rank, non_blocking=True), spec_lengths.cuda( + rank, non_blocking=True + ) + y, y_lengths = y.cuda(rank, non_blocking=True), y_lengths.cuda( + rank, non_blocking=True + ) speakers = speakers.cuda(rank, non_blocking=True) tone = tone.cuda(rank, non_blocking=True) language = language.cuda(rank, non_blocking=True) @@ -198,16 +291,37 @@ def train_and_evaluate(rank, epoch, hps, nets, optims, schedulers, scaler, loade ja_bert = ja_bert.cuda(rank, non_blocking=True) with autocast(enabled=hps.train.fp16_run): - y_hat, l_length, attn, ids_slice, x_mask, z_mask, \ - (z, z_p, m_p, logs_p, m_q, logs_q), (hidden_x, logw, logw_) = net_g(x, x_lengths, spec, spec_lengths, speakers, tone, language, bert, ja_bert) + ( + y_hat, + l_length, + attn, + ids_slice, + x_mask, + z_mask, + (z, z_p, m_p, logs_p, m_q, logs_q), + (hidden_x, logw, logw_), + ) = net_g( + x, + x_lengths, + spec, + spec_lengths, + speakers, + tone, + language, + bert, + ja_bert, + ) mel = spec_to_mel_torch( spec, hps.data.filter_length, hps.data.n_mel_channels, hps.data.sampling_rate, hps.data.mel_fmin, - hps.data.mel_fmax) - y_mel = commons.slice_segments(mel, ids_slice, hps.train.segment_size // hps.data.hop_length) + hps.data.mel_fmax, + ) + y_mel = commons.slice_segments( + mel, ids_slice, hps.train.segment_size // hps.data.hop_length + ) y_hat_mel = mel_spectrogram_torch( y_hat.squeeze(1), hps.data.filter_length, @@ -216,26 +330,38 @@ def train_and_evaluate(rank, epoch, hps, nets, optims, schedulers, scaler, loade hps.data.hop_length, hps.data.win_length, hps.data.mel_fmin, - hps.data.mel_fmax + hps.data.mel_fmax, ) - y = commons.slice_segments(y, ids_slice * hps.data.hop_length, hps.train.segment_size) # slice + y = commons.slice_segments( + y, ids_slice * hps.data.hop_length, hps.train.segment_size + ) # slice # Discriminator y_d_hat_r, y_d_hat_g, _, _ = net_d(y, y_hat.detach()) with autocast(enabled=False): - loss_disc, losses_disc_r, losses_disc_g = discriminator_loss(y_d_hat_r, y_d_hat_g) + loss_disc, losses_disc_r, losses_disc_g = discriminator_loss( + y_d_hat_r, y_d_hat_g + ) loss_disc_all = loss_disc if net_dur_disc is not None: - y_dur_hat_r, y_dur_hat_g = net_dur_disc(hidden_x.detach(), x_mask.detach(), logw.detach(), logw_.detach()) + y_dur_hat_r, y_dur_hat_g = net_dur_disc( + hidden_x.detach(), x_mask.detach(), logw.detach(), logw_.detach() + ) with autocast(enabled=False): - # TODO: I think need to mean using the mask, but for now, just mean all - loss_dur_disc, losses_dur_disc_r, losses_dur_disc_g = discriminator_loss(y_dur_hat_r, y_dur_hat_g) + # TODO: I think need to mean using the mask, but for now, just mean all + ( + loss_dur_disc, + losses_dur_disc_r, + losses_dur_disc_g, + ) = discriminator_loss(y_dur_hat_r, y_dur_hat_g) loss_dur_disc_all = loss_dur_disc optim_dur_disc.zero_grad() scaler.scale(loss_dur_disc_all).backward() scaler.unscale_(optim_dur_disc) - grad_norm_dur_disc = commons.clip_grad_value_(net_dur_disc.parameters(), None) + grad_norm_dur_disc = commons.clip_grad_value_( + net_dur_disc.parameters(), None + ) scaler.step(optim_dur_disc) optim_d.zero_grad() @@ -269,51 +395,97 @@ def train_and_evaluate(rank, epoch, hps, nets, optims, schedulers, scaler, loade if rank == 0: if global_step % hps.train.log_interval == 0: - lr = optim_g.param_groups[0]['lr'] + lr = optim_g.param_groups[0]["lr"] losses = [loss_disc, loss_gen, loss_fm, loss_mel, loss_dur, loss_kl] - logger.info('Train Epoch: {} [{:.0f}%]'.format( - epoch, - 100. * batch_idx / len(train_loader))) + logger.info( + "Train Epoch: {} [{:.0f}%]".format( + epoch, 100.0 * batch_idx / len(train_loader) + ) + ) logger.info([x.item() for x in losses] + [global_step, lr]) - scalar_dict = {"loss/g/total": loss_gen_all, "loss/d/total": loss_disc_all, "learning_rate": lr, - "grad_norm_d": grad_norm_d, "grad_norm_g": grad_norm_g} + scalar_dict = { + "loss/g/total": loss_gen_all, + "loss/d/total": loss_disc_all, + "learning_rate": lr, + "grad_norm_d": grad_norm_d, + "grad_norm_g": grad_norm_g, + } + scalar_dict.update( + { + "loss/g/fm": loss_fm, + "loss/g/mel": loss_mel, + "loss/g/dur": loss_dur, + "loss/g/kl": loss_kl, + } + ) + scalar_dict.update( + {"loss/g/{}".format(i): v for i, v in enumerate(losses_gen)} + ) + scalar_dict.update( + {"loss/d_r/{}".format(i): v for i, v in enumerate(losses_disc_r)} + ) scalar_dict.update( - {"loss/g/fm": loss_fm, "loss/g/mel": loss_mel, "loss/g/dur": loss_dur, "loss/g/kl": loss_kl}) - scalar_dict.update({"loss/g/{}".format(i): v for i, v in enumerate(losses_gen)}) - scalar_dict.update({"loss/d_r/{}".format(i): v for i, v in enumerate(losses_disc_r)}) - scalar_dict.update({"loss/d_g/{}".format(i): v for i, v in enumerate(losses_disc_g)}) - + {"loss/d_g/{}".format(i): v for i, v in enumerate(losses_disc_g)} + ) + image_dict = { - "slice/mel_org": utils.plot_spectrogram_to_numpy(y_mel[0].data.cpu().numpy()), - "slice/mel_gen": utils.plot_spectrogram_to_numpy(y_hat_mel[0].data.cpu().numpy()), - "all/mel": utils.plot_spectrogram_to_numpy(mel[0].data.cpu().numpy()), - "all/attn": utils.plot_alignment_to_numpy(attn[0, 0].data.cpu().numpy()) + "slice/mel_org": utils.plot_spectrogram_to_numpy( + y_mel[0].data.cpu().numpy() + ), + "slice/mel_gen": utils.plot_spectrogram_to_numpy( + y_hat_mel[0].data.cpu().numpy() + ), + "all/mel": utils.plot_spectrogram_to_numpy( + mel[0].data.cpu().numpy() + ), + "all/attn": utils.plot_alignment_to_numpy( + attn[0, 0].data.cpu().numpy() + ), } utils.summarize( writer=writer, global_step=global_step, images=image_dict, - scalars=scalar_dict) + scalars=scalar_dict, + ) if global_step % hps.train.eval_interval == 0: evaluate(hps, net_g, eval_loader, writer_eval) - utils.save_checkpoint(net_g, optim_g, hps.train.learning_rate, epoch, - os.path.join(hps.model_dir, "G_{}.pth".format(global_step))) - utils.save_checkpoint(net_d, optim_d, hps.train.learning_rate, epoch, - os.path.join(hps.model_dir, "D_{}.pth".format(global_step))) + utils.save_checkpoint( + net_g, + optim_g, + hps.train.learning_rate, + epoch, + os.path.join(hps.model_dir, "G_{}.pth".format(global_step)), + ) + utils.save_checkpoint( + net_d, + optim_d, + hps.train.learning_rate, + epoch, + os.path.join(hps.model_dir, "D_{}.pth".format(global_step)), + ) if net_dur_disc is not None: - utils.save_checkpoint(net_dur_disc, optim_dur_disc, hps.train.learning_rate, epoch, os.path.join(hps.model_dir, "DUR_{}.pth".format(global_step))) - keep_ckpts = getattr(hps.train, 'keep_ckpts', 5) + utils.save_checkpoint( + net_dur_disc, + optim_dur_disc, + hps.train.learning_rate, + epoch, + os.path.join(hps.model_dir, "DUR_{}.pth".format(global_step)), + ) + keep_ckpts = getattr(hps.train, "keep_ckpts", 5) if keep_ckpts > 0: - utils.clean_checkpoints(path_to_models=hps.model_dir, n_ckpts_to_keep=keep_ckpts, sort_by_time=True) - + utils.clean_checkpoints( + path_to_models=hps.model_dir, + n_ckpts_to_keep=keep_ckpts, + sort_by_time=True, + ) global_step += 1 if rank == 0: - logger.info('====> Epoch: {}'.format(epoch)) - + logger.info("====> Epoch: {}".format(epoch)) def evaluate(hps, generator, eval_loader, writer_eval): @@ -322,7 +494,19 @@ def evaluate(hps, generator, eval_loader, writer_eval): audio_dict = {} print("Evaluating ...") with torch.no_grad(): - for batch_idx, (x, x_lengths, spec, spec_lengths, y, y_lengths, speakers, tone, language, bert, ja_bert) in enumerate(eval_loader): + for batch_idx, ( + x, + x_lengths, + spec, + spec_lengths, + y, + y_lengths, + speakers, + tone, + language, + bert, + ja_bert, + ) in enumerate(eval_loader): x, x_lengths = x.cuda(), x_lengths.cuda() spec, spec_lengths = spec.cuda(), spec_lengths.cuda() y, y_lengths = y.cuda(), y_lengths.cuda() @@ -332,7 +516,18 @@ def evaluate(hps, generator, eval_loader, writer_eval): tone = tone.cuda() language = language.cuda() for use_sdp in [True, False]: - y_hat, attn, mask, *_ = generator.module.infer(x, x_lengths, speakers, tone, language, bert, ja_bert, y=spec, max_len=1000, sdp_ratio=0.0 if not use_sdp else 1.0) + y_hat, attn, mask, *_ = generator.module.infer( + x, + x_lengths, + speakers, + tone, + language, + bert, + ja_bert, + y=spec, + max_len=1000, + sdp_ratio=0.0 if not use_sdp else 1.0, + ) y_hat_lengths = mask.sum([1, 2]).long() * hps.data.hop_length mel = spec_to_mel_torch( @@ -341,7 +536,8 @@ def evaluate(hps, generator, eval_loader, writer_eval): hps.data.n_mel_channels, hps.data.sampling_rate, hps.data.mel_fmin, - hps.data.mel_fmax) + hps.data.mel_fmax, + ) y_hat_mel = mel_spectrogram_torch( y_hat.squeeze(1).float(), hps.data.filter_length, @@ -350,25 +546,40 @@ def evaluate(hps, generator, eval_loader, writer_eval): hps.data.hop_length, hps.data.win_length, hps.data.mel_fmin, - hps.data.mel_fmax + hps.data.mel_fmax, + ) + image_dict.update( + { + f"gen/mel_{batch_idx}": utils.plot_spectrogram_to_numpy( + y_hat_mel[0].cpu().numpy() + ) + } ) - image_dict.update({ - f"gen/mel_{batch_idx}": utils.plot_spectrogram_to_numpy(y_hat_mel[0].cpu().numpy()) - }) - audio_dict.update({ - f"gen/audio_{batch_idx}_{use_sdp}": y_hat[0, :, :y_hat_lengths[0]] - }) - image_dict.update({f"gt/mel_{batch_idx}": utils.plot_spectrogram_to_numpy(mel[0].cpu().numpy())}) - audio_dict.update({f"gt/audio_{batch_idx}": y[0, :, :y_lengths[0]]}) + audio_dict.update( + { + f"gen/audio_{batch_idx}_{use_sdp}": y_hat[ + 0, :, : y_hat_lengths[0] + ] + } + ) + image_dict.update( + { + f"gt/mel_{batch_idx}": utils.plot_spectrogram_to_numpy( + mel[0].cpu().numpy() + ) + } + ) + audio_dict.update({f"gt/audio_{batch_idx}": y[0, :, : y_lengths[0]]}) utils.summarize( writer=writer_eval, global_step=global_step, images=image_dict, audios=audio_dict, - audio_sampling_rate=hps.data.sampling_rate + audio_sampling_rate=hps.data.sampling_rate, ) generator.train() + if __name__ == "__main__": run() diff --git a/transforms.py b/transforms.py index 4793d67ca..a11f799e0 100644 --- a/transforms.py +++ b/transforms.py @@ -9,66 +9,63 @@ DEFAULT_MIN_DERIVATIVE = 1e-3 -def piecewise_rational_quadratic_transform(inputs, - unnormalized_widths, - unnormalized_heights, - unnormalized_derivatives, - inverse=False, - tails=None, - tail_bound=1., - min_bin_width=DEFAULT_MIN_BIN_WIDTH, - min_bin_height=DEFAULT_MIN_BIN_HEIGHT, - min_derivative=DEFAULT_MIN_DERIVATIVE): - +def piecewise_rational_quadratic_transform( + inputs, + unnormalized_widths, + unnormalized_heights, + unnormalized_derivatives, + inverse=False, + tails=None, + tail_bound=1.0, + min_bin_width=DEFAULT_MIN_BIN_WIDTH, + min_bin_height=DEFAULT_MIN_BIN_HEIGHT, + min_derivative=DEFAULT_MIN_DERIVATIVE, +): if tails is None: spline_fn = rational_quadratic_spline spline_kwargs = {} else: spline_fn = unconstrained_rational_quadratic_spline - spline_kwargs = { - 'tails': tails, - 'tail_bound': tail_bound - } + spline_kwargs = {"tails": tails, "tail_bound": tail_bound} outputs, logabsdet = spline_fn( - inputs=inputs, - unnormalized_widths=unnormalized_widths, - unnormalized_heights=unnormalized_heights, - unnormalized_derivatives=unnormalized_derivatives, - inverse=inverse, - min_bin_width=min_bin_width, - min_bin_height=min_bin_height, - min_derivative=min_derivative, - **spline_kwargs + inputs=inputs, + unnormalized_widths=unnormalized_widths, + unnormalized_heights=unnormalized_heights, + unnormalized_derivatives=unnormalized_derivatives, + inverse=inverse, + min_bin_width=min_bin_width, + min_bin_height=min_bin_height, + min_derivative=min_derivative, + **spline_kwargs ) return outputs, logabsdet def searchsorted(bin_locations, inputs, eps=1e-6): bin_locations[..., -1] += eps - return torch.sum( - inputs[..., None] >= bin_locations, - dim=-1 - ) - 1 - - -def unconstrained_rational_quadratic_spline(inputs, - unnormalized_widths, - unnormalized_heights, - unnormalized_derivatives, - inverse=False, - tails='linear', - tail_bound=1., - min_bin_width=DEFAULT_MIN_BIN_WIDTH, - min_bin_height=DEFAULT_MIN_BIN_HEIGHT, - min_derivative=DEFAULT_MIN_DERIVATIVE): + return torch.sum(inputs[..., None] >= bin_locations, dim=-1) - 1 + + +def unconstrained_rational_quadratic_spline( + inputs, + unnormalized_widths, + unnormalized_heights, + unnormalized_derivatives, + inverse=False, + tails="linear", + tail_bound=1.0, + min_bin_width=DEFAULT_MIN_BIN_WIDTH, + min_bin_height=DEFAULT_MIN_BIN_HEIGHT, + min_derivative=DEFAULT_MIN_DERIVATIVE, +): inside_interval_mask = (inputs >= -tail_bound) & (inputs <= tail_bound) outside_interval_mask = ~inside_interval_mask outputs = torch.zeros_like(inputs) logabsdet = torch.zeros_like(inputs) - if tails == 'linear': + if tails == "linear": unnormalized_derivatives = F.pad(unnormalized_derivatives, pad=(1, 1)) constant = np.log(np.exp(1 - min_derivative) - 1) unnormalized_derivatives[..., 0] = constant @@ -77,45 +74,57 @@ def unconstrained_rational_quadratic_spline(inputs, outputs[outside_interval_mask] = inputs[outside_interval_mask] logabsdet[outside_interval_mask] = 0 else: - raise RuntimeError('{} tails are not implemented.'.format(tails)) + raise RuntimeError("{} tails are not implemented.".format(tails)) - outputs[inside_interval_mask], logabsdet[inside_interval_mask] = rational_quadratic_spline( + ( + outputs[inside_interval_mask], + logabsdet[inside_interval_mask], + ) = rational_quadratic_spline( inputs=inputs[inside_interval_mask], unnormalized_widths=unnormalized_widths[inside_interval_mask, :], unnormalized_heights=unnormalized_heights[inside_interval_mask, :], unnormalized_derivatives=unnormalized_derivatives[inside_interval_mask, :], inverse=inverse, - left=-tail_bound, right=tail_bound, bottom=-tail_bound, top=tail_bound, + left=-tail_bound, + right=tail_bound, + bottom=-tail_bound, + top=tail_bound, min_bin_width=min_bin_width, min_bin_height=min_bin_height, - min_derivative=min_derivative + min_derivative=min_derivative, ) return outputs, logabsdet -def rational_quadratic_spline(inputs, - unnormalized_widths, - unnormalized_heights, - unnormalized_derivatives, - inverse=False, - left=0., right=1., bottom=0., top=1., - min_bin_width=DEFAULT_MIN_BIN_WIDTH, - min_bin_height=DEFAULT_MIN_BIN_HEIGHT, - min_derivative=DEFAULT_MIN_DERIVATIVE): + +def rational_quadratic_spline( + inputs, + unnormalized_widths, + unnormalized_heights, + unnormalized_derivatives, + inverse=False, + left=0.0, + right=1.0, + bottom=0.0, + top=1.0, + min_bin_width=DEFAULT_MIN_BIN_WIDTH, + min_bin_height=DEFAULT_MIN_BIN_HEIGHT, + min_derivative=DEFAULT_MIN_DERIVATIVE, +): if torch.min(inputs) < left or torch.max(inputs) > right: - raise ValueError('Input to a transform is not within its domain') + raise ValueError("Input to a transform is not within its domain") num_bins = unnormalized_widths.shape[-1] if min_bin_width * num_bins > 1.0: - raise ValueError('Minimal bin width too large for the number of bins') + raise ValueError("Minimal bin width too large for the number of bins") if min_bin_height * num_bins > 1.0: - raise ValueError('Minimal bin height too large for the number of bins') + raise ValueError("Minimal bin height too large for the number of bins") widths = F.softmax(unnormalized_widths, dim=-1) widths = min_bin_width + (1 - min_bin_width * num_bins) * widths cumwidths = torch.cumsum(widths, dim=-1) - cumwidths = F.pad(cumwidths, pad=(1, 0), mode='constant', value=0.0) + cumwidths = F.pad(cumwidths, pad=(1, 0), mode="constant", value=0.0) cumwidths = (right - left) * cumwidths + left cumwidths[..., 0] = left cumwidths[..., -1] = right @@ -126,7 +135,7 @@ def rational_quadratic_spline(inputs, heights = F.softmax(unnormalized_heights, dim=-1) heights = min_bin_height + (1 - min_bin_height * num_bins) * heights cumheights = torch.cumsum(heights, dim=-1) - cumheights = F.pad(cumheights, pad=(1, 0), mode='constant', value=0.0) + cumheights = F.pad(cumheights, pad=(1, 0), mode="constant", value=0.0) cumheights = (top - bottom) * cumheights + bottom cumheights[..., 0] = bottom cumheights[..., -1] = top @@ -150,15 +159,13 @@ def rational_quadratic_spline(inputs, input_heights = heights.gather(-1, bin_idx)[..., 0] if inverse: - a = (((inputs - input_cumheights) * (input_derivatives - + input_derivatives_plus_one - - 2 * input_delta) - + input_heights * (input_delta - input_derivatives))) - b = (input_heights * input_derivatives - - (inputs - input_cumheights) * (input_derivatives - + input_derivatives_plus_one - - 2 * input_delta)) - c = - input_delta * (inputs - input_cumheights) + a = (inputs - input_cumheights) * ( + input_derivatives + input_derivatives_plus_one - 2 * input_delta + ) + input_heights * (input_delta - input_derivatives) + b = input_heights * input_derivatives - (inputs - input_cumheights) * ( + input_derivatives + input_derivatives_plus_one - 2 * input_delta + ) + c = -input_delta * (inputs - input_cumheights) discriminant = b.pow(2) - 4 * a * c assert (discriminant >= 0).all() @@ -167,11 +174,15 @@ def rational_quadratic_spline(inputs, outputs = root * input_bin_widths + input_cumwidths theta_one_minus_theta = root * (1 - root) - denominator = input_delta + ((input_derivatives + input_derivatives_plus_one - 2 * input_delta) - * theta_one_minus_theta) - derivative_numerator = input_delta.pow(2) * (input_derivatives_plus_one * root.pow(2) - + 2 * input_delta * theta_one_minus_theta - + input_derivatives * (1 - root).pow(2)) + denominator = input_delta + ( + (input_derivatives + input_derivatives_plus_one - 2 * input_delta) + * theta_one_minus_theta + ) + derivative_numerator = input_delta.pow(2) * ( + input_derivatives_plus_one * root.pow(2) + + 2 * input_delta * theta_one_minus_theta + + input_derivatives * (1 - root).pow(2) + ) logabsdet = torch.log(derivative_numerator) - 2 * torch.log(denominator) return outputs, -logabsdet @@ -179,15 +190,20 @@ def rational_quadratic_spline(inputs, theta = (inputs - input_cumwidths) / input_bin_widths theta_one_minus_theta = theta * (1 - theta) - numerator = input_heights * (input_delta * theta.pow(2) - + input_derivatives * theta_one_minus_theta) - denominator = input_delta + ((input_derivatives + input_derivatives_plus_one - 2 * input_delta) - * theta_one_minus_theta) + numerator = input_heights * ( + input_delta * theta.pow(2) + input_derivatives * theta_one_minus_theta + ) + denominator = input_delta + ( + (input_derivatives + input_derivatives_plus_one - 2 * input_delta) + * theta_one_minus_theta + ) outputs = input_cumheights + numerator / denominator - derivative_numerator = input_delta.pow(2) * (input_derivatives_plus_one * theta.pow(2) - + 2 * input_delta * theta_one_minus_theta - + input_derivatives * (1 - theta).pow(2)) + derivative_numerator = input_delta.pow(2) * ( + input_derivatives_plus_one * theta.pow(2) + + 2 * input_delta * theta_one_minus_theta + + input_derivatives * (1 - theta).pow(2) + ) logabsdet = torch.log(derivative_numerator) - 2 * torch.log(denominator) return outputs, logabsdet diff --git a/utils.py b/utils.py index a5dae7bff..0d6fa36ff 100644 --- a/utils.py +++ b/utils.py @@ -16,20 +16,24 @@ def load_checkpoint(checkpoint_path, model, optimizer=None, skip_optimizer=False): assert os.path.isfile(checkpoint_path) - checkpoint_dict = torch.load(checkpoint_path, map_location='cpu') - iteration = checkpoint_dict['iteration'] - learning_rate = checkpoint_dict['learning_rate'] - if optimizer is not None and not skip_optimizer and checkpoint_dict['optimizer'] is not None: - optimizer.load_state_dict(checkpoint_dict['optimizer']) - elif optimizer is None and not skip_optimizer: - #else: Disable this line if Infer and resume checkpoint,then enable the line upper + checkpoint_dict = torch.load(checkpoint_path, map_location="cpu") + iteration = checkpoint_dict["iteration"] + learning_rate = checkpoint_dict["learning_rate"] + if ( + optimizer is not None + and not skip_optimizer + and checkpoint_dict["optimizer"] is not None + ): + optimizer.load_state_dict(checkpoint_dict["optimizer"]) + elif optimizer is None and not skip_optimizer: + # else: Disable this line if Infer and resume checkpoint,then enable the line upper new_opt_dict = optimizer.state_dict() - new_opt_dict_params = new_opt_dict['param_groups'][0]['params'] - new_opt_dict['param_groups'] = checkpoint_dict['optimizer']['param_groups'] - new_opt_dict['param_groups'][0]['params'] = new_opt_dict_params + new_opt_dict_params = new_opt_dict["param_groups"][0]["params"] + new_opt_dict["param_groups"] = checkpoint_dict["optimizer"]["param_groups"] + new_opt_dict["param_groups"][0]["params"] = new_opt_dict_params optimizer.load_state_dict(new_opt_dict) - saved_state_dict = checkpoint_dict['model'] - if hasattr(model, 'module'): + saved_state_dict = checkpoint_dict["model"] + if hasattr(model, "module"): state_dict = model.module.state_dict() else: state_dict = model.state_dict() @@ -38,39 +42,59 @@ def load_checkpoint(checkpoint_path, model, optimizer=None, skip_optimizer=False try: # assert "emb_g" not in k new_state_dict[k] = saved_state_dict[k] - assert saved_state_dict[k].shape == v.shape, (saved_state_dict[k].shape, v.shape) + assert saved_state_dict[k].shape == v.shape, ( + saved_state_dict[k].shape, + v.shape, + ) except: logger.error("%s is not in the checkpoint" % k) new_state_dict[k] = v - if hasattr(model, 'module'): + if hasattr(model, "module"): model.module.load_state_dict(new_state_dict, strict=False) else: model.load_state_dict(new_state_dict, strict=False) - logger.info("Loaded checkpoint '{}' (iteration {})".format( - checkpoint_path, iteration)) + logger.info( + "Loaded checkpoint '{}' (iteration {})".format(checkpoint_path, iteration) + ) return model, optimizer, learning_rate, iteration def save_checkpoint(model, optimizer, learning_rate, iteration, checkpoint_path): - logger.info("Saving model and optimizer state at iteration {} to {}".format( - iteration, checkpoint_path)) - if hasattr(model, 'module'): + logger.info( + "Saving model and optimizer state at iteration {} to {}".format( + iteration, checkpoint_path + ) + ) + if hasattr(model, "module"): state_dict = model.module.state_dict() else: state_dict = model.state_dict() - torch.save({'model': state_dict, - 'iteration': iteration, - 'optimizer': optimizer.state_dict(), - 'learning_rate': learning_rate}, checkpoint_path) - - -def summarize(writer, global_step, scalars={}, histograms={}, images={}, audios={}, audio_sampling_rate=22050): + torch.save( + { + "model": state_dict, + "iteration": iteration, + "optimizer": optimizer.state_dict(), + "learning_rate": learning_rate, + }, + checkpoint_path, + ) + + +def summarize( + writer, + global_step, + scalars={}, + histograms={}, + images={}, + audios={}, + audio_sampling_rate=22050, +): for k, v in scalars.items(): writer.add_scalar(k, v, global_step) for k, v in histograms.items(): writer.add_histogram(k, v, global_step) for k, v in images.items(): - writer.add_image(k, v, global_step, dataformats='HWC') + writer.add_image(k, v, global_step, dataformats="HWC") for k, v in audios.items(): writer.add_audio(k, v, global_step, audio_sampling_rate) @@ -86,23 +110,23 @@ def plot_spectrogram_to_numpy(spectrogram): global MATPLOTLIB_FLAG if not MATPLOTLIB_FLAG: import matplotlib + matplotlib.use("Agg") MATPLOTLIB_FLAG = True - mpl_logger = logging.getLogger('matplotlib') + mpl_logger = logging.getLogger("matplotlib") mpl_logger.setLevel(logging.WARNING) import matplotlib.pylab as plt import numpy as np fig, ax = plt.subplots(figsize=(10, 2)) - im = ax.imshow(spectrogram, aspect="auto", origin="lower", - interpolation='none') + im = ax.imshow(spectrogram, aspect="auto", origin="lower", interpolation="none") plt.colorbar(im, ax=ax) plt.xlabel("Frames") plt.ylabel("Channels") plt.tight_layout() fig.canvas.draw() - data = np.fromstring(fig.canvas.tostring_rgb(), dtype=np.uint8, sep='') + data = np.fromstring(fig.canvas.tostring_rgb(), dtype=np.uint8, sep="") data = data.reshape(fig.canvas.get_width_height()[::-1] + (3,)) plt.close() return data @@ -112,26 +136,28 @@ def plot_alignment_to_numpy(alignment, info=None): global MATPLOTLIB_FLAG if not MATPLOTLIB_FLAG: import matplotlib + matplotlib.use("Agg") MATPLOTLIB_FLAG = True - mpl_logger = logging.getLogger('matplotlib') + mpl_logger = logging.getLogger("matplotlib") mpl_logger.setLevel(logging.WARNING) import matplotlib.pylab as plt import numpy as np fig, ax = plt.subplots(figsize=(6, 4)) - im = ax.imshow(alignment.transpose(), aspect='auto', origin='lower', - interpolation='none') + im = ax.imshow( + alignment.transpose(), aspect="auto", origin="lower", interpolation="none" + ) fig.colorbar(im, ax=ax) - xlabel = 'Decoder timestep' + xlabel = "Decoder timestep" if info is not None: - xlabel += '\n\n' + info + xlabel += "\n\n" + info plt.xlabel(xlabel) - plt.ylabel('Encoder timestep') + plt.ylabel("Encoder timestep") plt.tight_layout() fig.canvas.draw() - data = np.fromstring(fig.canvas.tostring_rgb(), dtype=np.uint8, sep='') + data = np.fromstring(fig.canvas.tostring_rgb(), dtype=np.uint8, sep="") data = data.reshape(fig.canvas.get_width_height()[::-1] + (3,)) plt.close() return data @@ -143,17 +169,21 @@ def load_wav_to_torch(full_path): def load_filepaths_and_text(filename, split="|"): - with open(filename, encoding='utf-8') as f: + with open(filename, encoding="utf-8") as f: filepaths_and_text = [line.strip().split(split) for line in f] return filepaths_and_text def get_hparams(init=True): parser = argparse.ArgumentParser() - parser.add_argument('-c', '--config', type=str, default="./configs/base.json", - help='JSON file for configuration') - parser.add_argument('-m', '--model', type=str, required=True, - help='Model name') + parser.add_argument( + "-c", + "--config", + type=str, + default="./configs/base.json", + help="JSON file for configuration", + ) + parser.add_argument("-m", "--model", type=str, required=True, help="Model name") args = parser.parse_args() model_dir = os.path.join("./logs", args.model) @@ -178,31 +208,41 @@ def get_hparams(init=True): return hparams -def clean_checkpoints(path_to_models='logs/44k/', n_ckpts_to_keep=2, sort_by_time=True): +def clean_checkpoints(path_to_models="logs/44k/", n_ckpts_to_keep=2, sort_by_time=True): """Freeing up space by deleting saved ckpts - Arguments: - path_to_models -- Path to the model directory - n_ckpts_to_keep -- Number of ckpts to keep, excluding G_0.pth and D_0.pth - sort_by_time -- True -> chronologically delete ckpts - False -> lexicographically delete ckpts - """ + Arguments: + path_to_models -- Path to the model directory + n_ckpts_to_keep -- Number of ckpts to keep, excluding G_0.pth and D_0.pth + sort_by_time -- True -> chronologically delete ckpts + False -> lexicographically delete ckpts + """ import re - ckpts_files = [f for f in os.listdir(path_to_models) if os.path.isfile(os.path.join(path_to_models, f))] - name_key = (lambda _f: int(re.compile('._(\d+)\.pth').match(_f).group(1))) - time_key = (lambda _f: os.path.getmtime(os.path.join(path_to_models, _f))) + + ckpts_files = [ + f + for f in os.listdir(path_to_models) + if os.path.isfile(os.path.join(path_to_models, f)) + ] + name_key = lambda _f: int(re.compile("._(\d+)\.pth").match(_f).group(1)) + time_key = lambda _f: os.path.getmtime(os.path.join(path_to_models, _f)) sort_key = time_key if sort_by_time else name_key - x_sorted = lambda _x: sorted([f for f in ckpts_files if f.startswith(_x) and not f.endswith('_0.pth')], - key=sort_key) - to_del = [os.path.join(path_to_models, fn) for fn in - (x_sorted('G')[:-n_ckpts_to_keep] + x_sorted('D')[:-n_ckpts_to_keep])] + x_sorted = lambda _x: sorted( + [f for f in ckpts_files if f.startswith(_x) and not f.endswith("_0.pth")], + key=sort_key, + ) + to_del = [ + os.path.join(path_to_models, fn) + for fn in (x_sorted("G")[:-n_ckpts_to_keep] + x_sorted("D")[:-n_ckpts_to_keep]) + ] del_info = lambda fn: logger.info(f".. Free up space by deleting ckpt {fn}") del_routine = lambda x: [os.remove(x), del_info(x)] rs = [del_routine(fn) for fn in to_del] + def get_hparams_from_dir(model_dir): config_save_path = os.path.join(model_dir, "config.json") - with open(config_save_path, "r", encoding='utf-8') as f: + with open(config_save_path, "r", encoding="utf-8") as f: data = f.read() config = json.loads(data) @@ -212,7 +252,7 @@ def get_hparams_from_dir(model_dir): def get_hparams_from_file(config_path): - with open(config_path, "r", encoding='utf-8') as f: + with open(config_path, "r", encoding="utf-8") as f: data = f.read() config = json.loads(data) @@ -223,9 +263,11 @@ def get_hparams_from_file(config_path): def check_git_hash(model_dir): source_dir = os.path.dirname(os.path.realpath(__file__)) if not os.path.exists(os.path.join(source_dir, ".git")): - logger.warn("{} is not a git repository, therefore hash value comparison will be ignored.".format( - source_dir - )) + logger.warn( + "{} is not a git repository, therefore hash value comparison will be ignored.".format( + source_dir + ) + ) return cur_hash = subprocess.getoutput("git rev-parse HEAD") @@ -234,8 +276,11 @@ def check_git_hash(model_dir): if os.path.exists(path): saved_hash = open(path).read() if saved_hash != cur_hash: - logger.warn("git hash values are different. {}(saved) != {}(current)".format( - saved_hash[:8], cur_hash[:8])) + logger.warn( + "git hash values are different. {}(saved) != {}(current)".format( + saved_hash[:8], cur_hash[:8] + ) + ) else: open(path, "w").write(cur_hash) @@ -255,7 +300,7 @@ def get_logger(model_dir, filename="train.log"): return logger -class HParams(): +class HParams: def __init__(self, **kwargs): for k, v in kwargs.items(): if type(v) == dict: diff --git a/webui.py b/webui.py index 130ba9f8a..334120e0e 100644 --- a/webui.py +++ b/webui.py @@ -10,7 +10,9 @@ logging.getLogger("urllib3").setLevel(logging.WARNING) logging.getLogger("matplotlib").setLevel(logging.WARNING) -logging.basicConfig(level=logging.INFO, format="| %(name)s | %(levelname)s | %(message)s") +logging.basicConfig( + level=logging.INFO, format="| %(name)s | %(levelname)s | %(message)s" +) logger = logging.getLogger(__name__) @@ -27,6 +29,7 @@ net_g = None + def get_text(text, language_str, hps): norm_text, phone, tone, word2ph = clean_text(text, language_str) phone, tone, language = cleaned_text_to_sequence(phone, tone, language_str) @@ -42,52 +45,101 @@ def get_text(text, language_str, hps): del word2ph assert bert.shape[-1] == len(phone), phone - if language_str=='ZH': + if language_str == "ZH": bert = bert ja_bert = torch.zeros(768, len(phone)) - elif language_str=="JA": + elif language_str == "JA": ja_bert = bert bert = torch.zeros(1024, len(phone)) else: bert = torch.zeros(1024, len(phone)) ja_bert = torch.zeros(768, len(phone)) assert bert.shape[-1] == len(phone), ( - bert.shape, len(phone), sum(word2ph), p1, p2, t1, t2, pold, pold2, word2ph, text, w2pho) + bert.shape, + len(phone), + sum(word2ph), + p1, + p2, + t1, + t2, + pold, + pold2, + word2ph, + text, + w2pho, + ) phone = torch.LongTensor(phone) tone = torch.LongTensor(tone) language = torch.LongTensor(language) return bert, ja_bert, phone, tone, language - + + def infer(text, sdp_ratio, noise_scale, noise_scale_w, length_scale, sid, language): global net_g bert, ja_bert, phones, tones, lang_ids = get_text(text, language, hps) with torch.no_grad(): - x_tst=phones.to(device).unsqueeze(0) - tones=tones.to(device).unsqueeze(0) - lang_ids=lang_ids.to(device).unsqueeze(0) + x_tst = phones.to(device).unsqueeze(0) + tones = tones.to(device).unsqueeze(0) + lang_ids = lang_ids.to(device).unsqueeze(0) bert = bert.to(device).unsqueeze(0) ja_bert = ja_bert.to(device).unsqueeze(0) x_tst_lengths = torch.LongTensor([phones.size(0)]).to(device) del phones speakers = torch.LongTensor([hps.data.spk2id[sid]]).to(device) - audio = net_g.infer(x_tst, x_tst_lengths, speakers, tones, lang_ids, bert, ja_bert, sdp_ratio=sdp_ratio - , noise_scale=noise_scale, noise_scale_w=noise_scale_w, length_scale=length_scale)[0][0,0].data.cpu().float().numpy() + audio = ( + net_g.infer( + x_tst, + x_tst_lengths, + speakers, + tones, + lang_ids, + bert, + ja_bert, + sdp_ratio=sdp_ratio, + noise_scale=noise_scale, + noise_scale_w=noise_scale_w, + length_scale=length_scale, + )[0][0, 0] + .data.cpu() + .float() + .numpy() + ) del x_tst, tones, lang_ids, bert, x_tst_lengths, speakers return audio -def tts_fn(text, speaker, sdp_ratio, noise_scale, noise_scale_w, length_scale, language): + +def tts_fn( + text, speaker, sdp_ratio, noise_scale, noise_scale_w, length_scale, language +): with torch.no_grad(): - audio = infer(text, sdp_ratio=sdp_ratio, noise_scale=noise_scale, noise_scale_w=noise_scale_w, length_scale=length_scale, sid=speaker, language=language) + audio = infer( + text, + sdp_ratio=sdp_ratio, + noise_scale=noise_scale, + noise_scale_w=noise_scale_w, + length_scale=length_scale, + sid=speaker, + language=language, + ) torch.cuda.empty_cache() return "Success", (hps.data.sampling_rate, audio) if __name__ == "__main__": parser = argparse.ArgumentParser() - parser.add_argument("-m", "--model", default="./logs/as/G_8000.pth", help="path of your model") - parser.add_argument("-c", "--config", default="./configs/config.json", help="path of your config file") + parser.add_argument( + "-m", "--model", default="./logs/as/G_8000.pth", help="path of your model" + ) + parser.add_argument( + "-c", + "--config", + default="./configs/config.json", + help="path of your config file", + ) parser.add_argument("--share", default=False, help="make link public") - parser.add_argument("-d", "--debug", action="store_true", help="enable DEBUG-LEVEL log") + parser.add_argument( + "-d", "--debug", action="store_true", help="enable DEBUG-LEVEL log" + ) args = parser.parse_args() if args.debug: @@ -109,33 +161,51 @@ def tts_fn(text, speaker, sdp_ratio, noise_scale, noise_scale_w, length_scale, l hps.data.filter_length // 2 + 1, hps.train.segment_size // hps.data.hop_length, n_speakers=hps.data.n_speakers, - **hps.model).to(device) + **hps.model + ).to(device) _ = net_g.eval() _ = utils.load_checkpoint(args.model, net_g, None, skip_optimizer=True) speaker_ids = hps.data.spk2id speakers = list(speaker_ids.keys()) - languages = ["ZH","JA"] + languages = ["ZH", "JA"] with gr.Blocks() as app: with gr.Row(): with gr.Column(): - text = gr.TextArea(label="Text", placeholder="Input Text Here", - value="吃葡萄不吐葡萄皮,不吃葡萄倒吐葡萄皮。") - speaker = gr.Dropdown(choices=speakers, value=speakers[0], label='Speaker') - sdp_ratio = gr.Slider(minimum=0, maximum=1, value=0.2, step=0.1, label='SDP Ratio') - noise_scale = gr.Slider(minimum=0.1, maximum=2, value=0.6, step=0.1, label='Noise Scale') - noise_scale_w = gr.Slider(minimum=0.1, maximum=2, value=0.8, step=0.1, label='Noise Scale W') - length_scale = gr.Slider(minimum=0.1, maximum=2, value=1, step=0.1, label='Length Scale') - language = gr.Dropdown(choices=languages, value=languages[0], label='Language') + text = gr.TextArea( + label="Text", + placeholder="Input Text Here", + value="吃葡萄不吐葡萄皮,不吃葡萄倒吐葡萄皮。", + ) + speaker = gr.Dropdown( + choices=speakers, value=speakers[0], label="Speaker" + ) + sdp_ratio = gr.Slider( + minimum=0, maximum=1, value=0.2, step=0.1, label="SDP Ratio" + ) + noise_scale = gr.Slider( + minimum=0.1, maximum=2, value=0.6, step=0.1, label="Noise Scale" + ) + noise_scale_w = gr.Slider( + minimum=0.1, maximum=2, value=0.8, step=0.1, label="Noise Scale W" + ) + length_scale = gr.Slider( + minimum=0.1, maximum=2, value=1, step=0.1, label="Length Scale" + ) + language = gr.Dropdown( + choices=languages, value=languages[0], label="Language" + ) btn = gr.Button("Generate!", variant="primary") with gr.Column(): text_output = gr.Textbox(label="Message") audio_output = gr.Audio(label="Output Audio") - btn.click(tts_fn, - inputs=[text, speaker, sdp_ratio, noise_scale, noise_scale_w, length_scale], - outputs=[text_output, audio_output]) - + btn.click( + tts_fn, + inputs=[text, speaker, sdp_ratio, noise_scale, noise_scale_w, length_scale], + outputs=[text_output, audio_output], + ) + webbrowser.open("http://127.0.0.1:7860") app.launch(share=args.share) From 92f3fdd11f2840bb5b3700a65002d7e8b03626bd Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 6 Sep 2023 13:42:08 +0000 Subject: [PATCH 082/102] Format code --- attentions.py | 751 ++++++++++++++++++------------- bert_gen.py | 8 +- commons.py | 202 ++++----- data_utils.py | 155 +++++-- losses.py | 86 ++-- mel_processing.py | 94 ++-- models.py | 3 - modules.py | 870 +++++++++++++++++++++--------------- monotonic_align/__init__.py | 19 +- monotonic_align/core.py | 67 +-- preprocess_text.py | 1 - resample.py | 30 +- server.py | 93 +++- text/__init__.py | 35 +- text/chinese.py | 143 +++--- text/chinese_bert.py | 63 ++- text/cleaner.py | 10 +- text/english.py | 121 ++++- text/japanese.py | 54 ++- text/japanese_bert.py | 17 +- text/symbols.py | 183 +++++++- text/tone_sandhi.py | 610 +++++++++++++++++++++---- train_ms.py | 425 +++++++++++++----- transforms.py | 176 ++++---- utils.py | 175 +++++--- webui.py | 128 ++++-- 26 files changed, 3002 insertions(+), 1517 deletions(-) diff --git a/attentions.py b/attentions.py index 1192dd726..88eeb078b 100644 --- a/attentions.py +++ b/attentions.py @@ -9,336 +9,457 @@ logger = logging.getLogger(__name__) + class LayerNorm(nn.Module): - def __init__(self, channels, eps=1e-5): - super().__init__() - self.channels = channels - self.eps = eps + def __init__(self, channels, eps=1e-5): + super().__init__() + self.channels = channels + self.eps = eps + + self.gamma = nn.Parameter(torch.ones(channels)) + self.beta = nn.Parameter(torch.zeros(channels)) - self.gamma = nn.Parameter(torch.ones(channels)) - self.beta = nn.Parameter(torch.zeros(channels)) + def forward(self, x): + x = x.transpose(1, -1) + x = F.layer_norm(x, (self.channels,), self.gamma, self.beta, self.eps) + return x.transpose(1, -1) - def forward(self, x): - x = x.transpose(1, -1) - x = F.layer_norm(x, (self.channels,), self.gamma, self.beta, self.eps) - return x.transpose(1, -1) - - @torch.jit.script def fused_add_tanh_sigmoid_multiply(input_a, input_b, n_channels): - n_channels_int = n_channels[0] - in_act = input_a + input_b - t_act = torch.tanh(in_act[:, :n_channels_int, :]) - s_act = torch.sigmoid(in_act[:, n_channels_int:, :]) - acts = t_act * s_act - return acts + n_channels_int = n_channels[0] + in_act = input_a + input_b + t_act = torch.tanh(in_act[:, :n_channels_int, :]) + s_act = torch.sigmoid(in_act[:, n_channels_int:, :]) + acts = t_act * s_act + return acts + class Encoder(nn.Module): - def __init__(self, hidden_channels, filter_channels, n_heads, n_layers, kernel_size=1, p_dropout=0., window_size=4, isflow = True, **kwargs): - super().__init__() - self.hidden_channels = hidden_channels - self.filter_channels = filter_channels - self.n_heads = n_heads - self.n_layers = n_layers - self.kernel_size = kernel_size - self.p_dropout = p_dropout - self.window_size = window_size - #if isflow: - # cond_layer = torch.nn.Conv1d(256, 2*hidden_channels*n_layers, 1) - # self.cond_pre = torch.nn.Conv1d(hidden_channels, 2*hidden_channels, 1) - # self.cond_layer = weight_norm(cond_layer, name='weight') - # self.gin_channels = 256 - self.cond_layer_idx = self.n_layers - if 'gin_channels' in kwargs: - self.gin_channels = kwargs['gin_channels'] - if self.gin_channels != 0: - self.spk_emb_linear = nn.Linear(self.gin_channels, self.hidden_channels) - # vits2 says 3rd block, so idx is 2 by default - self.cond_layer_idx = kwargs['cond_layer_idx'] if 'cond_layer_idx' in kwargs else 2 - logging.debug(self.gin_channels, self.cond_layer_idx) - assert self.cond_layer_idx < self.n_layers, 'cond_layer_idx should be less than n_layers' - self.drop = nn.Dropout(p_dropout) - self.attn_layers = nn.ModuleList() - self.norm_layers_1 = nn.ModuleList() - self.ffn_layers = nn.ModuleList() - self.norm_layers_2 = nn.ModuleList() - for i in range(self.n_layers): - self.attn_layers.append(MultiHeadAttention(hidden_channels, hidden_channels, n_heads, p_dropout=p_dropout, window_size=window_size)) - self.norm_layers_1.append(LayerNorm(hidden_channels)) - self.ffn_layers.append(FFN(hidden_channels, hidden_channels, filter_channels, kernel_size, p_dropout=p_dropout)) - self.norm_layers_2.append(LayerNorm(hidden_channels)) - def forward(self, x, x_mask, g=None): - attn_mask = x_mask.unsqueeze(2) * x_mask.unsqueeze(-1) - x = x * x_mask - for i in range(self.n_layers): - if i == self.cond_layer_idx and g is not None: - g = self.spk_emb_linear(g.transpose(1, 2)) - g = g.transpose(1, 2) - x = x + g + def __init__( + self, + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size=1, + p_dropout=0.0, + window_size=4, + isflow=True, + **kwargs + ): + super().__init__() + self.hidden_channels = hidden_channels + self.filter_channels = filter_channels + self.n_heads = n_heads + self.n_layers = n_layers + self.kernel_size = kernel_size + self.p_dropout = p_dropout + self.window_size = window_size + # if isflow: + # cond_layer = torch.nn.Conv1d(256, 2*hidden_channels*n_layers, 1) + # self.cond_pre = torch.nn.Conv1d(hidden_channels, 2*hidden_channels, 1) + # self.cond_layer = weight_norm(cond_layer, name='weight') + # self.gin_channels = 256 + self.cond_layer_idx = self.n_layers + if "gin_channels" in kwargs: + self.gin_channels = kwargs["gin_channels"] + if self.gin_channels != 0: + self.spk_emb_linear = nn.Linear(self.gin_channels, self.hidden_channels) + # vits2 says 3rd block, so idx is 2 by default + self.cond_layer_idx = ( + kwargs["cond_layer_idx"] if "cond_layer_idx" in kwargs else 2 + ) + logging.debug(self.gin_channels, self.cond_layer_idx) + assert ( + self.cond_layer_idx < self.n_layers + ), "cond_layer_idx should be less than n_layers" + self.drop = nn.Dropout(p_dropout) + self.attn_layers = nn.ModuleList() + self.norm_layers_1 = nn.ModuleList() + self.ffn_layers = nn.ModuleList() + self.norm_layers_2 = nn.ModuleList() + for i in range(self.n_layers): + self.attn_layers.append( + MultiHeadAttention( + hidden_channels, + hidden_channels, + n_heads, + p_dropout=p_dropout, + window_size=window_size, + ) + ) + self.norm_layers_1.append(LayerNorm(hidden_channels)) + self.ffn_layers.append( + FFN( + hidden_channels, + hidden_channels, + filter_channels, + kernel_size, + p_dropout=p_dropout, + ) + ) + self.norm_layers_2.append(LayerNorm(hidden_channels)) + + def forward(self, x, x_mask, g=None): + attn_mask = x_mask.unsqueeze(2) * x_mask.unsqueeze(-1) x = x * x_mask - y = self.attn_layers[i](x, x, attn_mask) - y = self.drop(y) - x = self.norm_layers_1[i](x + y) - - y = self.ffn_layers[i](x, x_mask) - y = self.drop(y) - x = self.norm_layers_2[i](x + y) - x = x * x_mask - return x + for i in range(self.n_layers): + if i == self.cond_layer_idx and g is not None: + g = self.spk_emb_linear(g.transpose(1, 2)) + g = g.transpose(1, 2) + x = x + g + x = x * x_mask + y = self.attn_layers[i](x, x, attn_mask) + y = self.drop(y) + x = self.norm_layers_1[i](x + y) + + y = self.ffn_layers[i](x, x_mask) + y = self.drop(y) + x = self.norm_layers_2[i](x + y) + x = x * x_mask + return x class Decoder(nn.Module): - def __init__(self, hidden_channels, filter_channels, n_heads, n_layers, kernel_size=1, p_dropout=0., proximal_bias=False, proximal_init=True, **kwargs): - super().__init__() - self.hidden_channels = hidden_channels - self.filter_channels = filter_channels - self.n_heads = n_heads - self.n_layers = n_layers - self.kernel_size = kernel_size - self.p_dropout = p_dropout - self.proximal_bias = proximal_bias - self.proximal_init = proximal_init - - self.drop = nn.Dropout(p_dropout) - self.self_attn_layers = nn.ModuleList() - self.norm_layers_0 = nn.ModuleList() - self.encdec_attn_layers = nn.ModuleList() - self.norm_layers_1 = nn.ModuleList() - self.ffn_layers = nn.ModuleList() - self.norm_layers_2 = nn.ModuleList() - for i in range(self.n_layers): - self.self_attn_layers.append(MultiHeadAttention(hidden_channels, hidden_channels, n_heads, p_dropout=p_dropout, proximal_bias=proximal_bias, proximal_init=proximal_init)) - self.norm_layers_0.append(LayerNorm(hidden_channels)) - self.encdec_attn_layers.append(MultiHeadAttention(hidden_channels, hidden_channels, n_heads, p_dropout=p_dropout)) - self.norm_layers_1.append(LayerNorm(hidden_channels)) - self.ffn_layers.append(FFN(hidden_channels, hidden_channels, filter_channels, kernel_size, p_dropout=p_dropout, causal=True)) - self.norm_layers_2.append(LayerNorm(hidden_channels)) - - def forward(self, x, x_mask, h, h_mask): - """ - x: decoder input - h: encoder output - """ - self_attn_mask = commons.subsequent_mask(x_mask.size(2)).to(device=x.device, dtype=x.dtype) - encdec_attn_mask = h_mask.unsqueeze(2) * x_mask.unsqueeze(-1) - x = x * x_mask - for i in range(self.n_layers): - y = self.self_attn_layers[i](x, x, self_attn_mask) - y = self.drop(y) - x = self.norm_layers_0[i](x + y) - - y = self.encdec_attn_layers[i](x, h, encdec_attn_mask) - y = self.drop(y) - x = self.norm_layers_1[i](x + y) - - y = self.ffn_layers[i](x, x_mask) - y = self.drop(y) - x = self.norm_layers_2[i](x + y) - x = x * x_mask - return x + def __init__( + self, + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size=1, + p_dropout=0.0, + proximal_bias=False, + proximal_init=True, + **kwargs + ): + super().__init__() + self.hidden_channels = hidden_channels + self.filter_channels = filter_channels + self.n_heads = n_heads + self.n_layers = n_layers + self.kernel_size = kernel_size + self.p_dropout = p_dropout + self.proximal_bias = proximal_bias + self.proximal_init = proximal_init + + self.drop = nn.Dropout(p_dropout) + self.self_attn_layers = nn.ModuleList() + self.norm_layers_0 = nn.ModuleList() + self.encdec_attn_layers = nn.ModuleList() + self.norm_layers_1 = nn.ModuleList() + self.ffn_layers = nn.ModuleList() + self.norm_layers_2 = nn.ModuleList() + for i in range(self.n_layers): + self.self_attn_layers.append( + MultiHeadAttention( + hidden_channels, + hidden_channels, + n_heads, + p_dropout=p_dropout, + proximal_bias=proximal_bias, + proximal_init=proximal_init, + ) + ) + self.norm_layers_0.append(LayerNorm(hidden_channels)) + self.encdec_attn_layers.append( + MultiHeadAttention( + hidden_channels, hidden_channels, n_heads, p_dropout=p_dropout + ) + ) + self.norm_layers_1.append(LayerNorm(hidden_channels)) + self.ffn_layers.append( + FFN( + hidden_channels, + hidden_channels, + filter_channels, + kernel_size, + p_dropout=p_dropout, + causal=True, + ) + ) + self.norm_layers_2.append(LayerNorm(hidden_channels)) + + def forward(self, x, x_mask, h, h_mask): + """ + x: decoder input + h: encoder output + """ + self_attn_mask = commons.subsequent_mask(x_mask.size(2)).to( + device=x.device, dtype=x.dtype + ) + encdec_attn_mask = h_mask.unsqueeze(2) * x_mask.unsqueeze(-1) + x = x * x_mask + for i in range(self.n_layers): + y = self.self_attn_layers[i](x, x, self_attn_mask) + y = self.drop(y) + x = self.norm_layers_0[i](x + y) + + y = self.encdec_attn_layers[i](x, h, encdec_attn_mask) + y = self.drop(y) + x = self.norm_layers_1[i](x + y) + + y = self.ffn_layers[i](x, x_mask) + y = self.drop(y) + x = self.norm_layers_2[i](x + y) + x = x * x_mask + return x class MultiHeadAttention(nn.Module): - def __init__(self, channels, out_channels, n_heads, p_dropout=0., window_size=None, heads_share=True, block_length=None, proximal_bias=False, proximal_init=False): - super().__init__() - assert channels % n_heads == 0 - - self.channels = channels - self.out_channels = out_channels - self.n_heads = n_heads - self.p_dropout = p_dropout - self.window_size = window_size - self.heads_share = heads_share - self.block_length = block_length - self.proximal_bias = proximal_bias - self.proximal_init = proximal_init - self.attn = None - - self.k_channels = channels // n_heads - self.conv_q = nn.Conv1d(channels, channels, 1) - self.conv_k = nn.Conv1d(channels, channels, 1) - self.conv_v = nn.Conv1d(channels, channels, 1) - self.conv_o = nn.Conv1d(channels, out_channels, 1) - self.drop = nn.Dropout(p_dropout) - - if window_size is not None: - n_heads_rel = 1 if heads_share else n_heads - rel_stddev = self.k_channels**-0.5 - self.emb_rel_k = nn.Parameter(torch.randn(n_heads_rel, window_size * 2 + 1, self.k_channels) * rel_stddev) - self.emb_rel_v = nn.Parameter(torch.randn(n_heads_rel, window_size * 2 + 1, self.k_channels) * rel_stddev) - - nn.init.xavier_uniform_(self.conv_q.weight) - nn.init.xavier_uniform_(self.conv_k.weight) - nn.init.xavier_uniform_(self.conv_v.weight) - if proximal_init: - with torch.no_grad(): - self.conv_k.weight.copy_(self.conv_q.weight) - self.conv_k.bias.copy_(self.conv_q.bias) - - def forward(self, x, c, attn_mask=None): - q = self.conv_q(x) - k = self.conv_k(c) - v = self.conv_v(c) - - x, self.attn = self.attention(q, k, v, mask=attn_mask) - - x = self.conv_o(x) - return x - - def attention(self, query, key, value, mask=None): - # reshape [b, d, t] -> [b, n_h, t, d_k] - b, d, t_s, t_t = (*key.size(), query.size(2)) - query = query.view(b, self.n_heads, self.k_channels, t_t).transpose(2, 3) - key = key.view(b, self.n_heads, self.k_channels, t_s).transpose(2, 3) - value = value.view(b, self.n_heads, self.k_channels, t_s).transpose(2, 3) - - scores = torch.matmul(query / math.sqrt(self.k_channels), key.transpose(-2, -1)) - if self.window_size is not None: - assert t_s == t_t, "Relative attention is only available for self-attention." - key_relative_embeddings = self._get_relative_embeddings(self.emb_rel_k, t_s) - rel_logits = self._matmul_with_relative_keys(query /math.sqrt(self.k_channels), key_relative_embeddings) - scores_local = self._relative_position_to_absolute_position(rel_logits) - scores = scores + scores_local - if self.proximal_bias: - assert t_s == t_t, "Proximal bias is only available for self-attention." - scores = scores + self._attention_bias_proximal(t_s).to(device=scores.device, dtype=scores.dtype) - if mask is not None: - scores = scores.masked_fill(mask == 0, -1e4) - if self.block_length is not None: - assert t_s == t_t, "Local attention is only available for self-attention." - block_mask = torch.ones_like(scores).triu(-self.block_length).tril(self.block_length) - scores = scores.masked_fill(block_mask == 0, -1e4) - p_attn = F.softmax(scores, dim=-1) # [b, n_h, t_t, t_s] - p_attn = self.drop(p_attn) - output = torch.matmul(p_attn, value) - if self.window_size is not None: - relative_weights = self._absolute_position_to_relative_position(p_attn) - value_relative_embeddings = self._get_relative_embeddings(self.emb_rel_v, t_s) - output = output + self._matmul_with_relative_values(relative_weights, value_relative_embeddings) - output = output.transpose(2, 3).contiguous().view(b, d, t_t) # [b, n_h, t_t, d_k] -> [b, d, t_t] - return output, p_attn - - def _matmul_with_relative_values(self, x, y): - """ - x: [b, h, l, m] - y: [h or 1, m, d] - ret: [b, h, l, d] - """ - ret = torch.matmul(x, y.unsqueeze(0)) - return ret - - def _matmul_with_relative_keys(self, x, y): - """ - x: [b, h, l, d] - y: [h or 1, m, d] - ret: [b, h, l, m] - """ - ret = torch.matmul(x, y.unsqueeze(0).transpose(-2, -1)) - return ret - - def _get_relative_embeddings(self, relative_embeddings, length): - max_relative_position = 2 * self.window_size + 1 - # Pad first before slice to avoid using cond ops. - pad_length = max(length - (self.window_size + 1), 0) - slice_start_position = max((self.window_size + 1) - length, 0) - slice_end_position = slice_start_position + 2 * length - 1 - if pad_length > 0: - padded_relative_embeddings = F.pad( - relative_embeddings, - commons.convert_pad_shape([[0, 0], [pad_length, pad_length], [0, 0]])) - else: - padded_relative_embeddings = relative_embeddings - used_relative_embeddings = padded_relative_embeddings[:,slice_start_position:slice_end_position] - return used_relative_embeddings - - def _relative_position_to_absolute_position(self, x): - """ - x: [b, h, l, 2*l-1] - ret: [b, h, l, l] - """ - batch, heads, length, _ = x.size() - # Concat columns of pad to shift from relative to absolute indexing. - x = F.pad(x, commons.convert_pad_shape([[0,0],[0,0],[0,0],[0,1]])) - - # Concat extra elements so to add up to shape (len+1, 2*len-1). - x_flat = x.view([batch, heads, length * 2 * length]) - x_flat = F.pad(x_flat, commons.convert_pad_shape([[0,0],[0,0],[0,length-1]])) - - # Reshape and slice out the padded elements. - x_final = x_flat.view([batch, heads, length+1, 2*length-1])[:, :, :length, length-1:] - return x_final - - def _absolute_position_to_relative_position(self, x): - """ - x: [b, h, l, l] - ret: [b, h, l, 2*l-1] - """ - batch, heads, length, _ = x.size() - # padd along column - x = F.pad(x, commons.convert_pad_shape([[0, 0], [0, 0], [0, 0], [0, length-1]])) - x_flat = x.view([batch, heads, length**2 + length*(length -1)]) - # add 0's in the beginning that will skew the elements after reshape - x_flat = F.pad(x_flat, commons.convert_pad_shape([[0, 0], [0, 0], [length, 0]])) - x_final = x_flat.view([batch, heads, length, 2*length])[:,:,:,1:] - return x_final - - def _attention_bias_proximal(self, length): - """Bias for self-attention to encourage attention to close positions. - Args: - length: an integer scalar. - Returns: - a Tensor with shape [1, 1, length, length] - """ - r = torch.arange(length, dtype=torch.float32) - diff = torch.unsqueeze(r, 0) - torch.unsqueeze(r, 1) - return torch.unsqueeze(torch.unsqueeze(-torch.log1p(torch.abs(diff)), 0), 0) + def __init__( + self, + channels, + out_channels, + n_heads, + p_dropout=0.0, + window_size=None, + heads_share=True, + block_length=None, + proximal_bias=False, + proximal_init=False, + ): + super().__init__() + assert channels % n_heads == 0 + + self.channels = channels + self.out_channels = out_channels + self.n_heads = n_heads + self.p_dropout = p_dropout + self.window_size = window_size + self.heads_share = heads_share + self.block_length = block_length + self.proximal_bias = proximal_bias + self.proximal_init = proximal_init + self.attn = None + + self.k_channels = channels // n_heads + self.conv_q = nn.Conv1d(channels, channels, 1) + self.conv_k = nn.Conv1d(channels, channels, 1) + self.conv_v = nn.Conv1d(channels, channels, 1) + self.conv_o = nn.Conv1d(channels, out_channels, 1) + self.drop = nn.Dropout(p_dropout) + + if window_size is not None: + n_heads_rel = 1 if heads_share else n_heads + rel_stddev = self.k_channels**-0.5 + self.emb_rel_k = nn.Parameter( + torch.randn(n_heads_rel, window_size * 2 + 1, self.k_channels) + * rel_stddev + ) + self.emb_rel_v = nn.Parameter( + torch.randn(n_heads_rel, window_size * 2 + 1, self.k_channels) + * rel_stddev + ) + + nn.init.xavier_uniform_(self.conv_q.weight) + nn.init.xavier_uniform_(self.conv_k.weight) + nn.init.xavier_uniform_(self.conv_v.weight) + if proximal_init: + with torch.no_grad(): + self.conv_k.weight.copy_(self.conv_q.weight) + self.conv_k.bias.copy_(self.conv_q.bias) + + def forward(self, x, c, attn_mask=None): + q = self.conv_q(x) + k = self.conv_k(c) + v = self.conv_v(c) + + x, self.attn = self.attention(q, k, v, mask=attn_mask) + + x = self.conv_o(x) + return x + + def attention(self, query, key, value, mask=None): + # reshape [b, d, t] -> [b, n_h, t, d_k] + b, d, t_s, t_t = (*key.size(), query.size(2)) + query = query.view(b, self.n_heads, self.k_channels, t_t).transpose(2, 3) + key = key.view(b, self.n_heads, self.k_channels, t_s).transpose(2, 3) + value = value.view(b, self.n_heads, self.k_channels, t_s).transpose(2, 3) + + scores = torch.matmul(query / math.sqrt(self.k_channels), key.transpose(-2, -1)) + if self.window_size is not None: + assert ( + t_s == t_t + ), "Relative attention is only available for self-attention." + key_relative_embeddings = self._get_relative_embeddings(self.emb_rel_k, t_s) + rel_logits = self._matmul_with_relative_keys( + query / math.sqrt(self.k_channels), key_relative_embeddings + ) + scores_local = self._relative_position_to_absolute_position(rel_logits) + scores = scores + scores_local + if self.proximal_bias: + assert t_s == t_t, "Proximal bias is only available for self-attention." + scores = scores + self._attention_bias_proximal(t_s).to( + device=scores.device, dtype=scores.dtype + ) + if mask is not None: + scores = scores.masked_fill(mask == 0, -1e4) + if self.block_length is not None: + assert ( + t_s == t_t + ), "Local attention is only available for self-attention." + block_mask = ( + torch.ones_like(scores) + .triu(-self.block_length) + .tril(self.block_length) + ) + scores = scores.masked_fill(block_mask == 0, -1e4) + p_attn = F.softmax(scores, dim=-1) # [b, n_h, t_t, t_s] + p_attn = self.drop(p_attn) + output = torch.matmul(p_attn, value) + if self.window_size is not None: + relative_weights = self._absolute_position_to_relative_position(p_attn) + value_relative_embeddings = self._get_relative_embeddings( + self.emb_rel_v, t_s + ) + output = output + self._matmul_with_relative_values( + relative_weights, value_relative_embeddings + ) + output = ( + output.transpose(2, 3).contiguous().view(b, d, t_t) + ) # [b, n_h, t_t, d_k] -> [b, d, t_t] + return output, p_attn + + def _matmul_with_relative_values(self, x, y): + """ + x: [b, h, l, m] + y: [h or 1, m, d] + ret: [b, h, l, d] + """ + ret = torch.matmul(x, y.unsqueeze(0)) + return ret + + def _matmul_with_relative_keys(self, x, y): + """ + x: [b, h, l, d] + y: [h or 1, m, d] + ret: [b, h, l, m] + """ + ret = torch.matmul(x, y.unsqueeze(0).transpose(-2, -1)) + return ret + + def _get_relative_embeddings(self, relative_embeddings, length): + max_relative_position = 2 * self.window_size + 1 + # Pad first before slice to avoid using cond ops. + pad_length = max(length - (self.window_size + 1), 0) + slice_start_position = max((self.window_size + 1) - length, 0) + slice_end_position = slice_start_position + 2 * length - 1 + if pad_length > 0: + padded_relative_embeddings = F.pad( + relative_embeddings, + commons.convert_pad_shape([[0, 0], [pad_length, pad_length], [0, 0]]), + ) + else: + padded_relative_embeddings = relative_embeddings + used_relative_embeddings = padded_relative_embeddings[ + :, slice_start_position:slice_end_position + ] + return used_relative_embeddings + + def _relative_position_to_absolute_position(self, x): + """ + x: [b, h, l, 2*l-1] + ret: [b, h, l, l] + """ + batch, heads, length, _ = x.size() + # Concat columns of pad to shift from relative to absolute indexing. + x = F.pad(x, commons.convert_pad_shape([[0, 0], [0, 0], [0, 0], [0, 1]])) + + # Concat extra elements so to add up to shape (len+1, 2*len-1). + x_flat = x.view([batch, heads, length * 2 * length]) + x_flat = F.pad( + x_flat, commons.convert_pad_shape([[0, 0], [0, 0], [0, length - 1]]) + ) + + # Reshape and slice out the padded elements. + x_final = x_flat.view([batch, heads, length + 1, 2 * length - 1])[ + :, :, :length, length - 1 : + ] + return x_final + + def _absolute_position_to_relative_position(self, x): + """ + x: [b, h, l, l] + ret: [b, h, l, 2*l-1] + """ + batch, heads, length, _ = x.size() + # padd along column + x = F.pad( + x, commons.convert_pad_shape([[0, 0], [0, 0], [0, 0], [0, length - 1]]) + ) + x_flat = x.view([batch, heads, length**2 + length * (length - 1)]) + # add 0's in the beginning that will skew the elements after reshape + x_flat = F.pad(x_flat, commons.convert_pad_shape([[0, 0], [0, 0], [length, 0]])) + x_final = x_flat.view([batch, heads, length, 2 * length])[:, :, :, 1:] + return x_final + + def _attention_bias_proximal(self, length): + """Bias for self-attention to encourage attention to close positions. + Args: + length: an integer scalar. + Returns: + a Tensor with shape [1, 1, length, length] + """ + r = torch.arange(length, dtype=torch.float32) + diff = torch.unsqueeze(r, 0) - torch.unsqueeze(r, 1) + return torch.unsqueeze(torch.unsqueeze(-torch.log1p(torch.abs(diff)), 0), 0) class FFN(nn.Module): - def __init__(self, in_channels, out_channels, filter_channels, kernel_size, p_dropout=0., activation=None, causal=False): - super().__init__() - self.in_channels = in_channels - self.out_channels = out_channels - self.filter_channels = filter_channels - self.kernel_size = kernel_size - self.p_dropout = p_dropout - self.activation = activation - self.causal = causal - - if causal: - self.padding = self._causal_padding - else: - self.padding = self._same_padding - - self.conv_1 = nn.Conv1d(in_channels, filter_channels, kernel_size) - self.conv_2 = nn.Conv1d(filter_channels, out_channels, kernel_size) - self.drop = nn.Dropout(p_dropout) - - def forward(self, x, x_mask): - x = self.conv_1(self.padding(x * x_mask)) - if self.activation == "gelu": - x = x * torch.sigmoid(1.702 * x) - else: - x = torch.relu(x) - x = self.drop(x) - x = self.conv_2(self.padding(x * x_mask)) - return x * x_mask - - def _causal_padding(self, x): - if self.kernel_size == 1: - return x - pad_l = self.kernel_size - 1 - pad_r = 0 - padding = [[0, 0], [0, 0], [pad_l, pad_r]] - x = F.pad(x, commons.convert_pad_shape(padding)) - return x - - def _same_padding(self, x): - if self.kernel_size == 1: - return x - pad_l = (self.kernel_size - 1) // 2 - pad_r = self.kernel_size // 2 - padding = [[0, 0], [0, 0], [pad_l, pad_r]] - x = F.pad(x, commons.convert_pad_shape(padding)) - return x + def __init__( + self, + in_channels, + out_channels, + filter_channels, + kernel_size, + p_dropout=0.0, + activation=None, + causal=False, + ): + super().__init__() + self.in_channels = in_channels + self.out_channels = out_channels + self.filter_channels = filter_channels + self.kernel_size = kernel_size + self.p_dropout = p_dropout + self.activation = activation + self.causal = causal + + if causal: + self.padding = self._causal_padding + else: + self.padding = self._same_padding + + self.conv_1 = nn.Conv1d(in_channels, filter_channels, kernel_size) + self.conv_2 = nn.Conv1d(filter_channels, out_channels, kernel_size) + self.drop = nn.Dropout(p_dropout) + + def forward(self, x, x_mask): + x = self.conv_1(self.padding(x * x_mask)) + if self.activation == "gelu": + x = x * torch.sigmoid(1.702 * x) + else: + x = torch.relu(x) + x = self.drop(x) + x = self.conv_2(self.padding(x * x_mask)) + return x * x_mask + + def _causal_padding(self, x): + if self.kernel_size == 1: + return x + pad_l = self.kernel_size - 1 + pad_r = 0 + padding = [[0, 0], [0, 0], [pad_l, pad_r]] + x = F.pad(x, commons.convert_pad_shape(padding)) + return x + + def _same_padding(self, x): + if self.kernel_size == 1: + return x + pad_l = (self.kernel_size - 1) // 2 + pad_r = self.kernel_size // 2 + padding = [[0, 0], [0, 0], [pad_l, pad_r]] + x = F.pad(x, commons.convert_pad_shape(padding)) + return x diff --git a/bert_gen.py b/bert_gen.py index 0ee10fc5c..fb9b550f7 100644 --- a/bert_gen.py +++ b/bert_gen.py @@ -7,6 +7,7 @@ import argparse import torch.multiprocessing as mp + def process_line(line): rank = mp.current_process()._identity rank = rank[0] if len(rank) > 0 else 0 @@ -34,15 +35,15 @@ def process_line(line): bert = torch.load(bert_path) assert bert.shape[-1] == len(phone) except Exception: - bert = get_bert(text, word2ph, language_str,device) + bert = get_bert(text, word2ph, language_str, device) assert bert.shape[-1] == len(phone) torch.save(bert, bert_path) if __name__ == "__main__": parser = argparse.ArgumentParser() - parser.add_argument('-c', '--config', type=str, default="configs/config.json") - parser.add_argument('--num_processes', type=int, default=2 ) + parser.add_argument("-c", "--config", type=str, default="configs/config.json") + parser.add_argument("--num_processes", type=int, default=2) args = parser.parse_args() config_path = args.config hps = utils.get_hparams_from_file(config_path) @@ -53,7 +54,6 @@ def process_line(line): with open(hps.data.validation_files, encoding="utf-8") as f: lines.extend(f.readlines()) - num_processes = args.num_processes with Pool(processes=num_processes) as pool: for _ in tqdm(pool.imap_unordered(process_line, lines), total=len(lines)): diff --git a/commons.py b/commons.py index 9ad0444b6..21b446b6b 100644 --- a/commons.py +++ b/commons.py @@ -6,156 +6,158 @@ def init_weights(m, mean=0.0, std=0.01): - classname = m.__class__.__name__ - if classname.find("Conv") != -1: - m.weight.data.normal_(mean, std) + classname = m.__class__.__name__ + if classname.find("Conv") != -1: + m.weight.data.normal_(mean, std) def get_padding(kernel_size, dilation=1): - return int((kernel_size*dilation - dilation)/2) + return int((kernel_size * dilation - dilation) / 2) def convert_pad_shape(pad_shape): - l = pad_shape[::-1] - pad_shape = [item for sublist in l for item in sublist] - return pad_shape + l = pad_shape[::-1] + pad_shape = [item for sublist in l for item in sublist] + return pad_shape def intersperse(lst, item): - result = [item] * (len(lst) * 2 + 1) - result[1::2] = lst - return result + result = [item] * (len(lst) * 2 + 1) + result[1::2] = lst + return result def kl_divergence(m_p, logs_p, m_q, logs_q): - """KL(P||Q)""" - kl = (logs_q - logs_p) - 0.5 - kl += 0.5 * (torch.exp(2. * logs_p) + ((m_p - m_q)**2)) * torch.exp(-2. * logs_q) - return kl + """KL(P||Q)""" + kl = (logs_q - logs_p) - 0.5 + kl += ( + 0.5 * (torch.exp(2.0 * logs_p) + ((m_p - m_q) ** 2)) * torch.exp(-2.0 * logs_q) + ) + return kl def rand_gumbel(shape): - """Sample from the Gumbel distribution, protect from overflows.""" - uniform_samples = torch.rand(shape) * 0.99998 + 0.00001 - return -torch.log(-torch.log(uniform_samples)) + """Sample from the Gumbel distribution, protect from overflows.""" + uniform_samples = torch.rand(shape) * 0.99998 + 0.00001 + return -torch.log(-torch.log(uniform_samples)) def rand_gumbel_like(x): - g = rand_gumbel(x.size()).to(dtype=x.dtype, device=x.device) - return g + g = rand_gumbel(x.size()).to(dtype=x.dtype, device=x.device) + return g def slice_segments(x, ids_str, segment_size=4): - ret = torch.zeros_like(x[:, :, :segment_size]) - for i in range(x.size(0)): - idx_str = ids_str[i] - idx_end = idx_str + segment_size - ret[i] = x[i, :, idx_str:idx_end] - return ret + ret = torch.zeros_like(x[:, :, :segment_size]) + for i in range(x.size(0)): + idx_str = ids_str[i] + idx_end = idx_str + segment_size + ret[i] = x[i, :, idx_str:idx_end] + return ret def rand_slice_segments(x, x_lengths=None, segment_size=4): - b, d, t = x.size() - if x_lengths is None: - x_lengths = t - ids_str_max = x_lengths - segment_size + 1 - ids_str = (torch.rand([b]).to(device=x.device) * ids_str_max).to(dtype=torch.long) - ret = slice_segments(x, ids_str, segment_size) - return ret, ids_str - - -def get_timing_signal_1d( - length, channels, min_timescale=1.0, max_timescale=1.0e4): - position = torch.arange(length, dtype=torch.float) - num_timescales = channels // 2 - log_timescale_increment = ( - math.log(float(max_timescale) / float(min_timescale)) / - (num_timescales - 1)) - inv_timescales = min_timescale * torch.exp( - torch.arange(num_timescales, dtype=torch.float) * -log_timescale_increment) - scaled_time = position.unsqueeze(0) * inv_timescales.unsqueeze(1) - signal = torch.cat([torch.sin(scaled_time), torch.cos(scaled_time)], 0) - signal = F.pad(signal, [0, 0, 0, channels % 2]) - signal = signal.view(1, channels, length) - return signal + b, d, t = x.size() + if x_lengths is None: + x_lengths = t + ids_str_max = x_lengths - segment_size + 1 + ids_str = (torch.rand([b]).to(device=x.device) * ids_str_max).to(dtype=torch.long) + ret = slice_segments(x, ids_str, segment_size) + return ret, ids_str + + +def get_timing_signal_1d(length, channels, min_timescale=1.0, max_timescale=1.0e4): + position = torch.arange(length, dtype=torch.float) + num_timescales = channels // 2 + log_timescale_increment = math.log(float(max_timescale) / float(min_timescale)) / ( + num_timescales - 1 + ) + inv_timescales = min_timescale * torch.exp( + torch.arange(num_timescales, dtype=torch.float) * -log_timescale_increment + ) + scaled_time = position.unsqueeze(0) * inv_timescales.unsqueeze(1) + signal = torch.cat([torch.sin(scaled_time), torch.cos(scaled_time)], 0) + signal = F.pad(signal, [0, 0, 0, channels % 2]) + signal = signal.view(1, channels, length) + return signal def add_timing_signal_1d(x, min_timescale=1.0, max_timescale=1.0e4): - b, channels, length = x.size() - signal = get_timing_signal_1d(length, channels, min_timescale, max_timescale) - return x + signal.to(dtype=x.dtype, device=x.device) + b, channels, length = x.size() + signal = get_timing_signal_1d(length, channels, min_timescale, max_timescale) + return x + signal.to(dtype=x.dtype, device=x.device) def cat_timing_signal_1d(x, min_timescale=1.0, max_timescale=1.0e4, axis=1): - b, channels, length = x.size() - signal = get_timing_signal_1d(length, channels, min_timescale, max_timescale) - return torch.cat([x, signal.to(dtype=x.dtype, device=x.device)], axis) + b, channels, length = x.size() + signal = get_timing_signal_1d(length, channels, min_timescale, max_timescale) + return torch.cat([x, signal.to(dtype=x.dtype, device=x.device)], axis) def subsequent_mask(length): - mask = torch.tril(torch.ones(length, length)).unsqueeze(0).unsqueeze(0) - return mask + mask = torch.tril(torch.ones(length, length)).unsqueeze(0).unsqueeze(0) + return mask @torch.jit.script def fused_add_tanh_sigmoid_multiply(input_a, input_b, n_channels): - n_channels_int = n_channels[0] - in_act = input_a + input_b - t_act = torch.tanh(in_act[:, :n_channels_int, :]) - s_act = torch.sigmoid(in_act[:, n_channels_int:, :]) - acts = t_act * s_act - return acts + n_channels_int = n_channels[0] + in_act = input_a + input_b + t_act = torch.tanh(in_act[:, :n_channels_int, :]) + s_act = torch.sigmoid(in_act[:, n_channels_int:, :]) + acts = t_act * s_act + return acts def convert_pad_shape(pad_shape): - l = pad_shape[::-1] - pad_shape = [item for sublist in l for item in sublist] - return pad_shape + l = pad_shape[::-1] + pad_shape = [item for sublist in l for item in sublist] + return pad_shape def shift_1d(x): - x = F.pad(x, convert_pad_shape([[0, 0], [0, 0], [1, 0]]))[:, :, :-1] - return x + x = F.pad(x, convert_pad_shape([[0, 0], [0, 0], [1, 0]]))[:, :, :-1] + return x def sequence_mask(length, max_length=None): - if max_length is None: - max_length = length.max() - x = torch.arange(max_length, dtype=length.dtype, device=length.device) - return x.unsqueeze(0) < length.unsqueeze(1) + if max_length is None: + max_length = length.max() + x = torch.arange(max_length, dtype=length.dtype, device=length.device) + return x.unsqueeze(0) < length.unsqueeze(1) def generate_path(duration, mask): - """ - duration: [b, 1, t_x] - mask: [b, 1, t_y, t_x] - """ - device = duration.device - - b, _, t_y, t_x = mask.shape - cum_duration = torch.cumsum(duration, -1) - - cum_duration_flat = cum_duration.view(b * t_x) - path = sequence_mask(cum_duration_flat, t_y).to(mask.dtype) - path = path.view(b, t_x, t_y) - path = path - F.pad(path, convert_pad_shape([[0, 0], [1, 0], [0, 0]]))[:, :-1] - path = path.unsqueeze(1).transpose(2,3) * mask - return path + """ + duration: [b, 1, t_x] + mask: [b, 1, t_y, t_x] + """ + device = duration.device + + b, _, t_y, t_x = mask.shape + cum_duration = torch.cumsum(duration, -1) + + cum_duration_flat = cum_duration.view(b * t_x) + path = sequence_mask(cum_duration_flat, t_y).to(mask.dtype) + path = path.view(b, t_x, t_y) + path = path - F.pad(path, convert_pad_shape([[0, 0], [1, 0], [0, 0]]))[:, :-1] + path = path.unsqueeze(1).transpose(2, 3) * mask + return path def clip_grad_value_(parameters, clip_value, norm_type=2): - if isinstance(parameters, torch.Tensor): - parameters = [parameters] - parameters = list(filter(lambda p: p.grad is not None, parameters)) - norm_type = float(norm_type) - if clip_value is not None: - clip_value = float(clip_value) - - total_norm = 0 - for p in parameters: - param_norm = p.grad.data.norm(norm_type) - total_norm += param_norm.item() ** norm_type + if isinstance(parameters, torch.Tensor): + parameters = [parameters] + parameters = list(filter(lambda p: p.grad is not None, parameters)) + norm_type = float(norm_type) if clip_value is not None: - p.grad.data.clamp_(min=-clip_value, max=clip_value) - total_norm = total_norm ** (1. / norm_type) - return total_norm + clip_value = float(clip_value) + + total_norm = 0 + for p in parameters: + param_norm = p.grad.data.norm(norm_type) + total_norm += param_norm.item() ** norm_type + if clip_value is not None: + p.grad.data.clamp_(min=-clip_value, max=clip_value) + total_norm = total_norm ** (1.0 / norm_type) + return total_norm diff --git a/data_utils.py b/data_utils.py index 12eadccb4..45ac34ba7 100644 --- a/data_utils.py +++ b/data_utils.py @@ -16,9 +16,9 @@ class TextAudioSpeakerLoader(torch.utils.data.Dataset): """ - 1) loads audio, speaker_id, text pairs - 2) normalizes text and converts them to sequences of integers - 3) computes spectrograms from audio files. + 1) loads audio, speaker_id, text pairs + 2) normalizes text and converts them to sequences of integers + 3) computes spectrograms from audio files. """ def __init__(self, audiopaths_sid_text, hparams): @@ -32,7 +32,9 @@ def __init__(self, audiopaths_sid_text, hparams): self.spk_map = hparams.spk2id self.hparams = hparams - self.use_mel_spec_posterior = getattr(hparams, "use_mel_posterior_encoder", False) + self.use_mel_spec_posterior = getattr( + hparams, "use_mel_posterior_encoder", False + ) if self.use_mel_spec_posterior: self.n_mel_channels = getattr(hparams, "n_mel_channels", 80) @@ -58,17 +60,26 @@ def _filter(self): lengths = [] skipped = 0 logger.info("Init dataset...") - for _id, spk, language, text, phones, tone, word2ph in tqdm(self.audiopaths_sid_text): - audiopath = f'{_id}' + for _id, spk, language, text, phones, tone, word2ph in tqdm( + self.audiopaths_sid_text + ): + audiopath = f"{_id}" if self.min_text_len <= len(phones) and len(phones) <= self.max_text_len: phones = phones.split(" ") tone = [int(i) for i in tone.split(" ")] word2ph = [int(i) for i in word2ph.split(" ")] - audiopaths_sid_text_new.append([audiopath, spk, language, text, phones, tone, word2ph]) + audiopaths_sid_text_new.append( + [audiopath, spk, language, text, phones, tone, word2ph] + ) lengths.append(os.path.getsize(audiopath) // (2 * self.hop_length)) else: skipped += 1 - logger.info("skipped: " + str(skipped) + ", total: " + str(len(self.audiopaths_sid_text))) + logger.info( + "skipped: " + + str(skipped) + + ", total: " + + str(len(self.audiopaths_sid_text)) + ) self.audiopaths_sid_text = audiopaths_sid_text_new self.lengths = lengths @@ -76,7 +87,9 @@ def get_audio_text_speaker_pair(self, audiopath_sid_text): # separate filename, speaker_id and text audiopath, sid, language, text, phones, tone, word2ph = audiopath_sid_text - bert, ja_bert, phones, tone, language = self.get_text(text, word2ph, phones, tone, language, audiopath) + bert, ja_bert, phones, tone, language = self.get_text( + text, word2ph, phones, tone, language, audiopath + ) spec, wav = self.get_audio(audiopath) sid = torch.LongTensor([int(self.spk_map[sid])]) @@ -85,8 +98,11 @@ def get_audio_text_speaker_pair(self, audiopath_sid_text): def get_audio(self, filename): audio, sampling_rate = load_wav_to_torch(filename) if sampling_rate != self.sampling_rate: - raise ValueError("{} {} SR doesn't match target {} SR".format( - sampling_rate, self.sampling_rate)) + raise ValueError( + "{} {} SR doesn't match target {} SR".format( + sampling_rate, self.sampling_rate + ) + ) audio_norm = audio / self.max_wav_value audio_norm = audio_norm.unsqueeze(0) spec_filename = filename.replace(".wav", ".spec.pt") @@ -96,13 +112,26 @@ def get_audio(self, filename): spec = torch.load(spec_filename) except: if self.use_mel_spec_posterior: - spec = mel_spectrogram_torch(audio_norm, self.filter_length, - self.n_mel_channels, self.sampling_rate, self.hop_length, - self.win_length, self.hparams.mel_fmin, self.hparams.mel_fmax, center=False) + spec = mel_spectrogram_torch( + audio_norm, + self.filter_length, + self.n_mel_channels, + self.sampling_rate, + self.hop_length, + self.win_length, + self.hparams.mel_fmin, + self.hparams.mel_fmax, + center=False, + ) else: - spec = spectrogram_torch(audio_norm, self.filter_length, - self.sampling_rate, self.hop_length, self.win_length, - center=False) + spec = spectrogram_torch( + audio_norm, + self.filter_length, + self.sampling_rate, + self.hop_length, + self.win_length, + center=False, + ) spec = torch.squeeze(spec, 0) torch.save(spec, spec_filename) return spec, audio_norm @@ -125,17 +154,29 @@ def get_text(self, text, word2ph, phone, tone, language_str, wav_path): torch.save(bert, bert_path) assert bert.shape[-1] == len(phone), phone - if language_str=='ZH': + if language_str == "ZH": bert = bert ja_bert = torch.zeros(768, len(phone)) - elif language_str=="JA": + elif language_str == "JA": ja_bert = bert bert = torch.zeros(1024, len(phone)) else: bert = torch.zeros(1024, len(phone)) ja_bert = torch.zeros(768, len(phone)) assert bert.shape[-1] == len(phone), ( - bert.shape, len(phone), sum(word2ph), p1, p2, t1, t2, pold, pold2, word2ph, text, w2pho) + bert.shape, + len(phone), + sum(word2ph), + p1, + p2, + t1, + t2, + pold, + pold2, + word2ph, + text, + w2pho, + ) phone = torch.LongTensor(phone) tone = torch.LongTensor(tone) language = torch.LongTensor(language) @@ -152,9 +193,8 @@ def __len__(self): return len(self.audiopaths_sid_text) -class TextAudioSpeakerCollate(): - """ Zero-pads model inputs and targets - """ +class TextAudioSpeakerCollate: + """Zero-pads model inputs and targets""" def __init__(self, return_ids=False): self.return_ids = return_ids @@ -167,8 +207,8 @@ def __call__(self, batch): """ # Right zero-pad all one-hot text sequences to max input length _, ids_sorted_decreasing = torch.sort( - torch.LongTensor([x[1].size(1) for x in batch]), - dim=0, descending=True) + torch.LongTensor([x[1].size(1) for x in batch]), dim=0, descending=True + ) max_text_len = max([len(x[0]) for x in batch]) max_spec_len = max([x[1].size(1) for x in batch]) @@ -198,32 +238,44 @@ def __call__(self, batch): row = batch[ids_sorted_decreasing[i]] text = row[0] - text_padded[i, :text.size(0)] = text + text_padded[i, : text.size(0)] = text text_lengths[i] = text.size(0) spec = row[1] - spec_padded[i, :, :spec.size(1)] = spec + spec_padded[i, :, : spec.size(1)] = spec spec_lengths[i] = spec.size(1) wav = row[2] - wav_padded[i, :, :wav.size(1)] = wav + wav_padded[i, :, : wav.size(1)] = wav wav_lengths[i] = wav.size(1) sid[i] = row[3] tone = row[4] - tone_padded[i, :tone.size(0)] = tone + tone_padded[i, : tone.size(0)] = tone language = row[5] - language_padded[i, :language.size(0)] = language + language_padded[i, : language.size(0)] = language bert = row[6] - bert_padded[i, :, :bert.size(1)] = bert + bert_padded[i, :, : bert.size(1)] = bert ja_bert = row[7] - ja_bert_padded[i, :, :ja_bert.size(1)] = ja_bert - - return text_padded, text_lengths, spec_padded, spec_lengths, wav_padded, wav_lengths, sid, tone_padded, language_padded, bert_padded, ja_bert_padded + ja_bert_padded[i, :, : ja_bert.size(1)] = ja_bert + + return ( + text_padded, + text_lengths, + spec_padded, + spec_lengths, + wav_padded, + wav_lengths, + sid, + tone_padded, + language_padded, + bert_padded, + ja_bert_padded, + ) class DistributedBucketSampler(torch.utils.data.distributed.DistributedSampler): @@ -236,7 +288,15 @@ class DistributedBucketSampler(torch.utils.data.distributed.DistributedSampler): Ex) boundaries = [b1, b2, b3] -> any x s.t. length(x) <= b1 or length(x) > b3 are discarded. """ - def __init__(self, dataset, batch_size, boundaries, num_replicas=None, rank=None, shuffle=True): + def __init__( + self, + dataset, + batch_size, + boundaries, + num_replicas=None, + rank=None, + shuffle=True, + ): super().__init__(dataset, num_replicas=num_replicas, rank=rank, shuffle=shuffle) self.lengths = dataset.lengths self.batch_size = batch_size @@ -254,7 +314,7 @@ def _create_buckets(self): if idx_bucket != -1: buckets[idx_bucket].append(i) - try: + try: for i in range(len(buckets) - 1, 0, -1): if len(buckets[i]) == 0: buckets.pop(i) @@ -262,7 +322,7 @@ def _create_buckets(self): assert all(len(bucket) > 0 for bucket in buckets) # When one bucket is not traversed except Exception as e: - print('Bucket warning ', e) + print("Bucket warning ", e) for i in range(len(buckets) - 1, -1, -1): if len(buckets[i]) == 0: buckets.pop(i) @@ -272,7 +332,9 @@ def _create_buckets(self): for i in range(len(buckets)): len_bucket = len(buckets[i]) total_batch_size = self.num_replicas * self.batch_size - rem = (total_batch_size - (len_bucket % total_batch_size)) % total_batch_size + rem = ( + total_batch_size - (len_bucket % total_batch_size) + ) % total_batch_size num_samples_per_bucket.append(len_bucket + rem) return buckets, num_samples_per_bucket @@ -293,21 +355,30 @@ def __iter__(self): for i in range(len(self.buckets)): bucket = self.buckets[i] len_bucket = len(bucket) - if (len_bucket == 0): + if len_bucket == 0: continue ids_bucket = indices[i] num_samples_bucket = self.num_samples_per_bucket[i] # add extra samples to make it evenly divisible rem = num_samples_bucket - len_bucket - ids_bucket = ids_bucket + ids_bucket * (rem // len_bucket) + ids_bucket[:(rem % len_bucket)] + ids_bucket = ( + ids_bucket + + ids_bucket * (rem // len_bucket) + + ids_bucket[: (rem % len_bucket)] + ) # subsample - ids_bucket = ids_bucket[self.rank::self.num_replicas] + ids_bucket = ids_bucket[self.rank :: self.num_replicas] # batching for j in range(len(ids_bucket) // self.batch_size): - batch = [bucket[idx] for idx in ids_bucket[j * self.batch_size:(j + 1) * self.batch_size]] + batch = [ + bucket[idx] + for idx in ids_bucket[ + j * self.batch_size : (j + 1) * self.batch_size + ] + ] batches.append(batch) if self.shuffle: diff --git a/losses.py b/losses.py index fb22a0e83..628a4fcf1 100644 --- a/losses.py +++ b/losses.py @@ -1,61 +1,61 @@ -import torch +import torch from torch.nn import functional as F import commons def feature_loss(fmap_r, fmap_g): - loss = 0 - for dr, dg in zip(fmap_r, fmap_g): - for rl, gl in zip(dr, dg): - rl = rl.float().detach() - gl = gl.float() - loss += torch.mean(torch.abs(rl - gl)) + loss = 0 + for dr, dg in zip(fmap_r, fmap_g): + for rl, gl in zip(dr, dg): + rl = rl.float().detach() + gl = gl.float() + loss += torch.mean(torch.abs(rl - gl)) - return loss * 2 + return loss * 2 def discriminator_loss(disc_real_outputs, disc_generated_outputs): - loss = 0 - r_losses = [] - g_losses = [] - for dr, dg in zip(disc_real_outputs, disc_generated_outputs): - dr = dr.float() - dg = dg.float() - r_loss = torch.mean((1-dr)**2) - g_loss = torch.mean(dg**2) - loss += (r_loss + g_loss) - r_losses.append(r_loss.item()) - g_losses.append(g_loss.item()) + loss = 0 + r_losses = [] + g_losses = [] + for dr, dg in zip(disc_real_outputs, disc_generated_outputs): + dr = dr.float() + dg = dg.float() + r_loss = torch.mean((1 - dr) ** 2) + g_loss = torch.mean(dg**2) + loss += r_loss + g_loss + r_losses.append(r_loss.item()) + g_losses.append(g_loss.item()) - return loss, r_losses, g_losses + return loss, r_losses, g_losses def generator_loss(disc_outputs): - loss = 0 - gen_losses = [] - for dg in disc_outputs: - dg = dg.float() - l = torch.mean((1-dg)**2) - gen_losses.append(l) - loss += l + loss = 0 + gen_losses = [] + for dg in disc_outputs: + dg = dg.float() + l = torch.mean((1 - dg) ** 2) + gen_losses.append(l) + loss += l - return loss, gen_losses + return loss, gen_losses def kl_loss(z_p, logs_q, m_p, logs_p, z_mask): - """ - z_p, logs_q: [b, h, t_t] - m_p, logs_p: [b, h, t_t] - """ - z_p = z_p.float() - logs_q = logs_q.float() - m_p = m_p.float() - logs_p = logs_p.float() - z_mask = z_mask.float() - - kl = logs_p - logs_q - 0.5 - kl += 0.5 * ((z_p - m_p)**2) * torch.exp(-2. * logs_p) - kl = torch.sum(kl * z_mask) - l = kl / torch.sum(z_mask) - return l + """ + z_p, logs_q: [b, h, t_t] + m_p, logs_p: [b, h, t_t] + """ + z_p = z_p.float() + logs_q = logs_q.float() + m_p = m_p.float() + logs_p = logs_p.float() + z_mask = z_mask.float() + + kl = logs_p - logs_q - 0.5 + kl += 0.5 * ((z_p - m_p) ** 2) * torch.exp(-2.0 * logs_p) + kl = torch.sum(kl * z_mask) + l = kl / torch.sum(z_mask) + return l diff --git a/mel_processing.py b/mel_processing.py index 50435ecf8..d6f291527 100644 --- a/mel_processing.py +++ b/mel_processing.py @@ -49,22 +49,38 @@ def spectral_de_normalize_torch(magnitudes): def spectrogram_torch(y, n_fft, sampling_rate, hop_size, win_size, center=False): - if torch.min(y) < -1.: - print('min value is ', torch.min(y)) - if torch.max(y) > 1.: - print('max value is ', torch.max(y)) + if torch.min(y) < -1.0: + print("min value is ", torch.min(y)) + if torch.max(y) > 1.0: + print("max value is ", torch.max(y)) global hann_window - dtype_device = str(y.dtype) + '_' + str(y.device) - wnsize_dtype_device = str(win_size) + '_' + dtype_device + dtype_device = str(y.dtype) + "_" + str(y.device) + wnsize_dtype_device = str(win_size) + "_" + dtype_device if wnsize_dtype_device not in hann_window: - hann_window[wnsize_dtype_device] = torch.hann_window(win_size).to(dtype=y.dtype, device=y.device) - - y = torch.nn.functional.pad(y.unsqueeze(1), (int((n_fft-hop_size)/2), int((n_fft-hop_size)/2)), mode='reflect') + hann_window[wnsize_dtype_device] = torch.hann_window(win_size).to( + dtype=y.dtype, device=y.device + ) + + y = torch.nn.functional.pad( + y.unsqueeze(1), + (int((n_fft - hop_size) / 2), int((n_fft - hop_size) / 2)), + mode="reflect", + ) y = y.squeeze(1) - spec = torch.stft(y, n_fft, hop_length=hop_size, win_length=win_size, window=hann_window[wnsize_dtype_device], - center=center, pad_mode='reflect', normalized=False, onesided=True, return_complex=False) + spec = torch.stft( + y, + n_fft, + hop_length=hop_size, + win_length=win_size, + window=hann_window[wnsize_dtype_device], + center=center, + pad_mode="reflect", + normalized=False, + onesided=True, + return_complex=False, + ) spec = torch.sqrt(spec.pow(2).sum(-1) + 1e-6) return spec @@ -72,37 +88,59 @@ def spectrogram_torch(y, n_fft, sampling_rate, hop_size, win_size, center=False) def spec_to_mel_torch(spec, n_fft, num_mels, sampling_rate, fmin, fmax): global mel_basis - dtype_device = str(spec.dtype) + '_' + str(spec.device) - fmax_dtype_device = str(fmax) + '_' + dtype_device + dtype_device = str(spec.dtype) + "_" + str(spec.device) + fmax_dtype_device = str(fmax) + "_" + dtype_device if fmax_dtype_device not in mel_basis: mel = librosa_mel_fn(sampling_rate, n_fft, num_mels, fmin, fmax) - mel_basis[fmax_dtype_device] = torch.from_numpy(mel).to(dtype=spec.dtype, device=spec.device) + mel_basis[fmax_dtype_device] = torch.from_numpy(mel).to( + dtype=spec.dtype, device=spec.device + ) spec = torch.matmul(mel_basis[fmax_dtype_device], spec) spec = spectral_normalize_torch(spec) return spec -def mel_spectrogram_torch(y, n_fft, num_mels, sampling_rate, hop_size, win_size, fmin, fmax, center=False): - if torch.min(y) < -1.: - print('min value is ', torch.min(y)) - if torch.max(y) > 1.: - print('max value is ', torch.max(y)) +def mel_spectrogram_torch( + y, n_fft, num_mels, sampling_rate, hop_size, win_size, fmin, fmax, center=False +): + if torch.min(y) < -1.0: + print("min value is ", torch.min(y)) + if torch.max(y) > 1.0: + print("max value is ", torch.max(y)) global mel_basis, hann_window - dtype_device = str(y.dtype) + '_' + str(y.device) - fmax_dtype_device = str(fmax) + '_' + dtype_device - wnsize_dtype_device = str(win_size) + '_' + dtype_device + dtype_device = str(y.dtype) + "_" + str(y.device) + fmax_dtype_device = str(fmax) + "_" + dtype_device + wnsize_dtype_device = str(win_size) + "_" + dtype_device if fmax_dtype_device not in mel_basis: mel = librosa_mel_fn(sampling_rate, n_fft, num_mels, fmin, fmax) - mel_basis[fmax_dtype_device] = torch.from_numpy(mel).to(dtype=y.dtype, device=y.device) + mel_basis[fmax_dtype_device] = torch.from_numpy(mel).to( + dtype=y.dtype, device=y.device + ) if wnsize_dtype_device not in hann_window: - hann_window[wnsize_dtype_device] = torch.hann_window(win_size).to(dtype=y.dtype, device=y.device) - - y = torch.nn.functional.pad(y.unsqueeze(1), (int((n_fft-hop_size)/2), int((n_fft-hop_size)/2)), mode='reflect') + hann_window[wnsize_dtype_device] = torch.hann_window(win_size).to( + dtype=y.dtype, device=y.device + ) + + y = torch.nn.functional.pad( + y.unsqueeze(1), + (int((n_fft - hop_size) / 2), int((n_fft - hop_size) / 2)), + mode="reflect", + ) y = y.squeeze(1) - spec = torch.stft(y, n_fft, hop_length=hop_size, win_length=win_size, window=hann_window[wnsize_dtype_device], - center=center, pad_mode='reflect', normalized=False, onesided=True, return_complex=False) + spec = torch.stft( + y, + n_fft, + hop_length=hop_size, + win_length=win_size, + window=hann_window[wnsize_dtype_device], + center=center, + pad_mode="reflect", + normalized=False, + onesided=True, + return_complex=False, + ) spec = torch.sqrt(spec.pow(2).sum(-1) + 1e-6) diff --git a/models.py b/models.py index 14dd9bbed..dd9e0c087 100644 --- a/models.py +++ b/models.py @@ -104,7 +104,6 @@ def __init__( gin_channels=0, share_parameter=False, ): - super().__init__() self.channels = channels self.hidden_channels = hidden_channels @@ -685,7 +684,6 @@ class ReferenceEncoder(nn.Module): """ def __init__(self, spec_channels, gin_channels=0): - super().__init__() self.spec_channels = spec_channels ref_enc_filters = [32, 32, 64, 64, 128, 128] @@ -770,7 +768,6 @@ def __init__( use_transformer_flow=True, **kwargs ): - super().__init__() self.n_vocab = n_vocab self.spec_channels = spec_channels diff --git a/modules.py b/modules.py index 92e0f32a5..4953fb3de 100644 --- a/modules.py +++ b/modules.py @@ -16,193 +16,284 @@ LRELU_SLOPE = 0.1 + class LayerNorm(nn.Module): - def __init__(self, channels, eps=1e-5): - super().__init__() - self.channels = channels - self.eps = eps - - self.gamma = nn.Parameter(torch.ones(channels)) - self.beta = nn.Parameter(torch.zeros(channels)) - - def forward(self, x): - x = x.transpose(1, -1) - x = F.layer_norm(x, (self.channels,), self.gamma, self.beta, self.eps) - return x.transpose(1, -1) - + def __init__(self, channels, eps=1e-5): + super().__init__() + self.channels = channels + self.eps = eps + + self.gamma = nn.Parameter(torch.ones(channels)) + self.beta = nn.Parameter(torch.zeros(channels)) + + def forward(self, x): + x = x.transpose(1, -1) + x = F.layer_norm(x, (self.channels,), self.gamma, self.beta, self.eps) + return x.transpose(1, -1) + + class ConvReluNorm(nn.Module): - def __init__(self, in_channels, hidden_channels, out_channels, kernel_size, n_layers, p_dropout): - super().__init__() - self.in_channels = in_channels - self.hidden_channels = hidden_channels - self.out_channels = out_channels - self.kernel_size = kernel_size - self.n_layers = n_layers - self.p_dropout = p_dropout - assert n_layers > 1, "Number of layers should be larger than 0." - - self.conv_layers = nn.ModuleList() - self.norm_layers = nn.ModuleList() - self.conv_layers.append(nn.Conv1d(in_channels, hidden_channels, kernel_size, padding=kernel_size//2)) - self.norm_layers.append(LayerNorm(hidden_channels)) - self.relu_drop = nn.Sequential( - nn.ReLU(), - nn.Dropout(p_dropout)) - for _ in range(n_layers-1): - self.conv_layers.append(nn.Conv1d(hidden_channels, hidden_channels, kernel_size, padding=kernel_size//2)) - self.norm_layers.append(LayerNorm(hidden_channels)) - self.proj = nn.Conv1d(hidden_channels, out_channels, 1) - self.proj.weight.data.zero_() - self.proj.bias.data.zero_() - - def forward(self, x, x_mask): - x_org = x - for i in range(self.n_layers): - x = self.conv_layers[i](x * x_mask) - x = self.norm_layers[i](x) - x = self.relu_drop(x) - x = x_org + self.proj(x) - return x * x_mask + def __init__( + self, + in_channels, + hidden_channels, + out_channels, + kernel_size, + n_layers, + p_dropout, + ): + super().__init__() + self.in_channels = in_channels + self.hidden_channels = hidden_channels + self.out_channels = out_channels + self.kernel_size = kernel_size + self.n_layers = n_layers + self.p_dropout = p_dropout + assert n_layers > 1, "Number of layers should be larger than 0." + + self.conv_layers = nn.ModuleList() + self.norm_layers = nn.ModuleList() + self.conv_layers.append( + nn.Conv1d( + in_channels, hidden_channels, kernel_size, padding=kernel_size // 2 + ) + ) + self.norm_layers.append(LayerNorm(hidden_channels)) + self.relu_drop = nn.Sequential(nn.ReLU(), nn.Dropout(p_dropout)) + for _ in range(n_layers - 1): + self.conv_layers.append( + nn.Conv1d( + hidden_channels, + hidden_channels, + kernel_size, + padding=kernel_size // 2, + ) + ) + self.norm_layers.append(LayerNorm(hidden_channels)) + self.proj = nn.Conv1d(hidden_channels, out_channels, 1) + self.proj.weight.data.zero_() + self.proj.bias.data.zero_() + + def forward(self, x, x_mask): + x_org = x + for i in range(self.n_layers): + x = self.conv_layers[i](x * x_mask) + x = self.norm_layers[i](x) + x = self.relu_drop(x) + x = x_org + self.proj(x) + return x * x_mask class DDSConv(nn.Module): - """ - Dialted and Depth-Separable Convolution - """ - def __init__(self, channels, kernel_size, n_layers, p_dropout=0.): - super().__init__() - self.channels = channels - self.kernel_size = kernel_size - self.n_layers = n_layers - self.p_dropout = p_dropout - - self.drop = nn.Dropout(p_dropout) - self.convs_sep = nn.ModuleList() - self.convs_1x1 = nn.ModuleList() - self.norms_1 = nn.ModuleList() - self.norms_2 = nn.ModuleList() - for i in range(n_layers): - dilation = kernel_size ** i - padding = (kernel_size * dilation - dilation) // 2 - self.convs_sep.append(nn.Conv1d(channels, channels, kernel_size, - groups=channels, dilation=dilation, padding=padding - )) - self.convs_1x1.append(nn.Conv1d(channels, channels, 1)) - self.norms_1.append(LayerNorm(channels)) - self.norms_2.append(LayerNorm(channels)) - - def forward(self, x, x_mask, g=None): - if g is not None: - x = x + g - for i in range(self.n_layers): - y = self.convs_sep[i](x * x_mask) - y = self.norms_1[i](y) - y = F.gelu(y) - y = self.convs_1x1[i](y) - y = self.norms_2[i](y) - y = F.gelu(y) - y = self.drop(y) - x = x + y - return x * x_mask + """ + Dialted and Depth-Separable Convolution + """ + + def __init__(self, channels, kernel_size, n_layers, p_dropout=0.0): + super().__init__() + self.channels = channels + self.kernel_size = kernel_size + self.n_layers = n_layers + self.p_dropout = p_dropout + + self.drop = nn.Dropout(p_dropout) + self.convs_sep = nn.ModuleList() + self.convs_1x1 = nn.ModuleList() + self.norms_1 = nn.ModuleList() + self.norms_2 = nn.ModuleList() + for i in range(n_layers): + dilation = kernel_size**i + padding = (kernel_size * dilation - dilation) // 2 + self.convs_sep.append( + nn.Conv1d( + channels, + channels, + kernel_size, + groups=channels, + dilation=dilation, + padding=padding, + ) + ) + self.convs_1x1.append(nn.Conv1d(channels, channels, 1)) + self.norms_1.append(LayerNorm(channels)) + self.norms_2.append(LayerNorm(channels)) + + def forward(self, x, x_mask, g=None): + if g is not None: + x = x + g + for i in range(self.n_layers): + y = self.convs_sep[i](x * x_mask) + y = self.norms_1[i](y) + y = F.gelu(y) + y = self.convs_1x1[i](y) + y = self.norms_2[i](y) + y = F.gelu(y) + y = self.drop(y) + x = x + y + return x * x_mask class WN(torch.nn.Module): - def __init__(self, hidden_channels, kernel_size, dilation_rate, n_layers, gin_channels=0, p_dropout=0): - super(WN, self).__init__() - assert(kernel_size % 2 == 1) - self.hidden_channels =hidden_channels - self.kernel_size = kernel_size, - self.dilation_rate = dilation_rate - self.n_layers = n_layers - self.gin_channels = gin_channels - self.p_dropout = p_dropout - - self.in_layers = torch.nn.ModuleList() - self.res_skip_layers = torch.nn.ModuleList() - self.drop = nn.Dropout(p_dropout) - - if gin_channels != 0: - cond_layer = torch.nn.Conv1d(gin_channels, 2*hidden_channels*n_layers, 1) - self.cond_layer = torch.nn.utils.weight_norm(cond_layer, name='weight') - - for i in range(n_layers): - dilation = dilation_rate ** i - padding = int((kernel_size * dilation - dilation) / 2) - in_layer = torch.nn.Conv1d(hidden_channels, 2*hidden_channels, kernel_size, - dilation=dilation, padding=padding) - in_layer = torch.nn.utils.weight_norm(in_layer, name='weight') - self.in_layers.append(in_layer) - - # last one is not necessary - if i < n_layers - 1: - res_skip_channels = 2 * hidden_channels - else: - res_skip_channels = hidden_channels - - res_skip_layer = torch.nn.Conv1d(hidden_channels, res_skip_channels, 1) - res_skip_layer = torch.nn.utils.weight_norm(res_skip_layer, name='weight') - self.res_skip_layers.append(res_skip_layer) - - def forward(self, x, x_mask, g=None, **kwargs): - output = torch.zeros_like(x) - n_channels_tensor = torch.IntTensor([self.hidden_channels]) - - if g is not None: - g = self.cond_layer(g) - - for i in range(self.n_layers): - x_in = self.in_layers[i](x) - if g is not None: - cond_offset = i * 2 * self.hidden_channels - g_l = g[:,cond_offset:cond_offset+2*self.hidden_channels,:] - else: - g_l = torch.zeros_like(x_in) - - acts = commons.fused_add_tanh_sigmoid_multiply( - x_in, - g_l, - n_channels_tensor) - acts = self.drop(acts) - - res_skip_acts = self.res_skip_layers[i](acts) - if i < self.n_layers - 1: - res_acts = res_skip_acts[:,:self.hidden_channels,:] - x = (x + res_acts) * x_mask - output = output + res_skip_acts[:,self.hidden_channels:,:] - else: - output = output + res_skip_acts - return output * x_mask - - def remove_weight_norm(self): - if self.gin_channels != 0: - torch.nn.utils.remove_weight_norm(self.cond_layer) - for l in self.in_layers: - torch.nn.utils.remove_weight_norm(l) - for l in self.res_skip_layers: - torch.nn.utils.remove_weight_norm(l) + def __init__( + self, + hidden_channels, + kernel_size, + dilation_rate, + n_layers, + gin_channels=0, + p_dropout=0, + ): + super(WN, self).__init__() + assert kernel_size % 2 == 1 + self.hidden_channels = hidden_channels + self.kernel_size = (kernel_size,) + self.dilation_rate = dilation_rate + self.n_layers = n_layers + self.gin_channels = gin_channels + self.p_dropout = p_dropout + + self.in_layers = torch.nn.ModuleList() + self.res_skip_layers = torch.nn.ModuleList() + self.drop = nn.Dropout(p_dropout) + + if gin_channels != 0: + cond_layer = torch.nn.Conv1d( + gin_channels, 2 * hidden_channels * n_layers, 1 + ) + self.cond_layer = torch.nn.utils.weight_norm(cond_layer, name="weight") + + for i in range(n_layers): + dilation = dilation_rate**i + padding = int((kernel_size * dilation - dilation) / 2) + in_layer = torch.nn.Conv1d( + hidden_channels, + 2 * hidden_channels, + kernel_size, + dilation=dilation, + padding=padding, + ) + in_layer = torch.nn.utils.weight_norm(in_layer, name="weight") + self.in_layers.append(in_layer) + + # last one is not necessary + if i < n_layers - 1: + res_skip_channels = 2 * hidden_channels + else: + res_skip_channels = hidden_channels + + res_skip_layer = torch.nn.Conv1d(hidden_channels, res_skip_channels, 1) + res_skip_layer = torch.nn.utils.weight_norm(res_skip_layer, name="weight") + self.res_skip_layers.append(res_skip_layer) + + def forward(self, x, x_mask, g=None, **kwargs): + output = torch.zeros_like(x) + n_channels_tensor = torch.IntTensor([self.hidden_channels]) + + if g is not None: + g = self.cond_layer(g) + + for i in range(self.n_layers): + x_in = self.in_layers[i](x) + if g is not None: + cond_offset = i * 2 * self.hidden_channels + g_l = g[:, cond_offset : cond_offset + 2 * self.hidden_channels, :] + else: + g_l = torch.zeros_like(x_in) + + acts = commons.fused_add_tanh_sigmoid_multiply(x_in, g_l, n_channels_tensor) + acts = self.drop(acts) + + res_skip_acts = self.res_skip_layers[i](acts) + if i < self.n_layers - 1: + res_acts = res_skip_acts[:, : self.hidden_channels, :] + x = (x + res_acts) * x_mask + output = output + res_skip_acts[:, self.hidden_channels :, :] + else: + output = output + res_skip_acts + return output * x_mask + + def remove_weight_norm(self): + if self.gin_channels != 0: + torch.nn.utils.remove_weight_norm(self.cond_layer) + for l in self.in_layers: + torch.nn.utils.remove_weight_norm(l) + for l in self.res_skip_layers: + torch.nn.utils.remove_weight_norm(l) class ResBlock1(torch.nn.Module): def __init__(self, channels, kernel_size=3, dilation=(1, 3, 5)): super(ResBlock1, self).__init__() - self.convs1 = nn.ModuleList([ - weight_norm(Conv1d(channels, channels, kernel_size, 1, dilation=dilation[0], - padding=get_padding(kernel_size, dilation[0]))), - weight_norm(Conv1d(channels, channels, kernel_size, 1, dilation=dilation[1], - padding=get_padding(kernel_size, dilation[1]))), - weight_norm(Conv1d(channels, channels, kernel_size, 1, dilation=dilation[2], - padding=get_padding(kernel_size, dilation[2]))) - ]) + self.convs1 = nn.ModuleList( + [ + weight_norm( + Conv1d( + channels, + channels, + kernel_size, + 1, + dilation=dilation[0], + padding=get_padding(kernel_size, dilation[0]), + ) + ), + weight_norm( + Conv1d( + channels, + channels, + kernel_size, + 1, + dilation=dilation[1], + padding=get_padding(kernel_size, dilation[1]), + ) + ), + weight_norm( + Conv1d( + channels, + channels, + kernel_size, + 1, + dilation=dilation[2], + padding=get_padding(kernel_size, dilation[2]), + ) + ), + ] + ) self.convs1.apply(init_weights) - self.convs2 = nn.ModuleList([ - weight_norm(Conv1d(channels, channels, kernel_size, 1, dilation=1, - padding=get_padding(kernel_size, 1))), - weight_norm(Conv1d(channels, channels, kernel_size, 1, dilation=1, - padding=get_padding(kernel_size, 1))), - weight_norm(Conv1d(channels, channels, kernel_size, 1, dilation=1, - padding=get_padding(kernel_size, 1))) - ]) + self.convs2 = nn.ModuleList( + [ + weight_norm( + Conv1d( + channels, + channels, + kernel_size, + 1, + dilation=1, + padding=get_padding(kernel_size, 1), + ) + ), + weight_norm( + Conv1d( + channels, + channels, + kernel_size, + 1, + dilation=1, + padding=get_padding(kernel_size, 1), + ) + ), + weight_norm( + Conv1d( + channels, + channels, + kernel_size, + 1, + dilation=1, + padding=get_padding(kernel_size, 1), + ) + ), + ] + ) self.convs2.apply(init_weights) def forward(self, x, x_mask=None): @@ -230,12 +321,30 @@ def remove_weight_norm(self): class ResBlock2(torch.nn.Module): def __init__(self, channels, kernel_size=3, dilation=(1, 3)): super(ResBlock2, self).__init__() - self.convs = nn.ModuleList([ - weight_norm(Conv1d(channels, channels, kernel_size, 1, dilation=dilation[0], - padding=get_padding(kernel_size, dilation[0]))), - weight_norm(Conv1d(channels, channels, kernel_size, 1, dilation=dilation[1], - padding=get_padding(kernel_size, dilation[1]))) - ]) + self.convs = nn.ModuleList( + [ + weight_norm( + Conv1d( + channels, + channels, + kernel_size, + 1, + dilation=dilation[0], + padding=get_padding(kernel_size, dilation[0]), + ) + ), + weight_norm( + Conv1d( + channels, + channels, + kernel_size, + 1, + dilation=dilation[1], + padding=get_padding(kernel_size, dilation[1]), + ) + ), + ] + ) self.convs.apply(init_weights) def forward(self, x, x_mask=None): @@ -255,198 +364,237 @@ def remove_weight_norm(self): class Log(nn.Module): - def forward(self, x, x_mask, reverse=False, **kwargs): - if not reverse: - y = torch.log(torch.clamp_min(x, 1e-5)) * x_mask - logdet = torch.sum(-y, [1, 2]) - return y, logdet - else: - x = torch.exp(x) * x_mask - return x - + def forward(self, x, x_mask, reverse=False, **kwargs): + if not reverse: + y = torch.log(torch.clamp_min(x, 1e-5)) * x_mask + logdet = torch.sum(-y, [1, 2]) + return y, logdet + else: + x = torch.exp(x) * x_mask + return x + class Flip(nn.Module): - def forward(self, x, *args, reverse=False, **kwargs): - x = torch.flip(x, [1]) - if not reverse: - logdet = torch.zeros(x.size(0)).to(dtype=x.dtype, device=x.device) - return x, logdet - else: - return x + def forward(self, x, *args, reverse=False, **kwargs): + x = torch.flip(x, [1]) + if not reverse: + logdet = torch.zeros(x.size(0)).to(dtype=x.dtype, device=x.device) + return x, logdet + else: + return x class ElementwiseAffine(nn.Module): - def __init__(self, channels): - super().__init__() - self.channels = channels - self.m = nn.Parameter(torch.zeros(channels,1)) - self.logs = nn.Parameter(torch.zeros(channels,1)) - - def forward(self, x, x_mask, reverse=False, **kwargs): - if not reverse: - y = self.m + torch.exp(self.logs) * x - y = y * x_mask - logdet = torch.sum(self.logs * x_mask, [1,2]) - return y, logdet - else: - x = (x - self.m) * torch.exp(-self.logs) * x_mask - return x + def __init__(self, channels): + super().__init__() + self.channels = channels + self.m = nn.Parameter(torch.zeros(channels, 1)) + self.logs = nn.Parameter(torch.zeros(channels, 1)) + + def forward(self, x, x_mask, reverse=False, **kwargs): + if not reverse: + y = self.m + torch.exp(self.logs) * x + y = y * x_mask + logdet = torch.sum(self.logs * x_mask, [1, 2]) + return y, logdet + else: + x = (x - self.m) * torch.exp(-self.logs) * x_mask + return x class ResidualCouplingLayer(nn.Module): - def __init__(self, - channels, - hidden_channels, - kernel_size, - dilation_rate, - n_layers, - p_dropout=0, - gin_channels=0, - mean_only=False): - assert channels % 2 == 0, "channels should be divisible by 2" - super().__init__() - self.channels = channels - self.hidden_channels = hidden_channels - self.kernel_size = kernel_size - self.dilation_rate = dilation_rate - self.n_layers = n_layers - self.half_channels = channels // 2 - self.mean_only = mean_only - - self.pre = nn.Conv1d(self.half_channels, hidden_channels, 1) - self.enc = WN(hidden_channels, kernel_size, dilation_rate, n_layers, p_dropout=p_dropout, gin_channels=gin_channels) - self.post = nn.Conv1d(hidden_channels, self.half_channels * (2 - mean_only), 1) - self.post.weight.data.zero_() - self.post.bias.data.zero_() - - def forward(self, x, x_mask, g=None, reverse=False): - x0, x1 = torch.split(x, [self.half_channels]*2, 1) - h = self.pre(x0) * x_mask - h = self.enc(h, x_mask, g=g) - stats = self.post(h) * x_mask - if not self.mean_only: - m, logs = torch.split(stats, [self.half_channels]*2, 1) - else: - m = stats - logs = torch.zeros_like(m) - - if not reverse: - x1 = m + x1 * torch.exp(logs) * x_mask - x = torch.cat([x0, x1], 1) - logdet = torch.sum(logs, [1,2]) - return x, logdet - else: - x1 = (x1 - m) * torch.exp(-logs) * x_mask - x = torch.cat([x0, x1], 1) - return x + def __init__( + self, + channels, + hidden_channels, + kernel_size, + dilation_rate, + n_layers, + p_dropout=0, + gin_channels=0, + mean_only=False, + ): + assert channels % 2 == 0, "channels should be divisible by 2" + super().__init__() + self.channels = channels + self.hidden_channels = hidden_channels + self.kernel_size = kernel_size + self.dilation_rate = dilation_rate + self.n_layers = n_layers + self.half_channels = channels // 2 + self.mean_only = mean_only + + self.pre = nn.Conv1d(self.half_channels, hidden_channels, 1) + self.enc = WN( + hidden_channels, + kernel_size, + dilation_rate, + n_layers, + p_dropout=p_dropout, + gin_channels=gin_channels, + ) + self.post = nn.Conv1d(hidden_channels, self.half_channels * (2 - mean_only), 1) + self.post.weight.data.zero_() + self.post.bias.data.zero_() + + def forward(self, x, x_mask, g=None, reverse=False): + x0, x1 = torch.split(x, [self.half_channels] * 2, 1) + h = self.pre(x0) * x_mask + h = self.enc(h, x_mask, g=g) + stats = self.post(h) * x_mask + if not self.mean_only: + m, logs = torch.split(stats, [self.half_channels] * 2, 1) + else: + m = stats + logs = torch.zeros_like(m) + + if not reverse: + x1 = m + x1 * torch.exp(logs) * x_mask + x = torch.cat([x0, x1], 1) + logdet = torch.sum(logs, [1, 2]) + return x, logdet + else: + x1 = (x1 - m) * torch.exp(-logs) * x_mask + x = torch.cat([x0, x1], 1) + return x class ConvFlow(nn.Module): - def __init__(self, in_channels, filter_channels, kernel_size, n_layers, num_bins=10, tail_bound=5.0): - super().__init__() - self.in_channels = in_channels - self.filter_channels = filter_channels - self.kernel_size = kernel_size - self.n_layers = n_layers - self.num_bins = num_bins - self.tail_bound = tail_bound - self.half_channels = in_channels // 2 - - self.pre = nn.Conv1d(self.half_channels, filter_channels, 1) - self.convs = DDSConv(filter_channels, kernel_size, n_layers, p_dropout=0.) - self.proj = nn.Conv1d(filter_channels, self.half_channels * (num_bins * 3 - 1), 1) - self.proj.weight.data.zero_() - self.proj.bias.data.zero_() - - def forward(self, x, x_mask, g=None, reverse=False): - x0, x1 = torch.split(x, [self.half_channels]*2, 1) - h = self.pre(x0) - h = self.convs(h, x_mask, g=g) - h = self.proj(h) * x_mask - - b, c, t = x0.shape - h = h.reshape(b, c, -1, t).permute(0, 1, 3, 2) # [b, cx?, t] -> [b, c, t, ?] - - unnormalized_widths = h[..., :self.num_bins] / math.sqrt(self.filter_channels) - unnormalized_heights = h[..., self.num_bins:2*self.num_bins] / math.sqrt(self.filter_channels) - unnormalized_derivatives = h[..., 2 * self.num_bins:] - - x1, logabsdet = piecewise_rational_quadratic_transform(x1, - unnormalized_widths, - unnormalized_heights, - unnormalized_derivatives, - inverse=reverse, - tails='linear', - tail_bound=self.tail_bound - ) - - x = torch.cat([x0, x1], 1) * x_mask - logdet = torch.sum(logabsdet * x_mask, [1,2]) - if not reverse: - return x, logdet - else: - return x + def __init__( + self, + in_channels, + filter_channels, + kernel_size, + n_layers, + num_bins=10, + tail_bound=5.0, + ): + super().__init__() + self.in_channels = in_channels + self.filter_channels = filter_channels + self.kernel_size = kernel_size + self.n_layers = n_layers + self.num_bins = num_bins + self.tail_bound = tail_bound + self.half_channels = in_channels // 2 + + self.pre = nn.Conv1d(self.half_channels, filter_channels, 1) + self.convs = DDSConv(filter_channels, kernel_size, n_layers, p_dropout=0.0) + self.proj = nn.Conv1d( + filter_channels, self.half_channels * (num_bins * 3 - 1), 1 + ) + self.proj.weight.data.zero_() + self.proj.bias.data.zero_() + + def forward(self, x, x_mask, g=None, reverse=False): + x0, x1 = torch.split(x, [self.half_channels] * 2, 1) + h = self.pre(x0) + h = self.convs(h, x_mask, g=g) + h = self.proj(h) * x_mask + + b, c, t = x0.shape + h = h.reshape(b, c, -1, t).permute(0, 1, 3, 2) # [b, cx?, t] -> [b, c, t, ?] + + unnormalized_widths = h[..., : self.num_bins] / math.sqrt(self.filter_channels) + unnormalized_heights = h[..., self.num_bins : 2 * self.num_bins] / math.sqrt( + self.filter_channels + ) + unnormalized_derivatives = h[..., 2 * self.num_bins :] + + x1, logabsdet = piecewise_rational_quadratic_transform( + x1, + unnormalized_widths, + unnormalized_heights, + unnormalized_derivatives, + inverse=reverse, + tails="linear", + tail_bound=self.tail_bound, + ) + + x = torch.cat([x0, x1], 1) * x_mask + logdet = torch.sum(logabsdet * x_mask, [1, 2]) + if not reverse: + return x, logdet + else: + return x + + class TransformerCouplingLayer(nn.Module): - def __init__(self, - channels, - hidden_channels, - kernel_size, - n_layers, - n_heads, - p_dropout=0, - filter_channels=0, - mean_only=False, - wn_sharing_parameter=None, - gin_channels = 0 - ): - assert channels % 2 == 0, "channels should be divisible by 2" - super().__init__() - self.channels = channels - self.hidden_channels = hidden_channels - self.kernel_size = kernel_size - self.n_layers = n_layers - self.half_channels = channels // 2 - self.mean_only = mean_only - - self.pre = nn.Conv1d(self.half_channels, hidden_channels, 1) - self.enc = Encoder(hidden_channels, filter_channels, n_heads, n_layers, kernel_size, p_dropout, isflow = True, gin_channels = gin_channels) if wn_sharing_parameter is None else wn_sharing_parameter - self.post = nn.Conv1d(hidden_channels, self.half_channels * (2 - mean_only), 1) - self.post.weight.data.zero_() - self.post.bias.data.zero_() - - def forward(self, x, x_mask, g=None, reverse=False): - x0, x1 = torch.split(x, [self.half_channels]*2, 1) - h = self.pre(x0) * x_mask - h = self.enc(h, x_mask, g=g) - stats = self.post(h) * x_mask - if not self.mean_only: - m, logs = torch.split(stats, [self.half_channels]*2, 1) - else: - m = stats - logs = torch.zeros_like(m) - - if not reverse: - x1 = m + x1 * torch.exp(logs) * x_mask - x = torch.cat([x0, x1], 1) - logdet = torch.sum(logs, [1,2]) - return x, logdet - else: - x1 = (x1 - m) * torch.exp(-logs) * x_mask - x = torch.cat([x0, x1], 1) - return x - - x1, logabsdet = piecewise_rational_quadratic_transform(x1, - unnormalized_widths, - unnormalized_heights, - unnormalized_derivatives, - inverse=reverse, - tails='linear', - tail_bound=self.tail_bound - ) - - x = torch.cat([x0, x1], 1) * x_mask - logdet = torch.sum(logabsdet * x_mask, [1,2]) - if not reverse: - return x, logdet - else: - return x + def __init__( + self, + channels, + hidden_channels, + kernel_size, + n_layers, + n_heads, + p_dropout=0, + filter_channels=0, + mean_only=False, + wn_sharing_parameter=None, + gin_channels=0, + ): + assert channels % 2 == 0, "channels should be divisible by 2" + super().__init__() + self.channels = channels + self.hidden_channels = hidden_channels + self.kernel_size = kernel_size + self.n_layers = n_layers + self.half_channels = channels // 2 + self.mean_only = mean_only + + self.pre = nn.Conv1d(self.half_channels, hidden_channels, 1) + self.enc = ( + Encoder( + hidden_channels, + filter_channels, + n_heads, + n_layers, + kernel_size, + p_dropout, + isflow=True, + gin_channels=gin_channels, + ) + if wn_sharing_parameter is None + else wn_sharing_parameter + ) + self.post = nn.Conv1d(hidden_channels, self.half_channels * (2 - mean_only), 1) + self.post.weight.data.zero_() + self.post.bias.data.zero_() + + def forward(self, x, x_mask, g=None, reverse=False): + x0, x1 = torch.split(x, [self.half_channels] * 2, 1) + h = self.pre(x0) * x_mask + h = self.enc(h, x_mask, g=g) + stats = self.post(h) * x_mask + if not self.mean_only: + m, logs = torch.split(stats, [self.half_channels] * 2, 1) + else: + m = stats + logs = torch.zeros_like(m) + + if not reverse: + x1 = m + x1 * torch.exp(logs) * x_mask + x = torch.cat([x0, x1], 1) + logdet = torch.sum(logs, [1, 2]) + return x, logdet + else: + x1 = (x1 - m) * torch.exp(-logs) * x_mask + x = torch.cat([x0, x1], 1) + return x + + x1, logabsdet = piecewise_rational_quadratic_transform( + x1, + unnormalized_widths, + unnormalized_heights, + unnormalized_derivatives, + inverse=reverse, + tails="linear", + tail_bound=self.tail_bound, + ) + + x = torch.cat([x0, x1], 1) * x_mask + logdet = torch.sum(logabsdet * x_mask, [1, 2]) + if not reverse: + return x, logdet + else: + return x diff --git a/monotonic_align/__init__.py b/monotonic_align/__init__.py index 73c47de69..15d8e60c4 100644 --- a/monotonic_align/__init__.py +++ b/monotonic_align/__init__.py @@ -3,13 +3,14 @@ from .core import maximum_path_jit + def maximum_path(neg_cent, mask): - device = neg_cent.device - dtype = neg_cent.dtype - neg_cent = neg_cent.data.cpu().numpy().astype(float32) - path = zeros(neg_cent.shape, dtype=int32) - - t_t_max = mask.sum(1)[:, 0].data.cpu().numpy().astype(int32) - t_s_max = mask.sum(2)[:, 0].data.cpu().numpy().astype(int32) - maximum_path_jit(path, neg_cent, t_t_max, t_s_max) - return from_numpy(path).to(device=device, dtype=dtype) + device = neg_cent.device + dtype = neg_cent.dtype + neg_cent = neg_cent.data.cpu().numpy().astype(float32) + path = zeros(neg_cent.shape, dtype=int32) + + t_t_max = mask.sum(1)[:, 0].data.cpu().numpy().astype(int32) + t_s_max = mask.sum(2)[:, 0].data.cpu().numpy().astype(int32) + maximum_path_jit(path, neg_cent, t_t_max, t_s_max) + return from_numpy(path).to(device=device, dtype=dtype) diff --git a/monotonic_align/core.py b/monotonic_align/core.py index 67d7884e9..ffa489da5 100644 --- a/monotonic_align/core.py +++ b/monotonic_align/core.py @@ -1,35 +1,46 @@ import numba -@numba.jit(numba.void(numba.int32[:,:,::1], numba.float32[:,:,::1], numba.int32[::1], numba.int32[::1]), nopython=True, nogil=True) +@numba.jit( + numba.void( + numba.int32[:, :, ::1], + numba.float32[:, :, ::1], + numba.int32[::1], + numba.int32[::1], + ), + nopython=True, + nogil=True, +) def maximum_path_jit(paths, values, t_ys, t_xs): - b = paths.shape[0] - max_neg_val=-1e9 - for i in range(int(b)): - path = paths[i] - value = values[i] - t_y = t_ys[i] - t_x = t_xs[i] + b = paths.shape[0] + max_neg_val = -1e9 + for i in range(int(b)): + path = paths[i] + value = values[i] + t_y = t_ys[i] + t_x = t_xs[i] - v_prev = v_cur = 0.0 - index = t_x - 1 + v_prev = v_cur = 0.0 + index = t_x - 1 - for y in range(t_y): - for x in range(max(0, t_x + y - t_y), min(t_x, y + 1)): - if x == y: - v_cur = max_neg_val - else: - v_cur = value[y-1, x] - if x == 0: - if y == 0: - v_prev = 0. - else: - v_prev = max_neg_val - else: - v_prev = value[y-1, x-1] - value[y, x] += max(v_prev, v_cur) + for y in range(t_y): + for x in range(max(0, t_x + y - t_y), min(t_x, y + 1)): + if x == y: + v_cur = max_neg_val + else: + v_cur = value[y - 1, x] + if x == 0: + if y == 0: + v_prev = 0.0 + else: + v_prev = max_neg_val + else: + v_prev = value[y - 1, x - 1] + value[y, x] += max(v_prev, v_cur) - for y in range(t_y - 1, -1, -1): - path[y, index] = 1 - if index != 0 and (index == y or value[y-1, index] < value[y-1, index-1]): - index = index - 1 + for y in range(t_y - 1, -1, -1): + path[y, index] = 1 + if index != 0 and ( + index == y or value[y - 1, index] < value[y - 1, index - 1] + ): + index = index - 1 diff --git a/preprocess_text.py b/preprocess_text.py index 4bb0e23e3..e827507ce 100644 --- a/preprocess_text.py +++ b/preprocess_text.py @@ -35,7 +35,6 @@ def main( max_val_total: int, clean: bool, ): - if cleaned_path is None: cleaned_path = transcription_path + ".cleaned" diff --git a/resample.py b/resample.py index 2ed168565..9f5d5c361 100644 --- a/resample.py +++ b/resample.py @@ -13,30 +13,38 @@ def process(item): spkdir, wav_name, args = item speaker = spkdir.replace("\\", "/").split("/")[-1] wav_path = os.path.join(args.in_dir, speaker, wav_name) - if os.path.exists(wav_path) and '.wav' in wav_path: + if os.path.exists(wav_path) and ".wav" in wav_path: os.makedirs(os.path.join(args.out_dir, speaker), exist_ok=True) wav, sr = librosa.load(wav_path, sr=args.sr) - soundfile.write( - os.path.join(args.out_dir, speaker, wav_name), - wav, - sr - ) - + soundfile.write(os.path.join(args.out_dir, speaker, wav_name), wav, sr) if __name__ == "__main__": parser = argparse.ArgumentParser() parser.add_argument("--sr", type=int, default=44100, help="sampling rate") - parser.add_argument("--in_dir", type=str, default="./raw", help="path to source dir") - parser.add_argument("--out_dir", type=str, default="./dataset", help="path to target dir") + parser.add_argument( + "--in_dir", type=str, default="./raw", help="path to source dir" + ) + parser.add_argument( + "--out_dir", type=str, default="./dataset", help="path to target dir" + ) args = parser.parse_args() # processs = 8 - processs = cpu_count()-2 if cpu_count() >4 else 1 + processs = cpu_count() - 2 if cpu_count() > 4 else 1 pool = Pool(processes=processs) for speaker in os.listdir(args.in_dir): spk_dir = os.path.join(args.in_dir, speaker) if os.path.isdir(spk_dir): print(spk_dir) - for _ in tqdm(pool.imap_unordered(process, [(spk_dir, i, args) for i in os.listdir(spk_dir) if i.endswith("wav")])): + for _ in tqdm( + pool.imap_unordered( + process, + [ + (spk_dir, i, args) + for i in os.listdir(spk_dir) + if i.endswith("wav") + ], + ) + ): pass diff --git a/server.py b/server.py index 550db2340..b43aec624 100644 --- a/server.py +++ b/server.py @@ -13,7 +13,8 @@ # Flask Init app = Flask(__name__) -app.config['JSON_AS_ASCII'] = False +app.config["JSON_AS_ASCII"] = False + def get_text(text, language_str, hps): norm_text, phone, tone, word2ph = clean_text(text, language_str) @@ -30,84 +31,121 @@ def get_text(text, language_str, hps): del word2ph assert bert.shape[-1] == len(phone), phone - if language_str=='ZH': + if language_str == "ZH": bert = bert ja_bert = torch.zeros(768, len(phone)) - elif language_str=="JA": + elif language_str == "JA": ja_bert = bert bert = torch.zeros(1024, len(phone)) else: bert = torch.zeros(1024, len(phone)) ja_bert = torch.zeros(768, len(phone)) assert bert.shape[-1] == len(phone), ( - bert.shape, len(phone), sum(word2ph), p1, p2, t1, t2, pold, pold2, word2ph, text, w2pho) + bert.shape, + len(phone), + sum(word2ph), + p1, + p2, + t1, + t2, + pold, + pold2, + word2ph, + text, + w2pho, + ) phone = torch.LongTensor(phone) tone = torch.LongTensor(tone) language = torch.LongTensor(language) return bert, ja_bert, phone, tone, language + def infer(text, sdp_ratio, noise_scale, noise_scale_w, length_scale, sid, language): bert, ja_bert, phones, tones, lang_ids = get_text(text, language, hps) with torch.no_grad(): - x_tst=phones.to(dev).unsqueeze(0) - tones=tones.to(dev).unsqueeze(0) - lang_ids=lang_ids.to(dev).unsqueeze(0) + x_tst = phones.to(dev).unsqueeze(0) + tones = tones.to(dev).unsqueeze(0) + lang_ids = lang_ids.to(dev).unsqueeze(0) bert = bert.to(dev).unsqueeze(0) ja_bert = ja_bert.to(device).unsqueeze(0) x_tst_lengths = torch.LongTensor([phones.size(0)]).to(dev) speakers = torch.LongTensor([hps.data.spk2id[sid]]).to(dev) - audio = net_g.infer(x_tst, x_tst_lengths, speakers, tones, lang_ids, bert, ja_bert, sdp_ratio=sdp_ratio - , noise_scale=noise_scale, noise_scale_w=noise_scale_w, length_scale=length_scale)[0][0,0].data.cpu().float().numpy() + audio = ( + net_g.infer( + x_tst, + x_tst_lengths, + speakers, + tones, + lang_ids, + bert, + ja_bert, + sdp_ratio=sdp_ratio, + noise_scale=noise_scale, + noise_scale_w=noise_scale_w, + length_scale=length_scale, + )[0][0, 0] + .data.cpu() + .float() + .numpy() + ) return audio + def replace_punctuation(text, i=2): punctuation = ",。?!" for char in punctuation: text = text.replace(char, char * i) return text + def wav2(i, o, format): - inp = avopen(i, 'rb') - out = avopen(o, 'wb', format=format) - if format == "ogg": format = "libvorbis" + inp = avopen(i, "rb") + out = avopen(o, "wb", format=format) + if format == "ogg": + format = "libvorbis" ostream = out.add_stream(format) for frame in inp.decode(audio=0): - for p in ostream.encode(frame): out.mux(p) + for p in ostream.encode(frame): + out.mux(p) - for p in ostream.encode(None): out.mux(p) + for p in ostream.encode(None): + out.mux(p) out.close() inp.close() + # Load Generator hps = utils.get_hparams_from_file("./configs/config.json") -dev='cuda' +dev = "cuda" net_g = SynthesizerTrn( len(symbols), hps.data.filter_length // 2 + 1, hps.train.segment_size // hps.data.hop_length, n_speakers=hps.data.n_speakers, - **hps.model).to(dev) + **hps.model +).to(dev) _ = net_g.eval() -_ = utils.load_checkpoint("logs/G_649000.pth", net_g, None,skip_optimizer=True) +_ = utils.load_checkpoint("logs/G_649000.pth", net_g, None, skip_optimizer=True) + @app.route("/") def main(): try: - speaker = request.args.get('speaker') - text = request.args.get('text').replace("/n","") + speaker = request.args.get("speaker") + text = request.args.get("text").replace("/n", "") sdp_ratio = float(request.args.get("sdp_ratio", 0.2)) noise = float(request.args.get("noise", 0.5)) noisew = float(request.args.get("noisew", 0.6)) length = float(request.args.get("length", 1.2)) - language = request.args.get('language') + language = request.args.get("language") if length >= 2: return "Too big length" - if len(text) >=250: + if len(text) >= 250: return "Too long text" fmt = request.args.get("format", "wav") if None in (speaker, text): @@ -120,7 +158,15 @@ def main(): return "Invalid Parameter" with torch.no_grad(): - audio = infer(text, sdp_ratio=sdp_ratio, noise_scale=noise, noise_scale_w=noisew, length_scale=length, sid=speaker,language = language) + audio = infer( + text, + sdp_ratio=sdp_ratio, + noise_scale=noise, + noise_scale_w=noisew, + length_scale=length, + sid=speaker, + language=language, + ) with BytesIO() as wav: wavfile.write(wav, hps.data.sampling_rate, audio) @@ -131,6 +177,5 @@ def main(): with BytesIO() as ofp: wav2(wav, ofp, fmt) return Response( - ofp.getvalue(), - mimetype="audio/mpeg" if fmt == "mp3" else "audio/ogg" + ofp.getvalue(), mimetype="audio/mpeg" if fmt == "mp3" else "audio/ogg" ) diff --git a/text/__init__.py b/text/__init__.py index 1392ad201..8dd10db04 100644 --- a/text/__init__.py +++ b/text/__init__.py @@ -3,28 +3,27 @@ _symbol_to_id = {s: i for i, s in enumerate(symbols)} + def cleaned_text_to_sequence(cleaned_text, tones, language): - '''Converts a string of text to a sequence of IDs corresponding to the symbols in the text. + """Converts a string of text to a sequence of IDs corresponding to the symbols in the text. Args: text: string to convert to a sequence Returns: List of integers corresponding to the symbols in the text - ''' - phones = [_symbol_to_id[symbol] for symbol in cleaned_text] - tone_start = language_tone_start_map[language] - tones = [i + tone_start for i in tones] - lang_id = language_id_map[language] - lang_ids = [lang_id for i in phones] - return phones, tones, lang_ids + """ + phones = [_symbol_to_id[symbol] for symbol in cleaned_text] + tone_start = language_tone_start_map[language] + tones = [i + tone_start for i in tones] + lang_id = language_id_map[language] + lang_ids = [lang_id for i in phones] + return phones, tones, lang_ids + def get_bert(norm_text, word2ph, language, device): - from .chinese_bert import get_bert_feature as zh_bert - from .english_bert_mock import get_bert_feature as en_bert - from .japanese_bert import get_bert_feature as jp_bert - lang_bert_func_map = { - 'ZH': zh_bert, - 'EN': en_bert, - 'JP': jp_bert - } - bert = lang_bert_func_map[language](norm_text, word2ph, device) - return bert + from .chinese_bert import get_bert_feature as zh_bert + from .english_bert_mock import get_bert_feature as en_bert + from .japanese_bert import get_bert_feature as jp_bert + + lang_bert_func_map = {"ZH": zh_bert, "EN": en_bert, "JP": jp_bert} + bert = lang_bert_func_map[language](norm_text, word2ph, device) + return bert diff --git a/text/chinese.py b/text/chinese.py index 276753880..70b8feb5a 100644 --- a/text/chinese.py +++ b/text/chinese.py @@ -9,65 +9,70 @@ from text.tone_sandhi import ToneSandhi current_file_path = os.path.dirname(__file__) -pinyin_to_symbol_map = {line.split("\t")[0]: line.strip().split("\t")[1] for line in - open(os.path.join(current_file_path, 'opencpop-strict.txt')).readlines()} +pinyin_to_symbol_map = { + line.split("\t")[0]: line.strip().split("\t")[1] + for line in open(os.path.join(current_file_path, "opencpop-strict.txt")).readlines() +} import jieba.posseg as psg rep_map = { - ':': ',', - ';': ',', - ',': ',', - '。': '.', - '!': '!', - '?': '?', - '\n': '.', + ":": ",", + ";": ",", + ",": ",", + "。": ".", + "!": "!", + "?": "?", + "\n": ".", "·": ",", - '、': ",", - '...': '…', - '$': '.', - '“': "'", - '”': "'", - '‘': "'", - '’': "'", - '(': "'", - ')': "'", - '(': "'", - ')': "'", - '《': "'", - '》': "'", - '【': "'", - '】': "'", - '[': "'", - ']': "'", - '—': "-", - '~': "-", - '~': "-", - '「': "'", - '」': "'", - + "、": ",", + "...": "…", + "$": ".", + "“": "'", + "”": "'", + "‘": "'", + "’": "'", + "(": "'", + ")": "'", + "(": "'", + ")": "'", + "《": "'", + "》": "'", + "【": "'", + "】": "'", + "[": "'", + "]": "'", + "—": "-", + "~": "-", + "~": "-", + "「": "'", + "」": "'", } tone_modifier = ToneSandhi() + def replace_punctuation(text): - text = text.replace("嗯", "恩").replace("呣","母") - pattern = re.compile('|'.join(re.escape(p) for p in rep_map.keys())) + text = text.replace("嗯", "恩").replace("呣", "母") + pattern = re.compile("|".join(re.escape(p) for p in rep_map.keys())) replaced_text = pattern.sub(lambda x: rep_map[x.group()], text) - replaced_text = re.sub(r'[^\u4e00-\u9fa5'+"".join(punctuation)+r']+', '', replaced_text) + replaced_text = re.sub( + r"[^\u4e00-\u9fa5" + "".join(punctuation) + r"]+", "", replaced_text + ) return replaced_text + def g2p(text): - pattern = r'(?<=[{0}])\s*'.format(''.join(punctuation)) - sentences = [i for i in re.split(pattern, text) if i.strip()!=''] + pattern = r"(?<=[{0}])\s*".format("".join(punctuation)) + sentences = [i for i in re.split(pattern, text) if i.strip() != ""] phones, tones, word2ph = _g2p(sentences) assert sum(word2ph) == len(phones) - assert len(word2ph) == len(text) #Sometimes it will crash,you can add a try-catch. - phones = ['_'] + phones + ["_"] + assert len(word2ph) == len(text) # Sometimes it will crash,you can add a try-catch. + phones = ["_"] + phones + ["_"] tones = [0] + tones + [0] word2ph = [1] + word2ph + [1] return phones, tones, word2ph @@ -76,10 +81,10 @@ def g2p(text): def _get_initials_finals(word): initials = [] finals = [] - orig_initials = lazy_pinyin( - word, neutral_tone_with_five=True, style=Style.INITIALS) + orig_initials = lazy_pinyin(word, neutral_tone_with_five=True, style=Style.INITIALS) orig_finals = lazy_pinyin( - word, neutral_tone_with_five=True, style=Style.FINALS_TONE3) + word, neutral_tone_with_five=True, style=Style.FINALS_TONE3 + ) for c, v in zip(orig_initials, orig_finals): initials.append(c) finals.append(v) @@ -93,17 +98,16 @@ def _g2p(segments): for seg in segments: pinyins = [] # Replace all English words in the sentence - seg = re.sub('[a-zA-Z]+', '', seg) + seg = re.sub("[a-zA-Z]+", "", seg) seg_cut = psg.lcut(seg) initials = [] finals = [] seg_cut = tone_modifier.pre_merge_for_modify(seg_cut) for word, pos in seg_cut: - if pos == 'eng': + if pos == "eng": continue sub_initials, sub_finals = _get_initials_finals(word) - sub_finals = tone_modifier.modified_tone(word, pos, - sub_finals) + sub_finals = tone_modifier.modified_tone(word, pos, sub_finals) initials.append(sub_initials) finals.append(sub_finals) @@ -112,52 +116,52 @@ def _g2p(segments): finals = sum(finals, []) # for c, v in zip(initials, finals): - raw_pinyin = c+v + raw_pinyin = c + v # NOTE: post process for pypinyin outputs # we discriminate i, ii and iii if c == v: assert c in punctuation phone = [c] - tone = '0' + tone = "0" word2ph.append(1) else: v_without_tone = v[:-1] tone = v[-1] - pinyin = c+v_without_tone - assert tone in '12345' + pinyin = c + v_without_tone + assert tone in "12345" if c: # 多音节 v_rep_map = { - "uei": 'ui', - 'iou': 'iu', - 'uen': 'un', + "uei": "ui", + "iou": "iu", + "uen": "un", } if v_without_tone in v_rep_map.keys(): - pinyin = c+v_rep_map[v_without_tone] + pinyin = c + v_rep_map[v_without_tone] else: # 单音节 pinyin_rep_map = { - 'ing': 'ying', - 'i': 'yi', - 'in': 'yin', - 'u': 'wu', + "ing": "ying", + "i": "yi", + "in": "yin", + "u": "wu", } if pinyin in pinyin_rep_map.keys(): pinyin = pinyin_rep_map[pinyin] else: single_rep_map = { - 'v': 'yu', - 'e': 'e', - 'i': 'y', - 'u': 'w', + "v": "yu", + "e": "e", + "i": "y", + "u": "w", } if pinyin[0] in single_rep_map.keys(): - pinyin = single_rep_map[pinyin[0]]+pinyin[1:] + pinyin = single_rep_map[pinyin[0]] + pinyin[1:] assert pinyin in pinyin_to_symbol_map.keys(), (pinyin, seg, raw_pinyin) - phone = pinyin_to_symbol_map[pinyin].split(' ') + phone = pinyin_to_symbol_map[pinyin].split(" ") word2ph.append(len(phone)) phones_list += phone @@ -165,20 +169,23 @@ def _g2p(segments): return phones_list, tones_list, word2ph - def text_normalize(text): - numbers = re.findall(r'\d+(?:\.?\d+)?', text) + numbers = re.findall(r"\d+(?:\.?\d+)?", text) for number in numbers: text = text.replace(number, cn2an.an2cn(number), 1) text = replace_punctuation(text) return text + def get_bert_feature(text, word2ph): - from text import chinese_bert + from text import chinese_bert + return chinese_bert.get_bert_feature(text, word2ph) -if __name__ == '__main__': + +if __name__ == "__main__": from text.chinese_bert import get_bert_feature + text = "啊!但是《原神》是由,米哈\游自主, [研发]的一款全.新开放世界.冒险游戏" text = text_normalize(text) print(text) diff --git a/text/chinese_bert.py b/text/chinese_bert.py index 978c6f846..a7607198f 100644 --- a/text/chinese_bert.py +++ b/text/chinese_bert.py @@ -4,20 +4,27 @@ tokenizer = AutoTokenizer.from_pretrained("./bert/chinese-roberta-wwm-ext-large") + def get_bert_feature(text, word2ph, device=None): - if sys.platform == "darwin" and torch.backends.mps.is_available() and device == "cpu": + if ( + sys.platform == "darwin" + and torch.backends.mps.is_available() + and device == "cpu" + ): device = "mps" if not device: device = "cuda" - model = AutoModelForMaskedLM.from_pretrained("./bert/chinese-roberta-wwm-ext-large").to(device) + model = AutoModelForMaskedLM.from_pretrained( + "./bert/chinese-roberta-wwm-ext-large" + ).to(device) with torch.no_grad(): - inputs = tokenizer(text, return_tensors='pt') + inputs = tokenizer(text, return_tensors="pt") for i in inputs: inputs[i] = inputs[i].to(device) res = model(**inputs, output_hidden_states=True) - res = torch.cat(res['hidden_states'][-3:-2], -1)[0].cpu() + res = torch.cat(res["hidden_states"][-3:-2], -1)[0].cpu() - assert len(word2ph) == len(text)+2 + assert len(word2ph) == len(text) + 2 word2phone = word2ph phone_level_feature = [] for i in range(len(word2phone)): @@ -26,14 +33,53 @@ def get_bert_feature(text, word2ph, device=None): phone_level_feature = torch.cat(phone_level_feature, dim=0) - return phone_level_feature.T -if __name__ == '__main__': + +if __name__ == "__main__": import torch word_level_feature = torch.rand(38, 1024) # 12个词,每个词1024维特征 - word2phone = [1, 2, 1, 2, 2, 1, 2, 2, 1, 2, 2, 1, 2, 2, 2, 2, 2, 1, 1, 2, 2, 1, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 1] + word2phone = [ + 1, + 2, + 1, + 2, + 2, + 1, + 2, + 2, + 1, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 1, + 1, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 2, + 1, + 2, + 2, + 2, + 2, + 1, + ] # 计算总帧数 total_frames = sum(word2phone) @@ -49,4 +95,3 @@ def get_bert_feature(text, word2ph, device=None): phone_level_feature = torch.cat(phone_level_feature, dim=0) print(phone_level_feature.shape) # torch.Size([36, 1024]) - diff --git a/text/cleaner.py b/text/cleaner.py index fd217d673..3ba373981 100644 --- a/text/cleaner.py +++ b/text/cleaner.py @@ -1,10 +1,7 @@ from text import chinese, japanese, cleaned_text_to_sequence -language_module_map = { - 'ZH': chinese, - 'JP': japanese -} +language_module_map = {"ZH": chinese, "JP": japanese} def clean_text(text, language): @@ -13,6 +10,7 @@ def clean_text(text, language): phones, tones, word2ph = language_module.g2p(norm_text) return norm_text, phones, tones, word2ph + def clean_text_bert(text, language): language_module = language_module_map[language] norm_text = language_module.text_normalize(text) @@ -20,9 +18,11 @@ def clean_text_bert(text, language): bert = language_module.get_bert_feature(norm_text, word2ph) return phones, tones, bert + def text_to_sequence(text, language): norm_text, phones, tones, word2ph = clean_text(text, language) return cleaned_text_to_sequence(phones, tones, language) -if __name__ == '__main__': + +if __name__ == "__main__": pass diff --git a/text/english.py b/text/english.py index 781d0a56c..c4a053513 100644 --- a/text/english.py +++ b/text/english.py @@ -7,35 +7,108 @@ from text import symbols current_file_path = os.path.dirname(__file__) -CMU_DICT_PATH = os.path.join(current_file_path, 'cmudict.rep') -CACHE_PATH = os.path.join(current_file_path, 'cmudict_cache.pickle') +CMU_DICT_PATH = os.path.join(current_file_path, "cmudict.rep") +CACHE_PATH = os.path.join(current_file_path, "cmudict_cache.pickle") _g2p = G2p() -arpa = {'AH0', 'S', 'AH1', 'EY2', 'AE2', 'EH0', 'OW2', 'UH0', 'NG', 'B', 'G', 'AY0', 'M', 'AA0', 'F', 'AO0', 'ER2', 'UH1', 'IY1', 'AH2', 'DH', 'IY0', 'EY1', 'IH0', 'K', 'N', 'W', 'IY2', 'T', 'AA1', 'ER1', 'EH2', 'OY0', 'UH2', 'UW1', 'Z', 'AW2', 'AW1', 'V', 'UW2', 'AA2', 'ER', 'AW0', 'UW0', 'R', 'OW1', 'EH1', 'ZH', 'AE0', 'IH2', 'IH', 'Y', 'JH', 'P', 'AY1', 'EY0', 'OY2', 'TH', 'HH', 'D', 'ER0', 'CH', 'AO1', 'AE1', 'AO2', 'OY1', 'AY2', 'IH1', 'OW0', 'L', 'SH'} +arpa = { + "AH0", + "S", + "AH1", + "EY2", + "AE2", + "EH0", + "OW2", + "UH0", + "NG", + "B", + "G", + "AY0", + "M", + "AA0", + "F", + "AO0", + "ER2", + "UH1", + "IY1", + "AH2", + "DH", + "IY0", + "EY1", + "IH0", + "K", + "N", + "W", + "IY2", + "T", + "AA1", + "ER1", + "EH2", + "OY0", + "UH2", + "UW1", + "Z", + "AW2", + "AW1", + "V", + "UW2", + "AA2", + "ER", + "AW0", + "UW0", + "R", + "OW1", + "EH1", + "ZH", + "AE0", + "IH2", + "IH", + "Y", + "JH", + "P", + "AY1", + "EY0", + "OY2", + "TH", + "HH", + "D", + "ER0", + "CH", + "AO1", + "AE1", + "AO2", + "OY1", + "AY2", + "IH1", + "OW0", + "L", + "SH", +} def post_replace_ph(ph): rep_map = { - ':': ',', - ';': ',', - ',': ',', - '。': '.', - '!': '!', - '?': '?', - '\n': '.', + ":": ",", + ";": ",", + ",": ",", + "。": ".", + "!": "!", + "?": "?", + "\n": ".", "·": ",", - '、': ",", - '...': '…', - 'v': "V" + "、": ",", + "...": "…", + "v": "V", } if ph in rep_map.keys(): ph = rep_map[ph] if ph in symbols: return ph if ph not in symbols: - ph = 'UNK' + ph = "UNK" return ph + def read_dict(): g2p_dict = {} start_line = 49 @@ -45,13 +118,13 @@ def read_dict(): while line: if line_index >= start_line: line = line.strip() - word_split = line.split(' ') + word_split = line.split(" ") word = word_split[0] - syllable_split = word_split[1].split(' - ') + syllable_split = word_split[1].split(" - ") g2p_dict[word] = [] for syllable in syllable_split: - phone_split = syllable.split(' ') + phone_split = syllable.split(" ") g2p_dict[word].append(phone_split) line_index = line_index + 1 @@ -61,13 +134,13 @@ def read_dict(): def cache_dict(g2p_dict, file_path): - with open(file_path, 'wb') as pickle_file: + with open(file_path, "wb") as pickle_file: pickle.dump(g2p_dict, pickle_file) def get_dict(): if os.path.exists(CACHE_PATH): - with open(CACHE_PATH, 'rb') as pickle_file: + with open(CACHE_PATH, "rb") as pickle_file: g2p_dict = pickle.load(pickle_file) else: g2p_dict = read_dict() @@ -75,15 +148,18 @@ def get_dict(): return g2p_dict + eng_dict = get_dict() + def refine_ph(phn): tone = 0 - if re.search(r'\d$', phn): + if re.search(r"\d$", phn): tone = int(phn[-1]) + 1 phn = phn[:-1] return phn.lower(), tone + def refine_syllables(syllables): tones = [] phonemes = [] @@ -100,8 +176,8 @@ def text_normalize(text): # todo: eng text normalize return text -def g2p(text): +def g2p(text): phones = [] tones = [] words = re.split(r"([,;.\-\?\!\s+])", text) @@ -126,6 +202,7 @@ def g2p(text): phones = [post_replace_ph(i) for i in phones] return phones, tones, word2ph + if __name__ == "__main__": # print(get_dict()) # print(eng_word_to_phoneme("hello")) @@ -135,4 +212,4 @@ def g2p(text): # for group in syllables: # for ph in group: # all_phones.add(ph) - # print(all_phones) \ No newline at end of file + # print(all_phones) diff --git a/text/japanese.py b/text/japanese.py index b25f89b4a..cbb82e16f 100644 --- a/text/japanese.py +++ b/text/japanese.py @@ -331,12 +331,12 @@ def kata2phoneme(text: str) -> str: x = _RULEMAP2.get(text[:2]) if x is not None: text = text[2:] - res += x.split(' ')[1:] + res += x.split(" ")[1:] continue x = _RULEMAP1.get(text[0]) if x is not None: text = text[1:] - res += x.split(' ')[1:] + res += x.split(" ")[1:] continue res.append(text[0]) text = text[1:] @@ -358,6 +358,7 @@ def hira2kata(text: str) -> str: _NO_YOMI_TOKENS = set(list("「」『』―()[][]")) _TAGGER = MeCab.Tagger() + def text2kata(text: str) -> str: parsed = _TAGGER.parse(text) res = [] @@ -472,6 +473,7 @@ def japanese_text_to_phonemes(text: str) -> str: res = kata2phoneme(res) return res + def is_japanese_character(char): # 定义日语文字系统的 Unicode 范围 japanese_ranges = [ @@ -493,27 +495,37 @@ def is_japanese_character(char): return False + rep_map = { - ':': ',', - ';': ',', - ',': ',', - '。': '.', - '!': '!', - '?': '?', - '\n': '.', + ":": ",", + ";": ",", + ",": ",", + "。": ".", + "!": "!", + "?": "?", + "\n": ".", "·": ",", - '、': ",", - '...': '…' + "、": ",", + "...": "…", } + + def replace_punctuation(text): - pattern = re.compile('|'.join(re.escape(p) for p in rep_map.keys())) + pattern = re.compile("|".join(re.escape(p) for p in rep_map.keys())) replaced_text = pattern.sub(lambda x: rep_map[x.group()], text) - replaced_text = re.sub(r'[^\u3040-\u309F\u30A0-\u30FF\u4E00-\u9FFF\u3400-\u4DBF'+"".join(punctuation)+r']+', '', replaced_text) + replaced_text = re.sub( + r"[^\u3040-\u309F\u30A0-\u30FF\u4E00-\u9FFF\u3400-\u4DBF" + + "".join(punctuation) + + r"]+", + "", + replaced_text, + ) return replaced_text + def text_normalize(text): res = unicodedata.normalize("NFKC", text) res = japanese_convert_numbers_to_words(res) @@ -521,6 +533,7 @@ def text_normalize(text): res = replace_punctuation(res) return res + def distribute_phone(n_phone, n_word): phones_per_word = [0] * n_word for task in range(n_phone): @@ -529,16 +542,19 @@ def distribute_phone(n_phone, n_word): phones_per_word[min_index] += 1 return phones_per_word + tokenizer = AutoTokenizer.from_pretrained("./bert/bert-base-japanese-v3") + + def g2p(norm_text): tokenized = tokenizer.tokenize(norm_text) phs = [] ph_groups = [] for t in tokenized: - if not t.startswith('#'): + if not t.startswith("#"): ph_groups.append([t]) else: - ph_groups[-1].append(t.replace("#", '')) + ph_groups[-1].append(t.replace("#", "")) word2ph = [] for group in ph_groups: phonemes = kata2phoneme(text2kata("".join(group))) @@ -552,12 +568,13 @@ def g2p(norm_text): word2ph += aaa phs += phonemes - phones = ['_'] + phs + ["_"] + phones = ["_"] + phs + ["_"] tones = [0 for i in phones] word2ph = [1] + word2ph + [1] return phones, tones, word2ph -if __name__ == '__main__': + +if __name__ == "__main__": tokenizer = AutoTokenizer.from_pretrained("./bert/bert-base-japanese-v3") text = "hello,こんにちは、世界!……" from text.japanese_bert import get_bert_feature @@ -568,6 +585,3 @@ def g2p(norm_text): bert = get_bert_feature(text, word2ph) print(phones, tones, word2ph, bert.shape) - - - diff --git a/text/japanese_bert.py b/text/japanese_bert.py index 82bd740ac..5cc104da4 100644 --- a/text/japanese_bert.py +++ b/text/japanese_bert.py @@ -4,19 +4,26 @@ tokenizer = AutoTokenizer.from_pretrained("./bert/bert-base-japanese-v3") + def get_bert_feature(text, word2ph, device=None): - if sys.platform == "darwin" and torch.backends.mps.is_available() and device == "cpu": + if ( + sys.platform == "darwin" + and torch.backends.mps.is_available() + and device == "cpu" + ): device = "mps" if not device: device = "cuda" - model = AutoModelForMaskedLM.from_pretrained("./bert/bert-base-japanese-v3").to(device) + model = AutoModelForMaskedLM.from_pretrained("./bert/bert-base-japanese-v3").to( + device + ) with torch.no_grad(): - inputs = tokenizer(text, return_tensors='pt') + inputs = tokenizer(text, return_tensors="pt") for i in inputs: inputs[i] = inputs[i].to(device) res = model(**inputs, output_hidden_states=True) - res = torch.cat(res['hidden_states'][-3:-2], -1)[0].cpu() - assert inputs['input_ids'].shape[-1] == len(word2ph) + res = torch.cat(res["hidden_states"][-3:-2], -1)[0].cpu() + assert inputs["input_ids"].shape[-1] == len(word2ph) word2phone = word2ph phone_level_feature = [] for i in range(len(word2phone)): diff --git a/text/symbols.py b/text/symbols.py index 9d1f8e1dc..161ae9f71 100644 --- a/text/symbols.py +++ b/text/symbols.py @@ -1,26 +1,166 @@ -punctuation = ['!', '?', '…', ",", ".", "'", '-'] +punctuation = ["!", "?", "…", ",", ".", "'", "-"] pu_symbols = punctuation + ["SP", "UNK"] -pad = '_' +pad = "_" # chinese -zh_symbols = ['E', 'En', 'a', 'ai', 'an', 'ang', 'ao', 'b', 'c', 'ch', 'd', 'e', 'ei', 'en', 'eng', 'er', 'f', 'g', 'h', - 'i', 'i0', 'ia', 'ian', 'iang', 'iao', 'ie', 'in', 'ing', 'iong', 'ir', 'iu', 'j', 'k', 'l', 'm', 'n', 'o', - 'ong', - 'ou', 'p', 'q', 'r', 's', 'sh', 't', 'u', 'ua', 'uai', 'uan', 'uang', 'ui', 'un', 'uo', 'v', 'van', 've', 'vn', - 'w', 'x', 'y', 'z', 'zh', - "AA", "EE", "OO"] +zh_symbols = [ + "E", + "En", + "a", + "ai", + "an", + "ang", + "ao", + "b", + "c", + "ch", + "d", + "e", + "ei", + "en", + "eng", + "er", + "f", + "g", + "h", + "i", + "i0", + "ia", + "ian", + "iang", + "iao", + "ie", + "in", + "ing", + "iong", + "ir", + "iu", + "j", + "k", + "l", + "m", + "n", + "o", + "ong", + "ou", + "p", + "q", + "r", + "s", + "sh", + "t", + "u", + "ua", + "uai", + "uan", + "uang", + "ui", + "un", + "uo", + "v", + "van", + "ve", + "vn", + "w", + "x", + "y", + "z", + "zh", + "AA", + "EE", + "OO", +] num_zh_tones = 6 # japanese -ja_symbols = ['N', 'a', 'a:', 'b', 'by', 'ch', 'd', 'dy', 'e', 'e:', 'f', 'g', 'gy', 'h', 'hy', 'i', 'i:', 'j', 'k', 'ky', - 'm', 'my', 'n', 'ny', 'o', 'o:', 'p', 'py', 'q', 'r', 'ry', 's', 'sh', 't', 'ts', 'ty', 'u', 'u:', - 'w', 'y', 'z', 'zy'] +ja_symbols = [ + "N", + "a", + "a:", + "b", + "by", + "ch", + "d", + "dy", + "e", + "e:", + "f", + "g", + "gy", + "h", + "hy", + "i", + "i:", + "j", + "k", + "ky", + "m", + "my", + "n", + "ny", + "o", + "o:", + "p", + "py", + "q", + "r", + "ry", + "s", + "sh", + "t", + "ts", + "ty", + "u", + "u:", + "w", + "y", + "z", + "zy", +] num_ja_tones = 1 # English -en_symbols = ['aa', 'ae', 'ah', 'ao', 'aw', 'ay', 'b', 'ch', 'd', 'dh', 'eh', 'er', 'ey', 'f', 'g', 'hh', 'ih', 'iy', - 'jh', 'k', 'l', 'm', 'n', 'ng', 'ow', 'oy', 'p', 'r', 's', - 'sh', 't', 'th', 'uh', 'uw', 'V', 'w', 'y', 'z', 'zh'] +en_symbols = [ + "aa", + "ae", + "ah", + "ao", + "aw", + "ay", + "b", + "ch", + "d", + "dh", + "eh", + "er", + "ey", + "f", + "g", + "hh", + "ih", + "iy", + "jh", + "k", + "l", + "m", + "n", + "ng", + "ow", + "oy", + "p", + "r", + "s", + "sh", + "t", + "th", + "uh", + "uw", + "V", + "w", + "y", + "z", + "zh", +] num_en_tones = 4 # combine all symbols @@ -32,21 +172,16 @@ num_tones = num_zh_tones + num_ja_tones + num_en_tones # language maps -language_id_map = { - 'ZH': 0, - "JP": 1, - "EN": 2 -} +language_id_map = {"ZH": 0, "JP": 1, "EN": 2} num_languages = len(language_id_map.keys()) language_tone_start_map = { - 'ZH': 0, + "ZH": 0, "JP": num_zh_tones, - "EN": num_zh_tones + num_ja_tones + "EN": num_zh_tones + num_ja_tones, } -if __name__ == '__main__': +if __name__ == "__main__": a = set(zh_symbols) b = set(en_symbols) - print(sorted(a&b)) - + print(sorted(a & b)) diff --git a/text/tone_sandhi.py b/text/tone_sandhi.py index 0f45b7a72..89e34fa5e 100644 --- a/text/tone_sandhi.py +++ b/text/tone_sandhi.py @@ -19,51 +19,442 @@ from pypinyin import Style -class ToneSandhi(): +class ToneSandhi: def __init__(self): self.must_neural_tone_words = { - '麻烦', '麻利', '鸳鸯', '高粱', '骨头', '骆驼', '马虎', '首饰', '馒头', '馄饨', '风筝', - '难为', '队伍', '阔气', '闺女', '门道', '锄头', '铺盖', '铃铛', '铁匠', '钥匙', '里脊', - '里头', '部分', '那么', '道士', '造化', '迷糊', '连累', '这么', '这个', '运气', '过去', - '软和', '转悠', '踏实', '跳蚤', '跟头', '趔趄', '财主', '豆腐', '讲究', '记性', '记号', - '认识', '规矩', '见识', '裁缝', '补丁', '衣裳', '衣服', '衙门', '街坊', '行李', '行当', - '蛤蟆', '蘑菇', '薄荷', '葫芦', '葡萄', '萝卜', '荸荠', '苗条', '苗头', '苍蝇', '芝麻', - '舒服', '舒坦', '舌头', '自在', '膏药', '脾气', '脑袋', '脊梁', '能耐', '胳膊', '胭脂', - '胡萝', '胡琴', '胡同', '聪明', '耽误', '耽搁', '耷拉', '耳朵', '老爷', '老实', '老婆', - '老头', '老太', '翻腾', '罗嗦', '罐头', '编辑', '结实', '红火', '累赘', '糨糊', '糊涂', - '精神', '粮食', '簸箕', '篱笆', '算计', '算盘', '答应', '笤帚', '笑语', '笑话', '窟窿', - '窝囊', '窗户', '稳当', '稀罕', '称呼', '秧歌', '秀气', '秀才', '福气', '祖宗', '砚台', - '码头', '石榴', '石头', '石匠', '知识', '眼睛', '眯缝', '眨巴', '眉毛', '相声', '盘算', - '白净', '痢疾', '痛快', '疟疾', '疙瘩', '疏忽', '畜生', '生意', '甘蔗', '琵琶', '琢磨', - '琉璃', '玻璃', '玫瑰', '玄乎', '狐狸', '状元', '特务', '牲口', '牙碜', '牌楼', '爽快', - '爱人', '热闹', '烧饼', '烟筒', '烂糊', '点心', '炊帚', '灯笼', '火候', '漂亮', '滑溜', - '溜达', '温和', '清楚', '消息', '浪头', '活泼', '比方', '正经', '欺负', '模糊', '槟榔', - '棺材', '棒槌', '棉花', '核桃', '栅栏', '柴火', '架势', '枕头', '枇杷', '机灵', '本事', - '木头', '木匠', '朋友', '月饼', '月亮', '暖和', '明白', '时候', '新鲜', '故事', '收拾', - '收成', '提防', '挖苦', '挑剔', '指甲', '指头', '拾掇', '拳头', '拨弄', '招牌', '招呼', - '抬举', '护士', '折腾', '扫帚', '打量', '打算', '打点', '打扮', '打听', '打发', '扎实', - '扁担', '戒指', '懒得', '意识', '意思', '情形', '悟性', '怪物', '思量', '怎么', '念头', - '念叨', '快活', '忙活', '志气', '心思', '得罪', '张罗', '弟兄', '开通', '应酬', '庄稼', - '干事', '帮手', '帐篷', '希罕', '师父', '师傅', '巴结', '巴掌', '差事', '工夫', '岁数', - '屁股', '尾巴', '少爷', '小气', '小伙', '将就', '对头', '对付', '寡妇', '家伙', '客气', - '实在', '官司', '学问', '学生', '字号', '嫁妆', '媳妇', '媒人', '婆家', '娘家', '委屈', - '姑娘', '姐夫', '妯娌', '妥当', '妖精', '奴才', '女婿', '头发', '太阳', '大爷', '大方', - '大意', '大夫', '多少', '多么', '外甥', '壮实', '地道', '地方', '在乎', '困难', '嘴巴', - '嘱咐', '嘟囔', '嘀咕', '喜欢', '喇嘛', '喇叭', '商量', '唾沫', '哑巴', '哈欠', '哆嗦', - '咳嗽', '和尚', '告诉', '告示', '含糊', '吓唬', '后头', '名字', '名堂', '合同', '吆喝', - '叫唤', '口袋', '厚道', '厉害', '千斤', '包袱', '包涵', '匀称', '勤快', '动静', '动弹', - '功夫', '力气', '前头', '刺猬', '刺激', '别扭', '利落', '利索', '利害', '分析', '出息', - '凑合', '凉快', '冷战', '冤枉', '冒失', '养活', '关系', '先生', '兄弟', '便宜', '使唤', - '佩服', '作坊', '体面', '位置', '似的', '伙计', '休息', '什么', '人家', '亲戚', '亲家', - '交情', '云彩', '事情', '买卖', '主意', '丫头', '丧气', '两口', '东西', '东家', '世故', - '不由', '不在', '下水', '下巴', '上头', '上司', '丈夫', '丈人', '一辈', '那个', '菩萨', - '父亲', '母亲', '咕噜', '邋遢', '费用', '冤家', '甜头', '介绍', '荒唐', '大人', '泥鳅', - '幸福', '熟悉', '计划', '扑腾', '蜡烛', '姥爷', '照顾', '喉咙', '吉他', '弄堂', '蚂蚱', - '凤凰', '拖沓', '寒碜', '糟蹋', '倒腾', '报复', '逻辑', '盘缠', '喽啰', '牢骚', '咖喱', - '扫把', '惦记' + "麻烦", + "麻利", + "鸳鸯", + "高粱", + "骨头", + "骆驼", + "马虎", + "首饰", + "馒头", + "馄饨", + "风筝", + "难为", + "队伍", + "阔气", + "闺女", + "门道", + "锄头", + "铺盖", + "铃铛", + "铁匠", + "钥匙", + "里脊", + "里头", + "部分", + "那么", + "道士", + "造化", + "迷糊", + "连累", + "这么", + "这个", + "运气", + "过去", + "软和", + "转悠", + "踏实", + "跳蚤", + "跟头", + "趔趄", + "财主", + "豆腐", + "讲究", + "记性", + "记号", + "认识", + "规矩", + "见识", + "裁缝", + "补丁", + "衣裳", + "衣服", + "衙门", + "街坊", + "行李", + "行当", + "蛤蟆", + "蘑菇", + "薄荷", + "葫芦", + "葡萄", + "萝卜", + "荸荠", + "苗条", + "苗头", + "苍蝇", + "芝麻", + "舒服", + "舒坦", + "舌头", + "自在", + "膏药", + "脾气", + "脑袋", + "脊梁", + "能耐", + "胳膊", + "胭脂", + "胡萝", + "胡琴", + "胡同", + "聪明", + "耽误", + "耽搁", + "耷拉", + "耳朵", + "老爷", + "老实", + "老婆", + "老头", + "老太", + "翻腾", + "罗嗦", + "罐头", + "编辑", + "结实", + "红火", + "累赘", + "糨糊", + "糊涂", + "精神", + "粮食", + "簸箕", + "篱笆", + "算计", + "算盘", + "答应", + "笤帚", + "笑语", + "笑话", + "窟窿", + "窝囊", + "窗户", + "稳当", + "稀罕", + "称呼", + "秧歌", + "秀气", + "秀才", + "福气", + "祖宗", + "砚台", + "码头", + "石榴", + "石头", + "石匠", + "知识", + "眼睛", + "眯缝", + "眨巴", + "眉毛", + "相声", + "盘算", + "白净", + "痢疾", + "痛快", + "疟疾", + "疙瘩", + "疏忽", + "畜生", + "生意", + "甘蔗", + "琵琶", + "琢磨", + "琉璃", + "玻璃", + "玫瑰", + "玄乎", + "狐狸", + "状元", + "特务", + "牲口", + "牙碜", + "牌楼", + "爽快", + "爱人", + "热闹", + "烧饼", + "烟筒", + "烂糊", + "点心", + "炊帚", + "灯笼", + "火候", + "漂亮", + "滑溜", + "溜达", + "温和", + "清楚", + "消息", + "浪头", + "活泼", + "比方", + "正经", + "欺负", + "模糊", + "槟榔", + "棺材", + "棒槌", + "棉花", + "核桃", + "栅栏", + "柴火", + "架势", + "枕头", + "枇杷", + "机灵", + "本事", + "木头", + "木匠", + "朋友", + "月饼", + "月亮", + "暖和", + "明白", + "时候", + "新鲜", + "故事", + "收拾", + "收成", + "提防", + "挖苦", + "挑剔", + "指甲", + "指头", + "拾掇", + "拳头", + "拨弄", + "招牌", + "招呼", + "抬举", + "护士", + "折腾", + "扫帚", + "打量", + "打算", + "打点", + "打扮", + "打听", + "打发", + "扎实", + "扁担", + "戒指", + "懒得", + "意识", + "意思", + "情形", + "悟性", + "怪物", + "思量", + "怎么", + "念头", + "念叨", + "快活", + "忙活", + "志气", + "心思", + "得罪", + "张罗", + "弟兄", + "开通", + "应酬", + "庄稼", + "干事", + "帮手", + "帐篷", + "希罕", + "师父", + "师傅", + "巴结", + "巴掌", + "差事", + "工夫", + "岁数", + "屁股", + "尾巴", + "少爷", + "小气", + "小伙", + "将就", + "对头", + "对付", + "寡妇", + "家伙", + "客气", + "实在", + "官司", + "学问", + "学生", + "字号", + "嫁妆", + "媳妇", + "媒人", + "婆家", + "娘家", + "委屈", + "姑娘", + "姐夫", + "妯娌", + "妥当", + "妖精", + "奴才", + "女婿", + "头发", + "太阳", + "大爷", + "大方", + "大意", + "大夫", + "多少", + "多么", + "外甥", + "壮实", + "地道", + "地方", + "在乎", + "困难", + "嘴巴", + "嘱咐", + "嘟囔", + "嘀咕", + "喜欢", + "喇嘛", + "喇叭", + "商量", + "唾沫", + "哑巴", + "哈欠", + "哆嗦", + "咳嗽", + "和尚", + "告诉", + "告示", + "含糊", + "吓唬", + "后头", + "名字", + "名堂", + "合同", + "吆喝", + "叫唤", + "口袋", + "厚道", + "厉害", + "千斤", + "包袱", + "包涵", + "匀称", + "勤快", + "动静", + "动弹", + "功夫", + "力气", + "前头", + "刺猬", + "刺激", + "别扭", + "利落", + "利索", + "利害", + "分析", + "出息", + "凑合", + "凉快", + "冷战", + "冤枉", + "冒失", + "养活", + "关系", + "先生", + "兄弟", + "便宜", + "使唤", + "佩服", + "作坊", + "体面", + "位置", + "似的", + "伙计", + "休息", + "什么", + "人家", + "亲戚", + "亲家", + "交情", + "云彩", + "事情", + "买卖", + "主意", + "丫头", + "丧气", + "两口", + "东西", + "东家", + "世故", + "不由", + "不在", + "下水", + "下巴", + "上头", + "上司", + "丈夫", + "丈人", + "一辈", + "那个", + "菩萨", + "父亲", + "母亲", + "咕噜", + "邋遢", + "费用", + "冤家", + "甜头", + "介绍", + "荒唐", + "大人", + "泥鳅", + "幸福", + "熟悉", + "计划", + "扑腾", + "蜡烛", + "姥爷", + "照顾", + "喉咙", + "吉他", + "弄堂", + "蚂蚱", + "凤凰", + "拖沓", + "寒碜", + "糟蹋", + "倒腾", + "报复", + "逻辑", + "盘缠", + "喽啰", + "牢骚", + "咖喱", + "扫把", + "惦记", } self.must_not_neural_tone_words = { - "男子", "女子", "分子", "原子", "量子", "莲子", "石子", "瓜子", "电子", "人人", "虎虎" + "男子", + "女子", + "分子", + "原子", + "量子", + "莲子", + "石子", + "瓜子", + "电子", + "人人", + "虎虎", } self.punc = ":,;。?!“”‘’':,;.?!" @@ -72,14 +463,15 @@ def __init__(self): # word: "家里" # pos: "s" # finals: ['ia1', 'i3'] - def _neural_sandhi(self, word: str, pos: str, - finals: List[str]) -> List[str]: - + def _neural_sandhi(self, word: str, pos: str, finals: List[str]) -> List[str]: # reduplication words for n. and v. e.g. 奶奶, 试试, 旺旺 for j, item in enumerate(word): - if j - 1 >= 0 and item == word[j - 1] and pos[0] in { - "n", "v", "a" - } and word not in self.must_not_neural_tone_words: + if ( + j - 1 >= 0 + and item == word[j - 1] + and pos[0] in {"n", "v", "a"} + and word not in self.must_not_neural_tone_words + ): finals[j] = finals[j][:-1] + "5" ge_idx = word.find("个") if len(word) >= 1 and word[-1] in "吧呢啊呐噻嘛吖嗨呐哦哒额滴哩哟喽啰耶喔诶": @@ -89,9 +481,12 @@ def _neural_sandhi(self, word: str, pos: str, # e.g. 走了, 看着, 去过 # elif len(word) == 1 and word in "了着过" and pos in {"ul", "uz", "ug"}: # finals[-1] = finals[-1][:-1] + "5" - elif len(word) > 1 and word[-1] in "们子" and pos in { - "r", "n" - } and word not in self.must_not_neural_tone_words: + elif ( + len(word) > 1 + and word[-1] in "们子" + and pos in {"r", "n"} + and word not in self.must_not_neural_tone_words + ): finals[-1] = finals[-1][:-1] + "5" # e.g. 桌上, 地下, 家里 elif len(word) > 1 and word[-1] in "上下里" and pos in {"s", "l", "f"}: @@ -100,21 +495,26 @@ def _neural_sandhi(self, word: str, pos: str, elif len(word) > 1 and word[-1] in "来去" and word[-2] in "上下进出回过起开": finals[-1] = finals[-1][:-1] + "5" # 个做量词 - elif (ge_idx >= 1 and - (word[ge_idx - 1].isnumeric() or - word[ge_idx - 1] in "几有两半多各整每做是")) or word == '个': + elif ( + ge_idx >= 1 + and (word[ge_idx - 1].isnumeric() or word[ge_idx - 1] in "几有两半多各整每做是") + ) or word == "个": finals[ge_idx] = finals[ge_idx][:-1] + "5" else: - if word in self.must_neural_tone_words or word[ - -2:] in self.must_neural_tone_words: + if ( + word in self.must_neural_tone_words + or word[-2:] in self.must_neural_tone_words + ): finals[-1] = finals[-1][:-1] + "5" word_list = self._split_word(word) - finals_list = [finals[:len(word_list[0])], finals[len(word_list[0]):]] + finals_list = [finals[: len(word_list[0])], finals[len(word_list[0]) :]] for i, word in enumerate(word_list): # conventional neural in Chinese - if word in self.must_neural_tone_words or word[ - -2:] in self.must_neural_tone_words: + if ( + word in self.must_neural_tone_words + or word[-2:] in self.must_neural_tone_words + ): finals_list[i][-1] = finals_list[i][-1][:-1] + "5" finals = sum(finals_list, []) return finals @@ -126,15 +526,15 @@ def _bu_sandhi(self, word: str, finals: List[str]) -> List[str]: else: for i, char in enumerate(word): # "不" before tone4 should be bu2, e.g. 不怕 - if char == "不" and i + 1 < len(word) and finals[i + - 1][-1] == "4": + if char == "不" and i + 1 < len(word) and finals[i + 1][-1] == "4": finals[i] = finals[i][:-1] + "2" return finals def _yi_sandhi(self, word: str, finals: List[str]) -> List[str]: # "一" in number sequences, e.g. 一零零, 二一零 if word.find("一") != -1 and all( - [item.isnumeric() for item in word if item != "一"]): + [item.isnumeric() for item in word if item != "一"] + ): return finals # "一" between reduplication words shold be yi5, e.g. 看一看 elif len(word) == 3 and word[1] == "一" and word[0] == word[-1]: @@ -161,10 +561,10 @@ def _split_word(self, word: str) -> List[str]: first_subword = word_list[0] first_begin_idx = word.find(first_subword) if first_begin_idx == 0: - second_subword = word[len(first_subword):] + second_subword = word[len(first_subword) :] new_word_list = [first_subword, second_subword] else: - second_subword = word[:-len(first_subword)] + second_subword = word[: -len(first_subword)] new_word_list = [second_subword, first_subword] return new_word_list @@ -182,18 +582,19 @@ def _three_sandhi(self, word: str, finals: List[str]) -> List[str]: elif len(word_list[0]) == 1: finals[1] = finals[1][:-1] + "2" else: - finals_list = [ - finals[:len(word_list[0])], finals[len(word_list[0]):] - ] + finals_list = [finals[: len(word_list[0])], finals[len(word_list[0]) :]] if len(finals_list) == 2: for i, sub in enumerate(finals_list): # e.g. 所有/人 if self._all_tone_three(sub) and len(sub) == 2: finals_list[i][0] = finals_list[i][0][:-1] + "2" # e.g. 好/喜欢 - elif i == 1 and not self._all_tone_three(sub) and finals_list[i][0][-1] == "3" and \ - finals_list[0][-1][-1] == "3": - + elif ( + i == 1 + and not self._all_tone_three(sub) + and finals_list[i][0][-1] == "3" + and finals_list[0][-1][-1] == "3" + ): finals_list[0][-1] = finals_list[0][-1][:-1] + "2" finals = sum(finals_list, []) # split idiom into two words who's length is 2 @@ -222,7 +623,7 @@ def _merge_bu(self, seg: List[Tuple[str, str]]) -> List[Tuple[str, str]]: new_seg.append((word, pos)) last_word = word[:] if last_word == "不": - new_seg.append((last_word, 'd')) + new_seg.append((last_word, "d")) last_word = "" return new_seg @@ -236,12 +637,21 @@ def _merge_yi(self, seg: List[Tuple[str, str]]) -> List[Tuple[str, str]]: new_seg = [] # function 1 for i, (word, pos) in enumerate(seg): - if i - 1 >= 0 and word == "一" and i + 1 < len(seg) and seg[i - 1][ - 0] == seg[i + 1][0] and seg[i - 1][1] == "v": + if ( + i - 1 >= 0 + and word == "一" + and i + 1 < len(seg) + and seg[i - 1][0] == seg[i + 1][0] + and seg[i - 1][1] == "v" + ): new_seg[i - 1][0] = new_seg[i - 1][0] + "一" + new_seg[i - 1][0] else: - if i - 2 >= 0 and seg[i - 1][0] == "一" and seg[i - 2][ - 0] == word and pos == "v": + if ( + i - 2 >= 0 + and seg[i - 1][0] == "一" + and seg[i - 2][0] == word + and pos == "v" + ): continue else: new_seg.append([word, pos]) @@ -257,22 +667,27 @@ def _merge_yi(self, seg: List[Tuple[str, str]]) -> List[Tuple[str, str]]: # the first and the second words are all_tone_three def _merge_continuous_three_tones( - self, seg: List[Tuple[str, str]]) -> List[Tuple[str, str]]: + self, seg: List[Tuple[str, str]] + ) -> List[Tuple[str, str]]: new_seg = [] sub_finals_list = [ - lazy_pinyin( - word, neutral_tone_with_five=True, style=Style.FINALS_TONE3) + lazy_pinyin(word, neutral_tone_with_five=True, style=Style.FINALS_TONE3) for (word, pos) in seg ] assert len(sub_finals_list) == len(seg) merge_last = [False] * len(seg) for i, (word, pos) in enumerate(seg): - if i - 1 >= 0 and self._all_tone_three( - sub_finals_list[i - 1]) and self._all_tone_three( - sub_finals_list[i]) and not merge_last[i - 1]: + if ( + i - 1 >= 0 + and self._all_tone_three(sub_finals_list[i - 1]) + and self._all_tone_three(sub_finals_list[i]) + and not merge_last[i - 1] + ): # if the last word is reduplication, not merge, because reduplication need to be _neural_sandhi - if not self._is_reduplication(seg[i - 1][0]) and len( - seg[i - 1][0]) + len(seg[i][0]) <= 3: + if ( + not self._is_reduplication(seg[i - 1][0]) + and len(seg[i - 1][0]) + len(seg[i][0]) <= 3 + ): new_seg[-1][0] = new_seg[-1][0] + seg[i][0] merge_last[i] = True else: @@ -287,21 +702,27 @@ def _is_reduplication(self, word: str) -> bool: # the last char of first word and the first char of second word is tone_three def _merge_continuous_three_tones_2( - self, seg: List[Tuple[str, str]]) -> List[Tuple[str, str]]: + self, seg: List[Tuple[str, str]] + ) -> List[Tuple[str, str]]: new_seg = [] sub_finals_list = [ - lazy_pinyin( - word, neutral_tone_with_five=True, style=Style.FINALS_TONE3) + lazy_pinyin(word, neutral_tone_with_five=True, style=Style.FINALS_TONE3) for (word, pos) in seg ] assert len(sub_finals_list) == len(seg) merge_last = [False] * len(seg) for i, (word, pos) in enumerate(seg): - if i - 1 >= 0 and sub_finals_list[i - 1][-1][-1] == "3" and sub_finals_list[i][0][-1] == "3" and not \ - merge_last[i - 1]: + if ( + i - 1 >= 0 + and sub_finals_list[i - 1][-1][-1] == "3" + and sub_finals_list[i][0][-1] == "3" + and not merge_last[i - 1] + ): # if the last word is reduplication, not merge, because reduplication need to be _neural_sandhi - if not self._is_reduplication(seg[i - 1][0]) and len( - seg[i - 1][0]) + len(seg[i][0]) <= 3: + if ( + not self._is_reduplication(seg[i - 1][0]) + and len(seg[i - 1][0]) + len(seg[i][0]) <= 3 + ): new_seg[-1][0] = new_seg[-1][0] + seg[i][0] merge_last[i] = True else: @@ -313,14 +734,13 @@ def _merge_continuous_three_tones_2( def _merge_er(self, seg: List[Tuple[str, str]]) -> List[Tuple[str, str]]: new_seg = [] for i, (word, pos) in enumerate(seg): - if i - 1 >= 0 and word == "儿" and seg[i-1][0] != "#": + if i - 1 >= 0 and word == "儿" and seg[i - 1][0] != "#": new_seg[-1][0] = new_seg[-1][0] + seg[i][0] else: new_seg.append([word, pos]) return new_seg - def _merge_reduplication( - self, seg: List[Tuple[str, str]]) -> List[Tuple[str, str]]: + def _merge_reduplication(self, seg: List[Tuple[str, str]]) -> List[Tuple[str, str]]: new_seg = [] for i, (word, pos) in enumerate(seg): if new_seg and word == new_seg[-1][0]: @@ -329,8 +749,7 @@ def _merge_reduplication( new_seg.append([word, pos]) return new_seg - def pre_merge_for_modify( - self, seg: List[Tuple[str, str]]) -> List[Tuple[str, str]]: + def pre_merge_for_modify(self, seg: List[Tuple[str, str]]) -> List[Tuple[str, str]]: seg = self._merge_bu(seg) try: seg = self._merge_yi(seg) @@ -342,8 +761,7 @@ def pre_merge_for_modify( seg = self._merge_er(seg) return seg - def modified_tone(self, word: str, pos: str, - finals: List[str]) -> List[str]: + def modified_tone(self, word: str, pos: str, finals: List[str]) -> List[str]: finals = self._bu_sandhi(word, finals) finals = self._yi_sandhi(word, finals) finals = self._neural_sandhi(word, pos, finals) diff --git a/train_ms.py b/train_ms.py index 7e653df6f..a8d1eb829 100644 --- a/train_ms.py +++ b/train_ms.py @@ -14,37 +14,38 @@ from torch.cuda.amp import autocast, GradScaler from tqdm import tqdm import logging -logging.getLogger('numba').setLevel(logging.WARNING) + +logging.getLogger("numba").setLevel(logging.WARNING) import commons import utils from data_utils import ( TextAudioSpeakerLoader, TextAudioSpeakerCollate, - DistributedBucketSampler + DistributedBucketSampler, ) from models import ( SynthesizerTrn, MultiPeriodDiscriminator, DurationDiscriminator, ) -from losses import ( - generator_loss, - discriminator_loss, - feature_loss, - kl_loss -) +from losses import generator_loss, discriminator_loss, feature_loss, kl_loss from mel_processing import mel_spectrogram_torch, spec_to_mel_torch from text.symbols import symbols torch.backends.cudnn.benchmark = True torch.backends.cuda.sdp_kernel("flash") torch.backends.cuda.enable_flash_sdp(True) -torch.backends.cuda.enable_mem_efficient_sdp(True) # Not avaliable if torch version is lower than 2.0 +torch.backends.cuda.enable_mem_efficient_sdp( + True +) # Not avaliable if torch version is lower than 2.0 torch.backends.cuda.enable_math_sdp(True) global_step = 0 + def run(): - dist.init_process_group(backend="nccl", init_method="env://") # Use torchrun instead of mp.spawn + dist.init_process_group( + backend="nccl", init_method="env://" + ) # Use torchrun instead of mp.spawn rank = dist.get_rank() n_gpus = dist.get_world_size() hps = utils.get_hparams() @@ -64,17 +65,34 @@ def run(): [32, 300, 400, 500, 600, 700, 800, 900, 1000], num_replicas=n_gpus, rank=rank, - shuffle=True) + shuffle=True, + ) collate_fn = TextAudioSpeakerCollate() - train_loader = DataLoader(train_dataset, num_workers=16, shuffle=False, pin_memory=True, - collate_fn=collate_fn, batch_sampler=train_sampler, - persistent_workers=True,prefetch_factor=4) #128G Memory suitable loader. + train_loader = DataLoader( + train_dataset, + num_workers=16, + shuffle=False, + pin_memory=True, + collate_fn=collate_fn, + batch_sampler=train_sampler, + persistent_workers=True, + prefetch_factor=4, + ) # 128G Memory suitable loader. if rank == 0: eval_dataset = TextAudioSpeakerLoader(hps.data.validation_files, hps.data) - eval_loader = DataLoader(eval_dataset, num_workers=0, shuffle=False, - batch_size=1, pin_memory=True, - drop_last=False, collate_fn=collate_fn) - if "use_noise_scaled_mas" in hps.model.keys() and hps.model.use_noise_scaled_mas == True: + eval_loader = DataLoader( + eval_dataset, + num_workers=0, + shuffle=False, + batch_size=1, + pin_memory=True, + drop_last=False, + collate_fn=collate_fn, + ) + if ( + "use_noise_scaled_mas" in hps.model.keys() + and hps.model.use_noise_scaled_mas == True + ): print("Using noise scaled MAS for VITS2") use_noise_scaled_mas = True mas_noise_scale_initial = 0.01 @@ -84,19 +102,27 @@ def run(): use_noise_scaled_mas = False mas_noise_scale_initial = 0.0 noise_scale_delta = 0.0 - if "use_duration_discriminator" in hps.model.keys() and hps.model.use_duration_discriminator == True: + if ( + "use_duration_discriminator" in hps.model.keys() + and hps.model.use_duration_discriminator == True + ): print("Using duration discriminator for VITS2") use_duration_discriminator = True net_dur_disc = DurationDiscriminator( - hps.model.hidden_channels, - hps.model.hidden_channels, - 3, - 0.1, - gin_channels=hps.model.gin_channels if hps.data.n_speakers != 0 else 0, - ).cuda(rank) - if "use_spk_conditioned_encoder" in hps.model.keys() and hps.model.use_spk_conditioned_encoder == True: + hps.model.hidden_channels, + hps.model.hidden_channels, + 3, + 0.1, + gin_channels=hps.model.gin_channels if hps.data.n_speakers != 0 else 0, + ).cuda(rank) + if ( + "use_spk_conditioned_encoder" in hps.model.keys() + and hps.model.use_spk_conditioned_encoder == True + ): if hps.data.n_speakers == 0: - raise ValueError("n_speakers must be > 0 when using spk conditioned encoder to train multi-speaker model") + raise ValueError( + "n_speakers must be > 0 when using spk conditioned encoder to train multi-speaker model" + ) use_spk_conditioned_encoder = True else: print("Using normal encoder for VITS1") @@ -107,27 +133,31 @@ def run(): hps.data.filter_length // 2 + 1, hps.train.segment_size // hps.data.hop_length, n_speakers=hps.data.n_speakers, - mas_noise_scale_initial = mas_noise_scale_initial, - noise_scale_delta = noise_scale_delta, - **hps.model).cuda(rank) + mas_noise_scale_initial=mas_noise_scale_initial, + noise_scale_delta=noise_scale_delta, + **hps.model, + ).cuda(rank) net_d = MultiPeriodDiscriminator(hps.model.use_spectral_norm).cuda(rank) optim_g = torch.optim.AdamW( filter(lambda p: p.requires_grad, net_g.parameters()), hps.train.learning_rate, betas=hps.train.betas, - eps=hps.train.eps) + eps=hps.train.eps, + ) optim_d = torch.optim.AdamW( net_d.parameters(), hps.train.learning_rate, betas=hps.train.betas, - eps=hps.train.eps) + eps=hps.train.eps, + ) if net_dur_disc is not None: optim_dur_disc = torch.optim.AdamW( - net_dur_disc.parameters(), - hps.train.learning_rate, - betas=hps.train.betas, - eps=hps.train.eps) + net_dur_disc.parameters(), + hps.train.learning_rate, + betas=hps.train.betas, + eps=hps.train.eps, + ) else: optim_dur_disc = None net_g = DDP(net_g, device_ids=[rank], find_unused_parameters=True) @@ -136,40 +166,82 @@ def run(): net_dur_disc = DDP(net_dur_disc, device_ids=[rank], find_unused_parameters=True) try: if net_dur_disc is not None: - _, _, _, epoch_str = utils.load_checkpoint(utils.latest_checkpoint_path(hps.model_dir, "DUR_*.pth"), net_dur_disc, optim_dur_disc, skip_optimizer=True) - _, optim_g, _, epoch_str = utils.load_checkpoint(utils.latest_checkpoint_path(hps.model_dir, "G_*.pth"), net_g, - optim_g, skip_optimizer=True) - _, optim_d, _, epoch_str = utils.load_checkpoint(utils.latest_checkpoint_path(hps.model_dir, "D_*.pth"), net_d, - optim_d, skip_optimizer=True) - + _, _, _, epoch_str = utils.load_checkpoint( + utils.latest_checkpoint_path(hps.model_dir, "DUR_*.pth"), + net_dur_disc, + optim_dur_disc, + skip_optimizer=True, + ) + _, optim_g, _, epoch_str = utils.load_checkpoint( + utils.latest_checkpoint_path(hps.model_dir, "G_*.pth"), + net_g, + optim_g, + skip_optimizer=True, + ) + _, optim_d, _, epoch_str = utils.load_checkpoint( + utils.latest_checkpoint_path(hps.model_dir, "D_*.pth"), + net_d, + optim_d, + skip_optimizer=True, + ) + epoch_str = max(epoch_str, 1) global_step = (epoch_str - 1) * len(train_loader) except Exception as e: - print(e) - epoch_str = 1 - global_step = 0 - + print(e) + epoch_str = 1 + global_step = 0 - scheduler_g = torch.optim.lr_scheduler.ExponentialLR(optim_g, gamma=hps.train.lr_decay, last_epoch=epoch_str - 2) - scheduler_d = torch.optim.lr_scheduler.ExponentialLR(optim_d, gamma=hps.train.lr_decay, last_epoch=epoch_str - 2) + scheduler_g = torch.optim.lr_scheduler.ExponentialLR( + optim_g, gamma=hps.train.lr_decay, last_epoch=epoch_str - 2 + ) + scheduler_d = torch.optim.lr_scheduler.ExponentialLR( + optim_d, gamma=hps.train.lr_decay, last_epoch=epoch_str - 2 + ) if net_dur_disc is not None: - scheduler_dur_disc = torch.optim.lr_scheduler.ExponentialLR(optim_dur_disc, gamma=hps.train.lr_decay, last_epoch=epoch_str-2) + scheduler_dur_disc = torch.optim.lr_scheduler.ExponentialLR( + optim_dur_disc, gamma=hps.train.lr_decay, last_epoch=epoch_str - 2 + ) else: scheduler_dur_disc = None scaler = GradScaler(enabled=hps.train.fp16_run) for epoch in range(epoch_str, hps.train.epochs + 1): if rank == 0: - train_and_evaluate(rank, epoch, hps, [net_g, net_d, net_dur_disc], [optim_g, optim_d, optim_dur_disc], [scheduler_g, scheduler_d, scheduler_dur_disc], scaler, [train_loader, eval_loader], logger, [writer, writer_eval]) + train_and_evaluate( + rank, + epoch, + hps, + [net_g, net_d, net_dur_disc], + [optim_g, optim_d, optim_dur_disc], + [scheduler_g, scheduler_d, scheduler_dur_disc], + scaler, + [train_loader, eval_loader], + logger, + [writer, writer_eval], + ) else: - train_and_evaluate(rank, epoch, hps, [net_g, net_d, net_dur_disc], [optim_g, optim_d, optim_dur_disc], [scheduler_g, scheduler_d, scheduler_dur_disc], scaler, [train_loader, None], None, None) + train_and_evaluate( + rank, + epoch, + hps, + [net_g, net_d, net_dur_disc], + [optim_g, optim_d, optim_dur_disc], + [scheduler_g, scheduler_d, scheduler_dur_disc], + scaler, + [train_loader, None], + None, + None, + ) scheduler_g.step() scheduler_d.step() if net_dur_disc is not None: scheduler_dur_disc.step() -def train_and_evaluate(rank, epoch, hps, nets, optims, schedulers, scaler, loaders, logger, writers): +def train_and_evaluate( + rank, epoch, hps, nets, optims, schedulers, scaler, loaders, logger, writers +): net_g, net_d, net_dur_disc = nets optim_g, optim_d, optim_dur_disc = optims scheduler_g, scheduler_d, scheduler_dur_disc = schedulers @@ -184,13 +256,34 @@ def train_and_evaluate(rank, epoch, hps, nets, optims, schedulers, scaler, loade net_d.train() if net_dur_disc is not None: net_dur_disc.train() - for batch_idx, (x, x_lengths, spec, spec_lengths, y, y_lengths, speakers, tone, language, bert, ja_bert) in tqdm(enumerate(train_loader)): + for batch_idx, ( + x, + x_lengths, + spec, + spec_lengths, + y, + y_lengths, + speakers, + tone, + language, + bert, + ja_bert, + ) in tqdm(enumerate(train_loader)): if net_g.module.use_noise_scaled_mas: - current_mas_noise_scale = net_g.module.mas_noise_scale_initial - net_g.module.noise_scale_delta * global_step + current_mas_noise_scale = ( + net_g.module.mas_noise_scale_initial + - net_g.module.noise_scale_delta * global_step + ) net_g.module.current_mas_noise_scale = max(current_mas_noise_scale, 0.0) - x, x_lengths = x.cuda(rank, non_blocking=True), x_lengths.cuda(rank, non_blocking=True) - spec, spec_lengths = spec.cuda(rank, non_blocking=True), spec_lengths.cuda(rank, non_blocking=True) - y, y_lengths = y.cuda(rank, non_blocking=True), y_lengths.cuda(rank, non_blocking=True) + x, x_lengths = x.cuda(rank, non_blocking=True), x_lengths.cuda( + rank, non_blocking=True + ) + spec, spec_lengths = spec.cuda(rank, non_blocking=True), spec_lengths.cuda( + rank, non_blocking=True + ) + y, y_lengths = y.cuda(rank, non_blocking=True), y_lengths.cuda( + rank, non_blocking=True + ) speakers = speakers.cuda(rank, non_blocking=True) tone = tone.cuda(rank, non_blocking=True) language = language.cuda(rank, non_blocking=True) @@ -198,16 +291,37 @@ def train_and_evaluate(rank, epoch, hps, nets, optims, schedulers, scaler, loade ja_bert = ja_bert.cuda(rank, non_blocking=True) with autocast(enabled=hps.train.fp16_run): - y_hat, l_length, attn, ids_slice, x_mask, z_mask, \ - (z, z_p, m_p, logs_p, m_q, logs_q), (hidden_x, logw, logw_) = net_g(x, x_lengths, spec, spec_lengths, speakers, tone, language, bert, ja_bert) + ( + y_hat, + l_length, + attn, + ids_slice, + x_mask, + z_mask, + (z, z_p, m_p, logs_p, m_q, logs_q), + (hidden_x, logw, logw_), + ) = net_g( + x, + x_lengths, + spec, + spec_lengths, + speakers, + tone, + language, + bert, + ja_bert, + ) mel = spec_to_mel_torch( spec, hps.data.filter_length, hps.data.n_mel_channels, hps.data.sampling_rate, hps.data.mel_fmin, - hps.data.mel_fmax) - y_mel = commons.slice_segments(mel, ids_slice, hps.train.segment_size // hps.data.hop_length) + hps.data.mel_fmax, + ) + y_mel = commons.slice_segments( + mel, ids_slice, hps.train.segment_size // hps.data.hop_length + ) y_hat_mel = mel_spectrogram_torch( y_hat.squeeze(1), hps.data.filter_length, @@ -216,26 +330,38 @@ def train_and_evaluate(rank, epoch, hps, nets, optims, schedulers, scaler, loade hps.data.hop_length, hps.data.win_length, hps.data.mel_fmin, - hps.data.mel_fmax + hps.data.mel_fmax, ) - y = commons.slice_segments(y, ids_slice * hps.data.hop_length, hps.train.segment_size) # slice + y = commons.slice_segments( + y, ids_slice * hps.data.hop_length, hps.train.segment_size + ) # slice # Discriminator y_d_hat_r, y_d_hat_g, _, _ = net_d(y, y_hat.detach()) with autocast(enabled=False): - loss_disc, losses_disc_r, losses_disc_g = discriminator_loss(y_d_hat_r, y_d_hat_g) + loss_disc, losses_disc_r, losses_disc_g = discriminator_loss( + y_d_hat_r, y_d_hat_g + ) loss_disc_all = loss_disc if net_dur_disc is not None: - y_dur_hat_r, y_dur_hat_g = net_dur_disc(hidden_x.detach(), x_mask.detach(), logw.detach(), logw_.detach()) + y_dur_hat_r, y_dur_hat_g = net_dur_disc( + hidden_x.detach(), x_mask.detach(), logw.detach(), logw_.detach() + ) with autocast(enabled=False): - # TODO: I think need to mean using the mask, but for now, just mean all - loss_dur_disc, losses_dur_disc_r, losses_dur_disc_g = discriminator_loss(y_dur_hat_r, y_dur_hat_g) + # TODO: I think need to mean using the mask, but for now, just mean all + ( + loss_dur_disc, + losses_dur_disc_r, + losses_dur_disc_g, + ) = discriminator_loss(y_dur_hat_r, y_dur_hat_g) loss_dur_disc_all = loss_dur_disc optim_dur_disc.zero_grad() scaler.scale(loss_dur_disc_all).backward() scaler.unscale_(optim_dur_disc) - grad_norm_dur_disc = commons.clip_grad_value_(net_dur_disc.parameters(), None) + grad_norm_dur_disc = commons.clip_grad_value_( + net_dur_disc.parameters(), None + ) scaler.step(optim_dur_disc) optim_d.zero_grad() @@ -269,51 +395,97 @@ def train_and_evaluate(rank, epoch, hps, nets, optims, schedulers, scaler, loade if rank == 0: if global_step % hps.train.log_interval == 0: - lr = optim_g.param_groups[0]['lr'] + lr = optim_g.param_groups[0]["lr"] losses = [loss_disc, loss_gen, loss_fm, loss_mel, loss_dur, loss_kl] - logger.info('Train Epoch: {} [{:.0f}%]'.format( - epoch, - 100. * batch_idx / len(train_loader))) + logger.info( + "Train Epoch: {} [{:.0f}%]".format( + epoch, 100.0 * batch_idx / len(train_loader) + ) + ) logger.info([x.item() for x in losses] + [global_step, lr]) - scalar_dict = {"loss/g/total": loss_gen_all, "loss/d/total": loss_disc_all, "learning_rate": lr, - "grad_norm_d": grad_norm_d, "grad_norm_g": grad_norm_g} + scalar_dict = { + "loss/g/total": loss_gen_all, + "loss/d/total": loss_disc_all, + "learning_rate": lr, + "grad_norm_d": grad_norm_d, + "grad_norm_g": grad_norm_g, + } + scalar_dict.update( + { + "loss/g/fm": loss_fm, + "loss/g/mel": loss_mel, + "loss/g/dur": loss_dur, + "loss/g/kl": loss_kl, + } + ) + scalar_dict.update( + {"loss/g/{}".format(i): v for i, v in enumerate(losses_gen)} + ) + scalar_dict.update( + {"loss/d_r/{}".format(i): v for i, v in enumerate(losses_disc_r)} + ) scalar_dict.update( - {"loss/g/fm": loss_fm, "loss/g/mel": loss_mel, "loss/g/dur": loss_dur, "loss/g/kl": loss_kl}) - scalar_dict.update({"loss/g/{}".format(i): v for i, v in enumerate(losses_gen)}) - scalar_dict.update({"loss/d_r/{}".format(i): v for i, v in enumerate(losses_disc_r)}) - scalar_dict.update({"loss/d_g/{}".format(i): v for i, v in enumerate(losses_disc_g)}) - + {"loss/d_g/{}".format(i): v for i, v in enumerate(losses_disc_g)} + ) + image_dict = { - "slice/mel_org": utils.plot_spectrogram_to_numpy(y_mel[0].data.cpu().numpy()), - "slice/mel_gen": utils.plot_spectrogram_to_numpy(y_hat_mel[0].data.cpu().numpy()), - "all/mel": utils.plot_spectrogram_to_numpy(mel[0].data.cpu().numpy()), - "all/attn": utils.plot_alignment_to_numpy(attn[0, 0].data.cpu().numpy()) + "slice/mel_org": utils.plot_spectrogram_to_numpy( + y_mel[0].data.cpu().numpy() + ), + "slice/mel_gen": utils.plot_spectrogram_to_numpy( + y_hat_mel[0].data.cpu().numpy() + ), + "all/mel": utils.plot_spectrogram_to_numpy( + mel[0].data.cpu().numpy() + ), + "all/attn": utils.plot_alignment_to_numpy( + attn[0, 0].data.cpu().numpy() + ), } utils.summarize( writer=writer, global_step=global_step, images=image_dict, - scalars=scalar_dict) + scalars=scalar_dict, + ) if global_step % hps.train.eval_interval == 0: evaluate(hps, net_g, eval_loader, writer_eval) - utils.save_checkpoint(net_g, optim_g, hps.train.learning_rate, epoch, - os.path.join(hps.model_dir, "G_{}.pth".format(global_step))) - utils.save_checkpoint(net_d, optim_d, hps.train.learning_rate, epoch, - os.path.join(hps.model_dir, "D_{}.pth".format(global_step))) + utils.save_checkpoint( + net_g, + optim_g, + hps.train.learning_rate, + epoch, + os.path.join(hps.model_dir, "G_{}.pth".format(global_step)), + ) + utils.save_checkpoint( + net_d, + optim_d, + hps.train.learning_rate, + epoch, + os.path.join(hps.model_dir, "D_{}.pth".format(global_step)), + ) if net_dur_disc is not None: - utils.save_checkpoint(net_dur_disc, optim_dur_disc, hps.train.learning_rate, epoch, os.path.join(hps.model_dir, "DUR_{}.pth".format(global_step))) - keep_ckpts = getattr(hps.train, 'keep_ckpts', 5) + utils.save_checkpoint( + net_dur_disc, + optim_dur_disc, + hps.train.learning_rate, + epoch, + os.path.join(hps.model_dir, "DUR_{}.pth".format(global_step)), + ) + keep_ckpts = getattr(hps.train, "keep_ckpts", 5) if keep_ckpts > 0: - utils.clean_checkpoints(path_to_models=hps.model_dir, n_ckpts_to_keep=keep_ckpts, sort_by_time=True) - + utils.clean_checkpoints( + path_to_models=hps.model_dir, + n_ckpts_to_keep=keep_ckpts, + sort_by_time=True, + ) global_step += 1 if rank == 0: - logger.info('====> Epoch: {}'.format(epoch)) - + logger.info("====> Epoch: {}".format(epoch)) def evaluate(hps, generator, eval_loader, writer_eval): @@ -322,7 +494,19 @@ def evaluate(hps, generator, eval_loader, writer_eval): audio_dict = {} print("Evaluating ...") with torch.no_grad(): - for batch_idx, (x, x_lengths, spec, spec_lengths, y, y_lengths, speakers, tone, language, bert, ja_bert) in enumerate(eval_loader): + for batch_idx, ( + x, + x_lengths, + spec, + spec_lengths, + y, + y_lengths, + speakers, + tone, + language, + bert, + ja_bert, + ) in enumerate(eval_loader): x, x_lengths = x.cuda(), x_lengths.cuda() spec, spec_lengths = spec.cuda(), spec_lengths.cuda() y, y_lengths = y.cuda(), y_lengths.cuda() @@ -332,7 +516,18 @@ def evaluate(hps, generator, eval_loader, writer_eval): tone = tone.cuda() language = language.cuda() for use_sdp in [True, False]: - y_hat, attn, mask, *_ = generator.module.infer(x, x_lengths, speakers, tone, language, bert, ja_bert, y=spec, max_len=1000, sdp_ratio=0.0 if not use_sdp else 1.0) + y_hat, attn, mask, *_ = generator.module.infer( + x, + x_lengths, + speakers, + tone, + language, + bert, + ja_bert, + y=spec, + max_len=1000, + sdp_ratio=0.0 if not use_sdp else 1.0, + ) y_hat_lengths = mask.sum([1, 2]).long() * hps.data.hop_length mel = spec_to_mel_torch( @@ -341,7 +536,8 @@ def evaluate(hps, generator, eval_loader, writer_eval): hps.data.n_mel_channels, hps.data.sampling_rate, hps.data.mel_fmin, - hps.data.mel_fmax) + hps.data.mel_fmax, + ) y_hat_mel = mel_spectrogram_torch( y_hat.squeeze(1).float(), hps.data.filter_length, @@ -350,25 +546,40 @@ def evaluate(hps, generator, eval_loader, writer_eval): hps.data.hop_length, hps.data.win_length, hps.data.mel_fmin, - hps.data.mel_fmax + hps.data.mel_fmax, + ) + image_dict.update( + { + f"gen/mel_{batch_idx}": utils.plot_spectrogram_to_numpy( + y_hat_mel[0].cpu().numpy() + ) + } ) - image_dict.update({ - f"gen/mel_{batch_idx}": utils.plot_spectrogram_to_numpy(y_hat_mel[0].cpu().numpy()) - }) - audio_dict.update({ - f"gen/audio_{batch_idx}_{use_sdp}": y_hat[0, :, :y_hat_lengths[0]] - }) - image_dict.update({f"gt/mel_{batch_idx}": utils.plot_spectrogram_to_numpy(mel[0].cpu().numpy())}) - audio_dict.update({f"gt/audio_{batch_idx}": y[0, :, :y_lengths[0]]}) + audio_dict.update( + { + f"gen/audio_{batch_idx}_{use_sdp}": y_hat[ + 0, :, : y_hat_lengths[0] + ] + } + ) + image_dict.update( + { + f"gt/mel_{batch_idx}": utils.plot_spectrogram_to_numpy( + mel[0].cpu().numpy() + ) + } + ) + audio_dict.update({f"gt/audio_{batch_idx}": y[0, :, : y_lengths[0]]}) utils.summarize( writer=writer_eval, global_step=global_step, images=image_dict, audios=audio_dict, - audio_sampling_rate=hps.data.sampling_rate + audio_sampling_rate=hps.data.sampling_rate, ) generator.train() + if __name__ == "__main__": run() diff --git a/transforms.py b/transforms.py index 4793d67ca..a11f799e0 100644 --- a/transforms.py +++ b/transforms.py @@ -9,66 +9,63 @@ DEFAULT_MIN_DERIVATIVE = 1e-3 -def piecewise_rational_quadratic_transform(inputs, - unnormalized_widths, - unnormalized_heights, - unnormalized_derivatives, - inverse=False, - tails=None, - tail_bound=1., - min_bin_width=DEFAULT_MIN_BIN_WIDTH, - min_bin_height=DEFAULT_MIN_BIN_HEIGHT, - min_derivative=DEFAULT_MIN_DERIVATIVE): - +def piecewise_rational_quadratic_transform( + inputs, + unnormalized_widths, + unnormalized_heights, + unnormalized_derivatives, + inverse=False, + tails=None, + tail_bound=1.0, + min_bin_width=DEFAULT_MIN_BIN_WIDTH, + min_bin_height=DEFAULT_MIN_BIN_HEIGHT, + min_derivative=DEFAULT_MIN_DERIVATIVE, +): if tails is None: spline_fn = rational_quadratic_spline spline_kwargs = {} else: spline_fn = unconstrained_rational_quadratic_spline - spline_kwargs = { - 'tails': tails, - 'tail_bound': tail_bound - } + spline_kwargs = {"tails": tails, "tail_bound": tail_bound} outputs, logabsdet = spline_fn( - inputs=inputs, - unnormalized_widths=unnormalized_widths, - unnormalized_heights=unnormalized_heights, - unnormalized_derivatives=unnormalized_derivatives, - inverse=inverse, - min_bin_width=min_bin_width, - min_bin_height=min_bin_height, - min_derivative=min_derivative, - **spline_kwargs + inputs=inputs, + unnormalized_widths=unnormalized_widths, + unnormalized_heights=unnormalized_heights, + unnormalized_derivatives=unnormalized_derivatives, + inverse=inverse, + min_bin_width=min_bin_width, + min_bin_height=min_bin_height, + min_derivative=min_derivative, + **spline_kwargs ) return outputs, logabsdet def searchsorted(bin_locations, inputs, eps=1e-6): bin_locations[..., -1] += eps - return torch.sum( - inputs[..., None] >= bin_locations, - dim=-1 - ) - 1 - - -def unconstrained_rational_quadratic_spline(inputs, - unnormalized_widths, - unnormalized_heights, - unnormalized_derivatives, - inverse=False, - tails='linear', - tail_bound=1., - min_bin_width=DEFAULT_MIN_BIN_WIDTH, - min_bin_height=DEFAULT_MIN_BIN_HEIGHT, - min_derivative=DEFAULT_MIN_DERIVATIVE): + return torch.sum(inputs[..., None] >= bin_locations, dim=-1) - 1 + + +def unconstrained_rational_quadratic_spline( + inputs, + unnormalized_widths, + unnormalized_heights, + unnormalized_derivatives, + inverse=False, + tails="linear", + tail_bound=1.0, + min_bin_width=DEFAULT_MIN_BIN_WIDTH, + min_bin_height=DEFAULT_MIN_BIN_HEIGHT, + min_derivative=DEFAULT_MIN_DERIVATIVE, +): inside_interval_mask = (inputs >= -tail_bound) & (inputs <= tail_bound) outside_interval_mask = ~inside_interval_mask outputs = torch.zeros_like(inputs) logabsdet = torch.zeros_like(inputs) - if tails == 'linear': + if tails == "linear": unnormalized_derivatives = F.pad(unnormalized_derivatives, pad=(1, 1)) constant = np.log(np.exp(1 - min_derivative) - 1) unnormalized_derivatives[..., 0] = constant @@ -77,45 +74,57 @@ def unconstrained_rational_quadratic_spline(inputs, outputs[outside_interval_mask] = inputs[outside_interval_mask] logabsdet[outside_interval_mask] = 0 else: - raise RuntimeError('{} tails are not implemented.'.format(tails)) + raise RuntimeError("{} tails are not implemented.".format(tails)) - outputs[inside_interval_mask], logabsdet[inside_interval_mask] = rational_quadratic_spline( + ( + outputs[inside_interval_mask], + logabsdet[inside_interval_mask], + ) = rational_quadratic_spline( inputs=inputs[inside_interval_mask], unnormalized_widths=unnormalized_widths[inside_interval_mask, :], unnormalized_heights=unnormalized_heights[inside_interval_mask, :], unnormalized_derivatives=unnormalized_derivatives[inside_interval_mask, :], inverse=inverse, - left=-tail_bound, right=tail_bound, bottom=-tail_bound, top=tail_bound, + left=-tail_bound, + right=tail_bound, + bottom=-tail_bound, + top=tail_bound, min_bin_width=min_bin_width, min_bin_height=min_bin_height, - min_derivative=min_derivative + min_derivative=min_derivative, ) return outputs, logabsdet -def rational_quadratic_spline(inputs, - unnormalized_widths, - unnormalized_heights, - unnormalized_derivatives, - inverse=False, - left=0., right=1., bottom=0., top=1., - min_bin_width=DEFAULT_MIN_BIN_WIDTH, - min_bin_height=DEFAULT_MIN_BIN_HEIGHT, - min_derivative=DEFAULT_MIN_DERIVATIVE): + +def rational_quadratic_spline( + inputs, + unnormalized_widths, + unnormalized_heights, + unnormalized_derivatives, + inverse=False, + left=0.0, + right=1.0, + bottom=0.0, + top=1.0, + min_bin_width=DEFAULT_MIN_BIN_WIDTH, + min_bin_height=DEFAULT_MIN_BIN_HEIGHT, + min_derivative=DEFAULT_MIN_DERIVATIVE, +): if torch.min(inputs) < left or torch.max(inputs) > right: - raise ValueError('Input to a transform is not within its domain') + raise ValueError("Input to a transform is not within its domain") num_bins = unnormalized_widths.shape[-1] if min_bin_width * num_bins > 1.0: - raise ValueError('Minimal bin width too large for the number of bins') + raise ValueError("Minimal bin width too large for the number of bins") if min_bin_height * num_bins > 1.0: - raise ValueError('Minimal bin height too large for the number of bins') + raise ValueError("Minimal bin height too large for the number of bins") widths = F.softmax(unnormalized_widths, dim=-1) widths = min_bin_width + (1 - min_bin_width * num_bins) * widths cumwidths = torch.cumsum(widths, dim=-1) - cumwidths = F.pad(cumwidths, pad=(1, 0), mode='constant', value=0.0) + cumwidths = F.pad(cumwidths, pad=(1, 0), mode="constant", value=0.0) cumwidths = (right - left) * cumwidths + left cumwidths[..., 0] = left cumwidths[..., -1] = right @@ -126,7 +135,7 @@ def rational_quadratic_spline(inputs, heights = F.softmax(unnormalized_heights, dim=-1) heights = min_bin_height + (1 - min_bin_height * num_bins) * heights cumheights = torch.cumsum(heights, dim=-1) - cumheights = F.pad(cumheights, pad=(1, 0), mode='constant', value=0.0) + cumheights = F.pad(cumheights, pad=(1, 0), mode="constant", value=0.0) cumheights = (top - bottom) * cumheights + bottom cumheights[..., 0] = bottom cumheights[..., -1] = top @@ -150,15 +159,13 @@ def rational_quadratic_spline(inputs, input_heights = heights.gather(-1, bin_idx)[..., 0] if inverse: - a = (((inputs - input_cumheights) * (input_derivatives - + input_derivatives_plus_one - - 2 * input_delta) - + input_heights * (input_delta - input_derivatives))) - b = (input_heights * input_derivatives - - (inputs - input_cumheights) * (input_derivatives - + input_derivatives_plus_one - - 2 * input_delta)) - c = - input_delta * (inputs - input_cumheights) + a = (inputs - input_cumheights) * ( + input_derivatives + input_derivatives_plus_one - 2 * input_delta + ) + input_heights * (input_delta - input_derivatives) + b = input_heights * input_derivatives - (inputs - input_cumheights) * ( + input_derivatives + input_derivatives_plus_one - 2 * input_delta + ) + c = -input_delta * (inputs - input_cumheights) discriminant = b.pow(2) - 4 * a * c assert (discriminant >= 0).all() @@ -167,11 +174,15 @@ def rational_quadratic_spline(inputs, outputs = root * input_bin_widths + input_cumwidths theta_one_minus_theta = root * (1 - root) - denominator = input_delta + ((input_derivatives + input_derivatives_plus_one - 2 * input_delta) - * theta_one_minus_theta) - derivative_numerator = input_delta.pow(2) * (input_derivatives_plus_one * root.pow(2) - + 2 * input_delta * theta_one_minus_theta - + input_derivatives * (1 - root).pow(2)) + denominator = input_delta + ( + (input_derivatives + input_derivatives_plus_one - 2 * input_delta) + * theta_one_minus_theta + ) + derivative_numerator = input_delta.pow(2) * ( + input_derivatives_plus_one * root.pow(2) + + 2 * input_delta * theta_one_minus_theta + + input_derivatives * (1 - root).pow(2) + ) logabsdet = torch.log(derivative_numerator) - 2 * torch.log(denominator) return outputs, -logabsdet @@ -179,15 +190,20 @@ def rational_quadratic_spline(inputs, theta = (inputs - input_cumwidths) / input_bin_widths theta_one_minus_theta = theta * (1 - theta) - numerator = input_heights * (input_delta * theta.pow(2) - + input_derivatives * theta_one_minus_theta) - denominator = input_delta + ((input_derivatives + input_derivatives_plus_one - 2 * input_delta) - * theta_one_minus_theta) + numerator = input_heights * ( + input_delta * theta.pow(2) + input_derivatives * theta_one_minus_theta + ) + denominator = input_delta + ( + (input_derivatives + input_derivatives_plus_one - 2 * input_delta) + * theta_one_minus_theta + ) outputs = input_cumheights + numerator / denominator - derivative_numerator = input_delta.pow(2) * (input_derivatives_plus_one * theta.pow(2) - + 2 * input_delta * theta_one_minus_theta - + input_derivatives * (1 - theta).pow(2)) + derivative_numerator = input_delta.pow(2) * ( + input_derivatives_plus_one * theta.pow(2) + + 2 * input_delta * theta_one_minus_theta + + input_derivatives * (1 - theta).pow(2) + ) logabsdet = torch.log(derivative_numerator) - 2 * torch.log(denominator) return outputs, logabsdet diff --git a/utils.py b/utils.py index a5dae7bff..0d6fa36ff 100644 --- a/utils.py +++ b/utils.py @@ -16,20 +16,24 @@ def load_checkpoint(checkpoint_path, model, optimizer=None, skip_optimizer=False): assert os.path.isfile(checkpoint_path) - checkpoint_dict = torch.load(checkpoint_path, map_location='cpu') - iteration = checkpoint_dict['iteration'] - learning_rate = checkpoint_dict['learning_rate'] - if optimizer is not None and not skip_optimizer and checkpoint_dict['optimizer'] is not None: - optimizer.load_state_dict(checkpoint_dict['optimizer']) - elif optimizer is None and not skip_optimizer: - #else: Disable this line if Infer and resume checkpoint,then enable the line upper + checkpoint_dict = torch.load(checkpoint_path, map_location="cpu") + iteration = checkpoint_dict["iteration"] + learning_rate = checkpoint_dict["learning_rate"] + if ( + optimizer is not None + and not skip_optimizer + and checkpoint_dict["optimizer"] is not None + ): + optimizer.load_state_dict(checkpoint_dict["optimizer"]) + elif optimizer is None and not skip_optimizer: + # else: Disable this line if Infer and resume checkpoint,then enable the line upper new_opt_dict = optimizer.state_dict() - new_opt_dict_params = new_opt_dict['param_groups'][0]['params'] - new_opt_dict['param_groups'] = checkpoint_dict['optimizer']['param_groups'] - new_opt_dict['param_groups'][0]['params'] = new_opt_dict_params + new_opt_dict_params = new_opt_dict["param_groups"][0]["params"] + new_opt_dict["param_groups"] = checkpoint_dict["optimizer"]["param_groups"] + new_opt_dict["param_groups"][0]["params"] = new_opt_dict_params optimizer.load_state_dict(new_opt_dict) - saved_state_dict = checkpoint_dict['model'] - if hasattr(model, 'module'): + saved_state_dict = checkpoint_dict["model"] + if hasattr(model, "module"): state_dict = model.module.state_dict() else: state_dict = model.state_dict() @@ -38,39 +42,59 @@ def load_checkpoint(checkpoint_path, model, optimizer=None, skip_optimizer=False try: # assert "emb_g" not in k new_state_dict[k] = saved_state_dict[k] - assert saved_state_dict[k].shape == v.shape, (saved_state_dict[k].shape, v.shape) + assert saved_state_dict[k].shape == v.shape, ( + saved_state_dict[k].shape, + v.shape, + ) except: logger.error("%s is not in the checkpoint" % k) new_state_dict[k] = v - if hasattr(model, 'module'): + if hasattr(model, "module"): model.module.load_state_dict(new_state_dict, strict=False) else: model.load_state_dict(new_state_dict, strict=False) - logger.info("Loaded checkpoint '{}' (iteration {})".format( - checkpoint_path, iteration)) + logger.info( + "Loaded checkpoint '{}' (iteration {})".format(checkpoint_path, iteration) + ) return model, optimizer, learning_rate, iteration def save_checkpoint(model, optimizer, learning_rate, iteration, checkpoint_path): - logger.info("Saving model and optimizer state at iteration {} to {}".format( - iteration, checkpoint_path)) - if hasattr(model, 'module'): + logger.info( + "Saving model and optimizer state at iteration {} to {}".format( + iteration, checkpoint_path + ) + ) + if hasattr(model, "module"): state_dict = model.module.state_dict() else: state_dict = model.state_dict() - torch.save({'model': state_dict, - 'iteration': iteration, - 'optimizer': optimizer.state_dict(), - 'learning_rate': learning_rate}, checkpoint_path) - - -def summarize(writer, global_step, scalars={}, histograms={}, images={}, audios={}, audio_sampling_rate=22050): + torch.save( + { + "model": state_dict, + "iteration": iteration, + "optimizer": optimizer.state_dict(), + "learning_rate": learning_rate, + }, + checkpoint_path, + ) + + +def summarize( + writer, + global_step, + scalars={}, + histograms={}, + images={}, + audios={}, + audio_sampling_rate=22050, +): for k, v in scalars.items(): writer.add_scalar(k, v, global_step) for k, v in histograms.items(): writer.add_histogram(k, v, global_step) for k, v in images.items(): - writer.add_image(k, v, global_step, dataformats='HWC') + writer.add_image(k, v, global_step, dataformats="HWC") for k, v in audios.items(): writer.add_audio(k, v, global_step, audio_sampling_rate) @@ -86,23 +110,23 @@ def plot_spectrogram_to_numpy(spectrogram): global MATPLOTLIB_FLAG if not MATPLOTLIB_FLAG: import matplotlib + matplotlib.use("Agg") MATPLOTLIB_FLAG = True - mpl_logger = logging.getLogger('matplotlib') + mpl_logger = logging.getLogger("matplotlib") mpl_logger.setLevel(logging.WARNING) import matplotlib.pylab as plt import numpy as np fig, ax = plt.subplots(figsize=(10, 2)) - im = ax.imshow(spectrogram, aspect="auto", origin="lower", - interpolation='none') + im = ax.imshow(spectrogram, aspect="auto", origin="lower", interpolation="none") plt.colorbar(im, ax=ax) plt.xlabel("Frames") plt.ylabel("Channels") plt.tight_layout() fig.canvas.draw() - data = np.fromstring(fig.canvas.tostring_rgb(), dtype=np.uint8, sep='') + data = np.fromstring(fig.canvas.tostring_rgb(), dtype=np.uint8, sep="") data = data.reshape(fig.canvas.get_width_height()[::-1] + (3,)) plt.close() return data @@ -112,26 +136,28 @@ def plot_alignment_to_numpy(alignment, info=None): global MATPLOTLIB_FLAG if not MATPLOTLIB_FLAG: import matplotlib + matplotlib.use("Agg") MATPLOTLIB_FLAG = True - mpl_logger = logging.getLogger('matplotlib') + mpl_logger = logging.getLogger("matplotlib") mpl_logger.setLevel(logging.WARNING) import matplotlib.pylab as plt import numpy as np fig, ax = plt.subplots(figsize=(6, 4)) - im = ax.imshow(alignment.transpose(), aspect='auto', origin='lower', - interpolation='none') + im = ax.imshow( + alignment.transpose(), aspect="auto", origin="lower", interpolation="none" + ) fig.colorbar(im, ax=ax) - xlabel = 'Decoder timestep' + xlabel = "Decoder timestep" if info is not None: - xlabel += '\n\n' + info + xlabel += "\n\n" + info plt.xlabel(xlabel) - plt.ylabel('Encoder timestep') + plt.ylabel("Encoder timestep") plt.tight_layout() fig.canvas.draw() - data = np.fromstring(fig.canvas.tostring_rgb(), dtype=np.uint8, sep='') + data = np.fromstring(fig.canvas.tostring_rgb(), dtype=np.uint8, sep="") data = data.reshape(fig.canvas.get_width_height()[::-1] + (3,)) plt.close() return data @@ -143,17 +169,21 @@ def load_wav_to_torch(full_path): def load_filepaths_and_text(filename, split="|"): - with open(filename, encoding='utf-8') as f: + with open(filename, encoding="utf-8") as f: filepaths_and_text = [line.strip().split(split) for line in f] return filepaths_and_text def get_hparams(init=True): parser = argparse.ArgumentParser() - parser.add_argument('-c', '--config', type=str, default="./configs/base.json", - help='JSON file for configuration') - parser.add_argument('-m', '--model', type=str, required=True, - help='Model name') + parser.add_argument( + "-c", + "--config", + type=str, + default="./configs/base.json", + help="JSON file for configuration", + ) + parser.add_argument("-m", "--model", type=str, required=True, help="Model name") args = parser.parse_args() model_dir = os.path.join("./logs", args.model) @@ -178,31 +208,41 @@ def get_hparams(init=True): return hparams -def clean_checkpoints(path_to_models='logs/44k/', n_ckpts_to_keep=2, sort_by_time=True): +def clean_checkpoints(path_to_models="logs/44k/", n_ckpts_to_keep=2, sort_by_time=True): """Freeing up space by deleting saved ckpts - Arguments: - path_to_models -- Path to the model directory - n_ckpts_to_keep -- Number of ckpts to keep, excluding G_0.pth and D_0.pth - sort_by_time -- True -> chronologically delete ckpts - False -> lexicographically delete ckpts - """ + Arguments: + path_to_models -- Path to the model directory + n_ckpts_to_keep -- Number of ckpts to keep, excluding G_0.pth and D_0.pth + sort_by_time -- True -> chronologically delete ckpts + False -> lexicographically delete ckpts + """ import re - ckpts_files = [f for f in os.listdir(path_to_models) if os.path.isfile(os.path.join(path_to_models, f))] - name_key = (lambda _f: int(re.compile('._(\d+)\.pth').match(_f).group(1))) - time_key = (lambda _f: os.path.getmtime(os.path.join(path_to_models, _f))) + + ckpts_files = [ + f + for f in os.listdir(path_to_models) + if os.path.isfile(os.path.join(path_to_models, f)) + ] + name_key = lambda _f: int(re.compile("._(\d+)\.pth").match(_f).group(1)) + time_key = lambda _f: os.path.getmtime(os.path.join(path_to_models, _f)) sort_key = time_key if sort_by_time else name_key - x_sorted = lambda _x: sorted([f for f in ckpts_files if f.startswith(_x) and not f.endswith('_0.pth')], - key=sort_key) - to_del = [os.path.join(path_to_models, fn) for fn in - (x_sorted('G')[:-n_ckpts_to_keep] + x_sorted('D')[:-n_ckpts_to_keep])] + x_sorted = lambda _x: sorted( + [f for f in ckpts_files if f.startswith(_x) and not f.endswith("_0.pth")], + key=sort_key, + ) + to_del = [ + os.path.join(path_to_models, fn) + for fn in (x_sorted("G")[:-n_ckpts_to_keep] + x_sorted("D")[:-n_ckpts_to_keep]) + ] del_info = lambda fn: logger.info(f".. Free up space by deleting ckpt {fn}") del_routine = lambda x: [os.remove(x), del_info(x)] rs = [del_routine(fn) for fn in to_del] + def get_hparams_from_dir(model_dir): config_save_path = os.path.join(model_dir, "config.json") - with open(config_save_path, "r", encoding='utf-8') as f: + with open(config_save_path, "r", encoding="utf-8") as f: data = f.read() config = json.loads(data) @@ -212,7 +252,7 @@ def get_hparams_from_dir(model_dir): def get_hparams_from_file(config_path): - with open(config_path, "r", encoding='utf-8') as f: + with open(config_path, "r", encoding="utf-8") as f: data = f.read() config = json.loads(data) @@ -223,9 +263,11 @@ def get_hparams_from_file(config_path): def check_git_hash(model_dir): source_dir = os.path.dirname(os.path.realpath(__file__)) if not os.path.exists(os.path.join(source_dir, ".git")): - logger.warn("{} is not a git repository, therefore hash value comparison will be ignored.".format( - source_dir - )) + logger.warn( + "{} is not a git repository, therefore hash value comparison will be ignored.".format( + source_dir + ) + ) return cur_hash = subprocess.getoutput("git rev-parse HEAD") @@ -234,8 +276,11 @@ def check_git_hash(model_dir): if os.path.exists(path): saved_hash = open(path).read() if saved_hash != cur_hash: - logger.warn("git hash values are different. {}(saved) != {}(current)".format( - saved_hash[:8], cur_hash[:8])) + logger.warn( + "git hash values are different. {}(saved) != {}(current)".format( + saved_hash[:8], cur_hash[:8] + ) + ) else: open(path, "w").write(cur_hash) @@ -255,7 +300,7 @@ def get_logger(model_dir, filename="train.log"): return logger -class HParams(): +class HParams: def __init__(self, **kwargs): for k, v in kwargs.items(): if type(v) == dict: diff --git a/webui.py b/webui.py index 130ba9f8a..334120e0e 100644 --- a/webui.py +++ b/webui.py @@ -10,7 +10,9 @@ logging.getLogger("urllib3").setLevel(logging.WARNING) logging.getLogger("matplotlib").setLevel(logging.WARNING) -logging.basicConfig(level=logging.INFO, format="| %(name)s | %(levelname)s | %(message)s") +logging.basicConfig( + level=logging.INFO, format="| %(name)s | %(levelname)s | %(message)s" +) logger = logging.getLogger(__name__) @@ -27,6 +29,7 @@ net_g = None + def get_text(text, language_str, hps): norm_text, phone, tone, word2ph = clean_text(text, language_str) phone, tone, language = cleaned_text_to_sequence(phone, tone, language_str) @@ -42,52 +45,101 @@ def get_text(text, language_str, hps): del word2ph assert bert.shape[-1] == len(phone), phone - if language_str=='ZH': + if language_str == "ZH": bert = bert ja_bert = torch.zeros(768, len(phone)) - elif language_str=="JA": + elif language_str == "JA": ja_bert = bert bert = torch.zeros(1024, len(phone)) else: bert = torch.zeros(1024, len(phone)) ja_bert = torch.zeros(768, len(phone)) assert bert.shape[-1] == len(phone), ( - bert.shape, len(phone), sum(word2ph), p1, p2, t1, t2, pold, pold2, word2ph, text, w2pho) + bert.shape, + len(phone), + sum(word2ph), + p1, + p2, + t1, + t2, + pold, + pold2, + word2ph, + text, + w2pho, + ) phone = torch.LongTensor(phone) tone = torch.LongTensor(tone) language = torch.LongTensor(language) return bert, ja_bert, phone, tone, language - + + def infer(text, sdp_ratio, noise_scale, noise_scale_w, length_scale, sid, language): global net_g bert, ja_bert, phones, tones, lang_ids = get_text(text, language, hps) with torch.no_grad(): - x_tst=phones.to(device).unsqueeze(0) - tones=tones.to(device).unsqueeze(0) - lang_ids=lang_ids.to(device).unsqueeze(0) + x_tst = phones.to(device).unsqueeze(0) + tones = tones.to(device).unsqueeze(0) + lang_ids = lang_ids.to(device).unsqueeze(0) bert = bert.to(device).unsqueeze(0) ja_bert = ja_bert.to(device).unsqueeze(0) x_tst_lengths = torch.LongTensor([phones.size(0)]).to(device) del phones speakers = torch.LongTensor([hps.data.spk2id[sid]]).to(device) - audio = net_g.infer(x_tst, x_tst_lengths, speakers, tones, lang_ids, bert, ja_bert, sdp_ratio=sdp_ratio - , noise_scale=noise_scale, noise_scale_w=noise_scale_w, length_scale=length_scale)[0][0,0].data.cpu().float().numpy() + audio = ( + net_g.infer( + x_tst, + x_tst_lengths, + speakers, + tones, + lang_ids, + bert, + ja_bert, + sdp_ratio=sdp_ratio, + noise_scale=noise_scale, + noise_scale_w=noise_scale_w, + length_scale=length_scale, + )[0][0, 0] + .data.cpu() + .float() + .numpy() + ) del x_tst, tones, lang_ids, bert, x_tst_lengths, speakers return audio -def tts_fn(text, speaker, sdp_ratio, noise_scale, noise_scale_w, length_scale, language): + +def tts_fn( + text, speaker, sdp_ratio, noise_scale, noise_scale_w, length_scale, language +): with torch.no_grad(): - audio = infer(text, sdp_ratio=sdp_ratio, noise_scale=noise_scale, noise_scale_w=noise_scale_w, length_scale=length_scale, sid=speaker, language=language) + audio = infer( + text, + sdp_ratio=sdp_ratio, + noise_scale=noise_scale, + noise_scale_w=noise_scale_w, + length_scale=length_scale, + sid=speaker, + language=language, + ) torch.cuda.empty_cache() return "Success", (hps.data.sampling_rate, audio) if __name__ == "__main__": parser = argparse.ArgumentParser() - parser.add_argument("-m", "--model", default="./logs/as/G_8000.pth", help="path of your model") - parser.add_argument("-c", "--config", default="./configs/config.json", help="path of your config file") + parser.add_argument( + "-m", "--model", default="./logs/as/G_8000.pth", help="path of your model" + ) + parser.add_argument( + "-c", + "--config", + default="./configs/config.json", + help="path of your config file", + ) parser.add_argument("--share", default=False, help="make link public") - parser.add_argument("-d", "--debug", action="store_true", help="enable DEBUG-LEVEL log") + parser.add_argument( + "-d", "--debug", action="store_true", help="enable DEBUG-LEVEL log" + ) args = parser.parse_args() if args.debug: @@ -109,33 +161,51 @@ def tts_fn(text, speaker, sdp_ratio, noise_scale, noise_scale_w, length_scale, l hps.data.filter_length // 2 + 1, hps.train.segment_size // hps.data.hop_length, n_speakers=hps.data.n_speakers, - **hps.model).to(device) + **hps.model + ).to(device) _ = net_g.eval() _ = utils.load_checkpoint(args.model, net_g, None, skip_optimizer=True) speaker_ids = hps.data.spk2id speakers = list(speaker_ids.keys()) - languages = ["ZH","JA"] + languages = ["ZH", "JA"] with gr.Blocks() as app: with gr.Row(): with gr.Column(): - text = gr.TextArea(label="Text", placeholder="Input Text Here", - value="吃葡萄不吐葡萄皮,不吃葡萄倒吐葡萄皮。") - speaker = gr.Dropdown(choices=speakers, value=speakers[0], label='Speaker') - sdp_ratio = gr.Slider(minimum=0, maximum=1, value=0.2, step=0.1, label='SDP Ratio') - noise_scale = gr.Slider(minimum=0.1, maximum=2, value=0.6, step=0.1, label='Noise Scale') - noise_scale_w = gr.Slider(minimum=0.1, maximum=2, value=0.8, step=0.1, label='Noise Scale W') - length_scale = gr.Slider(minimum=0.1, maximum=2, value=1, step=0.1, label='Length Scale') - language = gr.Dropdown(choices=languages, value=languages[0], label='Language') + text = gr.TextArea( + label="Text", + placeholder="Input Text Here", + value="吃葡萄不吐葡萄皮,不吃葡萄倒吐葡萄皮。", + ) + speaker = gr.Dropdown( + choices=speakers, value=speakers[0], label="Speaker" + ) + sdp_ratio = gr.Slider( + minimum=0, maximum=1, value=0.2, step=0.1, label="SDP Ratio" + ) + noise_scale = gr.Slider( + minimum=0.1, maximum=2, value=0.6, step=0.1, label="Noise Scale" + ) + noise_scale_w = gr.Slider( + minimum=0.1, maximum=2, value=0.8, step=0.1, label="Noise Scale W" + ) + length_scale = gr.Slider( + minimum=0.1, maximum=2, value=1, step=0.1, label="Length Scale" + ) + language = gr.Dropdown( + choices=languages, value=languages[0], label="Language" + ) btn = gr.Button("Generate!", variant="primary") with gr.Column(): text_output = gr.Textbox(label="Message") audio_output = gr.Audio(label="Output Audio") - btn.click(tts_fn, - inputs=[text, speaker, sdp_ratio, noise_scale, noise_scale_w, length_scale], - outputs=[text_output, audio_output]) - + btn.click( + tts_fn, + inputs=[text, speaker, sdp_ratio, noise_scale, noise_scale_w, length_scale], + outputs=[text_output, audio_output], + ) + webbrowser.open("http://127.0.0.1:7860") app.launch(share=args.share) From 8b61641bb1109632716c75b47aa935ce1fb55c59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Wed, 6 Sep 2023 23:00:14 +0800 Subject: [PATCH 083/102] Update train_ms.py --- train_ms.py | 2 ++ 1 file changed, 2 insertions(+) diff --git a/train_ms.py b/train_ms.py index a8d1eb829..7619237d0 100644 --- a/train_ms.py +++ b/train_ms.py @@ -32,6 +32,8 @@ from mel_processing import mel_spectrogram_torch, spec_to_mel_torch from text.symbols import symbols +os.environ['NCCL_P2P_DISABLE'] = 1 # Avoid training problem. + torch.backends.cudnn.benchmark = True torch.backends.cuda.sdp_kernel("flash") torch.backends.cuda.enable_flash_sdp(True) From 57b408e8df115f87e94249b4ef7cb6ee37f781d0 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Wed, 6 Sep 2023 23:00:33 +0800 Subject: [PATCH 084/102] rollback TF32 --- train_ms.py | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/train_ms.py b/train_ms.py index 7619237d0..4907c6936 100644 --- a/train_ms.py +++ b/train_ms.py @@ -33,7 +33,9 @@ from text.symbols import symbols os.environ['NCCL_P2P_DISABLE'] = 1 # Avoid training problem. - +torch.backends.cuda.matmul.allow_tf32 = True +torch.backends.cudnn.allow_tf32 = True # If encontered training problem,please try to disable TF32. +torch.set_float32_matmul_precision('medium') torch.backends.cudnn.benchmark = True torch.backends.cuda.sdp_kernel("flash") torch.backends.cuda.enable_flash_sdp(True) From 1348002c3a4e27f10adc83fe736b5e5bbd76e7f6 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Wed, 6 Sep 2023 15:00:38 +0000 Subject: [PATCH 085/102] Format code --- train_ms.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/train_ms.py b/train_ms.py index 7619237d0..a171aa8c4 100644 --- a/train_ms.py +++ b/train_ms.py @@ -32,7 +32,7 @@ from mel_processing import mel_spectrogram_torch, spec_to_mel_torch from text.symbols import symbols -os.environ['NCCL_P2P_DISABLE'] = 1 # Avoid training problem. +os.environ["NCCL_P2P_DISABLE"] = 1 # Avoid training problem. torch.backends.cudnn.benchmark = True torch.backends.cuda.sdp_kernel("flash") From c80621c7aec81a40c639b702cfa2ad69118f3482 Mon Sep 17 00:00:00 2001 From: Stardust-minus Date: Wed, 6 Sep 2023 15:00:48 +0000 Subject: [PATCH 086/102] Apply Code Formatter Change --- train_ms.py | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/train_ms.py b/train_ms.py index 4907c6936..1277eae79 100644 --- a/train_ms.py +++ b/train_ms.py @@ -32,10 +32,12 @@ from mel_processing import mel_spectrogram_torch, spec_to_mel_torch from text.symbols import symbols -os.environ['NCCL_P2P_DISABLE'] = 1 # Avoid training problem. +os.environ["NCCL_P2P_DISABLE"] = 1 # Avoid training problem. torch.backends.cuda.matmul.allow_tf32 = True -torch.backends.cudnn.allow_tf32 = True # If encontered training problem,please try to disable TF32. -torch.set_float32_matmul_precision('medium') +torch.backends.cudnn.allow_tf32 = ( + True # If encontered training problem,please try to disable TF32. +) +torch.set_float32_matmul_precision("medium") torch.backends.cudnn.benchmark = True torch.backends.cuda.sdp_kernel("flash") torch.backends.cuda.enable_flash_sdp(True) From 63ea12459d4c6b962224d1798c6422c039c061e2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= <2225664821@qq.com> Date: Thu, 7 Sep 2023 01:46:22 +0800 Subject: [PATCH 087/102] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20train=5Fms.py?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- train_ms.py | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/train_ms.py b/train_ms.py index 1277eae79..23f0252ac 100644 --- a/train_ms.py +++ b/train_ms.py @@ -32,7 +32,6 @@ from mel_processing import mel_spectrogram_torch, spec_to_mel_torch from text.symbols import symbols -os.environ["NCCL_P2P_DISABLE"] = 1 # Avoid training problem. torch.backends.cuda.matmul.allow_tf32 = True torch.backends.cudnn.allow_tf32 = ( True # If encontered training problem,please try to disable TF32. @@ -76,12 +75,11 @@ def run(): collate_fn = TextAudioSpeakerCollate() train_loader = DataLoader( train_dataset, - num_workers=16, + num_workers=0, shuffle=False, pin_memory=True, collate_fn=collate_fn, batch_sampler=train_sampler, - persistent_workers=True, prefetch_factor=4, ) # 128G Memory suitable loader. if rank == 0: From 1069066390443ee856865f5d652ef6517dfbff2a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Thu, 7 Sep 2023 11:09:55 +0800 Subject: [PATCH 088/102] Update train_ms.py --- train_ms.py | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/train_ms.py b/train_ms.py index 23f0252ac..37f9087b1 100644 --- a/train_ms.py +++ b/train_ms.py @@ -80,8 +80,7 @@ def run(): pin_memory=True, collate_fn=collate_fn, batch_sampler=train_sampler, - prefetch_factor=4, - ) # 128G Memory suitable loader. + ) # 0 worker if rank == 0: eval_dataset = TextAudioSpeakerLoader(hps.data.validation_files, hps.data) eval_loader = DataLoader( From eb83b8b58bfc126985ac80eb926e2fd918456146 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Thu, 7 Sep 2023 20:45:51 +0800 Subject: [PATCH 089/102] use gloo and update Dataloader --- train_ms.py | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/train_ms.py b/train_ms.py index 37f9087b1..c43441a9b 100644 --- a/train_ms.py +++ b/train_ms.py @@ -49,7 +49,7 @@ def run(): dist.init_process_group( - backend="nccl", init_method="env://" + backend="gloo", init_method="env://" # Due to some training problem,we proposed to use gloo instead of nccl. ) # Use torchrun instead of mp.spawn rank = dist.get_rank() n_gpus = dist.get_world_size() @@ -71,16 +71,19 @@ def run(): num_replicas=n_gpus, rank=rank, shuffle=True, + persistent_workers=True, + prefetch_factor=4 ) collate_fn = TextAudioSpeakerCollate() train_loader = DataLoader( train_dataset, - num_workers=0, + num_workers=16, shuffle=False, pin_memory=True, collate_fn=collate_fn, batch_sampler=train_sampler, - ) # 0 worker + + ) # DataLoader config could be adjusted. if rank == 0: eval_dataset = TextAudioSpeakerLoader(hps.data.validation_files, hps.data) eval_loader = DataLoader( From 82d5aaf904b644f1a543202fd6537ad16226b346 Mon Sep 17 00:00:00 2001 From: Stardust-minus Date: Thu, 7 Sep 2023 12:46:16 +0000 Subject: [PATCH 090/102] Apply Code Formatter Change --- train_ms.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/train_ms.py b/train_ms.py index c43441a9b..1a5660777 100644 --- a/train_ms.py +++ b/train_ms.py @@ -49,7 +49,8 @@ def run(): dist.init_process_group( - backend="gloo", init_method="env://" # Due to some training problem,we proposed to use gloo instead of nccl. + backend="gloo", + init_method="env://", # Due to some training problem,we proposed to use gloo instead of nccl. ) # Use torchrun instead of mp.spawn rank = dist.get_rank() n_gpus = dist.get_world_size() @@ -72,7 +73,7 @@ def run(): rank=rank, shuffle=True, persistent_workers=True, - prefetch_factor=4 + prefetch_factor=4, ) collate_fn = TextAudioSpeakerCollate() train_loader = DataLoader( @@ -82,7 +83,6 @@ def run(): pin_memory=True, collate_fn=collate_fn, batch_sampler=train_sampler, - ) # DataLoader config could be adjusted. if rank == 0: eval_dataset = TextAudioSpeakerLoader(hps.data.validation_files, hps.data) From c62c25cb4e29b52e30ec3ad529944f38ac8700b6 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Thu, 7 Sep 2023 12:46:17 +0000 Subject: [PATCH 091/102] Format code --- train_ms.py | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/train_ms.py b/train_ms.py index c43441a9b..1a5660777 100644 --- a/train_ms.py +++ b/train_ms.py @@ -49,7 +49,8 @@ def run(): dist.init_process_group( - backend="gloo", init_method="env://" # Due to some training problem,we proposed to use gloo instead of nccl. + backend="gloo", + init_method="env://", # Due to some training problem,we proposed to use gloo instead of nccl. ) # Use torchrun instead of mp.spawn rank = dist.get_rank() n_gpus = dist.get_world_size() @@ -72,7 +73,7 @@ def run(): rank=rank, shuffle=True, persistent_workers=True, - prefetch_factor=4 + prefetch_factor=4, ) collate_fn = TextAudioSpeakerCollate() train_loader = DataLoader( @@ -82,7 +83,6 @@ def run(): pin_memory=True, collate_fn=collate_fn, batch_sampler=train_sampler, - ) # DataLoader config could be adjusted. if rank == 0: eval_dataset = TextAudioSpeakerLoader(hps.data.validation_files, hps.data) From 67f4d08520e002d75c30498c629a8da11842a11b Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Thu, 7 Sep 2023 22:15:15 +0800 Subject: [PATCH 092/102] fix --- train_ms.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/train_ms.py b/train_ms.py index 1a5660777..11fffced0 100644 --- a/train_ms.py +++ b/train_ms.py @@ -72,8 +72,6 @@ def run(): num_replicas=n_gpus, rank=rank, shuffle=True, - persistent_workers=True, - prefetch_factor=4, ) collate_fn = TextAudioSpeakerCollate() train_loader = DataLoader( @@ -83,6 +81,8 @@ def run(): pin_memory=True, collate_fn=collate_fn, batch_sampler=train_sampler, + persistent_workers=True, + prefetch_factor=4, ) # DataLoader config could be adjusted. if rank == 0: eval_dataset = TextAudioSpeakerLoader(hps.data.validation_files, hps.data) From 1791d9240af0eb5eff8df30285db7a435183b5b0 Mon Sep 17 00:00:00 2001 From: Steve Wang Date: Fri, 8 Sep 2023 19:17:39 +0800 Subject: [PATCH 093/102] Fix error on resume training: KeyError: "param 'initial_lr' is not specified in param_groups[0] when resuming an optimizer" --- train_ms.py | 22 ++++++++++++++++------ 1 file changed, 16 insertions(+), 6 deletions(-) diff --git a/train_ms.py b/train_ms.py index 297fea6e3..0da546d04 100644 --- a/train_ms.py +++ b/train_ms.py @@ -157,12 +157,20 @@ def run(rank, n_gpus, hps): net_dur_disc = DDP(net_dur_disc, device_ids=[rank], find_unused_parameters=True) try: if net_dur_disc is not None: - _, _, _, epoch_str = utils.load_checkpoint(utils.latest_checkpoint_path(hps.model_dir, "DUR_*.pth"), net_dur_disc, optim_dur_disc, skip_optimizer=True) - _, optim_g, _, epoch_str = utils.load_checkpoint(utils.latest_checkpoint_path(hps.model_dir, "G_*.pth"), net_g, - optim_g, skip_optimizer=True) - _, optim_d, _, epoch_str = utils.load_checkpoint(utils.latest_checkpoint_path(hps.model_dir, "D_*.pth"), net_d, - optim_d, skip_optimizer=True) - + _, _, dur_resume_lr, epoch_str = utils.load_checkpoint( + utils.latest_checkpoint_path(hps.model_dir, "DUR_*.pth"), net_dur_disc, optim_dur_disc, + skip_optimizer=True) + _, optim_g, g_resume_lr, epoch_str = utils.load_checkpoint( + utils.latest_checkpoint_path(hps.model_dir, "G_*.pth"), net_g, + optim_g, skip_optimizer=True) + _, optim_d, d_resume_lr, epoch_str = utils.load_checkpoint( + utils.latest_checkpoint_path(hps.model_dir, "D_*.pth"), net_d, + optim_d, skip_optimizer=True) + if not optim_g.param_groups[0].get("initial_lr"): + optim_g.param_groups[0]["initial_lr"] = g_resume_lr + if not optim_d.param_groups[0].get("initial_lr"): + optim_d.param_groups[0]["initial_lr"] = d_resume_lr + epoch_str = max(epoch_str, 1) global_step = (epoch_str - 1) * len(train_loader) except Exception as e: @@ -174,6 +182,8 @@ def run(rank, n_gpus, hps): scheduler_g = torch.optim.lr_scheduler.ExponentialLR(optim_g, gamma=hps.train.lr_decay, last_epoch=epoch_str - 2) scheduler_d = torch.optim.lr_scheduler.ExponentialLR(optim_d, gamma=hps.train.lr_decay, last_epoch=epoch_str - 2) if net_dur_disc is not None: + if not optim_dur_disc.param_groups[0].get("initial_lr"): + optim_dur_disc.param_groups[0]["initial_lr"] = dur_resume_lr scheduler_dur_disc = torch.optim.lr_scheduler.ExponentialLR(optim_dur_disc, gamma=hps.train.lr_decay, last_epoch=epoch_str-2) else: scheduler_dur_disc = None From cfbb2fd8c95c1d5c1d655e0ee7b60b481182086d Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Fri, 8 Sep 2023 16:13:28 +0000 Subject: [PATCH 094/102] Format code --- train_ms.py | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/train_ms.py b/train_ms.py index 7103bad0b..83e1d9fad 100644 --- a/train_ms.py +++ b/train_ms.py @@ -173,20 +173,28 @@ def run(): try: if net_dur_disc is not None: _, _, dur_resume_lr, epoch_str = utils.load_checkpoint( - utils.latest_checkpoint_path(hps.model_dir, "DUR_*.pth"), net_dur_disc, optim_dur_disc, - skip_optimizer=True) + utils.latest_checkpoint_path(hps.model_dir, "DUR_*.pth"), + net_dur_disc, + optim_dur_disc, + skip_optimizer=True, + ) _, optim_g, g_resume_lr, epoch_str = utils.load_checkpoint( - utils.latest_checkpoint_path(hps.model_dir, "G_*.pth"), net_g, - optim_g, skip_optimizer=True) + utils.latest_checkpoint_path(hps.model_dir, "G_*.pth"), + net_g, + optim_g, + skip_optimizer=True, + ) _, optim_d, d_resume_lr, epoch_str = utils.load_checkpoint( - utils.latest_checkpoint_path(hps.model_dir, "D_*.pth"), net_d, - optim_d, skip_optimizer=True) + utils.latest_checkpoint_path(hps.model_dir, "D_*.pth"), + net_d, + optim_d, + skip_optimizer=True, + ) if not optim_g.param_groups[0].get("initial_lr"): optim_g.param_groups[0]["initial_lr"] = g_resume_lr if not optim_d.param_groups[0].get("initial_lr"): optim_d.param_groups[0]["initial_lr"] = d_resume_lr - epoch_str = max(epoch_str, 1) global_step = (epoch_str - 1) * len(train_loader) except Exception as e: @@ -203,7 +211,9 @@ def run(): if net_dur_disc is not None: if not optim_dur_disc.param_groups[0].get("initial_lr"): optim_dur_disc.param_groups[0]["initial_lr"] = dur_resume_lr - scheduler_dur_disc = torch.optim.lr_scheduler.ExponentialLR(optim_dur_disc, gamma=hps.train.lr_decay, last_epoch=epoch_str-2) + scheduler_dur_disc = torch.optim.lr_scheduler.ExponentialLR( + optim_dur_disc, gamma=hps.train.lr_decay, last_epoch=epoch_str - 2 + ) else: scheduler_dur_disc = None scaler = GradScaler(enabled=hps.train.fp16_run) From 53a1c55991ed8bf63d886e676fd917323e8b3972 Mon Sep 17 00:00:00 2001 From: Stardust-minus Date: Fri, 8 Sep 2023 16:13:34 +0000 Subject: [PATCH 095/102] Apply Code Formatter Change --- train_ms.py | 26 ++++++++++++++++++-------- 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/train_ms.py b/train_ms.py index 7103bad0b..83e1d9fad 100644 --- a/train_ms.py +++ b/train_ms.py @@ -173,20 +173,28 @@ def run(): try: if net_dur_disc is not None: _, _, dur_resume_lr, epoch_str = utils.load_checkpoint( - utils.latest_checkpoint_path(hps.model_dir, "DUR_*.pth"), net_dur_disc, optim_dur_disc, - skip_optimizer=True) + utils.latest_checkpoint_path(hps.model_dir, "DUR_*.pth"), + net_dur_disc, + optim_dur_disc, + skip_optimizer=True, + ) _, optim_g, g_resume_lr, epoch_str = utils.load_checkpoint( - utils.latest_checkpoint_path(hps.model_dir, "G_*.pth"), net_g, - optim_g, skip_optimizer=True) + utils.latest_checkpoint_path(hps.model_dir, "G_*.pth"), + net_g, + optim_g, + skip_optimizer=True, + ) _, optim_d, d_resume_lr, epoch_str = utils.load_checkpoint( - utils.latest_checkpoint_path(hps.model_dir, "D_*.pth"), net_d, - optim_d, skip_optimizer=True) + utils.latest_checkpoint_path(hps.model_dir, "D_*.pth"), + net_d, + optim_d, + skip_optimizer=True, + ) if not optim_g.param_groups[0].get("initial_lr"): optim_g.param_groups[0]["initial_lr"] = g_resume_lr if not optim_d.param_groups[0].get("initial_lr"): optim_d.param_groups[0]["initial_lr"] = d_resume_lr - epoch_str = max(epoch_str, 1) global_step = (epoch_str - 1) * len(train_loader) except Exception as e: @@ -203,7 +211,9 @@ def run(): if net_dur_disc is not None: if not optim_dur_disc.param_groups[0].get("initial_lr"): optim_dur_disc.param_groups[0]["initial_lr"] = dur_resume_lr - scheduler_dur_disc = torch.optim.lr_scheduler.ExponentialLR(optim_dur_disc, gamma=hps.train.lr_decay, last_epoch=epoch_str-2) + scheduler_dur_disc = torch.optim.lr_scheduler.ExponentialLR( + optim_dur_disc, gamma=hps.train.lr_decay, last_epoch=epoch_str - 2 + ) else: scheduler_dur_disc = None scaler = GradScaler(enabled=hps.train.fp16_run) From d6e463d2357f56c1ffeb94acc228be610487e413 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Sat, 9 Sep 2023 11:29:38 +0800 Subject: [PATCH 096/102] fix --- webui.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webui.py b/webui.py index 334120e0e..f86f3fd95 100644 --- a/webui.py +++ b/webui.py @@ -169,7 +169,7 @@ def tts_fn( speaker_ids = hps.data.spk2id speakers = list(speaker_ids.keys()) - languages = ["ZH", "JA"] + languages = ["ZH", "JP"] with gr.Blocks() as app: with gr.Row(): with gr.Column(): From a6c42d6fbcf186914fd573e329945d1696c821d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Sat, 9 Sep 2023 11:32:26 +0800 Subject: [PATCH 097/102] fix unput --- webui.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webui.py b/webui.py index f86f3fd95..348636c1b 100644 --- a/webui.py +++ b/webui.py @@ -203,7 +203,7 @@ def tts_fn( btn.click( tts_fn, - inputs=[text, speaker, sdp_ratio, noise_scale, noise_scale_w, length_scale], + inputs=[text, speaker, sdp_ratio, noise_scale, noise_scale_w, length_scale, language], outputs=[text_output, audio_output], ) From 40c2fae6dcf1310323cf849dbaa5a8b7be677e79 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Sat, 9 Sep 2023 11:35:38 +0800 Subject: [PATCH 098/102] fix device --- webui.py | 12 ++++++++---- 1 file changed, 8 insertions(+), 4 deletions(-) diff --git a/webui.py b/webui.py index 348636c1b..b7b343af6 100644 --- a/webui.py +++ b/webui.py @@ -1,8 +1,4 @@ import sys, os - -if sys.platform == "darwin": - os.environ["PYTORCH_ENABLE_MPS_FALLBACK"] = "1" - import logging logging.getLogger("numba").setLevel(logging.WARNING) @@ -29,6 +25,14 @@ net_g = None +if ( + sys.platform == "darwin" + and torch.backends.mps.is_available() + ): + device = "mps" + os.environ["PYTORCH_ENABLE_MPS_FALLBACK"] = "1" +else: + device = "cuda" def get_text(text, language_str, hps): norm_text, phone, tone, word2ph = clean_text(text, language_str) From 33944b7a45d82d0fa103aad6d2ff683cd70512d0 Mon Sep 17 00:00:00 2001 From: "github-actions[bot]" Date: Sat, 9 Sep 2023 03:35:56 +0000 Subject: [PATCH 099/102] Format code --- webui.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/webui.py b/webui.py index b7b343af6..7464eb291 100644 --- a/webui.py +++ b/webui.py @@ -25,15 +25,13 @@ net_g = None -if ( - sys.platform == "darwin" - and torch.backends.mps.is_available() - ): +if sys.platform == "darwin" and torch.backends.mps.is_available(): device = "mps" os.environ["PYTORCH_ENABLE_MPS_FALLBACK"] = "1" else: device = "cuda" + def get_text(text, language_str, hps): norm_text, phone, tone, word2ph = clean_text(text, language_str) phone, tone, language = cleaned_text_to_sequence(phone, tone, language_str) @@ -207,7 +205,15 @@ def tts_fn( btn.click( tts_fn, - inputs=[text, speaker, sdp_ratio, noise_scale, noise_scale_w, length_scale, language], + inputs=[ + text, + speaker, + sdp_ratio, + noise_scale, + noise_scale_w, + length_scale, + language, + ], outputs=[text_output, audio_output], ) From 7a25c8afb0edba087ba20394b2fe032ef2b5381a Mon Sep 17 00:00:00 2001 From: Stardust-minus Date: Sat, 9 Sep 2023 03:36:04 +0000 Subject: [PATCH 100/102] Apply Code Formatter Change --- webui.py | 16 +++++++++++----- 1 file changed, 11 insertions(+), 5 deletions(-) diff --git a/webui.py b/webui.py index b7b343af6..7464eb291 100644 --- a/webui.py +++ b/webui.py @@ -25,15 +25,13 @@ net_g = None -if ( - sys.platform == "darwin" - and torch.backends.mps.is_available() - ): +if sys.platform == "darwin" and torch.backends.mps.is_available(): device = "mps" os.environ["PYTORCH_ENABLE_MPS_FALLBACK"] = "1" else: device = "cuda" + def get_text(text, language_str, hps): norm_text, phone, tone, word2ph = clean_text(text, language_str) phone, tone, language = cleaned_text_to_sequence(phone, tone, language_str) @@ -207,7 +205,15 @@ def tts_fn( btn.click( tts_fn, - inputs=[text, speaker, sdp_ratio, noise_scale, noise_scale_w, length_scale, language], + inputs=[ + text, + speaker, + sdp_ratio, + noise_scale, + noise_scale_w, + length_scale, + language, + ], outputs=[text_output, audio_output], ) From f69599cb69e8564d72d68f5922208a74d8051601 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Stardust=C2=B7=E5=87=8F?= Date: Sat, 9 Sep 2023 11:36:50 +0800 Subject: [PATCH 101/102] fix --- webui.py | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/webui.py b/webui.py index 7464eb291..20f472bf7 100644 --- a/webui.py +++ b/webui.py @@ -43,7 +43,7 @@ def get_text(text, language_str, hps): for i in range(len(word2ph)): word2ph[i] = word2ph[i] * 2 word2ph[0] += 1 - bert = get_bert(norm_text, word2ph, language_str) + bert = get_bert(norm_text, word2ph, language_str, device) del word2ph assert bert.shape[-1] == len(phone), phone From f63acb913f887486107196732e8ae10c32b04a18 Mon Sep 17 00:00:00 2001 From: Lengyue Date: Tue, 12 Sep 2023 02:21:48 -0400 Subject: [PATCH 102/102] Format & polish training and webui --- README.md | 2 +- attentions.py | 5 ++--- commons.py | 11 ++++------- configs/config.json | 3 ++- data_utils.py | 6 ++---- losses.py | 3 --- mel_processing.py | 11 ----------- modules.py | 5 +---- resample.py | 8 +++----- server.py | 19 ++++-------------- text/chinese.py | 2 -- text/cmudict.rep | 16 +++++++-------- text/english.py | 1 - text/japanese.py | 1 - text/tone_sandhi.py | 2 +- train_ms.py | 37 +++++++++++++++-------------------- utils.py | 47 ++++++++++++++++++++++++++++++++++----------- webui.py | 27 +++++++++++--------------- 18 files changed, 91 insertions(+), 115 deletions(-) diff --git a/README.md b/README.md index 2083ee4ad..72da61f46 100644 --- a/README.md +++ b/README.md @@ -3,5 +3,5 @@ VITS2 Backbone with bert ## 成熟的旅行者/开拓者/舰长/博士/sensei/猎魔人/喵喵露/V应该参阅代码自己学习如何训练。 ### 严禁将此项目用于一切违反《中华人民共和国宪法》,《中华人民共和国刑法》,《中华人民共和国治安管理处罚法》和《中华人民共和国民法典》之用途。 -#### Video:https://www.bilibili.com/video/BV1hp4y1K78E +#### Video:https://www.bilibili.com/video/BV1hp4y1K78E #### Demo:https://www.bilibili.com/video/BV1TF411k78w diff --git a/attentions.py b/attentions.py index 88eeb078b..3ba240726 100644 --- a/attentions.py +++ b/attentions.py @@ -1,4 +1,3 @@ -import copy import math import torch from torch import nn @@ -341,7 +340,7 @@ def _matmul_with_relative_keys(self, x, y): return ret def _get_relative_embeddings(self, relative_embeddings, length): - max_relative_position = 2 * self.window_size + 1 + 2 * self.window_size + 1 # Pad first before slice to avoid using cond ops. pad_length = max(length - (self.window_size + 1), 0) slice_start_position = max((self.window_size + 1) - length, 0) @@ -385,7 +384,7 @@ def _absolute_position_to_relative_position(self, x): ret: [b, h, l, 2*l-1] """ batch, heads, length, _ = x.size() - # padd along column + # pad along column x = F.pad( x, commons.convert_pad_shape([[0, 0], [0, 0], [0, 0], [0, length - 1]]) ) diff --git a/commons.py b/commons.py index 21b446b6b..d3fa07f65 100644 --- a/commons.py +++ b/commons.py @@ -1,7 +1,5 @@ import math -import numpy as np import torch -from torch import nn from torch.nn import functional as F @@ -16,8 +14,8 @@ def get_padding(kernel_size, dilation=1): def convert_pad_shape(pad_shape): - l = pad_shape[::-1] - pad_shape = [item for sublist in l for item in sublist] + layer = pad_shape[::-1] + pad_shape = [item for sublist in layer for item in sublist] return pad_shape @@ -110,8 +108,8 @@ def fused_add_tanh_sigmoid_multiply(input_a, input_b, n_channels): def convert_pad_shape(pad_shape): - l = pad_shape[::-1] - pad_shape = [item for sublist in l for item in sublist] + layer = pad_shape[::-1] + pad_shape = [item for sublist in layer for item in sublist] return pad_shape @@ -132,7 +130,6 @@ def generate_path(duration, mask): duration: [b, 1, t_x] mask: [b, 1, t_y, t_x] """ - device = duration.device b, _, t_y, t_x = mask.shape cum_duration = torch.cumsum(duration, -1) diff --git a/configs/config.json b/configs/config.json index 29a145d19..4b0d6be52 100644 --- a/configs/config.json +++ b/configs/config.json @@ -17,7 +17,8 @@ "init_lr_ratio": 1, "warmup_epochs": 0, "c_mel": 45, - "c_kl": 1.0 + "c_kl": 1.0, + "skip_optimizer": true }, "data": { "training_files": "filelists/train.list", diff --git a/data_utils.py b/data_utils.py index 45ac34ba7..5bf1132b3 100644 --- a/data_utils.py +++ b/data_utils.py @@ -1,13 +1,11 @@ -import time import os import random -import numpy as np import torch import torch.utils.data from tqdm import tqdm from loguru import logger import commons -from mel_processing import spectrogram_torch, mel_spectrogram_torch, spec_to_mel_torch +from mel_processing import spectrogram_torch, mel_spectrogram_torch from utils import load_wav_to_torch, load_filepaths_and_text from text import cleaned_text_to_sequence, get_bert @@ -100,7 +98,7 @@ def get_audio(self, filename): if sampling_rate != self.sampling_rate: raise ValueError( "{} {} SR doesn't match target {} SR".format( - sampling_rate, self.sampling_rate + filename, sampling_rate, self.sampling_rate ) ) audio_norm = audio / self.max_wav_value diff --git a/losses.py b/losses.py index 628a4fcf1..b1b263e4c 100644 --- a/losses.py +++ b/losses.py @@ -1,7 +1,4 @@ import torch -from torch.nn import functional as F - -import commons def feature_loss(fmap_r, fmap_g): diff --git a/mel_processing.py b/mel_processing.py index d6f291527..aab5bd926 100644 --- a/mel_processing.py +++ b/mel_processing.py @@ -1,16 +1,5 @@ -import math -import os -import random import torch -from torch import nn -import torch.nn.functional as F import torch.utils.data -import numpy as np -import librosa -import librosa.util as librosa_util -from librosa.util import normalize, pad_center, tiny -from scipy.signal import get_window -from scipy.io.wavfile import read from librosa.filters import mel as librosa_mel_fn MAX_WAV_VALUE = 32768.0 diff --git a/modules.py b/modules.py index 4953fb3de..b1f89a2f8 100644 --- a/modules.py +++ b/modules.py @@ -1,12 +1,9 @@ -import copy import math -import numpy as np -import scipy import torch from torch import nn from torch.nn import functional as F -from torch.nn import Conv1d, ConvTranspose1d, AvgPool1d, Conv2d +from torch.nn import Conv1d from torch.nn.utils import weight_norm, remove_weight_norm import commons diff --git a/resample.py b/resample.py index 9f5d5c361..87abdfe19 100644 --- a/resample.py +++ b/resample.py @@ -1,11 +1,9 @@ import os import argparse import librosa -import numpy as np from multiprocessing import Pool, cpu_count import soundfile -from scipy.io import wavfile from tqdm import tqdm @@ -29,9 +27,9 @@ def process(item): "--out_dir", type=str, default="./dataset", help="path to target dir" ) args = parser.parse_args() - # processs = 8 - processs = cpu_count() - 2 if cpu_count() > 4 else 1 - pool = Pool(processes=processs) + # processes = 8 + processes = cpu_count() - 2 if cpu_count() > 4 else 1 + pool = Pool(processes=processes) for speaker in os.listdir(args.in_dir): spk_dir = os.path.join(args.in_dir, speaker) diff --git a/server.py b/server.py index b43aec624..2ecd50307 100644 --- a/server.py +++ b/server.py @@ -40,20 +40,9 @@ def get_text(text, language_str, hps): else: bert = torch.zeros(1024, len(phone)) ja_bert = torch.zeros(768, len(phone)) - assert bert.shape[-1] == len(phone), ( - bert.shape, - len(phone), - sum(word2ph), - p1, - p2, - t1, - t2, - pold, - pold2, - word2ph, - text, - w2pho, - ) + assert bert.shape[-1] == len( + phone + ), f"Bert seq len {bert.shape[-1]} != {len(phone)}" phone = torch.LongTensor(phone) tone = torch.LongTensor(tone) language = torch.LongTensor(language) @@ -126,7 +115,7 @@ def wav2(i, o, format): hps.data.filter_length // 2 + 1, hps.train.segment_size // hps.data.hop_length, n_speakers=hps.data.n_speakers, - **hps.model + **hps.model, ).to(dev) _ = net_g.eval() diff --git a/text/chinese.py b/text/chinese.py index 70b8feb5a..51acb3ec4 100644 --- a/text/chinese.py +++ b/text/chinese.py @@ -4,7 +4,6 @@ import cn2an from pypinyin import lazy_pinyin, Style -from text import symbols from text.symbols import punctuation from text.tone_sandhi import ToneSandhi @@ -96,7 +95,6 @@ def _g2p(segments): tones_list = [] word2ph = [] for seg in segments: - pinyins = [] # Replace all English words in the sentence seg = re.sub("[a-zA-Z]+", "", seg) seg_cut = psg.lcut(seg) diff --git a/text/cmudict.rep b/text/cmudict.rep index eb2199d15..9bc61ebd7 100644 --- a/text/cmudict.rep +++ b/text/cmudict.rep @@ -7,7 +7,7 @@ ## origin. ## ## cmudict.0.6 is the fifth release of cmudict, first released as cmudict.0.1 -## in September of 1993. There was no generally available public release +## in September of 1993. There was no generally available public release ## of version 0.5. ## ## See the README in this directory before you use this dictionary. @@ -16,11 +16,11 @@ ## Alex Rudnicky, Jack Mostow, Roni Rosenfeld, Richard Stern, ## Matthew Siegler, Kevin Lenzo, Maxine Eskenazi, Mosur Ravishankar, ## Eric Thayer, Kristie Seymore, and Raj Reddy at CMU; Lin Chase at -## LIMSI; Doug Paul at MIT Lincoln Labs; Ben Serridge at MIT SLS; Murray -## Spiegel at Bellcore; Tony Robinson at Cambridge UK; David Bowness of -## CAE Electronics Ltd. and CRIM; Stephen Hocking; Jerry Quinn at BNR -## Canada, and Marshal Midden for bringing to our attention problems and -## inadequacies with the first releases. Most special thanks to Bob Weide +## LIMSI; Doug Paul at MIT Lincoln Labs; Ben Serridge at MIT SLS; Murray +## Spiegel at Bellcore; Tony Robinson at Cambridge UK; David Bowness of +## CAE Electronics Ltd. and CRIM; Stephen Hocking; Jerry Quinn at BNR +## Canada, and Marshal Midden for bringing to our attention problems and +## inadequacies with the first releases. Most special thanks to Bob Weide ## for all his work on prior versions of the dictionary. ## ## We welcome input from users and will continue to acknowledge such input @@ -37,12 +37,12 @@ ## so keep your eyes open for problems and mail them to me. ## ## We hope this dictionary is an improvement over cmudict.0.4. -## +## ## email: cmudict@cs.cmu.edu ## web: http://www.speech.cs.cmu.edu/cgi-bin/cmudict ## ftp: ftp://ftp.cs.cmu.edu/project/speech/dict/ ## -## Thank you for your continued interest in the CMU Pronouncing +## Thank you for your continued interest in the CMU Pronouncing ## Dictionary. Further addictions and improvements are planned ## for forthcoming releases. ## diff --git a/text/english.py b/text/english.py index c4a053513..0f9339c9e 100644 --- a/text/english.py +++ b/text/english.py @@ -2,7 +2,6 @@ import os import re from g2p_en import G2p -from string import punctuation from text import symbols diff --git a/text/japanese.py b/text/japanese.py index cbb82e16f..53db38b73 100644 --- a/text/japanese.py +++ b/text/japanese.py @@ -1,6 +1,5 @@ # Convert Japanese text to phonemes which is # compatible with Julius https://github.com/julius-speech/segmentation-kit -import math import re import unicodedata diff --git a/text/tone_sandhi.py b/text/tone_sandhi.py index 89e34fa5e..6a6e4c3e6 100644 --- a/text/tone_sandhi.py +++ b/text/tone_sandhi.py @@ -536,7 +536,7 @@ def _yi_sandhi(self, word: str, finals: List[str]) -> List[str]: [item.isnumeric() for item in word if item != "一"] ): return finals - # "一" between reduplication words shold be yi5, e.g. 看一看 + # "一" between reduplication words should be yi5, e.g. 看一看 elif len(word) == 3 and word[1] == "一" and word[0] == word[-1]: finals[1] = finals[1][:-1] + "5" # when "一" is ordinal word, it should be yi1 diff --git a/train_ms.py b/train_ms.py index 83e1d9fad..2dcef509a 100644 --- a/train_ms.py +++ b/train_ms.py @@ -1,14 +1,10 @@ +# flake8: noqa: E402 + import os -import json -import argparse -import itertools -import math import torch -from torch import nn, optim from torch.nn import functional as F from torch.utils.data import DataLoader from torch.utils.tensorboard import SummaryWriter -import torch.multiprocessing as mp import torch.distributed as dist from torch.nn.parallel import DistributedDataParallel as DDP from torch.cuda.amp import autocast, GradScaler @@ -42,7 +38,7 @@ torch.backends.cuda.enable_flash_sdp(True) torch.backends.cuda.enable_mem_efficient_sdp( True -) # Not avaliable if torch version is lower than 2.0 +) # Not available if torch version is lower than 2.0 torch.backends.cuda.enable_math_sdp(True) global_step = 0 @@ -97,23 +93,20 @@ def run(): ) if ( "use_noise_scaled_mas" in hps.model.keys() - and hps.model.use_noise_scaled_mas == True + and hps.model.use_noise_scaled_mas is True ): print("Using noise scaled MAS for VITS2") - use_noise_scaled_mas = True mas_noise_scale_initial = 0.01 noise_scale_delta = 2e-6 else: print("Using normal MAS for VITS1") - use_noise_scaled_mas = False mas_noise_scale_initial = 0.0 noise_scale_delta = 0.0 if ( "use_duration_discriminator" in hps.model.keys() - and hps.model.use_duration_discriminator == True + and hps.model.use_duration_discriminator is True ): print("Using duration discriminator for VITS2") - use_duration_discriminator = True net_dur_disc = DurationDiscriminator( hps.model.hidden_channels, hps.model.hidden_channels, @@ -123,16 +116,14 @@ def run(): ).cuda(rank) if ( "use_spk_conditioned_encoder" in hps.model.keys() - and hps.model.use_spk_conditioned_encoder == True + and hps.model.use_spk_conditioned_encoder is True ): if hps.data.n_speakers == 0: raise ValueError( "n_speakers must be > 0 when using spk conditioned encoder to train multi-speaker model" ) - use_spk_conditioned_encoder = True else: print("Using normal encoder for VITS1") - use_spk_conditioned_encoder = False net_g = SynthesizerTrn( len(symbols), @@ -176,19 +167,25 @@ def run(): utils.latest_checkpoint_path(hps.model_dir, "DUR_*.pth"), net_dur_disc, optim_dur_disc, - skip_optimizer=True, + skip_optimizer=hps.train.skip_optimizer + if "skip_optimizer" in hps.train + else True, ) _, optim_g, g_resume_lr, epoch_str = utils.load_checkpoint( utils.latest_checkpoint_path(hps.model_dir, "G_*.pth"), net_g, optim_g, - skip_optimizer=True, + skip_optimizer=hps.train.skip_optimizer + if "skip_optimizer" in hps.train + else True, ) _, optim_d, d_resume_lr, epoch_str = utils.load_checkpoint( utils.latest_checkpoint_path(hps.model_dir, "D_*.pth"), net_d, optim_d, - skip_optimizer=True, + skip_optimizer=hps.train.skip_optimizer + if "skip_optimizer" in hps.train + else True, ) if not optim_g.param_groups[0].get("initial_lr"): optim_g.param_groups[0]["initial_lr"] = g_resume_lr @@ -371,9 +368,7 @@ def train_and_evaluate( optim_dur_disc.zero_grad() scaler.scale(loss_dur_disc_all).backward() scaler.unscale_(optim_dur_disc) - grad_norm_dur_disc = commons.clip_grad_value_( - net_dur_disc.parameters(), None - ) + commons.clip_grad_value_(net_dur_disc.parameters(), None) scaler.step(optim_dur_disc) optim_d.zero_grad() diff --git a/utils.py b/utils.py index 0d6fa36ff..49678050d 100644 --- a/utils.py +++ b/utils.py @@ -1,6 +1,5 @@ import os import glob -import sys import argparse import logging import json @@ -32,11 +31,13 @@ def load_checkpoint(checkpoint_path, model, optimizer=None, skip_optimizer=False new_opt_dict["param_groups"] = checkpoint_dict["optimizer"]["param_groups"] new_opt_dict["param_groups"][0]["params"] = new_opt_dict_params optimizer.load_state_dict(new_opt_dict) + saved_state_dict = checkpoint_dict["model"] if hasattr(model, "module"): state_dict = model.module.state_dict() else: state_dict = model.state_dict() + new_state_dict = {} for k, v in state_dict.items(): try: @@ -47,15 +48,26 @@ def load_checkpoint(checkpoint_path, model, optimizer=None, skip_optimizer=False v.shape, ) except: - logger.error("%s is not in the checkpoint" % k) + # For upgrading from the old version + if "ja_bert_proj" in k: + v = torch.zeros_like(v) + logger.warn( + f"Seems you are using the old version of the model, the {k} is automatically set to zero for backward compatibility" + ) + else: + logger.error(f"{k} is not in the checkpoint") + new_state_dict[k] = v + if hasattr(model, "module"): model.module.load_state_dict(new_state_dict, strict=False) else: model.load_state_dict(new_state_dict, strict=False) + logger.info( "Loaded checkpoint '{}' (iteration {})".format(checkpoint_path, iteration) ) + return model, optimizer, learning_rate, iteration @@ -224,20 +236,33 @@ def clean_checkpoints(path_to_models="logs/44k/", n_ckpts_to_keep=2, sort_by_tim for f in os.listdir(path_to_models) if os.path.isfile(os.path.join(path_to_models, f)) ] - name_key = lambda _f: int(re.compile("._(\d+)\.pth").match(_f).group(1)) - time_key = lambda _f: os.path.getmtime(os.path.join(path_to_models, _f)) + + def name_key(_f): + return int(re.compile("._(\\d+)\\.pth").match(_f).group(1)) + + def time_key(_f): + return os.path.getmtime(os.path.join(path_to_models, _f)) + sort_key = time_key if sort_by_time else name_key - x_sorted = lambda _x: sorted( - [f for f in ckpts_files if f.startswith(_x) and not f.endswith("_0.pth")], - key=sort_key, - ) + + def x_sorted(_x): + return sorted( + [f for f in ckpts_files if f.startswith(_x) and not f.endswith("_0.pth")], + key=sort_key, + ) + to_del = [ os.path.join(path_to_models, fn) for fn in (x_sorted("G")[:-n_ckpts_to_keep] + x_sorted("D")[:-n_ckpts_to_keep]) ] - del_info = lambda fn: logger.info(f".. Free up space by deleting ckpt {fn}") - del_routine = lambda x: [os.remove(x), del_info(x)] - rs = [del_routine(fn) for fn in to_del] + + def del_info(fn): + return logger.info(f".. Free up space by deleting ckpt {fn}") + + def del_routine(x): + return [os.remove(x), del_info(x)] + + [del_routine(fn) for fn in to_del] def get_hparams_from_dir(model_dir): diff --git a/webui.py b/webui.py index 20f472bf7..c71538f8b 100644 --- a/webui.py +++ b/webui.py @@ -1,3 +1,5 @@ +# flake8: noqa: E402 + import sys, os import logging @@ -56,20 +58,11 @@ def get_text(text, language_str, hps): else: bert = torch.zeros(1024, len(phone)) ja_bert = torch.zeros(768, len(phone)) - assert bert.shape[-1] == len(phone), ( - bert.shape, - len(phone), - sum(word2ph), - p1, - p2, - t1, - t2, - pold, - pold2, - word2ph, - text, - w2pho, - ) + + assert bert.shape[-1] == len( + phone + ), f"Bert seq len {bert.shape[-1]} != {len(phone)}" + phone = torch.LongTensor(phone) tone = torch.LongTensor(tone) language = torch.LongTensor(language) @@ -138,7 +131,9 @@ def tts_fn( default="./configs/config.json", help="path of your config file", ) - parser.add_argument("--share", default=False, help="make link public") + parser.add_argument( + "--share", default=False, help="make link public", action="store_true" + ) parser.add_argument( "-d", "--debug", action="store_true", help="enable DEBUG-LEVEL log" ) @@ -163,7 +158,7 @@ def tts_fn( hps.data.filter_length // 2 + 1, hps.train.segment_size // hps.data.hop_length, n_speakers=hps.data.n_speakers, - **hps.model + **hps.model, ).to(device) _ = net_g.eval()