harveen
Add Tamil
3b92d66
raw history blame
No virus
4.94 kB
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)