Kleineres Modell
This commit is contained in:
1
.gitignore
vendored
1
.gitignore
vendored
@@ -1,2 +1,3 @@
|
|||||||
deploy/
|
deploy/
|
||||||
*.wav
|
*.wav
|
||||||
|
.env
|
||||||
|
|||||||
@@ -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:
|
||||||
|
|||||||
@@ -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=$!
|
||||||
|
|
||||||
@@ -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
|
||||||
|
|||||||
@@ -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.
|
|||||||
128–169 Hz (~11 %), Spektralzentroid ~11 %.
|
128–169 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
|
||||||
|
|||||||
@@ -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)
|
||||||
@@ -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
|
||||||
@@ -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"
|
||||||
|
|
||||||
@@ -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
|
||||||
@@ -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
|
||||||
Reference in New Issue
Block a user