Дообучение Whisper под доменную лексику заказчика
Базовый Whisper Large v3 показывает WER 6–9% на стандартной русской речи, но на медицинских терминах, юридических формулировках или технических названиях продуктов ошибки вырастают до 25–40%. Дообучение под конкретный домен снижает WER до 3–8% на целевой лексике.
Когда дообучение необходимо
- Специфическая терминология с нулевым или малым покрытием в обучающих данных
- Сильный региональный или профессиональный акцент
- Низкое качество записи (телефония 8 kHz, шумные условия)
- Кодовое переключение (смесь русского с английским техническими терминами)
- Имена собственные: названия продуктов, брендов, людей
Подготовка датасета
Минимальный объём для значимого улучшения: 10–30 часов размеченного аудио целевого домена. Для узкой специализации (один диктор, чистые условия) достаточно 2–5 часов.
Формат для обучения (HuggingFace datasets):
from datasets import Dataset, Audio
import pandas as pd
# Формат: audio path + transcript
data = pd.read_csv("transcripts.csv") # columns: audio_path, text
dataset = Dataset.from_pandas(data)
dataset = dataset.cast_column("audio_path", Audio(sampling_rate=16000))
Требования к данным:
- Частота дискретизации: 16 kHz
- Формат: WAV (предпочтительно) или FLAC
- Разметка: полный текст без сокращений нестандартных слов
- Длина сегментов: 5–30 секунд
Fine-tuning pipeline
Используем transformers + Seq2SeqTrainer:
from transformers import (
WhisperForConditionalGeneration,
WhisperProcessor,
Seq2SeqTrainer,
Seq2SeqTrainingArguments
)
model = WhisperForConditionalGeneration.from_pretrained("openai/whisper-large-v3")
processor = WhisperProcessor.from_pretrained("openai/whisper-large-v3", language="Russian")
training_args = Seq2SeqTrainingArguments(
output_dir="./whisper-medical-ru",
per_device_train_batch_size=4,
gradient_accumulation_steps=4,
learning_rate=1e-5,
warmup_steps=500,
max_steps=4000,
gradient_checkpointing=True,
fp16=True,
evaluation_strategy="steps",
eval_steps=500,
save_steps=500,
generation_max_length=225,
predict_with_generate=True,
load_best_model_at_end=True,
metric_for_best_model="wer",
greater_is_better=False,
)
Стратегия обучения
Parameter-Efficient Fine-Tuning (PEFT) через LoRA позволяет дообучить только 1–2% параметров, сохраняя качество:
from peft import LoraConfig, get_peft_model
lora_config = LoraConfig(
r=32,
lora_alpha=64,
target_modules=["q_proj", "v_proj"],
lora_dropout=0.05,
bias="none"
)
model = get_peft_model(model, lora_config)
LoRA-адаптер занимает 50–100 MB против 3 GB базовой модели — удобно для хранения нескольких доменных версий.
Метрики качества
| Этап | WER на домене | WER на общей речи |
|---|---|---|
| Базовый large-v3 | 25–40% | 6–9% |
| После fine-tuning (full) | 4–8% | 7–11% |
| После LoRA fine-tuning | 5–10% | 6–9% |
Full fine-tuning даёт чуть лучший результат на домене, но риск деградации на общей речи. LoRA сохраняет баланс.
Инфраструктура для обучения
Минимальная конфигурация: 1x A100 80GB. Время обучения при 20 часах данных:
- 4 000 шагов, batch 16: ~8 часов на A100
- Стоимость на AWS (p4d.24xlarge): ~$160
Для smaller бюджета — обучение на RTX 4090 с gradient checkpointing и fp16: те же 4 000 шагов займут ~24–36 часов.
Сроки проекта
- Подготовка и разметка данных: 1–2 недели (зависит от наличия транскрипций)
- Обучение и подбор гиперпараметров: 3–5 дней
- Тестирование и валидация: 3–5 дней
- Итого: 3–4 недели







