File size: 3,911 Bytes
ae4d0e1
 
 
 
 
 
 
 
 
ab97222
ae4d0e1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
eb557de
ab97222
 
ae4d0e1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
295436c
3170601
ae4d0e1
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e6c2413
ae4d0e1
ac5c1bc
ae4d0e1
 
 
 
 
 
 
f0b02d5
ae4d0e1
 
 
 
 
 
 
f0b02d5
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
import os
import time
import gradio as gr
import wave
import numpy as np
from io import BytesIO
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"])

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_clean = ViCleaner(text).clean()
    return text_clean


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)
        
    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.2,
                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)