File size: 3,082 Bytes
3db1824
 
 
bcfc38a
3db1824
 
 
 
 
 
de71883
 
 
fe81f6a
3db1824
de71883
3db1824
 
 
 
 
 
bcfc38a
 
 
 
c1b4117
 
 
bcfc38a
3db1824
de71883
 
 
09efded
de71883
 
 
 
 
 
09efded
de71883
fe81f6a
 
de71883
 
fe81f6a
de71883
 
fe81f6a
 
3db1824
c1b4117
bcfc38a
 
 
 
 
 
 
 
 
fe81f6a
de71883
 
 
fe81f6a
de71883
 
37da971
de71883
 
 
fe81f6a
 
de71883
 
fe81f6a
 
de71883
 
 
c1b4117
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
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()