Spaces:
Running
Running
File size: 4,191 Bytes
5978124 ae4d0e1 5978124 ae4d0e1 5978124 ae4d0e1 1dc62cf ab97222 ae4d0e1 5978124 ae4d0e1 1dc62cf ef9b5b8 1dc62cf ab97222 ae4d0e1 5978124 ae4d0e1 295436c 3170601 ae4d0e1 e6c2413 ae4d0e1 ac5c1bc ae4d0e1 f0b02d5 ae4d0e1 339e016 ae4d0e1 295436c |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 |
import os, time, pytz, wave
import numpy as np
import gradio as gr
from io import BytesIO
from datetime import datetime
from huggingface_hub import login, hf_hub_download
from piper import PiperVoice
# from vinorm import TTSnorm
from vi_cleaner.vi_cleaner import ViCleaner
login(os.environ["hf_token"])
TIME_ZONE = "Asia/Ho_Chi_Minh"
def normalize_vietnamese_text(text):
# text = (
# TTSnorm(text, unknown=False, lower=False, rule=True)
# .replace("..", ".")
# .replace("!.", "!")
# .replace("?.", "?")
# .replace(" .", ".")
# .replace(" ,", ",")
# .replace('"', "")
# .replace("'", "")
# .replace("AI", "Ây Ai")
# .replace("A.I", "Ây Ai")
# )
text = ViCleaner(text).clean()
text = text.replace(". ", ".\n")
return text
def synthesize_speech(text, sentence_silence, length_scale, normalize_text=True):
model_path = hf_hub_download(
repo_id="nam194/piper-tts-w5n",
filename="tts_model.onnx"
)
config_path = hf_hub_download(
repo_id="nam194/piper-tts-w5n",
filename="tts_model.onnx.json"
)
if normalize_text:
text = normalize_vietnamese_text(text)
print("\n"+"="*80+"\n")
print("Text synthesized:", text)
print("Time:", datetime.now(pytz.timezone(TIME_ZONE)).strftime("%m/%d/%Y, %H:%M:%S"))
print("\n"+"="*80+"\n")
voice = PiperVoice.load(model_path, config_path)
buffer = BytesIO()
start = time.time()
with wave.open(buffer, "wb") as wav_file:
wav_file.setframerate(voice.config.sample_rate)
wav_file.setsampwidth(2)
wav_file.setnchannels(1)
voice.synthesize(
text, wav_file, sentence_silence=sentence_silence, length_scale=length_scale
)
buffer.seek(0)
audio_data = np.frombuffer(buffer.read(), dtype=np.int16)
inference_time = time.time() - start
metric_text = f"Time to generate audio: {round(inference_time*1000)} milliseconds\n"
return (voice.config.sample_rate, audio_data), metric_text
with gr.Blocks(analytics_enabled=False) as demo:
with gr.Row():
with gr.Column():
gr.Markdown(
"""
# Vietnamese Text-to-speech Demo ✨
"""
)
with gr.Column():
pass
with gr.Row():
with gr.Column():
input_text = gr.Textbox(
label="Text Prompt (Văn bản cần đọc)",
info="Mỗi câu nên gồm 10 từ trở lên.",
value="Xin chào, tôi là một mô hình chuyển đổi văn bản thành giọng nói tiếng Việt.",
)
sentence_silence = gr.Slider(
label="Khoảng lặng giữa câu (giây)",
minimum=0.0,
maximum=2.0,
step=0.05,
value=0.75,
info="Điều chỉnh độ dài khoảng lặng giữa các câu."
)
length_scale = gr.Slider(
label="Tốc độ đọc",
minimum=0.5,
maximum=2.0,
step=0.05,
value=1.3,
info="Điều chỉnh tốc độ đọc (1.0 là tốc độ bình thường)."
)
normalize_text = gr.Checkbox(
label="Chuẩn hóa văn bản tiếng Việt",
info="Normalize Vietnamese text",
value=True,
)
submit_button = gr.Button(
"Đọc 🗣️🔥",
elem_id="send-btn",
visible=True,
variant="primary",
)
with gr.Column():
output_audio = gr.Audio(
label="Synthesised Audio",
autoplay=True,
)
out_text_gr = gr.Text(label="Metrics")
submit_button.click(
synthesize_speech,
inputs=[input_text,
sentence_silence,
length_scale,
normalize_text],
outputs=[output_audio, out_text_gr],
)
demo.launch()
demo.launch(debug=True, show_api=True, share=True) |