Автоматты аударма пайдаланылды

Қазақ тілін тану үшін Whisper Small үйретеміз

Сөйлеуді тану жүйелері (Speech-To-Text) бүгінде дауыстық көмекшілерде, чат-боттарда, автоматты аударма қызметтерінде және адамның компьютерлік жүйелермен өзара әрекеттесуін жеңілдететін басқа шешімдерде кеңінен қолданылады. Қазақ сияқты жергілікті тілдерді қолдау аса маңызды, өйткені бұл тілдер үшін дайын шешімдер жиі жетіспейді.

Бұл мақалада біз қазақ тілін тану үшін Mozilla Common voice датасетінде OpenAI ұсынған Whisper Small моделін (fine-tuning) қалай оқыту керектігін қарастырамыз. Біз сондай-ақ мұндай модельдің қаншалықты пайдалы екенін және оның қандай қолдану сценарийлері болуы мүмкін екенін талдаймыз.

Whisper-OpenAI әзірлеген сөйлеуді тану үлгілерінің отбасы. Олар жоғары дәлдікпен және әртүрлі тілдермен жұмыс істеу қабілетімен ерекшеленеді. Дегенмен, әр модельдің өз шектеулері бар. Whisper Small-бұл әдепкі бойынша ағылшын тіліне оңтайландырылғаннаяам нұсқасы.

Whisper Small Артықшылықтары:

  • Салыстырмалы түрде шағын өлшем (бұл оқу және орналастыру процесін жеңілдетеді).
  • Көптеген тапсырмалар үшін жеткілікті дәлдік (әсіресе қосымша оқудан кейін).
  • Жаңа тілдер мен домендерге бейімделу мүмкіндігі.

Сөйлеуді тану саласында қазақ тілін қолдауды кеңейту бірқатар артықшылықтар береді:

  1. Инклюзивтілік: ана тілінде сөйлейтіндерге, соның ішінде мүмкіндігі шектеулі жандарға ыңғайлылық.
  2. Автоматтандыру: қазақ тіліндегі кездесулерді, дәрістерді және телефон арқылы сөйлесулерді Жылдам транскрипциялау.
  3. Білім: тіл үйренуге немесе тестілеуге арналған интерактивті қосымшалар құру.
  4. Медиа контент: қазақ тілінде субтитрлерді автоматты түрде жасау.
  5. Экожүйені дамыту: жергілікті өнімдер мен шешімдердің дамуын ынталандыру.

Оқыту үшін пайдаланылды:

  • GPU T4 бар Google Colab (шамамен 5 сағаттық оқу).
  • Dataset Mozilla common Voice (қазақ бөлігі).

Эксперимент барысында модель 4000 қадам оқыды және әр 1000 қадам сайын аралық бағалау жүргізілді. Төменде негізгі көрсеткіштер туралы қысқаша мәлімет берілген — Training Loss, Validation Loss және WER (Word Error Rate, сөйлеуді тану қателерінің пайызы):

Training LossEpochStepValidation LossWER
0.00596.097610000.01382.0531
0.000312.195120000.00061.8636
0.000118.292730000.00020.0
0.000124.390240000.00020.0

Кестеден көріп отырғанымыздай, оқу соңында валидациялық үлгідегі WER көрсеткіші 0% - ға жетті. Бұл сынақ үлгілеріндегі модель (пайдаланылған жиынтықтан) қатесіз жұмыс істейтінін білдіреді. Дегенмен, нақты деректерде нәтиже әртүрлі болуы мүмкін, сондықтан әртүрлі мысалдармен сапаны одан әрі тексеру өте маңызды.

Төменде Mozilla common Voice-тен алынған қазақ үлгісіндегі Whisper Small моделін оқыту үшін пайдаланылатын код берілген. Кодты Google Colab немесе Python қолдайтын басқа ортада іске қосуға болады.

# Pip-ті соңғы нұсқасына дейін жаңартыңыз
!pip install --upgrade --quiet pip

# Дыбыспен, оқумен, бағалаумен және веб-интерфейспен жұмыс істеу үшін кітапханаларды орнатыңыз
!pip install --upgrade --quiet datasets[audio] transformers accelerate evaluate jiwer tensorboard
!pip install gradio==3.41.0
  1. datasets[audio] - стандартты деректер жиынтығынан аудио деректерді жүктеуге және өңдеуге мүмкіндік береді (мысалы, Mozilla Common Voice).
  2. трансформаторлар-трансформатор модельдерімен жұмыс істеуге арналған Hugging Face кітапханасы (Whisper қоса).
  3. accelerate-бірнеше GPU/TPU-да оқуды жылдамдатады.
  4. evaluate, jiwer-метриканы есептеуге арналған құралдар, соның ішінде WER.
  5. tensorboard-оқу көрсеткіштерін визуализациялау үшін.
  6. gradio-қарапайым веб-қосымшаны (демонстрацияны) құру.
from huggingface_hub import notebook_login

notebook_login()

Үлгіні Hugging Face репозиторийіне жүктеу үшін Сіз токен арқылы кіруіңіз керек.

from datasets import load_dataset, DatasetDict

# Datasetdict нысанын жасаңыз
common_voice = DatasetDict()

# Оқу (train+validation+validated) және тест үлгілерін жүктеп алыңыз
common_voice["train"] = load_dataset("mozilla-foundation/common_voice_17_0", "kk", split="train+validation+validated")
common_voice["test"] = load_dataset("mozilla-foundation/common_voice_17_0", "kk", split="test")

# Қажет емес динамиктерді жою
common_voice = common_voice.remove_columns(["accent", "age", "client_id", "down_votes", "gender", "locale", "path", "segment", "up_votes"])
  1. load_dataset-қазақ тіліне арналған Mozilla Common Voice 17.0 нұсқасының дайын деректер жинағын жүктейді ("kk"параметрі).
  2. Біз үш кіші үлгіні (train + validation + validated) бір жаттығу жиынына біріктіреміз.
  3. Деректер көлемін азайту және алдын ала өңдеуді жеңілдету үшін пайдаланылмаған өрістерді жойыңыз.
from transformers import WhisperFeatureExtractor, WhisperTokenizer, WhisperProcessor

feature_extractor = WhisperFeatureExtractor.from_pretrained("openai/whisper-small")
tokenizer = WhisperTokenizer.from_pretrained("openai/whisper-small", language="Kazakh", task="transcribe")
processor = WhisperProcessor.from_pretrained("openai/whisper-small", language="Kazakh", task="transcribe")
  • WhisperFeatureExtractor-аудио сигналды спектрограммаға түрлендіреді (лог-бор-спектр).
  • WhisperTokenizer-мәтіндік деректерді токендерге айналдырады.
  • WhisperProcessor-FeatureExtractor және Tokenizer екеуін біріктіретін орауыш.
from datasets import Audio

# Біз аудионы модель күткен 16кГц жиілікке жеткіземіз
common_voice = common_voice.cast_column("audio", Audio(sampling_rate=16000))

def prepare_dataset(batch):
    audio = batch["audio"]
    # Дыбыстық сигналды лог-бор белгілеріне түрлендіру
    batch["input_features"] = feature_extractor(
        audio["array"], 
        sampling_rate=audio["sampling_rate"]
    ).input_features[0]

    # Мәтінді токенизациялау
    batch["labels"] = tokenizer(batch["sentence"]).input_ids
    return batch

# Функцияны бүкіл деректер жиынына қолданыңыз
common_voice = common_voice.map(prepare_dataset, remove_columns=common_voice.column_names["train"], num_proc=2)
  1. cast_column-аудионы Audio кітапханасымен үйлесімді форматқа аударады.
  2. prepare_dataset-негізгі алдын-ала өңдеу: біз спектрограмманы есептейміз және мәтінді токенизациялаймыз.
  3. map - функцияны dataset барлық элементтеріне қолданыңыз. Num_proc = 2 параметрі параллелизмді қамтиды.
from transformers import WhisperForConditionalGeneration

model = WhisperForConditionalGeneration.from_pretrained("openai/whisper-small")
model.generation_config.language = "Kazakh"
model.generation_config.task = "transcribe"
model.generation_config.forced_decoder_ids = None
  • WhisperForConditionalGeneration-аудио негізіндегі мәтіндік шығыстарды құруға арналған модель.
  • Generation_config ішіндегі тіл мен тапсырманы теңшеңіз.

Коллатор жасайық (жаттығу үшін батчи дайындайтын арнайы нысан):

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

@dataclass
class DataCollatorSpeechSeq2SeqWithPadding:
    processor: Any
    decoder_start_token_id: int

    def __call__(self, features: List[Dict[str, Union[List[int], torch.Tensor]]]) -> Dict[str, torch.Tensor]:
        # Аудио белгілерді шығарып алыңыз
        input_features = [{"input_features": f["input_features"]} for f in features]
        batch = self.processor.feature_extractor.pad(input_features, return_tensors="pt")

        # Жапсырмаларды шығарып алыңыз ( labels)
        label_features = [{"input_ids": f["labels"]} for f in features]
        labels_batch = self.processor.tokenizer.pad(label_features, return_tensors="pt")

        # Паддинг таңбалауыштарын -100-ге ауыстырыңыз
        labels = labels_batch["input_ids"].masked_fill(labels_batch.attention_mask.ne(1), -100)

        # Бастапқы таңбалауышты алып тастаңыз (егер бар болса)
        if (labels[:, 0] == self.decoder_start_token_id).all().cpu().item():
            labels = labels[:, 1:]

        batch["labels"] = labels
        return batch

data_collator = DataCollatorSpeechSeq2SeqWithPadding(
    processor=processor,
    decoder_start_token_id=model.config.decoder_start_token_id,
)
import evaluate
metric = evaluate.load("wer")

def compute_metrics(pred):
    pred_ids = pred.predictions
    label_ids = pred.label_ids

    # -100-ді pad_token_id-ге ауыстырыңыз
    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 (Word Error Rate)деп санаймыз
    wer_value = 100 * metric.compute(predictions=pred_str, references=label_str)
    return {"wer": wer_value}
from transformers import Seq2SeqTrainingArguments, Seq2SeqTrainer

training_args = Seq2SeqTrainingArguments(
    output_dir="./whisper-small-kk",
    per_device_train_batch_size=16,
    gradient_accumulation_steps=1,
    learning_rate=1e-5,
    warmup_steps=500,
    max_steps=4000,
    gradient_checkpointing=True,
    fp16=True,
    evaluation_strategy="steps",
    per_device_eval_batch_size=8,
    predict_with_generate=True,
    generation_max_length=225,
    save_steps=1000,
    eval_steps=1000,
    logging_steps=25,
    report_to=["tensorboard"],
    load_best_model_at_end=True,
    metric_for_best_model="wer",
    greater_is_better=False,
    push_to_hub=True,
)

trainer = Seq2SeqTrainer(
    args=training_args,
    model=model,
    train_dataset=common_voice["train"],
    eval_dataset=common_voice["test"],
    data_collator=data_collator,
    compute_metrics=compute_metrics,
    tokenizer=processor.feature_extractor,
)

processor.save_pretrained(training_args.output_dir)
  • max_steps=4000-оқу қадамдарының жалпы саны.
  • evaluation_strategy="steps" - біз модельді белгілі бір қадам аралығы арқылы бағалаймыз.
  • save_steps=1000 және eval_steps=1000 - әр 1000 қадам сайын біз чекпоинтті сақтап, модельді бағалаймыз.
  • logging_steps=25-әр 25 қадам сайын көрсеткіштерді логтау.
  • load_best_model_at_end=True - соңында біз WER метрикасы бойынша ең жақсы чекпоинтті жүктейміз.
trainer.train()

Бұл кезеңде оқу процесі басталады. Tensorboard немесе тікелей журналдардағы көрсеткіштерді бақылау маңызды.

trainer.push_to_hub(
    "armanibadboy/whisper-small-kazakh", 
    token=" HF_TOKEN " # сіздің Hugging Face таңбалауышыңыз
)

Сіз "armanibadboy/whisper-small-kazakh" - ті hugging Face-тегі репозиторийіңіздің кез келген басқа атауымен алмастыра аласыз.

Модельдің нақты уақыттағы жұмысын тексеру үшін gradio негізіндегі қарапайым веб-интерфейс жасауға болады:

from transformers import pipeline
import gradio as gr

# Біздің дайындалған модельді жүктеңіз (сіздің жолыңызға/репозиторий атауына ауыстырыңыз)
pipe = pipeline(model="armanibadboy/whisper-small-kk")

def transcribe(audio):
    text = pipe(audio)["text"]
    return text

iface = gr.Interface(
    fn=transcribe,
    inputs=gr.Audio(source="microphone", type="filepath"),
    outputs="text",
    title="Whisper Small Kazakh",
    description="қазақ тіліне арналған мәтінге аудионы транскрипциялау (fine-tuning Whisper Small).",
)

iface.launch()

Енді ұяшықты іске қосу арқылы сіз микрофон арқылы аудио жазу мүмкіндігі бар веб-қосымшаны аласыз. Модель қазақ мәтінін автоматты түрде таниды және шығарады.

Mozilla common Voice қазақ датасетінде Whisper Small моделін оқыта отырып, біз қазақ тілінде сөйлеуді тиімді тануға қабілетті жүйені алдық. Бұл дауыстық көмекшілер мен оқу платформаларынан бастап аудио/бейне файлдарды автоматты түрде транскрипциялау қызметтеріне дейін жергілікті қосымшаларды дамытудың кең перспективаларын ашады.

Fine-tuning-пен салыстырмалы түрде шағын модель (Whisper Small) тәсілі арзан болды (Google Colab Pro-да шамамен 10 несие) және жеткілікті жылдам (GPU T4-те 5 сағат). Қорытынды нәтижелер жақсы тану дәлдігін көрсетеді (сынақ үлгісінде WER 0% дейін), бірақ нақты жағдайда бұл көрсеткіш өзгеруі мүмкін.

Егер сіз осы жобаны одан әрі дамытқыңыз келсе — қосымша мәліметтер қосыңыз, алдын-ала өңдеу процесін жақсартыңыз, сонымен қатар гиперпараметрлермен тәжірибе жасаңыз. Сіздің зерттеулеріңізге сәттілік!

Пікірлер 4

Кіру пікір қалдыру үшін

осындай модельдер жетпей жатыр қазақшаға

Жауап беру

на этой неделе еще сделаю tts

Жауап беру

керемет!

Жауап беру