Как запустить голосовой чат с локальной LLM: realtime в llama.cpp
Как запустить голосовой чат с локальной LLM: realtime в llama.cpp

Как запустить голосовой чат с локальной LLM: realtime в llama.cpp

Голосовой чат с локальной моделью теперь можно поднять на одном сервере: релиз 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 собирает разговор и транскрипцию в одном сервере.

Что это даёт на практике:

  1. Голосовой ассистент без облака. Речь не уходит на сторонние API — важно, если данные чувствительные или нужен офлайн.
  2. Транскрипция на своём железе. Записи встреч и голосовые заметки обрабатываются локально, без оплаты за минуты.
  3. Один порт вместо трёх сервисов. Меньше точек отказа и меньше конфигов: клиент, сервер и модель в одном контуре.

Если вам нужен именно агент с внешними действиями, а не голосовой чат, это другая задача — там сначала решают доступ к сети, см. как дать ИИ-агенту доступ к интернету.

Как начать: шаги

Прямой путь — собрать или скачать свежий билд llama.cpp не старше b11946 и поднять сервер, затем подключить realtime-клиент из примеров.

  1. Возьмите релиз b11946 или новее — realtime появился именно в нём.
  2. Соберите llama-server под своё железо или скачайте готовый бинарник из релизов.
  3. Запустите сервер с нужной моделью. Realtime-клиент из примеров по умолчанию ждёт сервер на порту 9931 — либо оставьте этот порт, либо поправьте адрес в клиенте.
  4. Подключите клиент к /v1/realtime и проверьте разговор и транскрипцию по отдельности.
  5. Если планируете несколько одновременных сессий — обновитесь обязательно: до фикса сэмплинга выводы сессий на одном контексте смешивались.

Пример с числами: один сервер, один порт 9931, эндпоинт /v1/realtime, две функции — conversation и transcription. Этого достаточно, чтобы собрать голосового бота для приёма заметок, не поднимая отдельный ASR-сервис.

Что может пойти не так:

  • Старый билд. На релизах до b11946 эндпоинта просто нет — проверьте тег.
  • Порт. Клиент по умолчанию смотрит на 9931; если сервер поднят на другом порту, разговор не стартует.
  • Параллельные сессии на одном контексте. На старых сборках ответы перемешиваются; на b11946 исправлено, но смешивать сессии на одном слоте всё равно стоит осознанно.
  • Память под модель. Голосовой сценарий не отменяет требований к VRAM — прикиньте бюджет заранее по материалу сколько VRAM нужно для локальной LLM.
Больше разборов по ИИ и автоматизации — в канале @il_chum

Чем это отличается от облачных realtime-API

Главное отличие — контроль и отсутствие оплаты за минуты: модель и речь остаются на вашем железе. Облачные realtime-сервисы дают готовое качество распознавания и низкую задержку без настройки, но требуют отправки аудио наружу и платятся по тарифу.

Компромисс, который выбирают чаще всего: голосовой слой локально, а тяжёлые задачи — в облако. Логика выбора между локальным и облачным инференсом подробно разобрана в локальная LLM или облачная: как выбрать по бенчмаркам.

Короткое правило: чувствительный звук и офлайн — локально; максимальное качество распознавания и минимум настройки — облако. Для голосового чата на своём сервере b11946 закрывает базовый сценарий без внешних зависимостей.

Частые вопросы

С какого релиза llama.cpp есть realtime? С b11946: в нём добавили realtime-разговор и транскрипцию на /v1/realtime.

На каком порту работает realtime-клиент? В примерах он по умолчанию ходит на порт сервера 9931.

Почему смешивались ответы параллельных сессий? Сэмплинг на старте следующего шага читал логиты последнего декодировавшего слота. В b11946 сэмплинг выполняется сразу после декода своей сессии.


Больше разборов по ИИ и автоматизации — в канале: @il_chum