একটি এলএম হেড সহ ফাইন-টিউনিং Wav2Vec2

TensorFlow.org এ দেখুন Google Colab-এ চালান GitHub এ দেখুন নোটবুক ডাউনলোড করুন TF হাব মডেল দেখুন

এই নোটবুক, আমরা থেকে প্রাক প্রশিক্ষিত wav2vec2 মডেল লোড করা হবে TFHub এবং সূক্ষ্ম টিউন তে এটি হবে LibriSpeech ডেটা সেটটি আমাদের প্রাক প্রশিক্ষণ মডেল উপরের উপর ভাষা মডেলিং মাথা (lm) সংযোজন করে। অন্তর্নিহিত কাজের একটি মডেল গড়ে তুলতে জন্য স্বয়ংক্রিয় ভাষ্য সনাক্তকরণটিতে কিছু বক্তৃতা, মডেল পাঠ্যে সেটিকে লিপিবদ্ধ করতে সক্ষম হওয়া উচিত দেওয়া অর্থাৎ।

ঠিককরা

এই নোটবুক চালানোর আগে, দয়া করে নিশ্চিত করুন যে আপনি জিপিইউ রানটাইম (চালু হয় Runtime > Change runtime type > GPU )। নিম্নলিখিত সেল ইনস্টল করবে gsoc-wav2vec2 প্যাকেজ ও এর নির্ভরতা।

pip3 install -q git+https://github.com/vasudevgupta7/gsoc-wav2vec2@main
sudo apt-get install -y libsndfile1-dev
pip3 install -q SoundFile
The following packages were automatically installed and are no longer required:
  linux-gcp-5.4-headers-5.4.0-1040 linux-gcp-5.4-headers-5.4.0-1043
  linux-gcp-5.4-headers-5.4.0-1044 linux-gcp-5.4-headers-5.4.0-1049
  linux-headers-5.4.0-1049-gcp linux-image-5.4.0-1049-gcp
  linux-modules-5.4.0-1049-gcp linux-modules-extra-5.4.0-1049-gcp
Use 'sudo apt autoremove' to remove them.
The following additional packages will be installed:
  libflac-dev libogg-dev libvorbis-dev libvorbisfile3
The following NEW packages will be installed:
  libflac-dev libogg-dev libsndfile1-dev libvorbis-dev libvorbisfile3
0 upgraded, 5 newly installed, 0 to remove and 143 not upgraded.
Need to get 1040 kB of archives.
After this operation, 4481 kB of additional disk space will be used.
Get:1 http://asia-east1.gce.archive.ubuntu.com/ubuntu bionic/main amd64 libogg-dev amd64 1.3.2-1 [156 kB]
Get:2 http://asia-east1.gce.archive.ubuntu.com/ubuntu bionic/main amd64 libflac-dev amd64 1.3.2-1 [260 kB]
Get:3 http://asia-east1.gce.archive.ubuntu.com/ubuntu bionic/main amd64 libvorbisfile3 amd64 1.3.5-4.2 [16.0 kB]
Get:4 http://asia-east1.gce.archive.ubuntu.com/ubuntu bionic/main amd64 libvorbis-dev amd64 1.3.5-4.2 [321 kB]
Get:5 http://asia-east1.gce.archive.ubuntu.com/ubuntu bionic-updates/main amd64 libsndfile1-dev amd64 1.0.28-4ubuntu0.18.04.2 [287 kB]
Fetched 1040 kB in 1s (1041 kB/s)
Selecting previously unselected package libogg-dev:amd64.
(Reading database ... 282211 files and directories currently installed.)
Preparing to unpack .../libogg-dev_1.3.2-1_amd64.deb ...
Unpacking libogg-dev:amd64 (1.3.2-1) ...
Selecting previously unselected package libflac-dev:amd64.
Preparing to unpack .../libflac-dev_1.3.2-1_amd64.deb ...
Unpacking libflac-dev:amd64 (1.3.2-1) ...
Selecting previously unselected package libvorbisfile3:amd64.
Preparing to unpack .../libvorbisfile3_1.3.5-4.2_amd64.deb ...
Unpacking libvorbisfile3:amd64 (1.3.5-4.2) ...
Selecting previously unselected package libvorbis-dev:amd64.
Preparing to unpack .../libvorbis-dev_1.3.5-4.2_amd64.deb ...
Unpacking libvorbis-dev:amd64 (1.3.5-4.2) ...
Selecting previously unselected package libsndfile1-dev.
Preparing to unpack .../libsndfile1-dev_1.0.28-4ubuntu0.18.04.2_amd64.deb ...
Unpacking libsndfile1-dev (1.0.28-4ubuntu0.18.04.2) ...
Setting up libvorbisfile3:amd64 (1.3.5-4.2) ...
Setting up libogg-dev:amd64 (1.3.2-1) ...
Setting up libvorbis-dev:amd64 (1.3.5-4.2) ...
Setting up libflac-dev:amd64 (1.3.2-1) ...
Setting up libsndfile1-dev (1.0.28-4ubuntu0.18.04.2) ...
Processing triggers for libc-bin (2.27-3ubuntu1.2) ...

মডেল সেটআপ ব্যবহার TFHub

আমরা কিছু লাইব্রেরি/মডিউল আমদানি করে শুরু করব।

import os

import tensorflow as tf
import tensorflow_hub as hub
from wav2vec2 import Wav2Vec2Config

config = Wav2Vec2Config()

print("TF version:", tf.__version__)
TF version: 2.7.0

প্রথমত, আমরা TFHub থেকে আমাদের মডেল ডাউনলোড করবে ও আমাদের মডেল স্বাক্ষর মোড়ানো হবে hub.KerasLayer অন্য কোন Keras স্তর মত এই মডেল ব্যবহার করতে সক্ষম হতে হবে। সৌভাগ্যবসত, hub.KerasLayer মাত্র 1 লাইন উভয় করতে পারেন।

pretrained_layer = hub.KerasLayer("https://tfhub.dev/vasudevgupta7/wav2vec2/1", trainable=True)

আপনি এই পাঠাতে পারেন স্ক্রিপ্ট যদি আপনি মডেল রপ্তানি স্ক্রিপ্ট আগ্রহী। অবজেক্ট pretrained_layer এর ফ্রিজ হইয়া গেল সংস্করণ Wav2Vec2Model । এই প্রাক প্রশিক্ষিত ওজন HuggingFace PyTorch থেকে রূপান্তরিত হয়েছে প্রাক প্রশিক্ষিত ওজন ব্যবহার এই স্ক্রিপ্টের

মূলত, wav2vec2 একটি মুখোশযুক্ত ভাষা মডেলিং পদ্ধতির সাথে প্রাক-প্রশিক্ষিত ছিল যার উদ্দেশ্য একটি মুখোশযুক্ত সময়ের পদক্ষেপের জন্য সত্যিকারের কোয়ান্টাইজড সুপ্ত বক্তৃতা উপস্থাপনা শনাক্ত করা। আপনি paper- প্রশিক্ষণ উদ্দেশ্য সম্বন্ধে আরও পড়তে পারেন স্পিচ উপস্থাপনা স্ব-তত্ত্বাবধানে থাকা শেখার জন্য একটি ফ্রেমওয়ার্ক: wav2vec 2.0

এখন, আমরা কয়েকটি ধ্রুবক এবং হাইপার-প্যারামিটার সংজ্ঞায়িত করব যা পরবর্তী কয়েকটি কোষে কার্যকর হবে। AUDIO_MAXLEN ইচ্ছাকৃতভাবে সেট করা হয় 246000 যেমন মডেল স্বাক্ষর শুধুমাত্র স্ট্যাটিক ক্রম দৈর্ঘ্য গ্রহণ 246000

AUDIO_MAXLEN = 246000
LABEL_MAXLEN = 256
BATCH_SIZE = 2

নিম্নলিখিত সেল, আমরা মোড়ানো হবে pretrained_layer সঙ্গে & A ঘন স্তর (lm মাথা) Keras এর প্রায়োগিক এপিআই

inputs = tf.keras.Input(shape=(AUDIO_MAXLEN,))
hidden_states = pretrained_layer(inputs)
outputs = tf.keras.layers.Dense(config.vocab_size)(hidden_states)

model = tf.keras.Model(inputs=inputs, outputs=outputs)

ঘন স্তর (উপরে সংজ্ঞায়িত) এর একটি আউটপুট মাত্রা হচ্ছে না vocab_size হিসাবে আমরা প্রতিটি সময় পদে পদে শব্দভান্ডার মধ্যে প্রতিটি টোকেন এর সম্ভাব্যতা ভবিষ্যদ্বাণী করা চাই।

প্রশিক্ষণ রাষ্ট্র সেট আপ

TensorFlow মডেলের ওজন শুধুমাত্র বিল্ট যখন model.call বা model.build প্রথমবারের বলা হয়, এটি নীচের সেল আমাদের জন্য মডেল ওজন গড়ে তুলব। উপরন্তু, আমরা চলমান করা হবে model.summary() trainable পরামিতি মোট সংখ্যা বার করো।

model(tf.random.uniform(shape=(BATCH_SIZE, AUDIO_MAXLEN)))
model.summary()
Model: "model"
_________________________________________________________________
 Layer (type)                Output Shape              Param #   
=================================================================
 input_1 (InputLayer)        [(None, 246000)]          0         
                                                                 
 keras_layer (KerasLayer)    (None, 768, 768)          94371712  
                                                                 
 dense (Dense)               (None, 768, 32)           24608     
                                                                 
=================================================================
Total params: 94,396,320
Trainable params: 94,396,320
Non-trainable params: 0
_________________________________________________________________

এখন আমরা সংজ্ঞায়িত করতে প্রয়োজন loss_fn মডেল প্রশিক্ষণ পাবে এবং অপটিমাইজার। নিম্নলিখিত সেল আমাদের জন্য এটি করবে। আমরা ব্যবহার করা হবে Adam সরলীকরণের জন্য অপটিমাইজার। CTCLoss যে (মত কাজের জন্য ব্যবহার করা হয় একটি সাধারণ হ্রাস ধরনের ASR ) যেখানে ইনপুট উপ-অংশের সহজে আউটপুট উপ-অংশের সঙ্গে প্রান্তিককৃত করা যাবে না। আপনি এই আশ্চর্যজনক থেকে ব্যবহার করুন CTC- ক্ষতি সম্বন্ধে আরও পড়তে পারেন ব্লগ পোস্টে

CTCLoss (থেকে gsoc-wav2vec2 : প্যাকেজ) 3 আর্গুমেন্ট গ্রহণ config , model_input_shape & division_factor । তাহলে division_factor=1 , তারপর হ্রাস কেবল সংকলিত হবে, তাই পাস division_factor তদনুসারে গড় উপর ব্যাচ জন্য।

from wav2vec2 import CTCLoss

LEARNING_RATE = 5e-5

loss_fn = CTCLoss(config, (BATCH_SIZE, AUDIO_MAXLEN), division_factor=BATCH_SIZE)
optimizer = tf.keras.optimizers.Adam(LEARNING_RATE)

লোড হচ্ছে এবং প্রাক-প্রসেসিং ডেটা

এখন থেকে LibriSpeech ডেটা সেটটি আর ডাউনলোড করি অফিসিয়াল ওয়েবসাইট এবং এটি সেট আপ।

wget https://www.openslr.org/resources/12/dev-clean.tar.gz -P ./data/train/
tar -xf ./data/train/dev-clean.tar.gz -C ./data/train/
--2021-11-05 11:43:09--  https://www.openslr.org/resources/12/dev-clean.tar.gz
Resolving www.openslr.org (www.openslr.org)... 46.101.158.64
Connecting to www.openslr.org (www.openslr.org)|46.101.158.64|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 337926286 (322M) [application/x-gzip]
Saving to: ‘./data/train/dev-clean.tar.gz’

dev-clean.tar.gz    100%[===================>] 322.27M  11.6MB/s    in 31s     

2021-11-05 11:43:42 (10.3 MB/s) - ‘./data/train/dev-clean.tar.gz’ saved [337926286/337926286]
ls ./data/train/
LibriSpeech/  dev-clean.tar.gz

আমাদের ডেটাসেট LibriSpeech ডিরেক্টরিতে রয়েছে। এর এই ফাইলগুলি অন্বেষণ করা যাক.

data_dir = "./data/train/LibriSpeech/dev-clean/2428/83705/"
all_files = os.listdir(data_dir)

flac_files = [f for f in all_files if f.endswith(".flac")]
txt_files = [f for f in all_files if f.endswith(".txt")]

print("Transcription files:", txt_files, "\nSound files:", flac_files)
Transcription files: ['2428-83705.trans.txt'] 
Sound files: ['2428-83705-0015.flac', '2428-83705-0004.flac', '2428-83705-0006.flac', '2428-83705-0026.flac', '2428-83705-0023.flac', '2428-83705-0001.flac', '2428-83705-0005.flac', '2428-83705-0040.flac', '2428-83705-0038.flac', '2428-83705-0042.flac', '2428-83705-0008.flac', '2428-83705-0019.flac', '2428-83705-0021.flac', '2428-83705-0002.flac', '2428-83705-0039.flac', '2428-83705-0034.flac', '2428-83705-0028.flac', '2428-83705-0000.flac', '2428-83705-0029.flac', '2428-83705-0041.flac', '2428-83705-0035.flac', '2428-83705-0032.flac', '2428-83705-0020.flac', '2428-83705-0025.flac', '2428-83705-0010.flac', '2428-83705-0014.flac', '2428-83705-0003.flac', '2428-83705-0031.flac', '2428-83705-0017.flac', '2428-83705-0027.flac', '2428-83705-0012.flac', '2428-83705-0043.flac', '2428-83705-0030.flac', '2428-83705-0022.flac', '2428-83705-0016.flac', '2428-83705-0037.flac', '2428-83705-0011.flac', '2428-83705-0036.flac', '2428-83705-0009.flac', '2428-83705-0013.flac', '2428-83705-0007.flac', '2428-83705-0018.flac', '2428-83705-0024.flac', '2428-83705-0033.flac']

ঠিক আছে, তাই প্রতিটি সাব-ডিরেক্টরি অনেক হয়েছে .flac ফাইল এবং একটি .txt ফাইল। .txt ফাইলটি সমস্ত বক্তৃতা নমুনার জন্য টেক্সট ট্রান্সক্রিপশান (অর্থাত রয়েছে .flac উপ-ডিরেক্টরির মধ্যে ফাইল) একটি তালিকা।

আমরা এই পাঠ্য ডেটা নিম্নরূপ লোড করতে পারি:

def read_txt_file(f):
  with open(f, "r") as f:
    samples = f.read().split("\n")
    samples = {s.split()[0]: " ".join(s.split()[1:]) for s in samples if len(s.split()) > 2}
  return samples

একইভাবে, আমরা একটি থেকে একটি বক্তৃতা নমুনা লোড জন্য একটি ফাংশন নির্ধারণ করবে .flac ফাইল।

REQUIRED_SAMPLE_RATE সেট করা হয় 16000 যেমন wav2vec2 সঙ্গে প্রাক প্রশিক্ষণ নেন 16K ফ্রিকোয়েন্সি এবং এটি ফ্রিকোয়েন্সি কারণে তথ্য বিতরণে কোনো প্রধান পরিবর্তন ছাড়া এটি নিখুঁত টিউন করার সুপারিশ করা হয়।

import soundfile as sf

REQUIRED_SAMPLE_RATE = 16000

def read_flac_file(file_path):
  with open(file_path, "rb") as f:
      audio, sample_rate = sf.read(f)
  if sample_rate != REQUIRED_SAMPLE_RATE:
      raise ValueError(
          f"sample rate (={sample_rate}) of your files must be {REQUIRED_SAMPLE_RATE}"
      )
  file_id = os.path.split(file_path)[-1][:-len(".flac")]
  return {file_id: audio}

এখন, আমরা কিছু এলোমেলো নমুনা বাছাই করব এবং সেগুলিকে কল্পনা করার চেষ্টা করব।

from IPython.display import Audio
import random

file_id = random.choice([f[:-len(".flac")] for f in flac_files])
flac_file_path, txt_file_path = os.path.join(data_dir, f"{file_id}.flac"), os.path.join(data_dir, "2428-83705.trans.txt")

print("Text Transcription:", read_txt_file(txt_file_path)[file_id], "\nAudio:")
Audio(filename=flac_file_path)
Text Transcription: HE HAS GIVEN US FREE PASSES ALL THE WAY TO THE END OF OUR JOURNEY AND ALL THE WAY BACK AGAIN AND COUPONS FOR FREE BOARD AND LODGING AT THE HOTEL IT'S A WEDDING PRESENT 
Audio:

এখন, আমরা সমস্ত বক্তৃতা এবং পাঠ্য নমুনা একত্রিত করব এবং সেই উদ্দেশ্যে ফাংশনটি (পরবর্তী ঘরে) সংজ্ঞায়িত করব।

def fetch_sound_text_mapping(data_dir):
  all_files = os.listdir(data_dir)

  flac_files = [os.path.join(data_dir, f) for f in all_files if f.endswith(".flac")]
  txt_files = [os.path.join(data_dir, f) for f in all_files if f.endswith(".txt")]

  txt_samples = {}
  for f in txt_files:
    txt_samples.update(read_txt_file(f))

  speech_samples = {}
  for f in flac_files:
    speech_samples.update(read_flac_file(f))

  assert len(txt_samples) == len(speech_samples)

  samples = [(speech_samples[file_id], txt_samples[file_id]) for file_id in speech_samples.keys() if len(speech_samples[file_id]) < AUDIO_MAXLEN]
  return samples

কিছু নমুনা দেখার সময় এসেছে...

samples = fetch_sound_text_mapping(data_dir)
samples[:5]
[(array([ 6.10351562e-05,  9.15527344e-05,  9.15527344e-05, ...,
         -3.05175781e-04, -5.79833984e-04, -8.23974609e-04]),
  'WHEN SHE HEARD OF MY ENGAGEMENT WITH MARY ANN SHE WROTE AND SUGGESTED THAT WE SHOULD SPEND OUR HONEYMOON IN HER COTTAGE OR PIGSTYE AND THAT I SHOULD PAY HER RENT FOR IT'),
 (array([-0.00112915, -0.00131226, -0.00158691, ...,  0.00067139,
          0.00091553,  0.00100708]),
  "IT MIGHT JUST AS WELL BE SOME ONE ELSE'S WEDDING SO UNIMPORTANT IS THE PART WHICH I AM SET TO PLAY IN IT"),
 (array([ 3.05175781e-05, -6.10351562e-05,  2.13623047e-04, ...,
         -5.18798828e-04, -2.13623047e-04, -2.74658203e-04]),
  'THE ACCIDENT IN QUESTION OCCURRED UPON THE SUNDAY EVENING'),
 (array([ 3.05175781e-04,  3.05175781e-05, -1.83105469e-04, ...,
          7.62939453e-04,  6.10351562e-04,  5.79833984e-04]),
  "OF COURSE THERE ARE SOME PEOPLE WITH WHOM YOU CAN'T BE PERFECTLY PLAIN BUT I SHALL BE AS PLAIN AS I CAN THERE'S A WAY AND A MANNER OF DOING THAT KIND OF THING"),
 (array([ 6.10351562e-05, -3.05175781e-05,  0.00000000e+00, ...,
         -3.66210938e-04, -7.93457031e-04, -1.19018555e-03]),
  'I KNOW WHAT MAMMA CAN AFFORD TO GIVE AND I WILL SEE SHE GIVES IT')]

এখন ডাটা প্রি-প্রসেস করা যাক!!!

আমরা প্রথম ব্যবহার tokenizer & প্রসেসর সংজ্ঞায়িত করবে gsoc-wav2vec2 প্যাকেজ। তারপর, আমরা খুব সহজ প্রি-প্রসেসিং করব। processor কাঁচা বক্তৃতা স্বাভাবিক হবে ফ্রেম অক্ষ এবং wrto tokenizer (সংজ্ঞায়িত শব্দভান্ডার ব্যবহার করে) স্ট্রিং মধ্যে আমাদের মডেল আউটপুট রূপান্তর করবে & (আপনার tokenizer কনফিগারেশনের উপর নির্ভর করে) বিশেষ টোকেন অপসারণের যত্ন নিতে হবে।

from wav2vec2 import Wav2Vec2Processor
tokenizer = Wav2Vec2Processor(is_tokenizer=True)
processor = Wav2Vec2Processor(is_tokenizer=False)

def preprocess_text(text):
  label = tokenizer(text)
  return tf.constant(label, dtype=tf.int32)

def preprocess_speech(audio):
  audio = tf.constant(audio, dtype=tf.float32)
  return processor(tf.transpose(audio))
Downloading `vocab.json` from https://github.com/vasudevgupta7/gsoc-wav2vec2/raw/main/data/vocab.json ... DONE

এখন, আমরা পাইথন জেনারেটরকে সংজ্ঞায়িত করব প্রিপ্রসেসিং ফাংশনগুলিকে কল করার জন্য যা আমরা উপরের কোষগুলিতে সংজ্ঞায়িত করেছি।

def inputs_generator():
  for speech, text in samples:
    yield preprocess_speech(speech), preprocess_text(text)

সেট আপ হচ্ছে tf.data.Dataset

সেল ইচ্ছা সেটআপ অনুসরণ tf.data.Dataset তার ব্যবহার বস্তুর .from_generator(...) পদ্ধতি। আমরা ব্যবহার করা হবে generator বস্তু, আমরা উপরোক্ত সেল সংজ্ঞায়িত।

আপনি উল্লেখ করতে পারেন এই স্ক্রিপ্টের tfrecords মধ্যে LibriSpeech তথ্য রূপান্তর করতে কিভাবে আরও বিশদের জন্য।

output_signature = (
    tf.TensorSpec(shape=(None),  dtype=tf.float32),
    tf.TensorSpec(shape=(None), dtype=tf.int32),
)

dataset = tf.data.Dataset.from_generator(inputs_generator, output_signature=output_signature)
BUFFER_SIZE = len(flac_files)
SEED = 42

dataset = dataset.shuffle(BUFFER_SIZE, seed=SEED)

আমরা একাধিক ব্যাচে ডেটাসেট পাস করব, তাই আসুন নিম্নলিখিত ঘরে ব্যাচগুলি প্রস্তুত করি। এখন, একটি ব্যাচের সমস্ত ক্রম একটি ধ্রুবক দৈর্ঘ্যে প্যাড করা উচিত। আমরা ব্যবহার করবে .padded_batch(...) যে উদ্দেশ্যে পদ্ধতি।

dataset = dataset.padded_batch(BATCH_SIZE, padded_shapes=(AUDIO_MAXLEN, LABEL_MAXLEN), padding_values=(0.0, 0))

এক্সিলারেটর (যেমন জিপিইউ/টিপিইউ) খুব দ্রুত এবং প্রায়শই ডেটা-লোডিং (এবং প্রি-প্রসেসিং) প্রশিক্ষণের সময় বাধা হয়ে দাঁড়ায় কারণ ডেটা-লোডিং অংশটি CPU-তে ঘটে। এটি প্রশিক্ষণের সময়কে উল্লেখযোগ্যভাবে বৃদ্ধি করতে পারে বিশেষ করে যখন প্রচুর অনলাইন প্রি-প্রসেসিং জড়িত থাকে বা GCS বাকেট থেকে ডেটা অনলাইনে স্ট্রিম করা হয়। ঐ বিষয় হ্যান্ডেল করতে, tf.data.Dataset উপলব্ধ করা হয় .prefetch(...) পদ্ধতি। মডেলটি বর্তমান ব্যাচে (GPUs/TPUs-এ) ভবিষ্যদ্বাণী করার সময় এই পদ্ধতিটি সমান্তরালভাবে (CPUs-এ) পরবর্তী কয়েকটি ব্যাচ প্রস্তুত করতে সাহায্য করে।

dataset = dataset.prefetch(tf.data.AUTOTUNE)

যেহেতু এই নোটবুক বিক্ষোভের উদ্দেশ্যে জন্য তৈরি করা হয়, তাই আমরা প্রথমেই গ্রহণ করা হবে num_train_batches হবে সঞ্চালন শুধু তাই উপর প্রশিক্ষণ নেন। যদিও আপনাকে পুরো ডেটাসেটে প্রশিক্ষণ দিতে উৎসাহিত করা হচ্ছে। একইভাবে, আমরা শুধুমাত্র মূল্যায়ন করবে num_val_batches

num_train_batches = 10
num_val_batches = 4

train_dataset = dataset.take(num_train_batches)
val_dataset = dataset.skip(num_train_batches).take(num_val_batches)

মডেল প্রশিক্ষণ

আমাদের মডেল প্রশিক্ষণের জন্য আমরা সরাসরি কল করবো .fit(...) সঙ্গে আমাদের মডেল সংকলন পর পদ্ধতি .compile(...)

model.compile(optimizer, loss=loss_fn)

উপরের সেল আমাদের ট্রেনিং স্টেট সেট আপ করবে। এখন আমরা সঙ্গে প্রশিক্ষণ শুরু করতে .fit(...) পদ্ধতি।

history = model.fit(train_dataset, validation_data=val_dataset, epochs=3)
history.history
Epoch 1/3
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/ops/ctc_ops.py:1447: alias_inplace_add (from tensorflow.python.ops.inplace_ops) is deprecated and will be removed in a future version.
Instructions for updating:
Prefer tf.tensor_scatter_nd_add, which offers the same functionality with well-defined read-write semantics.
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/ops/ctc_ops.py:1447: alias_inplace_add (from tensorflow.python.ops.inplace_ops) is deprecated and will be removed in a future version.
Instructions for updating:
Prefer tf.tensor_scatter_nd_add, which offers the same functionality with well-defined read-write semantics.
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/ops/ctc_ops.py:1430: alias_inplace_update (from tensorflow.python.ops.inplace_ops) is deprecated and will be removed in a future version.
Instructions for updating:
Prefer tf.tensor_scatter_nd_update, which offers the same functionality with well-defined read-write semantics.
WARNING:tensorflow:From /tmpfs/src/tf_docs_env/lib/python3.7/site-packages/tensorflow/python/ops/ctc_ops.py:1430: alias_inplace_update (from tensorflow.python.ops.inplace_ops) is deprecated and will be removed in a future version.
Instructions for updating:
Prefer tf.tensor_scatter_nd_update, which offers the same functionality with well-defined read-write semantics.
WARNING:tensorflow:Gradients do not exist for variables ['wav2vec2/masked_spec_embed:0'] when minimizing the loss. If you're using `model.compile()`, did you forget to provide a `loss`argument?
WARNING:tensorflow:Gradients do not exist for variables ['wav2vec2/masked_spec_embed:0'] when minimizing the loss. If you're using `model.compile()`, did you forget to provide a `loss`argument?
WARNING:tensorflow:Gradients do not exist for variables ['wav2vec2/masked_spec_embed:0'] when minimizing the loss. If you're using `model.compile()`, did you forget to provide a `loss`argument?
WARNING:tensorflow:Gradients do not exist for variables ['wav2vec2/masked_spec_embed:0'] when minimizing the loss. If you're using `model.compile()`, did you forget to provide a `loss`argument?
10/10 [==============================] - 32s 2s/step - loss: 649.3215 - val_loss: 315.0721
Epoch 2/3
10/10 [==============================] - 17s 2s/step - loss: 242.1202 - val_loss: 336.5721
Epoch 3/3
10/10 [==============================] - 17s 2s/step - loss: 222.1239 - val_loss: 253.0467
{'loss': [649.321533203125, 242.1201629638672, 222.1239013671875],
 'val_loss': [315.0721435546875, 336.5721130371094, 253.0466766357422]}

এর সঙ্গে আমাদের মডেল সংরক্ষণ করতে দিন .save(...) পদ্ধতি পরে অনুমান সঞ্চালন পাবে। এছাড়াও আপনি অনুসরণ করে TFHub এই SavedModel রপ্তানি করতে পারেন TFHub ডকুমেন্টেশন

save_dir = "finetuned-wav2vec2"
model.save(save_dir, include_optimizer=False)
2021-11-05 11:44:54.280793: W tensorflow/python/util/util.cc:368] Sets are not currently considered sequences, but this may change in the future, so consider avoiding using them.
WARNING:absl:Found untraced functions such as restored_function_body, restored_function_body, restored_function_body, restored_function_body, restored_function_body while saving (showing 5 of 855). These functions will not be directly callable after loading.
INFO:tensorflow:Assets written to: finetuned-wav2vec2/assets
INFO:tensorflow:Assets written to: finetuned-wav2vec2/assets

মূল্যায়ন

এখন আমরা ভ্যালিডেশন ডেটাসেটের উপর ওয়ার্ড এরর রেট গণনা করব

ওয়ার্ড ত্রুটি হার (wer) একটি স্বয়ংক্রিয় কথন শনাক্তকরণ সিস্টেমের কর্মক্ষমতা পরিমাপের জন্য একটি সাধারণ মেট্রিক হয়। WER শব্দ স্তরে কাজ করে Levenshtein দূরত্ব থেকে উদ্ভূত হয়েছে। শব্দ ত্রুটির হার তারপর হিসাবে গণনা করা যেতে পারে: WER = (S + D + I) / N = (S + D + I) / (S + D + C) যেখানে S হল প্রতিস্থাপনের সংখ্যা, D হল মুছে ফেলার সংখ্যা , I হল সন্নিবেশের সংখ্যা, C হল সঠিক শব্দের সংখ্যা, N হল রেফারেন্সের শব্দের সংখ্যা (N=S+D+C)। এই মানটি ভুল ভবিষ্যদ্বাণী করা শব্দের শতাংশ নির্দেশ করে।

আপনি উল্লেখ করতে পারেন এই কাগজ wer সম্পর্কে আরো জানতে।

আমরা ব্যবহার করবে load_metric(...) থেকে ফাংশন HuggingFace ডেটাসেট গ্রন্থাগার। প্রথম ইনস্টল করা যাক datasets ব্যবহার গ্রন্থাগার pip এবং তারপর সংজ্ঞায়িত metric অবজেক্ট।

!pip3 install -q datasets

from datasets import load_metric
metric = load_metric("wer")
Downloading:   0%|          | 0.00/1.95k [00:00<?, ?B/s]
@tf.function(jit_compile=True)
def eval_fwd(batch):
  logits = model(batch, training=False)
  return tf.argmax(logits, axis=-1)

এটি এখন বৈধতা ডেটাতে মূল্যায়ন চালানোর সময়।

from tqdm.auto import tqdm

for speech, labels in tqdm(val_dataset, total=num_val_batches):
    predictions  = eval_fwd(speech)
    predictions = [tokenizer.decode(pred) for pred in predictions.numpy().tolist()]
    references = [tokenizer.decode(label, group_tokens=False) for label in labels.numpy().tolist()]
    metric.add_batch(references=references, predictions=predictions)
0%|          | 0/4 [00:00<?, ?it/s]
2021-11-05 11:45:11.575128: W tensorflow/compiler/tf2xla/kernels/random_ops.cc:57] Warning: Using tf.random.uniform with XLA compilation will ignore seeds; consider using tf.random.stateless_uniform instead if reproducible behavior is desired. model/keras_layer/StatefulPartitionedCall/StatefulPartitionedCall/wav2vec2/encoder/layers/0/stochastic_depth/random_uniform/RandomUniform

আমরা ব্যবহার করছেন tokenizer.decode(...) ডিকোডিং আমাদের ভবিষ্যৎবাণী এবং লেবেল পাঠ্যে ব্যাক এবং জন্য মেট্রিক তাদের যোগ হবে জন্য পদ্ধতি WER পরে গণনার।

এখন, নিম্নলিখিত কক্ষে মেট্রিক মান গণনা করা যাক:

metric.compute()
1.0

অনুমান

এখন যে আমরা ও প্রশিক্ষণ প্রক্রিয়া সন্তুষ্ট মডেল সংরক্ষণ করেছেন করছে save_dir , কিভাবে আমরা এই মডেল অনুমান ব্যবহার করা যেতে পারে দেখতে হবে।

প্রথমত, আমরা আমাদের মডেল ব্যবহার করে লোড করা হবে tf.keras.models.load_model(...)

finetuned_model = tf.keras.models.load_model(save_dir)
WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.
WARNING:tensorflow:No training configuration found in save file, so the model was *not* compiled. Compile it manually.

অনুমান করার জন্য কিছু বক্তৃতা নমুনা ডাউনলোড করা যাক। আপনি আপনার বক্তৃতা নমুনা সঙ্গে নিম্নলিখিত নমুনা প্রতিস্থাপন করতে পারেন.

wget https://github.com/vasudevgupta7/gsoc-wav2vec2/raw/main/data/SA2.wav
--2021-11-05 11:45:28--  https://github.com/vasudevgupta7/gsoc-wav2vec2/raw/main/data/SA2.wav
Resolving github.com (github.com)... 13.114.40.48
Connecting to github.com (github.com)|13.114.40.48|:443... connected.
HTTP request sent, awaiting response... 302 Found
Location: https://raw.githubusercontent.com/vasudevgupta7/gsoc-wav2vec2/main/data/SA2.wav [following]
--2021-11-05 11:45:28--  https://raw.githubusercontent.com/vasudevgupta7/gsoc-wav2vec2/main/data/SA2.wav
Resolving raw.githubusercontent.com (raw.githubusercontent.com)... 185.199.108.133, 185.199.111.133, 185.199.109.133, ...
Connecting to raw.githubusercontent.com (raw.githubusercontent.com)|185.199.108.133|:443... connected.
HTTP request sent, awaiting response... 200 OK
Length: 94252 (92K) [audio/wav]
Saving to: ‘SA2.wav’

SA2.wav             100%[===================>]  92.04K  --.-KB/s    in 0.02s   

2021-11-05 11:45:29 (5.38 MB/s) - ‘SA2.wav’ saved [94252/94252]

এখন, আমরা ব্যবহার বক্তৃতা নমুনা পড়তে হবে soundfile.read(...) এটি এবং প্যাড AUDIO_MAXLEN মডেল স্বাক্ষর সন্তুষ্ট। তারপর আমরা যে বক্তৃতা নমুনা স্বাভাবিক ব্যবহার করবে Wav2Vec2Processor উদাহরণস্বরূপ & মডেল সেটিকে ভোজন হবে।

import numpy as np

speech, _ = sf.read("SA2.wav")
speech = np.pad(speech, (0, AUDIO_MAXLEN - len(speech)))
speech = tf.expand_dims(processor(tf.constant(speech)), 0)

outputs = finetuned_model(speech)
outputs
<tf.Tensor: shape=(1, 768, 32), dtype=float32, numpy=
array([[[ 5.5087714 , -1.0872856 , -1.0728477 , ..., -1.3125695 ,
         -0.7992846 , -0.94512135],
        [ 5.508977  , -1.0873723 , -1.0727195 , ..., -1.3125291 ,
         -0.79928476, -0.9449429 ],
        [ 5.5091047 , -1.0871643 , -1.0728203 , ..., -1.312533  ,
         -0.7992611 , -0.94483167],
        ...,
        [ 5.5094743 , -1.0874028 , -1.0729864 , ..., -1.3126655 ,
         -0.7994431 , -0.9449925 ],
        [ 5.509465  , -1.0873648 , -1.072943  , ..., -1.3126557 ,
         -0.79943836, -0.94500387],
        [ 5.509408  , -1.0872416 , -1.0728781 , ..., -1.3125473 ,
         -0.7993649 , -0.9449776 ]]], dtype=float32)>

আসুন ডিকোড নম্বর ব্যবহার করে পাঠ্য ক্রম ফিরে Wav2Vec2tokenizer উদাহরণস্বরূপ, আমরা উপরোক্ত সংজ্ঞায়িত।

predictions = tf.argmax(outputs, axis=-1)
predictions = [tokenizer.decode(pred) for pred in predictions.numpy().tolist()]
predictions
['']

এই ভবিষ্যদ্বাণীটি বেশ এলোমেলো কারণ এই নোটবুকের বড় ডেটাতে মডেলটিকে কখনই প্রশিক্ষণ দেওয়া হয়নি (যেহেতু এই নোটবুকটি সম্পূর্ণ প্রশিক্ষণের জন্য নয়)। আপনি যদি এই মডেলটিকে সম্পূর্ণ LibriSpeech ডেটাসেটে প্রশিক্ষণ দেন তাহলে আপনি ভাল ভবিষ্যদ্বাণী পাবেন।

অবশেষে, আমরা এই নোটবুকের সমাপ্তিতে পৌঁছেছি। কিন্তু এটা বক্তৃতা সংক্রান্ত কাজের জন্য TensorFlow শেখার শেষ নয়, এই সংগ্রহস্থলের আরো কিছু আশ্চর্যজনক টিউটোরিয়াল রয়েছে। যদি আপনি এই নোটবুক কোনো বাগের সম্মুখীন একটি সমস্যার তৈরি করুন এখানে