Text-to-Speech (Local Engines)
TomoriBot treats speech as a custom endpoint capability. Local engines run outside the bot as HTTP servers and implement POST /synthesize; most clone engines receive text plus the configured reference audio sample.
Available Engines
Setup Flow
- Pick one engine from the cards above and start its wrapper from
servers/tts/. - Register it with
/provider custom-endpoint addusing capabilityspeechand api styletts-clone. - In the registration modal, choose the voice source mode and script markup listed in that engine’s guide.
Registration makes the endpoint active immediately. Use /model speech later only when switching between registered TTS endpoints.
Persona Voice Flow
For clone engines, add and assign one voice sample per persona:
- Prepare a clean 10-20 second clip with one speaker and no background music.
- Run
/speech voice-addand upload the sample. Any audio format is accepted; TomoriBot converts it to mono WAV. - Run
/speech voice-assign, then choose the persona and voice sample.
For Qwen3-TTS VoiceDesign, skip the audio sample and run /speech voice-design set for each persona instead.
ElevenLabs users should use /speech elevenlabs; it registers the speech and transcription endpoints together.
TomoriBot strips Discord custom emoji syntax such as :pepega: or <:pepega:123456789012345678> from generated voice scripts before synthesis. Unicode emojis are also stripped unless the speech endpoint uses emoji markup, which is intended for IrodoriTTS.
Hardware requirements
Local TTS engines are much lighter than an LLM — these are small models (roughly 0.5B–1.7B parameters). Even a modest NVIDIA GPU (a few GB of VRAM is plenty) runs any of them comfortably and keeps synthesis fast. They also run on CPU — slower, but workable, since voice clips are short.
| Engine | Model size | Notes |
|---|---|---|
| Chatterbox | ~0.5B (Turbo) | Fastest current option. |
| Qwen3-TTS | 1.7B (12 Hz) | Separate clone + VoiceDesign models; only one loads at a time. |
| IrodoriTTS | 500M (v2) | Japanese-focused; bf16 on GPU, fp32 on CPU. |
The first synthesis after startup (or after Qwen3-TTS swaps models in auto mode) is slower
while the model loads into memory; later requests are fast. TomoriBot waits up to
TTS_SYNTHESIZE_TIMEOUT_MS (default 240000 ms) for each response.