यह wav2vec2 भाग 1 के साथ काम करने के लिए एक साथी गाइड है - स्वचालित भाषण पहचान के लिए XLS-R को ठीक करना ("भाग 1 गाइड")। मैंने चिली स्पैनिश पर मेटा AI के wav2vec2 XLS-R ("XLS-R") मॉडल को ठीक करने के तरीके पर भाग 1 गाइड लिखा है। यह माना जाता है कि आपने वह गाइड पूरी कर ली है और अपना खुद का फाइनट्यून XLS-R मॉडल तैयार कर लिया है। यह गाइड आपके फाइनट्यून किए गए XLS-R मॉडल पर कागल नोटबुक के माध्यम से अनुमान चलाने के चरणों की व्याख्या करेगा।
गाइड को पूरा करने के लिए आपके पास ये चीजें होनी चाहिए:
spanish-asr-inference
उपयोग करता है।यह गाइड परीक्षण डेटा के स्रोत के रूप में पेरूवियन स्पैनिश स्पीच डेटा सेट का उपयोग करता है। चिली स्पैनिश स्पीच डेटा सेट की तरह, पेरूवियन स्पीकर्स डेटासेट में भी दो उप-डेटासेट शामिल हैं: पुरुष पेरूवियन स्पीकर्स की 2,918 रिकॉर्डिंग और महिला पेरूवियन स्पीकर्स की 2,529 रिकॉर्डिंग।
यह डेटासेट काग्गल पर 2 अलग-अलग डेटासेट के रूप में अपलोड किया गया है:
इन दोनों डेटासेट को Add Input पर क्लिक करके अपने Kaggle नोटबुक में जोड़ें।
आपको अपने फाइनट्यून किए गए मॉडल को wav2vec2 के साथ कार्य करना भाग 1 - स्वचालित वाक् पहचान के लिए XLS-R को फाइनट्यून करना गाइड के चरण 4 में एक कागल मॉडल के रूप में सहेजना चाहिए था।
Add Input पर क्लिक करके अपने फाइनट्यून्ड मॉडल को अपने कागल नोटबुक में जोड़ें।
निम्नलिखित 16 उप-चरण, अनुमान नोटबुक के 16 कक्षों में से प्रत्येक को क्रम से बनाते हैं। आप देखेंगे कि भाग 1 गाइड से कई उपयोगिता विधियाँ यहाँ उपयोग की गई हैं।
इनफ़रेंस नोटबुक का पहला सेल निर्भरताएँ स्थापित करता है। पहले सेल को इस पर सेट करें:
### 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
तीसरा सेल HuggingFace WER मूल्यांकन मीट्रिक आयात करता है। तीसरे सेल को इस पर सेट करें:
### 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
विधि एक line_index.tsv
डेटासेट इंडेक्स फ़ाइल को पढ़ती है और ऑडियो फ़ाइल नाम और ट्रांसक्रिप्शन डेटा के साथ सूचियों की एक सूची तैयार करती है, उदाहरण के लिए:
[ ["/kaggle/input/google-spanish-speakers-chile-male/clm_08421_01719502739", "Es un viaje de negocios solamente voy por una noche"] ... ]
clean_text
विधि का उपयोग चरण 2.4 में SPECIAL_CHARS
को निर्दिष्ट नियमित अभिव्यक्ति द्वारा निर्दिष्ट वर्णों के प्रत्येक पाठ प्रतिलेखन को हटाने के लिए किया जाता है। विराम चिह्नों सहित इन वर्णों को हटाया जा सकता है क्योंकि ऑडियो सुविधाओं और पाठ प्रतिलेखन के बीच मैपिंग सीखने के लिए मॉडल को प्रशिक्षित करते समय वे कोई अर्थपूर्ण मूल्य प्रदान नहीं करते हैं।get_random_samples
विधि , चरण 2.4 में स्थिरांक NUM_LOAD_FROM_EACH_SET
द्वारा निर्धारित मात्रा के साथ यादृच्छिक परीक्षण नमूनों का एक सेट लौटाती है। छठा सेल ऑडियो डेटा को लोड करने और रीसैंपल करने के लिए torchaudio
का उपयोग करके उपयोगिता विधियों को परिभाषित करता है। छठे सेल को इस पर सेट करें:
### 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
विधि एक निर्दिष्ट ऑडियो फ़ाइल लोड करती है और ऑडियो डेटा के साथ-साथ ऑडियो के सैंपलिंग दर का एक torch.Tensor
बहु-आयामी मैट्रिक्स लौटाती है। प्रशिक्षण डेटा में सभी ऑडियो फ़ाइलों की सैंपलिंग दर 48000
हर्ट्ज है। यह "मूल" सैंपलिंग दर चरण 2.4 में स्थिर ORIG_SAMPLING_RATE
द्वारा कैप्चर की जाती है।resample
विधि का उपयोग ऑडियो डेटा को 48000
की नमूना दर से 16000
की लक्ष्य नमूना दर तक डाउनसैंपल करने के लिए किया जाता है। सातवाँ सेल चरण 2.5 में परिभाषित read_index_file_data
विधि का उपयोग करके पुरुष वक्ताओं की रिकॉर्डिंग और महिला वक्ताओं की रिकॉर्डिंग के लिए परीक्षण डेटा इंडेक्स फ़ाइलों को पढ़ता है। सातवें सेल को इस पर सेट करें:
### 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")
आठवां सेल चरण 2.5 में परिभाषित get_random_samples
विधि का उपयोग करके यादृच्छिक परीक्षण नमूनों के सेट उत्पन्न करता है। आठवें सेल को इस पर सेट करें:
### 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
दसवाँ सेल प्रत्येक परीक्षण डेटा नमूने पर पुनरावृत्ति करता है और चरण 2.5 में परिभाषित clean_text
विधि का उपयोग करके संबंधित प्रतिलेखन पाठ को साफ़ करता है। दसवाँ सेल इस पर सेट करें:
### 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])
ग्यारहवाँ सेल all_test_samples
सूची में निर्दिष्ट प्रत्येक ऑडियो फ़ाइल को लोड करता है। ग्यारहवें सेल को इस पर सेट करें:
### 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
के रूप में लौटाया जाता है और all_test_data
में शब्दकोशों की सूची के रूप में संग्रहीत किया जाता है। प्रत्येक शब्दकोश में किसी विशेष नमूने के लिए ऑडियो डेटा, नमूना दर और ऑडियो का टेक्स्ट ट्रांसक्रिप्शन होता है। बारहवाँ सेल ऑडियो डेटा को 16000
की लक्ष्य नमूना दर पर पुनः नमूना करता है। बारहवें सेल को इस पर सेट करें:
### 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]
तेरहवीं सेल हगिंगफेस transformer
लाइब्रेरी pipeline
क्लास का एक इंस्टेंस आरंभ करती है। तेरहवीं सेल को इस पर सेट करें:
### CELL 13: Initialize instance of Automatic Speech Recognition Pipeline ### transcriber = pipeline("automatic-speech-recognition", model = "YOUR_FINETUNED_MODEL_PATH")
model
पैरामीटर को चरण 1.3 में कागल नोटबुक में जोड़े गए आपके फाइनट्यून्ड मॉडल के पथ पर सेट किया जाना चाहिए, उदाहरण के लिए:
transcriber = pipeline("automatic-speech-recognition", model = "/kaggle/input/xls-r-300m-chilean-spanish/transformers/hardy-pine/1")
चौदहवाँ सेल, टेक्स्ट पूर्वानुमान उत्पन्न करने के लिए परीक्षण डेटा पर पिछले चरण में आरंभ किए गए transcriber
कॉल करता है। चौदहवें सेल को इस पर सेट करें:
### CELL 14: Generate transcriptions ### transcriptions = transcriber(all_test_data)
पंद्रहवीं सेल प्रत्येक पूर्वानुमान के लिए WER स्कोर की गणना करती है, साथ ही सभी पूर्वानुमानों के लिए समग्र WER स्कोर की गणना करती है। पंद्रहवीं सेल को इस प्रकार सेट करें:
### 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)
सोलहवीं और अंतिम सेल पिछले चरण से WER गणनाओं को प्रिंट करती है। सोलहवीं सेल को इस प्रकार सेट करें:
### CELL 16: Output WER metrics ### pd.set_option("display.max_colwidth", None) print(f"Overall WER: {wer}") print(df)
चूंकि नोटबुक परीक्षण डेटा के यादृच्छिक नमूनों पर पूर्वानुमान उत्पन्न करता है, इसलिए नोटबुक चलाने पर हर बार आउटपुट अलग-अलग होगा। कुल 6 परीक्षण नमूनों के लिए NUM_LOAD_FROM_EACH_SET
को 3
पर सेट करके नोटबुक चलाने पर निम्नलिखित आउटपुट उत्पन्न हुआ:
Overall WER: 0.013888888888888888 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
जैसा कि देखा जा सकता है, मॉडल ने बहुत बढ़िया काम किया! इसने छठे सैंपल (इंडेक्स 5
) के साथ केवल एक त्रुटि की, शब्द septiembre
setiembre
के रूप में गलत तरीके से लिखा। बेशक, नोटबुक को अलग-अलग टेस्ट सैंपल के साथ फिर से चलाने से और, इससे भी महत्वपूर्ण बात, बड़ी संख्या में टेस्ट सैंपल के साथ, अलग और अधिक जानकारीपूर्ण परिणाम मिलेंगे। फिर भी, यह सीमित डेटा बताता है कि मॉडल स्पेनिश की विभिन्न बोलियों पर अच्छा प्रदर्शन कर सकता है - यानी इसे चिली स्पैनिश पर प्रशिक्षित किया गया था, लेकिन यह पेरूवियन स्पैनिश पर अच्छा प्रदर्शन करता है।
यदि आप अभी wav2vec2 मॉडल के साथ काम करना सीख रहे हैं, तो मुझे उम्मीद है कि wav2vec2 के साथ काम करना भाग 1 - स्वचालित स्पीच रिकॉग्निशन के लिए XLS-R को फ़ाइनट्यून करना गाइड और यह गाइड आपके लिए उपयोगी रही होगी। जैसा कि बताया गया है, भाग 1 गाइड द्वारा उत्पन्न फ़ाइनट्यून मॉडल बहुत अत्याधुनिक नहीं है, लेकिन फिर भी कई अनुप्रयोगों के लिए उपयोगी साबित होना चाहिए। हैप्पी बिल्डिंग!