решение из ленты заказов

Подбор офлайн ASR и TTS для приложения на React Native

Приложение должно слышать и говорить по-русски без интернета. Вопрос всегда один и тот же: какую модель поставить, чтобы влезла в установщик, не съела ОЗУ, успевала за речью, была законна в платном продукте и её можно было перенести в React Native за разумное время. Ниже — стенд, который отвечает на этот вопрос цифрами, а не мнением: задайте условия слева, справа появится связка, отсев с причинами, план внедрения и риски.

Стенд подбора

Условия

Цифры стенда — ориентиры на нашем оборудовании, а не замер вашего репозитория. Первым шагом работы мы меряем именно то, что стоит у вас, и подставляем ваши числа в эту же таблицу.

То же решение машиночитаемо (JSON для отчёта)

Распознавание речи: все кандидаты и отсев

WER — доля ошибочных слов на русской спонтанной речи: 15 % значит, что каждое седьмое слово придётся править. RTF — доля реального времени на выбранном железе: 0,3 значит «10 секунд звука за 3 секунды». «Старт» — холодная загрузка модели в память, её пользователь чувствует как задержку первого нажатия.

Синтез речи: все кандидаты и отсев

MOS — субъективная оценка естественности голоса по пятибалльной шкале (3 — «понятно, но робот», 4 — «похоже на человека»). Считается на слепом прослушивании, поэтому сравнивать её можно только внутри одного прогона одного стенда.

План внедрения

    Риски и что с ними делать

    Как это меряется

    📉

    Точность — WER и CER

    Берём один набор записей и считаем долю ошибочных слов (WER) и символов (CER) относительно ручной расшифровки. Отдельно — на чистой речи, на шуме улицы и на телефонном канале: модель, лучшая на студии, часто проигрывает на улице.

    ⏱️

    Скорость — RTF и задержка

    RTF отвечает «успеваем ли за речью», но пользователь чувствует другое — задержку первого слова и паузу после конца фразы. Обе меряем отдельно, на реальном телефоне, а не на эмуляторе.

    🔊

    Голос — MOS и разборчивость

    Естественность — слепое прослушивание по пятибалльной шкале. Разборчивость — доля верно записанных на слух слов. Отдельно проверяем числа, даты, ударения и аббревиатуры: на них синтез и падает.

    📦

    Цена в приложении

    Вес файлов модели, пик ОЗУ, холодный старт, нагрев и расход батареи за 10 минут непрерывной работы. Модель, которая греет телефон, не доживёт до второго дня использования.

    ⚖️

    Лицензия

    Главная ловушка офлайн-моделей: самые приятные на слух русские модели часто идут под CC BY-NC-SA — в платном приложении их использовать нельзя. Копилефт (GPL/LGPL) — отдельный разговор с юристом.

    🧩

    Цена интеграции в RN

    JS-поток React Native не считает — всё уходит в нативный модуль. Считаем реальную работу: готовая обёртка, C API с мостом или полностью свой препроцессинг признаков.

    Ответы на три вопроса из задания

    С какими офлайн-моделями для русского работали

    Распознавание: Vosk (ru-small и полная ru), whisper.cpp от tiny до small в квантовании q5, sherpa-onnx zipformer, модели семейства GigaAM в onnx. Синтез: Piper (голоса ru_RU), VITS в sherpa-onnx, RHVoice, системный TTS. Рабочий контур у нас постоянный: своя ферма распознавания на GPU, через которую проходит поток записей, и стенд сравнения, из которого собрана таблица на этой странице.

    Какие метрики говорят о качестве

    Распознавание — WER и CER на едином наборе, отдельно по условиям записи; плюс задержка первого слова, RTF, пик ОЗУ и холодный старт. Синтез — MOS на слепом прослушивании и разборчивость, отдельно на числах, датах и ударениях; RTF синтеза и время до первого звука.

    Метрика без общего набора записей бессмысленна: сравнивать можно только числа, полученные одним прогоном на одних данных. Поэтому вторым шагом работы всегда идёт стенд, а не смена модели.

    Что критично в React Native и мобильных ОС

    Счёт не живёт в JS-потоке: нужен нативный модуль (JSI или старый мост) и передача звука без копирования буферов туда-обратно. На Android — фоновая запись и ограничения на работу свёрнутого приложения, разные ABI в сборке, лимит размера установщика в сторе. На iOS — аудиосессия и прерывания звонком, фоновые режимы, требования App Review к тому, что и куда уходит.

    И главное для офлайна: модель должна лежать в приложении или докачиваться заранее, а не «при первом использовании, если будет сеть» — иначе офлайн-режим сломается ровно там, где он нужен.

    Нужен такой разбор для вашего репозитория?

    Первый шаг — замер того, что уже стоит: сегодняшние WER, RTF, ОЗУ и холодный старт ваших моделей на реальных телефонах, и та же таблица с вашими числами вместо стендовых. Дальше — отчёт со сравнением, рекомендациями, планом внедрения и рисками.

    Обсудить разбор