Синтез мовлення з тексту (TTS)

Mayros може конвертувати вихідні відповіді в аудіо за допомогою ElevenLabs, OpenAI або Edge TTS. Це працює скрізь, де Mayros може надсилати аудіо; Telegram отримує круглий бульбашку голосової нотатки.

Підтримувані сервіси

  • ElevenLabs (основний або резервний провайдер)
  • OpenAI (основний або резервний провайдер; також використовується для підсумків)
  • Edge TTS (основний або резервний провайдер; використовує node-edge-tts, за замовчуванням, коли немає API-ключів)

Примітки Edge TTS

Edge TTS використовує онлайн-сервіс нейронного TTS Microsoft Edge через бібліотеку node-edge-tts. Це хостинговий сервіс (не локальний), використовує кінцеві точки Microsoft та не вимагає API-ключа. node-edge-tts надає параметри конфігурації мовлення та формати виводу, але не всі параметри підтримуються сервісом Edge.

Оскільки Edge TTS — це публічний веб-сервіс без опублікованого SLA або квоти, розглядайте його як сервіс найкращих зусиль. Якщо вам потрібні гарантовані ліміти та підтримка, використовуйте OpenAI або ElevenLabs. REST API мовлення Microsoft документує ліміт аудіо 10 хвилин на запит; Edge TTS не публікує ліміти, тому припускайте подібні або нижчі ліміти.

Необов'язкові ключі

Якщо ви хочете OpenAI або ElevenLabs:

  • ELEVENLABS_API_KEY (або XI_API_KEY)
  • OPENAI_API_KEY

Edge TTS не вимагає API-ключа. Якщо не знайдено API-ключів, Mayros за замовчуванням використовує Edge TTS (якщо не вимкнено через messages.tts.edge.enabled=false).

Якщо налаштовано кілька провайдерів, обраний провайдер використовується першим, а інші є резервними варіантами. Автопідсумок використовує налаштовану summaryModel (або agents.defaults.model.primary), тому цей провайдер також повинен бути автентифікований, якщо ви вмикаєте підсумки.

Посилання на сервіси

Чи увімкнено за замовчуванням?

Ні. Авто-TTS вимкнено за замовчуванням. Увімкніть його в конфігурації за допомогою messages.tts.auto або для кожної сесії за допомогою /tts always (псевдонім: /tts on).

Edge TTS увімкнено за замовчуванням після ввімкнення TTS та використовується автоматично, коли немає доступних API-ключів OpenAI або ElevenLabs.

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

Конфігурація TTS знаходиться під messages.tts в mayros.json. Повна схема в Конфігурація Gateway.

Мінімальна конфігурація (увімкнути + провайдер)

json5
{
  messages: {
    tts: {
      auto: "always",
      provider: "elevenlabs",
    },
  },
}

OpenAI основний з ElevenLabs резервним

json5
{
  messages: {
    tts: {
      auto: "always",
      provider: "openai",
      summaryModel: "openai/gpt-4.1-mini",
      modelOverrides: {
        enabled: true,
      },
      openai: {
        apiKey: "openai_api_key",
        model: "gpt-4o-mini-tts",
        voice: "alloy",
      },
      elevenlabs: {
        apiKey: "elevenlabs_api_key",
        baseUrl: "https://api.elevenlabs.io",
        voiceId: "voice_id",
        modelId: "eleven_multilingual_v2",
        seed: 42,
        applyTextNormalization: "auto",
        languageCode: "en",
        voiceSettings: {
          stability: 0.5,
          similarityBoost: 0.75,
          style: 0.0,
          useSpeakerBoost: true,
          speed: 1.0,
        },
      },
    },
  },
}

Edge TTS основний (без API-ключа)

json5
{
  messages: {
    tts: {
      auto: "always",
      provider: "edge",
      edge: {
        enabled: true,
        voice: "en-US-MichelleNeural",
        lang: "en-US",
        outputFormat: "audio-24khz-48kbitrate-mono-mp3",
        rate: "+10%",
        pitch: "-5%",
      },
    },
  },
}

Вимкнути Edge TTS

json5
{
  messages: {
    tts: {
      edge: {
        enabled: false,
      },
    },
  },
}

Власні ліміти + шлях налаштувань

json5
{
  messages: {
    tts: {
      auto: "always",
      maxTextLength: 4000,
      timeoutMs: 30000,
      prefsPath: "~/.mayros/settings/tts.json",
    },
  },
}

Відповідати лише аудіо після вхідної голосової нотатки

json5
{
  messages: {
    tts: {
      auto: "inbound",
    },
  },
}

Вимкнути автопідсумок для довгих відповідей

json5
{
  messages: {
    tts: {
      auto: "always",
    },
  },
}

Потім запустіть:

/tts summary off

Примітки щодо полів

  • auto: режим авто-TTS (off, always, inbound, tagged).
    • inbound надсилає аудіо лише після вхідної голосової нотатки.
    • tagged надсилає аудіо лише тоді, коли відповідь включає теги [[tts]].
  • enabled: застарілий перемикач (doctor мігрує це до auto).
  • mode: "final" (за замовчуванням) або "all" (включає відповіді інструментів/блоків).
  • provider: "elevenlabs", "openai" або "edge" (резервний автоматичний).
  • Якщо provider не встановлено, Mayros віддає перевагу openai (якщо ключ), потім elevenlabs (якщо ключ), інакше edge.
  • summaryModel: необов'язкова дешева модель для автопідсумку; за замовчуванням agents.defaults.model.primary.
    • Приймає provider/model або налаштований псевдонім моделі.
  • modelOverrides: дозволити моделі випромінювати директиви TTS (увімкнено за замовчуванням).
    • allowProvider за замовчуванням false (перемикання провайдера є опціональним).
  • maxTextLength: жорстке обмеження для вводу TTS (символи). /tts audio не вдається, якщо перевищено.
  • timeoutMs: тайм-аут запиту (мс).
  • prefsPath: замінити локальний шлях JSON налаштувань (провайдер/ліміт/підсумок).
  • Значення apiKey повертаються до змінних env (ELEVENLABS_API_KEY/XI_API_KEY, OPENAI_API_KEY).
  • elevenlabs.baseUrl: замінити базовий URL API ElevenLabs.
  • elevenlabs.voiceSettings:
    • stability, similarityBoost, style: 0..1
    • useSpeakerBoost: true|false
    • speed: 0.5..2.0 (1.0 = нормальна)
  • elevenlabs.applyTextNormalization: auto|on|off
  • elevenlabs.languageCode: 2-літерний ISO 639-1 (наприклад, en, de)
  • elevenlabs.seed: ціле число 0..4294967295 (детермінізм найкращих зусиль)
  • edge.enabled: дозволити використання Edge TTS (за замовчуванням true; без API-ключа).
  • edge.voice: ім'я нейронного голосу Edge (наприклад, en-US-MichelleNeural).
  • edge.lang: код мови (наприклад, en-US).
  • edge.outputFormat: формат виводу Edge (наприклад, audio-24khz-48kbitrate-mono-mp3).
    • Дивіться формати виводу мовлення Microsoft для дійсних значень; не всі формати підтримуються Edge.
  • edge.rate / edge.pitch / edge.volume: рядки відсотків (наприклад, +10%, -5%).
  • edge.saveSubtitles: записати JSON субтитри разом з аудіофайлом.
  • edge.proxy: URL проксі для запитів Edge TTS.
  • edge.timeoutMs: заміна тайм-ауту запиту (мс).

Заміни, керовані моделлю (за замовчуванням увімкнено)

За замовчуванням модель може випромінювати директиви TTS для однієї відповіді. Коли messages.tts.auto є tagged, ці директиви необхідні для запуску аудіо.

Коли ввімкнено, модель може випромінювати директиви [[tts:...]] для заміни голосу для однієї відповіді, плюс необов'язковий блок [[tts:text]]...[[/tts:text]] для надання виразних тегів (сміх, підказки співу тощо), які повинні з'являтися лише в аудіо.

Директиви provider=... ігноруються, якщо modelOverrides.allowProvider: true.

Приклад корисного навантаження відповіді:

Ось вам.

[[tts:voiceId=pMsXgVXv3BLzUgSXRplE model=eleven_v3 speed=1.1]]
[[tts:text]](сміється) Прочитай пісню ще раз.[[/tts:text]]

Доступні ключі директив (коли ввімкнено):

  • provider (openai | elevenlabs | edge, вимагає allowProvider: true)
  • voice (голос OpenAI) або voiceId (ElevenLabs)
  • model (модель TTS OpenAI або ідентифікатор моделі ElevenLabs)
  • stability, similarityBoost, style, speed, useSpeakerBoost
  • applyTextNormalization (auto|on|off)
  • languageCode (ISO 639-1)
  • seed

Вимкнути всі заміни моделі:

json5
{
  messages: {
    tts: {
      modelOverrides: {
        enabled: false,
      },
    },
  },
}

Необов'язковий список дозволів (увімкнути перемикання провайдера, зберігаючи інші регулятори налаштовуваними):

json5
{
  messages: {
    tts: {
      modelOverrides: {
        enabled: true,
        allowProvider: true,
        allowSeed: false,
      },
    },
  },
}

Налаштування для кожного користувача

Команди слеш записують локальні заміни до prefsPath (за замовчуванням: ~/.mayros/settings/tts.json, заміна з MAYROS_TTS_PREFS або messages.tts.prefsPath).

Збережені поля:

  • enabled
  • provider
  • maxLength (поріг підсумку; за замовчуванням 1500 символів)
  • summarize (за замовчуванням true)

Ці замінюють messages.tts.* для цього хоста.

Формати виводу (фіксовані)

  • Telegram: Opus голосова нотатка (opus_48000_64 від ElevenLabs, opus від OpenAI).
    • 48kHz / 64kbps — це хороший компроміс голосової нотатки, необхідний для круглої бульбашки.
  • Інші канали: MP3 (mp3_44100_128 від ElevenLabs, mp3 від OpenAI).
    • 44.1kHz / 128kbps — це баланс за замовчуванням для чіткості мовлення.
  • Edge TTS: використовує edge.outputFormat (за замовчуванням audio-24khz-48kbitrate-mono-mp3).
    • node-edge-tts приймає outputFormat, але не всі формати доступні від сервісу Edge.
    • Значення формату виводу слідують форматам виводу мовлення Microsoft (включаючи Ogg/WebM Opus).
    • sendVoice Telegram приймає OGG/MP3/M4A; використовуйте OpenAI/ElevenLabs, якщо вам потрібні гарантовані голосові нотатки Opus.
    • Якщо налаштований формат виводу Edge не вдається, Mayros повторює спробу з MP3.

Формати OpenAI/ElevenLabs фіксовані; Telegram очікує Opus для UX голосової нотатки.

Поведінка авто-TTS

Коли ввімкнено, Mayros:

  • пропускає TTS, якщо відповідь вже містить медіа або директиву MEDIA:.
  • пропускає дуже короткі відповіді (< 10 символів).
  • підсумовує довгі відповіді, коли ввімкнено, використовуючи agents.defaults.model.primary (або summaryModel).
  • прикріплює згенероване аудіо до відповіді.

Якщо відповідь перевищує maxLength та підсумок вимкнено (або немає API-ключа для моделі підсумку), аудіо пропускається, і надсилається звичайна текстова відповідь.

Діаграма потоку

Відповідь -> TTS увімкнено?
  ні  -> надіслати текст
  так -> має медіа / MEDIA: / коротка?
          так -> надіслати текст
          ні  -> довжина > ліміт?
                   ні  -> TTS -> прикріпити аудіо
                   так -> підсумок увімкнено?
                            ні  -> надіслати текст
                            так -> підсумувати (summaryModel або agents.defaults.model.primary)
                                      -> TTS -> прикріпити аудіо

Використання команди слеш

Є одна команда: /tts. Дивіться Команди слеш для деталей увімкнення.

Примітка Discord: /tts — це вбудована команда Discord, тому Mayros реєструє /voice як нативну команду там. Текст /tts ... все ще працює.

/tts off
/tts always
/tts inbound
/tts tagged
/tts status
/tts provider openai
/tts limit 2000
/tts summary off
/tts audio Привіт від Mayros

Примітки:

  • Команди вимагають авторизованого відправника (правила списку дозволів/власника все ще застосовуються).
  • commands.text або нативна реєстрація команди має бути ввімкнена.
  • off|always|inbound|tagged — це перемикачі для кожної сесії (/tts on є псевдонімом для /tts always).
  • limit та summary зберігаються в локальних налаштуваннях, а не в основній конфігурації.
  • /tts audio генерує одноразову аудіовідповідь (не перемикає TTS).

Інструмент агента

Інструмент tts конвертує текст у мовлення та повертає шлях MEDIA:. Коли результат сумісний з Telegram, інструмент включає [[audio_as_voice]], щоб Telegram надіслав голосову бульбашку.

Gateway RPC

Методи Gateway:

  • tts.status
  • tts.enable
  • tts.disable
  • tts.convert
  • tts.setProvider
  • tts.providers