| import gradio as gr |
| import pandas as pd |
| import os |
| import re |
| from datetime import datetime |
| from data_manager import data_manager |
| from logic import register_user, get_next_verse, submit_recording, get_user_stats, update_contributors, set_verses_df |
| S3_BUCKET_NAME = os.getenv("S3_BUCKET_NAME") |
| DATA_KEY = "quran/datum.xlsx" |
| s3_path = f"s3://{S3_BUCKET_NAME}/{DATA_KEY}" |
|
|
| verses_df = None |
| def load_quran_verses(): |
| try: |
| storage_options = { |
| "key": os.getenv("AWS_ACCESS_KEY_ID"), |
| "secret": os.getenv("AWS_SECRET_ACCESS_KEY"), |
| "client_kwargs": {"endpoint_url": os.getenv("AWS_S3_ENDPOINT_URL")} |
| } |
| df = pd.read_excel(s3_path, storage_options=storage_options, skiprows=1) |
| df.columns = ['id', 'sura', 'aya', 'translation', 'french_translation'] |
| df['id'] = df['id'].astype(int).astype(str) |
| df['sura'] = df['sura'].astype(int) |
| df['aya'] = df['aya'].astype(int) |
| df = df.sort_values(by=['sura', 'aya'], ascending=[False, True]) |
| print(f"✅ {len(df)} versets chargés") |
| return df |
| except Exception as e: |
| print(f"❌ Erreur chargement versets: {e}") |
| return None |
|
|
| verses_df = load_quran_verses() |
| set_verses_df(verses_df) |
|
|
|
|
| def create_interface(): |
| """Crée l'interface Gradio""" |
| if verses_df is None: |
| with gr.Blocks() as error_app: |
| gr.Markdown("# ❌ Erreur\nImpossible de charger les versets du Coran.") |
| return error_app |
|
|
| with gr.Blocks(title="Coran en Mooré - Collecte Audio") as app: |
| gr.Markdown(""" |
| # 🎙️ Enregistrement du Coran en Mooré |
| |
| Participez à la création des dataset audios de la langue mmore. |
| |
| **Dataset:** [sheickydollar/quran-audio-moore](https://huggingface.co/datasets/sheickydollar/quran-audio-moore) |
| """) |
| |
| with gr.Tab("🎤 Enregistrement"): |
| with gr.Row(): |
| username = gr.Textbox(label="Nom d'utilisateur", placeholder="votre prenom") |
| gender = gr.Radio(choices=["Homme", "Femme"], label="Genre") |
| |
| register_btn = gr.Button("S'inscrire", variant="primary") |
| registration_status = gr.Textbox(label="Statut", interactive=False) |
| |
| |
| with gr.Column(visible=False) as recording_section: |
| gr.Markdown("### 📝 Verset à enregistrer") |
| verse_display = gr.Markdown("") |
| audio_recorder = gr.Audio(sources=["microphone"], type="filepath", format="mp3", label="Enregistrement") |
| with gr.Row(): |
| submit_btn = gr.Button("📤 Soumettre", variant="primary") |
| next_btn = gr.Button("⏭️ Verset suivant", variant="secondary") |
| recording_status = gr.Textbox(label="Statut enregistrement", interactive=False) |
|
|
| |
| def on_register(username, gender): |
| result = register_user(username, gender) |
| status, user, verse = result |
| return [status, user, verse, |
| gr.update(visible=True) |
| ] |
|
|
| def on_submit(username, audio, verse_text, gender): |
| result = submit_recording(username, audio, verse_text, gender) |
| status, verse = result |
| |
| if "✅" in status: |
| return [status, verse, None] |
| return [status, verse, audio] |
|
|
| register_btn.click( |
| on_register, |
| inputs=[username, gender], |
| outputs=[ |
| registration_status, |
| username, |
| verse_display, |
| recording_section |
| ] |
| ) |
| |
| submit_btn.click( |
| on_submit, |
| inputs=[username, audio_recorder, verse_display, gender], |
| outputs=[recording_status, verse_display, audio_recorder] |
| ) |
| |
| next_btn.click( |
| get_next_verse, |
| inputs=[username, verse_display], |
| outputs=[verse_display] |
| ) |
|
|
| with gr.Tab("🏆 Contributeurs"): |
| gr.Markdown(""" |
| ## Classement des contributeurs |
| |
| **Rangs:** |
| - 🥇 Expert: 50+ enregistrements |
| - 🥈 Avancé: 20+ enregistrements |
| - 🥉 Intermédiaire: 5+ enregistrements |
| - 🌟 Débutant: < 5 enregistrements |
| """) |
| |
| contributors_table = gr.Markdown() |
| refresh_btn = gr.Button("🔄 Actualiser") |
| |
| refresh_btn.click(update_contributors, outputs=contributors_table) |
| |
| |
| contributors_table.value = update_contributors() |
|
|
| with gr.Tab("📊 Mes statistiques"): |
| stats_username = gr.Textbox(label="Votre nom d'utilisateur") |
| stats_btn = gr.Button("Voir mes stats") |
| stats_output = gr.Textbox(label="Statistiques", lines=5, interactive=False) |
| |
| stats_btn.click(get_user_stats, inputs=[stats_username], outputs=[stats_output]) |
|
|
| return app |
|
|
|
|
| if __name__ == "__main__": |
| app = create_interface() |
| app.launch(share=True) |