Skip to main content

Author

Vikas Reddy - University of Maryland

Abstract

Communication technology ၏ မြန်ဆန်စွာ တိုးတက်လာသော ပတ်ဝန်းကျင်တွင် OpenAI Whisper model ကဲ့သို့သော မကြာသေးမီ ထွက်ပေါ်လာမှုများသည် multilingual speech-to-text စွမ်းရည်များ၏ accuracy နှင့် accessibility ကို သိသိသာသာ မြှင့်တင်ခဲ့သည်။ သို့သော်လည်း ဤတိုးတက်မှုများရှိသော်လည်း accuracy အပိုင်းတွင် တိုးတက်ရန် နေရာလွတ်ရှိသေးသည်။ ဤသုတေသနသည် Vietnamese နှင့် Japanese ဘာသာစကားများအပေါ် အထူးအာရုံစိုက်၍ automatic speech recognition (ASR) models များ၏ စွမ်းရည်များ မြှင့်တင်ရန် ဦးတည်ပါသည်။ Performance တိုင်းတာရန် standard measures များကို အသုံးပြုပါသည်။ Vietnamese အတွက် Word Error Rate (WER) metric ကို အသုံးပြုပြီး recognized words များသည် actual spoken words များနှင့် မည်မျှ ကွဲပြားသည်ကို စစ်ဆေးပါသည်။ Japanese အတွက် Character Error Rate (CER) metric ကို အသုံးပြုပြီး individual characters များ၏ accuracy ကို စစ်ဆေးပါသည်။ အဓိက ရလဒ်များ:
  • Vietnamese (FOSD + Common Voice + Google Fleurs + Vivos): WER 9.46%
  • Japanese (ReazonSpeech + Common Voice + Google Fleurs): CER 8.15%

မာတိကာ

  1. Background Information
  2. Environment Setup
  3. Load Datasets
  4. Data Preprocessing
  5. Training
  6. Parameter Efficient Fine-tuning
  7. Results
  8. Evaluation
  9. Azure Speech Studio
  10. Conclusion

1. Background Information

ယနေ့ခေတ် လူ့အဖွဲ့အစည်းတွင် communication နှင့် technology သည် မရှိမဖြစ် ဖြစ်လာခဲ့ပြီး accessibility, inclusivity နှင့် efficient knowledge dissemination အပေါ် သက်ရောက်မှုရှိသော စိန်ခေါ်မှုများစွာ ရှိနေဆဲဖြစ်သည်။ ဤနေရာတွင် automatic speech recognition (ASR) ကဲ့သို့သော တိုးတက်မှုများသည် online meeting calls များတွင် အထူးသဖြင့် humans နှင့် computers အကြား interactions များကို ပိုမိုချောမွေ့စေပါသည်။ ASR သည် speech signals များကို သက်ဆိုင်ရာ text အဖြစ် ပြောင်းလဲသည့် process ဖြစ်သည်။ မကြာသေးမီက large speech datasets များနှင့် ၎င်းတို့၏ သက်ဆိုင်ရာ transcripts များ ရရှိနိုင်မှုကြောင့် ဤ task သည် corporations အမျိုးမျိုးတွင် ဆွဲဆောင်မှု ရရှိလာခဲ့သည်။
OpenAI Whisper Architecture
OpenAI Whisper သည် sequence-to-sequence architecture အဖြစ် အထူးဒီဇိုင်းထုတ်ထားသော Transformer-based encoder-decoder model ဖြစ်သည်။ ၎င်းသည် audio spectrogram features များကို input အဖြစ် ယူပြီး text tokens sequence အဖြစ် ပြောင်းလဲပေးသည်။ ၎င်းတွင် ပါဝင်သည်မှာ:
  1. Raw audio ကို log-Mel spectrogram အဖြစ် ပြောင်းလဲသော feature extractor
  2. Encoder hidden states sequence ထုတ်ပေးသော Transformer encoder
  3. Cross-attention mechanisms အသုံးပြု၍ text tokens ခန့်မှန်းသော decoder

2. Environment Setup

Whisper ကို fine-tune လုပ်ရန် ကွဲပြားသော ချဉ်းကပ်မှု နှစ်ခု ရှိပါသည်: Google Colab အသုံးပြုခြင်းနှင့် local PC တွင် code run ခြင်း။

Required Packages

python -m pip install -U pip
pip install evaluate pandas numpy huggingface_hub pydub tqdm spacy ginza audiomentations
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu118
pip install datasets>=2.6.1
pip install git+https://github.com/huggingface/transformers
pip install librosa
pip install evaluate>=0.30
pip install jiwer
pip install gradio
pip install -q bitsandbytes datasets accelerate loralib
pip install -q git+https://github.com/huggingface/transformers.git@main git+https://github.com/huggingface/peft.git@main
ဤဆောင်းပါး၏ fine-tuning tasks အတွက် အသုံးပြုသော computer configuration သည် Windows 11 Pro PC တစ်ခုဖြစ်ပြီး AMD Ryzen 7 3700X 8-Core Processor, 80GB RAM နှင့် GeForce RTX 3090 NVIDIA Graphics Card ပါဝင်သည်။

3. Load Datasets

Method 1: Hugging Face အသုံးပြုခြင်း

from datasets import load_dataset, DatasetDict

common_voice = DatasetDict()
common_voice["train"] = load_dataset(
    "mozilla-foundation/common_voice_11_0", "ja",
    split="train+validation", use_auth_token=True
)
common_voice["test"] = load_dataset(
    "mozilla-foundation/common_voice_11_0", "ja",
    split="test", use_auth_token=True
)
common_voice = common_voice.remove_columns([
    "accent", "age", "client_id", "down_votes",
    "gender", "locale", "path", "segment", "up_votes"
])

Method 2: Manual Dataset Preparation

import os, csv, codecs

def text_change_csv(input_path, output_path):
    file_csv = os.path.splitext(output_path)[0] + ".csv"
    output_dir = os.path.dirname(input_path)
    output_file = os.path.join(output_dir, file_csv)
    encodings = ["utf-8", "latin-1"]

    for encoding in encodings:
        try:
            with open(input_path, 'r', encoding=encoding) as rf:
                with codecs.open(output_file, 'w', encoding=encoding, errors='replace') as wf:
                    readfile = rf.readlines()
                    for read_text in readfile:
                        read_text = read_text.split('|')
                        writer = csv.writer(wf, delimiter=',')
                        writer.writerow(read_text)
            print(f"CSV has been created using encoding: {encoding}")
            return True
        except UnicodeDecodeError:
            continue

အသုံးပြုထားသော Datasets

DatasetLanguageUsageSpeech Audio (Hours)
Common Voice 13.0Vietnamese, JapaneseHugging Face19h (VN), 10h (JP)
Google FleursVietnamese, JapaneseHugging Face11h (VN), 8h (JP)
VivosVietnameseHugging Face15h
FPT Open Speech DatasetVietnameseDownload & extract30h
VLSP2020VietnameseDownload & extract100h
ReazonSpeechJapaneseHugging Face5h
JSUTJapaneseDownload & extract10h
JVSJapaneseDownload & extract30h

4. Data Preprocessing

Data Augmentation

from audiomentations import Compose, AddGaussianNoise, TimeStretch, PitchShift

common_voice = common_voice.cast_column("audio", Audio(sampling_rate=16000))

augment_waveform = Compose([
    AddGaussianNoise(min_amplitude=0.005, max_amplitude=0.015, p=0.2),
    TimeStretch(min_rate=0.8, max_rate=1.25, p=0.2, leave_length_unchanged=False),
    PitchShift(min_semitones=-4, max_semitones=4, p=0.2)
])

def augment_dataset(batch):
    audio = batch["audio"]["array"]
    augmented_audio = augment_waveform(samples=audio, sample_rate=16000)
    batch["audio"]["array"] = augmented_audio
    return batch

common_voice['train'] = common_voice['train'].map(augment_dataset, keep_in_memory=True)

Transcript Normalization

import string

def remove_punctuation(sentence):
    translator = str.maketrans('', '', string.punctuation)
    modified_sentence = sentence.translate(translator)
    return modified_sentence

def fix_sentence(sentence):
    transcription = sentence
    if transcription.startswith('"') and transcription.endswith('"'):
        transcription = transcription[1:-1]
    transcription = remove_punctuation(transcription)
    transcription = transcription.lower()
    return transcription

Whisper အတွက် Dataset ပြင်ဆင်ခြင်း

def prepare_dataset(batch):
    audio = batch["audio"]
    batch["input_features"] = processor.feature_extractor(
        audio["array"], sampling_rate=audio["sampling_rate"]
    ).input_features[0]
    batch["input_length"] = len(audio["array"]) / audio["sampling_rate"]

    transcription = fix_sentence(batch["transcription"])
    batch["labels"] = processor.tokenizer(
        transcription, max_length=225, truncation=True
    ).input_ids
    return batch

common_voice = common_voice.map(
    prepare_dataset,
    remove_columns=common_voice.column_names['train'],
    num_proc=1,
    keep_in_memory=True
)

5. Training

Data Collator

import torch
from dataclasses import dataclass
from typing import Any, Dict, List, Union

@dataclass
class DataCollatorSpeechSeq2SeqWithPadding:
    processor: Any

    def __call__(self, features: List[Dict[str, Union[List[int], torch.Tensor]]]) -> Dict[str, torch.Tensor]:
        input_features = [{"input_features": feature["input_features"]} for feature in features]
        batch = self.processor.feature_extractor.pad(input_features, return_tensors="pt")

        label_features = [{"input_ids": feature["labels"]} for feature in features]
        labels_batch = self.processor.tokenizer.pad(label_features, return_tensors="pt")

        labels = labels_batch["input_ids"].masked_fill(labels_batch.attention_mask.ne(1), -100)

        if (labels[:, 0] == self.processor.tokenizer.bos_token_id).all().cpu().item():
            labels = labels[:, 1:]

        batch["labels"] = labels
        return batch

data_collator = DataCollatorSpeechSeq2SeqWithPadding(processor=processor)

Evaluation Metrics (Vietnamese - WER)

import evaluate

metric = evaluate.load("wer")

def compute_metrics(pred):
    pred_ids = pred.predictions
    label_ids = pred.label_ids
    label_ids[label_ids == -100] = tokenizer.pad_token_id

    pred_str = tokenizer.batch_decode(pred_ids, skip_special_tokens=True)
    label_str = tokenizer.batch_decode(label_ids, skip_special_tokens=True)

    wer = 100 * metric.compute(predictions=pred_str, references=label_str)
    return {"wer": wer}

Evaluation Metrics (Japanese - CER)

import spacy, ginza

nlp = spacy.load("ja_ginza")
ginza.set_split_mode(nlp, "C")

def compute_metrics(pred):
    pred_ids = pred.predictions
    label_ids = pred.label_ids
    label_ids[label_ids == -100] = processor.tokenizer.pad_token_id

    pred_str = processor.tokenizer.batch_decode(pred_ids, skip_special_tokens=True)
    label_str = processor.tokenizer.batch_decode(label_ids, skip_special_tokens=True)

    # Japanese text ကို proper evaluation အတွက် tokenize လုပ်ခြင်း
    pred_str = [" ".join([str(i) for i in nlp(j)]) for j in pred_str]
    label_str = [" ".join([str(i) for i in nlp(j)]) for j in label_str]

    wer = 100 * metric.compute(predictions=pred_str, references=label_str)
    return {"wer": wer}

Training Arguments

from transformers import Seq2SeqTrainingArguments

model.config.dropout = 0.05

training_args = Seq2SeqTrainingArguments(
    output_dir="./whisper-fine-tuned",
    per_device_train_batch_size=16,
    gradient_accumulation_steps=1,
    learning_rate=1e-6,
    lr_scheduler_type='linear',
    optim="adamw_bnb_8bit",
    warmup_steps=200,
    num_train_epochs=5,
    gradient_checkpointing=True,
    evaluation_strategy="steps",
    fp16=True,
    per_device_eval_batch_size=8,
    predict_with_generate=True,
    generation_max_length=255,
    eval_steps=500,
    logging_steps=500,
    report_to=["tensorboard"],
    load_best_model_at_end=True,
    metric_for_best_model="wer",
    greater_is_better=False,
    push_to_hub=False,
    save_total_limit=1
)
အဓိက training parameters များ:
  • learning_rate: 1e-5 သို့မဟုတ် 1e-6 သည် အကောင်းဆုံး အလုပ်လုပ်သည်
  • warmup_steps: Overall steps ၏ 10% အသုံးပြုပါ
  • per_device_train_batch_size: GPU capacity ပေါ်မူတည်၍ သတ်မှတ်ပါ (RTX 3090 အတွက် 16)
  • dropout: Overfitting ကို တိုက်ဖျက်ရန် 0.05 သို့မဟုတ် 0.10

6. Parameter Efficient Fine-tuning (PEFT)

PEFT သည် trainable parameters ၏ 1% သာ အသုံးပြု၍ competitive performance ရရှိသည်။
Fine-tuningParameter Efficient Fine-tuning
Training time ပိုမြန်သည်Training time ပိုကြာသည်
Computational resources ပိုများစွာ လိုအပ်သည်Computational resources နည်းစွာ အသုံးပြုသည်
Model တစ်ခုလုံးကို re-train လုပ်သည်Parameters ၏ အစိတ်အပိုင်းငယ်သာ ပြင်ဆင်သည်
Overfitting ဖြစ်နိုင်ခြေ ပိုများသည်Overfitting ဖြစ်နိုင်ခြေ နည်းသည်

LoRA Setup

from transformers import WhisperForConditionalGeneration, prepare_model_for_int8_training
from peft import LoraConfig, get_peft_model

model = WhisperForConditionalGeneration.from_pretrained(
    model_name_or_path, load_in_8bit=True, device_map="auto"
)
model = prepare_model_for_int8_training(model)

def make_inputs_require_grad(module, input, output):
    output.requires_grad_(True)

model.model.encoder.conv1.register_forward_hook(make_inputs_require_grad)

config = LoraConfig(
    r=32,
    lora_alpha=64,
    target_modules=["q_proj", "v_proj"],
    lora_dropout=0.05,
    bias="none"
)
model = get_peft_model(model, config)
model.print_trainable_parameters()
# Output: trainable params: 15728640 || all params: 1559033600 || trainable%: 1.01%

7. Results

Vietnamese Results

Vietnamese Whisper Large Results
FOSD + Google Fleurs + Vivos + CV datasets တွင် fine-tune လုပ်ထားသော model သည် 9.46% ၏ အနိမ့်ဆုံး WER ရရှိခဲ့သည်။

Japanese Results

Japanese Whisper Large Results
JSUT + ReazonSpeech + Google Xtreme + CV datasets တွင် fine-tune လုပ်ထားသော model သည် 8.15% ၏ အနိမ့်ဆုံး CER ရရှိခဲ့သည်။

Optimization Loss Curve

Optimization Loss Curve

8. Evaluation

Vietnamese Evaluation

Vietnamese Evaluation Results
Evaluate လုပ်ထားသော datasets များအနက် Google Fleurs + Common Voice + Vivos dataset သည် 7.84% ၏ အနိမ့်ဆုံး CER ရရှိပြီး accuracy မြင့်မားသော transcriptions များကို ညွှန်ပြသည်။

Japanese Evaluation

Japanese Evaluation Results
Combined ReazonSpeech + Google Xtreme + CV dataset သည် 7.44% ၏ အနိမ့်ဆုံး CER ရရှိခဲ့သည်။

Faster-Whisper Conversion

from ctranslate2.converters import TransformersConverter

model_id = "./whisper-fine-tuned/checkpoint-5000"
output_dir = "whisper-ct2"

converter = TransformersConverter(model_id, load_as_float16=True)
converter.convert(output_dir, quantization="float16")
model = WhisperModel(output_dir, device="cuda", compute_type="float16")
Faster Whisper သည် standard fine-tuned Whisper နှင့် နှိုင်းယှဉ်၍ comparable accuracy ထိန်းသိမ်းထားစဉ် 40% ပိုမြန်သော inference ပေးဆောင်သည်။

9. Azure Speech Studio

Azure Speech Studio သည် ASR models fine-tuning အတွက် alternative approach တစ်ခု ပေးဆောင်သည်။

Azure ဖြင့် Transcription

import os, evaluate
from azure.cognitiveservices.speech import SpeechConfig, SpeechRecognizer, AudioConfig

subscription_key = "your_subscription_key"
location = "japaneast"
endpoint = "your_endpoint"

config = SpeechConfig(subscription=subscription_key, region=location)
config.endpoint_id = endpoint
speech_config = SpeechConfig(
    subscription=subscription_key,
    region=location,
    speech_recognition_language="ja-JP"
)

predictions = []
for root, _, files in os.walk(wav_base_path):
    for file_name in files:
        if file_name.endswith(".wav"):
            audio_file_path = os.path.join(root, file_name)
            audio_config = AudioConfig(filename=audio_file_path)
            speech_recognizer = SpeechRecognizer(
                speech_config=speech_config,
                audio_config=audio_config
            )
            result = speech_recognizer.recognize_once()
            if result.text:
                predictions.append(result.text)

Azure Results

Vietnamese: Common Voice 14.0 တွင် train လုပ်ထားသော model သည် WER 7.33% ရရှိသည် Japanese: JSUT တွင် train လုပ်ထားသော model သည် CER 6.97% ရရှိသည်
Azure Speech Studio သည် training အတွင်း WER နိမ့်စွာ ရရှိနိုင်သော်လည်း Whisper သည် unseen data များ၊ အထူးသဖြင့် diverse နှင့် complex audio များတွင် ပိုမိုကောင်းမွန်သော evaluation results ရရှိတတ်သည်။

10. Conclusion

Whisper ASR model fine-tuning process သည် ၎င်း၏ performance မြှင့်တင်ရန် robust technique တစ်ခု အဖြစ် ပေါ်ထွက်လာသည်။ အဓိက တွေ့ရှိချက်များ:
  1. DeepL သည် Chinese to English translation အတွက် အထိရောက်ဆုံးဖြစ်သည်
  2. Fine-tuning သည် performance တိုးတက်မှု သိသာစွာ ရရှိသည် (Vietnamese အတွက် WER 7.33-12.15%, Japanese အတွက် CER 8.15-17.93%)
  3. Data augmentation သည် audiomentations library မှတစ်ဆင့် diversity ထည့်သွင်းပေးသည်
  4. Dataset quality အရေးကြီးသည်: Data ပမာဏ၊ audio ရှင်းလင်းမှုနှင့် topic variety အားလုံး performance အပေါ် သက်ရောက်မှုရှိသည်
  5. Whisper သည် unseen data ပေါ်တွင် Azure ထက် superior performance ပြသည်

References

  1. Radford, A., et al. (2022). Robust speech recognition via large-scale weak supervision. arXiv:2212.04356
  2. Ardila, R., et al. (2020). Common Voice: A Massively-Multilingual Speech Corpus. arXiv:1912.06670
  3. Conneau, A., et al. (2022). FLEURS: Few-Shot Learning Evaluation of Universal Representations of Speech. arXiv:2205.12446
  4. Gandhi, S. (2022). Fine-Tune Whisper for Multilingual ASR with Transformers. Hugging Face Blog
  5. Mangrulkar, S. & Paul, S. Parameter-Efficient Fine-Tuning Using PEFT. Hugging Face Blog