axinc-ai / ailia-models

The collection of pre-trained, state-of-the-art AI models for ailia SDK
2.04k stars 325 forks source link

ADD GPT-SoVITS #1404

Closed kyakuno closed 4 months ago

kyakuno commented 8 months ago

最新のText2Speechモデル。VALLEXのように0ショットに対応している。 https://github.com/RVC-Boss/GPT-SoVITS mit 日本語対応

kyakuno commented 8 months ago

日本語へのアクセント符号の反映の話。 https://github.com/RVC-Boss/GPT-SoVITS/issues/326

kyakuno commented 8 months ago

一通り実装完了。ONNX変換は本家にもPRした。

kyakuno commented 6 months ago

日本語での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に含まれ、シンボル値に変換される。

kyakuno commented 6 months ago

with_prosodyがTrueの場合は、アクセント符号も付与されるが、これは使われていない。

kyakuno commented 6 months ago

C++での実装的には、g2pではなく、full contextのpauを,に、silを.にすればいい気がする。

kyakuno commented 6 months ago

英語のg2pは下記のPRで複雑になっている。とりあえずは元のシンプルなものでもいいかも。 https://github.com/RVC-Boss/GPT-SoVITS/commit/97f304c2bfa5bb185726588b3b9b44a0f797ae13

kyakuno commented 6 months ago

初期バージョン。 https://github.com/RVC-Boss/GPT-SoVITS/blob/41ca6028d6b5a672813e29bd7a671dafa5e7475a/GPT_SoVITS/text/english.py

kyakuno commented 6 months ago

g2p_enの実装。辞書にあるものは辞書から、ないものは下記のnnベースの音素変換を使用している。 https://github.com/Kyubyong/g2p/blob/master/g2p_en/g2p.py

kyakuno commented 6 months ago

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', '.'] になる。

kyakuno commented 6 months ago

ダイレクトに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', '.'] になる。 結果は一致する。

kyakuno commented 6 months ago

独自ロジックでcmudictを参照しているが、g2p_enの中にもcmudictを持っているので、独自ロジックのcmudictの参照は不要そうではある。