Course
Системы автоматического распознавания речи заметно продвинулись за последние годы. Модели speech-to-text, которым раньше требовались мощные GPU и которые давали нестабильные результаты, теперь обеспечивают точные транскрибации на обычных компьютерах.
Одновременно с этим модели стали компактнее, инференс на CPU стал быстрее, а многоязычная поддержка расширилась. В результате пользователи получают более удачное сочетание качества транскрибации, скорости, доступности и приватности.
Хороший пример этого прогресса — Microsoft VibeVoice-ASR-BitNet.
Оптимизированный рантайм VibeASR.cpp позволяет запускать многоязычное speech-to-text локально на компьютерах под управлением Windows, Linux или macOS без выделенного GPU и без отправки записей в облако.
В этом руководстве вы узнаете, как установить и собрать VibeASR.cpp, скачать квантизированную модель, транскрибировать аудиофайлы из командной строки, запустить постоянный потоковый сервер и использовать веб-интерфейс Gradio для загрузки или записи речи.
Что такое Microsoft VibeASR.cpp?
VibeASR.cpp — официальный C++-рантайм для инференса от Microsoft для VibeVoice-ASR-BitNet — сжатой многоязычной модели распознавания речи, рассчитанной на эффективный локальный инференс на CPU.
VibeASR.cpp — это не отдельная модель речи, а оптимизированный движок для её запуска, обеспечивающий транскрибацию в реальном времени без выделенного GPU или облачного сервиса распознавания.
Благодаря этому решение подходит для ноутбуков, настольных ПК, edge-устройств и других систем с ограниченными вычислительными ресурсами.

Источник: microsoft/VibeVoice-ASR-BitNet
Чтобы сделать развёртывание на CPU практичным, Microsoft заменила языковую модель Qwen2.5-7B, использовавшуюся в исходной архитектуре VibeVoice-ASR, на гораздо более компактную Qwen2.5-1.5B.
Также к двум основным компонентам применены разные методы квантизации:
I8_Sдля аудиокодера VAEI2_Sдля языковой модели, с эмбеддингами повышенной точности
Эти оптимизации уменьшают общий размер модели приблизительно с 4,62 ГБ до 1,58 ГБ, что делает её реалистичной для запуска на ноутбуках и настольных ПК.
Несмотря на значительное уменьшение размера, сжатая модель демонстрирует лишь относительно небольшой рост на 1–4 процентных пункта в показателе ошибок по словам по сравнению с более крупной архитектурой.
VibeASR.cpp использует фреймворк ggml, кастомные инструкции CPU и слияние операторов для ускорения инференса.
Согласно бенчмаркам Microsoft, он работает в 1,6–2,3 раза быстрее, чем Whisper.cpp при сопоставимых размерах моделей и может достигать скорости выше реального времени на поддерживаемых CPU при достаточном количестве потоков.
В CPU-бенчмарках Microsoft модель достигала RTF 0,63 на четырёх потоках и 0,42 на восьми потоках, что соответствует примерно 1,59× и 2,38× скорости реального времени.
Сообщаемые значения WER включают 8,25% на MLC English, 21,36% на аудио с гарнитуры AMI, 25,87% на аудио с удалённого микрофона AMI и 2,41% на LibriSpeech clean, что демонстрирует удачный баланс точности, размера модели и производительности на CPU.
1. Установите необходимые инструменты сборки
VibeASR.cpp полностью работает на CPU, поэтому выделенный GPU не требуется. Вам нужен лишь поддерживаемый компьютер с Windows, Linux или macOS, Python 3.9 или новее, Git, компилятор C++ и около 4 ГБ свободного дискового пространства для исходников, файлов сборки и модели.
Для сборки также требуются CMake и Ninja.
В Windows самый простой вариант — использовать w64devkit, который предоставляет компилятор и инструменты сборки в преднастроенном терминале.
В Linux необходимые пакеты можно установить напрямую через менеджер пакетов системы.
Windows
Скачайте последнюю x64 .exe с страницы релизов w64devkit.

Загруженный файл — самораспаковывающийся архив. Запустите его и распакуйте папку куда-нибудь в простое место, например:
C:\w64devkit
Затем откройте:
C:\w64devkit\w64devkit.exe
Откроется готовый к работе терминал с GCC, CMake, Make и Ninja. Используйте его для последующих шагов в Windows без ручной настройки переменных окружения.
Linux
В Ubuntu, Debian и родственных дистрибутивах Linux необходимые компилятор и инструменты сборки можно установить одной командой:
sudo apt update
sudo apt install build-essential cmake ninja-build git python3 python3-venv
Это установит компилятор GCC, CMake, Ninja, Git, Python и пакет для создания виртуального окружения Python.
macOS
В macOS установите инструменты разработки командной строки от Apple:
xcode-select --install
Также понадобятся Git, Python 3.9 или новее, CMake и Ninja. Проще всего установить их через Homebrew:
brew install git python cmake ninja
2. Клонируйте VibeASR.cpp и настройте окружение Python
Дальнейшие шаги по настройке одинаковы для Windows, Linux и macOS.
Единственное отличие — команда для активации виртуального окружения Python в зависимости от ОС.
Откройте терминал, перейдите в папку, где хотите разместить проект, и клонируйте репозиторий VibeASR.cpp:
git clone --recursive https://github.com/microsoft/VibeASR.cpp.git
cd VibeASR.cpp

Опция --recursive также скачивает необходимый подмодуль llama.cpp. Без него часть файлов, нужных для сборки рантайма, будет отсутствовать.
Создайте виртуальное окружение Python в папке проекта.
python -m venv .venv
Активируйте его командой для вашей ОС.
Windows (терминал w64devkit):
. .venv/Scripts/activate
Linux и macOS:
source .venv/bin/activate
После активации в терминале перед приглашением должна появиться метка (.venv). Проверьте доступность Python:
python --version
Обновите pip и установите зависимости проекта:
python -m pip install --upgrade pip
pip install -r requirements.txt
В зависимости входят пакеты Python, используемые скриптом настройки, для загрузки модели и для локального веб-интерфейса Gradio.
3. Соберите VibeASR.cpp и скачайте модель
VibeASR.cpp включает скрипт, который выполняет сборку C++ и загрузку модели.
Он компилирует консольные и потоковые исполняемые файлы, устанавливает необходимый пакет GGUF и скачивает предварительно квантизированные файлы модели в каталог проекта.
Перед запуском скрипта убедитесь, что виртуальное окружение Python активно.
В Linux и macOS выполните:
python setup_env.py
В Windows запустите следующую команду в терминале w64devkit:
CMAKE_GENERATOR=Ninja python setup_env.py
Установка CMAKE_GENERATOR=Ninja гарантирует использование CMake вместе с Ninja вместо попытки задействовать Microsoft Visual C++, который недоступен в среде w64devkit.
Скрипт настройки выполнит:
- Установку необходимого Python-пакета
gguf. - Конфигурирование и компиляцию VibeASR.cpp.
- Сборку исполняемых файлов для инференса и потоковой обработки.
- Загрузку предварительно квантизированных файлов модели VibeASR.
- Сохранение загруженных моделей в
models/vibeasr.
По завершении основной исполняемый файл инференса будет доступен по следующему пути.
Windows:
build/bin/asr_infer.exe
Linux и macOS:
build/bin/asr_infer
Проверьте успешность сборки, выведя доступные параметры командной строки.
Windows:
./build/bin/asr_infer.exe --help
Linux и macOS:
./build/bin/asr_infer --help

4. Проверьте транскрибацию файлов и потоковую обработку
Теперь, когда рантайм и модель готовы, можно протестировать два метода транскрибации.
Стандартный исполняемый файл обрабатывает один аудиофайл и возвращает готовую транскрибацию, а потоковый сервер удерживает модель в памяти и показывает прогресс транскрибации по мере генерации токенов.
Сначала скачайте короткий образец записи из папки проекта VibeASR.cpp:
curl -L "https://homepages.inf.ed.ac.uk/htang2/notes/speech-samples/103-1240-0000.wav" -o recording.wav
Аудиофайл будет сохранён как recording.wav в текущем каталоге проекта.
Транскрибируйте аудиофайл
Стандартная команда инференса загружает аудиокодер и языковую модель, обрабатывает запись и выводит готовую транскрибацию.
В Windows выполните:
./build/bin/asr_infer.exe \
--vae-model models/vibeasr/vibeasr-vae-encoder-i8_s.gguf \
--lm-model models/vibeasr/vibeasr-lm-i2_s-embed-q6_k.gguf \
--audio recording.wav \
-t 6 \
--greedy
В Linux и macOS используйте ту же команду без расширения .exe:
./build/bin/asr_infer \
--vae-model models/vibeasr/vibeasr-vae-encoder-i8_s.gguf \
--lm-model models/vibeasr/vibeasr-lm-i2_s-embed-q6_k.gguf \
--audio recording.wav \
-t 6 \
--greedy

Опция -t 6 назначает инференсу шесть потоков CPU. Вы можете увеличить или уменьшить это значение в зависимости от вашего процессора.
Опция --greedy выбирает на каждом шаге декодирования наиболее вероятный токен, обеспечивая стабильные результаты транскрибации.
На моём компьютере запись длительностью 14,085 секунды обрабатывалась примерно 13,7 секунды:
RTF: 0.9726
Speed: approximately 1.03× real time
Коэффициент реального времени (RTF) сравнивает время обработки с длительностью аудио.
RTF ниже 1.0 означает, что запись была транскрибирована быстрее её фактической продолжительности. Производительность зависит от процессора, операционной системы, числа потоков и длительности записи.
Проверьте потоковую обработку токен за токеном
VibeASR.cpp также включает постоянный потоковый сервер. Он загружает два файла модели один раз и остаётся активным, позволяя отправлять несколько записей без повторного запуска и перезагрузки модели каждый раз.
Вывод работает аналогично потоковой генерации в больших языковых моделях.
Вместо ожидания завершения всей транскрибации вы начинаете видеть текст по мере генерации каждого токена декодером.
Часть токенов может соответствовать целым словам, другие — частям слов или пунктуации, но они отображаются постепенно до завершения транскрибации.
В Windows запустите сервер командой:
./build/bin/asr_stream_server.exe \
--vae-model models/vibeasr/vibeasr-vae-encoder-i8_s.gguf \
--lm-model models/vibeasr/vibeasr-lm-i2_s-embed-q6_k.gguf \
-t 6 \
--greedy
В Linux и macOS выполните:
./build/bin/asr_stream_server \
--vae-model models/vibeasr/vibeasr-vae-encoder-i8_s.gguf \
--lm-model models/vibeasr/vibeasr-lm-i2_s-embed-q6_k.gguf \
-t 6 \
--greedy

Подождите, пока сервер загрузит модели и выведет:
---READY---
Введите путь к аудиофайлу и нажмите Enter:
recording.wav
Транскрибация начнёт появляться токен за токеном. После полной обработки записи сервер выведет:
---END---

Затем можно ввести путь к другому аудио без перезагрузки моделей. Чтобы остановить сервер, введите:
exit
Такой постоянный режим особенно полезен при транскрибации нескольких записей или при подключении VibeASR.cpp к другому приложению, которому нужен прогрессивный вывод транскрибации.
5. Запустите и протестируйте веб-интерфейс
VibeASR.cpp включает локальный веб-интерфейс Gradio для загрузки аудиофайлов или записи речи с микрофона. Процесс одинаков для Windows, Linux и macOS, хотя в Windows исполняемые файлы имеют расширение .exe.
Зависимости для интерфейса, включая Gradio, SoundFile и NumPy, уже установлены через requirements.txt.
Сначала убедитесь, что виртуальное окружение активно.
Windows (терминал w64devkit):
. .venv/Scripts/activate
Linux и macOS:
source .venv/bin/activate
В Windows запустите интерфейс так:
python demo/gradio_asr_demo.py \
--port 7860 \
--bin build/bin/asr_infer.exe \
--server-bin build/bin/asr_stream_server.exe
В Linux и macOS пути к исполняемым файлам по умолчанию определяются автоматически:
python demo/gradio_asr_demo.py --port 7860
Пути к моделям уже настроены внутри скрипта Gradio для всех ОС, поэтому указывать их в команде не нужно.
Скрипт также поддерживает отдельные пути для стандартного исполняемого файла инференса и потокового сервера.
Откройте в браузере следующий адрес:
http://127.0.0.1:7860
Изучите интерфейс
Интерфейс позволяет:
- Выбрать модель для CPU.
- Задать число потоков CPU.
- Переключаться между режимами Online и Offline.
- Включать жадное декодирование или настраивать Temperature и Top-p.
- Загружать аудиофайл или записывать напрямую с микрофона.
- Добавлять необязательные «горячие слова» (имена, термины).
- Просматривать транскрибацию, длительность аудио и коэффициент RTF.
Здесь Online-режим не означает отправку вашего аудио в онлайн-сервис.
Он прогрессивно обрабатывает длинные записи по блокам и использует asr_stream_server при наличии.
Offline-режим обрабатывает весь аудиофайл целиком перед отображением результата.

Проверьте короткую запись
Для первого теста я записал короткое предложение через микрофон и выбрал режим Offline с четырьмя потоками CPU.

RTF 0,9584 означает, что на обработку одной секунды аудио модели требовалось около 0,96 секунды.
Это примерно 1,04× реального времени, поэтому транскрибация завершилась чуть быстрее фактической длительности записи.
Проверьте длинную запись
Я также протестировал интерфейс на более длинной записи примерно с 109,7 секундами речи. Модель успешно выдала полную транскрибацию и сообщила:
RTF: 0.5305
Audio: 109.7s

Это означает, что на обработку одной секунды аудио модели требовалось примерно 0,53 секунды. Вся запись транскрибировалась около 58 секунд, что соответствует скорости примерно 1,88× реального времени.
Заключение
Меня впечатлило, насколько практичным стало локальное распознавание речи.
Даже на старом CPU VibeASR.cpp способен транскрибировать аудио почти в реальном времени или быстрее — без необходимости в GPU, большом объёме памяти или значительном дисковом пространстве.
Скомпилированный исполняемый файл можно интегрировать в приложение на Python, обернуть в конечную точку FastAPI или использовать как движок транскрибации в более крупном локальном инструменте.
Главный параметр, на который стоит обратить внимание, — количество потоков CPU, выделенных процессу.
Также нужно выбрать между online-режимом, который отображает транскрипт по мере обработки, и offline-режимом, который возвращает полную транскрибацию после завершения.
Настройка могла бы быть ещё проще, особенно в Windows, Linux и macOS.
Поскольку проект активно развивается, ожидаю, что установка и поддержка готовых бинарников со временем улучшатся. Когда появится стабильный автономный бинарный файл, я смогу использовать эту модель во многих локальных проектах speech-to-text.
Также рекомендую ознакомиться с нашим руководством по GPT Live Transcribe API.
FAQs
Какие языки на самом деле поддерживает модель VibeASR?
Модель VibeVoice-ASR нативно поддерживает более 50 языков. Сюда входят английский, китайский, французский, итальянский, корейский, португальский и вьетнамский. Модель не требует явной установки языка и автоматически обрабатывает «code-switching» (когда говорящий естественным образом смешивает несколько языков в одном предложении).
Нужно ли конвертировать мои MP3 или видеофайлы перед транскрибацией?
Если вы используете напрямую консольный исполняемый файл asr_infer, он ожидает файлы .wav (обычно 16 кГц, 16-бит, моно). Если у вас аудио в других форматах — MP3, M4A или FLAC, — их нужно предварительно конвертировать в WAV с помощью, например, FFmpeg, прежде чем передавать в CLI.
Может ли модель определять разных спикеров или выдавать пометки времени на уровне слов?
Базовая архитектура VibeVoice-ASR специально разработана для генерации структурированных выходных данных, содержащих «Кто» (диаризация спикеров), «Когда» (метки времени) и «Что» (содержание) за один проход. Однако лёгкий C++-исполняемый файл инференса (VibeASR.cpp) в настоящий момент ориентирован на прогрессивную транскрибацию «сырого» текста. Чтобы получить полный структурированный JSON-вывод с идентификаторами говорящих и метками времени, обычно нужно запускать модель через Python-библиотеку transformers.