Spaces:
Build error
Build error
| from .tts import TextToMel, MelToWav | |
| from .transliterate import XlitEngine | |
| from .num_to_word_on_sent import normalize_nums | |
| import re | |
| import numpy as np | |
| from scipy.io.wavfile import write | |
| from mosestokenizer import * | |
| from indicnlp.tokenize import sentence_tokenize | |
| import argparse | |
| _INDIC = ["as", "bn", "gu", "hi", "kn", "ml", "mr", "or", "pa", "ta", "te"] | |
| _PURAM_VIRAM_LANGUAGES = ["hi", "or", "bn", "as"] | |
| _TRANSLITERATION_NOT_AVAILABLE_IN = ["en","or"] | |
| #_NUM2WORDS_NOT_AVAILABLE_IN = [] | |
| def normalize_text(text, lang): | |
| if lang in _PURAM_VIRAM_LANGUAGES: | |
| text = text.replace('|', '।') | |
| text = text.replace('.', '।') | |
| return text | |
| def split_sentences(paragraph, language): | |
| if language == "en": | |
| with MosesSentenceSplitter(language) as splitter: | |
| return splitter([paragraph]) | |
| elif language in _INDIC: | |
| return sentence_tokenize.sentence_split(paragraph, lang=language) | |
| def load_models(acoustic, vocoder, device): | |
| text_to_mel = TextToMel(glow_model_dir=acoustic, device=device) | |
| mel_to_wav = MelToWav(hifi_model_dir=vocoder, device=device) | |
| return text_to_mel, mel_to_wav | |
| def translit(text, lang): | |
| reg = re.compile(r'[a-zA-Z]') | |
| words = [engine.translit_word(word, topk=1)[lang][0] if reg.match(word) else word for word in text.split()] | |
| updated_sent = ' '.join(words) | |
| return updated_sent | |
| def run_tts(text, lang, args): | |
| if lang == 'hi': | |
| text = text.replace('।', '.') # only for hindi models | |
| if lang == 'en' and text[-1] != '.': | |
| text = text + '. ' | |
| if args.number_conversion == 1 and lang!='en': | |
| print("Doing number conversion") | |
| text_num_to_word = normalize_nums(text, lang) # converting numbers to words in lang | |
| else: | |
| text_num_to_word = text | |
| if args.transliteration == 1 and lang not in _TRANSLITERATION_NOT_AVAILABLE_IN: | |
| print("Doing transliteration") | |
| text_num_to_word_and_transliterated = translit(text_num_to_word, lang) # transliterating english words to lang | |
| else: | |
| text_num_to_word_and_transliterated = text_num_to_word | |
| final_text = ' ' + text_num_to_word_and_transliterated | |
| print(final_text) | |
| mel = text_to_mel.generate_mel(final_text, args.noise_scale, args.length_scale) | |
| audio, sr = mel_to_wav.generate_wav(mel) | |
| return sr, audio | |
| def run_tts_paragraph(args): | |
| audio_list = [] | |
| global text_to_mel | |
| global mel_to_wav | |
| if args.gender == 'Male': | |
| text_to_mel = text_to_mel_list[1] | |
| mel_to_wav = mel_to_wav_list[1] | |
| else: | |
| text_to_mel = text_to_mel_list[0] | |
| mel_to_wav = mel_to_wav_list[0] | |
| if args.split_sentences == 1: | |
| text = normalize_text(args.text, args.lang) | |
| split_sentences_list = split_sentences(text, args.lang) | |
| for sent in split_sentences_list: | |
| sr, audio = run_tts(sent, args.lang, args) | |
| audio_list.append(audio) | |
| concatenated_audio = np.concatenate([i for i in audio_list]) | |
| if args.wav: | |
| write(filename=args.wav, rate=sr, data=concatenated_audio) | |
| return (sr, concatenated_audio) | |
| else: | |
| sr, audio = run_tts(args.text, args.lang, args) | |
| if args.wav: | |
| write(filename=args.wav, rate=sr, data=audio) | |
| return (sr, audio) | |
| def load_all_models(args): | |
| global engine | |
| if args.lang not in _TRANSLITERATION_NOT_AVAILABLE_IN: | |
| engine = XlitEngine(args.lang) # loading translit model globally | |
| global text_to_mel_list | |
| global mel_to_wav_list | |
| text_to_mel_list = [] | |
| mel_to_wav_list = [] | |
| for acoustic, vocoder in zip( args.acoustic.split(',') , args.vocoder.split(',') ): | |
| ttm, mtw = load_models(acoustic, vocoder, args.device) | |
| text_to_mel_list.append(ttm) | |
| mel_to_wav_list.append(mtw) | |
| try: | |
| args.noise_scale = float(args.noise_scale) | |
| args.length_scale = float(args.length_scale) | |
| except: | |
| pass | |
| print(args) | |
| if __name__ == "__main__": | |
| parser = argparse.ArgumentParser() | |
| parser.add_argument("-a", "--acoustic", required=True, type=str) | |
| parser.add_argument("-v", "--vocoder", required=True, type=str) | |
| parser.add_argument("-d", "--device", type=str, default="cpu") | |
| parser.add_argument("-t", "--text", type=str, required=True) | |
| parser.add_argument("-w", "--wav", type=str, required=True) | |
| parser.add_argument("-n", "--noise-scale", default='0.667', type=str ) | |
| parser.add_argument("-l", "--length-scale", default='1.0', type=str) | |
| parser.add_argument("-T", "--transliteration", default=1, type=int) | |
| parser.add_argument("-N", "--number-conversion", default=1, type=int) | |
| parser.add_argument("-S", "--split-sentences", default=1, type=int) | |
| parser.add_argument("-L", "--lang", type=str, required=True) | |
| args = parser.parse_args() | |
| load_all_models(args) | |
| run_tts_paragraph(args) | |