vietnamese-tts / app.py
Hưng
update model link
41b7348
import spaces
import gradio as gr
from cached_path import cached_path
import tempfile
from f5_tts.model import DiT
from f5_tts.infer.utils_infer import (
preprocess_ref_audio_text,
load_vocoder,
load_model,
infer_process,
save_spectrogram,
)
vocoder = load_vocoder()
# dim: 1024
# depth: 22
# heads: 16
# ff_mult: 2
# text_dim: 512
model = load_model(
DiT,
dict(dim=1024, depth=22, heads=16, ff_mult=2, text_dim=512, conv_layers=4),
ckpt_path=str(
cached_path("hf://zalopay/vietnamese-tts/model_1290000.pt")
),
mel_spec_type="vocos",
vocab_file=str(cached_path("hf://zalopay/vietnamese-tts/vocab.txt")),
)
@spaces.GPU
def infer(ref_audio_orig: str, ref_text: str, gen_text: str, speed: float = 1.0):
if ref_audio_orig is None:
raise gr.Error("Reference audio is required.")
if gen_text is None or gen_text.strip() == "":
raise gr.Error("Text to generate is required.")
gen_text = " " + gen_text.lower()
if ref_text is None or ref_text.strip() == "":
raise gr.Error("Ref Text is required.")
try:
ref_audio, ref_text = preprocess_ref_audio_text(ref_audio_orig, ref_text)
gr.Info("Generated audio text: {} with audio file {} ".format(ref_text, ref_audio_orig))
final_wave, final_sample_rate, combined_spectrogram = infer_process(
ref_audio,
ref_text.lower(),
gen_text,
model,
vocoder,
cross_fade_duration=0.15,
nfe_step=32,
speed=speed,
)
with tempfile.NamedTemporaryFile(
suffix=".png", delete=False
) as tmp_spectrogram:
spectrogram_path = tmp_spectrogram.name
save_spectrogram(combined_spectrogram, spectrogram_path)
return (final_sample_rate, final_wave), spectrogram_path
except Exception as e:
raise gr.Error(f"An error occurred during inference: {e}")
iface = gr.Interface(
title="Vietnamese TTS",
description="Vietnamese TTS model trained with public data (around 200 hours Vietnamese voice) using [F5-TTS](https://github.com/SWivid/F5-TTS) model. The model is published at https://huggingface.co/zalopay/vietnamese-tts",
fn=infer,
inputs=[
gr.components.Audio(type="filepath", label="Reference Audio"),
gr.components.Textbox(label="Reference audio text", lines=3),
gr.components.Textbox(label="Text to Generate", lines=3),
gr.components.Slider(
label="Speed",
minimum=0.3,
maximum=2.0,
value=1.0,
step=0.1,
info="Adjust the speed of the audio.",
),
],
outputs=[
gr.components.Audio(type="numpy", label="Synthesized Audio"),
gr.components.Image(type="filepath", label="Spectrogram"),
],
submit_btn="Synthesize",
clear_btn=None,
flagging_mode="never",
examples=[
[
"examples/pc-01.wav",
"có nghĩa là cảm xúc là vốn có, là tức thời, là bản năng, đối với một sự việc con người có những phản ứng hay cảm xúc khác nhau",
"Bà Lê Lan Chi, Tổng giám đốc Zalopay cho biết ứng dụng đã có một năm nhiều dấu ấn khi đồng hành với hàng triệu người dùng",
1.0,
],
[
"examples/pc-02.wav",
"sông Đồng Nai là con sông nội địa dài nhất Việt Nam, lớn thứ nhì nam bộ về lưu vực chỉ sau sông Cửu long",
"Bạn đã nhận được thanh toán thành công số tiền ba mươi ngàn đồng",
1.0,
],
[
"examples/pc-02.wav",
"sông Đồng Nai là con sông nội địa dài nhất Việt Nam, lớn thứ nhì nam bộ về lưu vực chỉ sau sông Cửu long",
"Ứng dụng thanh toán Zalopay chính thức ra mắt phiên bản mới với các thay đổi hấp dẫn, làm mới mọi trải nghiệm về tiền",
1.0,
],
],
)
if __name__ == "__main__":
iface.queue().launch()