sakhrearasp commited on
Commit
50139e9
·
verified ·
1 Parent(s): 163df47

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +65 -26
app.py CHANGED
@@ -1,33 +1,72 @@
1
  import gradio as gr
2
- import torch
3
- from speechbrain.pretrained import Tacotron2, HIFIGAN
4
- import soundfile as sf
 
5
 
6
- device = "cuda" if torch.cuda.is_available() else "cpu"
 
 
 
 
7
 
8
- # Load the Tacotron2 model
9
- tacotron2 = Tacotron2.from_hparams(source="speechbrain/tts-tacotron2-ljspeech", savedir="tmpdir_tts").to(device)
 
 
 
 
 
 
 
 
 
 
 
 
 
10
 
11
- # Load the HIFIGAN vocoder
12
- hifi_gan = HIFIGAN.from_hparams(source="speechbrain/tts-hifigan-ljspeech", savedir="tmpdir_vocoder").to(device)
 
 
 
13
 
14
- def text_to_speech(text):
15
- # Process the text with Tacotron2
16
- mel_output, mel_length, alignment = tacotron2.encode_text(text)
17
- # Generate the waveform with HIFIGAN
18
- waveforms = hifi_gan.decode_mel(mel_output)
19
- # Move the waveform to CPU and convert to numpy array
20
- waveform = waveforms.squeeze(1).detach().cpu().numpy()
21
- # Save the waveform to a file
22
- sf.write("output.wav", waveform, samplerate=22050)
23
- return "output.wav"
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
24
 
25
- iface = gr.Interface(
26
- fn=text_to_speech,
27
- inputs=gr.Textbox(lines=2, placeholder="متن خود را اینجا وارد کنید..."),
28
- outputs="audio",
29
- title="تبدیل متن فارسی به صدا",
30
- description="متن فارسی خود را وارد کنید تا صدای آن را دریافت کنید.",
31
- )
32
 
33
- iface.launch()
 
 
1
  import gradio as gr
2
+ import edge_tts
3
+ import asyncio
4
+ import tempfile
5
+ import os
6
 
7
+ # دریافت و فیلتر صداهای فارسی (fa-IR)
8
+ async def get_voices():
9
+ voices = await edge_tts.list_voices()
10
+ persian_voices = [v for v in voices if v['Locale'] == 'fa-IR']
11
+ return {f"{v['ShortName']} - {v['Locale']} ({v['Gender']})": v['ShortName'] for v in persian_voices}
12
 
13
+ # تبدیل متن به گفتار به زبان فارسی
14
+ async def text_to_speech(text, voice, rate, pitch):
15
+ if not text.strip():
16
+ return None, "لطفاً متنی جهت تبدیل وارد کنید."
17
+ if not voice:
18
+ return None, "لطفاً یک صدا انتخاب کنید."
19
+
20
+ voice_short_name = voice.split(" - ")[0]
21
+ rate_str = f"{rate:+d}%"
22
+ pitch_str = f"{pitch:+d}Hz"
23
+ communicate = edge_tts.Communicate(text, voice_short_name, rate=rate_str, pitch=pitch_str)
24
+ with tempfile.NamedTemporaryFile(delete=False, suffix=".mp3") as tmp_file:
25
+ tmp_path = tmp_file.name
26
+ await communicate.save(tmp_path)
27
+ return tmp_path, None
28
 
29
+ async def tts_interface(text, voice, rate, pitch):
30
+ audio, warning = await text_to_speech(text, voice, rate, pitch)
31
+ if warning:
32
+ return audio, gr.Warning(warning)
33
+ return audio, None
34
 
35
+ async def create_demo():
36
+ voices = await get_voices()
37
+
38
+ description = """
39
+ متن فارسی خود را وارد کنید تا به صدای طبیعی تبدیل شود.
40
+ این برنامه از Microsoft Edge TTS برای تبدیل متن به گفتار فارسی استفاده می‌کند.
41
+ سرعت و تن صدا قابل تنظیم است: مقدار 0 پیش‌فرض است؛ مقادیر مثبت سرعت یا تن را افزایش و مقادیر منفی کاهش می‌دهند.
42
+ توجه: این برنامه تنها از صداهای فارسی پشتیبانی می‌کند.
43
+ """
44
+
45
+ demo = gr.Interface(
46
+ fn=tts_interface,
47
+ inputs=[
48
+ gr.Textbox(label="متن ورودی (فارسی)", lines=5),
49
+ gr.Dropdown(choices=[""] + list(voices.keys()), label="انتخاب صدا", value=""),
50
+ gr.Slider(minimum=-50, maximum=50, value=0, label="تنظیم سرعت گفتار (%)", step=1),
51
+ gr.Slider(minimum=-20, maximum=20, value=0, label="تنظیم تن صدا (Hz)", step=1)
52
+ ],
53
+ outputs=[
54
+ gr.Audio(label="صدای تولید شده", type="filepath"),
55
+ gr.Markdown(label="هشدار", visible=False)
56
+ ],
57
+ title="تبدیل متن به گفتار فارسی (Microsoft Edge TTS)",
58
+ description=description,
59
+ article="این برنامه از Microsoft Edge TTS برای تبدیل متن فارسی به گفتار استفاده می‌کند.",
60
+ analytics_enabled=False,
61
+ allow_flagging="manual",
62
+ api_name=None
63
+ )
64
+ return demo
65
 
66
+ async def main():
67
+ demo = await create_demo()
68
+ demo.queue(default_concurrency_limit=5)
69
+ demo.launch(show_api=False)
 
 
 
70
 
71
+ if __name__ == "__main__":
72
+ asyncio.run(main())