Faster-Qwen3-TTS-Wyoming

Faster-Qwen3-TTS-Wyoming

Docker app from AgrestisDavid's Repository

Overview

Local Faster Qwen3-TTS with a WebUI, an OpenAI-compatible streaming API, and an integrated Wyoming TTS adapter for Home Assistant. Both interfaces share one NVIDIA GPU model instance.

Faster 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.

  1. Open Stacks, select Add stack, and choose Repository.
  2. Set the repository URL to https://github.com/agrestisdavid/faster-qwen3-tts-wyoming.
  3. Set the Compose path to either compose.1.7b.yaml or compose.0.6b.yaml.
  4. Deploy the stack and allow the initial model download to finish.
  5. 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.

  1. Open Apps and search for Faster Qwen3-TTS Wyoming.
  2. Verify the appdata path, WebUI port 7860, and Wyoming port 10210.
  3. Select the desired model and keep the NVIDIA runtime settings enabled.
  4. Start the container and allow the initial model download to finish.
  5. 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_MODEL to 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:

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.

Open the Apps tab on your Unraid server Search Community Apps for Faster-Qwen3-TTS-Wyoming Review the template variables and paths Click Install

Requirements

Unraid 6.12 or newer, the NVIDIA Driver plugin, a CUDA-capable NVIDIA GPU, and internet access for the first model download. The default 1.7B model is recommended for quality; use the 0.6B CustomVoice model for lower VRAM usage.

Related apps

Explore more like this

Explore all

Details

Repository
ghcr.io/agrestisdavid/faster-qwen3-tts-wyoming:latest
Last Updated2026-07-30
First Seen2026-07-30

Runtime arguments

Web UI
http://[IP]:[PORT:7860]/ui/
Network
bridge
Shell
bash
Privileged
false
Extra Params
--runtime=nvidia --gpus all

Template configuration

Qwen WebUI and API PortPorttcp

Gradio WebUI and OpenAI-compatible TTS API.

Target
7860
Default
7860
Wyoming TTS PortPorttcp

Wyoming protocol endpoint for Home Assistant.

Target
10210
Default
10210
AppdataPathrw

Persistent Hugging Face, Gradio, and Torch caches.

Target
/config
Default
/mnt/user/appdata/faster-qwen3-tts-wyoming
Qwen3-TTS ModelVariable

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 VoiceVariable

Default CustomVoice speaker. Supported: aiden, dylan, eric, ono_anna, ryan, serena, sohee, uncle_fu, vivian.

Target
QWEN3_TTS_DEFAULT_VOICE
Default
sohee
LanguageVariable

Qwen synthesis language.

Target
QWEN3_TTS_LANGUAGE
Default
english
InstructVariable

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.
TemperatureVariable

Sampling temperature. Lower values are calmer and more stable.

Target
QWEN3_TTS_TEMPERATURE
Default
0.5
Top PVariable

Nucleus sampling probability.

Target
QWEN3_TTS_TOP_P
Default
0.3
Top KVariable

Number of token candidates used during sampling.

Target
QWEN3_TTS_TOP_K
Default
150
Repetition PenaltyVariable

Penalty used to reduce repeated speech artifacts.

Target
QWEN3_TTS_REPETITION_PENALTY
Default
1.3
Sampling EnabledVariable

Enable stochastic token sampling.

Target
QWEN3_TTS_DO_SAMPLE
Default
true
SeedVariable

Default random seed for reproducible requests.

Target
QWEN3_TTS_SEED
Default
0
Maximum New TokensVariable

Upper generation limit per text segment.

Target
QWEN3_TTS_MAX_NEW_TOKENS
Default
4096
Non-Streaming ModeVariable

Keep false for incremental PCM generation.

Target
QWEN3_TTS_NON_STREAMING_MODE
Default
false
Streaming Chunk SizeVariable

Model token chunk size used for streaming output.

Target
QWEN3_TTS_STREAMING_CHUNK_SIZE
Default
120
Token Safety MarginVariable

Multiplier used when estimating the segment token budget.

Target
QWEN3_TTS_TOKEN_SAFETY_MARGIN
Default
8.0
Maximum Segment CharactersVariable

Long text is split into bounded segments at natural boundaries.

Target
QWEN3_TTS_MAX_SEGMENT_CHARS
Default
500
Segment Pause MillisecondsVariable

Silence inserted between long-text segments.

Target
QWEN3_TTS_SEGMENT_PAUSE_MS
Default
120
Pending Queue LimitVariable

Maximum queued synthesis requests.

Target
QWEN3_TTS_QUEUE_MAX_PENDING
Default
8
BackendVariable

Faster Qwen3-TTS inference backend.

Target
QWEN3_TTS_BACKEND
Default
ggml
DeviceVariable

Inference device. The default image is intended for CUDA.

Target
QWEN3_TTS_DEVICE
Default
cuda
Torch DTypeVariable

Torch model dtype.

Target
QWEN3_TTS_DTYPE
Default
bfloat16
Attention ImplementationVariable

Torch attention implementation.

Target
QWEN3_TTS_ATTN_IMPLEMENTATION
Default
sdpa
GGML QuantizationVariable

Quantization passed to the GGML backend.

Target
QWEN3_TTS_QUANT
Default
BF16
Force LanguageVariable

Always synthesize using the configured language.

Target
QWEN3_TTS_FORCE_LANGUAGE
Default
true
Startup Timeout SecondsVariable

Maximum first-start model download and initialization time.

Target
QWEN3_TTS_STARTUP_TIMEOUT_SECONDS
Default
1800
PUIDVariable

Host user ID used for appdata files.

Default
99
PGIDVariable

Host group ID used for appdata files.

Default
100
UMASKVariable

File creation mask.

Default
022
TimezoneVariable

Container timezone.

Target
TZ
Default
UTC
NVIDIA Visible DevicesVariable

NVIDIA GPU selection.

Target
NVIDIA_VISIBLE_DEVICES
Default
all
NVIDIA Driver CapabilitiesVariable

Required NVIDIA driver capabilities.

Target
NVIDIA_DRIVER_CAPABILITIES
Default
compute,utility