Skip to content

Commit 9e6d22d

Browse files
committed
Add Arabic Voice Generation App
تطبيق توليدي للأصوات العربية - تطبيق شامل لتحويل النص العربي إلى كلام باستخدام تقنيات مفتوحة المصدر. الملفات المضافة: - requirements.txt: المكتبات المطلوبة للمشروع - tts_model.py: نموذج تحويل النص إلى كلام باستخدام SpeechBrain - app.py: واجهة المستخدم التفاعلية باستخدام Gradio - README.md: دليل الاستخدام والتثبيت - utils.py: أدوات مساعدة لمعالجة النص العربي - config.py: إعدادات التطبيق الميزات الرئيسية: - تحويل النص العربي إلى كلام بجودة عالية - واجهة مستخدم سهلة وتفاعلية - إمكانية تعديل سرعة القراءة - يعتمد بالكامل على مكتبات مفتوحة المصدر (SpeechBrain, Tacotron2, HIFIGAN)
1 parent dcd9f2a commit 9e6d22d

6 files changed

Lines changed: 272 additions & 0 deletions

File tree

Lines changed: 51 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,51 @@
1+
# تطبيق توليدي للأصوات العربية
2+
3+
تطبيق بسيط وسريع لتحويل النص العربي إلى كلام باستخدام تقنيات مفتوحة المصدر.
4+
5+
## الميزات
6+
7+
- 🗣️ تحويل النص العربي إلى كلام بجودة عالية
8+
- 🌐 واجهة مستخدم تفاعلية سهلة الاستخدام
9+
- ⚡ سريع وفعال في التوليد
10+
- 📦 يعتمد على مكتبات مفتوحة المصدر بالكامل
11+
- 🎛️ إمكانية تعديل سرعة القراءة
12+
13+
## المتطلبات
14+
15+
- Python 3.7+
16+
- مكتبات Python المذكورة في ملف `requirements.txt`
17+
18+
## التثبيت
19+
20+
1. تثبيت المكتبات المطلوبة:
21+
```bash
22+
pip install -r requirements.txt
23+
```
24+
25+
2. تشغيل التطبيق:
26+
```bash
27+
python app.py
28+
```
29+
30+
3. فتح المتصفح على العنوان: http://localhost:7860
31+
32+
## الاستخدام
33+
34+
1. أدخل النص العربي في مربع النص
35+
2. اضبط سرعة القراءة حسب الرغبة
36+
3. انقر على زر "تحويل إلى كلام"
37+
4. استمع إلى الصوت المُوَلَّد أو نزّله
38+
39+
## التقنيات المستخدمة
40+
41+
- **SpeechBrain**: إطار عمل مفتوح المصدر للتعلم العميق في معالجة الكلام
42+
- **Tacotron2**: نموذج توليدي للكلام متقدم
43+
- **HIFIGAN**: نموذج لتوليد الصوت عالي الجودة
44+
- **Gradio**: لإنشاء واجهة المستخدم التفاعلية
45+
46+
## التخصيص
47+
48+
يمكنك تعديل النموذج لإضافة:
49+
- أصوات مختلفة
50+
- لهجات عربية متنوعة
51+
- تعديلات على سرعة القراءة والطبقة الصوتية

arabic-voice-generation-app/app.py

Lines changed: 85 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,85 @@
1+
import gradio as gr
2+
import numpy as np
3+
from tts_model import ArabicTTS
4+
import os
5+
6+
# تهيئة نموذج تحويل النص إلى كلام
7+
tts = ArabicTTS()
8+
9+
def generate_speech(text, speed=1.0):
10+
"""
11+
توليد الصوت من النص العربي
12+
13+
Args:
14+
text (str): النص العربي
15+
speed (float): سرعة القراءة (0.5-2.0)
16+
17+
Returns:
18+
tuple: (معدل العينة, الصوت المُوَلَّد)
19+
"""
20+
if not text.strip():
21+
return None, "الرجاء إدخال نص للتحويل"
22+
23+
# توليد الصوت
24+
audio = tts.text_to_speech(text)
25+
26+
if audio is not None:
27+
# تعديل سرعة القراءة إذا لزم الأمر
28+
if speed != 1.0:
29+
# يمكن إضافة تعديل السرعة هنا
30+
pass
31+
32+
# حفظ الصوت مؤقتًا
33+
temp_filename = "temp_output.wav"
34+
tts.save_audio(audio, temp_filename)
35+
36+
# إرجاع الصوت للواجهة
37+
return (22050, audio), None
38+
else:
39+
return None, "حدث خطأ في توليد الصوت"
40+
41+
# إنشاء واجهة المستخدم
42+
with gr.Blocks(title="تطبيق توليدي للأصوات العربية") as demo:
43+
gr.Markdown("# 🗣️ تطبيق توليدي للأصوات العربية")
44+
gr.Markdown("تحويل النص العربي إلى كلام باستخدام تقنيات مفتوحة المصدر")
45+
46+
with gr.Row():
47+
with gr.Column():
48+
text_input = gr.Textbox(
49+
label="أدخل النص العربي",
50+
placeholder="اكتب النص الذي تريد تحويله إلى كلام...",
51+
lines=5
52+
)
53+
speed_slider = gr.Slider(
54+
minimum=0.5,
55+
maximum=2.0,
56+
value=1.0,
57+
label="سرعة القراءة"
58+
)
59+
generate_btn = gr.Button("تحويل إلى كلام", variant="primary")
60+
61+
with gr.Column():
62+
audio_output = gr.Audio(label="الصوت المُوَلَّد")
63+
error_output = gr.Textbox(label="رسائل الخطأ", interactive=False)
64+
65+
generate_btn.click(
66+
fn=generate_speech,
67+
inputs=[text_input, speed_slider],
68+
outputs=[audio_output, error_output]
69+
)
70+
71+
gr.Markdown("### أمثلة للنصوص العربية:")
72+
gr.Examples(
73+
examples=[
74+
"السلام عليكم ورحمة الله وبركاته",
75+
"مرحباً بك في تطبيق تحويل النص إلى كلام",
76+
"هذا التطبيق يستخدم تقنيات مفتوحة المصدر",
77+
"يمكنك كتابة أي نص عربي وسيتم تحويله إلى كلام",
78+
"نأمل أن تجد هذا التطبيق مفيداً"
79+
],
80+
inputs=text_input
81+
)
82+
83+
# تشغيل التطبيق
84+
if __name__ == "__main__":
85+
demo.launch(server_name="0.0.0.0", server_port=7860)
Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,17 @@
1+
# إعدادات الصوت
2+
AUDIO_SAMPLE_RATE = 22050
3+
AUDIO_CHANNELS = 1
4+
5+
# إعدادات النموذج
6+
MODEL_CONFIG = {
7+
"g2p_model": "speechbrain/tts_models/arabic-tacotron2-collab",
8+
"tts_model": "speechbrain/tts_models/arabic-tacotron2-collab",
9+
"vocoder_model": "speechbrain/tts_models/arabic-hifigan-collab"
10+
}
11+
12+
# إعدادات الواجهة
13+
INTERFACE_CONFIG = {
14+
"title": "تطبيق توليدي للأصوات العربية",
15+
"server_name": "0.0.0.0",
16+
"server_port": 7860
17+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
torch>=1.13.0
2+
torchaudio>=0.13.0
3+
transformers>=4.21.0
4+
speechbrain>=0.5.12
5+
librosa>=0.9.2
6+
soundfile>=0.10.3
7+
numpy>=1.21.0
8+
gradio>=3.24.1
9+
huggingface_hub>=0.12.0
Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
import torch
2+
import torchaudio
3+
from speechbrain.inference.text import GraphemeToPhoneme
4+
from speechbrain.inference.TTS import Tacotron2
5+
from speechbrain.inference.vocoders import HIFIGAN
6+
import numpy as np
7+
import librosa
8+
9+
class ArabicTTS:
10+
def __init__(self):
11+
"""تهيئة نموذج تحويل النص إلى كلام للغة العربية"""
12+
# تحميل نموذج تحويل الحروف إلى أصوات (Grapheme-to-Phoneme)
13+
self.g2p = GraphemeToPhoneme.from_hparams(
14+
"speechbrain/tts_models/arabic-tacotron2-collab",
15+
savedir="pretrained_models/g2p"
16+
)
17+
18+
# تحميل نموذج Tacotron2 للغة العربية
19+
self.tts_model = Tacotron2.from_hparams(
20+
"speechbrain/tts_models/arabic-tacotron2-collab",
21+
savedir="pretrained_models/tts"
22+
)
23+
24+
# تحميل نموذج HIFIGAN لتوليد الصوت عالي الجودة
25+
self.vocoder = HIFIGAN.from_hparams(
26+
"speechbrain/tts_models/arabic-hifigan-collab",
27+
savedir="pretrained_models/vocoder"
28+
)
29+
30+
def text_to_speech(self, text):
31+
"""
32+
تحويل النص العربي إلى كلام
33+
34+
Args:
35+
text (str): النص العربي المراد تحويله
36+
37+
Returns:
38+
numpy.ndarray: الصوت المُوَلَّد
39+
"""
40+
try:
41+
# تحويل النص إلى صوتيفات (Phonemes)
42+
phonemes = self.g2p.g2p(text)
43+
print(f"النصوص الصوتية: {phonemes}")
44+
45+
# إنشاء التمثيل الطيفي للصوت
46+
mel_spec, _, _ = self.tts_model.encode_text(phonemes)
47+
48+
# تحويل التمثيل الطيفي إلى صوت باستخدام HIFIGAN
49+
waveform = self.vocoder.decode_batch(mel_spec)
50+
51+
# تحويل المصفوفة إلى مصفوفة numpy
52+
audio = waveform.squeeze().cpu().numpy()
53+
54+
return audio
55+
except Exception as e:
56+
print(f"خطأ في توليد الصوت: {str(e)}")
57+
return None
58+
59+
def save_audio(self, audio, filename, sample_rate=22050):
60+
"""
61+
حفظ الصوت المُوَلَّد في ملف
62+
63+
Args:
64+
audio (numpy.ndarray): الصوت المُوَلَّد
65+
filename (str): اسم الملف
66+
sample_rate (int): معدل العينة
67+
"""
68+
if audio is not None:
69+
# حفظ الصوت بصيغة WAV
70+
torchaudio.save(filename, torch.tensor(audio).unsqueeze(0), sample_rate)
71+
print(f"تم حفظ الصوت في: {filename}")
Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
import re
2+
import os
3+
4+
def preprocess_arabic_text(text):
5+
"""
6+
معالجة النص العربي قبل التحويل إلى كلام
7+
8+
Args:
9+
text (str): النص العربي الأصلي
10+
11+
Returns:
12+
str: النص المُعالج
13+
"""
14+
# إزالة المسافات الزائدة
15+
text = re.sub(r'\s+', ' ', text).strip()
16+
17+
# معالجة الأرقام العربية
18+
arabic_numbers = {
19+
'٠': '0', '١': '1', '٢': '2', '٣': '3', '٤': '4',
20+
'٥': '5', '٦': '6', '٧': '7', '٨': '8', '٩': '9'
21+
}
22+
23+
for arabic, english in arabic_numbers.items():
24+
text = text.replace(arabic, english)
25+
26+
return text
27+
28+
def check_model_files():
29+
"""التحقق من وجود ملفات النماذج المطلوبة"""
30+
required_dirs = [
31+
"pretrained_models/g2p",
32+
"pretrained_models/tts",
33+
"pretrained_models/vocoder"
34+
]
35+
36+
for directory in required_dirs:
37+
if not os.path.exists(directory):
38+
os.makedirs(directory)
39+
print(f"تم إنشاء المجلد: {directory}")

0 commit comments

Comments
 (0)