Spaces:
Runtime error
Runtime error
Upload 6 files
Browse files- .gitattributes +2 -24
- README.md +16 -6
- app.py +122 -0
- colab-notebook.ipynb +66 -0
- packages.txt +1 -0
- requirements.txt +2 -0
.gitattributes
CHANGED
@@ -1,35 +1,13 @@
|
|
1 |
-
*.7z filter=lfs diff=lfs merge=lfs -text
|
2 |
-
*.arrow filter=lfs diff=lfs merge=lfs -text
|
3 |
-
*.bin filter=lfs diff=lfs merge=lfs -text
|
4 |
-
*.bz2 filter=lfs diff=lfs merge=lfs -text
|
5 |
*.ckpt filter=lfs diff=lfs merge=lfs -text
|
6 |
-
*.ftz filter=lfs diff=lfs merge=lfs -text
|
7 |
-
*.gz filter=lfs diff=lfs merge=lfs -text
|
8 |
-
*.h5 filter=lfs diff=lfs merge=lfs -text
|
9 |
-
*.joblib filter=lfs diff=lfs merge=lfs -text
|
10 |
-
*.lfs.* filter=lfs diff=lfs merge=lfs -text
|
11 |
-
*.mlmodel filter=lfs diff=lfs merge=lfs -text
|
12 |
-
*.model filter=lfs diff=lfs merge=lfs -text
|
13 |
-
*.msgpack filter=lfs diff=lfs merge=lfs -text
|
14 |
*.npy filter=lfs diff=lfs merge=lfs -text
|
15 |
*.npz filter=lfs diff=lfs merge=lfs -text
|
16 |
*.onnx filter=lfs diff=lfs merge=lfs -text
|
17 |
-
*.ot filter=lfs diff=lfs merge=lfs -text
|
18 |
-
*.parquet filter=lfs diff=lfs merge=lfs -text
|
19 |
-
*.pb filter=lfs diff=lfs merge=lfs -text
|
20 |
*.pickle filter=lfs diff=lfs merge=lfs -text
|
21 |
*.pkl filter=lfs diff=lfs merge=lfs -text
|
22 |
*.pt filter=lfs diff=lfs merge=lfs -text
|
23 |
*.pth filter=lfs diff=lfs merge=lfs -text
|
24 |
*.rar filter=lfs diff=lfs merge=lfs -text
|
25 |
*.safetensors filter=lfs diff=lfs merge=lfs -text
|
26 |
-
saved_model/**/* filter=lfs diff=lfs merge=lfs -text
|
27 |
-
*.tar.* filter=lfs diff=lfs merge=lfs -text
|
28 |
-
*.tar filter=lfs diff=lfs merge=lfs -text
|
29 |
-
*.tflite filter=lfs diff=lfs merge=lfs -text
|
30 |
-
*.tgz filter=lfs diff=lfs merge=lfs -text
|
31 |
-
*.wasm filter=lfs diff=lfs merge=lfs -text
|
32 |
-
*.xz filter=lfs diff=lfs merge=lfs -text
|
33 |
*.zip filter=lfs diff=lfs merge=lfs -text
|
34 |
-
|
35 |
-
|
|
|
|
|
|
|
|
|
|
|
1 |
*.ckpt filter=lfs diff=lfs merge=lfs -text
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
2 |
*.npy filter=lfs diff=lfs merge=lfs -text
|
3 |
*.npz filter=lfs diff=lfs merge=lfs -text
|
4 |
*.onnx filter=lfs diff=lfs merge=lfs -text
|
|
|
|
|
|
|
5 |
*.pickle filter=lfs diff=lfs merge=lfs -text
|
6 |
*.pkl filter=lfs diff=lfs merge=lfs -text
|
7 |
*.pt filter=lfs diff=lfs merge=lfs -text
|
8 |
*.pth filter=lfs diff=lfs merge=lfs -text
|
9 |
*.rar filter=lfs diff=lfs merge=lfs -text
|
10 |
*.safetensors filter=lfs diff=lfs merge=lfs -text
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
11 |
*.zip filter=lfs diff=lfs merge=lfs -text
|
12 |
+
g_02500000 filter=lfs diff=lfs merge=lfs -text
|
13 |
+
generator_v1 filter=lfs diff=lfs merge=lfs -text
|
README.md
CHANGED
@@ -1,13 +1,23 @@
|
|
1 |
---
|
2 |
-
title: MatchaTTS
|
3 |
-
emoji:
|
4 |
-
colorFrom:
|
5 |
-
colorTo:
|
6 |
sdk: gradio
|
7 |
-
sdk_version: 4.17.0
|
8 |
app_file: app.py
|
9 |
pinned: false
|
10 |
license: agpl-3.0
|
|
|
|
|
|
|
11 |
---
|
12 |
|
13 |
-
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
---
|
2 |
+
title: MatchaTTS NgNgNgan
|
3 |
+
emoji: 🗣️🎙️
|
4 |
+
colorFrom: blue
|
5 |
+
colorTo: indigo
|
6 |
sdk: gradio
|
|
|
7 |
app_file: app.py
|
8 |
pinned: false
|
9 |
license: agpl-3.0
|
10 |
+
models: [doof-ferb/matcha_ngngngan]
|
11 |
+
tags: [tts, vietnamese]
|
12 |
+
preload_from_hub: ["doof-ferb/matcha_ngngngan ckpt/checkpoint_epoch420_slim.pt,hifigan/g_02500000"]
|
13 |
---
|
14 |
|
15 |
+
original:
|
16 |
+
- https://github.com/shivammehta25/Matcha-TTS
|
17 |
+
- https://huggingface.co/spaces/shivammehta25/Matcha-TTS/tree/main
|
18 |
+
|
19 |
+
using my fork: https://github.com/phineas-pta/MatchaTTS_ngngngan
|
20 |
+
|
21 |
+
data scraping code: https://github.com/phineas-pta/speech-synthesis-ngngngan
|
22 |
+
|
23 |
+
download checkpoints: https://huggingface.co/doof-ferb/matcha_ngngngan
|
app.py
ADDED
@@ -0,0 +1,122 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
#!/usr/bin/env python3
|
2 |
+
# -*- coding: utf-8 -*-
|
3 |
+
|
4 |
+
import gradio as gr
|
5 |
+
import torch
|
6 |
+
from huggingface_hub import hf_hub_download
|
7 |
+
|
8 |
+
from matcha.cli import get_torch_device, load_matcha, load_vocoder, process_text, to_waveform
|
9 |
+
from matcha.utils.utils import plot_tensor
|
10 |
+
|
11 |
+
|
12 |
+
TITLE="🍵 Matcha-TTS: A fast TTS architecture with conditional flow matching"
|
13 |
+
DESCRIPTION = """# chuyển đổi chuyển văn bản thành giọng nói, sử dụng giọng đọc của nhà văn Nguyễn Ngọc Ngạn
|
14 |
+
|
15 |
+
original: 🍵 https://github.com/shivammehta25/Matcha-TTS
|
16 |
+
|
17 |
+
my personal checkpoints: a speech-synthesis model of Vietnamese M.C. Nguyễn Ngọc Ngạn
|
18 |
+
|
19 |
+
the checkpoints is released under CC-BY-NC-SA-4.0
|
20 |
+
|
21 |
+
In accordance with the terms of the CC-BY-NC-SA-4.0 license, the use of my checkpoints and any audio output generated by them for commercial purposes is strictly prohibited. This includes, but is not limited to:
|
22 |
+
- online and offline voice cloning as a service
|
23 |
+
- online and offline text-to-speech as a service
|
24 |
+
- content creation for monetization on social media platforms
|
25 |
+
|
26 |
+
Căn cứ vào các điều khoản của giấp phép CC-BY-NC-SA-4.0, việc sử dụng các checkpoints này và bất kỳ đầu ra âm thanh nào được tạo bởi chúng đều bị nghiêm cấm sử dụng cho mục đích thương mại. Điều này bao gồm, nhưng không giới hạn ở:
|
27 |
+
- các dịch vụ nhân bản giọng nói trực tuyến và ngoại tuyến
|
28 |
+
- các dịch vụ chuyển văn bản thành giọng nói trực tuyến và ngoại tuyến
|
29 |
+
- tạo nội dung để kiếm tiền trên các nền tảng mạng xã hội"""
|
30 |
+
|
31 |
+
|
32 |
+
DEMO_TEXT_0 = "Đây là một chương trình chuyển đổi văn bản thành giọng nói, sử dụng giọng đọc của nhà văn Nguyễn Ngọc Ngạn"
|
33 |
+
DEMO_TEXT_1 = "Kính thưa quý vị, xin quý vị ghé vào thăm kênh Youtube Nguyễn Ngọc Ngạn, quý vị sẽ gặp lại tất cả các băng đọc truyện của Nguyễn Ngọc Ngạn do Trung tâm Thúy Nga thực hiện và những truyện mới cùng những buổi nói chuyện về nhiều đề tài phổ biến khác nhau. Xin chân thành cảm ơn và chờ đón quý vị."
|
34 |
+
|
35 |
+
|
36 |
+
# model files already pre-downloaded, see README.md >>> preload_from_hub
|
37 |
+
MODEL_PATH = hf_hub_download(repo_id="doof-ferb/matcha_ngngngan", filename="ckpt/checkpoint_epoch420_slim.pt")
|
38 |
+
VOCODER_PATH = hf_hub_download(repo_id="doof-ferb/matcha_ngngngan", filename="hifigan/g_02500000")
|
39 |
+
DEVICE = get_torch_device()
|
40 |
+
MODEL = load_matcha(MODEL_PATH, DEVICE)
|
41 |
+
VOCODER, DENOISER = load_vocoder(VOCODER_PATH, DEVICE)
|
42 |
+
|
43 |
+
|
44 |
+
@torch.inference_mode()
|
45 |
+
def process_text_gradio(text):
|
46 |
+
output = process_text(text, DEVICE)
|
47 |
+
return output["x_phones"][1::2], output["x"], output["x_lengths"]
|
48 |
+
|
49 |
+
|
50 |
+
@torch.inference_mode()
|
51 |
+
def synthesise_mel(text, text_length, n_timesteps, temperature, length_scale):
|
52 |
+
output = MODEL.synthesise(text, text_length, n_timesteps=n_timesteps,temperature=temperature, spks=None, length_scale=length_scale)
|
53 |
+
waveform = to_waveform(output["mel"], VOCODER, DENOISER).numpy()
|
54 |
+
return (22050, waveform), plot_tensor(output["mel"].squeeze().cpu().numpy())
|
55 |
+
# sample rate 22.05 kHz
|
56 |
+
|
57 |
+
|
58 |
+
def example_cacher(text, n_timesteps, mel_temp, length_scale):
|
59 |
+
phones, text, text_lengths = process_text_gradio(text)
|
60 |
+
audio, mel_spectrogram = synthesise_mel(text, text_lengths, n_timesteps, mel_temp, length_scale)
|
61 |
+
return phones, audio, mel_spectrogram
|
62 |
+
|
63 |
+
|
64 |
+
with gr.Blocks(title=TITLE, theme="soft") as demo:
|
65 |
+
processed_text = gr.State(value=None)
|
66 |
+
processed_text_len = gr.State(value=None)
|
67 |
+
|
68 |
+
with gr.Row():
|
69 |
+
gr.Markdown(DESCRIPTION)
|
70 |
+
|
71 |
+
with gr.Group():
|
72 |
+
with gr.Row():
|
73 |
+
text = gr.Textbox(label="nhập văn bản tiếng việt", lines=3)
|
74 |
+
synth_btn = gr.Button("Chuyển thành giọng nói", variant="primary", scale=0, size="lg")
|
75 |
+
with gr.Accordion(label="tuỳ chọn nâng cao", open=False):
|
76 |
+
with gr.Row():
|
77 |
+
n_timesteps = gr.Slider(label="số bước xoá nhiễu", minimum=1, maximum=100, step=1, value=50, interactive=True)
|
78 |
+
length_scale = gr.Slider(label="length scale", info="càng lớn thì đọc càng chậm", minimum=0.5, maximum=1.5, step=0.05, value=.95, interactive=True)
|
79 |
+
mel_temp = gr.Slider(label="sampling temperature", minimum=0.00, maximum=2.001, step=0.16675, value=0.667, interactive=True,)
|
80 |
+
# idk min max of denoiser strength so let it default at 2.5e-4
|
81 |
+
|
82 |
+
with gr.Group():
|
83 |
+
with gr.Row():
|
84 |
+
audio = gr.Audio(label="audio", interactive=False)
|
85 |
+
with gr.Accordion(label="thông tin chuyên sâu", open=False):
|
86 |
+
with gr.Row():
|
87 |
+
phonetised_text = gr.Textbox(label="Văn bản dưới dạng mẫu tự biểu âm quốc tế (IPA)", info="khẩu âm Hà Nội", interactive=False, lines=3)
|
88 |
+
mel_spectrogram = gr.Image(label="mel spectrogram", interactive=False)
|
89 |
+
|
90 |
+
with gr.Row():
|
91 |
+
examples = gr.Examples(
|
92 |
+
label="ví dụ văn bản đầu vào",
|
93 |
+
examples=[
|
94 |
+
[DEMO_TEXT_0, 2, 0.677, 0.95],
|
95 |
+
[DEMO_TEXT_0, 4, 0.677, 0.95],
|
96 |
+
[DEMO_TEXT_0, 10, 0.677, 0.95],
|
97 |
+
[DEMO_TEXT_0, 50, 0.677, 0.95],
|
98 |
+
[DEMO_TEXT_1, 50, 0.677, 0.95],
|
99 |
+
],
|
100 |
+
fn=example_cacher,
|
101 |
+
inputs=[text, n_timesteps, mel_temp, length_scale],
|
102 |
+
outputs=[phonetised_text, audio, mel_spectrogram],
|
103 |
+
cache_examples=True,
|
104 |
+
)
|
105 |
+
|
106 |
+
with gr.Row():
|
107 |
+
gr.Markdown("[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/#fileId=https://huggingface.co/spaces/doof-ferb/MatchaTTS_ngngngan/blob/main/colab-notebook.ipynb)")
|
108 |
+
|
109 |
+
synth_btn.click(
|
110 |
+
fn=process_text_gradio,
|
111 |
+
inputs=[text],
|
112 |
+
outputs=[phonetised_text, processed_text, processed_text_len],
|
113 |
+
api_name="phonemize",
|
114 |
+
queue=True,
|
115 |
+
).then(
|
116 |
+
fn=synthesise_mel,
|
117 |
+
inputs=[processed_text, processed_text_len, n_timesteps, mel_temp, length_scale],
|
118 |
+
outputs=[audio, mel_spectrogram],
|
119 |
+
api_name="speak",
|
120 |
+
)
|
121 |
+
|
122 |
+
demo.queue(default_concurrency_limit=5).launch()
|
colab-notebook.ipynb
ADDED
@@ -0,0 +1,66 @@
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
1 |
+
{
|
2 |
+
"cells": [
|
3 |
+
{
|
4 |
+
"cell_type": "code",
|
5 |
+
"execution_count": null,
|
6 |
+
"metadata": {},
|
7 |
+
"outputs": [],
|
8 |
+
"source": [
|
9 |
+
"!apt-get install espeak-ng\n",
|
10 |
+
"%pip install -q git+https://github.com/phineas-pta/MatchaTTS_ngngngan.git\n",
|
11 |
+
"\n",
|
12 |
+
"import IPython.display as ipd\n",
|
13 |
+
"import torch\n",
|
14 |
+
"from huggingface_hub import hf_hub_download\n",
|
15 |
+
"from matcha.cli import get_torch_device, load_matcha, load_vocoder, process_text, to_waveform\n",
|
16 |
+
"\n",
|
17 |
+
"MODEL_PATH = hf_hub_download(repo_id=\"doof-ferb/matcha_ngngngan\", filename=\"ckpt/checkpoint_epoch420_slim.pt\")\n",
|
18 |
+
"VOCODER_PATH = hf_hub_download(repo_id=\"doof-ferb/matcha_ngngngan\", filename=\"hifigan/g_02500000\")\n",
|
19 |
+
"DEVICE = get_torch_device()\n",
|
20 |
+
"MODEL = load_matcha(MODEL_PATH, DEVICE)\n",
|
21 |
+
"VOCODER, DENOISER = load_vocoder(VOCODER_PATH, DEVICE)\n",
|
22 |
+
"\n",
|
23 |
+
"@torch.inference_mode()\n",
|
24 |
+
"def tts(text, n_timesteps, temperature, length_scale, denoiser_strength):\n",
|
25 |
+
"\ttmp0 = process_text(text, DEVICE)\n",
|
26 |
+
"\tphones, txt, txt_len = tmp0[\"x_phones\"][1::2], tmp0[\"x\"], tmp0[\"x_lengths\"]\n",
|
27 |
+
"\toutput = MODEL.synthesise(txt, txt_len, n_timesteps=n_timesteps, temperature=temperature, spks=None, length_scale=length_scale)\n",
|
28 |
+
"\twaveform = to_waveform(output[\"mel\"], VOCODER, DENOISER, denoiser_strength=denoiser_strength).numpy()\n",
|
29 |
+
"\tipd.display(ipd.Audio(waveform, rate=22050))\n",
|
30 |
+
"\tipd.display(ipd.Markdown(\"Văn bản dưới dạng mẫu tự biểu âm quốc tế (IPA), khẩu âm Hà Nội\\n\\n\" + phones))"
|
31 |
+
]
|
32 |
+
},
|
33 |
+
{
|
34 |
+
"cell_type": "code",
|
35 |
+
"execution_count": null,
|
36 |
+
"metadata": {},
|
37 |
+
"outputs": [],
|
38 |
+
"source": [
|
39 |
+
"tts(\n",
|
40 |
+
"\"\"\"Kính thưa quý vị, xin quý vị ghé vào thăm kênh Youtube Nguyễn Ngọc Ngạn,\n",
|
41 |
+
"quý vị sẽ gặp lại tất cả các băng đọc truyện của Nguyễn Ngọc Ngạn do Trung tâm Thúy Nga thực hiện\n",
|
42 |
+
"và những truyện mới cùng những buổi nói chuyện về nhiều đề tài phổ biến khác nhau.\n",
|
43 |
+
"Xin chân thành cảm ơn và chờ đón quý vị.\"\"\",\n",
|
44 |
+
"n_timesteps=50, temperature=0.667, length_scale=.95, denoiser_strength=2.5e-4\n",
|
45 |
+
")"
|
46 |
+
]
|
47 |
+
}
|
48 |
+
],
|
49 |
+
"metadata": {
|
50 |
+
"colab": {
|
51 |
+
"private_outputs": true,
|
52 |
+
"provenance": [],
|
53 |
+
"gpuType": "T4"
|
54 |
+
},
|
55 |
+
"kernelspec": {
|
56 |
+
"name": "python3",
|
57 |
+
"display_name": "Python 3"
|
58 |
+
},
|
59 |
+
"language_info": {
|
60 |
+
"name": "python"
|
61 |
+
},
|
62 |
+
"accelerator": "GPU"
|
63 |
+
},
|
64 |
+
"nbformat": 4,
|
65 |
+
"nbformat_minor": 0
|
66 |
+
}
|
packages.txt
ADDED
@@ -0,0 +1 @@
|
|
|
|
|
1 |
+
espeak-ng
|
requirements.txt
ADDED
@@ -0,0 +1,2 @@
|
|
|
|
|
|
|
1 |
+
git+https://github.com/phineas-pta/MatchaTTS_ngngngan.git
|
2 |
+
# --find-links=https://download.pytorch.org/whl/torch_stable.html
|