RVC-Boss / GPT-SoVITS

1 min voice data can also be used to train a good TTS model! (few shot voice cloning)
MIT License
36.31k stars 4.14k forks source link

希望能增加自定义多音字的功能 #1137

Open werran2 opened 6 months ago

werran2 commented 6 months ago

这样很多情况下可以自定义 不用等更新 更进一步可以共享读取自定义多音字文件 比如说粗话 操字 一般要读4音 另外很多繁体字 比如 “着”都写作“著” 惯用字写法读音和大陆不一样

liudiao1992 commented 6 months ago

text/chinese.py

def _g2p(segments): phones_list = [] word2ph = [] for seg in segments: pinyins = []

Replace all English words in the sentence

    seg = re.sub("[a-zA-Z]+", "", seg)
    seg_cut = psg.lcut(seg)
    initials = []
    finals = []
    seg_cut = tone_modifier.pre_merge_for_modify(seg_cut)
    for word, pos in seg_cut:
        if pos == "eng":
            continue
        sub_initials, sub_finals = _get_initials_finals(word)
        sub_finals = tone_modifier.modified_tone(word, pos, sub_finals)
        initials.append(sub_initials)
        finals.append(sub_finals)

        # assert len(sub_initials) == len(sub_finals) == len(word)
    initials = sum(initials, [])
    finals = sum(finals, [])

    # region 在这里进行读音的修改  2表示这句话第3个字,ni3表示读音
    # initial,final = split_pinyin_initial_final('ni3')
    # initials[2] = initial
    # finals[2] = final

    print(initials, finals)
    #
    for c, v in zip(initials, finals):
        raw_pinyin = c + v
        # NOTE: post process for pypinyin outputs
        # we discriminate i, ii and iii
        if c == v:
            assert c in punctuation
            phone = [c]
            word2ph.append(1)
        else:
            v_without_tone = v[:-1]
            tone = v[-1]

            pinyin = c + v_without_tone
            assert tone in "12345"

            if c:
                # 多音节
                v_rep_map = {
                    "uei": "ui",
                    "iou": "iu",
                    "uen": "un",
                }
                if v_without_tone in v_rep_map.keys():
                    pinyin = c + v_rep_map[v_without_tone]
            else:
                # 单音节
                pinyin_rep_map = {
                    "ing": "ying",
                    "i": "yi",
                    "in": "yin",
                    "u": "wu",
                }
                if pinyin in pinyin_rep_map.keys():
                    pinyin = pinyin_rep_map[pinyin]
                else:
                    single_rep_map = {
                        "v": "yu",
                        "e": "e",
                        "i": "y",
                        "u": "w",
                    }
                    if pinyin[0] in single_rep_map.keys():
                        pinyin = single_rep_map[pinyin[0]] + pinyin[1:]

            assert pinyin in pinyin_to_symbol_map.keys(), (pinyin, seg, raw_pinyin)
            new_c, new_v = pinyin_to_symbol_map[pinyin].split(" ")
            new_v = new_v + tone
            phone = [new_c, new_v]
            word2ph.append(len(phone))

        phones_list += phone
return phones_list, word2ph

修改多音字读音的方法,具体实现可以自己修改

uone-1 commented 5 months ago

請參考這裡: https://github.com/RVC-Boss/GPT-SoVITS/issues/1175