CoolFace
Apppublic

ASLP-lab/DiffRhythm

sourceHugging Faceapache-2.0updated 1y agoView on Hugging Face
689likes
g2p_generation.py133 linesDownload Raw Back to g2p
1# Copyright (c) 2024 Amphion.2#3# This source code is licensed under the MIT license found in the4# LICENSE file in the root directory of this source tree.5 6import os7import sys8 9from diffrhythm.g2p.g2p import PhonemeBpeTokenizer10from diffrhythm.g2p.utils.g2p import phonemizer_g2p11import tqdm12from typing import List13import json14import os15import re16 17 18def ph_g2p(text, language):19 20    return phonemizer_g2p(text=text, language=language)21 22 23def g2p(text, sentence, language):24 25    return text_tokenizer.tokenize(text=text, sentence=sentence, language=language)26 27 28def is_chinese(char):29    if char >= "\u4e00" and char <= "\u9fa5":30        return True31    else:32        return False33 34 35def is_alphabet(char):36    if (char >= "\u0041" and char <= "\u005a") or (37        char >= "\u0061" and char <= "\u007a"38    ):39        return True40    else:41        return False42 43 44def is_other(char):45    if not (is_chinese(char) or is_alphabet(char)):46        return True47    else:48        return False49 50 51def get_segment(text: str) -> List[str]:52    # sentence --> [ch_part, en_part, ch_part, ...]53    segments = []54    types = []55    flag = 056    temp_seg = ""57    temp_lang = ""58 59    # Determine the type of each character. type: blank, chinese, alphabet, number, unk and point.60    for i, ch in enumerate(text):61        if is_chinese(ch):62            types.append("zh")63        elif is_alphabet(ch):64            types.append("en")65        else:66            types.append("other")67 68    assert len(types) == len(text)69 70    for i in range(len(types)):71        # find the first char of the seg72        if flag == 0:73            temp_seg += text[i]74            temp_lang = types[i]75            flag = 176        else:77            if temp_lang == "other":78                if types[i] == temp_lang:79                    temp_seg += text[i]80                else:81                    temp_seg += text[i]82                    temp_lang = types[i]83            else:84                if types[i] == temp_lang:85                    temp_seg += text[i]86                elif types[i] == "other":87                    temp_seg += text[i]88                else:89                    segments.append((temp_seg, temp_lang))90                    temp_seg = text[i]91                    temp_lang = types[i]92                    flag = 193 94    segments.append((temp_seg, temp_lang))95    return segments96 97 98def chn_eng_g2p(text: str):99    # now only en and ch100    segments = get_segment(text)101    all_phoneme = ""102    all_tokens = []103 104    for index in range(len(segments)):105        seg = segments[index]106        phoneme, token = g2p(seg[0], text, seg[1])107        all_phoneme += phoneme + "|"108        all_tokens += token109 110        if seg[1] == "en" and index == len(segments) - 1 and all_phoneme[-2] == "_":111            all_phoneme = all_phoneme[:-2]112            all_tokens = all_tokens[:-1]113    return all_phoneme, all_tokens114 115 116text_tokenizer = PhonemeBpeTokenizer()117with open("./diffrhythm/g2p/g2p/vocab.json", "r") as f:118    json_data = f.read()119data = json.loads(json_data)120vocab = data["vocab"]121 122if __name__ == '__main__':123    phone, token = chn_eng_g2p("你好,hello world")124    phone, token = chn_eng_g2p("你好,hello world, Bonjour, 테스트 해 보겠습니다, 五月雨緑")125    print(phone)126    print(token)127 128    #phone, token = text_tokenizer.tokenize("你好,hello world, Bonjour, 테스트 해 보겠습니다, 五月雨緑", "", "auto")129    phone, token = text_tokenizer.tokenize("緑", "", "auto")130    #phone, token = text_tokenizer.tokenize("आइए इसका परीक्षण करें", "", "auto")131    #phone, token = text_tokenizer.tokenize("आइए इसका परीक्षण करें", "", "other")132    print(phone)133    print(token)