Odia-ASR-Web / app.py
spandy9681's picture
Update app.py
c1b4117 verified
Raw
History Blame Contribute Delete
3.08 kB
import os
import subprocess
# Ensure required dependencies are installed
try:
import whisper
except ImportError:
subprocess.run(["pip", "install", "openai-whisper"])
import whisper
import gradio as gr
import torch
import librosa
from pydub import AudioSegment
from transformers import Wav2Vec2Processor, Wav2Vec2ForCTC
# Load Models
models = {
"Odia (AI4Bharat IndicWav2Vec)": {
"processor": Wav2Vec2Processor.from_pretrained("ai4bharat/indicwav2vec-odia"),
"model": Wav2Vec2ForCTC.from_pretrained("ai4bharat/indicwav2vec-odia").to("cuda" if torch.cuda.is_available() else "cpu"),
},
"Hindi (AI4Bharat IndicWav2Vec)": {
"processor": Wav2Vec2Processor.from_pretrained("ai4bharat/indicwav2vec-hindi"),
"model": Wav2Vec2ForCTC.from_pretrained("ai4bharat/indicwav2vec-hindi").to("cuda" if torch.cuda.is_available() else "cpu"),
},
"English (Facebook Wav2Vec2-960h)": {
"processor": Wav2Vec2Processor.from_pretrained("facebook/wav2vec2-large-960h"),
"model": Wav2Vec2ForCTC.from_pretrained("facebook/wav2vec2-large-960h").to("cuda" if torch.cuda.is_available() else "cpu"),
}
}
# Function to convert audio to WAV (if needed)
def convert_to_wav(audio_file):
file_ext = os.path.splitext(audio_file)[-1].lower()
if file_ext != ".wav":
temp_wav = "converted_temp.wav"
sound = AudioSegment.from_file(audio_file, format=file_ext[1:])
sound = sound.set_channels(1).set_frame_rate(16000) # Convert to mono 16kHz
sound.export(temp_wav, format="wav")
return temp_wav
return audio_file
# Transcription Function with Time Snippets
def transcribe(audio, language):
# Convert audio to WAV if needed
audio_path = convert_to_wav(audio)
# Load and process audio
audio, sr = librosa.load(audio_path, sr=16000)
duration = librosa.get_duration(y=audio, sr=sr)
# Select appropriate model
selected_model = models[f"{language.capitalize()} (AI4Bharat IndicWav2Vec)" if language != "english" else "English (Facebook Wav2Vec2-960h)"]
processor = selected_model["processor"]
model = selected_model["model"]
inputs = processor(audio, sampling_rate=16000, return_tensors="pt", padding=True)
with torch.no_grad():
logits = model(**inputs).logits
predicted_ids = torch.argmax(logits, dim=-1)
transcription = processor.batch_decode(predicted_ids, skip_special_tokens=True)[0]
# Clean up temporary file if created
if audio_path == "converted_temp.wav":
os.remove(audio_path)
return transcription
# Gradio Interface
app = gr.Interface(
fn=transcribe,
inputs=[
gr.Audio(type="filepath", label="Upload Audio File"),
gr.Dropdown(choices=["odia", "hindi", "english"], label="Select Language", value="odia"),
],
outputs=gr.Textbox(label="Transcription"),
title="Multilingual ASR Web App",
description="Upload an audio file and select a language (Odia, Hindi, or English) to generate transcription.",
)
# Launch the App
app.launch()