Voice mode
Источник
1. Обзор
| Функция | Платформа | Описание |
|---|---|---|
| Interactive Voice | CLI | Нажмите Ctrl+B для записи, агент автоматически определяет тишину и отвечает |
| Auto Voice Reply | Telegram, Discord | Агент отправляет голосовые аудио-ответы вместе с текстом |
| Voice Channel | Discord | Бот присоединяется к VC, слушает пользователей, озвучивает ответы |
2. Предварительные требования
Python пакеты:
| Extra | Пакеты | Для чего |
|---|---|---|
voice | sounddevice, numpy | CLI голосовой режим |
messaging | discord.py[voice], python-telegram-bot, aiohttp | Боты Discord и Telegram |
tts-premium | elevenlabs | ElevenLabs TTS |
Системные зависимости:
| Зависимость | Назначение | Для чего |
|---|---|---|
| PortAudio | Ввод с микрофона и воспроизведение | CLI голосовой режим |
| ffmpeg | Конвертация аудио форматов | Все платформы |
| Opus | Кодек Discord voice | Голосовые каналы Discord |
| espeak-ng | Фонемизатор | Локальный NeuTTS |
API ключи (добавить в ~/.hermes/.env):
Совет: Если faster-whisper установлен, голосовой режим работает без API ключей для STT. Модель (~150 MB) скачивается автоматически.
3. CLI голосовой режим
Быстрый старт:
Затем в CLI:
Как работает:
- Запустите CLI с
hermesи включите голосовой режим через/voice on - Нажмите Ctrl+B — раздаётся сигнал (880Hz), начинается запись
- Говорите — индикатор уровня показывает ввод:
● [___-------] > - Перестаньте говорить — через 3 секунды тишины запись автоматически останавливается
- Раздаются два сигнала (660Hz), подтверждающие окончание записи
- Аудио транскрибируется через Whisper и отправляется агенту
- Если TTS включён, ответ агента озвучивается
- Запись автоматически возобновляется — говорите снова без нажатия клавиш
Детекция тишины:
Двухстадийный алгоритм:
- Подтверждение речи — ожидание аудио выше порога RMS (200) минимум 0.3с
- Детекция окончания — после подтверждения речи, срабатывает через 3.0 секунды непрерывной тишины
Настройки в config.yaml:
Streaming TTS:
При включённом TTS агент произносит ответ предложение за предложением по мере генерации текста:
- Буферизует текст до полных предложений (мин. 20 символов)
- Удаляет markdown форматирование и блоки
<think> - Генерирует и воспроизводит аудио в реальном времени
Фильтр галлюцинаций:
Whisper иногда генерирует фантомный текст из тишины ("Thank you for watching", "Subscribe" и т.д.). Агент фильтрует их по набору из 26 известных фраз-галлюцинаций.
4. Gateway голосовые ответы (Telegram и Discord)
Команды (работают в Telegram и Discord):
Режимы:
| Режим | Команда | Поведение |
|---|---|---|
off | /voice off | Только текст (по умолчанию) |
voice_only | /voice on | Озвучивает ответ только на голосовое сообщение |
all | /voice tts | Озвучивает ответ на каждое сообщение |
Доставка по платформам:
| Платформа | Формат | Примечания |
|---|---|---|
| Telegram | Голосовой пузырь (Opus/OGG) | Воспроизводится инлайн в чате |
| Discord | Нативный голосовой пузырь (Opus/OGG) | Воспроизводится как голосовое сообщение пользователя |
5. Голосовые каналы Discord
Настройка:
1. Права Discord бота:
В Discord Developer Portal добавьте права:
| Право | Назначение | Обязательно |
|---|---|---|
| Connect | Подключение к голосовым каналам | Да |
| Speak | Воспроизведение TTS в голосовых каналах | Да |
| Use Voice Activity | Детекция когда пользователи говорят | Рекомендуется |
Обновлённый integer прав: 274881432640
2. Привилегированные намерения (Privileged Gateway Intents):
Включите все три:
- Presence Intent
- Server Members Intent
- Message Content Intent (обязательно)
3. Кодек Opus:
Команды (в текстовом канале Discord):
Как работает:
- Слушает аудио поток каждого пользователя независимо
- Детектирует тишину — 1.5с тишины после минимум 0.5с речи
- Транскрибирует аудио через Whisper STT
- Обрабатывает через полный пайплайн агента
- Озвучивает ответ обратно в голосовом канале
Защита от эха:
Бот автоматически приостанавливает прослушивание во время воспроизведения TTS ответа.
Управление доступом:
Только пользователи из DISCORD_ALLOWED_USERS могут взаимодействовать через голос.
6. Конфигурация
config.yaml:
Переменные окружения:
7. Сравнение STT провайдеров
| Провайдер | Модель | Скорость | Качество | Стоимость | Ключ |
|---|---|---|---|---|---|
| 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с) | Лучшее | Платный | Да |
| Mistral | voxtral-mini-latest | Быстрая | Хорошее | Платный | Да |
| xAI | grok-stt | Быстрая | Хорошее | Платный | Да |
Приоритет (автоматический fallback): local > groq > openai
8. Сравнение TTS провайдеров
| Провайдер | Качество | Стоимость | Задержка | Ключ нужен |
|---|---|---|---|---|
| Edge TTS | Хорошее | Бесплатно | ~1с | Нет |
| ElevenLabs | Отличное | Платный | ~2с | Да |
| OpenAI TTS | Хорошее | Платный | ~1.5с | Да |
| NeuTTS | Хорошее | Бесплатно | Зависит от CPU/GPU | Нет |
9. Устранение неполадок
"No audio device found" (CLI):
PortAudio не установлен:
Бот не отвечает в каналах Discord:
Бот требует @упоминания по умолчанию. Убедитесь что:
- Выберите пользователя бота, а не роль
- Используйте DM — упоминание не нужно
- Или установите
DISCORD_REQUIRE_MENTION=falseв.env
Бот присоединяется к VC, но не слышит:
- Проверьте что ваш ID есть в
DISCORD_ALLOWED_USERS - Убедитесь что вы не замьючены в Discord
Бот слышит, но не отвечает:
- Проверьте доступность STT: установите
faster-whisperили настройтеGROQ_API_KEY - Проверьте настройку LLM модели
- Просмотрите логи:
tail -f ~/.hermes/logs/gateway.log
Whisper возвращает мусорный текст:
Фильтр галлюцинаций ловит большинство случаев. Если всё ещё получаете фантомные транскрипции:
- Используйте более тихую обстановку
- Настройте
silence_threshold(выше = менее чувствительно) - Попробуйте другую STT модель