Голос и TTS

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

💡 Tip

Подписчики Если у вас есть платная подписка на Nous Portal, OpenAI TTS доступен через Tool Gateway без отдельного ключа OpenAI API. Запустите «модель Гермеса» или «инструменты Гермеса», чтобы включить ее.

Преобразование текста в речь

Преобразование текста в речь с помощью десяти провайдеров:

Провайдер Качество Стоимость API-ключ
Пограничный TTS (по умолчанию) Хорошо Бесплатно Ничего не нужно
ЭлевенЛабс Отлично Платный ELEVENLABS_API_KEY
OpenAI TTS Хорошо Платный VOICE_TOOLS_OPENAI_KEY
МиниМакс ТТС Отлично Платный MINIMAX_API_KEY
Мистраль (Вокстрал ТТС) Отлично Платный MISTRAL_API_KEY
Google Gemini TTS Отлично Уровень бесплатного пользования GEMINI_API_KEY
xAI TTS Отлично Платный XAI_API_KEY
НейТТС Хорошо Бесплатно (локально) Ничего не нужно
КотенокTTS Хорошо Бесплатно (локально) Ничего не нужно
Пайпер Хорошо Бесплатно (локально) Ничего не нужно

Доставка платформы

Платформа Доставка Формат
Телеграмма Голосовой пузырь (играет в режиме онлайн) Опус .ogg
Раздор Голосовой пузырь (Opus/OGG), возвращается к вложенному файлу Опус/MP3
WhatsApp Вложенный аудиофайл MP3
интерфейс командной строки Сохранено в ~/.hermes/audio_cache/ MP3

Конфигурация

# In ~/.hermes/config.yaml
tts:
  provider: "edge"              # "edge" | "elevenlabs" | "openai" | "minimax" | "mistral" | "gemini" | "xai" | "neutts" | "kittentts" | "piper"
  speed: 1.0                    # Global speed multiplier (provider-specific settings override this)
  edge:
    voice: "en-US-AriaNeural"   # 322 voices, 74 languages
    speed: 1.0                  # Converted to rate percentage (+/-%)
  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"  # Override for OpenAI-compatible TTS endpoints
    speed: 1.0                  # 0.25 - 4.0
  minimax:
    model: "speech-2.8-hd"     # speech-2.8-hd (default), speech-2.8-turbo
    voice_id: "English_Graceful_Lady"  # See https://platform.minimax.io/faq/system-voice-id
    speed: 1                    # 0.5 - 2.0
    vol: 1                      # 0 - 10
    pitch: 0                    # -12 - 12
  mistral:
    model: "voxtral-mini-tts-2603"
    voice_id: "c69964a6-ab8b-4f8a-9465-ec0925096ec8"  # Paul - Neutral (default)
  gemini:
    model: "gemini-2.5-flash-preview-tts"  # or gemini-2.5-pro-preview-tts
    voice: "Kore"               # 30 prebuilt voices: Zephyr, Puck, Kore, Enceladus, Gacrux, etc.
  xai:
    voice_id: "eve"             # or a custom voice ID — see docs below
    language: "en"              # ISO 639-1 code
    sample_rate: 24000          # 22050 / 24000 (default) / 44100 / 48000
    bit_rate: 128000            # MP3 bitrate; only applies when codec=mp3
    # base_url: "https://api.x.ai/v1"   # Override via XAI_BASE_URL env var
  neutts:
    ref_audio: ''
    ref_text: ''
    model: neuphonic/neutts-air-q4-gguf
    device: cpu
  kittentts:
    model: KittenML/kitten-tts-nano-0.8-int8   # 25MB int8; also: kitten-tts-micro-0.8 (41MB), kitten-tts-mini-0.8 (80MB)
    voice: Jasper                               # Jasper, Bella, Luna, Bruno, Rosie, Hugo, Kiki, Leo
    speed: 1.0                                  # 0.5 - 2.0
    clean_text: true                            # Expand numbers, currencies, units
  piper:
    voice: en_US-lessac-medium                  # voice name (auto-downloaded) OR absolute path to.onnx
    # voices_dir: ''                            # default: ~/.hermes/cache/piper-voices/
    # use_cuda: false                           # requires onnxruntime-gpu
    # length_scale: 1.0                         # 2.0 = twice as slow
    # noise_scale: 0.667
    # noise_w_scale: 0.8
    # volume: 1.0                               # 0.5 = half as loud
    # normalize_audio: true

Контроль скорости: глобальное значение tts.speed по умолчанию применяется ко всем поставщикам. Каждый провайдер может переопределить его, задав собственную настройку скорости (например, tts.openai.speed: 1.5). Скорость, зависящая от поставщика, имеет приоритет над глобальным значением. По умолчанию — «1.0» (нормальная скорость).

Ограничения длины ввода

У каждого поставщика есть документированное ограничение количества входных символов для каждого запроса. Hermes обрезает текст перед вызовом провайдера, поэтому запросы никогда не завершаются ошибкой длины:

Провайдер Размер по умолчанию (символы)
Край TTS 5000
ОпенАИ 4096
хАИ 15000
МиниМакс 10000
Мистраль 4000
Google Близнецы 5000
ОдиннадцатьЛабс С учетом моделей (см. ниже)
НойТТС 2000
КотенокТТС 2000

ElevenLabs выбирает ограничение из настроенного model_id:

model_id Кепка (символы)
eleven_flash_v2_5 40000
одиннадцать_flash_v2 30000
eleven_multilingual_v2 (по умолчанию), eleven_multilingual_v1, eleven_english_sts_v2, eleven_english_sts_v1 10000
eleven_v3, eleven_ttv_v3 5000
Неизвестная модель Возвращается к настройкам поставщика по умолчанию (10000)

Переопределить для каждого поставщика с помощью max_text_length: в разделе поставщика вашей конфигурации TTS:

tts:
  openai:
    max_text_length: 8192   # raise or lower the provider cap

Учитываются только положительные целые числа. Нулевые, отрицательные, нечисловые или логические значения попадают в значение по умолчанию поставщика, поэтому неработающая конфигурация не может случайно отключить усечение.

Голосовые пузыри Telegram и ffmpeg

Для голосовых сообщений Telegram требуется аудиоформат Opus/OGG:

# Ubuntu/Debian
sudo apt install ffmpeg

# macOS
brew install ffmpeg

# Fedora
sudo dnf install ffmpeg

Без ffmpeg аудио Edge TTS, MiniMax TTS, NeuTTS, KittenTTS и Piper отправляются как обычные аудиофайлы (воспроизводимые, но отображаются в виде прямоугольного проигрывателя вместо голосового пузыря).:::совет Если вам нужны голосовые пузыри без установки ffmpeg, переключитесь на поставщика OpenAI, ElevenLabs или Mistral.

xAI Custom Voices (клонирование голоса)

xAI поддерживает клонирование вашего голоса и использование его с TTS. Создайте собственный голос в консоли xAI, затем установите полученный voice_id в вашей конфигурации:

tts:
  provider: xai
  xai:
    voice_id: "nlbqfwie"   # your custom voice ID

Подробную информацию о записи, поддерживаемых форматах и ​​ограничениях см. в документации по xAI Custom Voices.

Piper (местный, 44 языка)

Piper — это быстрый локальный нейронный TTS-движок от Open Home Foundation (сопровождающие Home Assistant). Он полностью работает на процессоре, поддерживает 44 языка с заранее обученными голосами и не требует ключа API.

Установка через hermes Tools → Voice & TTS → Piper — Hermes запускает для вас pip install Piper-tts. Или установите вручную: pip install Piper-tts.

Переключиться на Пайпер:

tts:
  provider: piper
  piper:
    voice: en_US-lessac-medium

При первом вызове TTS для голоса, который не кэшируется локально, Hermes запускает python -m piper.download_voices <name> и загружает модель (~20-90 МБ в зависимости от уровня качества) в ~/.hermes/cache/piper-voices/. Последующие вызовы повторно используют кэшированную модель.

Выбор голоса. Полный каталог голосов охватывает английский, испанский, французский, немецкий, итальянский, голландский, португальский, русский, польский, турецкий, китайский, арабский, хинди и другие языки — каждый из них имеет уровни качества x_low/low/medium/high. Примеры голосов можно найти на rhasspy.github.io/piper-samples.

Использование предварительно загруженного голоса. Задайте для tts.piper.voice абсолютный путь, заканчивающийся на .onnx:

tts:
  piper:
    voice: /path/to/my-custom-voice.onnx

Расширенные регуляторы (tts.piper.length_scale/noise_scale/noise_w_scale/volume/normalize_audio, use_cuda) соответствуют 1:1 SynthesisConfig Piper. Они игнорируются в старых версиях piper-tts.

Поставщики пользовательских команд

Если нужный вам движок TTS не поддерживается изначально (VoxCPM, MLX-Kokoro, XTTS CLI, сценарий клонирования голоса, что-либо еще, предоставляющее CLI), вы можете подключить его как поставщик командного типа без написания какого-либо Python. Hermes записывает входной текст во временный файл UTF-8, запускает команду оболочки и читает аудиофайл, созданный этой командой.

Объявите одного или нескольких провайдеров в tts.providers.<name> и переключайтесь между ними с помощью tts.provider: <name> — так же, как вы переключаетесь между встроенными модулями, такими как edge и openai.

tts:
  provider: voxcpm                 # pick any name under tts.providers
  providers:
    voxcpm:
      type: command
      command: "voxcpm --ref ~/voice.wav --text-file {input_path} --out {output_path}"
      output_format: mp3
      timeout: 180
      voice_compatible: true       # try to deliver as a Telegram voice bubble

    mlx-kokoro:
      type: command
      command: "python -m mlx_kokoro --in {input_path} --out {output_path} --voice {voice}"
      voice: af_sky
      output_format: wav

    piper-custom:                  # native Piper also supports custom.onnx via tts.piper.voice
      type: command
      command: "piper -m /path/to/custom.onnx -f {output_path} < {input_path}"
      output_format: wav

Пример: Дубао (китайское семя-tts-2.0)

Для высококачественного китайского TTS через API двунаправленной потоковой передачи ByteDance seed-tts-2.0 установите пакет PyPI doubao-speech и подключите его в качестве поставщика команд:

pip install doubao-speech
export VOLCENGINE_APP_ID="your-app-id"
export VOLCENGINE_ACCESS_TOKEN="your-access-token"
tts:
  provider: doubao
  providers:
    doubao:
      type: command
      command: "doubao-speech say --text-file {input_path} --out {output_path}"
      output_format: mp3
      max_text_length: 1024
      timeout: 30

Учетные данные берутся из вашей среды оболочки (VOLCENGINE_APP_ID/VOLCENGINE_ACCESS_TOKEN) или ~/.doubao-speech/config.yaml. Выберите голос, добавив к команде --voice zh-female-warm (или любой другой псевдоним из doubao-speech list-voices). doubao-speech также включает потоковую передачу ASR — см. раздел STT ниже для интеграции с Hermes. Исходный код и полная документация: github.com/Hypnus-Yuan/doubao-speech.

Заполнители

Ваш шаблон команды может ссылаться на эти заполнители. Hermes заменяет их во время рендеринга и заключает каждое значение в кавычки для окружающего контекста (голые/одинарные/двойные кавычки), поэтому пути с пробелами и другими символами, чувствительными к оболочке, безопасны.

Заполнитель Значение
{input_path} Путь к временному текстовому файлу UTF-8 Гермес написал
{text_path} Псевдоним {input_path}
{output_path} Путь, куда команда должна записать аудио
{формат} mp3/wav/ogg/flac
{голос} tts.providers.<имя>.voice, пусто, если не установлено
{модель} tts.providers.<имя>.модель
{скорость} Разрешенный множитель скорости (поставщик или глобальный)

Используйте {{ и }} для буквальных скобок.

Дополнительные клавиши

Ключ По умолчанию Значение
тайм-аут 120 Секунды; дерево процессов уничтожается по истечении срока действия (Unix killpg, Windows taskkill /T).
выходной_формат mp3 Один из mp3/wav/ogg/flac. Автоматически выводится из выходного расширения, если Гермес выбирает путь.
voice_совместимый ложь Если установлено значение true, Hermes преобразует выходные данные MP3/WAV в Opus/OGG через ffmpeg, поэтому Telegram отображает голосовой пузырь.
max_text_length 5000 Ввод усекается до этой длины перед обработкой команды.
голос / модель пустой Передаются команде только как значения-заполнители.

Замечания по поведению

Безопасность

Поставщики командного типа запускают любую настроенную вами команду оболочки с разрешениями вашего пользователя. Hermes цитирует значения-заполнители и применяет настроенный тайм-аут, но сам шаблон команды является доверенным локальным вводом — относитесь к нему так же, как к сценарию оболочки в вашем PATH.

Транскрипция голосовых сообщений (STT)

Голосовые сообщения, отправленные в Telegram, Discord, WhatsApp, Slack или Signal, автоматически расшифровываются и вставляются в разговор в виде текста. Агент видит стенограмму как обычный текст.

Провайдер Качество Стоимость API-ключ
Локальный шепот (по умолчанию) Хорошо Бесплатно Ничего не нужно
API Грока Шепота Хорошо–Лучший Уровень бесплатного пользования GROQ_API_KEY
API OpenAI Whisper Хорошо–Лучший Платный VOICE_TOOLS_OPENAI_KEY или OPENAI_API_KEY
Локальная транскрипция работает «из коробки», если установлен «faster-whisper». Если это недоступно, Hermes также может использовать локальный CLI whisper из общих мест установки (например, /opt/homebrew/bin) или пользовательскую команду через HERMES_LOCAL_STT_COMMAND.
### Конфигурация
# In ~/.hermes/config.yaml
stt:
  provider: "local"           # "local" | "groq" | "openai" | "mistral" | "xai"
  local:
    model: "base"             # tiny, base, small, medium, large-v3
  openai:
    model: "whisper-1"        # whisper-1, gpt-4o-mini-transcribe, gpt-4o-transcribe
  mistral:
    model: "voxtral-mini-latest"  # voxtral-mini-latest, voxtral-mini-2602
  xai:
    model: "grok-stt"         # xAI Grok STT

Сведения о поставщике

Локальный (faster-whisper) — Whisper запускается локально через faster-whisper. По умолчанию используется процессор, графический процессор, если доступен. Размеры модели:

Модель Размер Скорость Качество
крошечный ~75 МБ Самый быстрый Базовый
база ~150 МБ Быстро Хорошо (по умолчанию)
маленький ~500 МБ Средний Лучше
средний ~1,5 ГБ Медленнее Отлично
большой-v3 ~3 ГБ Самый медленный Лучшее

Groq API — требуется GROQ_API_KEY. Хороший запасной вариант в облаке, если вам нужен бесплатный вариант STT с хостингом.

OpenAI API — сначала принимает VOICE_TOOLS_OPENAI_KEY и возвращается к OPENAI_API_KEY. Поддерживает «whisper-1», «gpt-4o-mini-transcribe» и «gpt-4o-transcribe».

Mistral API (Voxtral Transcribe) — требуется MISTRAL_API_KEY. Использует модели Mistral Voxtral Transcribe. Поддерживает 13 языков, дневникизацию говорящих и временные метки на уровне слов. Установите с помощью pip install hermes-agent[mistral].

xAI Grok STT — требуется XAI_API_KEY. Сообщения в https://api.x.ai/v1/stt в формате multipart/form-data. Хороший выбор, если вы уже используете xAI для чата или TTS и вам нужен один ключ API для всего. Порядок автоматического обнаружения ставит его после Groq — явно задайте stt.provider: xai, чтобы принудительно установить его.

Пользовательский локальный резервный вариант CLI — установите HERMES_LOCAL_STT_COMMAND, если вы хотите, чтобы Hermes вызывал локальную команду транскрипции напрямую. Шаблон команды поддерживает заполнители {input_path}, {output_dir}, {language} и {model}. Ваша команда должна записать транскрипт .txt где-нибудь под {output_dir}.

Пример: Doubao/Volcengine ASR

Если вы используете doubao-speech для Doubao TTS (см. выше), тот же пакет обрабатывает преобразование речи в текст через поверхность STT локальной команды:

pip install doubao-speech
export VOLCENGINE_APP_ID="your-app-id"
export VOLCENGINE_ACCESS_TOKEN="your-access-token"
export HERMES_LOCAL_STT_COMMAND='doubao-speech transcribe {input_path} --out {output_dir}/transcript.txt'
stt:
  provider: local_command

Hermes записывает входящее голосовое сообщение в {input_path}, запускает команду и читает файл .txt, созданный в {output_dir}. Язык автоматически определяется конечной точкой большой модели Volcengine.

Резервное поведение

Если настроенный вами провайдер недоступен, Hermes автоматически отступит: - Локальный fast-whisper недоступен → пробует локальный CLI whisper или HERMES_LOCAL_STT_COMMAND перед облачными провайдерами. - Ключ Groq не установлен → Возвращается к локальной транскрипции, затем OpenAI - Ключ OpenAI не установлен → Возвращается к локальной транскрипции, затем Groq - Ключ Mistral/SDK не установлен → Пропускается при автоматическом обнаружении; переходит к следующему доступному провайдеру - Ничего недоступно → Голосовые сообщения передаются пользователю с точными примечаниями.