sheickydollar's picture
fix-bug (#2)
72e0f07 verified
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)
# Section d'enregistrement (initialement masquée)
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)
# Événements
def on_register(username, gender):
result = register_user(username, gender)
status, user, verse = result
return [status, user, verse,
gr.update(visible=True) # recording_section
]
def on_submit(username, audio, verse_text, gender):
result = submit_recording(username, audio, verse_text, gender)
status, verse = result
# Réinitialiser l'audio après soumission réussie
if "✅" in status:
return [status, verse, None] # None pour réinitialiser l'audio
return [status, verse, audio] # Garder l'audio en cas d'erreur
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)
# Chargement initial
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)