File size: 6,813 Bytes
590e824 d6ea04b d7e32f5 8db5cd4 d7e32f5 d6ea04b db2559b 590e824 d6ea04b 590e824 1b7f7aa 590e824 d6ea04b d7e32f5 1b7f7aa 8db5cd4 1b7f7aa 8db5cd4 1b7f7aa 8db5cd4 1b7f7aa 8db5cd4 3ac1c11 1b7f7aa 8db5cd4 1b7f7aa d7e32f5 8db5cd4 d7e32f5 8db5cd4 d6ea04b 1b7f7aa a710bbe 1b7f7aa d6ea04b a710bbe 0dade2f a710bbe 3ac1c11 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 |
import gradio as gr
from transformers import pipeline
import scipy
import torchaudio
from speechbrain.pretrained import SepformerSeparation as separator
from shialifube import transliterate
import tempfile
import os
# Chargement des modèles Whisper pour la transcription
model_roman = pipeline("automatic-speech-recognition", model="nairaxo/whisper-shikomori-latin")
model_arabic = pipeline("automatic-speech-recognition", model="nairaxo/whisper-shikomori-arabic")
# Chargement du modèle Text-to-Speech
model_id = "nairaxo/mms-tts-zdj"
synthesiser = pipeline("text-to-speech", model_id, device=0)
# Chargement du modèle d'amélioration audio
model_enh = separator.from_hparams(source="speechbrain/sepformer-wham16k-enhancement", savedir='pretrained_models/sepformer-wham16k-enhancement')
# Fonction de transcription avec sélection du modèle
def transcribe(audio, model_choice):
try:
# Vérifier si l'audio est valide
if audio is None:
return "Erreur : Aucun fichier audio n'a été fourni."
# Transcrire l'audio
if model_choice == "Modèle en alphabet latin":
transcription = model_roman(audio)["text"]
else:
transcription = model_arabic(audio)["text"]
return transcription
except Exception as e:
return f"Erreur lors de la transcription : {str(e)}"
# Fonction de génération et d'amélioration audio
def generate_and_enhance_audio(text, script_choice):
try:
# Vérifier si le texte est vide
if not text.strip():
return None, None, "Erreur : Le texte d'entrée est vide."
# Translittérer le texte si l'utilisateur a choisi l'arabe
if script_choice == "Alphabet arabe":
text = transliterate(text) # Translittération de l'arabe en latin
# Synthétiser la parole (audio original)
speech = synthesiser(text)
sampling_rate = speech["sampling_rate"]
# Créer des fichiers temporaires pour l'audio original et amélioré
with tempfile.NamedTemporaryFile(suffix=".wav", delete=False) as original_file:
original_output = original_file.name
scipy.io.wavfile.write(original_output, rate=sampling_rate, data=speech["audio"][0])
with tempfile.NamedTemporaryFile(suffix=".wav", delete=False) as enhanced_file:
enhanced_output = enhanced_file.name
est_sources = model_enh.separate_file(path=original_output)
torchaudio.save(enhanced_output, est_sources[:, :, 0].detach().cpu(), sampling_rate)
# Retourner les fichiers audio au format attendu par Gradio
return original_output, enhanced_output, None
except Exception as e:
return None, None, f"Erreur lors de la génération ou de l'amélioration de l'audio : {str(e)}"
# Interface pour la transcription via microphone
with gr.Blocks() as mf_transcribe:
gr.Markdown("## Transcription Audio en Shikomori (Microphone)")
gr.Markdown("<p style='color: #555;'>Sélectionnez une méthode et un modèle pour transcrire l'audio en langue Shikomori. Ce service (en version bêta) prend en charge les transcriptions en alphabet latin et arabe (système Kamar-Eddine). Les modèles ont été entraîné sur la base de données construites à partir d'un algorithme d'alignement forcé. Pour une bonne expérience et afin de mieux transcrire vos audios, assurez-vous de prononcer clairement les mots et d'être dans un environnement ayant peu de bruits.</p>")
with gr.Row():
audio_input = gr.Audio(sources=["microphone"], type="filepath", label="🎤 Entrée Audio (Microphone)")
model_choice = gr.Radio(choices=["Modèle en alphabet latin", "Modèle en alphabet arabe"], label="Sélection du modèle de transcription", value="Modèle en alphabet latin")
transcription_output = gr.Textbox(label="📄 Transcription en Shikomori", lines=5, max_lines=10)
transcribe_button = gr.Button("Transcrire")
transcribe_button.click(fn=transcribe, inputs=[audio_input, model_choice], outputs=transcription_output)
# Interface pour la transcription via fichier audio
with gr.Blocks() as file_transcribe:
gr.Markdown("## Transcription Audio en Shikomori (Fichier)")
gr.Markdown("<p style='color: #555;'>Chargez un fichier audio et sélectionnez une méthode et un modèle pour transcrire l'audio en langue Shikomori. Ce service (en version bêta) prend en charge les transcriptions en alphabet latin et arabe (système Kamar-Eddine). Les modèles ont été entraîné sur la base de données construites à partir d'un algorithme d'alignement forcé. Pour une bonne expérience et afin de mieux transcrire vos audios, assurez-vous de prononcer clairement les mots et d'être dans un environnement ayant peu de bruits.</p>")
with gr.Row():
audio_input = gr.Audio(type="filepath", label="📂 Entrée Audio (Fichier)")
model_choice = gr.Radio(choices=["Modèle en alphabet latin", "Modèle en alphabet arabe"], label="Sélection du modèle de transcription", value="Modèle en alphabet latin")
transcription_output = gr.Textbox(label="📄 Transcription en Shikomori", lines=5, max_lines=10)
transcribe_button = gr.Button("Transcrire")
transcribe_button.click(fn=transcribe, inputs=[audio_input, model_choice], outputs=transcription_output)
# Interface pour la synthèse et amélioration audio
with gr.Blocks() as tts_interface:
gr.Markdown("## 🎙️ Synthèse et amélioration de la parole")
gr.Markdown("<p style='color: #555;'>Entrez du texte pour générer de la parole en Shikomori. Si le texte est en alphabet arabe, il sera automatiquement translittéré en alphabet latin avant la synthèse. L'audio original et l'audio amélioré seront affichés côte à côte.</p>")
with gr.Row():
text_input = gr.Textbox(label="Entrez votre texte", lines=3, placeholder="Écrivez ici...")
script_choice = gr.Radio(choices=["Alphabet latin", "Alphabet arabe"], label="Sélection du script d'entrée", value="Alphabet latin")
with gr.Row():
original_audio = gr.Audio(label="Audio original", type="filepath")
enhanced_audio = gr.Audio(label="Audio amélioré", type="filepath")
error_output = gr.Textbox(label="Erreur", visible=False)
generate_button = gr.Button("Générer l'audio")
generate_button.click(
fn=generate_and_enhance_audio,
inputs=[text_input, script_choice],
outputs=[original_audio, enhanced_audio, error_output]
)
# Interface principale avec onglets
with gr.Blocks() as demo:
gr.TabbedInterface(
[mf_transcribe, file_transcribe, tts_interface],
["🔊 Microphone", "📁 Fichier Audio", "🎙️ Text-to-Speech"]
)
# Lancement de l'application
demo.launch(share=True, debug=True) |