Техническое

Потоковое распознавание речи на CPU: NVIDIA Nemotron в настольном приложении

Как OpenWhispr показывает текст прямо во время речи — модель с кешем через локальный WebSocket, без GPU и облака — и как мы добились надёжной работы.

OpenWhispr

OpenWhispr

Инженерное дело

18 июля 2026 г.
Оглавление

Потоковое распознавание транскрибирует аудио прямо во время речи, не дожидаясь конца записи. Начиная с версии 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

Microphone16kHz PCM via AudioWorklet
Local WebSocket127.0.0.1, float32 frames
Nemotron 0.6Bsherpa-onnx, INT8, CPU
Partial resultsJSON per chunk
Live previewText replaced in place
  • 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
Язык за пределами набора NVIDIAWhisper (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 охватывают больше языков, но строят предпросмотр из буферизованных фрагментов, а не живого потока.