# TTS Voice Creator + Qwen3-TTS Setup Playbook This playbook is for people who want a friendly voice-cloning and TTS-routing setup without living in a terminal. ## What This Gives You You get a browser app called **TTS Voice Creator - Clone and Design** that can: - Record or import voice samples. - Trim, normalize, transcribe, and save cloned voices. - Create prompt-based Voice Design voices. - Route simple app voices such as `default` to different real voices by language. - Act as an OpenAI-compatible TTS endpoint for Open WebUI, SillyTavern, Home Assistant, and curl. The usual Open WebUI setup becomes: ```text TTS API base URL: http://YOUR_HOST:7860/v1 Model: tts-1 Voice: default ``` Then the Routing tab decides what `default` means. ## The Pieces ### Docker Docker runs each part in its own container. That keeps the app, Qwen3-TTS, Voice Design, and optional tools separated and easier to update. ### Portainer Portainer is optional. It is a browser dashboard for Docker. If your target user dislikes command lines, Portainer is worth installing because it gives them buttons for logs, restarts, and container status. ### TTS Voice Creator This is the voice library and routing interface. It stores reference voices, metadata, transcripts, ratings, active/hidden state, and routing rules. ### Qwen3-TTS Voice Clone This is the normal production TTS path. It uses reference audio from exported cloned voices. Use this when: - You recorded a real person or character voice. - You want Open WebUI to speak using saved voices. - You want the most predictable day-to-day TTS endpoint. ### Qwen3-TTS Voice Design This creates a voice from a written description. No reference recording is required. Use this when: - You are designing a new narrator or character. - You want to prototype voices before recording anyone. - You want virtual voices through the app proxy. ### Qwen3-TTS Custom Voice This is for Qwen CustomVoice workflows with named speakers and optional instructions. Use this when: - You already maintain custom speaker IDs. - You want to expose Qwen custom speakers as OpenAI-compatible voices. - You need a separate custom voice server from the cloned voice library. ## Guided Installation Start the installer: ```bash python3 guided_installer.py ``` On desktop systems with Python file association, you can often double-click `guided_installer.py`. The installer checks: - Docker command - Docker daemon - Docker Compose plugin - Portainer - TTS Voice Creator - Qwen3-TTS clone server - Qwen3-TTS Voice Design server - Qwen3-TTS Custom Voice server It then asks for: - Voice library folder - Model folder - App port - Docker network name - Qwen Docker image - Which Qwen model servers to install - Ports for each model server - Model locations for each server - Optional external TTS endpoint ## Recommended Ports ```text 7860 TTS Voice Creator 8020 Qwen3-TTS Voice Clone 8021 Qwen3-TTS Voice Design 8022 Qwen3-TTS Custom Voice 9000 Portainer HTTP 9443 Portainer HTTPS ``` ## Installation Flow 1. Open the guided installer. 2. Click **Re-check this computer**. 3. If Docker is missing, open the Docker install guide from the installer. 4. Optionally click **Install Portainer**. 5. Choose which Qwen model servers to install. 6. Pick where the large model folders live. 7. Pick the ports. 8. Click **Generate compose file**. 9. Click **Install / update selected stack**. 10. Open `http://YOUR_HOST:7860`. ## First App Setup Open the Settings gear in TTS Voice Creator: ```text TTS API URL: http://host.docker.internal:8020 Voice Design URL: http://host.docker.internal:8021 Voice scan directory: /voices Active voices dir: /voices/active_voices ``` If the app and TTS servers are on the same Docker network, container names can also be used from inside Docker. ## Recording A Voice 1. Open **Voice Clone**. 2. Click **Add new voice**. 3. Choose the read-sample language. 4. Click **Check level**. 5. Adjust mic gain until peaks are roughly `-18` to `-9 dB`. 6. Click **Record**. 7. Stop after 10 to 20 seconds. 8. Auto trim if needed. 9. Use or edit the transcript. 10. Save the voice. After saving voices, restart the Qwen3-TTS clone container so it scans `active_voices`. ## Open WebUI Without Routing Use this when you always want one explicit voice. ```text Provider: OpenAI-compatible Base URL: http://YOUR_HOST:8020/v1 API key: dummy Model: tts-1 Voice: EN_F_YourVoice ``` ## Open WebUI With Routing Use this when Open WebUI sends `default`, and TTS Voice Creator decides which real voice to use. ```text Provider: OpenAI-compatible Base URL: http://YOUR_HOST:7860/v1 API key: dummy Model: tts-1 Voice: default ``` Then add routes: ```text Open WebUI + default + EN -> EN_F_YourEnglishVoice Open WebUI + default + DE -> DE_M_YourGermanVoice Open WebUI + default + FR -> FR_F_YourFrenchVoice ``` Now English text, German text, and French text can each use a different voice while Open WebUI still only knows about `default`. ## Troubleshooting ### Microphone Is Blocked Browsers usually require `localhost` or HTTPS for microphone access. - Chrome, Brave, Edge: click the lock/tune icon in the address bar and allow Microphone. - Firefox: click the microphone or lock icon and remove the block. - Safari: Safari Settings, Websites, Microphone, allow this site. ### Voice Does Not Appear In Qwen3-TTS Restart the Qwen3-TTS clone container. Most TTS servers scan voice folders at startup. ### Open WebUI Gets No Audio Check: - Base URL ends in `/v1`. - Voice exists in `/v1/audio/voices`. - API key is set to `dummy` if Open WebUI requires a key. - The TTS container logs do not show model-load errors. ### Routing Picks The Wrong Language The router uses lightweight language detection. If a sentence is short or mixed-language, add a fallback `*` route or send a more explicit text sample. ## Why This Setup Is Nice It separates voice management from the TTS engine. The app becomes the place where non-technical users can record, clean up, label, activate, route, and test voices, while Docker keeps the heavier services running in the background.