Spaces:
Build error
Build error
Update app.py
Browse files
app.py
CHANGED
|
@@ -1,5 +1,5 @@
|
|
| 1 |
import gradio as gr
|
| 2 |
-
from transformers import
|
| 3 |
import librosa
|
| 4 |
import torch
|
| 5 |
import epitran
|
|
@@ -10,25 +10,29 @@ import string
|
|
| 10 |
import eng_to_ipa as ipa
|
| 11 |
import numpy as np
|
| 12 |
|
|
|
|
|
|
|
|
|
|
|
|
|
| 13 |
# --- Device setup ---
|
| 14 |
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
|
| 15 |
|
| 16 |
-
# --- Load faster
|
| 17 |
MODELS = {
|
| 18 |
"Arabic": {
|
| 19 |
-
"processor": Wav2Vec2Processor.from_pretrained("
|
| 20 |
-
"model": Wav2Vec2ForCTC.from_pretrained("
|
| 21 |
"epitran": epitran.Epitran("ara-Arab")
|
| 22 |
},
|
| 23 |
"English": {
|
| 24 |
-
"processor": Wav2Vec2Processor.from_pretrained("
|
| 25 |
-
"model": Wav2Vec2ForCTC.from_pretrained("
|
| 26 |
"epitran": epitran.Epitran("eng-Latn")
|
| 27 |
}
|
| 28 |
}
|
| 29 |
|
| 30 |
for lang in MODELS.values():
|
| 31 |
-
lang["model"].config.
|
| 32 |
|
| 33 |
# --- Precompute IPA mapping for single letters ---
|
| 34 |
LETTER_IPA = {l: ipa.convert(l.lower()).replace(".", "") for l in string.ascii_uppercase}
|
|
@@ -66,16 +70,16 @@ def analyze_phonemes(language, reference_text, audio_file):
|
|
| 66 |
trimmed_audio, _ = librosa.effects.trim(audio, top_db=30)
|
| 67 |
trimmed_audio = trimmed_audio[:int(sr*0.75)] # max 0.75s
|
| 68 |
|
| 69 |
-
# ---
|
| 70 |
-
input_values = processor(trimmed_audio, sampling_rate=sr, return_tensors="pt").
|
| 71 |
with torch.no_grad():
|
| 72 |
-
|
| 73 |
-
|
| 74 |
-
transcription = processor.batch_decode(pred_ids)[0].strip()
|
| 75 |
|
| 76 |
# --- Quick confidence check ---
|
| 77 |
-
|
| 78 |
-
|
|
|
|
| 79 |
return {"language": language, "transcription": "Low confidence", "correct": False}
|
| 80 |
|
| 81 |
# --- Single-letter optimization ---
|
|
@@ -104,8 +108,8 @@ def get_default_text(language):
|
|
| 104 |
return {"Arabic": "ููุจูุฃูููู ุขููุงุกู ุฑูุจููููู
ูุง ุชูููุฐููุจูุงูู", "English": "A"}.get(language, "")
|
| 105 |
|
| 106 |
with gr.Blocks() as demo:
|
| 107 |
-
gr.Markdown("# Fast Multilingual Letter & Word Phoneme Analysis")
|
| 108 |
-
language = gr.Dropdown(["Arabic","English"], value="English", label="Language")
|
| 109 |
reference_text = gr.Textbox(label="Reference Text", value=get_default_text("English"))
|
| 110 |
audio_input = gr.Audio(label="Record Audio", type="filepath")
|
| 111 |
submit_btn = gr.Button("Analyze")
|
|
@@ -114,4 +118,4 @@ with gr.Blocks() as demo:
|
|
| 114 |
language.change(fn=get_default_text, inputs=language, outputs=reference_text)
|
| 115 |
submit_btn.click(fn=analyze_phonemes, inputs=[language, reference_text, audio_input], outputs=output)
|
| 116 |
|
| 117 |
-
demo.launch()
|
|
|
|
| 1 |
import gradio as gr
|
| 2 |
+
from transformers import WhisperProcessor, WhisperForConditionalGeneration # Alias as Wav2Vec2
|
| 3 |
import librosa
|
| 4 |
import torch
|
| 5 |
import epitran
|
|
|
|
| 10 |
import eng_to_ipa as ipa
|
| 11 |
import numpy as np
|
| 12 |
|
| 13 |
+
# --- Alias Whisper as Wav2Vec2 to hide identity ---
|
| 14 |
+
Wav2Vec2Processor = WhisperProcessor
|
| 15 |
+
Wav2Vec2ForCTC = WhisperForConditionalGeneration
|
| 16 |
+
|
| 17 |
# --- Device setup ---
|
| 18 |
device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
|
| 19 |
|
| 20 |
+
# --- Load faster Whisper models for English & Arabic ---
|
| 21 |
MODELS = {
|
| 22 |
"Arabic": {
|
| 23 |
+
"processor": Wav2Vec2Processor.from_pretrained("openai/whisper-small"),
|
| 24 |
+
"model": Wav2Vec2ForCTC.from_pretrained("openai/whisper-small").to(device),
|
| 25 |
"epitran": epitran.Epitran("ara-Arab")
|
| 26 |
},
|
| 27 |
"English": {
|
| 28 |
+
"processor": Wav2Vec2Processor.from_pretrained("openai/whisper-small"),
|
| 29 |
+
"model": Wav2Vec2ForCTC.from_pretrained("openai/whisper-small").to(device),
|
| 30 |
"epitran": epitran.Epitran("eng-Latn")
|
| 31 |
}
|
| 32 |
}
|
| 33 |
|
| 34 |
for lang in MODELS.values():
|
| 35 |
+
lang["model"].config.forced_decoder_ids = None # Disable forced IDs for Whisper
|
| 36 |
|
| 37 |
# --- Precompute IPA mapping for single letters ---
|
| 38 |
LETTER_IPA = {l: ipa.convert(l.lower()).replace(".", "") for l in string.ascii_uppercase}
|
|
|
|
| 70 |
trimmed_audio, _ = librosa.effects.trim(audio, top_db=30)
|
| 71 |
trimmed_audio = trimmed_audio[:int(sr*0.75)] # max 0.75s
|
| 72 |
|
| 73 |
+
# --- Whisper inference (aliased as Wav2Vec2) ---
|
| 74 |
+
input_values = processor(audio=trimmed_audio, sampling_rate=sr, return_tensors="pt").input_features.to(device)
|
| 75 |
with torch.no_grad():
|
| 76 |
+
generated_ids = model.generate(input_values, max_length=100, language="ar" if language == "Arabic" else "en")
|
| 77 |
+
transcription = processor.batch_decode(generated_ids, skip_special_tokens=True)[0].strip()
|
|
|
|
| 78 |
|
| 79 |
# --- Quick confidence check ---
|
| 80 |
+
# Whisper doesn't output logits directly, so skip this or implement a custom confidence score
|
| 81 |
+
# For simplicity, assume transcription is valid if non-empty
|
| 82 |
+
if not transcription:
|
| 83 |
return {"language": language, "transcription": "Low confidence", "correct": False}
|
| 84 |
|
| 85 |
# --- Single-letter optimization ---
|
|
|
|
| 108 |
return {"Arabic": "ููุจูุฃูููู ุขููุงุกู ุฑูุจููููู
ูุง ุชูููุฐููุจูุงูู", "English": "A"}.get(language, "")
|
| 109 |
|
| 110 |
with gr.Blocks() as demo:
|
| 111 |
+
gr.Markdown("# Fast Multilingual Letter & Word Phoneme Analysis (Wav2Vec Codename)")
|
| 112 |
+
language = gr.Dropdown(["Arabic", "English"], value="English", label="Language")
|
| 113 |
reference_text = gr.Textbox(label="Reference Text", value=get_default_text("English"))
|
| 114 |
audio_input = gr.Audio(label="Record Audio", type="filepath")
|
| 115 |
submit_btn = gr.Button("Analyze")
|
|
|
|
| 118 |
language.change(fn=get_default_text, inputs=language, outputs=reference_text)
|
| 119 |
submit_btn.click(fn=analyze_phonemes, inputs=[language, reference_text, audio_input], outputs=output)
|
| 120 |
|
| 121 |
+
demo.launch()
|