hynt commited on
Commit
153a74a
·
verified ·
1 Parent(s): 464876c

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +99 -99
app.py CHANGED
@@ -1,100 +1,100 @@
1
- import spaces
2
- import os
3
- from huggingface_hub import login
4
- import gradio as gr
5
- from cached_path import cached_path
6
- import tempfile
7
- from vinorm import TTSnorm
8
-
9
- from f5_tts.model import DiT
10
- from f5_tts.infer.utils_infer import (
11
- preprocess_ref_audio_text,
12
- load_vocoder,
13
- load_model,
14
- infer_process,
15
- save_spectrogram,
16
- )
17
-
18
- # Lấy token từ secrets
19
- hf_token = os.getenv("HUGGINGFACEHUB_API_TOKEN")
20
-
21
- # Login vào Hugging Face
22
- if hf_token:
23
- login(token=hf_token)
24
-
25
- def post_process(text):
26
- text = " " + text + " "
27
- text = text.replace(" . . ", " . ")
28
- text = " " + text + " "
29
- text = text.replace(" .. ", " . ")
30
- text = " " + text + " "
31
- text = text.replace(" , , ", " , ")
32
- text = " " + text + " "
33
- text = text.replace(" ,, ", " , ")
34
- return " ".join(text.split())
35
-
36
- # Load models
37
- vocoder = load_vocoder()
38
- model = load_model(
39
- DiT,
40
- dict(dim=1024, depth=22, heads=16, ff_mult=2, text_dim=512, conv_layers=4),
41
- ckpt_path=str(cached_path("hf://hynt/F5-TTS-Vietnamese-100h/model_350000.pt")),
42
- vocab_file=str(cached_path("hf://hynt/F5-TTS-Vietnamese-100h/vocab.txt")),
43
- )
44
-
45
- @spaces.GPU
46
- def infer_tts(ref_audio_orig: str, gen_text: str, speed: float = 1.0, request: gr.Request = None):
47
-
48
- if not ref_audio_orig:
49
- raise gr.Error("Vui lòng tải lên tệp âm thanh mẫu.")
50
- if not gen_text.strip():
51
- raise gr.Error("Vui lòng nhập nội dung cần sinh giọng.")
52
- if len(gen_text.split()) > 1000:
53
- raise gr.Error("Vui lòng nhập nội dung cần sinh giọng nhỏ hơn 100 từ.")
54
-
55
- try:
56
- ref_audio, ref_text = preprocess_ref_audio_text(ref_audio_orig, "")
57
- final_wave, final_sample_rate, spectrogram = infer_process(
58
- ref_audio, ref_text, post_process(TTSnorm(gen_text)), model, vocoder, speed=speed
59
- )
60
- with tempfile.NamedTemporaryFile(suffix=".png", delete=False) as tmp_spectrogram:
61
- spectrogram_path = tmp_spectrogram.name
62
- save_spectrogram(spectrogram, spectrogram_path)
63
-
64
- return (final_sample_rate, final_wave), spectrogram_path
65
- except Exception as e:
66
- raise gr.Error(f"Lỗi khi sinh giọng: {e}")
67
-
68
- # Gradio UI
69
- with gr.Blocks(theme=gr.themes.Soft()) as demo:
70
- gr.Markdown("""
71
- # 🎤 F5-TTS: Tổng hợp giọng nói Tiếng Việt.
72
- # Mô hình được huấn luyện 350.000 steps với bộ dữ liệu khoảng 100h trên 1 GPU RTX 3090.
73
- Nhập văn bản và tải lên một mẫu giọng để tạo âm thanh tự nhiên.
74
- """)
75
-
76
- with gr.Row():
77
- ref_audio = gr.Audio(label="🔊 Mẫu giọng", type="filepath")
78
- gen_text = gr.Textbox(label="📝 Văn bản", placeholder="Nhập nội dung cần sinh giọng...", lines=3)
79
-
80
- speed = gr.Slider(0.3, 2.0, value=1.0, step=0.1, label="⚡ Tốc độ")
81
- btn_synthesize = gr.Button("🔥 Sinh giọng")
82
-
83
- with gr.Row():
84
- output_audio = gr.Audio(label="🎧 Âm thanh tạo ra", type="numpy")
85
- output_spectrogram = gr.Image(label="📊 Spectrogram")
86
-
87
- model_limitations = gr.Textbox(
88
- value="""1. Mô hình có thể hoạt động không tốt với các ký tự số, ngày tháng, ký tự đặc biệt, ... => cần bổ sung thêm một module text normalization (chuẩn hoá text).
89
- 2. Nhịp điệu của một số audio có thể chưa được mạch lạc, giật cục.
90
- 3. Audio reference text sử dụng model whisper-large-v3-turbo nên sẽ có một vài trường hợp không nhận diện chính xác Tiếng Việt, dẫn đến kết quả tổng hợp giọng nói rất tệ.
91
- 4. Checkpoint của mô hình hiện tại dừng lại ở khoảng step thứ 350.000, được huấn luyện với 100 giờ dữ liệu public.""",
92
- label="❗ Hạn chế của mô hình",
93
- lines=4,
94
- interactive=False
95
- )
96
-
97
- btn_synthesize.click(infer_tts, inputs=[ref_audio, gen_text, speed], outputs=[output_audio, output_spectrogram])
98
-
99
- # Chạy Gradio với share=True để có link gradio.live
100
  demo.queue().launch()
 
1
+ import spaces
2
+ import os
3
+ from huggingface_hub import login
4
+ import gradio as gr
5
+ from cached_path import cached_path
6
+ import tempfile
7
+ from vinorm import TTSnorm
8
+
9
+ from f5_tts.model import DiT
10
+ from f5_tts.infer.utils_infer import (
11
+ preprocess_ref_audio_text,
12
+ load_vocoder,
13
+ load_model,
14
+ infer_process,
15
+ save_spectrogram,
16
+ )
17
+
18
+ # Lấy token từ secrets
19
+ hf_token = os.getenv("HUGGINGFACEHUB_API_TOKEN")
20
+
21
+ # Login vào Hugging Face
22
+ if hf_token:
23
+ login(token=hf_token)
24
+
25
+ def post_process(text):
26
+ text = " " + text + " "
27
+ text = text.replace(" . . ", " . ")
28
+ text = " " + text + " "
29
+ text = text.replace(" .. ", " . ")
30
+ text = " " + text + " "
31
+ text = text.replace(" , , ", " , ")
32
+ text = " " + text + " "
33
+ text = text.replace(" ,, ", " , ")
34
+ return " ".join(text.split())
35
+
36
+ # Load models
37
+ vocoder = load_vocoder()
38
+ model = load_model(
39
+ DiT,
40
+ dict(dim=1024, depth=22, heads=16, ff_mult=2, text_dim=512, conv_layers=4),
41
+ ckpt_path=str(cached_path("hf://hynt/F5-TTS-Vietnamese-100h/model_350000.pt")),
42
+ vocab_file=str(cached_path("hf://hynt/F5-TTS-Vietnamese-100h/vocab.txt")),
43
+ )
44
+
45
+ @spaces.GPU
46
+ def infer_tts(ref_audio_orig: str, gen_text: str, speed: float = 1.0, request: gr.Request = None):
47
+
48
+ if not ref_audio_orig:
49
+ raise gr.Error("Vui lòng tải lên tệp âm thanh mẫu.")
50
+ if not gen_text.strip():
51
+ raise gr.Error("Vui lòng nhập nội dung cần sinh giọng.")
52
+ if len(gen_text.split()) > 1000:
53
+ raise gr.Error("Vui lòng nhập nội dung cần sinh giọng nhỏ hơn 100 từ.")
54
+
55
+ try:
56
+ ref_audio, ref_text = preprocess_ref_audio_text(ref_audio_orig, "")
57
+ final_wave, final_sample_rate, spectrogram = infer_process(
58
+ ref_audio, ref_text, post_process(TTSnorm(gen_text)), model, vocoder, speed=speed
59
+ )
60
+ with tempfile.NamedTemporaryFile(suffix=".png", delete=False) as tmp_spectrogram:
61
+ spectrogram_path = tmp_spectrogram.name
62
+ save_spectrogram(spectrogram, spectrogram_path)
63
+
64
+ return (final_sample_rate, final_wave), spectrogram_path
65
+ except Exception as e:
66
+ raise gr.Error(f"Lỗi khi sinh giọng: {e}")
67
+
68
+ # Gradio UI
69
+ with gr.Blocks(theme=gr.themes.Soft()) as demo:
70
+ gr.Markdown("""
71
+ # 🎤 F5-TTS: Tổng hợp giọng nói Tiếng Việt.
72
+ # Mô hình được huấn luyện 350.000 steps với bộ dữ liệu khoảng 150h trên 1 GPU RTX 3090.
73
+ Nhập văn bản và tải lên một mẫu giọng để tạo âm thanh tự nhiên.
74
+ """)
75
+
76
+ with gr.Row():
77
+ ref_audio = gr.Audio(label="🔊 Mẫu giọng", type="filepath")
78
+ gen_text = gr.Textbox(label="📝 Văn bản", placeholder="Nhập nội dung cần sinh giọng...", lines=3)
79
+
80
+ speed = gr.Slider(0.3, 2.0, value=1.0, step=0.1, label="⚡ Tốc độ")
81
+ btn_synthesize = gr.Button("🔥 Sinh giọng")
82
+
83
+ with gr.Row():
84
+ output_audio = gr.Audio(label="🎧 Âm thanh tạo ra", type="numpy")
85
+ output_spectrogram = gr.Image(label="📊 Spectrogram")
86
+
87
+ model_limitations = gr.Textbox(
88
+ value="""1. Mô hình có thể hoạt động không tốt với các ký tự số, ngày tháng, ký tự đặc biệt, ... => cần bổ sung thêm một module text normalization (chuẩn hoá text).
89
+ 2. Nhịp điệu của một số audio có thể chưa được mạch lạc, giật cục => Gợi ý hãy chọn các audio mẫu đọc rõ ràng, không ngắt quãng quá nhiều, sẽ cải thiện được kết quả tổng hợp.
90
+ 3. Audio reference text sử dụng model whisper-large-v3-turbo nên sẽ có một vài trường hợp không nhận diện chính xác Tiếng Việt, dẫn đến kết quả tổng hợp giọng nói rất tệ.
91
+ 4. Checkpoint của mô hình hiện tại dừng lại ở khoảng step thứ 350.000, được huấn luyện với 150 giờ dữ liệu public => Việc voice cloning cho các giọng ngoại lai có thể không được chính xác tuyệt đối.""",
92
+ label="❗ Hạn chế của mô hình",
93
+ lines=4,
94
+ interactive=False
95
+ )
96
+
97
+ btn_synthesize.click(infer_tts, inputs=[ref_audio, gen_text, speed], outputs=[output_audio, output_spectrogram])
98
+
99
+ # Chạy Gradio với share=True để có link gradio.live
100
  demo.queue().launch()