Перейти к основному содержимому

Голосовой режим

VibeOS поддерживает полноценное голосовое взаимодействие через CLI и платформы обмена сообщениями. Разговаривайте с агентом через микрофон, слушайте голосовые ответы и ведите живые голосовые беседы в голосовых каналах Discord.

Если вам нужно практическое руководство по настройке с рекомендуемыми конфигурациями и реальными сценариями использования, смотрите Использование голосового режима с VibeOS.

Предварительные требования​

Перед использованием голосовых функций убедитесь, что у вас есть:

  1. Установленный VibeOS — через скрипт установки (см. Установка)
  2. Настроенный LLM-провайдер — выполните vibeos model или укажите учётные данные предпочитаемого провайдера в ~/.vibeos/.env
  3. Работающая базовая настройка — выполните vibeos, чтобы убедиться, что агент отвечает на текст, прежде чем включать голос
подсказка

Директория ~/.vibeos/ и файл config.yaml по умолчанию создаются автоматически при первом запуске vibeos. Вам нужно только вручную создать ~/.vibeos/.env для API-ключей.

Nous Portal покрывает оба пункта

Платная подписка Nous Portal предоставляет LLM (шаг 2) и OpenAI TTS через Tool Gateway — отдельный ключ OpenAI не требуется. При чистой установке vibeos setup --portal настраивает всё сразу.

Обзор​

ФункцияПлатформаОписание
Интерактивный голосCLIНажмите Ctrl+B для записи, агент автоматически определяет тишину и отвечает
Автоответ голосомTelegram, DiscordАгент отправляет голосовое аудио вместе с текстовым ответом
Голосовой каналDiscordБот заходит в голосовой канал, слушает говорящих пользователей и отвечает голосом

Требования​

Пакеты Python​

# Голосовой режим CLI (микрофон + воспроизведение аудио)
cd ~/.vibeos/vibeos-agent && uv pip install -e ".[voice]"

# Обмен сообщениями Discord + Telegram (включает discord.py[voice] для поддержки голосовых каналов)
cd ~/.vibeos/vibeos-agent && uv pip install -e ".[messaging]"

# Премиум TTS (ElevenLabs)
cd ~/.vibeos/vibeos-agent && uv pip install -e ".[tts-premium]"

# Локальный TTS (NeuTTS, опционально)
python -m pip install -U neutts[all]

# Всё сразу
cd ~/.vibeos/vibeos-agent && uv pip install -e ".[all]"
ДополнениеПакетыТребуется для
voicesounddevice, numpyГолосовой режим CLI
messagingdiscord.py[voice], python-telegram-bot, aiohttpБоты Discord и Telegram
tts-premiumelevenlabsTTS-провайдер ElevenLabs

Опциональный локальный TTS-провайдер: установите neutts отдельно с помощью python -m pip install -U neutts[all]. При первом использовании модель загружается автоматически.

к сведению

discord.py[voice] автоматически устанавливает PyNaCl (для шифрования голоса) и привязки opus. Это необходимо для поддержки голосовых каналов Discord.

Системные зависимости​

# macOS
brew install portaudio ffmpeg opus
brew install espeak-ng # для NeuTTS

# Ubuntu/Debian
sudo apt install portaudio19-dev ffmpeg libopus0
sudo apt install espeak-ng # для NeuTTS
ЗависимостьНазначениеТребуется для
PortAudioВвод с микрофона и воспроизведение аудиоГолосовой режим CLI
ffmpegКонвертация аудиоформатов (MP3 → Opus, PCM → WAV)Все платформы
OpusАудиокодек DiscordГолосовые каналы Discord
espeak-ngФонемизаторЛокальный провайдер NeuTTS

API-ключи​

Добавьте в ~/.vibeos/.env:

# Преобразование речи в текст — локальному провайдеру НЕ НУЖЕН ключ
# pip install faster-whisper # Бесплатно, работает локально, рекомендуется
GROQ_API_KEY=ваш-ключ # Groq Whisper — быстро, бесплатный тариф (облако)
VOICE_TOOLS_OPENAI_KEY=ваш-ключ # OpenAI Whisper — платный (облако)

# Преобразование текста в речь (опционально — Edge TTS и NeuTTS работают без ключа)
ELEVENLABS_API_KEY=*** # ElevenLabs — премиум качество
# VOICE_TOOLS_OPENAI_KEY выше также включает OpenAI TTS
подсказка

Если установлен faster-whisper, голосовой режим работает без каких-либо API-ключей для STT. Модель (~150 МБ для base) загружается автоматически при первом использовании.


Голосовой режим CLI​

Голосовой режим доступен как в классическом CLI (vibeos chat), так и в TUI (vibeos --tui). Поведение идентично в обоих — те же слеш-команды, то же обнаружение тишины VAD, тот же потоковый TTS, тот же фильтр галлюцинаций. TUI дополнительно перенаправляет журналы сбойно-криминалистической информации в ~/.vibeos/logs/, чтобы сбои push-to-talk на экзотических аудиобэкендах можно было сообщить с полным стеком вызовов, а не бесследно исчезать.

Быстрый старт​

Запустите CLI и включите голосовой режим:

vibeos                # Запуск интерактивного CLI

Затем используйте эти команды внутри CLI:

/voice          Включить/выключить голосовой режим
/voice on Включить голосовой режим
/voice off Выключить голосовой режим
/voice tts Включить/выключить вывод TTS
/voice status Показать текущее состояние

Как это работает​

  1. Запустите CLI с помощью vibeos и включите голосовой режим командой /voice on
  2. Нажмите Ctrl+B — воспроизводится звуковой сигнал (880 Гц), начинается запись
  3. Говорите — индикатор уровня аудио в реальном времени показывает ваш вход: ● [▁▂▃▅▇▇▅▂] ❯
  4. Перестаньте говорить — через 3 секунды тишины запись автоматически останавливается
  5. Воспроизводятся два сигнала (660 Гц), подтверждающие окончание записи
  6. Аудио транскрибируется через Whisper и отправляется агенту
  7. Если TTS включён, ответ агента озвучивается
  8. Запись автоматически перезапускается — говорите снова, не нажимая никаких клавиш

Этот цикл продолжается, пока вы не нажмёте Ctrl+B во время записи (выход из непрерывного режима) или 3 последовательные записи не обнаружат отсутствие речи.

подсказка

Клавиша записи настраивается через voice.record_key в ~/.vibeos/config.yaml (по умолчанию: ctrl+b).

Обнаружение тишины​

Двухэтапный алгоритм определяет, когда вы закончили говорить:

  1. Подтверждение речи — ожидает аудио выше порога RMS (200) в течение как минимум 0,3 с, допуская кратковременные падения между слогами
  2. Обнаружение окончания — после подтверждения речи срабатывает через 3,0 секунды непрерывной тишины

Если речь вообще не обнаружена в течение 15 секунд, запись останавливается автоматически.

Оба параметра silence_threshold и silence_duration настраиваются в config.yaml. Вы также можете отключить звуковые сигналы начала/окончания записи с помощью voice.beep_enabled: false.

Потоковый TTS​

Когда TTS включён, агент озвучивает свой ответ предложение за предложением по мере генерации текста — вам не нужно ждать полного ответа:

  1. Буферизирует текстовые дельты в полные предложения (минимум 20 символов)
  2. Удаляет разметку markdown и блоки <think>
  3. Генерирует и воспроизводит аудио для каждого предложения в реальном времени

Фильтр галлюцинаций​

Whisper иногда генерирует фантомный текст из тишины или фонового шума («Спасибо за просмотр», «Подпишитесь» и т.д.). Агент отфильтровывает их с помощью набора из 26 известных фраз-галлюцинаций на нескольких языках, а также регулярного выражения, которое отлавливает повторяющиеся вариации.


Голосовой ответ шлюза (Telegram и Discord)​

Если вы ещё не настроили своих ботов для обмена сообщениями, смотрите руководства для конкретных платформ:

Запустите шлюз для подключения к вашим платформам обмена сообщениями:

vibeos gateway        # Запуск шлюза (подключается к настроенным платформам)
vibeos gateway setup # Интерактивный мастер настройки для первой конфигурации

Discord: каналы и личные сообщения​

Бот поддерживает два режима взаимодействия в Discord:

РежимКак общатьсяТребуется упоминаниеНастройка
Личное сообщение (ЛС)Откройте профиль бота → «Сообщение»НетРаботает сразу
Серверный каналПишите в текстовом канале, где присутствует ботДа (@имябота)Бот должен быть приглашён на сервер

ЛС (рекомендуется для личного использования): Просто откройте ЛС с ботом и пишите — упоминание не требуется. Голосовые ответы и все команды работают так же, как в каналах.

Серверные каналы: Бот отвечает только когда вы упоминаете его через @ (например, @vibeosbyt4 привет). Убедитесь, что вы выбираете пользователя-бота из всплывающего окна упоминания, а не роль с тем же именем.

подсказка

Чтобы отключить требование упоминания в серверных каналах, добавьте в ~/.vibeos/.env:

DISCORD_REQUIRE_MENTION=false

Или укажите конкретные каналы для свободного ответа (без упоминания):

DISCORD_FREE_RESPONSE_CHANNELS=123456789,987654321

Команды​

Эти команды работают как в Telegram, так и в Discord (ЛС и текстовые каналы):

/voice          Включить/выключить голосовой режим
/voice on Голосовые ответы только когда вы отправляете голосовое сообщение
/voice tts Голосовые ответы для ВСЕХ сообщений
/voice off Выключить голосовые ответы
/voice status Показать текущую настройку

Режимы​

РежимКомандаПоведение
off/voice offТолько текст (по умолчанию)
voice_only/voice onОзвучивает ответ только когда вы отправляете голосовое сообщение
all/voice ttsОзвучивает ответ на каждое сообщение

Настройка голосового режима сохраняется после перезапуска шлюза.

Доставка на платформу​

ПлатформаФорматПримечания
TelegramГолосовое сообщение (Opus/OGG)Воспроизводится в чате. ffmpeg конвертирует MP3 → Opus при необходимости
DiscordВстроенное голосовое сообщение (Opus/OGG)Воспроизводится как голосовое сообщение пользователя. Переключается на вложение файла, если API голосовых сообщений не срабатывает

Голосовые каналы Discord​

Самая захватывающая голосовая функция: бот заходит в голосовой канал Discord, слушает говорящих пользователей, транскрибирует их речь, обрабатывает через агента и озвучивает ответ обратно в голосовом канале.

Настройка​

1. Разрешения бота Discord​

Если у вас уже есть бот Discord, настроенный для текста (см. Руководство по настройке Discord), вам нужно добавить голосовые разрешения.

Перейдите в Портал разработчиков Discord → ваше приложение → Установка → Настройки установки по умолчанию → Установка на сервер:

Добавьте эти разрешения к существующим текстовым разрешениям:

РазрешениеНазначениеТребуется
ПодключатьсяЗаходить в голосовые каналыДа
ГоворитьВоспроизводить TTS-аудио в голосовых каналахДа
Использовать голосовую активностьОпределять, когда пользователи говорятРекомендуется

Обновлённое целое число разрешений:

УровеньЦелое числоЧто включено
Только текст274878286912Просмотр каналов, Отправка сообщений, Чтение истории, Встраивания, Вложения, Ветки, Реакции
Текст + Голос274881432640Всё выше + Подключаться, Говорить

Повторно пригласите бота с обновлённым URL разрешений:

https://discord.com/oauth2/authorize?client_id=YOUR_APP_ID&scope=bot+applications.commands&permissions=274881432640

Замените YOUR_APP_ID на ID вашего приложения из Портала разработчика.

предупреждение

Повторное приглашение бота на сервер, где он уже есть, обновит его разрешения без удаления. Вы не потеряете никаких данных или конфигурации.

2. Привилегированные намерения шлюза​

В Портале разработчика → ваше приложение → Бот → Привилегированные намерения шлюза, включите все три:

НамерениеНазначение
Намерение присутствияОпределять статус пользователя (онлайн/офлайн)
Намерение участников сервераПреобразовывать имена пользователей в DISCORD_ALLOWED_USERS в числовые ID (условно)
Намерение содержимого сообщенийЧитать содержимое текстовых сообщений в каналах

Намерение содержимого сообщений обязательно. Намерение участников сервера требуется только в том случае, если ваш список DISCORD_ALLOWED_USERS использует имена пользователей — если вы используете числовые ID пользователей, его можно оставить ВЫКЛЮЧЕННЫМ. Сопоставление SSRC голосового канала с ID пользователя поступает из кода операции SPEAKING Discord на голосовом вебсокете и не требует намерения участников сервера.

3. Кодек Opus​

Библиотека кодека Opus должна быть установлена на машине, запускающей шлюз:

# macOS (Homebrew)
brew install opus

# Ubuntu/Debian
sudo apt install libopus0

Бот автоматически загружает кодек из:

  • macOS: /opt/homebrew/lib/libopus.dylib
  • Linux: libopus.so.0

4. Переменные окружения​

# ~/.vibeos/.env

# Бот Discord (уже настроен для текста)
DISCORD_BOT_TOKEN=ваш-токен-бота
DISCORD_ALLOWED_USERS=ваш-id-пользователя

# STT — локальному провайдеру не нужен ключ (pip install faster-whisper)
# GROQ_API_KEY=ваш-ключ # Альтернатива: облачный, быстрый, бесплатный тариф

# TTS — опционально. Edge TTS и NeuTTS не требуют ключа.
# ELEVENLABS_API_KEY=*** # Премиум качество
# VOICE_TOOLS_OPENAI_KEY=*** # OpenAI TTS / Whisper

Запуск шлюза​

vibeos gateway        # Запуск с существующей конфигурацией

Бот должен появиться в Discord в течение нескольких секунд.

Команды​

Используйте их в текстовом канале Discord, где присутствует бот:

/voice join      Бот заходит в ваш текущий голосовой канал
/voice channel Псевдоним для /voice join
/voice leave Бот отключается от голосового канала
/voice status Показать голосовой режим и подключённый канал
к сведению

Вы должны находиться в голосовом канале перед выполнением /voice join. Бот заходит в тот же голосовой канал, где находитесь вы.

Как это работает​

Когда бот заходит в голосовой канал, он:

  1. Слушает аудиопоток каждого пользователя независимо
  2. Обнаруживает тишину — 1,5 с тишины после как минимум 0,5 с речи запускает обработку
  3. Транскрибирует аудио через Whisper STT (локальный, Groq или OpenAI)
  4. Обрабатывает через полный конвейер агента (сессия, инструменты, память)
  5. Озвучивает ответ обратно в голосовом канале через TTS

Интеграция с текстовым каналом​

Когда бот находится в голосовом канале:

  • Транскрипты появляются в текстовом канале: [Голос] @пользователь: что вы сказали
  • Ответы агента отправляются как текст в канал И озвучиваются в голосовом канале
  • Текстовый канал — это тот, в котором была выполнена команда /voice join

Предотвращение эха​

Бот автоматически приостанавливает свой аудиослушатель во время воспроизведения TTS-ответов, предотвращая прослушивание и повторную обработку собственного вывода.

Контроль доступа​

Только пользователи, перечисленные в DISCORD_ALLOWED_USERS, могут взаимодействовать через голос. Аудио других пользователей молча игнорируется.

# ~/.vibeos/.env
DISCORD_ALLOWED_USERS=284102345871466496

Справочник по конфигурации​

config.yaml​

# Запись голоса (CLI)
voice:
record_key: "ctrl+b" # Клавиша для начала/остановки записи
max_recording_seconds: 120 # Максимальная длина записи
auto_tts: false # Автоматически включать TTS при запуске голосового режима
beep_enabled: true # Воспроизводить звуковые сигналы начала/окончания записи
silence_threshold: 200 # Уровень RMS (0-32767), ниже которого считается тишиной
silence_duration: 3.0 # Секунд тишины перед автоматической остановкой

# Преобразование речи в текст
stt:
enabled: true # установите false, чтобы пропустить автоматическую транскрипцию —
# шлюз всё равно кэширует аудиофайл и
# передаёт его путь агенту как часть
# входящего сообщения, полезно для пользовательских конвейеров
# (диаризация, выравнивание, архивирование и т.д.)
provider: "local" # "local" (бесплатно) | "groq" | "openai" | "mistral" | "xai"
local:
model: "base" # tiny, base, small, medium, large-v3
# model: "whisper-1" # Устаревшее: используется, когда провайдер не указан

# Преобразование текста в речь
tts:
provider: "edge" # "edge" (бесплатно) | "elevenlabs" | "openai" | "neutts" | "minimax" | "mistral" | "gemini" | "xai" | "kittentts" | "piper"
edge:
voice: "en-US-AriaNeural" # 322 голоса, 74 языка
elevenlabs:
voice_id: "pNInz6obpgDQGcFmaJgB" # Adam
model_id: "eleven_multilingual_v2"
openai:
model: "gpt-4o-mini-tts"
voice: "alloy" # alloy, echo, fable, onyx, nova, shimmer
base_url: "https://api.openai.com/v1" # опционально: переопределить для самостоятельного хостинга или совместимых с OpenAI конечных точек
neutts:
ref_audio: ''
ref_text: ''
model: neuphonic/neutts-air-q4-gguf
device: cpu

Переменные окружения​

# Провайдеры преобразования речи в текст (локальному не нужен ключ)
# pip install faster-whisper # Бесплатный локальный STT — API-ключ не нужен
GROQ_API_KEY=... # Groq Whisper (быстрый, бесплатный тариф)
VOICE_TOOLS_OPENAI_KEY=... # OpenAI Whisper (платный)

# Расширенные переопределения STT (опционально)
STT_GROQ_MODEL=whisper-large-v3-turbo # Переопределить модель STT Groq по умолчанию
STT_OPENAI_MODEL=whisper-1 # Переопределить модель STT OpenAI по умолчанию
GROQ_BASE_URL=https://api.groq.com/openai/v1 # Пользовательская конечная точка Groq
STT_OPENAI_BASE_URL=https://api.openai.com/v1 # Пользовательская конечная точка OpenAI STT

# Провайдеры преобразования текста в речь (Edge TTS и NeuTTS не требуют ключа)
ELEVENLABS_API_KEY=*** # ElevenLabs (премиум качество)
# VOICE_TOOLS_OPENAI_KEY выше также включает OpenAI TTS

# Голосовой канал Discord
DISCORD_BOT_TOKEN=...
DISCORD_ALLOWED_USERS=...

Сравнение провайдеров STT​

ПровайдерМодельСкоростьКачествоСтоимостьAPI-ключ
ЛокальныйbaseБыстро (зависит от CPU/GPU)ХорошееБесплатноНет
ЛокальныйsmallСреднеЛучшеБесплатноНет
Локальныйlarge-v3МедленноЛучшееБесплатноНет
Groqwhisper-large-v3-turboОчень быстро (~0,5 с)ХорошееБесплатный тарифДа
Groqwhisper-large-v3Быстро (~1 с)ЛучшеБесплатный тарифДа
OpenAIwhisper-1Быстро (~1 с)ХорошееПлатноДа
OpenAIgpt-4o-transcribeСредне (~2 с)ЛучшееПлатноДа
Mistralvoxtral-mini-latestБыстроХорошееПлатноДа
xAIgrok-sttБыстроХорошееПлатноДа

Приоритет провайдера (автоматический откат): local > groq > openai

Сравнение провайдеров TTS​

ПровайдерКачествоСтоимостьЗадержкаТребуется ключ
Edge TTSХорошееБесплатно~1 сНет
ElevenLabsОтличноеПлатно~2 сДа
OpenAI TTSХорошееПлатно~1,5 сДа
NeuTTSХорошееБесплатноЗависит от CPU/GPUНет

NeuTTS использует блок конфигурации tts.neutts выше.


Устранение неполадок​

«Аудиоустройство не найдено» (CLI)​

PortAudio не установлен:

brew install portaudio    # macOS
sudo apt install portaudio19-dev # Ubuntu

Если вы запускаете VibeOS внутри Docker на Linux-рабочем столе, контейнеру также нужен доступ к аудиосокету хоста. Смотрите примечания к аудиомосту Docker для настройки, совместимой с PulseAudio/PipeWire.

Бот не отвечает в серверных каналах Discord​

По умолчанию бот требует упоминания через @ в серверных каналах. Убедитесь, что вы:

  1. Набираете @ и выбираете пользователя-бота (с #дискриминатором), а не роль с тем же именем
  2. Или используйте ЛС — упоминание не требуется
  3. Или установите DISCORD_REQUIRE_MENTION=false в ~/.vibeos/.env

Бот заходит в голосовой канал, но не слышит меня​

  • Проверьте, что ваш ID пользователя Discord есть в DISCORD_ALLOWED_USERS
  • Убедитесь, что вы не отключены в Discord
  • Боту нужно событие SPEAKING от Discord, прежде чем он сможет сопоставить ваше аудио — начните говорить в течение нескольких секунд после подключения

Бот слышит меня, но не отвечает​

  • Убедитесь, что STT доступен: установите faster-whisper (ключ не нужен) или укажите GROQ_API_KEY / VOICE_TOOLS_OPENAI_KEY
  • Проверьте, что модель LLM настроена и доступна
  • Просмотрите журналы шлюза: tail -f ~/.vibeos/logs/gateway.log

Бот отвечает текстом, но не в голосовом канале​

  • Возможно, TTS-провайдер не работает — проверьте API-ключ и квоту
  • Edge TTS (бесплатно, без ключа) используется по умолчанию как запасной вариант
  • Проверьте журналы на наличие ошибок TTS

Whisper возвращает мусорный текст​

Фильтр галлюцинаций обрабатывает большинство случаев автоматически. Если вы всё ещё получаете фантомные транскрипты:

  • Используйте более тихое окружение
  • Отрегулируйте silence_threshold в конфиге (выше = менее чувствительно)
  • Попробуйте другую модель STT