এটি wav2vec2 পার্ট 1-এর সাথে কাজ করার জন্য একটি সহচর নির্দেশিকা - স্বয়ংক্রিয় বক্তৃতা শনাক্তকরণের জন্য XLS-R ফাইনটিউনিং ("পার্ট 1 গাইড")। চিলির স্প্যানিশ ভাষায় Meta AI-এর wav2vec2 XLS-R ("XLS-R") মডেলকে কীভাবে ফাইনটিউন করা যায় সে বিষয়ে আমি পার্ট 1 গাইড লিখেছি। এটা ধরে নেওয়া হয় যে আপনি সেই গাইডটি সম্পূর্ণ করেছেন এবং আপনার নিজস্ব ফাইনটিউন করা XLS-R মডেল তৈরি করেছেন। এই গাইডটি একটি Kaggle নোটবুকের মাধ্যমে আপনার ফাইনটিউন করা XLS-R মডেলে অনুমান চালানোর পদক্ষেপগুলি ব্যাখ্যা করবে।
গাইডটি সম্পূর্ণ করতে, আপনার থাকতে হবে:
spanish-asr-inference
ব্যবহার করে।এই নির্দেশিকাটি পরীক্ষার ডেটার জন্য পেরুভিয়ান স্প্যানিশ স্পিচ ডেটা সেট ব্যবহার করে। চিলির স্প্যানিশ স্পিচ ডেটা সেটের মতো, পেরুভিয়ান স্পীচ ডেটাসেটেও দুটি সাব-ডেটাসেট রয়েছে: পুরুষ পেরুভিয়ান স্পিকারদের 2,918 রেকর্ডিং এবং মহিলা পেরুভিয়ান স্পিকারদের 2,529 রেকর্ডিং।
এই ডেটাসেটটি 2টি স্বতন্ত্র ডেটাসেট হিসাবে Kaggle-এ আপলোড করা হয়েছে:
Add Input- এ ক্লিক করে এই দুটি ডেটাসেট আপনার Kaggle নোটবুকে যোগ করুন।
আপনি wav2vec2 এর সাথে কাজ করার ধাপ 4- এ আপনার ফাইনটিউন করা মডেলটি সংরক্ষণ করা উচিত ছিল পার্ট 1 - কাগল মডেল হিসাবে স্বয়ংক্রিয় স্পিচ রিকগনিশন গাইডের জন্য XLS-R ফাইনটিউনিং।
অ্যাড ইনপুট- এ ক্লিক করে আপনার কাগল নোটবুকে আপনার ফাইনটিউন করা মডেল যোগ করুন।
নিম্নলিখিত 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
Hz। এই "আসল" স্যাম্পলিং রেট 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]
ত্রয়োদশ সেলটি HuggingFace 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 গাইড দ্বারা উত্পন্ন সূক্ষ্ম সুর করা মডেলটি অত্যাধুনিক নয়, তবে এটি এখনও অনেক অ্যাপ্লিকেশনের জন্য কার্যকর প্রমাণিত হওয়া উচিত। শুভ বিল্ডিং!