Конструктор эксперимента
Эта страница проведёт вас через сборку полного 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") |
| Особенности | Разные устройства, условия записи |
Свой датасет
Если ваши данные не покрываются готовыми загрузчиками, есть два пути.
Путь 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 за один проход.
Если нужна одна метрика:
Шаг 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-стек:
Пример запуска
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 |
| Без нормализации | Метрики считаются на исходном тексте | Только если тексты уже нормализованы |
Шаг 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 |
Интерактивный сборщик
Выберите ваши компоненты, и сборщик покажет готовый код, команду установки и список артефактов.
Команда установки
Готовый код
Артефакты
Что дальше?
- Быстрый старт -- канонический рабочий сценарий от начала до конца
- Справочник API -> Датасеты -- полная документация всех методов датасета
- Справочник API -> Метрики -- все доступные метрики
- Расширение -- как добавить свой нормализатор, модель или метрику