Перейти к содержанию

Оценка качества

stt-ru evaluate, stt_ru.evaluation

Описание

Команда распознает записи из вашей разметки одной или несколькими моделями и считает долю ошибок слов (WER) и символов (CER) и скорость. Так можно выбрать модель для своих записей: звонков, лекций, диктовки. Нужно дополнение eval:

pip install "stt-ru[eval]"
stt-ru evaluate eval.csv                                         # модель по умолчанию
stt-ru evaluate eval.csv -m gigaam-v3-e2e-rnnt -m gigaam-v3-rnnt -o report.json
Модель              WER, %  CER, %  Скорость  Записей  Ошибок
gigaam-v3-e2e-rnnt     0.0     0.0     49.8x        2       0
gigaam-v3-rnnt         0.0     0.0     52.4x        2       0
  • WER и CER - доли замен, пропусков и вставок слов и символов (расстояние Левенштейна) по всем записям вместе: сумма ошибок, деленная на сумму слов или символов эталонов. Пробелы входят в CER.
  • Скорость - во сколько раз распознавание быстрее реального времени, вместе с чтением файла.
  • Записей и Ошибок - сколько строк разметки и сколько из них не распознано.

Модели загружаются по очереди; модель, которая не загрузилась, отмечается в таблице, остальные оцениваются. Ход работы и ошибки выводятся в stderr, таблица - в stdout.

Разметка

Разметка - CSV, JSON Lines или каталог. Файлы - в UTF-8, пути к записям - относительно файла разметки.

CSV с колонками audio, text и необязательной channel. Разделитель - запятая, точка с запятой (как сохраняет Excel в русской локали) или табуляция, имена колонок - в любом регистре, пустые строки пропускаются. Текст с разделителем берется в кавычки: строка, в которой значений больше, чем колонок, - ошибка с ее номером.

audio,text,channel
calls/0001.wav,"Добрый день, компания «Ромашка», чем могу помочь?",1
calls/0001.wav,"Здравствуйте, хочу узнать статус заказа.",0
lectures/intro.mp3,"Сегодня мы поговорим о распознавании речи.",

JSON Lines с теми же полями:

{"audio": "calls/0001.wav", "text": "Добрый день, компания «Ромашка», чем могу помочь?", "channel": 1}
{"audio": "lectures/intro.mp3", "text": "Сегодня мы поговорим о распознавании речи."}

Каталог, где у каждого аудиофайла есть эталон с тем же именем: call.wav и call.txt.

channel - номер канала стереозаписи, где канал - говорящий: эталон сравнивается только с текстом этого канала. Если дорожка одна (монозапись, --mono или одинаковые каналы), сравнивается весь текст; канал, совпавший с другим каналом записи, сравнивается с текстом того канала. Файл, который встречается в разметке несколько раз, распознается один раз.

Нормализация

Перед подсчетом эталон и распознанный текст приводятся к одному виду: нижний регистр, «ё» как «е», все, кроме букв и цифр, - пробел. Разложенные буквы с диакритикой собираются, знаки ударения и невидимые символы (мягкий перенос, пробел нулевой ширины) удаляются.

Числа не переводятся из цифр в слова. Если цифры есть только в эталоне или только в распознанном тексте, после таблицы выводится предупреждение: WER завышен из-за разной записи чисел. GigaAM-v3 E2E пишет числа цифрами, а GigaAM-v3 RNN-T и CTC - словами, поэтому для честного сравнения таких моделей записывайте числа в эталоне так, как их пишет нужная модель, или сравнивайте на записях без чисел.

Параметры

Параметр По умолчанию Описание
РАЗМЕТКА - CSV, JSONL или каталог
-m, --model gigaam-v3-e2e-rnnt Модель; можно повторить, повтор имени учитывается один раз
-o, --output - Подробный отчет в JSON
-q, --quiet выключен Не выводить ход работы; ошибки выводятся всегда

Остальные параметры модели и поиска речи - на странице Модели; --model-dir задается только для одной модели. Разметка и аргументы, в том числе имена моделей onnx-asr и путь отчета, проверяются до загрузки моделей; модель с Hugging Face (имя с «/») проверяется при загрузке.

Код выхода - 1, если модель не загрузилась, запись не распознана или отчет не сохранен; 2 - неверные аргументы или разметка; 130 - прерывание Ctrl+C: таблица и отчет сохраняются по моделям, оцененным целиком.

Отчет

-o report.json сохраняет путь к разметке и для каждой модели - model, error (ошибка загрузки), wer, cer, speed, число записей files и ошибок failed, digits_mismatch и results по строкам разметки: audio, channel, reference, hypothesis, duration, seconds, words, substitutions, deletions, insertions, chars, char_errors, wer, cer и error. По hypothesis и числам ошибок удобно искать записи, на которых модель ошибается больше всего.

Библиотека Python

>>> from stt_ru import Transcriber
>>> from stt_ru.evaluation import evaluate, format_table, load_manifest

>>> samples = load_manifest("eval.csv")
>>> report = evaluate(Transcriber("gigaam-v3-e2e-rnnt"), samples)
>>> report.wer, report.cer
(0.0, 0.0)
>>> print(format_table([report]))
Модель              WER, %  CER, %  Скорость  Записей  Ошибок
gigaam-v3-e2e-rnnt     0.0     0.0     48.6x        2       0

load_manifest возвращает список Sample(audio, text, channel), evaluate - ModelReport с результатами записей FileResult и сводными wer, cer и speed. normalize(text) - нормализация перед подсчетом.