Text-to-speech (TTS)

Mayros สามารถแปลงการตอบกลับขาออกเป็นเสียงโดยใช้ ElevenLabs, OpenAI หรือ Edge TTS มันทำงานได้ทุกที่ที่ Mayros สามารถส่งเสียงได้ Telegram ได้ฟองเสียงโน้ตกลม

บริการที่รองรับ

  • ElevenLabs (ผู้ให้บริการหลักหรือ fallback)
  • OpenAI (ผู้ให้บริการหลักหรือ fallback ใช้สำหรับการสรุปด้วย)
  • Edge TTS (ผู้ให้บริการหลักหรือ fallback ใช้ node-edge-tts, ค่าเริ่มต้นเมื่อไม่มี API keys)

หมายเหตุ Edge TTS

Edge TTS ใช้บริการ TTS neural ออนไลน์ของ Microsoft Edge ผ่านไลบรารี node-edge-tts มันเป็นบริการโฮสต์ (ไม่ใช่โลคัล) ใช้ endpoint ของ Microsoft และ ไม่ต้องการ API key node-edge-tts เปิดเผยตัวเลือกการตั้งค่าคำพูดและ รูปแบบเอาต์พุต แต่ไม่ใช่ทุกตัวเลือกที่รองรับโดยบริการ Edge

เนื่องจาก Edge TTS เป็นบริการเว็บสาธารณะที่ไม่มี SLA หรือโควต้าที่เผยแพร่ ให้ปฏิบัติต่อมัน เป็นความพยายามที่ดีที่สุด หากคุณต้องการขีดจำกัดที่รับประกันและการสนับสนุน ให้ใช้ OpenAI หรือ ElevenLabs Microsoft Speech REST API กำหนดขีดจำกัดเสียง 10 นาทีต่อคำขอ Edge TTS ไม่เผยแพร่ขีดจำกัด ดังนั้นให้สมมติขีดจำกัดที่คล้ายกันหรือต่ำกว่า

Keys ตัวเลือก

หากคุณต้องการ OpenAI หรือ ElevenLabs:

  • ELEVENLABS_API_KEY (หรือ XI_API_KEY)
  • OPENAI_API_KEY

Edge TTS ไม่ ต้องการ API key หากไม่พบ API keys Mayros ใช้ค่าเริ่มต้น เป็น Edge TTS (เว้นแต่ปิดใช้งานผ่าน messages.tts.edge.enabled=false)

หากมีการกำหนดค่าหลายผู้ให้บริการ ผู้ให้บริการที่เลือกจะถูกใช้ก่อนและอื่นๆ เป็นตัวเลือก fallback Auto-summary ใช้ summaryModel ที่กำหนดค่า (หรือ agents.defaults.model.primary) ดังนั้นผู้ให้บริการนั้นต้องได้รับการพิสูจน์ตัวตนด้วยหากคุณเปิดใช้งานการสรุป

ลิงก์บริการ

เปิดใช้งานตามค่าเริ่มต้นหรือไม่?

ไม่ TTS อัตโนมัติ ปิด ตามค่าเริ่มต้น เปิดใช้งานในการตั้งค่าด้วย messages.tts.auto หรือต่อเซสชันด้วย /tts always (นามแฝง: /tts on)

Edge TTS เปิดใช้งาน ตามค่าเริ่มต้นเมื่อ TTS เปิด และใช้อัตโนมัติ เมื่อไม่มี API keys OpenAI หรือ ElevenLabs

การตั้งค่า

การตั้งค่า TTS อยู่ภายใต้ messages.tts ใน mayros.json สคีมาเต็มอยู่ใน การตั้งค่า Gateway

การตั้งค่าขั้นต่ำ (เปิดใช้งาน + ผู้ให้บริการ)

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

OpenAI หลักพร้อม ElevenLabs fallback

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 key)

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,
      },
    },
  },
}

ขีดจำกัดแบบกำหนดเอง + เส้นทาง prefs

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

ตอบกลับด้วยเสียงเฉพาะหลังจากวอยซ์โน้ตขาเข้า

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

ปิดใช้งาน auto-summary สำหรับการตอบกลับยาว

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

จากนั้นรัน:

/tts summary off

หมายเหตุเกี่ยวกับฟิลด์

  • auto: โหมด auto-TTS (off, always, inbound, tagged)
    • inbound ส่งเสียงเฉพาะหลังจากวอยซ์โน้ตขาเข้า
    • tagged ส่งเสียงเฉพาะเมื่อการตอบกลับรวม [[tts]] tags
  • enabled: toggle แบบเก่า (doctor ย้ายค่านี้เป็น auto)
  • mode: "final" (ค่าเริ่มต้น) หรือ "all" (รวม tool/block replies)
  • provider: "elevenlabs", "openai", หรือ "edge" (fallback เป็นอัตโนมัติ)
  • หาก provider ไม่ได้ตั้ง Mayros จะเลือก openai (ถ้ามี key) จากนั้น elevenlabs (ถ้ามี key) มิฉะนั้น edge
  • summaryModel: โมเดลราคาถูกสำหรับ auto-summary; ค่าเริ่มต้นเป็น agents.defaults.model.primary
    • รับ provider/model หรือ model alias ที่กำหนดค่า
  • modelOverrides: อนุญาตให้โมเดลส่ง TTS directives (เปิดตามค่าเริ่มต้น)
    • allowProvider ค่าเริ่มต้นเป็น false (การสลับผู้ให้บริการเป็น opt-in)
  • maxTextLength: ขีดจำกัดตัวอักษรสำหรับ TTS input /tts audio ล้มเหลวหากเกิน
  • timeoutMs: timeout ของคำขอ (ms)
  • prefsPath: แทนที่เส้นทาง JSON prefs ท้องถิ่น (provider/limit/summary)
  • ค่า apiKey fallback ไปยัง env vars (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: ISO 639-1 2 ตัวอักษร (เช่น en, de)
  • elevenlabs.seed: จำนวนเต็ม 0..4294967295 (determinism แบบ best-effort)
  • edge.enabled: อนุญาตการใช้ Edge TTS (ค่าเริ่มต้น true; ไม่มี API key)
  • edge.voice: ชื่อเสียง neural ของ Edge (เช่น en-US-MichelleNeural)
  • edge.lang: รหัสภาษา (เช่น en-US)
  • edge.outputFormat: รูปแบบเอาต์พุต Edge (เช่น audio-24khz-48kbitrate-mono-mp3)
    • ดู Microsoft Speech output formats สำหรับค่าที่ถูกต้อง; ไม่ใช่ทุกรูปแบบที่รองรับโดย Edge
  • edge.rate / edge.pitch / edge.volume: สตริงเปอร์เซ็นต์ (เช่น +10%, -5%)
  • edge.saveSubtitles: เขียน JSON subtitles ควบคู่กับไฟล์เสียง
  • edge.proxy: URL proxy สำหรับคำขอ Edge TTS
  • edge.timeoutMs: timeout override ของคำขอ (ms)

Model-driven overrides (เปิดตามค่าเริ่มต้น)

ตามค่าเริ่มต้น โมเดล สามารถ ส่ง TTS directives สำหรับการตอบกลับเดียว เมื่อ messages.tts.auto เป็น tagged directives เหล่านี้จำเป็นเพื่อทริกเกอร์เสียง

เมื่อเปิดใช้งาน โมเดลสามารถส่ง [[tts:...]] directives เพื่อแทนที่เสียง สำหรับการตอบกลับเดียว พร้อมบล็อก [[tts:text]]...[[/tts:text]] ตัวเลือก เพื่อให้แท็กเชิงแสดงออก (เสียงหัวเราะ, สัญญาณร้องเพลง, ฯลฯ) ที่ควรปรากฏ เฉพาะในเสียง

provider=... directives จะถูกละเว้นเว้นแต่ modelOverrides.allowProvider: true

ตัวอย่างเพย์โหลดการตอบกลับ:

Here you go.

[[tts:voiceId=pMsXgVXv3BLzUgSXRplE model=eleven_v3 speed=1.1]]
[[tts:text]](laughs) Read the song once more.[[/tts:text]]

คีย์ directive ที่ใช้ได้ (เมื่อเปิดใช้งาน):

  • provider (openai | elevenlabs | edge, ต้องการ allowProvider: true)
  • voice (เสียง OpenAI) หรือ voiceId (ElevenLabs)
  • model (โมเดล TTS ของ OpenAI หรือ model id ของ ElevenLabs)
  • stability, similarityBoost, style, speed, useSpeakerBoost
  • applyTextNormalization (auto|on|off)
  • languageCode (ISO 639-1)
  • seed

ปิดใช้งาน model overrides ทั้งหมด:

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

Allowlist ตัวเลือก (เปิดใช้งานการสลับผู้ให้บริการในขณะที่ยังคงกำหนดค่าตัวควบคุมอื่นๆ):

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

การตั้งค่าต่อผู้ใช้

คำสั่ง Slash เขียน overrides ท้องถิ่นไปยัง prefsPath (ค่าเริ่มต้น: ~/.mayros/settings/tts.json, แทนที่ด้วย MAYROS_TTS_PREFS หรือ messages.tts.prefsPath)

ฟิลด์ที่จัดเก็บ:

  • enabled
  • provider
  • maxLength (เกณฑ์การสรุป; ค่าเริ่มต้น 1500 ตัวอักษร)
  • summarize (ค่าเริ่มต้น true)

สิ่งเหล่านี้แทนที่ messages.tts.* สำหรับโฮสต์นั้น

รูปแบบเอาต์พุต (คงที่)

  • Telegram: Opus voice note (opus_48000_64 จาก ElevenLabs, opus จาก OpenAI)
    • 48kHz / 64kbps เป็นการแลกเปลี่ยนที่ดีสำหรับ voice-note และจำเป็นสำหรับฟองกลม
  • ช่องทางอื่นๆ: 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 Speech output formats (รวมถึง Ogg/WebM Opus)
    • Telegram sendVoice รับ OGG/MP3/M4A; ใช้ OpenAI/ElevenLabs หากต้องการ Opus voice notes ที่รับประกัน
    • หากรูปแบบเอาต์พุต Edge ที่กำหนดค่าล้มเหลว Mayros จะลองใหม่ด้วย MP3

รูปแบบ OpenAI/ElevenLabs เป็นค่าคงที่ Telegram คาดหวัง Opus สำหรับ voice-note UX

พฤติกรรม TTS อัตโนมัติ

เมื่อเปิดใช้งาน Mayros:

  • ข้าม TTS หากการตอบกลับมีสื่อหรือคำสั่ง MEDIA: อยู่แล้ว
  • ข้ามการตอบกลับสั้นมาก (< 10 ตัวอักษร)
  • สรุปการตอบกลับยาวเมื่อเปิดใช้งานโดยใช้ agents.defaults.model.primary (หรือ summaryModel)
  • แนบเสียงที่สร้างไปกับการตอบกลับ

หากการตอบกลับเกิน maxLength และ summary ปิดอยู่ (หรือไม่มี API key สำหรับ summary model) เสียงจะถูกข้ามและการตอบกลับข้อความปกติจะถูกส่ง

แผนภาพกระบวนการ

Reply -> TTS เปิดใช้งาน?
  ไม่  -> ส่งข้อความ
  ใช่ -> มีสื่อ / MEDIA: / สั้น?
          ใช่ -> ส่งข้อความ
          ไม่  -> ความยาว > ขีดจำกัด?
                   ไม่  -> TTS -> แนบเสียง
                   ใช่ -> summary เปิดใช้งาน?
                            ไม่  -> ส่งข้อความ
                            ใช่ -> สรุป (summaryModel หรือ agents.defaults.model.primary)
                                      -> TTS -> แนบเสียง

การใช้งานคำสั่ง Slash

มีคำสั่งเดียว: /tts ดู คำสั่ง Slash สำหรับรายละเอียดการเปิดใช้งาน

หมายเหตุ 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

หมายเหตุ:

  • คำสั่งต้องการผู้ส่งที่ได้รับอนุญาต (กฎ allowlist/owner ยังคงใช้)
  • commands.text หรือการลงทะเบียนคำสั่งเนทีฟต้องเปิดใช้งาน
  • off|always|inbound|tagged เป็น toggle ต่อเซสชัน (/tts on เป็นนามแฝงของ /tts always)
  • limit และ summary ถูกเก็บใน prefs ท้องถิ่น ไม่ใช่การตั้งค่าหลัก
  • /tts audio สร้างการตอบกลับเสียงครั้งเดียว (ไม่เปิด TTS)

เครื่องมือ Agent

เครื่องมือ tts แปลงข้อความเป็นคำพูดและส่งคืนเส้นทาง MEDIA: เมื่อ ผลลัพธ์เข้ากันได้กับ Telegram เครื่องมือรวม [[audio_as_voice]] เพื่อให้ Telegram ส่งฟองเสียง

Gateway RPC

เมธอด Gateway:

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