Голосовой чат с локальной моделью теперь можно поднять на одном сервере: релиз llama.cpp b11946 добавил в сервер realtime-разговор и транскрипцию по эндпоинту /v1/realtime. Это снимает необходимость склеивать распознавание речи, LLM и синтез из трёх разных сервисов — сервер берёт realtime-сессию на себя.
Что именно добавили в llama.cpp b11946
В сервере llama.cpp появился эндпоинт /v1/realtime, который обслуживает разговор в реальном времени и транскрипцию. Это не отдельная модель и не новый формат весов — расширение уже существующего llama-server, то есть тот же бинарник, что вы запускаете для обычного HTTP-доступа к локальной LLM.
Ключевые детали из релиза:
- Realtime-клиент в примерах по умолчанию ходит на порт сервера 9931.
- Сэмплинг ответов realtime-сессии выполняется сразу после декода этой же сессии. Раньше при нескольких одновременных сессиях на одном контексте сэмплинг на старте следующего шага читал логиты того слота, который декодировал последним, — выводы параллельных сессий перемешивались. Теперь этого нет.
- В коммите указан
Assisted-by: Claude Opus 5.5— часть кода писалась с помощью ИИ-ассистента, но это не влияет на то, как вы запускаете сервер.
Практический вывод: если вы уже держите локальную модель через llama.cpp, голосовой слой добавляется к тому же процессу, а не к отдельному стеку.
Зачем это нужно: три задачи, которые раньше требовали сборки
Голосовой интерфейс к локальной LLM раньше означал минимум три компонента: распознавание речи, сам инференс и синтез. Realtime-эндпоинт в llama.cpp собирает разговор и транскрипцию в одном сервере.
Что это даёт на практике:
- Голосовой ассистент без облака. Речь не уходит на сторонние API — важно, если данные чувствительные или нужен офлайн.
- Транскрипция на своём железе. Записи встреч и голосовые заметки обрабатываются локально, без оплаты за минуты.
- Один порт вместо трёх сервисов. Меньше точек отказа и меньше конфигов: клиент, сервер и модель в одном контуре.
Если вам нужен именно агент с внешними действиями, а не голосовой чат, это другая задача — там сначала решают доступ к сети, см. как дать ИИ-агенту доступ к интернету.
Как начать: шаги
Прямой путь — собрать или скачать свежий билд llama.cpp не старше b11946 и поднять сервер, затем подключить realtime-клиент из примеров.
- Возьмите релиз b11946 или новее — realtime появился именно в нём.
- Соберите
llama-serverпод своё железо или скачайте готовый бинарник из релизов. - Запустите сервер с нужной моделью. Realtime-клиент из примеров по умолчанию ждёт сервер на порту 9931 — либо оставьте этот порт, либо поправьте адрес в клиенте.
- Подключите клиент к
/v1/realtimeи проверьте разговор и транскрипцию по отдельности. - Если планируете несколько одновременных сессий — обновитесь обязательно: до фикса сэмплинга выводы сессий на одном контексте смешивались.
Пример с числами: один сервер, один порт 9931, эндпоинт /v1/realtime, две функции — conversation и transcription. Этого достаточно, чтобы собрать голосового бота для приёма заметок, не поднимая отдельный ASR-сервис.
Что может пойти не так:
- Старый билд. На релизах до b11946 эндпоинта просто нет — проверьте тег.
- Порт. Клиент по умолчанию смотрит на 9931; если сервер поднят на другом порту, разговор не стартует.
- Параллельные сессии на одном контексте. На старых сборках ответы перемешиваются; на b11946 исправлено, но смешивать сессии на одном слоте всё равно стоит осознанно.
- Память под модель. Голосовой сценарий не отменяет требований к VRAM — прикиньте бюджет заранее по материалу сколько VRAM нужно для локальной LLM.
Чем это отличается от облачных realtime-API
Главное отличие — контроль и отсутствие оплаты за минуты: модель и речь остаются на вашем железе. Облачные realtime-сервисы дают готовое качество распознавания и низкую задержку без настройки, но требуют отправки аудио наружу и платятся по тарифу.
Компромисс, который выбирают чаще всего: голосовой слой локально, а тяжёлые задачи — в облако. Логика выбора между локальным и облачным инференсом подробно разобрана в локальная LLM или облачная: как выбрать по бенчмаркам.
Короткое правило: чувствительный звук и офлайн — локально; максимальное качество распознавания и минимум настройки — облако. Для голосового чата на своём сервере b11946 закрывает базовый сценарий без внешних зависимостей.
Частые вопросы
С какого релиза llama.cpp есть realtime? С b11946: в нём добавили realtime-разговор и транскрипцию на /v1/realtime.
На каком порту работает realtime-клиент? В примерах он по умолчанию ходит на порт сервера 9931.
Почему смешивались ответы параллельных сессий? Сэмплинг на старте следующего шага читал логиты последнего декодировавшего слота. В b11946 сэмплинг выполняется сразу после декода своей сессии.
Больше разборов по ИИ и автоматизации — в канале: @il_chum