Compare commits

...

3 Commits

Author SHA1 Message Date
duffyduck 4f494daffb docs: BigVGAN-Warnung deutlich — funktioniert nicht mit unserem Vocos-Setup
Die BigVGAN-Variante des aihpi F5-TTS Checkpoints ist nicht einfach ein
"optional besser" Fallback — sie ist mit dem Default-Vocos-Vocoder den die
f5-tts Library laedt inkompatibel. Output wird NaN, App bleibt stumm.

Stefan hat das probiert, App stumm, 10 Minuten Debugging. README war zu
locker formuliert ("Meist hoehere Quali") — jetzt klar als "funktioniert
AKTUELL NICHT" gekennzeichnet.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-24 19:49:54 +02:00
duffyduck 958c8d6fc6 fix(f5tts): NaN/Inf in Modell-Output sauber abfangen vor int16-Cast
F5-TTS generiert gelegentlich NaN/Inf samples — ohne sanitize lief der
int16-Cast in undefined behavior (RuntimeWarning + kaputter Sound in den
entsprechenden Stellen). Jetzt: nan_to_num vor clip, plus Warnung wie
viele samples betroffen waren.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-24 19:35:57 +02:00
duffyduck 5ba89c7191 docs: README-Abschnitt fuer deutsches F5-TTS Fine-Tune (aihpi)
Konfig-Tabelle mit den konkreten Diagnostic-Werten fuer das deutsche
Fine-Tune von aihpi/F5-TTS-German — Modell-Architektur, hf:// Pfade,
empfohlene cfg_strength / nfe_step. Plus Hinweis auf die BigVGAN-
Variante als Alternative.

Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
2026-04-24 19:34:36 +02:00
2 changed files with 36 additions and 1 deletions

View File

@ -650,6 +650,33 @@ In der Diagnostic unter Einstellungen → Sprachausgabe:
> **Tipp:** Fuer beste Ergebnisse: saubere Aufnahme, eine Stimme, kein Hintergrund, > **Tipp:** Fuer beste Ergebnisse: saubere Aufnahme, eine Stimme, kein Hintergrund,
> 10-30 Sekunden Gesamtlaenge. Mehrere kurze Dateien werden zusammengefuegt. > 10-30 Sekunden Gesamtlaenge. Mehrere kurze Dateien werden zusammengefuegt.
### Deutsches Fine-Tune (bessere Qualitaet auf Deutsch)
Das Default-Modell `F5TTS_v1_Base` ist primaer auf Englisch + Chinesisch trainiert
und liefert auf Deutsch merklich schwaechere Voice-Cloning-Qualitaet als XTTS es
tat. Community-Fine-Tune von [aihpi](https://huggingface.co/aihpi/F5-TTS-German)
auf dem Emilia-Dataset + Common Voice 19.0 funktioniert deutlich besser.
**Konfiguration ueber Diagnostic → "F5-TTS Modell-Tuning (advanced)":**
| Feld | Wert |
|------|------|
| Modell-Architektur | `F5TTS_Base` *(nicht v1_Base! Fine-Tune basiert auf der alten Architektur)* |
| Custom Checkpoint | `hf://aihpi/F5-TTS-German/F5TTS_Base/model_365000.safetensors` |
| Custom Vocab | `hf://aihpi/F5-TTS-German/vocab.txt` |
| cfg_strength | `2.0` |
| nfe_step | `32` |
→ "Anwenden" klicken. Die `hf://`-Pfade werden einmalig automatisch runter-
geladen (~3-5GB, landet im `xtts/hf-cache/`) und bei Container-Restart aus
dem Cache wiederverwendet.
> **Warnung zur BigVGAN-Variante** (`F5TTS_Base_bigvgan/model_295000.safetensors`):
> funktioniert AKTUELL NICHT mit dieser Bridge. Die f5-tts Library laedt
> per Default den Vocos-Vocoder, die BigVGAN-Weights sind damit inkompatibel
> → Modell produziert NaN, App bleibt stumm. Nur die **Vocos-Variante
> (F5TTS_Base/model_365000.safetensors)** nutzen.
--- ---
## Docker Volumes ## Docker Volumes

View File

@ -268,7 +268,15 @@ def split_sentences(text: str, max_len: int = 350) -> list[str]:
def float_to_pcm16(wav: np.ndarray) -> bytes: def float_to_pcm16(wav: np.ndarray) -> bytes:
"""Float32 (-1..+1) → int16 little-endian bytes.""" """Float32 (-1..+1) → int16 little-endian bytes.
F5-TTS generiert gelegentlich NaN/Inf bei Instabilitaeten ohne sanitize
waere der Cast zu int16 undefiniert (RuntimeWarning + kaputter Sound).
"""
nan_count = int(np.isnan(wav).sum() + np.isinf(wav).sum())
if nan_count > 0:
logger.warning("F5-TTS Output enthaelt %d NaN/Inf samples — ersetze mit 0", nan_count)
wav = np.nan_to_num(wav, nan=0.0, posinf=1.0, neginf=-1.0)
wav = np.clip(wav, -1.0, 1.0) wav = np.clip(wav, -1.0, 1.0)
pcm = (wav * 32767.0).astype(np.int16) pcm = (wav * 32767.0).astype(np.int16)
return pcm.tobytes() return pcm.tobytes()