Потоковое распознавание речи на CPU: NVIDIA Nemotron в настольном приложении
Как OpenWhispr показывает текст прямо во время речи — модель с кешем через локальный WebSocket, без GPU и облака — и как мы добились надёжной работы.
OpenWhispr
Инженерное дело
Оглавление
Потоковое распознавание транскрибирует аудио прямо во время речи, не дожидаясь конца записи. Начиная с версии 1.7.6 OpenWhispr делает это полностью на устройстве: потоковые модели Nemotron от NVIDIA (600M параметров, квантование INT8) работают на CPU через локальный WebSocket-сервер sherpa-onnx; предпросмотр обновляется по мере поступления промежуточных результатов, а при остановке текст потока сразу становится транскриптом. Без GPU, без окружения Python, аудио не покидает компьютер.
Это технический разбор: почему прежний предпросмотр запаздывал, что на практике означает потоковая обработка с кешем, как конвейер устроен в приложении Electron, как ошибка фиксации версии портила декодирование и как мы перешли от повторной обработки каждой записи к фиксации самого потока. Сравнение моделей приведено в Parakeet vs Whisper vs Nemotron.
Обновлено 18 июля 2026 г. Детали относятся к потоковой транскрибации из OpenWhispr 1.7.6; всё описанное можно проверить в открытом репозитории.
Краткая проверка фактов (первоисточники)
- Cache-aware FastConformer в Nemotron обрабатывает только новое аудио и повторно использует кеш контекста энкодера, а размер фрагмента во время работы настраивается от 80ms до 1.12s. Карточка Nemotron Streaming EN · NVIDIA о потоковой обработке с кешем
- Английская модель показывает в среднем 6.93% WER в потоке с фрагментами 1.12s; многоязычная модель 3.5 охватывает 40 языковых и региональных вариантов с автоопределением. Карточка Nemotron 3.5 ASR
- Весь инференс выполняет sherpa-onnx — нативная среда ONNX без зависимости от Python, через online WebSocket-сервер для потоковой обработки. Мы фиксируем и поставляем версию 1.13.4. sherpa-onnx на GitHub
- Модели занимают на диске 632MB (английская) и 650MB (многоязычная) в формате ONNX INT8, загружаются один раз и сохраняются в локальном кеше. Реестр моделей OpenWhispr (открытый код) · Страница моделей OpenWhispr
Проблема: живой предпросмотр на пакетной модели
В OpenWhispr всегда был предпросмотр транскрибации — небольшое окно с тем, что модель услышала во время диктовки. До 1.7.6 пакетную модель можно было сделать похожей на живую только так: накопить около 1.5 секунды звука с микрофона, полностью транскрибировать фрагмент, добавить текст и повторить.
У подхода три системных недостатка. Во-первых, задержка: слова появляются только после заполнения буфера, поэтому предпросмотр отстаёт на полторы секунды плюс время инференса. Во-вторых, границы: слово между двумя фрагментами обрезается, и ни один не может его исправить, потому что они обрабатываются отдельно. В-третьих, контекст: пятый фрагмент не знает четвёртый, и модель заново разрешает те же неоднозначности каждые 1.5 секунды.
Короткие фрагменты ощущаются быстрее, но снижают точность: меньше контекста, больше границ. Перекрытие исправляет разрывы, но дважды транскрибирует одно аудио. Нужна модель, обученная работать с потоком. Это Nemotron.
Что означает потоковая обработка с кешем
Потоковая модель с кешем сохраняет внутреннее состояние между фрагментами. При поступлении нового аудио энкодер не перечитывает всё сказанное: обрабатывает только новые кадры и обращается к уже вычисленному контексту. Это тот же приём, который ускоряет чат-боты (KV-кеш), но в речевом энкодере.
Отсюда два следствия. Вычисления перестают расти с длиной записи: фрагмент стоит одинаково через десять секунд и десять минут, поэтому поток работает только на CPU. Контекст также сохраняется: модель использует всё сказанное и исправляет ранние слова, когда последующее аудио снимает неоднозначность. Поэтому текст заметно «устаканивается» после речи — это не ошибка, а пересмотр на основе лучших данных.
Допустимая задержка настраивается: Nemotron поддерживает фрагменты от 80ms (быстрее, меньше контекста на шаг) до 1.12s (точнее всего — в среднем 6.93% WER на наборах рейтинга, примерно в одном пункте от лучших пакетных моделей). Обучение использует NVIDIA cache-aware FastConformer с transducer-декодером; их техническая статья подробно объясняет теорию.
Архитектура OpenWhispr
Путь потоковой обработки в реальном времени в OpenWhispr
- •One persistent stream for the whole recording — the encoder cache carries context across chunks.
- •Everything is on-device: the WebSocket server is a local sherpa-onnx binary, not a cloud endpoint.
- •A clean flush at stop commits the streamed text as the final transcript; anything less falls back to a full re-decode.
Конвейер намеренно прост. AudioWorklet захватывает PCM с микрофона на 16kHz. Кадры преобразуются в float32 и по WebSocket отправляются online-серверу sherpa-onnx — нативному бинарному файлу, который OpenWhispr локально запускает и открывает на 127.0.0.1, по одному постоянному соединению на запись. Сервер запускает Nemotron с весами INT8 и возвращает промежуточные JSON-результаты; окно предпросмотра заменяет текст, а не дописывает его.
Зачем отдельный серверный процесс? Для изоляции. Нативные среды инференса могут упасть; ошибка выделения памяти в ядре ONNX не должна закрывать всё приложение. С вспомогательным процессом сбой означает переподключение, а не потерю диктовки. Нативный код также не попадает в основной процесс Electron: приложение говорит по протоколу, процесс выполняет математику.
По той же схеме работает наша локальная диаризация говорящих — один набор sherpa-onnx, несколько задач, всё на устройстве.
Что ломалось по пути
Версия среды оказалась важнее, чем мы ожидали. Для правильного декодирования Nemotron требует sherpa-onnx 1.13.4 или новее. На старой среде для Parakeet модель не падала явно, а просто плохо транскрибировала. Исправление было обычным — обновить и заново зафиксировать бинарные файлы для всех платформ. Но вывод универсален: «запускается» и «работает правильно» — разные тесты, и важен второй.
Потоки дают сбои, поэтому старый путь остался. Порт может быть занят, файл модели отсутствовать, сервер — упасть во время записи. Если постоянный поток не стартует, предпросмотр автоматически возвращается к буферизованным фрагментам: медленнее, но не пусто. Offline-модели (Parakeet, Whisper) используют их по замыслу; каждая модель объявляет среду online или offline, а приложение выбирает нужный путь.
Для промежуточных результатов понадобился другой рендеринг. Фрагментный режим дописывает текст, а потоковая гипотеза пересматривается, поэтому интерфейс заменяет весь предпросмотр. Если дописывать изменяемую гипотезу, появляются заикающиеся повторы — краткое описание реальной UX-ошибки, исправленной в начале.
Фиксация потока: вместо двух проходов один
Первая версия считала поток только предпросмотром: после диктовки приложение заново декодировало всю запись и вставляло новый результат. Это было безопасно — финальный проход видел полный контекст, — но каждая диктовка требовала двух декодирований и ожидания второго мнения, почти всегда совпадавшего с уже стабилизированным текстом.
В той же версии поток стал источником истины. Диктовка идёт по постоянному соединению независимо от окна предпросмотра, а при остановке приложение завершает хвост модели и сразу фиксирует потоковый текст — без второго декодирования. Финальная задержка сокращается до одного завершения, а нагрузка CPU на диктовку — примерно вдвое.
Страховка превратилась в резервный путь. Завершение отслеживает обрезание и продлевает срок, пока приходят результаты. При сбое — разрыве связи или урезанном ответе — приложение отбрасывает поток и классически транскрибирует полную запись после её завершения. Быстрый путь используется только тогда, когда он также корректен.
Производительность и ресурсы
- Модели: Nemotron Speech Streaming EN 0.6B (632MB) и Nemotron 3.5 ASR Streaming 0.6B (650MB, 15 готовых языков, автоопределение) — ONNX INT8, однократная загрузка и локальный кеш.
- Среда: sherpa-onnx 1.13.4, автономный нативный бинарный файл. Python, PyTorch и CUDA не нужны.
- Оборудование: поток в реальном времени на CPU современного ноутбука; Apple Silicon и новые x86 уверенно успевают за речью.
- Ощущение: промежуточный текст отстаёт от голоса намного меньше секунды; при остановке один финальный проход фиксирует транскрипт без повторного декодирования.
Этот путь не обращается к Интернету. Приложение соединяется с сервером по 127.0.0.1 (в Windows отдельное правило брандмауэра также закрывает порт для сети), модели находятся в локальном кеше, а аудио не покидает устройство — та же защита, что и во всей нашей локальной системе транскрибации.
Честные ограничения
- Поток обменивает немного точности на мгновенность. ~6.9% в потоке против 5.91% у лучшей английской пакетной модели NVIDIA на тех же тестах. Теперь финальный текст берётся из потока, поэтому это реальный компромисс. Если важен только итог, offline-модель Parakeet остаётся точнее.
- Языков меньше, чем у Whisper. В многоязычной модели 15 готовых языков против 99 у Whisper. Потока для китайского или тайского пока нет.
- Промежуточный текст меняется. Гипотеза пересматривается с контекстом. Мы считаем видимую стабилизацию полезной; если она отвлекает, предпросмотр можно выключить, а диктовка работает как прежде.
- Это ещё 650MB на диске если offline-модель уже установлена — цена второго движка, настроенного под другую задачу.
Выбор модели в OpenWhispr
| Что нужно | Модель |
|---|---|
| Живой английский предпросмотр при диктовке | Nemotron Speech Streaming EN 0.6B |
| Живой предпросмотр на испанском, японском, арабском, хинди… | Nemotron 3.5 ASR Streaming 0.6B |
| Максимальная точность английского, живой текст не нужен | Parakeet Unified EN 0.6B |
| Язык за пределами набора NVIDIA | Whisper (turbo или large) |
Все модели доступны в выпадающем списке настроек; полный каталог с размерами и компромиссами находится на странице моделей. OpenWhispr бесплатен, имеет открытый код и доступен для macOS, Windows и Linux.
Частые вопросы
Что такое потоковое распознавание речи?
Потоковое, или online, распознавание транскрибирует аудио прямо во время речи и выдаёт промежуточные результаты в пределах заданной задержки — обычно от 80 миллисекунд до примерно одной секунды. Пакетные, или offline, модели вроде Whisper ждут окончания записи и обрабатывают её целиком. Благодаря потоковой обработке работают живые субтитры, голосовые агенты и предпросмотр диктовки по мере произнесения.
Можно ли запустить потоковое распознавание локально без GPU?
Да. Потоковые модели Nemotron от NVIDIA содержат 600M параметров, поставляются как квантованные INT8-файлы ONNX размером около 650MB и работают в реальном времени на современном CPU через sherpa-onnx — нативный бинарный файл без Python и PyTorch. OpenWhispr поставляет такую конфигурацию для macOS, Windows и Linux.
Что такое потоковый ASR с кешированием?
Это архитектура NVIDIA cache-aware FastConformer, в которой модель сохраняет внутреннее состояние энкодера между фрагментами аудио. Каждый новый фрагмент обрабатывается один раз с использованием уже сохранённого контекста, вместо повторного кодирования перекрывающихся окон. Поэтому потоковая обработка с малой задержкой достаточно экономична для CPU ноутбука.
Почему текст предпросмотра меняется после появления?
Потоковая модель пересматривает гипотезу при поступлении нового аудио: последующий контекст помогает определить границу слова или различить омофоны, поэтому промежуточный результат заменяется на месте. Это штатное поведение. При остановке OpenWhispr завершает обработку хвоста модели и сохраняет стабилизированный текст как транскрипт. Если завершение прервано или результат обрезан, приложение автоматически заново декодирует полную запись — нестабильный поток никогда не превращается во вставляемый текст.
Потоковая транскрибация менее точна, чем пакетная?
Немного: потоковая модель не слышит будущее аудио. Английская потоковая модель Nemotron показывает в среднем 6.93% ошибок в словах при фрагментах 1.12 секунды на наборах Open ASR Leaderboard. Это близко к пакетным моделям, но хуже 5.91% у лучшей английской пакетной модели NVIDIA. Небольшой разрыв — плата за живой текст и мгновенный транскрипт при остановке; если важнее максимальная точность, выберите offline-модель Parakeet.
Какие языки поддерживает потоковый режим OpenWhispr?
Доступны две модели Nemotron: только английская и Nemotron 3.5 с 15 готовыми к транскрибации языками (английский, испанский, французский, итальянский, португальский, нидерландский, немецкий, турецкий, русский, арабский, хинди, японский, корейский, вьетнамский и украинский) и автоопределением языка. Offline-модели Parakeet и Whisper охватывают больше языков, но строят предпросмотр из буферизованных фрагментов, а не живого потока.