File size: 3,469 Bytes
eb8c82c
 
 
 
 
49fc4a4
 
c7de0f6
b663da0
f9e5028
b75a2aa
f9e5028
 
 
 
eb8c82c
49fc4a4
 
 
 
 
 
 
 
 
 
 
1ce668d
 
 
 
49fc4a4
1ce668d
 
49fc4a4
1ce668d
 
eb8c82c
3fbcb48
f64a87d
1ce668d
 
 
 
 
 
f64a87d
f9e5028
349b2ad
 
 
 
 
 
b75a2aa
b231da2
349b2ad
b75a2aa
eb8c82c
b75a2aa
 
 
eb8c82c
 
 
 
 
 
 
 
ac7672f
eb8c82c
f9e5028
 
 
 
eb8c82c
 
49fc4a4
eb8c82c
8472231
3e61708
3fbcb48
 
f9e5028
 
1ce668d
 
349b2ad
f9e5028
eb8c82c
f9e5028
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
88
89
90
91
92
93
import tempfile

import gradio as gr

from TTS.utils.synthesizer import Synthesizer
import requests
from os.path import exists
from formatter import preprocess_text
from datetime import datetime
from enum import Enum
import torch

class StressOption(Enum):
    ManualStress = "Наголоси вручну"
    AutomaticStress = "Автоматичні наголоси (Beta)"


def download(url, file_name):
    if not exists(file_name):
        print(f"Downloading {file_name}")
        r = requests.get(url, allow_redirects=True)
        with open(file_name, 'wb') as file:
            file.write(r.content)
    else:
        print(f"Found {file_name}. Skipping download...")


print("downloading uk/mykyta/vits-tts")
release_number = "v2.0.0-beta"
model_link = f"https://github.com/robinhad/ukrainian-tts/releases/download/{release_number}/model-inference.pth"
config_link = f"https://github.com/robinhad/ukrainian-tts/releases/download/{release_number}/config.json"

model_path = "model.pth"
config_path = "config.json"

download(model_link, model_path)
download(config_link, config_path)

badge = "https://visitor-badge-reloaded.herokuapp.com/badge?page_id=robinhad.ukrainian-tts"

synthesizer = Synthesizer(
    model_path, config_path, None, None, None,
)

if synthesizer is None:
    raise NameError("model not found")

def tts(text: str, stress: str):
    print("============================")
    print("Original text:", text)
    print("Stress:", stress)
    print("Time:", datetime.utcnow())
    autostress = True if stress == StressOption.AutomaticStress.value else False
    text = preprocess_text(text, autostress)
    text_limit = 1200
    text = text if len(text) < text_limit else text[0:text_limit] # mitigate crashes on hf space
    print("Converted:", text)

    with tempfile.NamedTemporaryFile(suffix=".wav", delete=False) as fp:
        with torch.no_grad():
            wavs = synthesizer.tts(text)
            synthesizer.save_wav(wavs, fp)
        return fp.name


iface = gr.Interface(
    fn=tts,
    inputs=[
        gr.inputs.Textbox(
            label="Input",
            default="Введ+іть, б+удь л+аска, сво+є р+ечення.",
        ),
        gr.inputs.Radio(
            label="Опції",
            choices=[option.value for option in StressOption],
        ),
    ],
    outputs=gr.outputs.Audio(label="Output"),
    title="🐸💬🇺🇦 - Coqui TTS",
    theme="huggingface",
    description="Україномовний🇺🇦 TTS за допомогою Coqui TTS (для наголосу використовуйте + перед голосною)",
    article="Якщо вам подобається, підтримайте за посиланням: [SUPPORT LINK](https://send.monobank.ua/jar/48iHq4xAXm),  " +
    "Github: [https://github.com/robinhad/ukrainian-tts](https://github.com/robinhad/ukrainian-tts)" + 
    f"<center><img src=\"{badge}\" alt=\"visitors badge\"/></center>",
    examples=[
        ["Введ+іть, б+удь л+аска, сво+є р+ечення.", StressOption.ManualStress.value],
        ["Введіть, будь ласка, своє речення.", StressOption.ManualStress.value],
        ["Привіт, як тебе звати?", StressOption.AutomaticStress.value],
        ["Договір підписано 4 квітня 1949 року.", StressOption.AutomaticStress.value],
    ]
)
iface.launch(enable_queue=True, prevent_thread_lock=True)