# Методика контрольного прогона ASR

Десять русских записей со словами и аббревиатурами из технических команд.
Три синтетических голоса Piper произносят термины так, как они звучат в русской
фразе. Эталон использует исходное латинское написание. В наборе по две записи
на чистом звуке и при SNR 20, 12, 6 и 0 дБ. Шум синтетический: розовый,
имитация вентилятора и низкочастотный нестационарный фон.

Воспроизводимый вход сохранён в `audio/` и `corpus.json`. WAV — mono PCM16
16 кГц. Для каждого файла клиент Compare передаёт один полный диапазон через
существующую диагностику и использует одинаковые Opus-пакеты для моделей.
Фиксированный диапазон исключает влияние разбиения VAD на сравнение. Исходный
PCM проверен по SHA-256. Для моделей worker сравниваются и хеши PCM после
подготовки входа. LinTO не возвращает хеш входа модели.

WER и CER считаются расстоянием Левенштейна. Как в Compare, нормализуются NFC,
регистр, пунктуация и пробелы. CER исключает пробелы. Цифры, буква «ё» и
латинское написание сохраняются. Поэтому «джейсон» вместо `JSON` считается
ошибкой записи термина. Термины дополнительно оценены по точному совпадению
нормализованных токенов. Общие WER и CER делятся на суммарное число эталонных
слов и символов по всем записям.

Чистое время берётся из `timings.asr.worker_decode_ms` диагностического ответа.
Для LinTO это переданный backend показатель `recognition_ms`. Загрузка модели,
очередь, кодирование и сетевой обмен учитываются отдельно. У каждой успешной
записи один вызов модели. В отчёте приведены медиана и максимум для десяти
разных входов. Это не оценка хвостов распределения и не сравнение на живой речи.

Победитель качества определяется по наименьшему WER среди моделей с полным
покрытием, при равенстве по CER, затем по медиане времени. Отдельно сравниваются
точное написание терминов и компромисс качества со скоростью. Сырые ответы,
включая неуспешные попытки, сохраняются в `raw.jsonl`. Итоговая таблица
использует прогоны после поставки Unified. Предварительные результаты семи
моделей в `before-rollout.jsonl` в рейтинг не входят. Прогон Unified на CPU
с исходным WAV и FP32 вынесен в `unified-cpu.json`. Нормализованные
показатели вычисляет `score.py`.
