File size: 2,722 Bytes
16270ef
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
import os
os.environ.setdefault("MPLBACKEND", "Agg")

import gradio as gr
import sherpa_onnx
import tempfile
from huggingface_hub import hf_hub_download

MODEL_REPO = "willwade/mms-tts-multilingual-models-onnx"
MODEL_FILE = "bak/model.onnx"
TOKENS_FILE = "bak/tokens.txt"

model_path = hf_hub_download(repo_id=MODEL_REPO, filename=MODEL_FILE)
tokens_path = hf_hub_download(repo_id=MODEL_REPO, filename=TOKENS_FILE)

config = sherpa_onnx.OfflineTtsConfig(
    model=sherpa_onnx.OfflineTtsModelConfig(
        vits=sherpa_onnx.OfflineTtsVitsModelConfig(
            model=model_path,
            tokens=tokens_path,
            noise_scale=0.667,
            length_scale=1.0,
            noise_scale_w=0.8,
        ),
        num_threads=2,
    ),
)

tts = sherpa_onnx.OfflineTts(config)


def tts_fn(text):
    if not text.strip():
        return None

    audio = tts.generate(text.strip(), sid=0, speed=1.0)
    samples = audio.samples

    tmp = tempfile.NamedTemporaryFile(delete=False, suffix=".wav")
    sherpa_onnx.write_wave(tmp.name, samples, audio.sample_rate)
    return tmp.name


app = gr.Blocks(title="Башҡортса TTS")

with app:
    gr.Markdown("# 🎙️ Башҡортса TTS")
    gr.Markdown(
        "Офлайн озвучка текста на башкирском. "
        "Модель: MMS-TTS (Meta) via sherpa-onnx"
    )

    with gr.Row():
        with gr.Column(scale=3):
            text = gr.Textbox(
                label="Текст (башкирский кириллица)",
                placeholder="Бөгөн көн бик матур...",
                lines=6,
                value="Бөгөн көн бик матур. Һаумыһығыҙ, хәлдәрегеҙ нисек?",
            )
            with gr.Row():
                btn = gr.Button("▶ Озвучить", variant="primary")
                clear = gr.Button("✕ Очистить")

        with gr.Column(scale=2):
            audio = gr.Audio(label="Аудио", type="filepath")
            status = gr.Textbox(
                label="Статус", value="Готов", interactive=False
            )

    btn.click(fn=tts_fn, inputs=text, outputs=audio, api_name="predict")
    text.submit(fn=tts_fn, inputs=text, outputs=audio)
    clear.click(lambda: ("", None, "Готов"), None, [text, audio, status])

    gr.Markdown("---")
    gr.Markdown(
        "Сәләм, быны мин эшләнем — "
        "[instagram.com/ttaymas](https://instagram.com/ttaymas)"
    )
    gr.Markdown(
        "**Модель:** facebook/mms-tts-bak (VITS) · "
        "**Лицензия:** CC-BY-NC 4.0"
    )

if __name__ == "__main__":
    app.launch(server_name="0.0.0.0", server_port=7860)