|
from style_bert_vits2.nlp.japanese.g2p import g2p |
|
from style_bert_vits2.nlp.japanese.mora_list import ( |
|
CONSONANTS, |
|
MORA_KATA_TO_MORA_PHONEMES, |
|
MORA_PHONEMES_TO_MORA_KATA, |
|
) |
|
from style_bert_vits2.nlp.symbols import PUNCTUATIONS |
|
|
|
|
|
def g2kata_tone(norm_text: str) -> list[tuple[str, int]]: |
|
""" |
|
テキストからカタカナとアクセントのペアのリストを返す。 |
|
推論時のみに使われる関数のため、常に `raise_yomi_error=False` を指定して g2p() を呼ぶ仕様になっている。 |
|
|
|
Args: |
|
norm_text: 正規化されたテキスト。 |
|
|
|
Returns: |
|
カタカナと音高のリスト。 |
|
""" |
|
|
|
phones, tones, _ = g2p(norm_text, use_jp_extra=True, raise_yomi_error=False) |
|
return phone_tone2kata_tone(list(zip(phones, tones))) |
|
|
|
|
|
def phone_tone2kata_tone(phone_tone: list[tuple[str, int]]) -> list[tuple[str, int]]: |
|
""" |
|
phone_tone の phone 部分をカタカナに変換する。ただし最初と最後の ("_", 0) は無視する。 |
|
|
|
Args: |
|
phone_tone: 音素と音高のリスト。 |
|
|
|
Returns: |
|
カタカナと音高のリスト。 |
|
""" |
|
|
|
phone_tone = phone_tone[1:] |
|
phones = [phone for phone, _ in phone_tone] |
|
tones = [tone for _, tone in phone_tone] |
|
result: list[tuple[str, int]] = [] |
|
current_mora = "" |
|
for phone, next_phone, tone, next_tone in zip(phones, phones[1:], tones, tones[1:]): |
|
|
|
if phone in PUNCTUATIONS: |
|
result.append((phone, tone)) |
|
continue |
|
if phone in CONSONANTS: |
|
assert current_mora == "", f"Unexpected {phone} after {current_mora}" |
|
assert tone == next_tone, f"Unexpected {phone} tone {tone} != {next_tone}" |
|
current_mora = phone |
|
else: |
|
|
|
current_mora += phone |
|
result.append((MORA_PHONEMES_TO_MORA_KATA[current_mora], tone)) |
|
current_mora = "" |
|
|
|
return result |
|
|
|
|
|
def kata_tone2phone_tone(kata_tone: list[tuple[str, int]]) -> list[tuple[str, int]]: |
|
""" |
|
`phone_tone2kata_tone()` の逆の変換を行う。 |
|
|
|
Args: |
|
kata_tone: カタカナと音高のリスト。 |
|
|
|
Returns: |
|
音素と音高のリスト。 |
|
""" |
|
|
|
result: list[tuple[str, int]] = [("_", 0)] |
|
for mora, tone in kata_tone: |
|
if mora in PUNCTUATIONS: |
|
result.append((mora, tone)) |
|
else: |
|
consonant, vowel = MORA_KATA_TO_MORA_PHONEMES[mora] |
|
if consonant is None: |
|
result.append((vowel, tone)) |
|
else: |
|
result.append((consonant, tone)) |
|
result.append((vowel, tone)) |
|
result.append(("_", 0)) |
|
|
|
return result |
|
|