from flask import Flask from flask import Flask, request, jsonify import yaml from vietTTS.hifigan.mel2wave import mel2wave from vietTTS.nat.text2mel import text2mel from vietTTS.synthesizer import nat_normalize_text import numpy as np import gradio as gr import re from vietnam_number import n2w from vietnam_number import n2w_single from synthesize import synthesizer import noisereduce as nr import os import scipy.io.wavfile as wavf from scipy.io import wavfile app = Flask(__name__) @app.route('/hello/', methods=['GET', 'POST']) def welcome(): return "Hello World!" @app.route('/tts',methods = ['POST']) def tts(): text = request.json['data'][0] model = request.json['data'][1] duration = request.json['data'][2] if(model == "Tacotron2"): return using_tacotron(text) else: return '1' def text_to_speech(text,stop_duration): print("starting") # prevent too long text if len(text) > 500: text = text[:500] # text_to_speech_tacotron(text) # stop_duration_float = float(stop_duration_text) text = clean_text(text) text = nat_normalize_text(text) mel = text2mel( text, "lexicon.txt", stop_duration, "acoustic_latest_ckpt.pickle", "duration_latest_ckpt.pickle", ) wave = mel2wave(mel, "config.json", "hk_hifi.pickle") return (wave * (2**15)).astype(np.int16) def text_to_speech_tacotron(text): print("starting") # prevent too long text if len(text) > 500: text = text[:500] wav = synthesizer.tts(text) output = './out.wav' synthesizer.save_wav(wav,output) return output def using_viettts(text,stop_duration): y = text_to_speech(text,stop_duration) fs = 16000 output = './out.wav' output_denoise = './output_denoise.wav' wavf.write(output, fs, y) rate, data = wavfile.read(output) # perform noise reduction reduced_noise = nr.reduce_noise(y=data, sr=rate) wavfile.write(output_denoise, rate, reduced_noise) return (output,output_denoise) def using_tacotron(text): y = text_to_speech_tacotron(text) output_denoise = "./output_denoise.wav" rate, data = wavfile.read(y) # perform noise reduction reduced_noise = nr.reduce_noise(y=data, sr=rate) wavfile.write(output_denoise, rate, reduced_noise) return (y,output_denoise) def clean_text(test_string): list_word = test_string.split() # print(list_word) regex = r"\d{2}(?P[-/])\d{1,2}(?P=sep)\d{4}" for word in list_word : try: # print(word) searchbox_result = re.match(regex, word) day = searchbox_result.group(0) day2 = day day2 = day2.replace('/',' ').replace('-',' ') list_date = day2.split(' ') date_result = 'Ngày ' + n2w(list_date[0]) + ' tháng ' + n2w(list_date[1].replace('0','') if list_date[1].startswith('0') else list_date[1]) + ' năm ' + n2w(list_date[2]) # print(date_result) test_string = test_string.replace(word, date_result) except AttributeError: # print(word) # print("can't make a group") continue # print(test_string) regex2 = r"\d{2}(?P[-/])\d{1,2}" for word in list_word : try: # print(word) searchbox_result = re.match(regex2, word) day = searchbox_result.group(0) day2 = day day2 = day2.replace('/',' ').replace('-',' ') list_date = day2.split(' ') date_result = 'Ngày ' + n2w(list_date[0]) + ' tháng ' + n2w(list_date[1].replace('0','') if list_date[1].startswith('0') else list_date[1]) # print(date_result) test_string = test_string.replace(word, date_result) except AttributeError: # print(word) # print("can't make a group") continue # print(test_string) regex3 = r"\d{1,2}(?P[h:])\d{1,2}" for word in list_word : try: # print(word) searchbox_result = re.match(regex3, word) day = searchbox_result.group(0) day2 = day day2 = day2.replace('h',' ').replace(':',' ') list_date = day2.split(' ') date_result = n2w(list_date[0]) + ' giờ ' + n2w(list_date[1].replace('0','') if list_date[1].startswith('0') else list_date[1]) + ' phút ' # print(date_result) test_string = test_string.replace(word, date_result) except AttributeError: # print(word) # print("can't make a group") continue print(test_string) for word in list_word : try: if word.isdigit() : # print(word) text_result = n2w_single(word) # print(text_result) test_string = test_string.replace(word, text_result, 1) except AttributeError: # print(word) print("can't make a group") continue return test_string if __name__ == '__main__': app.run(host='0.0.0.0', port=105)