Kleineres Modell

This commit is contained in:
2026-06-19 17:22:28 +02:00
parent a5230964cb
commit 404c632cfc
20 changed files with 66 additions and 60 deletions

1
.gitignore vendored
View File

@@ -1,2 +1,3 @@
deploy/ deploy/
*.wav *.wav
.env

View File

@@ -23,10 +23,10 @@ services:
volumes: volumes:
- /home/guru/vllm/data/root:/root - /home/guru/vllm/data/root:/root
- ./deploy/qwen3_tts.yaml:/deploy/qwen3_tts.yaml:ro - ./deploy/qwen3_tts.yaml:/deploy/qwen3_tts.yaml:ro
- ./entrypoint.sh:/entrypoint.sh:ro - ./docker/entrypoint.sh:/entrypoint.sh:ro
- ./voice_clone_ui.py:/voice_clone_ui.py:ro - ./docker/voice_clone_ui.py:/voice_clone_ui.py:ro
- ./ws_log_proxy.py:/ws_log_proxy.py:ro - ./docker/ws_log_proxy.py:/ws_log_proxy.py:ro
- ./patch_qwen3_tts_runtime.py:/patch_qwen3_tts_runtime.py:ro - ./docker/patch_qwen3_tts_runtime.py:/patch_qwen3_tts_runtime.py:ro
- ./ui:/ui:ro - ./ui:/ui:ro
command: ["/bin/bash", "/entrypoint.sh"] command: ["/bin/bash", "/entrypoint.sh"]
restart: unless-stopped restart: unless-stopped
@@ -58,8 +58,9 @@ services:
volumes: volumes:
- /home/guru/vllm/data/root:/root - /home/guru/vllm/data/root:/root
- ./deploy/qwen3_tts.yaml:/deploy/qwen3_tts.yaml:ro - ./deploy/qwen3_tts.yaml:/deploy/qwen3_tts.yaml:ro
- ./entrypoint_clone.sh:/entrypoint_clone.sh:ro - ./deploy/qwen3_tts_clone.yaml:/deploy/qwen3_tts_clone.yaml:ro
- ./patch_qwen3_tts_runtime.py:/patch_qwen3_tts_runtime.py:ro - ./docker/entrypoint_clone.sh:/entrypoint_clone.sh:ro
- ./docker/patch_qwen3_tts_runtime.py:/patch_qwen3_tts_runtime.py:ro
command: ["/bin/bash", "/entrypoint_clone.sh"] command: ["/bin/bash", "/entrypoint_clone.sh"]
restart: "no" restart: "no"
healthcheck: healthcheck:

View File

@@ -19,8 +19,7 @@ vllm-omni serve "$MODEL" \
--omni \ --omni \
--host 0.0.0.0 \ --host 0.0.0.0 \
--port "$PORT" \ --port "$PORT" \
--deploy-config /deploy/qwen3_tts.yaml \ --deploy-config /deploy/qwen3_tts_clone.yaml \
--gpu-memory-utilization 0.10 \
--trust-remote-code & --trust-remote-code &
SERVER_PID=$! SERVER_PID=$!

View File

@@ -41,11 +41,11 @@ DGX-Spark-Maschine mit begrenzter GPU-Speichernutzung ausgelegt
`vllm/vllm-omni:latest-aarch64`, bindet Port `8091` fuer die API und `8092` `vllm/vllm-omni:latest-aarch64`, bindet Port `8091` fuer die API und `8092`
fuer die Browser-Oberflaeche, mountet Hugging-Face-Daten sowie Deployment-, fuer die Browser-Oberflaeche, mountet Hugging-Face-Daten sowie Deployment-,
Entrypoint- und UI-Dateien. Entrypoint- und UI-Dateien.
- `entrypoint.sh`: startet die Voice-Cloning-Oberflaeche im Container, startet - `docker/entrypoint.sh`: startet die Voice-Cloning-Oberflaeche im Container, startet
den vLLM-Omni-Server und fuehrt nach erfolgreichem Healthcheck einen den vLLM-Omni-Server und fuehrt nach erfolgreichem Healthcheck einen
Warmup-Request aus, damit CUDA-Graph-/Compile-Kosten nicht den ersten echten Warmup-Request aus, damit CUDA-Graph-/Compile-Kosten nicht den ersten echten
Nutzerrequest treffen. Nutzerrequest treffen.
- `start.sh`: startet den Compose-Service, filtert relevante Containerlogs in - `scripts/start.sh`: startet den Compose-Service, filtert relevante Containerlogs in
lesbare Statusmeldungen und wartet auf `/health`. lesbare Statusmeldungen und wartet auf `/health`.
- `deploy/qwen3_tts.yaml`: aktive Deployment-Konfiguration fuer die zweistufige - `deploy/qwen3_tts.yaml`: aktive Deployment-Konfiguration fuer die zweistufige
TTS-Pipeline, Streaming-Connectoren, Sampling-Parameter und Speicherlimits. TTS-Pipeline, Streaming-Connectoren, Sampling-Parameter und Speicherlimits.
@@ -53,14 +53,14 @@ DGX-Spark-Maschine mit begrenzter GPU-Speichernutzung ausgelegt
Deployment-Konfiguration; offenbar als explizite Streaming-Variante abgelegt. Deployment-Konfiguration; offenbar als explizite Streaming-Variante abgelegt.
- `STREAMING_API.md`: detaillierte API-Dokumentation fuer REST, WebSocket, - `STREAMING_API.md`: detaillierte API-Dokumentation fuer REST, WebSocket,
Session-Protokoll, Audioformate, Segmentierung und bekannte Latenzwerte. Session-Protokoll, Audioformate, Segmentierung und bekannte Latenzwerte.
- `test_http.py`: einfacher REST-Test gegen `http://localhost:8091`, schreibt - `tests/test_http.py`: einfacher REST-Test gegen `http://localhost:8091`, schreibt
`test_output.wav`. `test_output.wav`.
- `test_ws.py`: WebSocket-Streaming-Test gegen - `tests/test_ws.py`: WebSocket-Streaming-Test gegen
`ws://localhost:8091/v1/audio/speech/stream`, sammelt PCM-Chunks und schreibt `ws://localhost:8091/v1/audio/speech/stream`, sammelt PCM-Chunks und schreibt
`test_stream_output.wav`. `test_stream_output.wav`.
- `ui/voice-cloning.html`: einfache Browser-Oberflaeche fuer Voice Cloning mit - `ui/voice-cloning.html`: einfache Browser-Oberflaeche fuer Voice Cloning mit
Referenzaudio, Referenztranskript, Zieltext und Ausgabeplayer. Referenzaudio, Referenztranskript, Zieltext und Ausgabeplayer.
- `voice_clone_ui.py`: kleiner lokaler Webserver, der die HTML-Oberflaeche - `docker/voice_clone_ui.py`: kleiner lokaler Webserver, der die HTML-Oberflaeche
ausliefert und REST-Anfragen als Same-Origin-Proxy an den TTS-Service ausliefert und REST-Anfragen als Same-Origin-Proxy an den TTS-Service
weiterleitet. weiterleitet.
@@ -69,11 +69,11 @@ DGX-Spark-Maschine mit begrenzter GPU-Speichernutzung ausgelegt
Der normale TTS/UI-Service wird gestartet und gestoppt ueber: Der normale TTS/UI-Service wird gestartet und gestoppt ueber:
```bash ```bash
./start_tts.sh ./scripts/start_tts.sh
./stop_tts.sh ./scripts/stop_tts.sh
``` ```
`./start.sh` bleibt als kompatibler Wrapper auf `./start_tts.sh` erhalten. Beim `./scripts/start.sh` bleibt als kompatibler Wrapper auf `start_tts.sh` erhalten. Beim
Start des TTS-Service wird ein eventuell laufender Clone-Container automatisch Start des TTS-Service wird ein eventuell laufender Clone-Container automatisch
gestoppt. Das Skript startet danach `qwen3-tts`, beobachtet die Logs und beendet gestoppt. Das Skript startet danach `qwen3-tts`, beobachtet die Logs und beendet
sich erfolgreich, sobald `http://localhost:8091/health` antwortet. Die UI ist sich erfolgreich, sobald `http://localhost:8091/health` antwortet. Die UI ist
@@ -92,8 +92,8 @@ Voice-Clone-Prompts. Im lokalen vLLM-Omni-Code wird ein gespeicherter oder aus
uebergeben. Fuer einen Voice-Dialog ist deshalb der richtige Betriebsmodus: uebergeben. Fuer einen Voice-Dialog ist deshalb der richtige Betriebsmodus:
```bash ```bash
./download_qwen3_tts_base.sh # einmalig, falls das Base-Modell noch fehlt ./scripts/download_qwen3_tts_base.sh # einmalig, falls das Base-Modell noch fehlt
./start_dialog_tts.sh # startet qwen3-tts mit Qwen3-TTS-12Hz-1.7B-Base ./scripts/start_dialog_tts.sh # startet qwen3-tts mit Qwen3-TTS-12Hz-1.7B-Base
``` ```
Danach unter `http://localhost:8092/` die Referenzstimme speichern und fuer Danach unter `http://localhost:8092/` die Referenzstimme speichern und fuer
@@ -104,7 +104,7 @@ Referenzaudio kann alternativ ein passender 2048-dim `speaker_embedding` ueber
`/api/voice-vectors` gespeichert und bei jeder Ausgabe mitgesendet werden. `/api/voice-vectors` gespeichert und bei jeder Ausgabe mitgesendet werden.
`seed` bleibt zusaetzlich sinnvoll, ersetzt aber keinen Speaker-Anker. Der `seed` bleibt zusaetzlich sinnvoll, ersetzt aber keinen Speaker-Anker. Der
Runtime-Patch `patch_qwen3_tts_runtime.py` sorgt dafuer, dass `seed` im Runtime-Patch `docker/patch_qwen3_tts_runtime.py` sorgt dafuer, dass `seed` im
WebSocket-Pfad tatsaechlich an jedes Segment weitergereicht wird und die WebSocket-Pfad tatsaechlich an jedes Segment weitergereicht wird und die
relevanten Werte im Containerlog sichtbar sind. relevanten Werte im Containerlog sichtbar sind.
@@ -114,7 +114,7 @@ REST eignet sich fuer komplette Eingabetexte und liefert standardmaessig eine
WAV-Antwort. Der Testclient nutzt: WAV-Antwort. Der Testclient nutzt:
```bash ```bash
python3 test_http.py python3 tests/test_http.py
``` ```
WebSocket eignet sich fuer Low-Latency-Szenarien, in denen Text schrittweise WebSocket eignet sich fuer Low-Latency-Szenarien, in denen Text schrittweise
@@ -123,7 +123,7 @@ eintrifft. Eine Session beginnt mit `session.config`, nimmt danach beliebig viel
PCM-Binaerframes oder WAV-Bloecke zurueck. Der Testclient nutzt: PCM-Binaerframes oder WAV-Bloecke zurueck. Der Testclient nutzt:
```bash ```bash
python3 test_ws.py python3 tests/test_ws.py
``` ```
Details zu Nachrichtentypen, Timeouts, Audioformaten und externem Zugriff stehen Details zu Nachrichtentypen, Timeouts, Audioformaten und externem Zugriff stehen
@@ -132,7 +132,7 @@ in `STREAMING_API.md`.
## Voice-Cloning-Oberflaeche ## Voice-Cloning-Oberflaeche
Die Browser-Oberflaeche laeuft im selben Container wie der TTS-Service. Beim Die Browser-Oberflaeche laeuft im selben Container wie der TTS-Service. Beim
Start ueber `./start.sh` wird neben der API auf Port `8091` auch die UI auf Port Start ueber `./scripts/start.sh` wird neben der API auf Port `8091` auch die UI auf Port
`8092` veroeffentlicht: `8092` veroeffentlicht:
```text ```text
@@ -179,7 +179,7 @@ optionalen zweiten Container `qwen3-tts-clone` im Compose-Profil `clone`. Er
laeuft auf Port `8093` und wird nur bei Bedarf gestartet: laeuft auf Port `8093` und wird nur bei Bedarf gestartet:
```bash ```bash
QWEN3_TTS_CLONE_MODEL=<lokal-verfuegbares-clone/base-modell> ./start_clone.sh QWEN3_TTS_CLONE_MODEL=<lokal-verfuegbares-clone/base-modell> ./scripts/start_clone.sh
``` ```
Beim Start des Clone-Service wird der normale TTS/UI-Container automatisch Beim Start des Clone-Service wird der normale TTS/UI-Container automatisch
@@ -187,15 +187,15 @@ gestoppt. Damit laufen TTS und Clone nicht gleichzeitig auf derselben GPU.
`clone_model.sh` bleibt fuer manuelles `status`, `logs` und `unload` erhalten: `clone_model.sh` bleibt fuer manuelles `status`, `logs` und `unload` erhalten:
```bash ```bash
./stop_clone.sh ./scripts/stop_clone.sh
./clone_model.sh status ./scripts/clone_model.sh status
./clone_model.sh logs ./scripts/clone_model.sh logs
./clone_model.sh unload ./scripts/clone_model.sh unload
``` ```
Default fuer den Clone-Service ist jetzt `Qwen/Qwen3-TTS-12Hz-1.7B-Base`. Default fuer den Clone-Service ist jetzt `Qwen/Qwen3-TTS-12Hz-1.7B-Base`.
Wenn das Modell noch nicht im lokalen Hugging-Face-Cache liegt, zuerst Wenn das Modell noch nicht im lokalen Hugging-Face-Cache liegt, zuerst
`./download_qwen3_tts_base.sh` ausfuehren oder dem Container funktionierenden `./scripts/download_qwen3_tts_base.sh` ausfuehren oder dem Container funktionierenden
Internet-/DNS-Zugriff geben. Internet-/DNS-Zugriff geben.
Der UI-Proxy kennt dafuer diese optionalen Routen: Der UI-Proxy kennt dafuer diese optionalen Routen:
@@ -217,7 +217,7 @@ den Haupt-TTS-Service.
- `deploy/qwen3_tts.yaml` und `deploy/qwen3_tts.streaming.yaml` sind derzeit - `deploy/qwen3_tts.yaml` und `deploy/qwen3_tts.streaming.yaml` sind derzeit
doppelt vorhanden. Wenn beide Varianten dauerhaft gebraucht werden, sollte der doppelt vorhanden. Wenn beide Varianten dauerhaft gebraucht werden, sollte der
Unterschied dokumentiert oder eine Datei entfernt werden. Unterschied dokumentiert oder eine Datei entfernt werden.
- `test_ws.py` installiert `websockets` bei fehlendem Import automatisch per pip. - `tests/test_ws.py` installiert `websockets` bei fehlendem Import automatisch per pip.
Das ist praktisch fuer lokale Tests, aber fuer reproduzierbare Umgebungen Das ist praktisch fuer lokale Tests, aber fuer reproduzierbare Umgebungen
weniger kontrolliert als eine explizite Requirements-Datei. weniger kontrolliert als eine explizite Requirements-Datei.
- Die Voice-Cloning-Oberflaeche ist ein Client fuer vorhandene API-Felder. Sie - Die Voice-Cloning-Oberflaeche ist ein Client fuer vorhandene API-Felder. Sie

View File

@@ -6,8 +6,8 @@ API-Felder und UI-Pfade es gibt und welche Fallstricke (Embedding-Dimensionen,
Stimm-Drift) zu beachten sind. Stimm-Drift) zu beachten sind.
> Stand: 2026-06-17. Quelle: Code in diesem Repo (`docker-compose.yml`, > Stand: 2026-06-17. Quelle: Code in diesem Repo (`docker-compose.yml`,
> `entrypoint*.sh`, `voice_clone_ui.py`, `ui/voice-cloning.html`, > `docker/entrypoint*.sh`, `docker/voice_clone_ui.py`, `ui/voice-cloning.html`,
> `patch_qwen3_tts_runtime.py`, `start_*.sh`) + `docs/PROJECT_OVERVIEW.md`. > `docker/patch_qwen3_tts_runtime.py`, `scripts/start_*.sh`) + `docs/PROJECT_OVERVIEW.md`.
--- ---
@@ -49,28 +49,28 @@ HF-Cache (`/home/guru/vllm/data/root:/root`), laufen aber **nicht gleichzeitig**
(Start-Skripte stoppen jeweils den anderen). (Start-Skripte stoppen jeweils den anderen).
### 1. Haupt-Container `qwen3-tts` (Port 8091/8092/8094) ### 1. Haupt-Container `qwen3-tts` (Port 8091/8092/8094)
- Startet via `entrypoint.sh`: `vllm-omni serve`, plus - Startet via `docker/entrypoint.sh`: `vllm-omni serve`, plus
- Browser-UI (`voice_clone_ui.py`) auf **8092** - Browser-UI (`docker/voice_clone_ui.py`) auf **8092**
- WS-Logging-Proxy (`ws_log_proxy.py`) auf **8094** - WS-Logging-Proxy (`docker/ws_log_proxy.py`) auf **8094**
- Runtime-Patch (`patch_qwen3_tts_runtime.py`) für Seed-Propagation im WS-Pfad - Runtime-Patch (`docker/patch_qwen3_tts_runtime.py`) für Seed-Propagation im WS-Pfad
- Auto-Warmup-Request nach `/health` - Auto-Warmup-Request nach `/health`
- Modell wählbar über `QWEN3_TTS_MODEL`: - Modell wählbar über `QWEN3_TTS_MODEL`:
- `./start_custom_tts.sh` → CustomVoice (kein Cloning, schnell, Standard) - `./scripts/start_custom_tts.sh` → CustomVoice (kein Cloning, schnell, Standard)
- `./start_dialog_tts.sh`**Base** (Cloning + feste Dialogstimmen) - `./scripts/start_dialog_tts.sh`**Base** (Cloning + feste Dialogstimmen)
- `./start_tts.sh` / `./start.sh` → respektiert `QWEN3_TTS_MODEL`, Default CustomVoice - `./scripts/start_tts.sh` / `./scripts/start.sh` → respektiert `QWEN3_TTS_MODEL`, Default CustomVoice
- `./stop_tts.sh` → stoppt + entfernt den Container - `./scripts/stop_tts.sh` → stoppt + entfernt den Container
### 2. Optionaler Clone-Container `qwen3-tts-clone` (Port 8093, Compose-Profil `clone`) ### 2. Optionaler Clone-Container `qwen3-tts-clone` (Port 8093, Compose-Profil `clone`)
- Trennt Cloning von produktiver Ausgabe. Eigenes `entrypoint_clone.sh`, - Trennt Cloning von produktiver Ausgabe. Eigenes `docker/entrypoint_clone.sh`,
`gpu-memory-utilization 0.10`, `restart: "no"`. `gpu-memory-utilization 0.10`, `restart: "no"`.
- Start: `QWEN3_TTS_CLONE_MODEL=<modell> ./start_clone.sh` - Start: `QWEN3_TTS_CLONE_MODEL=<modell> ./scripts/start_clone.sh`
(Default-Modell: `Qwen3-TTS-12Hz-1.7B-Base`). Stoppt automatisch `qwen3-tts`. (Default-Modell: `Qwen3-TTS-12Hz-1.7B-Base`). Stoppt automatisch `qwen3-tts`.
- Verwaltung: `./clone_model.sh {load|unload|status|logs}`, `./stop_clone.sh`. - Verwaltung: `./scripts/clone_model.sh {load|unload|status|logs}`, `./scripts/stop_clone.sh`.
- UI-Proxy-Routen dafür: `GET /api/clone/health`, `POST /api/clone/speech`. - UI-Proxy-Routen dafür: `GET /api/clone/health`, `POST /api/clone/speech`.
### Modell-Download (einmalig) ### Modell-Download (einmalig)
```bash ```bash
./download_qwen3_tts_base.sh # lädt Qwen3-TTS-12Hz-1.7B-Base in den Cache ./scripts/download_qwen3_tts_base.sh # lädt Qwen3-TTS-12Hz-1.7B-Base in den Cache
``` ```
(Beide Modelle sind aktuell bereits im Cache vorhanden.) (Beide Modelle sind aktuell bereits im Cache vorhanden.)
@@ -79,8 +79,8 @@ HF-Cache (`/home/guru/vllm/data/root:/root`), laufen aber **nicht gleichzeitig**
## Klon-Workflow (empfohlen, über die UI) ## Klon-Workflow (empfohlen, über die UI)
```bash ```bash
./download_qwen3_tts_base.sh # nur falls Base noch nicht im Cache ./scripts/download_qwen3_tts_base.sh # nur falls Base noch nicht im Cache
./start_dialog_tts.sh # startet qwen3-tts mit dem Base-Modell ./scripts/start_dialog_tts.sh # startet qwen3-tts mit dem Base-Modell
# Browser: http://localhost:8092/ # Browser: http://localhost:8092/
``` ```
@@ -136,7 +136,7 @@ Voice registrieren: `POST /v1/audio/voices` (multipart) — Felder `audio_sample
--- ---
## UI-Proxy-Routen (`voice_clone_ui.py`, Port 8092) ## UI-Proxy-Routen (`docker/voice_clone_ui.py`, Port 8092)
Same-Origin-Proxy, vermeidet CORS im Browser: Same-Origin-Proxy, vermeidet CORS im Browser:
@@ -169,7 +169,7 @@ Verteilung → Timbre/Tonhöhe driften über Dialog-Turns.
128169 Hz (~11 %), Spektralzentroid ~11 %. 128169 Hz (~11 %), Spektralzentroid ~11 %.
- **Temperatur/top_k senken hilft nicht** — Drift kommt nicht vom Sampling. - **Temperatur/top_k senken hilft nicht** — Drift kommt nicht vom Sampling.
- `seed` allein reicht nicht (ersetzt keinen Speaker-Anker), wird aber im - `seed` allein reicht nicht (ersetzt keinen Speaker-Anker), wird aber im
WS-Pfad jetzt korrekt pro Segment durchgereicht (`patch_qwen3_tts_runtime.py`). WS-Pfad jetzt korrekt pro Segment durchgereicht (`docker/patch_qwen3_tts_runtime.py`).
**Lösungen:** **Lösungen:**
1. **Fester Speaker-Anker (eigentliche Lösung):** Referenz-WAV bzw. 2048-dim 1. **Fester Speaker-Anker (eigentliche Lösung):** Referenz-WAV bzw. 2048-dim
@@ -191,7 +191,7 @@ nutzen. Braucht VoiceDesign UND Base.
2048-dim → `RuntimeError: Expected size 2048 but got size 1024`. Container 2048-dim → `RuntimeError: Expected size 2048 but got size 1024`. Container
fängt sich via `restart: unless-stopped` + Warmup in Sekunden. Die UI fängt fängt sich via `restart: unless-stopped` + Warmup in Sekunden. Die UI fängt
diesen Fall vorab ab und zeigt eine erklärende Fehlermeldung. diesen Fall vorab ab und zeigt eine erklärende Fehlermeldung.
- Für Cloning **muss** das Base-Modell laufen (`start_dialog_tts.sh` oder - Für Cloning **muss** das Base-Modell laufen (`scripts/start_dialog_tts.sh` oder
Clone-Service), nicht der Default-CustomVoice-Betrieb. Clone-Service), nicht der Default-CustomVoice-Betrieb.
- Image ist nicht auf Digest gepinnt (`vllm/vllm-omni:latest-aarch64`); Updates - Image ist nicht auf Digest gepinnt (`vllm/vllm-omni:latest-aarch64`); Updates
können API-Verhalten ändern. können API-Verhalten ändern.
@@ -204,16 +204,16 @@ nutzen. Braucht VoiceDesign UND Base.
```bash ```bash
# Cloning-fähigen Betrieb starten (Base-Modell) # Cloning-fähigen Betrieb starten (Base-Modell)
./start_dialog_tts.sh ./scripts/start_dialog_tts.sh
# UI: http://localhost:8092/ API: http://localhost:8091 # UI: http://localhost:8092/ API: http://localhost:8091
# Zurück auf schnellen Standardbetrieb (keine Klone) # Zurück auf schnellen Standardbetrieb (keine Klone)
./start_custom_tts.sh ./scripts/start_custom_tts.sh
# Getrennter Clone-Service auf Port 8093 # Getrennter Clone-Service auf Port 8093
QWEN3_TTS_CLONE_MODEL=Qwen/Qwen3-TTS-12Hz-1.7B-Base ./start_clone.sh QWEN3_TTS_CLONE_MODEL=Qwen/Qwen3-TTS-12Hz-1.7B-Base ./scripts/start_clone.sh
./clone_model.sh status|logs|unload ./scripts/clone_model.sh status|logs|unload
./stop_clone.sh ./scripts/stop_clone.sh
# Base-Modell herunterladen (einmalig) # Base-Modell herunterladen (einmalig)
./download_qwen3_tts_base.sh ./download_qwen3_tts_base.sh

View File

@@ -1,6 +1,6 @@
#!/bin/bash #!/bin/bash
set -euo pipefail set -euo pipefail
cd "$(dirname "$0")" cd "$(dirname "$0")/.."
case "${1:-}" in case "${1:-}" in
load|start) load|start)

View File

@@ -1,19 +1,21 @@
#!/bin/bash #!/bin/bash
set -euo pipefail set -euo pipefail
cd "$(dirname "$0")" cd "$(dirname "$0")/.."
HEALTH_URL="http://localhost:8091/health" HEALTH_URL="http://localhost:8091/health"
MAX_WAIT="${MAX_WAIT:-180}" MAX_WAIT="${MAX_WAIT:-180}"
[ -f .env ] && source .env
MODEL="${QWEN3_TTS_CLONE_MODEL:-Qwen/Qwen3-TTS-12Hz-1.7B-Base}" MODEL="${QWEN3_TTS_CLONE_MODEL:-Qwen/Qwen3-TTS-12Hz-1.7B-Base}"
t0=$SECONDS t0=$SECONDS
printf "TTS-Container stoppt..." printf "TTS-Container stoppt..."
docker compose stop qwen3-tts >/dev/null 2>&1 || true docker compose stop qwen3-tts >/dev/null 2>&1 || true
docker compose rm -f qwen3-tts >/dev/null 2>&1 || true
printf " [%ds] printf " [%ds]
" $(( SECONDS - t0 )) " $(( SECONDS - t0 ))
printf "Clone-Container startet..." printf "Clone-Container startet..."
QWEN3_TTS_CLONE_MODEL="$MODEL" docker compose --profile clone up -d qwen3-tts-clone >/tmp/qwen3-tts-clone-compose.log 2>&1 docker compose --profile clone up -d qwen3-tts-clone >/tmp/qwen3-tts-clone-compose.log 2>&1
printf " [%ds] printf " [%ds]
" $(( SECONDS - t0 )) " $(( SECONDS - t0 ))
printf " Modell %s printf " Modell %s

View File

@@ -1,9 +1,11 @@
#!/bin/bash #!/bin/bash
set -e set -e
cd "$(dirname "$0")" cd "$(dirname "$0")/.."
HEALTH_URL="http://localhost:8091/health" HEALTH_URL="http://localhost:8091/health"
MAX_WAIT=180 MAX_WAIT=180
# .env aus dem Projektroot laden (nur falls Variable nicht schon im Shell-Env gesetzt)
[ -f .env ] && source .env
MODEL="${QWEN3_TTS_MODEL:-Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice}" MODEL="${QWEN3_TTS_MODEL:-Qwen/Qwen3-TTS-12Hz-1.7B-CustomVoice}"
strip_ansi() { sed 's/\x1b\[[0-9;]*[mK]//g'; } strip_ansi() { sed 's/\x1b\[[0-9;]*[mK]//g'; }
@@ -13,12 +15,13 @@ t0=$SECONDS
# --- Gegenseitigen Service stoppen --- # --- Gegenseitigen Service stoppen ---
printf "Clone-Container stoppt..." printf "Clone-Container stoppt..."
docker compose --profile clone stop qwen3-tts-clone >/dev/null 2>&1 || true docker compose --profile clone stop qwen3-tts-clone >/dev/null 2>&1 || true
docker compose --profile clone rm -f qwen3-tts-clone >/dev/null 2>&1 || true
printf " [%ds] printf " [%ds]
" $(( SECONDS - t0 )) " $(( SECONDS - t0 ))
# --- Container starten --- # --- Container starten ---
printf "TTS-Container startet..." printf "TTS-Container startet..."
QWEN3_TTS_MODEL="$MODEL" docker compose up -d qwen3-tts &>/tmp/qwen3-tts-compose.log docker compose up -d qwen3-tts &>/tmp/qwen3-tts-compose.log
printf " [%ds]\n" $(( SECONDS - t0 )) printf " [%ds]\n" $(( SECONDS - t0 ))
printf " Modell %s\n\n" "$MODEL" printf " Modell %s\n\n" "$MODEL"

View File

@@ -1,6 +1,6 @@
#!/bin/bash #!/bin/bash
set -euo pipefail set -euo pipefail
cd "$(dirname "$0")" cd "$(dirname "$0")/.."
docker compose --profile clone stop qwen3-tts-clone >/dev/null 2>&1 || true docker compose --profile clone stop qwen3-tts-clone >/dev/null 2>&1 || true
docker compose --profile clone rm -f qwen3-tts-clone >/dev/null 2>&1 || true docker compose --profile clone rm -f qwen3-tts-clone >/dev/null 2>&1 || true

View File

@@ -1,6 +1,6 @@
#!/bin/bash #!/bin/bash
set -euo pipefail set -euo pipefail
cd "$(dirname "$0")" cd "$(dirname "$0")/.."
docker compose stop qwen3-tts >/dev/null 2>&1 || true docker compose stop qwen3-tts >/dev/null 2>&1 || true
docker compose rm -f qwen3-tts >/dev/null 2>&1 || true docker compose rm -f qwen3-tts >/dev/null 2>&1 || true