KuyaToto commited on
Commit
bc6b4eb
ยท
verified ยท
1 Parent(s): 63e7642

Update app.py

Browse files
Files changed (1) hide show
  1. app.py +21 -17
app.py CHANGED
@@ -1,5 +1,5 @@
1
  import gradio as gr
2
- from transformers import Wav2Vec2ForCTC, Wav2Vec2Processor
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/smaller models for English & Arabic ---
17
  MODELS = {
18
  "Arabic": {
19
- "processor": Wav2Vec2Processor.from_pretrained("jonatasgrosman/wav2vec2-large-xlsr-53-arabic"),
20
- "model": Wav2Vec2ForCTC.from_pretrained("jonatasgrosman/wav2vec2-large-xlsr-53-arabic").to(device),
21
  "epitran": epitran.Epitran("ara-Arab")
22
  },
23
  "English": {
24
- "processor": Wav2Vec2Processor.from_pretrained("facebook/wav2vec2-base-960h"),
25
- "model": Wav2Vec2ForCTC.from_pretrained("facebook/wav2vec2-base-960h").to(device),
26
  "epitran": epitran.Epitran("eng-Latn")
27
  }
28
  }
29
 
30
  for lang in MODELS.values():
31
- lang["model"].config.ctc_loss_reduction = "mean"
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
- # --- Wav2Vec2 inference ---
70
- input_values = processor(trimmed_audio, sampling_rate=sr, return_tensors="pt").input_values.to(device)
71
  with torch.no_grad():
72
- logits = model(input_values).logits
73
- pred_ids = torch.argmax(logits, dim=-1)
74
- transcription = processor.batch_decode(pred_ids)[0].strip()
75
 
76
  # --- Quick confidence check ---
77
- probs = torch.softmax(logits, dim=-1)
78
- if probs.max(dim=-1).values.mean().item() < 0.6:
 
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()