Bugfixes, Verbesserungen und Mixed-Language-Support
Bugfixes: - Abkürzungen (z.B., d.h., Dr., Prof.) werden nicht mehr als Satzenden erkannt (_ABBREV_MASK_RE) - Multilingual-Import: except Exception → except (ImportError, ModuleNotFoundError) - tts_agent: ReAct-Schleife auf max. 10 Iterationen begrenzt, model_dump → explizites Dict - tts_service: audio_device=None fällt auf 'pulse' zurück - JSON-Fehlerbehandlung für --pronunciation-dict mit aussagekräftiger Meldung - PlaybackWorker: Audio-Device wird vor Stream-Start via sd.query_devices() geprüft - mcp_adapter: Fehlerbehandlung für HTTP-Fehler, Timeout erhöht, session_id ergänzt - tts_agent: Health-Check beim Start, --speed/--first-chunk-len Validierung Neue Features: - Gemischtsprachige Texte: [en]...[/en]-Markierungen für per-Segment language_id - strip_markdown(): entfernt Markdown-Formatierung vor der Synthese (--no-strip-markdown) - Emoji-Entfernung in clean_raw_text() via unicodedata - Pause/Resume: request_pause()/request_resume(), POST /pause, POST /resume, MCP-Tools - Neue Einheiten: °C, °F, kWh, kW, W, V, A, J, kPa, bar, m², m³, m/s, rpm - number_to_words_de/en bis Milliarden - DEFAULT_PRONUNCIATION_DE erweitert (GitHub, YouTube, LinkedIn, Wi-Fi, iPhone, ChatGPT, …) - NON_SPELLED_ACRONYMS erweitert (USB, CPU, GPU, API, CEO, HTML, …) - Nummerierte Listen als separate Chunks behandelt - Modell-Warmup via TTS_PRELOAD_LANG Env-Variable - requirements.txt: Upper-Bounds für fastapi und uvicorn Dokumentation: CLAUDE.md, README.md, BEDIENUNGSANLEITUNG.md vollständig aktualisiert Co-Authored-By: Claude Sonnet 4.6 <noreply@anthropic.com>
This commit is contained in:
parent
d1971049ce
commit
34a34907a8
8 changed files with 778 additions and 114 deletions
124
README.md
124
README.md
|
|
@ -9,11 +9,14 @@ HTTP-Service und als MCP-Server für KI-Assistenten.
|
|||
|
||||
- **Satz-für-Satz-Ausgabe** — gibt den ersten Satz aus, während die nächsten bereits generiert werden; minimale Latenz
|
||||
- **Lückenlose Audiowiedergabe** — Callback-basierter OutputStream; keine Unterbrechungen zwischen Sätzen
|
||||
- **Pause/Resume** — Ausgabe pausieren und fortsetzen ohne Datenverlust (`POST /pause`, `POST /resume`)
|
||||
- **Geschwindigkeitsanpassung** — pitch-erhaltende Zeitstreckung via pyrubberband (R3-Engine); `--speed 0.5`–`2.0`
|
||||
- **Voice Cloning** — optionale WAV-Referenz für Akzent und Klang
|
||||
- **Mehrsprachig** — Deutsch, Englisch und 20+ weitere Sprachen via `ChatterboxMultilingualTTS`
|
||||
- **Deutsche Textnormalisierung** — Abkürzungen (ARD → „Ah Er De"), Uhrzeiten (14:58 → „vierzehn Uhr achtundfünfzig"), Jahreszahlen, Einheiten, Aussprache-Wörterbuch
|
||||
- **HTTP-Service** — FastAPI-Service mit Job-Queue, Stop/Interrupt, Status-Endpunkt
|
||||
- **Gemischtsprachige Texte** — `[en]...[/en]`-Markierungen für englische Passagen in deutschen Texten
|
||||
- **Deutsche Textnormalisierung** — Abkürzungen (ARD → „Ah Er De"), Uhrzeiten (14:58 → „vierzehn Uhr achtundfünfzig"), Jahreszahlen bis Milliarden, Einheiten (°C, °F, kWh, m², …), Aussprache-Wörterbuch
|
||||
- **Markdown-Bereinigung** — entfernt `**fett**`, `# Überschrift`, Links, Code-Blöcke automatisch vor der Synthese
|
||||
- **HTTP-Service** — FastAPI-Service mit Job-Queue, Stop/Pause/Interrupt, Status-Endpunkt
|
||||
- **MCP-Adapter** — direkte Integration in Claude Code, Claude Desktop und andere MCP-Hosts
|
||||
- **Systemd-Autostart** — Service startet automatisch beim Login
|
||||
|
||||
|
|
@ -71,6 +74,13 @@ python chatterbox_cli_v4.py --lang de --no-play --output ausgabe.wav --input tex
|
|||
|
||||
# Aussprache-Wörterbuch
|
||||
python chatterbox_cli_v4.py --lang de --pronunciation-dict aussprache.json --input text.txt
|
||||
|
||||
# Gemischtsprachiger Text
|
||||
python chatterbox_cli_v4.py --lang de --text \
|
||||
"Das [en]Machine Learning[/en] Modell kostet ca. 50 €."
|
||||
|
||||
# Markdown-Bereinigung deaktivieren
|
||||
python chatterbox_cli_v4.py --lang de --no-strip-markdown --input text.txt
|
||||
```
|
||||
|
||||
### CLI-Optionen
|
||||
|
|
@ -86,6 +96,7 @@ python chatterbox_cli_v4.py --lang de --pronunciation-dict aussprache.json --inp
|
|||
| `--t3-model` | `v3` | Multilingual-Modell: `v3` oder `v2` |
|
||||
| `--acronym-mode` | `german` | Akronym-Modus: `german`, `space`, `period_space` |
|
||||
| `--pronunciation-dict` | — | JSON-Datei mit Aussprache-Substitutionen |
|
||||
| `--no-strip-markdown` | — | Markdown-Formatierung nicht entfernen |
|
||||
| `--save` | nein | WAV-Datei speichern |
|
||||
| `--output DATEI.wav` | — | Ausgabepfad (impliziert `--save`) |
|
||||
| `--no-play` | — | Nicht live abspielen |
|
||||
|
|
@ -97,6 +108,33 @@ python chatterbox_cli_v4.py --lang de --pronunciation-dict aussprache.json --inp
|
|||
|
||||
---
|
||||
|
||||
## Gemischtsprachige Texte
|
||||
|
||||
Deutsche Texte enthalten oft englische Fachbegriffe, Markennamen oder Zitate.
|
||||
Mit `[xx]...[/xx]`-Markierungen werden diese Passagen mit der richtigen `language_id`
|
||||
an das Multilingual-Modell übergeben:
|
||||
|
||||
```
|
||||
Das [en]Machine Learning[/en] Framework kostet ca. 50 €.
|
||||
Der [en]CEO[/en] sagte: [en]"We are committed to innovation."[/en]
|
||||
```
|
||||
|
||||
Ohne Markierungen verhält sich das System identisch wie bisher.
|
||||
|
||||
Häufige englische Tech-Begriffe werden bereits automatisch korrekt ausgesprochen
|
||||
(eingebaut in `DEFAULT_PRONUNCIATION_DE`):
|
||||
|
||||
| Begriff | Aussprache |
|
||||
|---------|-----------|
|
||||
| GitHub | „Git Hab" |
|
||||
| YouTube | „Jutjub" |
|
||||
| LinkedIn | „Linked In" |
|
||||
| Wi-Fi | „Wai Fai" |
|
||||
| iPhone | „Aiphone" |
|
||||
| ChatGPT | „Tschet Dschie Pie Tie" |
|
||||
|
||||
---
|
||||
|
||||
## HTTP-Service (`tts_service.py`)
|
||||
|
||||
FastAPI-Service mit Job-Queue und Worker-Thread. Startet automatisch via systemd.
|
||||
|
|
@ -105,6 +143,9 @@ FastAPI-Service mit Job-Queue und Worker-Thread. Startet automatisch via systemd
|
|||
# Manueller Start
|
||||
uvicorn tts_service:app --host 0.0.0.0 --port 9999
|
||||
|
||||
# Mit Modell-Warmup (kein Cold-Start beim ersten Request)
|
||||
TTS_PRELOAD_LANG=de uvicorn tts_service:app --host 0.0.0.0 --port 9999
|
||||
|
||||
# Systemd (Autostart, läuft bereits)
|
||||
systemctl --user status chatterbox-tts
|
||||
systemctl --user restart chatterbox-tts
|
||||
|
|
@ -117,6 +158,8 @@ journalctl --user -u chatterbox-tts -f
|
|||
|---------|------|----------|
|
||||
| `POST` | `/speak` | Text in Queue einreihen |
|
||||
| `POST` | `/stop` | Ausgabe abbrechen, Queue leeren |
|
||||
| `POST` | `/pause` | Ausgabe pausieren (ohne Datenverlust) |
|
||||
| `POST` | `/resume` | Pausierte Ausgabe fortsetzen |
|
||||
| `GET` | `/health` | Service-Status und Gerät |
|
||||
| `GET` | `/status` | Aktueller Job, Queue-Länge, letzte Jobs |
|
||||
| `GET` | `/voices` | Unterstützte Sprachen |
|
||||
|
|
@ -135,7 +178,8 @@ journalctl --user -u chatterbox-tts -f
|
|||
"max_len": 400,
|
||||
"save_wav": false,
|
||||
"output_path": null,
|
||||
"pronunciation_dict": null
|
||||
"pronunciation_dict": null,
|
||||
"session_id": null
|
||||
}
|
||||
```
|
||||
|
||||
|
|
@ -152,8 +196,12 @@ curl -X POST http://192.168.x.x:9999/speak \
|
|||
|
||||
# Laufende Ausgabe unterbrechen
|
||||
curl -X POST http://localhost:9999/speak \
|
||||
-d '{"text": "Wichtiger Text", "lang": "de", "interrupt": true}' \
|
||||
-H "Content-Type: application/json"
|
||||
-H "Content-Type: application/json" \
|
||||
-d '{"text": "Wichtiger Text", "lang": "de", "interrupt": true}'
|
||||
|
||||
# Pausieren und fortsetzen
|
||||
curl -X POST http://localhost:9999/pause
|
||||
curl -X POST http://localhost:9999/resume
|
||||
|
||||
# Stoppen
|
||||
curl -X POST http://localhost:9999/stop
|
||||
|
|
@ -180,10 +228,12 @@ TTS_URL=http://192.168.1.10:9999 python mcp_adapter.py --stdio
|
|||
|
||||
| Tool | Parameter | Funktion |
|
||||
|------|-----------|----------|
|
||||
| `speak` | text, lang, voice, interrupt, speed | Text ausgeben |
|
||||
| `stop` | — | Ausgabe stoppen |
|
||||
| `get_status` | — | Aktuellen Job abfragen |
|
||||
| `list_voices` | — | Sprachen auflisten |
|
||||
| `speak` | text, lang, voice, interrupt, speed, session_id | Text ausgeben |
|
||||
| `stop` | — | Ausgabe stoppen und Queue leeren |
|
||||
| `pause` | — | Ausgabe pausieren (ohne Datenverlust) |
|
||||
| `resume` | — | Pausierte Ausgabe fortsetzen |
|
||||
| `get_status` | — | Aktuellen Job und Queue abfragen |
|
||||
| `list_voices` | — | Unterstützte Sprachen auflisten |
|
||||
|
||||
### Claude Code Konfiguration
|
||||
|
||||
|
|
@ -214,7 +264,7 @@ claude mcp add --scope user chatterbox-tts \
|
|||
|
||||
### Claude Code / Claude Desktop — MCP (fertig eingerichtet)
|
||||
|
||||
Claude kann direkt die Tools `speak`, `stop`, `get_status` und `list_voices` aufrufen.
|
||||
Claude kann direkt die Tools `speak`, `stop`, `pause`, `resume`, `get_status` und `list_voices` aufrufen.
|
||||
Kein weiterer Setup nötig.
|
||||
|
||||
### Ollama (llama3.2, qwen2.5, mistral-nemo u. a.)
|
||||
|
|
@ -248,6 +298,24 @@ for call in resp.message.tool_calls or []:
|
|||
httpx.post("http://127.0.0.1:9999/speak", json=call.function.arguments)
|
||||
```
|
||||
|
||||
### TTS Agent (`tts_agent.py`)
|
||||
|
||||
Eigenständiger Konversationsagent mit eingebautem Function Calling:
|
||||
|
||||
```bash
|
||||
# Mit Ollama
|
||||
python tts_agent.py --model qwen2.5
|
||||
|
||||
# Mit LM Studio
|
||||
python tts_agent.py --base-url http://localhost:1234/v1 --model local-model
|
||||
|
||||
# Mit OpenAI
|
||||
OPENAI_API_KEY=sk-... python tts_agent.py --model gpt-4o
|
||||
|
||||
# Mit Voice Cloning
|
||||
python tts_agent.py --model qwen2.5 --voice my_voice.wav
|
||||
```
|
||||
|
||||
### Open WebUI
|
||||
|
||||
Im Open-WebUI-Menü unter *Tools* eine neue Python-Klasse anlegen:
|
||||
|
|
@ -268,17 +336,6 @@ class Tools:
|
|||
return "stopped"
|
||||
```
|
||||
|
||||
### LM Studio
|
||||
|
||||
LM Studio bietet einen OpenAI-kompatiblen Endpunkt. Die Tool-Definition entspricht dem
|
||||
Ollama-Beispiel oben; der Client wechselt lediglich auf die LM-Studio-URL.
|
||||
|
||||
### llama.cpp (Server-Modus)
|
||||
|
||||
llama.cpp mit `--jinja` unterstützt Function Calling, ruft aber nicht selbst HTTP-Endpoints
|
||||
auf. Benötigt eine Middleware (z. B. das Ollama-Beispiel oben), die generierte Tool-Calls
|
||||
abfängt und an `/speak` weiterleitet.
|
||||
|
||||
### Home Assistant
|
||||
|
||||
```yaml
|
||||
|
|
@ -293,6 +350,14 @@ rest_command:
|
|||
tts_stop:
|
||||
url: "http://192.168.x.x:9999/stop"
|
||||
method: POST
|
||||
|
||||
tts_pause:
|
||||
url: "http://192.168.x.x:9999/pause"
|
||||
method: POST
|
||||
|
||||
tts_resume:
|
||||
url: "http://192.168.x.x:9999/resume"
|
||||
method: POST
|
||||
```
|
||||
|
||||
Aufruf in einer Automation:
|
||||
|
|
@ -307,19 +372,18 @@ data:
|
|||
HTTP-Request-Node direkt auf `POST http://<host>:9999/speak` mit JSON-Body.
|
||||
Kein weiterer Setup nötig.
|
||||
|
||||
### Pi (Inflection AI)
|
||||
|
||||
Keine Tool-API verfügbar — direkte Integration nicht möglich.
|
||||
|
||||
---
|
||||
|
||||
## Aussprache-Wörterbuch
|
||||
|
||||
Für Namen oder Begriffe, die das Modell falsch ausspricht:
|
||||
|
||||
```json
|
||||
{
|
||||
"Xi Jinping": "Schi Dschinping",
|
||||
"Putin": "Pjutin",
|
||||
"Seoul": "Söul"
|
||||
"Seoul": "Söul",
|
||||
"Kubernetes": "Kubernetis"
|
||||
}
|
||||
```
|
||||
|
||||
|
|
@ -329,13 +393,17 @@ python chatterbox_cli_v4.py --lang de \
|
|||
--input nachricht.txt
|
||||
```
|
||||
|
||||
Häufige Begriffe sind bereits eingebaut (GitHub, YouTube, iPhone, Xi Jinping u. a.).
|
||||
Das eigene Dict wird immer **nach** dem eingebauten angewendet — Überschreibungen sind möglich.
|
||||
|
||||
---
|
||||
|
||||
## Bekannte Einschränkungen
|
||||
|
||||
- **Wortbetonung** lässt sich nicht steuern — kein SSML. Abhilfe: Voice-Referenz mit gewünschter Betonung.
|
||||
- **Laufendes `model.generate()`** kann nicht mid-call abgebrochen werden (Python-Thread-Grenzen); Stop greift am nächsten Chunk-Beginn.
|
||||
- **Chinesische/japanische Namen** werden phonetisch angenähert.
|
||||
- **Laufendes `model.generate()`** kann nicht mid-call abgebrochen werden (Python-Thread-Grenzen); Stop/Pause greift am nächsten Chunk-Beginn.
|
||||
- **Sprachmarkierungen `[en]...[/en]`** funktionieren nur mit `ChatterboxMultilingualTTS`; bei `--lang en` (mono) werden sie ignoriert.
|
||||
- **Streaming-Modus** unterstützt keine Sprachmarkierungen.
|
||||
|
||||
---
|
||||
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue