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

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

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

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

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

  1. Установленный Hermes Agentpip install hermes-agent (см. Установка)

  2. Настроенный провайдер LLM — выполните hermes model или укажите учётные данные провайдера в ~/.hermes/.env

  3. Работающая базовая настройка — выполните hermes, чтобы убедиться, что агент отвечает на текст перед включением голоса

The `~/.hermes/` directory and default `config.yaml` are created automatically the first time you run `hermes`. You only need to create `~/.hermes/.env` manually for API keys.

Обзор

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

Требования

Пакеты Python

# CLI voice mode (microphone + audio playback)
pip install "hermes-agent[voice]"

# Discord + Telegram messaging (includes discord.py[voice] for VC support)
pip install "hermes-agent[messaging]"

# Premium TTS (ElevenLabs)
pip install "hermes-agent[tts-premium]"

# Local TTS (NeuTTS, optional)
python -m pip install -U neutts[all]

# Everything at once
pip install "hermes-agent[all]"
Дополнение Пакеты Необходимо для
voice sounddevice, numpy Голосового режима в CLI
messaging discord.py[voice], python-telegram-bot, aiohttp Ботов Discord и Telegram
tts-premium elevenlabs Провайдера ElevenLabs TTS

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

`discord.py[voice]` installs **PyNaCl** (for voice encryption) and **opus bindings** automatically. This is required for Discord voice channel support.

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

# macOS
brew install portaudio ffmpeg opus
brew install espeak-ng   # for NeuTTS

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

Ключи API

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

# Speech-to-Text — local provider needs NO key at all
# pip install faster-whisper          # Free, runs locally, recommended
GROQ_API_KEY=your-key                 # Groq Whisper — fast, free tier (cloud)
VOICE_TOOLS_OPENAI_KEY=your-key       # OpenAI Whisper — paid (cloud)

# Text-to-Speech (optional — Edge TTS and NeuTTS work without any key)
ELEVENLABS_API_KEY=***           # ElevenLabs — premium quality
# VOICE_TOOLS_OPENAI_KEY above also enables OpenAI TTS
If `faster-whisper` is installed, voice mode works with **zero API keys** for STT. The model (~150 MB for `base`) downloads automatically on first use.

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

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

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

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

hermes                # Start the interactive CLI

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

/voice          Toggle voice mode on/off
/voice on       Enable voice mode
/voice off      Disable voice mode
/voice tts      Toggle TTS output
/voice status   Show current state

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

  1. Запустите CLI командой hermes и включите голосовой режим с помощью /voice on

  2. Нажмите Ctrl+B — прозвучит звуковой сигнал (880 Гц), запись начнётся

  3. Говорите — живой индикатор уровня аудио показывает ваш вход: ● [▁▂▃▅▇▇▅▂] ❯

  4. Перестаньте говорить — через 3 секунды тишины запись автоматически остановится

  5. Прозвучат два сигнала (660 Гц), подтверждающих завершение записи

  6. Аудио транскрибируется через Whisper и отправляется агенту

  7. Если TTS включён, ответ агента произносится вслух

  8. Запись автоматически перезапускается — говорите снова без нажатия каких-либо клавиш

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

The record key is configurable via `voice.record_key` in `~/.hermes/config.yaml` (default: `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 иногда генерирует фантомный текст из тишины или фонового шума («Thank you for watching», «Subscribe» и т. д.). Агент отфильтровывает их с помощью набора из 26 известных галлюцинаторных фраз на нескольких языках, а также regex-шаблона, который отлавливает повторяющиеся вариации.


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

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

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

hermes gateway        # Start the gateway (connects to configured platforms)
hermes gateway setup  # Interactive setup wizard for first-time configuration

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

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

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

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

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

To disable the mention requirement in server channels, add to `~/.hermes/.env`:
DISCORD_REQUIRE_MENTION=false
Or set specific channels as free-response (no mention needed):
DISCORD_FREE_RESPONSE_CHANNELS=123456789,987654321

Команды

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

/voice          Toggle voice mode on/off
/voice on       Voice replies only when you send a voice message
/voice tts      Voice replies for ALL messages
/voice off      Disable voice replies
/voice status   Show current setting

Режимы

Режим Команда Поведение
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 Developer Portal → ваше приложение → InstallationDefault Install SettingsGuild Install:

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

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

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

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

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

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

Замените YOUR_APP_ID на ID вашего приложения из Developer Portal.

Re-inviting the bot to a server it's already in will update its permissions without removing it. You won't lose any data or configuration.

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

В Developer Portal → ваше приложение → BotPrivileged Gateway Intents, включите все три:

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

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

3. Кодек Opus

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

# macOS (Homebrew)
brew install opus

# Ubuntu/Debian
sudo apt install libopus0

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

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

# ~/.hermes/.env

# Discord bot (already configured for text)
DISCORD_BOT_TOKEN=your-bot-token
DISCORD_ALLOWED_USERS=your-user-id

# STT — local provider needs no key (pip install faster-whisper)
# GROQ_API_KEY=your-key            # Alternative: cloud-based, fast, free tier

# TTS — optional. Edge TTS and NeuTTS need no key.
# ELEVENLABS_API_KEY=***      # Premium quality
# VOICE_TOOLS_OPENAI_KEY=***  # OpenAI TTS / Whisper

Запуск шлюза

hermes gateway        # Start with existing configuration

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

Команды

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

/voice join      Bot joins your current voice channel
/voice channel   Alias for /voice join
/voice leave     Bot disconnects from voice channel
/voice status    Show voice mode and connected channel
You must be in a voice channel before running `/voice join`. The bot joins the same VC you're in.

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

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

  1. Слушает аудиопоток каждого пользователя независимо

  2. Обнаруживает тишину — 1,5 с тишины после как минимум 0,5 с речи запускает обработку

  3. Транскрибирует аудио через Whisper STT (локальный, Groq или OpenAI)

  4. Обрабатывает через полный пайплайн агента (сессия, инструменты, память)

  5. Произносит ответ обратно в голосовой канал через TTS

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

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

Защита от эха

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

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

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

# ~/.hermes/.env
DISCORD_ALLOWED_USERS=284102345871466496

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

config.yaml

# Voice recording (CLI)
voice:
  record_key: "ctrl+b"            # Key to start/stop recording
  max_recording_seconds: 120       # Maximum recording length
  auto_tts: false                  # Auto-enable TTS when voice mode starts
  beep_enabled: true               # Play record start/stop beeps
  silence_threshold: 200           # RMS level (0-32767) below which counts as silence
  silence_duration: 3.0            # Seconds of silence before auto-stop

# Speech-to-Text
stt:
  provider: "local"                  # "local" (free) | "groq" | "openai"
  local:
    model: "base"                    # tiny, base, small, medium, large-v3
  # model: "whisper-1"              # Legacy: used when provider is not set

# Text-to-Speech
tts:
  provider: "edge"                 # "edge" (free) | "elevenlabs" | "openai" | "neutts" | "minimax"
  edge:
    voice: "en-US-AriaNeural"      # 322 voices, 74 languages
  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"  # optional: override for self-hosted or OpenAI-compatible endpoints
  neutts:
    ref_audio: ''
    ref_text: ''
    model: neuphonic/neutts-air-q4-gguf
    device: cpu

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

# Speech-to-Text providers (local needs no key)
# pip install faster-whisper        # Free local STT — no API key needed
GROQ_API_KEY=...                    # Groq Whisper (fast, free tier)
VOICE_TOOLS_OPENAI_KEY=...         # OpenAI Whisper (paid)

# STT advanced overrides (optional)
STT_GROQ_MODEL=whisper-large-v3-turbo    # Override default Groq STT model
STT_OPENAI_MODEL=whisper-1               # Override default OpenAI STT model
GROQ_BASE_URL=https://api.groq.com/openai/v1     # Custom Groq endpoint
STT_OPENAI_BASE_URL=https://api.openai.com/v1    # Custom OpenAI STT endpoint

# Text-to-Speech providers (Edge TTS and NeuTTS need no key)
ELEVENLABS_API_KEY=***             # ElevenLabs (premium quality)
# VOICE_TOOLS_OPENAI_KEY above also enables OpenAI TTS

# Discord voice channel
DISCORD_BOT_TOKEN=...
DISCORD_ALLOWED_USERS=...

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

Провайдер Модель Скорость Качество Стоимость Ключ API
Local base Высокая (зависит от CPU/GPU) Хорошее Бесплатно Нет
Local small Средняя Лучше Бесплатно Нет
Local large-v3 Низкая Наилучшее Бесплатно Нет
Groq whisper-large-v3-turbo Очень высокая (~0,5 с) Хорошее Бесплатный тариф Да
Groq whisper-large-v3 Высокая (~1 с) Лучше Бесплатный тариф Да
OpenAI whisper-1 Высокая (~1 с) Хорошее Платно Да
OpenAI gpt-4o-transcribe Средняя (~2 с) Наилучшее Платно Да

Приоритет провайдеров (автоматический fallback): 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

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

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

  1. Пишете @ и выбираете пользователя-бота (с #дискриминатором), а не роль с тем же именем

  2. Или используйте ЛС — упоминание не требуется

  3. Или установите DISCORD_REQUIRE_MENTION=false в ~/.hermes/.env

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

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

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

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

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