Голосовой режим
VibeOS поддерживает полноценное голосовое взаимодействие через CLI и платформы обмена сообщениями. Разговаривайте с агентом через микрофон, слушайте голосовые ответы и ведите живые голосовые беседы в голосовых каналах Discord.
Если вам нужно практическое руководство по настройке с рекомендуемыми конфигурациями и реальными сценариями использования, смотрите Использование голосового режима с VibeOS.
Предварительные требования
Перед использованием голосовых функций убедитесь, что у вас есть:
- Установленный VibeOS — через скрипт установки (см. Установка)
- Настроенный LLM-провайдер — выполните
vibeos modelили укажите учётные данные предпочитаемого провайдера в~/.vibeos/.env - Работающая базовая настройка — выполните
vibeos, чтобы убедиться, что агент отвечает на текст, прежде чем включать голос
Директория ~/.vibeos/ и файл config.yaml по умолчанию создаются автоматически при первом запуске vibeos. Вам нужно только вручную создать ~/.vibeos/.env для API-ключей.
Платная подписка 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]"
| Дополнение | Пакеты | Требуется для |
|---|---|---|
voice | sounddevice, numpy | Голосовой режим CLI |
messaging | discord.py[voice], python-telegram-bot, aiohttp | Боты Discord и Telegram |
tts-premium | elevenlabs | TTS-провайдер 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 Показать текущее состояние
Как это работает
- Запустите CLI с помощью
vibeosи включите голосовой режим командой/voice on - Нажмите Ctrl+B — воспроизводится звуковой сигнал (880 Гц), начинается запись
- Говорите — индикатор уровня аудио в реальном времени показывает ваш вход:
● [▁▂▃▅▇▇▅▂] ❯ - Перестаньте говорить — через 3 секунды тишины запись автоматически останавливается
- Воспроизводятся два сигнала (660 Гц), подтверждающие окончание записи
- Аудио транскрибируется через Whisper и отправляется агенту
- Если TTS включён, ответ агента озвучивается
- Запись автоматически перезапускается — говорите снова, не нажимая никаких клавиш
Этот цикл продолжается, пока вы не нажмёте Ctrl+B во время записи (выход из непрерывного режима) или 3 последовательные записи не обнаружат отсутствие речи.
Клавиша записи настраивается через voice.record_key в ~/.vibeos/config.yaml (по умолчанию: ctrl+b).
Обнаружение тишины
Двухэтапный алгоритм определяет, когда вы закончили говорить:
- Подтверждение речи — ожидает аудио выше порога RMS (200) в течение как минимум 0,3 с, допуская кратковременные падения между слогами
- Обнаружение окончания — после подтверждения речи срабатывает через 3,0 секунды непрерывной тишины
Если речь вообще не обнаружена в течение 15 секунд, запись останавливается автоматически.
Оба параметра silence_threshold и silence_duration настраиваются в config.yaml. Вы также можете отключить звуковые сигналы начала/окончания записи с помощью voice.beep_enabled: false.
Потоковый TTS
Когда TTS включён, агент озвучивает свой ответ предложение за предложением по мере генерации текста — вам не нужно ждать полного ответа:
- Буферизирует текстовые дельты в полные предложения (минимум 20 символов)
- Удаляет разметку markdown и блоки
<think> - Генерирует и воспроизводит аудио для каждого предложения в реальном времени
Фильтр галлюцинаций
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,5 с тишины после как минимум 0,5 с речи запускает обработку
- Транскрибирует аудио через Whisper STT (локальный, Groq или OpenAI)
- Обрабатывает через полный конвейер агента (сессия, инструменты, память)
- Озвучивает ответ обратно в голосовом канале через 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 | Медленно | Лучшее | Бесплатно | Нет |
| Groq | whisper-large-v3-turbo | Очень быстро (~0,5 с) | Хорошее | Бесплатный тариф | Да |
| Groq | whisper-large-v3 | Быстро (~1 с) | Лучше | Бесплатный тариф | Да |
| OpenAI | whisper-1 | Быстро (~1 с) | Хорошее | Платно | Да |
| OpenAI | gpt-4o-transcribe | Средне (~2 с) | Лучшее | Платно | Да |
| Mistral | voxtral-mini-latest | Быстро | Хорошее | Платно | Да |
| xAI | grok-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
По умолчанию бот требует упоминания через @ в серверных каналах. Убедитесь, что вы:
- Набираете
@и выбираете пользователя-бота (с #дискриминатором), а не роль с тем же именем - Или используйте ЛС — упоминание не требуется
- Или установите
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