Spaces:
Runtime error
Runtime error
| import re | |
| from pypinyin import Style | |
| from pypinyin.contrib.neutral_tone import NeutralToneWith5Mixin | |
| from pypinyin.converter import DefaultConverter | |
| from pypinyin.core import Pinyin | |
| from text import pinyin_dict | |
| from bert import TTSProsody | |
| class MyConverter(NeutralToneWith5Mixin, DefaultConverter): | |
| pass | |
| def is_chinese(uchar): | |
| if uchar >= u'\u4e00' and uchar <= u'\u9fa5': | |
| return True | |
| else: | |
| return False | |
| def clean_chinese(text: str): | |
| text = text.strip() | |
| text_clean = [] | |
| for char in text: | |
| if (is_chinese(char)): | |
| text_clean.append(char) | |
| else: | |
| if len(text_clean) > 1 and is_chinese(text_clean[-1]): | |
| text_clean.append(',') | |
| text_clean = ''.join(text_clean).strip(',') | |
| return text_clean | |
| class VITS_PinYin: | |
| def __init__(self, bert_path, device): | |
| self.pinyin_parser = Pinyin(MyConverter()) | |
| self.prosody = TTSProsody(bert_path, device) | |
| def get_phoneme4pinyin(self, pinyins): | |
| result = [] | |
| count_phone = [] | |
| for pinyin in pinyins: | |
| if pinyin[:-1] in pinyin_dict: | |
| tone = pinyin[-1] | |
| a = pinyin[:-1] | |
| a1, a2 = pinyin_dict[a] | |
| result += [a1, a2 + tone] | |
| count_phone.append(2) | |
| return result, count_phone | |
| def chinese_to_phonemes(self, text): | |
| text = clean_chinese(text) | |
| phonemes = ["sil"] | |
| chars = ['[PAD]'] | |
| count_phone = [] | |
| count_phone.append(1) | |
| for subtext in text.split(","): | |
| if (len(subtext) == 0): | |
| continue | |
| pinyins = self.correct_pinyin_tone3(subtext) | |
| sub_p, sub_c = self.get_phoneme4pinyin(pinyins) | |
| phonemes.extend(sub_p) | |
| phonemes.append("sp") | |
| count_phone.extend(sub_c) | |
| count_phone.append(1) | |
| chars.append(subtext) | |
| chars.append(',') | |
| phonemes.append("sil") | |
| count_phone.append(1) | |
| chars.append('[PAD]') | |
| chars = "".join(chars) | |
| char_embeds = self.prosody.get_char_embeds(chars) | |
| char_embeds = self.prosody.expand_for_phone(char_embeds, count_phone) | |
| return " ".join(phonemes), char_embeds | |
| def correct_pinyin_tone3(self, text): | |
| pinyin_list = [p[0] for p in self.pinyin_parser.pinyin( | |
| text, style=Style.TONE3, strict=False, neutral_tone_with_five=True)] | |
| if len(pinyin_list) >= 2: | |
| for i in range(1, len(pinyin_list)): | |
| try: | |
| if re.findall(r'\d', pinyin_list[i-1])[0] == '3' and re.findall(r'\d', pinyin_list[i])[0] == '3': | |
| pinyin_list[i-1] = pinyin_list[i-1].replace('3', '2') | |
| except IndexError: | |
| pass | |
| return pinyin_list | |