Closed kyakuno closed 4 months ago
日本語へのアクセント符号の反映の話。 https://github.com/RVC-Boss/GPT-SoVITS/issues/326
一通り実装完了。ONNX変換は本家にもPRした。
日本語でのG2Pについて。
japanese.pyで、「ax株式会社ではAIの実用化のための技術を開発しています。」をg2pすると「、」や「。」でsentenceを分割した結果、「e i e cl k U s u k a b u sh I k i g a i sh a d e w a e e a i n o j i ts u y o o k a n o t a m e n o g i j u ts u o k a i h a ts u sh I t e i m a s U」「。」になり、marksを末尾に追加して、「e i e cl k U s u k a b u sh I k i g a i sh a d e w a e e a i n o j i ts u y o o k a n o t a m e n o g i j u ts u o k a i h a ts u sh I t e i m a s U 。」となる。
その後、post_replace_phで、「。」が「.」に変換され、「e i e cl k U s u k a b u sh I k i g a i sh a d e w a e e a i n o j i ts u y o o k a n o t a m e n o g i j u ts u o k a i h a ts u sh I t e i m a s U .」となる。
対応表は下記。このように一度、sentenceに分割が入るのは、g2pが「、」や「。」を無視するため、明示的に後で追加するためである。
rep_map = {
":": ",",
";": ",",
",": ",",
"。": ".",
"!": "!",
"?": "?",
"\n": ".",
"·": ",",
"、": ",",
"...": "…",
}
「.」はpu_symbolsに含まれ、シンボル値に変換される。
with_prosodyがTrueの場合は、アクセント符号も付与されるが、これは使われていない。
C++での実装的には、g2pではなく、full contextのpauを,に、silを.にすればいい気がする。
英語のg2pは下記のPRで複雑になっている。とりあえずは元のシンプルなものでもいいかも。 https://github.com/RVC-Boss/GPT-SoVITS/commit/97f304c2bfa5bb185726588b3b9b44a0f797ae13
g2p_enの実装。辞書にあるものは辞書から、ないものは下記のnnベースの音素変換を使用している。 https://github.com/Kyubyong/g2p/blob/master/g2p_en/g2p.py
Hello world. We are testing speech synthesis.
をg2pで変換すると、cmudictとg2p_enを使用して、
['HH', 'AH0', 'L', 'OW1', 'W', 'ER1', 'L', 'D', '.', 'W', 'IY1', 'AA1', 'R', 'T', 'EH1', 'S', 'T', 'IH0', 'NG', 'S', 'P', 'IY1', 'CH', 'S', 'IH1', 'N', 'TH', 'AH0', 'S', 'AH0', 'S', '.']
になる。
ダイレクトにg2p_enだけを呼ぶと、
['HH', 'AH0', 'L', 'OW1', 'W', 'ER1', 'L', 'D', '.', 'W', 'IY1', 'AA1', 'R', 'T', 'EH1', 'S', 'T', 'IH0', 'NG', 'S', 'P', 'IY1', 'CH', 'S', 'IH1', 'N', 'TH', 'AH0', 'S', 'AH0', 'S', '.']
になる。
結果は一致する。
独自ロジックでcmudictを参照しているが、g2p_enの中にもcmudictを持っているので、独自ロジックのcmudictの参照は不要そうではある。
最新のText2Speechモデル。VALLEXのように0ショットに対応している。 https://github.com/RVC-Boss/GPT-SoVITS mit 日本語対応