YkaSal's picture
Update app.py
311dac1 verified
import gradio as gr
from gradio.components import Text
from transformers import AutoModelForSeq2SeqLM, AutoTokenizer, pipeline
import torch
import torchaudio
import librosa
import numpy as np
if torch.backends.mps.is_available():
device = torch.device("mps")
elif torch.cuda.is_available():
device = torch.device("cuda")
else:
device = torch.device("cpu")
# Pipeline de transcription, c’est-à-dire qui permet de transcrire l’audio en texte français
transcriber = pipeline(
"automatic-speech-recognition",
model="bhuang/asr-wav2vec2-french",
device=device
)
#Pipeline de traduction qui va permettre de traduire l’audio transcrit en anglais
translator_model = "Helsinki-NLP/opus-mt-fr-en"
translator = pipeline(
"translation_fr_to_en",
model=translator_model,
tokenizer=translator_model,
device=device
)
# Pre-traitement necessaire
def preprocess_audio(filepath):
"""
Charge l'audio, le normalise, supprime le bruit et le rééchantillonne.
Retourne le chemin du fichier temporaire prétraité.
"""
# Chargement et rééchantillonnage
audio, sr = librosa.load(filepath, sr=16000)
# Normalisation
audio = librosa.util.normalize(audio)
# Suppression du bruit simple par seuillage (option basique)
noise_threshold = 0.01
audio = np.where(np.abs(audio) < noise_threshold, 0, audio)
# Sauvegarde du fichier temporaire
temp_path = "preprocessed_audio.wav"
torchaudio.save(temp_path, torch.tensor(audio).unsqueeze(0), sample_rate=16000)
return temp_path
def pipeline_transcription_traduction(audio):
"""
Prend un fichier audio, le prétraite, le transcrit (FR), puis le traduit (EN).
"""
try:
# Étape 1 : Prétraitement audio
audio_path = preprocess_audio(audio)
# Étape 2 : Transcription
transcription = transcriber(audio_path)["text"]
# Étape 3 : Traduction
traduction = translator(transcription)[0]["translation_text"]
return transcription, traduction
except Exception as e:
return f"Erreur : {str(e)}", "Erreur dans la traduction"
# Interface Gradio
demo = gr.Interface(
title="Transcription & Traduction Audio FR → EN",
description=f"Traitement sur : {device}",
fn=pipeline_transcription_traduction,
inputs=[gr.Audio(sources=["microphone"], type="filepath", label="Audio")],
outputs=[
Text(label="Transcription (Français)"),
Text(label="Traduction (Anglais)")
]
)
if __name__ == "__main__":
demo.launch()