paint-brush
wav2vec2 के साथ कार्य करना भाग 2 - फ़ाइनट्यून्ड ASR मॉडल पर इन्फ़रेंस चलानाद्वारा@pictureinthenoise
510 रीडिंग
510 रीडिंग

wav2vec2 के साथ कार्य करना भाग 2 - फ़ाइनट्यून्ड ASR मॉडल पर इन्फ़रेंस चलाना

द्वारा Picture in the Noise11m2024/05/07
Read on Terminal Reader

बहुत लंबा; पढ़ने के लिए

यह साथी गाइड फ़ाइनट्यून्ड wav2vec2 XLS-R मॉडल पर अनुमान चलाने के चरणों की व्याख्या करता है। यह गाइड "wav2vec2 भाग 1 के साथ काम करना - स्वचालित स्पीच पहचान के लिए XLS-R को फ़ाइनट्यूनिंग करना" का पूरक है। यह गाइड एक कागल नोटबुक बनाने के बारे में चरण-दर-चरण निर्देश प्रदान करता है जिसका उपयोग अनुमान चलाने के लिए किया जा सकता है।
featured image - wav2vec2 के साथ कार्य करना भाग 2 - फ़ाइनट्यून्ड ASR मॉडल पर इन्फ़रेंस चलाना
Picture in the Noise HackerNoon profile picture
0-item
1-item

परिचय

यह wav2vec2 भाग 1 के साथ काम करने के लिए एक साथी गाइड है - स्वचालित भाषण पहचान के लिए XLS-R को ठीक करना ("भाग 1 गाइड")। मैंने चिली स्पैनिश पर मेटा AI के wav2vec2 XLS-R ("XLS-R") मॉडल को ठीक करने के तरीके पर भाग 1 गाइड लिखा है। यह माना जाता है कि आपने वह गाइड पूरी कर ली है और अपना खुद का फाइनट्यून XLS-R मॉडल तैयार कर लिया है। यह गाइड आपके फाइनट्यून किए गए XLS-R मॉडल पर कागल नोटबुक के माध्यम से अनुमान चलाने के चरणों की व्याख्या करेगा।

पूर्वापेक्षाएँ और आरंभ करने से पहले

गाइड को पूरा करने के लिए आपके पास ये चीजें होनी चाहिए:


  • स्पैनिश भाषा के लिए एक परिष्कृत XLS-R मॉडल।
  • एक मौजूदा Kaggle खाता .
  • पायथन का मध्यवर्ती ज्ञान.
  • कागल नोटबुक के साथ काम करने का मध्यवर्ती ज्ञान।
  • एमएल अवधारणाओं का मध्यवर्ती ज्ञान।
  • एएसआर अवधारणाओं का बुनियादी ज्ञान।

अनुमान नोटबुक का निर्माण

चरण 1 - अपना कागल वातावरण स्थापित करना

चरण 1.1 - एक नई कागल नोटबुक बनाना

  1. कागल में लॉग इन करें.
  2. एक नया कागल नोटबुक बनाएं.
  3. नोटबुक का नाम इच्छानुसार बदला जा सकता है। यह गाइड नोटबुक नाम spanish-asr-inference उपयोग करता है।

चरण 1.2 - परीक्षण डेटासेट जोड़ना

यह गाइड परीक्षण डेटा के स्रोत के रूप में पेरूवियन स्पैनिश स्पीच डेटा सेट का उपयोग करता है। चिली स्पैनिश स्पीच डेटा सेट की तरह, पेरूवियन स्पीकर्स डेटासेट में भी दो उप-डेटासेट शामिल हैं: पुरुष पेरूवियन स्पीकर्स की 2,918 रिकॉर्डिंग और महिला पेरूवियन स्पीकर्स की 2,529 रिकॉर्डिंग।


यह डेटासेट काग्गल पर 2 अलग-अलग डेटासेट के रूप में अपलोड किया गया है:


इन दोनों डेटासेट को Add Input पर क्लिक करके अपने Kaggle नोटबुक में जोड़ें।

चरण 1.3 - फ़ाइनट्यून्ड मॉडल जोड़ना

आपको अपने फाइनट्यून किए गए मॉडल को wav2vec2 के साथ कार्य करना भाग 1 - स्वचालित वाक् पहचान के लिए XLS-R को फाइनट्यून करना गाइड के चरण 4 में एक कागल मॉडल के रूप में सहेजना चाहिए था।


Add Input पर क्लिक करके अपने फाइनट्यून्ड मॉडल को अपने कागल नोटबुक में जोड़ें।

चरण 2 - अनुमान नोटबुक का निर्माण

निम्नलिखित 16 उप-चरण, अनुमान नोटबुक के 16 कक्षों में से प्रत्येक को क्रम से बनाते हैं। आप देखेंगे कि भाग 1 गाइड से कई उपयोगिता विधियाँ यहाँ उपयोग की गई हैं।

चरण 2.1 - सेल 1: पैकेज स्थापित करना

इनफ़रेंस नोटबुक का पहला सेल निर्भरताएँ स्थापित करता है। पहले सेल को इस पर सेट करें:


 ### CELL 1: Install Packages ### !pip install --upgrade torchaudio !pip install jiwer

चरण 2.2 - सेल 2: पायथन पैकेज आयात करना

दूसरा सेल आवश्यक पायथन पैकेज आयात करता है। दूसरे सेल को इस पर सेट करें:


 ### 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

चरण 2.3 - सेल 3: WER मीट्रिक लोड करना

तीसरा सेल HuggingFace WER मूल्यांकन मीट्रिक आयात करता है। तीसरे सेल को इस पर सेट करें:


 ### CELL 3: Load WER metric ### wer_metric = load_metric("wer")


  • WER का उपयोग परीक्षण डेटा पर परिष्कृत मॉडल के प्रदर्शन को मापने के लिए किया जाएगा।

चरण 2.4 - सेल 4: स्थिरांक सेट करना

चौथा सेल स्थिरांक सेट करता है जिसका उपयोग पूरी नोटबुक में किया जाएगा। चौथे सेल को इस प्रकार सेट करें:


 ### 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

चरण 2.5 - सेल 5: इंडेक्स फ़ाइलें पढ़ने, टेक्स्ट साफ़ करने और शब्दावली बनाने के लिए उपयोगिता विधियाँ

पांचवां सेल डेटासेट इंडेक्स फ़ाइलों को पढ़ने के लिए उपयोगिता विधियों को परिभाषित करता है, साथ ही ट्रांसक्रिप्शन टेक्स्ट को साफ करने और परीक्षण डेटा से नमूनों का एक यादृच्छिक सेट बनाने के लिए भी। पांचवें सेल को इस पर सेट करें:


 ### 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 द्वारा निर्धारित मात्रा के साथ यादृच्छिक परीक्षण नमूनों का एक सेट लौटाती है।

चरण 2.6 - सेल 6: ऑडियो डेटा लोड करने और रीसैंपलिंग के लिए उपयोगिता विधियाँ

छठा सेल ऑडियो डेटा को लोड करने और रीसैंपल करने के लिए 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.7 - सेल 7: परीक्षण डेटा पढ़ना

सातवाँ सेल चरण 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.8 - सेल 8: यादृच्छिक परीक्षण नमूनों की सूची तैयार करना

आठवां सेल चरण 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)

चरण 2.9 - सेल 9: परीक्षण डेटा का संयोजन

नौवां सेल पुरुष परीक्षण नमूनों और महिला परीक्षण नमूनों को एक सूची में जोड़ता है। नौवें सेल को इस प्रकार सेट करें:


 ### CELL 9: Combine test data ### all_test_samples = random_test_samples_male + random_test_samples_female

चरण 2.10 - सेल 10: सफाई प्रतिलेखन परीक्षण

दसवाँ सेल प्रत्येक परीक्षण डेटा नमूने पर पुनरावृत्ति करता है और चरण 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])

चरण 2.11 - सेल 11: ऑडियो डेटा लोड करना

ग्यारहवाँ सेल 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 में शब्दकोशों की सूची के रूप में संग्रहीत किया जाता है। प्रत्येक शब्दकोश में किसी विशेष नमूने के लिए ऑडियो डेटा, नमूना दर और ऑडियो का टेक्स्ट ट्रांसक्रिप्शन होता है।

चरण 2.12 - सेल 12: ऑडियो डेटा का पुनः नमूनाकरण

बारहवाँ सेल ऑडियो डेटा को 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]

चरण 2.13 - सेल 13: स्वचालित वाक् पहचान पाइपलाइन का इंस्टेंस आरंभ करना

तेरहवीं सेल हगिंगफेस 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")

चरण 2.14 - सेल 14: पूर्वानुमान उत्पन्न करना

चौदहवाँ सेल, टेक्स्ट पूर्वानुमान उत्पन्न करने के लिए परीक्षण डेटा पर पिछले चरण में आरंभ किए गए transcriber कॉल करता है। चौदहवें सेल को इस पर सेट करें:


 ### CELL 14: Generate transcriptions ### transcriptions = transcriber(all_test_data)

चरण 2.15 - सेल 15: WER मेट्रिक्स की गणना

पंद्रहवीं सेल प्रत्येक पूर्वानुमान के लिए 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)

चरण 2.16 - सेल 16: WER मेट्रिक्स का मुद्रण

सोलहवीं और अंतिम सेल पिछले चरण से 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 गाइड द्वारा उत्पन्न फ़ाइनट्यून मॉडल बहुत अत्याधुनिक नहीं है, लेकिन फिर भी कई अनुप्रयोगों के लिए उपयोगी साबित होना चाहिए। हैप्पी बिल्डिंग!