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

Конструктор эксперимента

Эта страница проведёт вас через сборку полного ASR-эксперимента шаг за шагом -- от выбора данных до готового кода, который можно скопировать и запустить.

Если вы уже знаете, что вам нужно, пропустите пояснения и переходите сразу к интерактивному сборщику внизу страницы.


Шаг 1. На каких данных будет замер?

Прежде чем выбирать модели и метрики, нужно понять, на чём вы будете измерять качество распознавания.

Готовые датасеты

plantain2asr поставляется с загрузчиками для нескольких русскоязычных корпусов. Каждый загрузчик автоматически парсит структуру корпуса и отдаёт одинаковый интерфейс AudioSample.

Golos

Открытый корпус Сбера. ~1 200 часов русской речи. Два подмножества:

  • crowd -- запись через краудсорсинг (чистая, рядовые дикторы)
  • farfield -- запись с дальних микрофонов (шумнее, реалистичнее)
Размер ~1 200 ч
Формат аудио WAV / OGG
Скачать github.com/sberdevices/golos
Загрузчик GolosDataset("data/golos")
Автозагрузка да (auto_download=True)
from plantain2asr import GolosDataset

ds = GolosDataset("data/golos")
crowd = ds.filter(lambda s: s.meta["subset"] == "crowd")

DaGRuS

Корпус разговорной русской речи с детальной разметкой: смех, шум, неразборчивые слова, филлеры.

Размер ~60 ч
Особенности Разговорная речь, разметка событий
Скачать по запросу у авторов корпуса
Загрузчик DagrusDataset("data/dagrus")

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

Используйте DagrusNormalizer() -- он умеет убирать специфическую разметку корпуса ([laugh], [noise], {word*}) и нормализовать разговорные формы ("щас" -> "сейчас").

from plantain2asr import DagrusDataset, DagrusNormalizer

ds = DagrusDataset("data/dagrus")
norm = ds >> DagrusNormalizer()

RuDevices

Корпус записей с различных устройств (ноутбуки, телефоны, умные колонки).

Загрузчик RuDevicesDataset("data/rudevices")
Особенности Разные устройства, условия записи
from plantain2asr import RuDevicesDataset

ds = RuDevicesDataset("data/rudevices")

Свой датасет

Если ваши данные не покрываются готовыми загрузчиками, есть два пути.

Путь 1: NeMo-формат JSONL

Если у вас есть аудиофайлы и JSONL-манифест, используйте NeMoDataset:

{"audio_filepath": "audio/001.wav", "text": "привет мир", "duration": 2.1}
{"audio_filepath": "audio/002.wav", "text": "как дела", "duration": 1.8}
from plantain2asr import NeMoDataset

ds = NeMoDataset(root_dir="data/my_corpus", manifest_path="data/my_corpus/manifest.jsonl")

Путь 2: свой класс-загрузчик

Наследуйтесь от BaseASRDataset и верните список AudioSample:

from plantain2asr.dataloaders.base import BaseASRDataset
from plantain2asr.dataloaders.types import AudioSample

class MyDataset(BaseASRDataset):
    def __init__(self, root_dir):
        super().__init__()
        self.name = "my-dataset"
        self._samples = [
            AudioSample(id="s1", audio_path=f"{root_dir}/001.wav", text="эталонный текст"),
        ]

Подробнее: Расширение -> Своя модель


Шаг 2. Какие метрики вам нужны?

Метрики показывают, насколько хорошо модель распознала речь.

Основные метрики

Метрика Что измеряет Когда нужна
WER (Word Error Rate) Доля ошибочных слов. Считает вставки, удаления и замены на уровне слов. Универсальная основная метрика. Используйте всегда.
CER (Character Error Rate) То же, но на уровне символов. Когда важна точность написания, а не только слов.
MER (Match Error Rate) Нормализованный вариант WER с учётом длины обеих строк. Для более устойчивой оценки на коротких фразах.
Accuracy 1 - MER. Показывает долю правильного распознавания. Когда нужна интуитивно понятная цифра "процент верных".

Дополнительные метрики

Метрика Что измеряет
WIL Word Information Lost -- потеря информации на уровне слов
WIP Word Information Preserved -- сохранённая информация
IDR Insertion/Deletion Ratio -- соотношение вставок и удалений
LengthRatio Отношение длины гипотезы к длине эталона
BERTScore Семантическое сходство через BERT-эмбеддинги (нужен extra analysis)
POSAnalysis Анализ ошибок по частям речи (нужен extra analysis)

Что выбрать?

Рекомендация

Для первого замера используйте Metrics.composite() -- он посчитает WER, CER, MER, WIL, WIP, Accuracy, IDR и LengthRatio за один проход.

from plantain2asr import Metrics

norm >> Metrics.composite()

Если нужна одна метрика:

norm >> Metrics.WER()

Шаг 3. Какие модели сравнить?

plantain2asr поддерживает несколько семейств ASR-моделей. Все они используются одинаково: dataset >> Models.XXX().

Локальные модели

Модель Что это Устройство Extra для pip Когда выбрать
GigaAM v3 Крупная модель от Сбера, e2e-RNNT архитектура. Лучшее качество на русском. CUDA / MPS / CPU gigaam Когда важно качество и есть GPU
GigaAM v2 Предыдущее поколение GigaAM. CUDA / MPS / CPU gigaam Для сравнения с v3
Whisper Модель OpenAI, large-v3. Сильный мультиязычный baseline. CUDA / MPS / CPU whisper Универсальный baseline
T-One Модель T-Bank на ONNX Runtime. Быстрый инференс. CUDA / CPU tone + source archive T-One Когда важна скорость
Vosk Лёгкая offline-модель на Kaldi. Работает только на CPU. CPU vosk Когда нет GPU и нужен offline
Canary NVIDIA NeMo Canary. Тяжёлая, требует GPU. CUDA canary Исследовательские сравнения

Облачные модели

Модель Что это Extra Когда выбрать
SaluteSpeech Облачный API Сбера. нет Когда нужно облачное распознавание

Установка

Каждая модель требует свой набор зависимостей. Ставьте только то, что нужно:

pip install plantain2asr[gigaam]
pip install plantain2asr[whisper]
pip install plantain2asr[vosk]
pip install plantain2asr[tone]
pip install "tone @ https://github.com/voicekit-team/T-one/archive/3c5b6c015038173840e62cea99e10cdb1c759116.tar.gz"

Или сразу весь CPU/GPU-стек:

pip install plantain2asr[asr-cpu]
pip install plantain2asr[asr-gpu]

Пример запуска

from plantain2asr import Models

ds >> Models.GigaAM_v3()
ds >> Models.Whisper()
ds >> Models.Vosk(model_path="path/to/vosk-model")

Результаты кешируются: повторный запуск не пересчитывает уже распознанные семплы.


Шаг 4. Нормализация текста

Перед подсчётом метрик нужно привести эталон и гипотезу к единому виду: убрать пунктуацию, привести регистр, обработать специфику корпуса.

Нормализатор Что делает Когда использовать
SimpleNormalizer() Lowercase, убирает пунктуацию, ё -> е, схлопывает пробелы Для большинства корпусов
DagrusNormalizer() Всё что SimpleNormalizer + убирает разметку DaGRuS + нормализует разговорные формы Для корпуса DaGRuS
Без нормализации Метрики считаются на исходном тексте Только если тексты уже нормализованы
from plantain2asr import SimpleNormalizer

norm = ds >> SimpleNormalizer()

Шаг 5. Собираем цепочку >>

Теперь, когда вы выбрали данные, модели, нормализатор и метрики, соберите их в пайплайн через оператор >>:

from plantain2asr import GolosDataset, Models, SimpleNormalizer, Metrics

ds = GolosDataset("data/golos")

# шаг 1: прогнать модели
ds >> Models.GigaAM_v3()
ds >> Models.Whisper()

# шаг 2: нормализовать
norm = ds >> SimpleNormalizer()

# шаг 3: посчитать метрики
norm >> Metrics.composite()

# шаг 4: посмотреть результаты
df = norm.to_pandas()
print(df.groupby("model")[["WER", "CER"]].mean().sort_values("WER"))

Каждый >> создаёт новый слой результатов поверх датасета. Можно ветвить (.filter()), брать подвыборки (.take(n)) и рекомбинировать.

Обёртка Experiment

Если не нужен ручной контроль, Experiment оборачивает те же >> шаги:

from plantain2asr import Experiment, GolosDataset, Models, SimpleNormalizer

experiment = Experiment(
    dataset=GolosDataset("data/golos"),
    models=[Models.GigaAM_v3(), Models.Whisper()],
    normalizer=SimpleNormalizer(),
)

experiment.compare_on_corpus(metrics=["WER", "CER", "Accuracy"])
Метод Что делает
compare_on_corpus() Сравнение моделей с таблицей метрик
prepare_thesis_tables() CSV-таблицы для диссертации
export_appendix_bundle() Полный пакет: таблицы + отчёт + бенчмарк
benchmark_models() Замеры latency, throughput, RTF

Интерактивный сборщик

Выберите ваши компоненты, и сборщик покажет готовый код, команду установки и список артефактов.

1 Какой результат нужен?
2 Какой датасет?
3 Какие модели?
4 Нормализатор
5 Метрики
6 Дополнительно

Команда установки

Готовый код

Артефакты


Что дальше?