Spaces:
Running
Running
| import streamlit as st | |
| import asyncio | |
| import edge_tts | |
| import os | |
| # تحسين مظهر التطبيق للموبايل | |
| st.set_page_config(page_title="مُحول الصوت المصري", page_icon="🎙️") | |
| st.markdown("<h2 style='text-align: center;'>🎙️ محول النص لصوت مصري حماسي</h2>", unsafe_allow_index=True) | |
| # قائمة الأصوات | |
| VOICES = { | |
| "شاكر (رجل - مصري حماسي)": "ar-EG-ShakirNeural", | |
| "سلمى (أنثى - مصرية هادئة)": "ar-EG-SalmaNeural" | |
| } | |
| # واجهة بسيطة | |
| voice_choice = st.selectbox("اختر الصوت:", list(VOICES.keys())) | |
| text_to_say = st.text_area("اكتب النص بالعامية المصرية:", "يا مساء الفل! التطبيق ده شغال مية مية على الموبايل يا بطل!", height=150) | |
| # إعدادات الحماس | |
| col1, col2 = st.columns(2) | |
| with col1: | |
| speed = st.slider("السرعة (الحماس):", 0, 50, 15) | |
| with col2: | |
| pitch = st.slider("النبرة:", -20, 20, 0) | |
| async def generate_audio(text, voice, rate, pitch): | |
| rate_str = f"+{rate}%" | |
| pitch_str = f"{pitch:+}Hz" | |
| communicate = edge_tts.Communicate(text, voice, rate=rate_str, pitch=pitch_str) | |
| await communicate.save("output.mp3") | |
| if st.button("تحويل وتشغيل الصوت 🚀", use_container_width=True): | |
| if text_to_say: | |
| with st.spinner("جاري التحويل..."): | |
| asyncio.run(generate_audio(text_to_say, VOICES[voice_choice], speed, pitch)) | |
| # تشغيل الصوت | |
| audio_file = open("output.mp3", "rb") | |
| audio_bytes = audio_file.read() | |
| st.audio(audio_bytes, format="audio/mp3") | |
| # تحميل الملف | |
| st.download_button( | |
| label="حفظ الصوت MP3 على الموبايل", | |
| data=audio_bytes, | |
| file_name="egypt_voice.mp3", | |
| mime="audio/mp3", | |
| use_container_width=True | |
| ) | |
| else: | |
| st.error("اكتب نص أولاً!") |