File size: 3,848 Bytes
2070617
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7ee3665
2070617
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
7ee3665
 
 
2070617
7ee3665
 
 
2070617
7ee3665
 
 
 
2070617
7ee3665
 
 
 
 
 
 
 
 
 
2070617
 
 
 
 
 
 
 
 
 
 
 
 
 
7ee3665
 
2070617
7ee3665
2070617
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
e343100
2070617
 
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
94
95
96
97
98
99
import tempfile
import os
import gradio as gr
from TTS.config import load_config
from TTS.utils.manage import ModelManager
from TTS.utils.synthesizer import Synthesizer
from TTS.utils.download import download_url

MODEL_NAMES = [
    "vits male1 (best)",
    "vits female (best)",
    "vits-male",
    "vits female1",
    "glowtts-male",
    "glowtts-female",
    "female tacotron2"
]

MAX_TXT_LEN = 800
MODELS_DIRECTORY = "models"

modelInfo = [
    ["vits-male", "best_model_65633.pth", "config-0.json",
     "https://huggingface.co/Kamtera/persian-tts-male-vits/resolve/main/"],
    ["vits female (best)", "checkpoint_48000.pth", "config-2.json",
     "https://huggingface.co/Kamtera/persian-tts-female-vits/resolve/main/"],
    ["glowtts-male", "best_model_77797.pth", "config-1.json",
     "https://huggingface.co/Kamtera/persian-tts-male-glow_tts/resolve/main/"],
    ["glowtts-female", "best_model.pth", "config.json",
     "https://huggingface.co/Kamtera/persian-tts-female-glow_tts/resolve/main/"],
    ["vits male1 (best)", "checkpoint_88000.pth", "config.json",
     "https://huggingface.co/Kamtera/persian-tts-male1-vits/resolve/main/"],
    ["vits female1", "checkpoint_50000.pth", "config.json",
     "https://huggingface.co/Kamtera/persian-tts-female1-vits/resolve/main/"],
    ["female tacotron2", "checkpoint_313000.pth", "config-2.json",
     "https://huggingface.co/Kamtera/persian-tts-female-tacotron2/resolve/main/"]
]

class PersianTTS:
    def __init__(self):
        self.model_manager = ModelManager(MODELS_DIRECTORY)

        for model in modelInfo:
            model_name, model_filename, config_filename, model_url = model
            self.model_manager.download_model(model_name, model_filename, config_filename, model_url)

    def tts(self, text: str, model_name: str):
        if len(text) > MAX_TXT_LEN:
            text = text[:MAX_TXT_LEN]
            print(f"Input text was cutoff since it went over the {MAX_TXT_LEN} character limit.")

        # synthesize
        model_path, config_path = self.model_manager.get_model_paths(model_name)
        synthesizer = Synthesizer(model_path, config_path)
        if synthesizer is None:
            raise NameError("model not found")
        wavs = synthesizer.tts(text)
        # return output
        with tempfile.NamedTemporaryFile(suffix=".wav", delete=False) as fp:
            synthesizer.save_wav(wavs, fp)
            return fp.name



article = ""
examples = [
    ["و خداوند شما را با ارسال روح در جسم زندگانی و حیات بخشید", "vits-male"],
    ["تاجر تو چه تجارت می کنی ، تو را چه که چه تجارت می کنم؟", "vits female (best)"],
    ["شیش سیخ جیگر سیخی شیش هزار", "vits female (best)"],
    ["سه شیشه شیر ، سه سیر سرشیر", "vits female (best)"],
    ["دزدی دزدید ز بز دزدی بزی ، عجب دزدی که دزدید ز بز دزدی بزی", "vits male1 (best)"],
    ["مثنوی یکی از قالب های شعری است ک هر بیت قافیه ی جداگانه دارد", "vits female1"],
    ["در گلو ماند خس او سالها، چیست آن خس مهر جاه و مالها", "vits male1 (best)"],
]

persian_tts = PersianTTS()

iface = gr.Interface(
    fn=persian_tts.tts,
    inputs=[
        gr.Textbox(
            label="Text",
            value="زندگی فقط یک بار است؛ از آن به خوبی استفاده کن",
        ),
        gr.Radio(
            label="Pick a TTS Model ",
            choices=MODEL_NAMES,
            value="vits-female",
        ),
    ],
    outputs=gr.Audio(label="Output", type='filepath'),
    examples=examples,
    title="🗣️ Persian tts 🗣️",
    description=description,
    article=article,
    live=False
)
iface.launch(share=False)