Spaces:
Running
Running
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")), | |
) | |
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() | |