|
import re |
|
import jieba |
|
from pypinyin import pinyin, Style |
|
from data_gen.tts.data_gen_utils import PUNCS |
|
from data_gen.tts.txt_processors import zh |
|
from g2pM import G2pM |
|
|
|
ALL_SHENMU = ['zh', 'ch', 'sh', 'b', 'p', 'm', 'f', 'd', 't', 'n', 'l', 'g', 'k', 'h', 'j', |
|
'q', 'x', 'r', 'z', 'c', 's', 'y', 'w'] |
|
ALL_YUNMU = ['a', 'ai', 'an', 'ang', 'ao', 'e', 'ei', 'en', 'eng', 'er', 'i', 'ia', 'ian', |
|
'iang', 'iao', 'ie', 'in', 'ing', 'iong', 'iu', 'ng', 'o', 'ong', 'ou', |
|
'u', 'ua', 'uai', 'uan', 'uang', 'ui', 'un', 'uo', 'v', 'van', 've', 'vn'] |
|
|
|
|
|
class TxtProcessor(zh.TxtProcessor): |
|
model = G2pM() |
|
|
|
@staticmethod |
|
def sp_phonemes(): |
|
return ['|', '#'] |
|
|
|
@classmethod |
|
def process(cls, txt, pre_align_args): |
|
txt = cls.preprocess_text(txt) |
|
ph_list = cls.model(txt, tone=pre_align_args['use_tone'], char_split=True) |
|
seg_list = '#'.join(jieba.cut(txt)) |
|
assert len(ph_list) == len([s for s in seg_list if s != '#']), (ph_list, seg_list) |
|
|
|
|
|
ph_list_ = [] |
|
seg_idx = 0 |
|
for p in ph_list: |
|
p = p.replace("u:", "v") |
|
if seg_list[seg_idx] == '#': |
|
ph_list_.append('#') |
|
seg_idx += 1 |
|
else: |
|
ph_list_.append("|") |
|
seg_idx += 1 |
|
if re.findall('[\u4e00-\u9fff]', p): |
|
if pre_align_args['use_tone']: |
|
p = pinyin(p, style=Style.TONE3, strict=True)[0][0] |
|
if p[-1] not in ['1', '2', '3', '4', '5']: |
|
p = p + '5' |
|
else: |
|
p = pinyin(p, style=Style.NORMAL, strict=True)[0][0] |
|
|
|
finished = False |
|
if len([c.isalpha() for c in p]) > 1: |
|
for shenmu in ALL_SHENMU: |
|
if p.startswith(shenmu) and not p.lstrip(shenmu).isnumeric(): |
|
ph_list_ += [shenmu, p.lstrip(shenmu)] |
|
finished = True |
|
break |
|
if not finished: |
|
ph_list_.append(p) |
|
|
|
ph_list = ph_list_ |
|
|
|
|
|
sil_phonemes = list(PUNCS) + TxtProcessor.sp_phonemes() |
|
ph_list_ = [] |
|
for i in range(0, len(ph_list), 1): |
|
if ph_list[i] != '#' or (ph_list[i - 1] not in sil_phonemes and ph_list[i + 1] not in sil_phonemes): |
|
ph_list_.append(ph_list[i]) |
|
ph_list = ph_list_ |
|
return ph_list, txt |
|
|
|
|
|
if __name__ == '__main__': |
|
phs, txt = TxtProcessor.process('他来到了,网易杭研大厦', {'use_tone': True}) |
|
print(phs) |
|
|