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%
မာတိကာ
- Background Information
- Environment Setup
- Load Datasets
- Data Preprocessing
- Training
- Parameter Efficient Fine-tuning
- Results
- Evaluation
- Azure Speech Studio
- Conclusion
ယနေ့ခေတ် လူ့အဖွဲ့အစည်းတွင် 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 သည် sequence-to-sequence architecture အဖြစ် အထူးဒီဇိုင်းထုတ်ထားသော Transformer-based encoder-decoder model ဖြစ်သည်။ ၎င်းသည် audio spectrogram features များကို input အဖြစ် ယူပြီး text tokens sequence အဖြစ် ပြောင်းလဲပေးသည်။ ၎င်းတွင် ပါဝင်သည်မှာ:
- Raw audio ကို log-Mel spectrogram အဖြစ် ပြောင်းလဲသော feature extractor
- Encoder hidden states sequence ထုတ်ပေးသော Transformer encoder
- 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
| Dataset | Language | Usage | Speech Audio (Hours) |
|---|
| Common Voice 13.0 | Vietnamese, Japanese | Hugging Face | 19h (VN), 10h (JP) |
| Google Fleurs | Vietnamese, Japanese | Hugging Face | 11h (VN), 8h (JP) |
| Vivos | Vietnamese | Hugging Face | 15h |
| FPT Open Speech Dataset | Vietnamese | Download & extract | 30h |
| VLSP2020 | Vietnamese | Download & extract | 100h |
| ReazonSpeech | Japanese | Hugging Face | 5h |
| JSUT | Japanese | Download & extract | 10h |
| JVS | Japanese | Download & extract | 30h |
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-tuning | Parameter 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
FOSD + Google Fleurs + Vivos + CV datasets တွင် fine-tune လုပ်ထားသော model သည် 9.46% ၏ အနိမ့်ဆုံး WER ရရှိခဲ့သည်။
Japanese Results
JSUT + ReazonSpeech + Google Xtreme + CV datasets တွင် fine-tune လုပ်ထားသော model သည် 8.15% ၏ အနိမ့်ဆုံး CER ရရှိခဲ့သည်။
Optimization Loss Curve
8. Evaluation
Vietnamese Evaluation
Evaluate လုပ်ထားသော datasets များအနက် Google Fleurs + Common Voice + Vivos dataset သည် 7.84% ၏ အနိမ့်ဆုံး CER ရရှိပြီး accuracy မြင့်မားသော transcriptions များကို ညွှန်ပြသည်။
Japanese Evaluation
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 တစ်ခု အဖြစ် ပေါ်ထွက်လာသည်။ အဓိက တွေ့ရှိချက်များ:
- DeepL သည် Chinese to English translation အတွက် အထိရောက်ဆုံးဖြစ်သည်
- Fine-tuning သည် performance တိုးတက်မှု သိသာစွာ ရရှိသည် (Vietnamese အတွက် WER 7.33-12.15%, Japanese အတွက် CER 8.15-17.93%)
- Data augmentation သည် audiomentations library မှတစ်ဆင့် diversity ထည့်သွင်းပေးသည်
- Dataset quality အရေးကြီးသည်: Data ပမာဏ၊ audio ရှင်းလင်းမှုနှင့် topic variety အားလုံး performance အပေါ် သက်ရောက်မှုရှိသည်
- Whisper သည် unseen data ပေါ်တွင် Azure ထက် superior performance ပြသည်
References
- Radford, A., et al. (2022). Robust speech recognition via large-scale weak supervision. arXiv:2212.04356
- Ardila, R., et al. (2020). Common Voice: A Massively-Multilingual Speech Corpus. arXiv:1912.06670
- Conneau, A., et al. (2022). FLEURS: Few-Shot Learning Evaluation of Universal Representations of Speech. arXiv:2205.12446
- Gandhi, S. (2022). Fine-Tune Whisper for Multilingual ASR with Transformers. Hugging Face Blog
- Mangrulkar, S. & Paul, S. Parameter-Efficient Fine-Tuning Using PEFT. Hugging Face Blog