Как подключить GigaAM и transcribe.cpp к Vocalinux через локальный API
Это практический разбор локального распознавания русской речи на Linux: Vocalinux записывает голос и вставляет текст, transcribe.cpp запускает модель GigaAM v3 E2E-RNNT размером 261 МБ, а небольшой HTTP-мост соединяет их без облака и модификации установленного приложения. На ноутбуке с Intel Iris Xe тестовый фрагмент длиной 11 секунд обработался за 1,22 секунды.
1. Handy не заработал, но после него осталась модель на 261 МБ
История началась с любопытства к Handy. В его списке оказалось заметно больше моделей распознавания речи, чем в используемом до этого приложении. Сам Debian-пакет под Linux нормально не заработал и был удалён, зато в кеше Hugging Face сохранился файл gigaam-v3-e2e-rnnt-Q8_0.gguf.
Модель занимала всего 261 МБ, была специально обучена для русского языка и уже показывала хорошую скорость в Handy. Удалять такой артефакт было жалко. Задача для Codex сформулировалась почти бытовым языком: подключить найденную модель к уже настроенному Vocalinux и не превратить последующие обновления приложения в ручное слияние патчей.
Пример хорошо ложится в раздел «Эксперименты с ИИ»: вместо покупки нового сервиса используются имеющееся железо, открытая модель и небольшой слой интеграции. Все вычисления остаются на одном компьютере, поэтому за распознавание нет платы по минутам и запись не отправляется внешнему провайдеру.
2. Одинаковое расширение GGUF не означает совместимость
Первый очевидный вариант — положить файл в каталог моделей Vocalinux и выбрать его в настройках Whisper. Он не работает. GGUF описывает хранение тензоров и метаданных, но не превращает разные нейросетевые архитектуры в одну. whisper.cpp знает устройство Whisper, а GigaAM v3 построена на Conformer и использует декодер CTC или RNNT.
Vocalinux умеет работать с Whisper, Faster-Whisper, Vosk, Parakeet и несколькими другими движками. GigaAM среди них нет. Зато модель официально поддерживает transcribe.cpp — MIT-проект на C/C++, в котором заявлены 16 семейств и более 60 вариантов моделей, а также ускорение через Vulkan, CUDA и Metal.
.gguf. Для GigaAM нужен transcribe.cpp; Vocalinux в этой связке остаётся интерфейсом диктовки.3. Почему выбран именно GigaAM v3 E2E-RNNT Q8_0
У GigaAM v3 есть четыре основные конфигурации. Обычные CTC и RNNT дают нормализованный текст, а варианты E2E сразу восстанавливают регистр и пунктуацию. Для голосового ввода это важно: после распознавания не приходится отдельной моделью расставлять точки и заглавные буквы.
| Вариант | Размер Q8_0 | WER FLEURS RU | Особенность |
|---|---|---|---|
| E2E-RNNT | 261 МБ | 5,36% | Регистр и пунктуация |
| E2E-CTC | 260 МБ | 5,50% | Регистр и пунктуация |
| RNNT | 260 МБ | 8,08% | Нормализованный текст |
| CTC | 259 МБ | 8,40% | Нормализованный текст |
По таблице разработчиков transcribe.cpp, квантованная E2E-RNNT Q8_0 показывает WER 5,36%, а полноразмерная F32 — 5,35%. Разница в одну сотую процентного пункта делает компактный вариант разумным для ноутбука. У модели около 180 млн параметров, словарь на 1024 токена и Conformer-энкодер из 16 слоёв.
4. Локальный Remote API — это не облачный сервис
Встраивать новый backend непосредственно в код Vocalinux оказалось необязательно. У приложения уже есть режим Remote API: оно записывает монофонический PCM 16 бит с частотой 16 кГц, собирает WAV в памяти и отправляет файл запросом POST /v1/audio/transcriptions. Ответ ожидается в OpenAI-совместимом виде {"text":"распознанная фраза"}.
Vocalinux
? 127.0.0.1:8765
? Python-сервер
? libtranscribe.so
? GigaAM v3 GGUF
? Vulkan / Intel Iris Xe
Слово remote здесь немного сбивает с толку. Адрес 127.0.0.1 доступен только на этом компьютере: аудио не идёт в интернет и не покидает ноутбук. Vocalinux по-прежнему отвечает за горячую клавишу, VAD, нарезку речи и вставку результата в активное окно. Сервер выполняет одну функцию — принимает WAV и возвращает текст.
5. Сборка на Debian потребовала Vulkan, OpenBLAS и SPIR-V
transcribe.cpp был собран в режиме Release как динамическая библиотека с Vulkan. Для Debian понадобились компилятор C++, CMake, Vulkan development files, glslc и libopenblas-dev. Кроме перечисленного в основной инструкции, на этой системе пришлось установить spirv-headers: без заголовков SPIR-V сборка шейдеров останавливалась.
cmake -S . -B build-vulkan \
-DCMAKE_BUILD_TYPE=Release \
-DTRANSCRIBE_VULKAN=ON \
-DTRANSCRIBE_BUILD_SHARED=ON
cmake --build build-vulkan --parallel
OpenBLAS ускоряет ту часть декодера, которая остаётся на процессоре: документация проекта говорит примерно о 10–15-кратном ускорении host decoder. Vulkan переносит тяжёлые операции модели на графику. В данном случае движок корректно обнаружил встроенную Intel Iris Xe — отдельная видеокарта NVIDIA для локальной диктовки не потребовалась.
6. Реальный замер: почти 9 скоростей реального времени
Проверочный WAV длился 11 секунд и полностью обработался примерно за 1,2247 секунды. Это около 9x real-time: результат появляется гораздо быстрее длительности записи. В диагностике были видны 248,81 мс на загрузку, 13,78 мс на mel-преобразование, 922,18 мс на энкодер и 288,69 мс на декодер. Внутренние стадии частично перекрываются, поэтому складывать эти числа как обычный секундомер нельзя.
Технический smoke test был на английском аудио, хотя модель предназначена только для русского. Качество полученной фразы в этом тесте не оценивалось; проверялись загрузка GGUF, выполнение Vulkan и стабильный возврат результата. На реальной русской диктовке система субъективно оказалась примерно в три раза быстрее прежней и, похоже, точнее. Это пользовательское впечатление, а не лабораторное сравнение; воспроизводимый показатель здесь — 11 секунд аудио за 1,22 секунды.
7. Отдельный сервис переживёт обновления Vocalinux
Прямой патч recognition_manager.py выглядел бы аккуратнее на схеме, но создал бы собственный форк Vocalinux. После каждого обновления пришлось бы проверять конфликтующие изменения. Внешний адаптер использует публичный интерфейс программы, поэтому обновляются три независимые части: Vocalinux, transcribe.cpp и модель.
Мост запускается пользовательским сервисом systemd, слушает один порт 8765 и в рабочем состоянии занимает около 329 МБ памяти вместе с загруженной моделью. Путь к GGUF, библиотеке и Python bindings задаётся через environment-файл. Такой подход похож на идею из статьи про Ubuntu Workshop: чёткая граница между компонентами уменьшает последствия эксперимента и упрощает замену каждого элемента.
8. За 20 минут появился проект, полезный не только для GigaAM
Первоначально Codex попросили решить одну локальную задачу. Агент исследовал установленный скрипт Vocalinux, нашёл документацию Remote API, собрал transcribe.cpp, последовательно устранил ошибки зависимостей и проверил endpoint. Примерно через 20 минут приложение уже печатало текст, полученный от оставшейся после Handy модели.
Затем одноразовый сервер был превращён в публичный проект vocalinux-transcribe-cpp-bridge. Название намеренно не привязано к GigaAM: путь к модели и её идентификатор настраиваются, а transcribe.cpp поддерживает десятки вариантов. Совместимость конкретной модели всё равно надо проверять — у семейств различаются требования к аудио и декодированию. Сейчас гарантированно проверена связка GigaAM v3 E2E-RNNT Q8_0, Vocalinux и Intel Vulkan.
Код моста опубликован под MIT, а сама модель в репозиторий не включена. У каждого веса остаётся собственная лицензия и официальный источник загрузки. Получился характерный пример агентной разработки, как и в разборе восстановления старых программ AI-агентами: ценность агента проявляется не в генерации большого объёма кода, а в быстром соединении уже существующих компонентов и проверке результата на настоящем железе.
Как проверялось: сборка и замеры выполнены на рабочем ноутбуке; формат API, характеристики и ограничения модели сверены с официальной документацией Vocalinux, transcribe.cpp и GigaAM по ссылкам выше. Результаты скорости относятся к этой конфигурации и не являются гарантией для другого оборудования.