diff --git a/arabic-voice-generation-app/README.md b/arabic-voice-generation-app/README.md new file mode 100644 index 00000000..ad61633b --- /dev/null +++ b/arabic-voice-generation-app/README.md @@ -0,0 +1,51 @@ +# تطبيق توليدي للأصوات العربية + +تطبيق بسيط وسريع لتحويل النص العربي إلى كلام باستخدام تقنيات مفتوحة المصدر. + +## الميزات + +- 🗣️ تحويل النص العربي إلى كلام بجودة عالية +- 🌐 واجهة مستخدم تفاعلية سهلة الاستخدام +- ⚡ سريع وفعال في التوليد +- 📦 يعتمد على مكتبات مفتوحة المصدر بالكامل +- 🎛️ إمكانية تعديل سرعة القراءة + +## المتطلبات + +- Python 3.7+ +- مكتبات Python المذكورة في ملف `requirements.txt` + +## التثبيت + +1. تثبيت المكتبات المطلوبة: +```bash +pip install -r requirements.txt +``` + +2. تشغيل التطبيق: +```bash +python app.py +``` + +3. فتح المتصفح على العنوان: http://localhost:7860 + +## الاستخدام + +1. أدخل النص العربي في مربع النص +2. اضبط سرعة القراءة حسب الرغبة +3. انقر على زر "تحويل إلى كلام" +4. استمع إلى الصوت المُوَلَّد أو نزّله + +## التقنيات المستخدمة + +- **SpeechBrain**: إطار عمل مفتوح المصدر للتعلم العميق في معالجة الكلام +- **Tacotron2**: نموذج توليدي للكلام متقدم +- **HIFIGAN**: نموذج لتوليد الصوت عالي الجودة +- **Gradio**: لإنشاء واجهة المستخدم التفاعلية + +## التخصيص + +يمكنك تعديل النموذج لإضافة: +- أصوات مختلفة +- لهجات عربية متنوعة +- تعديلات على سرعة القراءة والطبقة الصوتية diff --git a/arabic-voice-generation-app/app.py b/arabic-voice-generation-app/app.py new file mode 100644 index 00000000..1e975865 --- /dev/null +++ b/arabic-voice-generation-app/app.py @@ -0,0 +1,85 @@ +import gradio as gr +import numpy as np +from tts_model import ArabicTTS +import os + +# تهيئة نموذج تحويل النص إلى كلام +tts = ArabicTTS() + +def generate_speech(text, speed=1.0): + """ + توليد الصوت من النص العربي + + Args: + text (str): النص العربي + speed (float): سرعة القراءة (0.5-2.0) + + Returns: + tuple: (معدل العينة, الصوت المُوَلَّد) + """ + if not text.strip(): + return None, "الرجاء إدخال نص للتحويل" + + # توليد الصوت + audio = tts.text_to_speech(text) + + if audio is not None: + # تعديل سرعة القراءة إذا لزم الأمر + if speed != 1.0: + # يمكن إضافة تعديل السرعة هنا + pass + + # حفظ الصوت مؤقتًا + temp_filename = "temp_output.wav" + tts.save_audio(audio, temp_filename) + + # إرجاع الصوت للواجهة + return (22050, audio), None + else: + return None, "حدث خطأ في توليد الصوت" + +# إنشاء واجهة المستخدم +with gr.Blocks(title="تطبيق توليدي للأصوات العربية") as demo: + gr.Markdown("# 🗣️ تطبيق توليدي للأصوات العربية") + gr.Markdown("تحويل النص العربي إلى كلام باستخدام تقنيات مفتوحة المصدر") + + with gr.Row(): + with gr.Column(): + text_input = gr.Textbox( + label="أدخل النص العربي", + placeholder="اكتب النص الذي تريد تحويله إلى كلام...", + lines=5 + ) + speed_slider = gr.Slider( + minimum=0.5, + maximum=2.0, + value=1.0, + label="سرعة القراءة" + ) + generate_btn = gr.Button("تحويل إلى كلام", variant="primary") + + with gr.Column(): + audio_output = gr.Audio(label="الصوت المُوَلَّد") + error_output = gr.Textbox(label="رسائل الخطأ", interactive=False) + + generate_btn.click( + fn=generate_speech, + inputs=[text_input, speed_slider], + outputs=[audio_output, error_output] + ) + + gr.Markdown("### أمثلة للنصوص العربية:") + gr.Examples( + examples=[ + "السلام عليكم ورحمة الله وبركاته", + "مرحباً بك في تطبيق تحويل النص إلى كلام", + "هذا التطبيق يستخدم تقنيات مفتوحة المصدر", + "يمكنك كتابة أي نص عربي وسيتم تحويله إلى كلام", + "نأمل أن تجد هذا التطبيق مفيداً" + ], + inputs=text_input + ) + +# تشغيل التطبيق +if __name__ == "__main__": + demo.launch(server_name="0.0.0.0", server_port=7860) diff --git a/arabic-voice-generation-app/config.py b/arabic-voice-generation-app/config.py new file mode 100644 index 00000000..ad7a6dd5 --- /dev/null +++ b/arabic-voice-generation-app/config.py @@ -0,0 +1,17 @@ +# إعدادات الصوت +AUDIO_SAMPLE_RATE = 22050 +AUDIO_CHANNELS = 1 + +# إعدادات النموذج +MODEL_CONFIG = { + "g2p_model": "speechbrain/tts_models/arabic-tacotron2-collab", + "tts_model": "speechbrain/tts_models/arabic-tacotron2-collab", + "vocoder_model": "speechbrain/tts_models/arabic-hifigan-collab" +} + +# إعدادات الواجهة +INTERFACE_CONFIG = { + "title": "تطبيق توليدي للأصوات العربية", + "server_name": "0.0.0.0", + "server_port": 7860 +} diff --git a/arabic-voice-generation-app/requirements.txt b/arabic-voice-generation-app/requirements.txt new file mode 100644 index 00000000..5e567ed1 --- /dev/null +++ b/arabic-voice-generation-app/requirements.txt @@ -0,0 +1,9 @@ +torch>=1.13.0 +torchaudio>=0.13.0 +transformers>=4.21.0 +speechbrain>=0.5.12 +librosa>=0.9.2 +soundfile>=0.10.3 +numpy>=1.21.0 +gradio>=3.24.1 +huggingface_hub>=0.12.0 diff --git a/arabic-voice-generation-app/tts_model.py b/arabic-voice-generation-app/tts_model.py new file mode 100644 index 00000000..5b121bf7 --- /dev/null +++ b/arabic-voice-generation-app/tts_model.py @@ -0,0 +1,71 @@ +import torch +import torchaudio +from speechbrain.inference.text import GraphemeToPhoneme +from speechbrain.inference.TTS import Tacotron2 +from speechbrain.inference.vocoders import HIFIGAN +import numpy as np +import librosa + +class ArabicTTS: + def __init__(self): + """تهيئة نموذج تحويل النص إلى كلام للغة العربية""" + # تحميل نموذج تحويل الحروف إلى أصوات (Grapheme-to-Phoneme) + self.g2p = GraphemeToPhoneme.from_hparams( + "speechbrain/tts_models/arabic-tacotron2-collab", + savedir="pretrained_models/g2p" + ) + + # تحميل نموذج Tacotron2 للغة العربية + self.tts_model = Tacotron2.from_hparams( + "speechbrain/tts_models/arabic-tacotron2-collab", + savedir="pretrained_models/tts" + ) + + # تحميل نموذج HIFIGAN لتوليد الصوت عالي الجودة + self.vocoder = HIFIGAN.from_hparams( + "speechbrain/tts_models/arabic-hifigan-collab", + savedir="pretrained_models/vocoder" + ) + + def text_to_speech(self, text): + """ + تحويل النص العربي إلى كلام + + Args: + text (str): النص العربي المراد تحويله + + Returns: + numpy.ndarray: الصوت المُوَلَّد + """ + try: + # تحويل النص إلى صوتيفات (Phonemes) + phonemes = self.g2p.g2p(text) + print(f"النصوص الصوتية: {phonemes}") + + # إنشاء التمثيل الطيفي للصوت + mel_spec, _, _ = self.tts_model.encode_text(phonemes) + + # تحويل التمثيل الطيفي إلى صوت باستخدام HIFIGAN + waveform = self.vocoder.decode_batch(mel_spec) + + # تحويل المصفوفة إلى مصفوفة numpy + audio = waveform.squeeze().cpu().numpy() + + return audio + except Exception as e: + print(f"خطأ في توليد الصوت: {str(e)}") + return None + + def save_audio(self, audio, filename, sample_rate=22050): + """ + حفظ الصوت المُوَلَّد في ملف + + Args: + audio (numpy.ndarray): الصوت المُوَلَّد + filename (str): اسم الملف + sample_rate (int): معدل العينة + """ + if audio is not None: + # حفظ الصوت بصيغة WAV + torchaudio.save(filename, torch.tensor(audio).unsqueeze(0), sample_rate) + print(f"تم حفظ الصوت في: {filename}") diff --git a/arabic-voice-generation-app/utils.py b/arabic-voice-generation-app/utils.py new file mode 100644 index 00000000..254b73d4 --- /dev/null +++ b/arabic-voice-generation-app/utils.py @@ -0,0 +1,39 @@ +import re +import os + +def preprocess_arabic_text(text): + """ + معالجة النص العربي قبل التحويل إلى كلام + + Args: + text (str): النص العربي الأصلي + + Returns: + str: النص المُعالج + """ + # إزالة المسافات الزائدة + text = re.sub(r'\s+', ' ', text).strip() + + # معالجة الأرقام العربية + arabic_numbers = { + '٠': '0', '١': '1', '٢': '2', '٣': '3', '٤': '4', + '٥': '5', '٦': '6', '٧': '7', '٨': '8', '٩': '9' + } + + for arabic, english in arabic_numbers.items(): + text = text.replace(arabic, english) + + return text + +def check_model_files(): + """التحقق من وجود ملفات النماذج المطلوبة""" + required_dirs = [ + "pretrained_models/g2p", + "pretrained_models/tts", + "pretrained_models/vocoder" + ] + + for directory in required_dirs: + if not os.path.exists(directory): + os.makedirs(directory) + print(f"تم إنشاء المجلد: {directory}") diff --git a/config/repolinter-ruleset.json b/config/repolinter-ruleset.json index c57e1b87..c0467d79 100644 --- a/config/repolinter-ruleset.json +++ b/config/repolinter-ruleset.json @@ -62,7 +62,7 @@ }, "policyInfo": "GitHub requires a CODEOWNERS file in all projects. This enables GitHub to contact the maintainers in the event it is necessary.", "policyUrl": "https://github.com/github/open-source/blob/main/policies/release.md" - }, + } }, "formatOptions": { "disclaimer": "🤖*This issue was automatically generated by [repolinter-action](https://github.com/newrelic/repolinter-action), developed by the Open Source and Developer Advocacy team at New Relic.*" diff --git a/config/text-summarizer-eval.yaml b/config/text-summarizer-eval.yaml new file mode 100644 index 00000000..1648d920 --- /dev/null +++ b/config/text-summarizer-eval.yaml @@ -0,0 +1,23 @@ +name: Text Summarizer +description: Summarizes input text concisely +model: openai/gpt-4o-mini +modelParameters: + temperature: 0.5 +messages: + - role: system + content: You are a text summarizer. Your only job is to summarize text given to you. + - role: user + content: | + Summarize the given text, beginning with "Summary -": + + {{input}} + +testData: + - input: | + The quick brown fox jumped over the lazy dog. + The dog was too tired to react. + expected: Summary - A fox jumped over a lazy, unresponsive dog. +evaluators: + - name: Output should start with 'Summary -' + string: + startsWith: 'Summary -' diff --git a/dashboard-prototype.html b/dashboard-prototype.html new file mode 100644 index 00000000..a7aa340a --- /dev/null +++ b/dashboard-prototype.html @@ -0,0 +1,486 @@ + + + + + + لوحة تحكم صوت القدس | Voice of Quds Control Panel + + + +
+
+
+ +
+ لوحة تحكم صوت القدس · Voice of Quds +
+
+
+ العربية · RTL + + +
+
+ +
+
+

🔧 الإعدادات الأساسية · Core Setup

+
+
+ +
+
نشرة · Bulletin
+
منشور · Post
+
تغريدة · Tweet
+
+
+
+ +
+
كل دقيقة
+
كل 5 دقائق
+
+
+
+
+
+ + +
+
+ + +
+
+
+ +
+

🌐 المصادر · Sources

+ +
+
غرفة الأخبار المحلية
+
RSS / Atom
+
API خارجي
+
+
+
+ + +
+
+ + +
+
+
+
⚡ جاهز للربط مع fetch/axios.
+
+
+
+ +
+

✏️ التخصيص · Tone & Format

+ + +
+
+ + +
+
+ + +
+
+
+ +
+

🚀 التوليد والنشر · Generate & Publish

+
+ + + +
+
+

عنوان مبدئي · Headline

+

هنا سيظهر النص المولد بناءً على الإعدادات المختارة. This area previews the generated content.

+
+ المصدر · Source: غرفة الأخبار + التاريخ · Date: +
+
+
+
+ ⚙️ جاهز للدمج مع واجهات الذكاء الاصطناعي و RSS. + +
+
+
+
+ + + + diff --git a/design/radio-dashboard-prototype.md b/design/radio-dashboard-prototype.md new file mode 100644 index 00000000..c465f10b --- /dev/null +++ b/design/radio-dashboard-prototype.md @@ -0,0 +1,125 @@ +# لوحة التحكم الإعلامية لإذاعة "صوت القدس" — نموذج أولي جاهز للبرمجة + +يوثق هذا المستند نموذجًا أوليًا (low/medium fidelity) للوحة تحكم توليد محتوى لحظي. يشمل بنية الواجهة، تدفقات الاستخدام، التكامل مع نماذج الذكاء الاصطناعي، واستقبال الأخبار من مصادر خارجية (RSS/API)، مع خصائص النسخ والتصدير السريع. + +## 1) أهداف المنتج +- توليد محتوى عربي إذاعي/تحريري بسرعة مع ضبط النبرة (إذاعي، إخباري، مهني). +- تحديث لحظي للأخبار (1 أو 5 دقائق) مع مرونة تخصيص الصيغة والإخراج. +- تصدير سريع للنشر (نسخ فوري، ملفات، أو ربط مع قنوات توزيع). +- حوكمة تحريرية: إبراز المصادر، حفظ سياق المراجعة البشرية، ومنع النشر الآلي غير المراقب. + +## 2) خارطة الواجهة (مكونات رئيسية) +1. **شريط علوي**: شعار الإذاعة + حالة الاتصال + مؤشر آخر تحديث. +2. **لوحة التحكم السريعة** (يمين/يسار حسب اللغة): + - اختيار نوع المحتوى: زرّ/قائمة (منشور، نشرة إذاعية، تغطية عاجلة، ملخّص تحليلي). + - فترة التحديث: أزرار راديو (1 دقيقة، 5 دقائق) + خيار إيقاف/تشغيل التحديث التلقائي. + - مصدر الأخبار: اختيار/بحث (RSS جاهز + مصادر API) مع شارة الموثوقية. + - لغة الإخراج: عربي/ثنائي/إنجليزي. + - نبرة التحرير: (إذاعي، رسمي، ميداني، تحليلي) مع وصف موجز. +3. **لوحة الأخبار الحية**: جدول/بطاقات بعناوين الأخبار، المصدر، الزمن، الوسوم (عاجل/تحليلي). دعم فرز/بحث/تصفية. +4. **منطقة الصياغة المدعومة بالذكاء الاصطناعي**: + - حقل نصي متعدد الأسطر + عداد أحرف. + - أزرار قوالب جاهزة (عاجل 🔴، نشرة 📻، تواصل اجتماعي 📱). + - معلمات الذكاء الاصطناعي: مستوى الإيجاز/التفصيل، درجة الرسمية، إدراج اقتباسات، احترام دليل المصطلحات. + - زر **توليد** + حالة انتظار/إشعار نجاح أو فشل. +5. **التصدير السريع**: + - **نسخ فوري** (Copy) مع رسالة نجاح. + - **حفظ كملف** (TXT/HTML/Markdown). + - **نشر عبر API** (Webhook/CMS/Social) مع مفتاح سري مخزّن آمنًا. + - سجل آخر 10 مخارج محفوظة للتراجع أو الإعادة. +6. **لوحة المراجعة والتحريرية**: حقل لملاحظات المراجع، حالة "مراجَع/غير مراجَع"، سجلات تغييرات مختصرة. + +## 3) تدفقات الاستخدام الأساسية +1. **اختيار نوع المحتوى** → يظهر نموذج الإعدادات المناسب (مثلاً النشرة الإذاعية تعرض مدة النشرة + فواصل صوتية). +2. **التحديث اللحظي**: تحديد 1 أو 5 دقائق → اشتراك في WebSocket/Interval لجلب الأخبار → تحديث لوحة الأخبار الحية + مؤشر آخر تحديث. +3. **التوليد**: اختيار عناصر إخبارية (Checkbox) → النقر "توليد" → إرسال Prompt للـ GPT API → عرض المسودة في منطقة الصياغة. +4. **المراجعة**: تحرير النص يدويًا → تحديد الحالة "مراجَع" → إضافة ملاحظات. +5. **التصدير**: نسخ/حفظ ملف/استدعاء Webhook → إشعار نجاح مع وقت التنفيذ. + +## 4) التكامل مع نماذج الذكاء الاصطناعي (مثال تقني) +- **إعدادات**: مفتاح API مشفّر، اختيار نموذج (GPT-4.x)، حدّ الطول، والتحكم في الـ temperature. +- **مثال طلب (Node.js/Fetch)**: + ```js + const body = { + model: "gpt-4.1-mini", + temperature: 0.4, + messages: [ + { role: "system", content: "أنت محرر إذاعي فلسطيني..." }, + { role: "user", content: ` + لخص الأخبار التالية بنبرة إذاعية مهنية: + - [${selectedItems.join(" | ")}] + التنسيق: فقرة افتتاحية + 3 نقاط رئيسية + خاتمة دعوية قصيرة. + راعِ دليل المصطلحات: الاحتلال/المقاومة/الأسرى... + ` } + ] + }; + const res = await fetch("/api/ai/generate", { method: "POST", body: JSON.stringify(body) }); + const { content } = await res.json(); + ``` +- **إدارة الأخطاء**: إشعارات صديقة، إعادة المحاولة، وضع عدم الاتصال (Offline Mode) يحفظ الطلبات ويرسلها لاحقًا. + +## 5) استقبال الأخبار (RSS/API) +- **جلب RSS**: مهمة مجدولة (CRON/Interval) لكل 1 أو 5 دقائق. +- **تنظيف المحتوى**: إزالة الوسوم المكررة، اكتشاف اللغة، تصنيف (عاجل/رسمي/ميداني/تحليلي). +- **نموذج بيانات مقترح**: + ```json + { + "id": "uuid", + "source": "safa.ps", + "title": "عنوان الخبر", + "link": "https://...", + "published_at": "2025-01-01T10:00:00Z", + "language": "ar", + "tags": ["عاجل", "ميداني"], + "reliability": 4.5, + "summary": "ملخص قصير", + "body": "النص الكامل", + "enriched": { + "entities": ["غزة", "بيت لاهيا"], + "locations": ["فلسطين"], + "topics": ["سياسة", "ميداني"] + } + } + ``` +- **التخزين المؤقت**: IndexedDB أو LocalStorage للمتصفح + Cache API لضمان سرعة الواجهة. +- **توحيد المصادر المحمية**: دعم RSS.app/FetchRSS مع مفاتيح منفصلة. + +## 6) النسخ والتصدير +- زر نسخ واضح أعلى منطقة الصياغة + تأكيد Toast. +- زر "تنزيل" مع اختيار النوع (TXT/HTML/MD). +- حقل Webhook URL + مفتاح سرّي للاستخدام مع CMS/شبكات اجتماعية. +- سجل المخارج: جدول بالعناصر الأخيرة مع وقت التوليد، الحالة (مراجَع/غير مراجَع)، ومصدر البيانات. + +## 7) إرشادات تصميم الواجهة +- **تصميم RTL أولاً** مع دعم LTR. +- ألوان: تباين عالٍ، حالات للمصدر (موثوق/محمي/محدود) عبر شارات. +- حالات Loading/Empty/Error واضحة. +- رموز واضحة: 🔴 للعاجل، 📻 للنشرة، 📱 للتواصل. +- إمكانية تخصيص خط عربي مناسب للإذاعة (مثلاً "Cairo" أو "Noto Sans Arabic"). + +## 8) نموذج بيانات الإعدادات (Front-End) +```ts +type Settings = { + contentType: "post" | "radio_bulletin" | "breaking" | "analysis"; + refreshIntervalSec: 60 | 300; + autoRefresh: boolean; + aiTone: "radio" | "official" | "field" | "analytical"; + language: "ar" | "ar_en" | "en"; + sources: string[]; + webhookUrl?: string; + exportFormats: ("copy" | "txt" | "html" | "md" | "webhook")[]; +}; +``` + +## 9) نماذج قوالب التوليد (جاهزة للاستخدام) +- **عاجل 🔴**: جملة افتتاحية + حدث رئيسي + مصدر + نداء للمتابعة. +- **نشرة 📻**: مقدمة، 3-5 فقرات مختصرة مع توقيت، خاتمة دعوية قصيرة. +- **تواصل اجتماعي 📱**: نص قصير، هاشتاقات، رابط مختصر. +- جميع القوالب تلتزم بدليل المصطلحات: "الاحتلال"، "المقاومة"، "الأسرى"، وتجنب مصطلحات مضللة. + +## 10) ملاحظات للتطوير/النشر +- اعتماد مبدأ Offline-first + Sync عند الاتصال. +- حماية المفاتيح الحساسة في الخادم أو مخزن أسرار. +- رصد زمن التوليد والتحديث لقياس الأداء. +- تسجيل التدخلات البشرية للحوكمة التحريرية. + diff --git a/design/radio-dashboard-wireflow.md b/design/radio-dashboard-wireflow.md new file mode 100644 index 00000000..0dae172c --- /dev/null +++ b/design/radio-dashboard-wireflow.md @@ -0,0 +1,72 @@ +# لوحة التحكم الإعلامية — مخطط التدفق التفاعلي (Wireflow) + +يوضح هذا المستند تدفق الشاشات والقرارات الرئيسية لبناء نموذج أولي تفاعلي (Figma/Webflow) للوحة التحكم الخاصة بإذاعة "صوت القدس". يركّز على كيفية انتقال المستخدم بين الخطوات، التحكم في التحديث اللحظي، والتكامل مع نماذج الذكاء الاصطناعي ومصادر الأخبار. + +## 1) الشاشات الأساسية +1. **شاشة البداية / تسجيل الدخول البسيط** + - حقل مفتاح API (يُحفظ مشفّرًا في المتصفح أو عبر الخادم). + - اختيار نموذج AI الافتراضي + زر "حفظ الإعدادات". +2. **لوحة التحكم الرئيسية** + - مؤشر آخر تحديث + حالة الاتصال (Online/Offline). + - عناصر اختيار نوع المحتوى (منشور/نشرة إذاعية/عاجل/تحليلي). + - إعداد فترة التحديث (1 أو 5 دقائق) + زر تشغيل/إيقاف التحديث التلقائي. + - اختيار المصادر (RSS/API) بشارات موثوقية. + - زر "فتح لوحة الأخبار" وزر "فتح منطقة الصياغة". +3. **لوحة الأخبار الحية** + - قائمة أو بطاقات بعناوين الأخبار + المصدر + زمن النشر + الوسوم. + - فلاتر (عاجل/رسمي/ميداني/تحليلي) + بحث نصي. + - خانة تحديد (Checkbox) لاختيار الأخبار التي ستُستخدم في التوليد. + - زر "إرسال إلى الصياغة". +4. **منطقة الصياغة المدعومة بالذكاء الاصطناعي** + - حقل نصي متعدد الأسطر + عداد أحرف. + - أزرار القوالب الجاهزة (عاجل 🔴 / نشرة 📻 / تواصل 📱). + - معلمات AI: درجة الإيجاز، الرسمية، إدراج اقتباسات، احترام دليل المصطلحات. + - زر "توليد" + حالة التحميل/النجاح/الخطأ. + - حقل ملاحظات المراجع + حالة "مراجَع/غير مراجَع". +5. **التصدير والمشاركة** + - أزرار: نسخ، تنزيل (TXT/HTML/MD)، إرسال Webhook. + - قائمة بالمخارج الأخيرة مع وقت التوليد والحالة. + - زر "إعادة استخدام" لإعادة فتح المخرج في منطقة الصياغة. + +## 2) تدفق المستخدم (Wireflow مبسط) +1. تسجيل الدخول المفتاحي → حفظ الإعدادات → الانتقال للوحة التحكم. +2. اختيار نوع المحتوى + فترة التحديث + المصادر → تشغيل التحديث التلقائي (Interval/WebSocket). +3. فتح "لوحة الأخبار" → اختيار عناصر → "إرسال إلى الصياغة". +4. ضبط القالب/النبرة → "توليد" → مراجعة النص → تغيير الحالة إلى "مراجَع". +5. اختيار وسيلة الإخراج (نسخ/تنزيل/Webhook) → إشعار نجاح → سجل المخرجات يُحدّث. +6. (اختياري) تعديل الإعدادات أو تبديل المصادر → إعادة توليد/تصدير. + +## 3) عناصر تفاعلية مقترحة في Figma/Webflow +- **Components**: + - Buttons (Primary/Secondary/Danger) مع حالات Hover/Active/Disabled. + - Cards للأخبار مع شارات موثوقية. + - Tabs للفصل بين "الأخبار" و"الصياغة" و"التصدير". + - Toasts للإشعارات (نجاح/خطأ/تنبيه اتصال). + - Badges لوسوم المصدر والنوع (عاجل/تحليلي/رسمي). +- **Interactions**: + - Auto-Refresh Indicator يتغير كل 1 أو 5 دقائق. + - Modal لطلب مفتاح API أو إعداد Webhook. + - Sidebar قابل للطيّ يحتوي على التحكم السريع. + - Animations خفيفة للتحميل والتبديل بين القوالب. + +## 4) مخطط بيانات التفاعل (Events) +- `onSourceSelect(sourceId)`: تحديث قائمة الاشتراك في جلب RSS/API. +- `onIntervalChange(60|300)`: ضبط مؤقت التحديث وجدولة الجلب. +- `onNewsSelect(ids[])`: حفظ العناصر المختارة للتوليد. +- `onGenerate(settings, selectedNews)`: استدعاء API للذكاء الاصطناعي + تسجيل وقت الطلب. +- `onExport(mode)`: تنفيذ نسخ/تنزيل/Webhook + إضافة سجل. +- `onReview(status, notes)`: تحديث حالة المراجعة وحفظ الملاحظات محليًا/على الخادم. + +## 5) توصيات تجربة الاستخدام +- إبراز دليل المصطلحات في لوحة جانبية أو Tooltip. +- عرض مصدر كل فقرة مولدة (إدراج روابط أو وسوم). +- دعم لوحة مفاتيح (اختصارات للنسخ، توليد، تبديل القوالب). +- تخزين Draft محليًا تلقائيًا لمنع فقدان العمل. +- إظهار زمن الاستجابة من الـ AI لإدارة التوقعات. + +## 6) متطلبات تسليم التصميم +- ملف Figma أو Webflow يتضمن: + - صفحات الشاشات الخمس أعلاه. + - مكونات قابلة لإعادة الاستخدام (Design System مصغر). + - تفاعلات Click/Hover/Auto-Refresh موثقة. +- تصدير Prototype Link للمطورين مع ملاحظات (Dev Mode).