YAML Metadata Warning:empty or missing yaml metadata in repo card
Check out the documentation for more information.
Qwen3-ASR-1.7B для казахского
Полное дообучение Qwen/Qwen3-ASR-1.7B-hf. Казахского не было среди языков
базовой модели: её WER на нём 109.04 при LID 0%.
Использовать: full-stage3/
Результаты, held-out test (500 строк на язык)
| WER | CER | LID | база | дельта | |
|---|---|---|---|---|---|
| kk | 19.82 | 6.32 | 99.2 | 109.04 | −89.22 |
| ru | 9.90 | 3.51 | 100.0 | 10.52 | −0.61 |
| en | 5.00 | 2.59 | 99.8 | 4.27 | +0.73 |
Русский стал лучше нетронутой модели: цена добавления казахского отрицательна.
Сравнение с опубликованным ориентиром
nur-dev/Qwen3-ASR-0.6B-kk-ru-en — единственная известная модель на ту же
задачу:
| FLEURS kk | ru | en | |
|---|---|---|---|
| nur-dev (0.6B) | 17.80 | +2.86 | +1.53 |
| эта модель (1.7B) | 17.58 | −0.61 | +0.73 |
Лучше по всем трём метрикам.
По источникам
| источник | база | эта модель |
|---|---|---|
| fleurs/kk | 108.97 | 17.58 |
| commonvoice/kk | 109.38 | 30.41 |
| sova/ru | 17.30 | 14.87 |
| commonvoice/ru | 7.66 | 7.66 |
| fleurs/ru | 6.78 | 8.05 |
| fleurs/en | 3.97 | 4.53 |
| commonvoice/en | 4.82 | 5.87 |
Стадии обучения
Цепочка из трёх стадий, каждая стартует с чекпоинта предыдущей.
| стадия | казахский из | смесь kk/ru/en | lr | kk на test |
|---|---|---|---|---|
| 1 | KSC2 | 55 / 20 / 25 | 2e-5 | 20.34 |
| 2 | + чтение вслух, синтез | 50 / 22 / 28 | 1e-5 | 20.23 |
| 3 | + Common Voice, FLEURS | 33 / 37 / 30 | 5e-6 | 19.82 |
Стадия 1 на одном KSC2 (826.8 ч) дала 20.34 из итоговых 19.82. Остальные 1800 часов добавили полпункта: на этом масштабе модель насыщается уже на основном источнике.
Формат вывода
language Kazakh<asr_text><транскрипт>
Тег языка входит в обучаемую часть, поэтому модель ещё и определяет язык —
LID 99.2% на казахском против 0% у базовой. Ход ассистента закрывается
токеном <|im_end|>: без него модель не учится останавливаться и генерирует
до max_new_tokens.
Использование
import soundfile as sf
import torch
from transformers import AutoProcessor, Qwen3ASRForConditionalGeneration
BASE = "Qwen/Qwen3-ASR-1.7B-hf" # процессор берётся отсюда
MODEL = "Saken20/finetune-stt-full-model" # или локальный путь к full-stage3/
processor = AutoProcessor.from_pretrained(BASE)
model = Qwen3ASRForConditionalGeneration.from_pretrained(
MODEL,
dtype=torch.bfloat16,
attn_implementation="eager",
device_map="cuda" if torch.cuda.is_available() else "cpu",
)
model.eval()
# 16 кГц моно, не длиннее 30 секунд
audio, sr = sf.read("sample.wav", dtype="float32")
assert sr == 16000, f"нужно 16 кГц, получено {sr}"
if audio.ndim > 1:
audio = audio.mean(axis=1)
inputs = processor.apply_transcription_request(
audio=[audio],
language=None, # None — модель определит сама; "Kazakh" — принудительно
).to(model.device, model.dtype)
with torch.no_grad():
output_ids = model.generate(
**inputs, max_new_tokens=256, num_beams=1, do_sample=False
)
parsed = processor.decode(output_ids, return_format="parsed")
if isinstance(parsed, dict):
parsed = [parsed]
for item in parsed:
print("язык: ", item.get("language"))
print("транскрипт:", item.get("transcription"))
Имена языков ровно те, на которых обучали: Kazakh, Russian, English.
Четыре места, где легко ошибиться:
return_format="parsed", никогда"raw". Сrawв текст попадают спецтокены и паддинг, каждый считается словом — на этом baseline русского показывал WER 280% при том, что модель русский знает.sampling_rateвapply_transcription_requestне передаётся — он уходит вprocessor_kwargs, и transformers ругается. Аудио должно быть уже в 16 кГц.attn_implementation="eager"обязателен на torch 2.13.0+cu130: sdpa в bf16 там даёт NaN в обратном проходе. На других сборках стоит проверить,sdpaбыстрее.- Процессор грузится из базовой модели. Файлы процессора лежат и в папке
чекпоинта, но проверенный путь — из
Qwen/Qwen3-ASR-1.7B-hf.
Обучение
Гиперпараметры из официального рецепта
QwenLM/Qwen3-ASR/finetuning:
полное дообучение всех весов без LoRA и заморозки, глобальный батч 256
(16 на устройство × 16 накопления), расписание linear, warmup 0.02,
weight_decay 0.0, bf16, attention eager. Одна NVIDIA A100-SXM4-80GB.
Данные
Корпус 2620 часов, отпечаток 4f795e132792.
| язык | источники |
|---|---|
| kk | KSC2 826.8 ч, корпус чтения вслух 554 ч, синтез ресторанных фраз 86 ч, Common Voice, FLEURS |
| ru | SOVA RuDevices, Common Voice, FLEURS (~132 ч) |
| en | Common Voice (потолок 1000 ч), FLEURS |
Русский и английский идут replay'ем, чтобы модель их не забыла.
Перед обучением корпус проходит блокирующие проверки: утечка между сплитами (точное совпадение аудио, точное совпадение текста, near-duplicate по символьным 5-граммам, пересечение дикторов) и согласованность записи чисел между источниками.
Как выбран чекпоинт
Не по лоссу и не по последнему шагу. Regression-guard берёт чекпоинт с наименьшим казахским WER среди тех, где русский и английский не ушли от базовой модели дальше 3.0 п.п. Отбор идёт по validation, финальная таблица по test считается ровно один раз.
У выбранного чекпоинта запас отрицательный: оба защищаемых языка лучше базы.
Оговорки
commonvoice/enпросел с 4.82 до 5.87 — единственная устойчивая регрессия.- KSC2 в тестовом наборе не представлен: колонка диктора там вырождена (одно значение на весь источник), поэтому источник целиком идёт в обучение. Казахский измеряется на Common Voice и FLEURS, то есть вне основного домена обучения.
- Синтетический источник ресторанных фраз (голоса KazakhTTS) измеримой пользы не дал: стадия 2 добавила 0.11 пункта вместе со вторым своим источником.
- Аудио: 16 кГц моно, не длиннее 30 секунд — это
chunk_lengthаудио-энкодера, всё длиннее модель не увидит целиком. - Числа по-казахски выходят словами, а не цифрами: так они записаны в KSC2, это нормализация самого ISSAI. Для русского и английского — цифрами.
- Метрики считаются с приведением к нижнему регистру и снятием пунктуации,
симметрично для гипотезы и эталона. Генерация жадная,
num_beams=1.
Содержимое репозитория
| папка | kk на test |
|---|---|
full-stage3/ |
19.82 — использовать эту |
full-stage2/ |
20.23 |
full-stage1/ |
20.34 |
Отчёты, истории regression-guard и логи — в датасет-репозитории
Saken20/finetune-stt-full.
Источники данных и атрибуция
- KSC2 — ISSAI, Nazarbayev University. Mussakhojayeva et al., Interspeech 2022. CC BY 4.0.
- Common Voice — Mozilla Common Voice Corpus 22.0, CC0.
- FLEURS — Google, CC-BY.
- SOVA RuDevices.
- Синтез ресторанных фраз — голоса KazakhTTS, Mussakhojayeva, S., Janaliyeva, A., Mirzakhmetov, A., Khassanov, Y., Varol, H.A. (2021) KazakhTTS: An Open-Source Kazakh Text-to-Speech Synthesis Dataset. Proc. Interspeech.
Базовая модель Qwen/Qwen3-ASR-1.7B распространяется на условиях своей
лицензии; они наследуются этой моделью.