Bu , wav2vec2 ile Çalışmak Bölüm 1 - Otomatik Konuşma Tanıma için XLS-R'nin İnce Ayarı ("Bölüm 1 kılavuzu") ile ilgili yardımcı bir kılavuzdur. Meta AI'nın modeline Şili İspanyolcasında nasıl ince ayar yapılacağına dair Bölüm 1 kılavuzunu yazdım. Bu kılavuzu tamamladığınız ve kendi ince ayarlı XLS-R modelinizi oluşturduğunuz varsayılmaktadır. Bu kılavuz, Kaggle Notebook aracılığıyla ince ayarlı XLS-R modelinizde çıkarım yürütme adımlarını açıklayacaktır.
spanish-asr-inference
defteri adını kullanır.Bu kılavuz, test verilerinin kaynağı olarak kullanır. gibi, Perulu konuşmacılar veri seti de iki alt veri kümesinden oluşur: Perulu erkek konuşmacıların 2.918 kaydı ve Perulu kadın konuşmacıların 2.529 kaydı.
Giriş Ekle seçeneğine tıklayarak bu veri kümelerinin her ikisini de Kaggle Not Defterinize ekleyin.
İnce ayarlı modelinizi wav2vec2 ile Çalışmak Bölüm 1 - Otomatik Konuşma Tanıma için XLS-R'yi Kaggle Modeli Olarak İnce Ayarlama kılavuzunun 4. Adımına kaydetmiş olmanız gerekir.
İnce ayarları yapılmış modelinizi Giriş Ekle seçeneğine tıklayarak Kaggle Notebook'unuza ekleyin.
### CELL 1: Install Packages ### !pip install --upgrade torchaudio !pip install jiwer
### CELL 2: Import Python packages ### import re import math import random import pandas as pd import torchaudio from datasets import load_metric from transformers import pipeline
### CELL 3: Load WER metric ### wer_metric = load_metric("wer")
### CELL 4: Constants ### # Testing data TEST_DATA_PATH_MALE = "/kaggle/input/google-spanish-speakers-peru-male/" TEST_DATA_PATH_FEMALE = "/kaggle/input/google-spanish-speakers-peru-female/" EXT = ".wav" NUM_LOAD_FROM_EACH_SET = 3 # Special characters SPECIAL_CHARS = r"[\d\,\-\;\!\¡\?\¿\।\'\'\"\–\'\:\/\.\“\”\৷\…\‚\॥\\]" # Sampling rates ORIG_SAMPLING_RATE = 48000 TGT_SAMPLING_RATE = 16000
### CELL 5: Utility methods for reading index files, cleaning text, random indices generator ### def read_index_file_data(path: str, filename: str): data = [] with open(path + filename, "r", encoding = "utf8") as f: lines = f.readlines() for line in lines: file_and_text = line.split("\t") data.append([path + file_and_text[0] + EXT, file_and_text[1].replace("\n", "")]) return data def clean_text(text: str) -> str: cleaned_text = re.sub(SPECIAL_CHARS, "", text) cleaned_text = cleaned_text.lower() return cleaned_text def get_random_samples(dataset: list, num: int) -> list: used = [] samples = [] for i in range(num): a = -1 while a == -1 or a in used: a = math.floor(len(dataset) * random.random()) samples.append(dataset[a]) used.append(a) return samples
read_index_file_data
yöntemi line_index.tsv
veri kümesi indeks dosyasını okur ve ses dosyası adı ve transkripsiyon verilerini içeren listelerin bir listesini üretir, örneğin:
[ ["/kaggle/input/google-spanish-speakers-chile-male/clm_08421_01719502739", "Es un viaje de negocios solamente voy por una noche"] ... ]
clean_text
yöntemi , Adım 2.4'te SPECIAL_CHARS
atanan normal ifade tarafından belirtilen karakterlerin her metin transkripsiyonunu çıkarmak için kullanılır. Noktalama işaretleri de dahil olmak üzere bu karakterler, modeli ses özellikleri ve metin transkripsiyonları arasındaki eşlemeleri öğrenmek üzere eğitirken herhangi bir anlamsal değer sağlamadıkları için ortadan kaldırılabilir.get_random_samples
yöntemi , Adım 2.4'te NUM_LOAD_FROM_EACH_SET
sabiti tarafından belirlenen miktara sahip bir dizi rastgele test örneği döndürür. Altıncı hücre, ses verilerini yüklemek ve yeniden örneklemek için torchaudio
kullanan yardımcı program yöntemlerini tanımlar. Altıncı hücreyi şu şekilde ayarlayın:
### CELL 7: Utility methods for loading and resampling audio data ### def read_audio_data(file): speech_array, sampling_rate = torchaudio.load(file, normalize = True) return speech_array, sampling_rate def resample(waveform): transform = torchaudio.transforms.Resample(ORIG_SAMPLING_RATE, TGT_SAMPLING_RATE) waveform = transform(waveform) return waveform[0]
read_audio_data
yöntemi, belirtilen bir ses dosyasını yükler ve bir torch.Tensor
döndürür. Sesin örnekleme hızıyla birlikte ses verilerinin çok boyutlu matrisini tensor edin. Eğitim verilerindeki tüm ses dosyalarının örnekleme hızı 48000
Hz'dir. Bu "orijinal" örnekleme hızı, Adım 2.4'teki ORIG_SAMPLING_RATE
sabiti tarafından yakalanır.resample
yöntemi, ses verilerini 48000
örnekleme oranından 16000
hedef örnekleme hızına alt örneklemek için kullanılır. Yedinci hücre, Adım 2.5'te tanımlanan read_index_file_data
yöntemini kullanarak erkek konuşmacıların kayıtları ve kadın konuşmacıların kayıtları için test veri indeks dosyalarını okur. Yedinci hücreyi şu şekilde ayarlayın:
### CELL 7: Read test data ### test_data_male = read_index_file_data(TEST_DATA_PATH_MALE, "line_index.tsv") test_data_female = read_index_file_data(TEST_DATA_PATH_FEMALE, "line_index.tsv")
Sekizinci hücre, Adım 2.5'te tanımlanan get_random_samples
yöntemini kullanarak rastgele test örnekleri kümeleri oluşturur. Sekizinci hücreyi şu şekilde ayarlayın:
### CELL 8: Generate lists of random test samples ### random_test_samples_male = get_random_samples(test_data_male, NUM_LOAD_FROM_EACH_SET) random_test_samples_female = get_random_samples(test_data_female, NUM_LOAD_FROM_EACH_SET)
### CELL 9: Combine test data ### all_test_samples = random_test_samples_male + random_test_samples_female
Onuncu hücre, her test veri örneği üzerinde yinelenir ve Adım 2.5'te tanımlanan clean_text
yöntemini kullanarak ilgili transkripsiyon metnini temizler. Onuncu hücreyi şu şekilde ayarlayın:
### CELL 10: Clean text transcriptions ### for index in range(len(all_test_samples)): all_test_samples[index][1] = clean_text(all_test_samples[index][1])
On birinci hücre, all_test_samples
listesinde belirtilen her ses dosyasını yükler. Onbirinci hücreyi şu şekilde ayarlayın:
### CELL 11: Load audio data ### all_test_data = [] for index in range(len(all_test_samples)): speech_array, sampling_rate = read_audio_data(all_test_samples[index][0]) all_test_data.append({ "raw": speech_array, "sampling_rate": sampling_rate, "target_text": all_test_samples[index][1] })
torch.Tensor
olarak döndürülür ve all_test_data
bir sözlük listesi olarak saklanır. Her sözlük belirli bir örnek için ses verilerini, örnekleme hızını ve sesin metin transkripsiyonunu içerir. On ikinci hücre, ses verilerini 16000
hedef örnekleme hızına yeniden örnekler. On ikinci hücreyi şu şekilde ayarlayın:
### CELL 12: Resample audio data and cast to NumPy arrays ### all_test_data = [{"raw": resample(sample["raw"]).numpy(), "sampling_rate": TGT_SAMPLING_RATE, "target_text": sample["target_text"]} for sample in all_test_data]
On üçüncü hücre, HuggingFace transformer
kütüphanesi pipeline
sınıfının bir örneğini başlatır. On üçüncü hücreyi şu şekilde ayarlayın:
### CELL 13: Initialize instance of Automatic Speech Recognition Pipeline ### transcriber = pipeline("automatic-speech-recognition", model = "YOUR_FINETUNED_MODEL_PATH")
model
parametresi, Adım 1.3'te Kaggle Notebook'a eklenen ince ayarlı modelinizin yoluna ayarlanmalıdır, örneğin:
transcriber = pipeline("automatic-speech-recognition", model = "/kaggle/input/xls-r-300m-chilean-spanish/transformers/hardy-pine/1")
On dördüncü hücre, metin tahminleri oluşturmak için test verileri üzerinde önceki adımda başlatılan transcriber
çağırır. On dördüncü hücreyi şu şekilde ayarlayın:
### CELL 14: Generate transcriptions ### transcriptions = transcriber(all_test_data)
### CELL 15: Calculate WER metrics ### predictions = [transcription["text"] for transcription in transcriptions] references = [transcription["target_text"][0] for transcription in transcriptions] wers = [] for p in range(len(predictions)): wer = wer_metric.compute(predictions = [predictions[p]], references = [references[p]]) wers.append(wer) zipped = list(zip(predictions, references, wers)) df = pd.DataFrame(zipped, columns=["Prediction", "Reference", "WER"]) wer = wer_metric.compute(predictions = predictions, references = references)
### CELL 16: Output WER metrics ### pd.set_option("display.max_colwidth", None) print(f"Overall WER: {wer}") print(df)
Dizüstü bilgisayar, test verilerinin rastgele örnekleri üzerinde tahminler ürettiğinden, dizüstü bilgisayar her çalıştırıldığında çıktı değişecektir. Toplam 6 test örneği için NUM_LOAD_FROM_EACH_SET
3
ayarlandığı bir dizüstü bilgisayar çalıştırmasında aşağıdaki çıktı oluşturuldu:
Overall WER: 0.0888888 Prediction \ 0 quiero que me reserves el mejor asiento del teatro 1 el llano en llamas es un clásico de juan rulfo 2 el cuadro de los alcatraces es una de las pinturas más famosas de diego rivera 3 hay tres cafés que están abiertos hasta las once de la noche 4 quiero que me recomiendes una dieta pero donde uno pueda comer algo no puras verduras 5 cuántos albergues se abrieron después del terremoto del diecinueve de setiembre Reference \ 0 quiero que me reserves el mejor asiento del teatro 1 el llano en llamas es un clásico de juan rulfo 2 el cuadro de los alcatraces es una de las pinturas más famosas de diego rivera 3 hay tres cafés que están abiertos hasta las once de la noche 4 quiero que me recomiendes una dieta pero donde uno pueda comer algo no puras verduras 5 cuántos albergues se abrieron después del terremoto del diecinueve de septiembre WER 0 0.000000 1 0.000000 2 0.000000 3 0.000000 4 0.000000 5 0.090909
Görüldüğü gibi model mükemmel bir iş çıkardı! Altıncı örnekte (indeks 5
) yalnızca bir hata yaptı ve septiembre
kelimesini setiembre
olarak yanlış yazdı. Elbette dizüstü bilgisayarı farklı test örnekleriyle ve daha da önemlisi daha fazla sayıda test örneğiyle yeniden çalıştırmak farklı ve daha bilgilendirici sonuçlar üretecektir. Bununla birlikte, bu sınırlı veriler, modelin İspanyolca'nın farklı lehçelerinde iyi performans gösterebileceğini, yani Şili İspanyolcası üzerinde eğitim aldığını ancak Peru İspanyolcasında iyi performans gösterdiğini gösteriyor.
wav2vec2 modelleriyle nasıl çalışılacağını yeni öğreniyorsanız, wav2vec2 ile Çalışmak Bölüm 1 - Otomatik Konuşma Tanıma için XLS-R İnce Ayarı kılavuzunun ve bu kılavuzun sizin için yararlı olduğunu umuyorum. Bahsedildiği gibi, Bölüm 1 kılavuzu tarafından oluşturulan ince ayarlı model son teknoloji ürünü değildir ancak yine de birçok uygulama için yararlı olduğu kanıtlanmalıdır. Mutlu bina!