alidw commited on
Commit
4a37de7
·
verified ·
1 Parent(s): b050106

Create app.py

Browse files
Files changed (1) hide show
  1. app.py +146 -0
app.py ADDED
@@ -0,0 +1,146 @@
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
+ import gradio as gr
2
+ import numpy as np
3
+ from tts_arabic import tts as arabic_tts
4
+
5
+ # حسب كارت الموديل، الـ vocoder يخرج 22.05 kHz
6
+ SAMPLE_RATE = 22050
7
+
8
+
9
+ def generate_tts(
10
+ text,
11
+ speaker,
12
+ pace,
13
+ denoise,
14
+ volume,
15
+ vowelizer,
16
+ model_id,
17
+ vocoder_id,
18
+ ):
19
+ text = (text or "").strip()
20
+ if not text:
21
+ return None, "❌ الرجاء إدخال نص عربي."
22
+
23
+ # اختيار موديول التشكيل
24
+ if vowelizer == "بدون تشكيل":
25
+ vowelizer_arg = None
26
+ else:
27
+ vowelizer_arg = vowelizer # مثل: "shakkelha" أو "catt_eo"
28
+
29
+ try:
30
+ # استدعاء مكتبة tts_arabic
31
+ wave = arabic_tts(
32
+ text,
33
+ speaker=int(speaker), # 0–3
34
+ pace=float(pace), # سرعة الكلام
35
+ denoise=float(denoise), # إزالة الضوضاء
36
+ volume=float(volume), # مستوى الصوت
37
+ play=False, # لا نستخدم تشغيل داخلي
38
+ pitch_mul=1.0,
39
+ pitch_add=0.0,
40
+ vowelizer=vowelizer_arg, # موديول التشكيل أو None
41
+ model_id=model_id, # fastpitch / mixer128 / mixer80
42
+ vocoder_id=vocoder_id, # hifigan / vocos / vocos44
43
+ cuda=None, # CPU فقط
44
+ save_to=None, # لا نحفظ تلقائيًا
45
+ )
46
+
47
+ # wave هو numpy array
48
+ if isinstance(wave, list):
49
+ wave = np.array(wave, dtype=np.float32)
50
+
51
+ return (SAMPLE_RATE, wave), "✅ تم توليد الصوت بنجاح."
52
+ except Exception as e:
53
+ return None, f"❌ حدث خطأ أثناء التوليد: {e}"
54
+
55
+
56
+ with gr.Blocks(title="Arabic TTS (ONNX / CPU)") as demo:
57
+ gr.Markdown(
58
+ """
59
+ # 🔊 Arabic TTS (FastPitch + HiFi-GAN ONNX)
60
+
61
+ نموذج تحويل النص العربي إلى كلام، خفيف وسريع، يعمل بالكامل على **CPU المجاني** في Hugging Face.
62
+
63
+ - يدعم ٤ متحدثين (0–3)
64
+ - يمكن استخدام تشكيل تلقائي للنص لتحسين النطق
65
+ - مبني على مكتبة [`tts_arabic`](https://github.com/nipponjo/tts_arabic)
66
+ """
67
+ )
68
+
69
+ with gr.Row():
70
+ text = gr.Textbox(
71
+ label="النص العربي",
72
+ lines=4,
73
+ placeholder="اكتب هنا الجملة أو الفقرة التي تريد تحويلها إلى صوت...",
74
+ )
75
+
76
+ with gr.Row():
77
+ speaker = gr.Dropdown(
78
+ choices=["0", "1", "2", "3"],
79
+ value="1",
80
+ label="المتحدث (Speaker ID)",
81
+ info="جرّب أرقام مختلفة لاختيار صوت مختلف.",
82
+ )
83
+ pace = gr.Slider(
84
+ minimum=0.6,
85
+ maximum=1.4,
86
+ value=1.0,
87
+ step=0.05,
88
+ label="سرعة الكلام (pace)",
89
+ )
90
+
91
+ with gr.Row():
92
+ denoise = gr.Slider(
93
+ minimum=0.0,
94
+ maximum=0.02,
95
+ value=0.005,
96
+ step=0.001,
97
+ label="إزالة الضوضاء (denoise)",
98
+ )
99
+ volume = gr.Slider(
100
+ minimum=0.4,
101
+ maximum=1.0,
102
+ value=0.9,
103
+ step=0.05,
104
+ label="مستوى الصوت (volume)",
105
+ )
106
+
107
+ vowelizer = gr.Dropdown(
108
+ choices=["بدون تشكيل", "shakkelha", "catt_eo"],
109
+ value="بدون تشكيل",
110
+ label="تشكيل تلقائي للنص (Vowelizer)",
111
+ info="اختَر 'shakkelha' لتحسين النطق إذا كان النص غير مشكّل (أبطأ قليلاً).",
112
+ )
113
+
114
+ with gr.Row():
115
+ model_id = gr.Radio(
116
+ choices=["fastpitch", "mixer128", "mixer80"],
117
+ value="fastpitch",
118
+ label="موديل Text→Mel",
119
+ info="fastpitch عادةً أعلى جودة، mixer أسرع وأخف.",
120
+ )
121
+ vocoder_id = gr.Radio(
122
+ choices=["hifigan", "vocos", "vocos44"],
123
+ value="hifigan",
124
+ label="Vocoder",
125
+ info="vocos44 يعطي جودة أعلى (44.1kHz) لكنه أبطأ قليلاً.",
126
+ )
127
+
128
+ btn = gr.Button("🎙️ توليد الصوت")
129
+
130
+ out_audio = gr.Audio(
131
+ label="الصوت الناتج",
132
+ type="numpy",
133
+ )
134
+ status = gr.Textbox(
135
+ label="الحالة",
136
+ interactive=False,
137
+ )
138
+
139
+ btn.click(
140
+ fn=generate_tts,
141
+ inputs=[text, speaker, pace, denoise, volume, vowelizer, model_id, vocoder_id],
142
+ outputs=[out_audio, status],
143
+ )
144
+
145
+ if __name__ == "__main__":
146
+ demo.launch()