All apps · 0 apps
Faster-Qwen3-TTS-Wyoming
Docker app from AgrestisDavid's Repository
Overview
Readme
View on GitHubFaster Qwen3-TTS + Wyoming
Run a local Faster Qwen3-TTS WebUI, OpenAI-compatible TTS API, and Wyoming TTS server in one NVIDIA-enabled Docker container. It supports Docker Compose, Portainer, and Unraid. The HTTP and Wyoming interfaces share a single loaded model instance.
| Interface | Default address | Intended use |
|---|---|---|
| Gradio WebUI | http://HOST-IP:7860/ui/ |
Test voices and generation settings |
| OpenAI-compatible API | http://HOST-IP:7860/v1/audio/speech |
OpenAI-compatible TTS clients |
| Wyoming TTS | HOST-IP:10210 |
Home Assistant and Wyoming clients |
Architecture
Faster-Qwen3-TTS-Wyoming
├── Qwen3-TTS API + WebUI :7860
└── Wyoming TTS :10210
└── HTTP -> 127.0.0.1:7860/v1/audio/speech
The container starts Qwen3-TTS first, waits for its health endpoint, and then opens the Wyoming port. If either managed process exits unexpectedly, the launcher terminates the other process and exits with an error so Docker can restart the complete app.
Requirements
- Linux AMD64 Docker host
- Docker Engine with Docker Compose or a Docker Standalone Portainer environment
- CUDA-capable NVIDIA GPU
- NVIDIA driver and NVIDIA Container Toolkit
- approximately 8 GB of VRAM recommended for the default 1.7B model
- internet access during the first model download
The 0.6B model uses less VRAM and is a better starting point for smaller GPUs.
Models are downloaded at first start and persisted under /config.
Before deploying, verify that Docker can access the GPU:
docker run --rm --gpus all nvidia/cuda:12.9.0-base-ubuntu22.04 nvidia-smi
Models
Choose one CustomVoice model:
| Compose file | Model | Use case |
|---|---|---|
compose.1.7b.yaml |
Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice |
Default; higher quality |
compose.0.6b.yaml |
Qwen/Qwen3-TTS-12Hz-0.6B-CustomVoice |
Lower VRAM use and faster startup |
Both models support the same CustomVoice speakers:
aiden, dylan, eric, ono_anna, ryan, serena, sohee, uncle_fu, vivian
The two Compose files use the same ports and must not run simultaneously on the same host.
Docker Compose
Clone the repository and start one model variant:
git clone https://github.com/agrestisdavid/faster-qwen3-tts-wyoming.git
cd faster-qwen3-tts-wyoming
# Higher-quality 1.7B model
docker compose -f compose.1.7b.yaml up -d
# Or the lower-VRAM 0.6B model
docker compose -f compose.0.6b.yaml up -d
Edit the selected Compose file to customize the timezone, user and group IDs, voice, language, or instruction.
Check the stack:
docker compose -f compose.1.7b.yaml ps
docker compose -f compose.1.7b.yaml logs -f qwen3-tts
Update the pinned image after the repository publishes a newer version:
git pull
docker compose -f compose.1.7b.yaml pull
docker compose -f compose.1.7b.yaml up -d
Switch models without deleting the persistent model cache:
docker compose -f compose.1.7b.yaml down
docker compose -f compose.0.6b.yaml up -d
Both files use the same named /config volume when deployed from the same
directory and Compose project. Do not add --volumes to docker compose down
unless you intentionally want to delete downloaded models and application data.
Portainer
GPU assignment in Portainer is supported for NVIDIA GPUs on Docker Standalone environments. Configure NVIDIA support for the Docker host before deploying the stack.
- Open Stacks, select Add stack, and choose Repository.
- Set the repository URL to
https://github.com/agrestisdavid/faster-qwen3-tts-wyoming. - Set the Compose path to either
compose.1.7b.yamlorcompose.0.6b.yaml. - Deploy the stack and allow the initial model download to finish.
- Open
http://HOST-IP:7860/ui/.
Use only one model file per host unless you assign different ports and volumes. Keep the same Portainer stack name and do not remove its named volume when switching models.
See the Portainer GPU documentation and the Docker Compose GPU documentation for host-level GPU setup.
Install on Unraid
Unraid additionally requires version 6.12 or newer and the NVIDIA Driver plugin.
- Open Apps and search for
Faster Qwen3-TTS Wyoming. - Verify the appdata path, WebUI port
7860, and Wyoming port10210. - Select the desired model and keep the NVIDIA runtime settings enabled.
- Start the container and allow the initial model download to finish.
- Open
http://UNRAID-IP:7860/ui/.
The template can also be installed manually:
https://raw.githubusercontent.com/agrestisdavid/faster-qwen3-tts-wyoming/main/templates/faster-qwen3-tts-wyoming.xml
Unraid stores the persistent cache under
/mnt/user/appdata/faster-qwen3-tts-wyoming.
Default Settings
{
"model": "Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice",
"voice": "sohee",
"language": "english",
"temperature": 0.5,
"top_p": 0.3,
"top_k": 150,
"repetition_penalty": 1.3,
"do_sample": true,
"seed": 0,
"max_new_tokens": 4096,
"non_streaming_mode": false,
"streaming_chunk_size": 120,
"token_safety_margin": 8.0,
"max_segment_chars": 500,
"segment_pause_ms": 120,
"instruct": "Speak naturally, clearly, and warmly in English. Use a calm, fluent pace, lively but restrained prosody, and natural sentence pauses. Articulate sibilants and numbers clearly. Avoid monotonous intonation, exaggerated emotion, and dramatic pitch changes."
}
The language, voice, instruction, sampling, streaming, and segmentation values can be changed in the Compose environment or Unraid template. Existing container settings continue to override these image defaults after an update.
OpenAI-Compatible API
Use the base URL http://HOST-IP:7860/v1 with clients that support an
OpenAI-compatible text-to-speech provider.
Base URL: http://HOST-IP:7860/v1
Model: tts-1
Voice: sohee
Generate WAV audio:
curl http://HOST-IP:7860/v1/audio/speech \
-H "Content-Type: application/json" \
-d '{"model":"tts-1","input":"This is a text-to-speech test.","voice":"sohee","language":"english","response_format":"wav"}' \
--output qwen-test.wav
Stream raw 24 kHz mono PCM16:
curl http://HOST-IP:7860/v1/audio/speech \
-H "Content-Type: application/json" \
-d '{"model":"tts-1","input":"This audio is streamed as PCM.","voice":"sohee","language":"english","response_format":"pcm","stream":true}' \
--output qwen-test.pcm
Additional endpoints:
curl http://HOST-IP:7860/health
curl http://HOST-IP:7860/v1/voices
Home Assistant
In Home Assistant, open Settings -> Devices & services, add the Wyoming Protocol integration, and connect it to:
Host: HOST-IP
Port: 10210
The configured language is advertised to Wyoming clients automatically.
Troubleshooting
- First startup can take several minutes while the model downloads and loads.
- If the container is unhealthy, inspect its logs and verify that the NVIDIA GPU is visible inside the container.
- If the 1.7B model runs out of VRAM, switch
QWEN3_TTS_MODELto the 0.6B CustomVoice model and restart the container. - If a port is already in use, change the corresponding host port in the Compose file, Portainer stack, or Unraid template.
Security
The WebUI and API do not include authentication. Publish their ports only on a trusted LAN or behind an authenticated reverse proxy. The container does not run in privileged mode.
License and Upstream Projects
The integration code, Compose files, and Unraid template in this repository are licensed under the MIT License. Models and upstream dependencies retain their own licenses:
- QwenLM/Qwen3-TTS
- Qwen3-TTS 1.7B CustomVoice model card
- Qwen3-TTS 0.6B CustomVoice model card
- Faster Qwen3-TTS
- qwentts-cpp-python
- OHF-Voice Wyoming protocol
See CONTRIBUTING.md for development and validation instructions.
Install Faster-Qwen3-TTS-Wyoming on Unraid in a few clicks.
Find Faster-Qwen3-TTS-Wyoming in Community Apps on your Unraid server, review the template, and click Install. Unraid handles the Docker app or plugin setup from the published template.
Requirements
Categories
Related apps
Explore more like this
Explore allDetails
ghcr.io/agrestisdavid/faster-qwen3-tts-wyoming:latestRuntime arguments
- Web UI
http://[IP]:[PORT:7860]/ui/- Network
bridge- Shell
bash- Privileged
- false
- Extra Params
--runtime=nvidia --gpus all
Template configuration
Gradio WebUI and OpenAI-compatible TTS API.
- Target
- 7860
- Default
- 7860
Wyoming protocol endpoint for Home Assistant.
- Target
- 10210
- Default
- 10210
Persistent Hugging Face, Gradio, and Torch caches.
- Target
- /config
- Default
- /mnt/user/appdata/faster-qwen3-tts-wyoming
Hugging Face model identifier. Use Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice for the default quality profile or Qwen/Qwen3-TTS-12Hz-0.6B-CustomVoice for lower VRAM usage.
- Target
- QWEN3_TTS_MODEL
- Default
- Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice
Default CustomVoice speaker. Supported: aiden, dylan, eric, ono_anna, ryan, serena, sohee, uncle_fu, vivian.
- Target
- QWEN3_TTS_DEFAULT_VOICE
- Default
- sohee
Qwen synthesis language.
- Target
- QWEN3_TTS_LANGUAGE
- Default
- english
Default instruction applied to TTS requests without their own instruction.
- Target
- QWEN3_TTS_STYLE_INSTRUCTION
- Default
- Speak naturally, clearly, and warmly in English. Use a calm, fluent pace, lively but restrained prosody, and natural sentence pauses. Articulate sibilants and numbers clearly. Avoid monotonous intonation, exaggerated emotion, and dramatic pitch changes.
Sampling temperature. Lower values are calmer and more stable.
- Target
- QWEN3_TTS_TEMPERATURE
- Default
- 0.5
Nucleus sampling probability.
- Target
- QWEN3_TTS_TOP_P
- Default
- 0.3
Number of token candidates used during sampling.
- Target
- QWEN3_TTS_TOP_K
- Default
- 150
Penalty used to reduce repeated speech artifacts.
- Target
- QWEN3_TTS_REPETITION_PENALTY
- Default
- 1.3
Enable stochastic token sampling.
- Target
- QWEN3_TTS_DO_SAMPLE
- Default
- true
Default random seed for reproducible requests.
- Target
- QWEN3_TTS_SEED
- Default
- 0
Upper generation limit per text segment.
- Target
- QWEN3_TTS_MAX_NEW_TOKENS
- Default
- 4096
Keep false for incremental PCM generation.
- Target
- QWEN3_TTS_NON_STREAMING_MODE
- Default
- false
Model token chunk size used for streaming output.
- Target
- QWEN3_TTS_STREAMING_CHUNK_SIZE
- Default
- 120
Multiplier used when estimating the segment token budget.
- Target
- QWEN3_TTS_TOKEN_SAFETY_MARGIN
- Default
- 8.0
Long text is split into bounded segments at natural boundaries.
- Target
- QWEN3_TTS_MAX_SEGMENT_CHARS
- Default
- 500
Silence inserted between long-text segments.
- Target
- QWEN3_TTS_SEGMENT_PAUSE_MS
- Default
- 120
Maximum queued synthesis requests.
- Target
- QWEN3_TTS_QUEUE_MAX_PENDING
- Default
- 8
Faster Qwen3-TTS inference backend.
- Target
- QWEN3_TTS_BACKEND
- Default
- ggml
Inference device. The default image is intended for CUDA.
- Target
- QWEN3_TTS_DEVICE
- Default
- cuda
Torch model dtype.
- Target
- QWEN3_TTS_DTYPE
- Default
- bfloat16
Torch attention implementation.
- Target
- QWEN3_TTS_ATTN_IMPLEMENTATION
- Default
- sdpa
Quantization passed to the GGML backend.
- Target
- QWEN3_TTS_QUANT
- Default
- BF16
Always synthesize using the configured language.
- Target
- QWEN3_TTS_FORCE_LANGUAGE
- Default
- true
Maximum first-start model download and initialization time.
- Target
- QWEN3_TTS_STARTUP_TIMEOUT_SECONDS
- Default
- 1800
Host user ID used for appdata files.
- Default
- 99
Host group ID used for appdata files.
- Default
- 100
File creation mask.
- Default
- 022
Container timezone.
- Target
- TZ
- Default
- UTC
NVIDIA GPU selection.
- Target
- NVIDIA_VISIBLE_DEVICES
- Default
- all
Required NVIDIA driver capabilities.
- Target
- NVIDIA_DRIVER_CAPABILITIES
- Default
- compute,utility