Spaces:
Paused
Paused
import torch | |
import torchaudio | |
import jiwer | |
from transformers import Wav2Vec2Processor, Wav2Vec2ForCTC | |
# Load the Arabic-specific processor and model | |
model_name = "omarxadel/wav2vec2-large-xlsr-53-arabic-egyptian" | |
processor = Wav2Vec2Processor.from_pretrained(model_name) | |
model = Wav2Vec2ForCTC.from_pretrained(model_name) | |
# Set the model to evaluation mode | |
model.eval() | |
# Define the chunk length in seconds | |
CHUNK_LENGTH = 30 # 30 seconds | |
SAMPLE_RATE = 16000 # 16 kHz | |
def transcribe_chunk(chunk): | |
""" | |
Transcribes a single audio chunk. | |
""" | |
# Process the audio chunk with the processor | |
inputs = processor(chunk, sampling_rate=SAMPLE_RATE, return_tensors="pt", padding=True) | |
# Get logits from the model | |
with torch.no_grad(): | |
logits = model(inputs.input_values).logits | |
# Decode the predicted ids to text | |
predicted_ids = torch.argmax(logits, dim=-1) | |
transcription = processor.batch_decode(predicted_ids, skip_special_tokens=True)[0] | |
return transcription.strip() | |
def transcribe_audio_in_chunks(audio_file): | |
""" | |
Loads an audio file, splits it into chunks, transcribes each chunk, and combines the transcriptions. | |
""" | |
# Load the audio file | |
print("Loading audio file...") | |
waveform, sr = torchaudio.load(audio_file) | |
print(f"Original Sample Rate: {sr}, Waveform shape: {waveform.shape}") | |
# Convert to mono if it's stereo | |
if waveform.shape[0] > 1: | |
waveform = torch.mean(waveform, dim=0, keepdim=True) | |
print(f"Converted to mono. New shape: {waveform.shape}") | |
# Resample if needed | |
if sr != SAMPLE_RATE: | |
print(f"Resampling from {sr} to {SAMPLE_RATE}...") | |
resampler = torchaudio.transforms.Resample(orig_freq=sr, new_freq=SAMPLE_RATE) | |
waveform = resampler(waveform) | |
print(f"Resampled waveform shape: {waveform.shape}") | |
# Calculate the number of samples per chunk | |
chunk_size = CHUNK_LENGTH * SAMPLE_RATE | |
total_samples = waveform.shape[1] | |
num_chunks = (total_samples + chunk_size - 1) // chunk_size # Ceiling division | |
print(f"Total samples: {total_samples}, Chunk size (in samples): {chunk_size}, Number of chunks: {num_chunks}") | |
transcriptions = [] | |
for i in range(num_chunks): | |
start_sample = i * chunk_size | |
end_sample = min(start_sample + chunk_size, total_samples) | |
chunk = waveform[:, start_sample:end_sample].squeeze(0) | |
print(f"Processing chunk {i+1}/{num_chunks}, Samples {start_sample}:{end_sample}") | |
# Normalize the audio | |
chunk = chunk / torch.abs(chunk).max() | |
transcription = transcribe_chunk(chunk.numpy()) | |
transcriptions.append(transcription) | |
print(f"Transcription for chunk {i+1}: {transcription}\n") | |
# Combine all transcriptions | |
full_transcription = ' '.join(transcriptions) | |
return full_transcription.strip() | |
# Define reference transcription for WER calculation | |
reference_transcription = "ูุงู ุงูู ุตูู ุฑุญู ู ุงููู ุชุนุงูู ูููุนูุง ุงููู ุจุนููู ู ูู ุงูุฏุงุฑูู ุงู ูู ูุตู ูุงูุฑุจุง ูู ุงูุฐูุจ ูุงููุถู ูุงูู ุทุนูู ุงุช ุงูุฑุจุง ุดูู ู ู ุงุดูุงู ุงูุจููุน ููู ุชุจุงุฏู ู ุซู ุงูุซู ู ูุงูู ุซู ู ูููุง ููู ู ุงู ุจุงุฒุงุก ู ุงู ููุฐูู ุงุฎุชูุท ุงูุงู ุฑ ุนูู ุงูู ุดุฑููู ูู ู ูู ููุงููุง ุงูู ุง ุงูุจูุน ู ุซู ุงูุฑุจุง ูุนูู ูุฐุง ููู ู ุจุงุฏูู ููุฐุง ููู ู ุจุงุฏูู ููู ุงูู ุจุงุฏูู ุฒูุงุฏู ุจูู ุงูุซู ู ู ุงูู ุซู ู ูููุง ุฒูุงุฏู ุจูู ุงูุซู ู ูุงูู ุซู ู ูู ุง ุงููุฑู ูุญู ูุจูุน ููุดุชุฑู ูุงููุฑู ูู ุงู ุงููู ุณุจุญุงูู ูุชุนุงูู ุงู ุฑ ุจุญุฑู ุฉ ุงูุฑุจุง ู ู ุงุฌู ุงูุญูุงุธ ุนูู ูุธุงู ุงูุงูุชุตุงุฏ ุงูููุฏู ู ู ุฏุงุฎูู ููู ุงุจุงุญ ุงููู ุงูุฑุจุง ููุงู ููุงู ุฒูุงุฏู ูู ูุณูุท ุงูุชุจุงุฏู ุฏูู ุฒูุงุฏุฉ ุงูุงูุชุงุฌ ููุญุฏุซ ุจุฐูู ุงูุชุถุฎู ู ู ุฏุงุฎู ุงููุธุงู ูุงุฐุง ุญุฏุซ ุงูุชุถุฎู ู ู ุฐุงุช ุงููุธุงู ู ุงูุฐู ูุถุงุฑ ุจุฐูู ู ุญุฏูุฏ ุงูุฏุฎู ุงูุฐู ูุถุงุฑ ุจุฐูู ุงููููุฑ ูุญุฑู ุงููู ุงูุฑุจุง ู ู ุงุฌู ุงูุง ููุน ุธูู ุนูู ุงููููุฑ ูุงูุฌุจ ุงูุฒูุงู ุญุชู ูุชุนุงุฏู ุฏุฎู ุงููููุฑ ูุงุฏุงุก ู ูุชุถูุงุช ุงูุญูุงู ูุชุญุฑูู ุงูุฑุจุง ู ุฑุชุจุท ูู ุงููุธุฑ ุงูุงููู ู ุน ุงูุฌุงุจ ุงูุฒูุงู ุญุฑู ุงููู ุงูุฑุจุง ูุงูุฌุจ ุญุฑู ูุงูุฌุจ ุงูุฒูุงู ู ู ุงุฌู ุญู ุงูุฉ ุงูุณุงููุฉ ุงููููุฑ ู ุญุฏูุฏ ุงูุฏุฎู ููุง ูุฌุฏ ุงูุงุณุนุงุฑ ููู ุงูุทุงูู ููุณุชุทูุน ุงู ูุญุตู ุจุงุณุชููุงูู ูู ุง ุงุฎุฐู ู ู ุงูุฒูุงู ู ุง ูุฑูุฏ ู ู ู ูุชุถูุงุช ุงูุญูุงู ูุงุฐุง ูุงู ุงูุงู ุฑ ูุฐูู ููุฐุง ูุธุงู ุฑุจุงูู ุงููู ูุงู ุญุฑุง ูุง ูุณุชุทูุน ุงุญุฏ ุงู ูุชุญูู ููู ูุง ูู ุงุฌุชู ุงุน ููุง ูู ุณูุงุณู ููุง ูู ุงูุชุตุงุฏ ููู ู ุงูู ูุธูู ู ุงูุตูุงู ูุงุฐุง ุฐูุจูุง ุงููุงุณ ููููุง ู ุชุฌุงูุฑูู ุงูุบูู ุจุฌูุงุฑู ุงููููุฑ ูุงููููุฑ ุจุฌูุงุฑู ุงูู ุณููู ูุงูู ุณููู ุจุฌูุงุฑู ุงูุบูู ูุง ูุฑู ุจูููู ุง ูุงูุตู ุงูุงูู ู ูุงุฎ ู ู ุณุจู ุณุจู ุงูู ุงูุตู ุงูุงูู ุงูุบูู ุงู ุณุจู ุงูู ุงูุตู ุงูุซุงูู ุงู ุณุจู ุงูู ุงูุตู ุงูุงูู ุงููููุฑ ูุง ูุณุชุทูุน ุงุญุฏ ุงู ูุฌุฐุจู ู ู ุงูููุชู ุญุชู ูุชุงุฎุฑ ุจุณุจุจ ุบูุงู ุงู ุฌุงูู ุงู ุณูุทุงูู ูุงู ู ู ุฌุงุก ููุฌุฏ ุงูุตูุงู ููููุญู ุจูุง ุญูุซ ู ุง ุงูุชูู ุจู ุงูุตู ููุฐูู ูู ุทูุจ ุงูุนูู ุญูุซ ู ุง ุงูุชูู ุจู ุงูู ุฌูุณ ู ู ุงูู ุชุชุงุชู ูุฐู ุงูููุณูู ุงูุงุจูู ู ู ุฏูู ูุจุฑ ุงูู ุง ุจุนุฒู ูุฑูู ูุงูุณุงููู ุจูุฌูุจ ุงูุฒูุงู ูุงูุฒูุงุฉ ููุณุช ู ูู ููุง ุนุทูู ููุง ูู ูุฏ ุนููุง ู ุจุญุฑู ุฉ ุงูุฑุจุง ุญุชู ูุญุงูุธ ุนูู ุงููุธุงู ุงูุงูุชุตุงุฏู ู ู ุฏุงุฎูู ู ู ุงูุชุถุฎู ุฐูุจุช ุงูุงูุงู ูุฌุงุกุช ุงูุงูุงู ูุชุณูุท ุนูููุง ุงุจุงูุณู ุงูุฌู ูุงูุงูุณ ูุงุฎุฑุฌูุง ุงูุฐูุจ ูุงููุถู ู ู ุงูุชุนุงู ู ูุงุณุชุจุฏููุง ุจูุง ุญููู ุณุฎููู ููู ุญููู ุงููุฑู ุงูููุฏู ุฌุนููุง ูู ุงููุง ุบุทุงุก ุซู ุจุนุฏ ุฐูู ุชูุงุณูุง ุงูุบุทุงุก ูุงุตุจุญ ูุฑูุง ูุง ููู ู ูู ูู ุงูุชุงุฌู ู ุน ููู ุชู ุฏููุงุฑ ุงูุฐูุจ 4 ุฌุฑุงู ูุฑุจุน ูู ุณูุญูุงู ูุทูุน 4 ุฌุฑุงู ูุฑุจุน ุฐูุจ ูู ุตูููุงู ูุทูุน 4 ุฌุฑุงู ูุฑุจุน ุฐูุจ ูู ุจุนูุงู ูุทูุน 4 ุฌุฑุงู ูุฑุจุน ุงูุฐูุจ ููู ุชู ููู ุงููุฑูู ุงู 200 ุฌููู ุงููู ูู ุฌูุจู ู ุชูููู 16 ูุฑุด ุญุชุฉ ุงููุฑูู ุฏู ูุดููุฉ ุงูุงุญุจุงุฑ ุงููู ุนูููุง 16 ูุฑุด ุทุจ ุงููุฑู ุจูู 16 ูุฑุด ู200 ุฌููู ููู ุณูุทุฉ ุงูุฏููู ุณูุทุฉ ุงูุงุตุฏุงุฑ ูุณูุทุฉ ุงูุฏููู ุฏู ุจุชุชุญุณุจ ุงุฒุงู ูู ููุณูุง ุจูุง ูุนูู ุฌูู ู ุตุฑ ูุฏู ูุจูู ุจูุง ูุนูู ุงู 200 ุฌููู 200 ุฌููู ุทุจ ููู ุฎุงุฑุฌูุง ูุจูู ุจููุฉ ุงูุชุงุฌูุง ูุงูุฏููุงุฑ ูุจูู ุจ 50 ุฌููู ุงููู ูู ูุงู ุจ 39 ูุฑุด ููุต ูุนูู ูุงู ุงูุฌููู ุจ 5 ุฏููุงุฑ ูุจุนุฏูู ูู ุง ุงููุงุฑ ุจูู 2 ููุต ูู ุงูุงูู ูู ุงูุงุฑุจุนููุงุช ูุงู ุงูุฌููู ุงูู ุตุฑู ุจ 5 ุฏููุงุฑ 5 ุฏููุงุฑ ูู 50 ุฌููู ูุจูู ุจูุงู ูุจูู ุจ 250 ู ุฑู ูุจูู ุงูุฌููู ุงุจู 40 ุณูุฉ 40 ุจูุณุงูู 250 ุฌููู ู ู ุงูุฌูููุงุช ุงููู ู ุนุงูุง ุฏู ุชุฎูู ุงุถุฑุจ ุฏุฎูู ูู 250 ููู ุณุงููุง ุงูุดูุฎ ููุงู ููุง ุนูุงู ุจุชุงุฎุฏ ูุงู ูููููู ุนุจุงุฑู ุนู 6000 ุฌููู ูู ุงูุดูุฑ ุทุจ 6000 ุฌููู ูู ุงูุดูุฑ ุงุถุฑุจูุง ูู 250 ูุจูู 150 ูุตุงุฏูุง ุตูุฑ ูุจูู ู ูููู ููุต ูุง ุชุฎูู ููุณู ุจูู ุงู ุงูุช ู ุนุงู ู ูููู ููุต ูู ุดูุฑ ูุชุนุฑู ุชุณูู ูุชุนุฑู ุชุดุชุฑู ูู ุนุฑุจูู ู ู ุงู 2 ู ูููู ุฏู ุงูู ุญุงุฌู ุญุชู ุงูุนุฑุจูู ุงู 14 ู ูููู ู ู ูู ุชุฌูุจูุง ุจุณ ุจุงูุชูุณูุท ุงููู ูู ุงูู ุงููู ุญุตู ุชุถุฎู ูุงูุชุถุฎู ุฏู ู ุนูุงุชู ุงูู ู ุนูุงุชู ุงู ูุฐุง ุงููุณูุท ููุชุจุงุฏู ูู ูุนุฏ ุณุจุจุง ูุงุบูุงุก ุงููููุฑ ุงูููุงู ุฏู ููู ูุง ุงุฎู ููููุง ุงูุดุงูุนู ููู ู ุงูููุงู ุงููู ุงุญูุง ูููุงู ุฏู ูุงูุงู ุงู ุงูุบุฒุงูู ุฑูู ุงูุดุงูุนูู ูุงูู ููู ุจููุชุจูู ุนุงุฏู ูุฏู ููููู ุฑุถู ุงููู ุชุนุงูู ุนูู ูู ุงูุงู ูุนูุฉ ุงูุฑุจุง ุชุนุจุฏูู ูุงูุฐูุจ ูุงููุถู ุฌุฒุก ุนูู ูุนูู ุฌุฒุก ุงูุนูู ูุนูู ุงุฐุง ุฎุฑุฌ ุนู ุงูุฐูุจูู ูุงููุถูู ููุง ุฑุจุง ููููู ุงุจู ุงูุญุงุฌุจ ููู ุญุฑู ุงูุฑุจุง ูุฌููุฑูู ุง ุงู ูุฌููุฑูุชูู ุง ุงูุฐูุจ ูุงููุถู ูุฌููุฑูู ุง ุนุดุงู ูู ุฐูุจ ููุถู ููุง ูุงููู ูุณูุท ููุชุจุงุฏู ูุงู ุจู ูุฌููุฑูู ุง ูุฌููุฑูู ุง ูุนูู ูุงููู ุฐูุจ ููุถู ู ุด ูุฌููุฑูุชูู ุง ูุนูู ููููู ูุณูุท ููุชุจุงุฏู ุจูู ุงููุงุณ ูู ูุงู ูุณูุท " | |
# Transcribe the audio file in chunks | |
audio_file = "sidiali_reba_zahab_feda.wav" | |
transcription = transcribe_audio_in_chunks(audio_file) | |
if transcription: | |
print("Final Transcription:\n", transcription) | |
# Calculate Word Error Rate (WER) | |
wer = jiwer.wer(reference_transcription, transcription) | |
print(f"\nWord Error Rate (WER): {wer}") | |
# Save the transcription and WER to a file | |
with open("evaluation_results.txt", "w", encoding="utf-8") as f: | |
f.write(f"Transcription:\n{transcription}\n\n") | |
f.write(f"Reference:\n{reference_transcription}\n\n") | |
f.write(f"Word Error Rate (WER): {wer}\n") | |
print("\nEvaluation results saved to evaluation_results.txt") | |
else: | |
print("Transcription failed.") | |