ASLP-lab/DiffRhythm
689
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)