TAS — Text & Speech, in beide Richtungen (Speakee API)
Ein Skript beherrscht beide Richtungen:
- Text → Sprache (TTS): 40+ Sprachen, 100+ Stimmen, benutzerdefinierte Voice-UID, Aufteilung langer Texte, Multi-Voice-Konversationsmodus, ffmpeg-Zusammenführung, Audio-Qualitätssicherung.
- Audio → Text (STT): Transkribiere jede Audio-/Videodatei in Text, Wort-Zeitstempel und SRT/WebVTT-Untertitel, mit automatischer Aufteilung langer Aufnahmen.
Alles wird durch das gebündelte Skript erledigt — niemals inline neu implementieren und NIE etwas installieren (kein Whisper, kein Torch, kein Faster-Whisper, kein Pip):
<Skill-Basisverzeichnis>/scripts/tas.py
Typische Installationsorte:
~/.config/opencode/skills/tas/scripts/tas.py (opencode),
~/.claude/skills/tas/scripts/tas.py (Claude Code), und
~/.agents/skills/tas/scripts/tas.py (das skills CLI, npx skills add).
Der Skill heißt tas — lade ihn mit dem Namen tas, niemals tts.
Unverhandelbare Regeln (gelten für JEDE Anfrage)
- Das gebündelte Skript verwenden. Keine Ad-hoc-Curl-/Python-Schnipsel für TTS oder STT.
- NIEMALS etwas installieren. Führe kein
pip install faster-whisper,pip install whisper,pip install torchaus und lade kein Modell herunter. Das Skript erledigt STT vollständig über die Speakee API mit der Python-Standardbibliothek — kein lokales Modell, kein lokaler Download, kein Pip. - Vor der Auslieferung überprüfen.
ttsundconversationführen die Audio-QS automatisch durch; einQA: FEHLGESCHLAGENmuss korrigiert werden, niemals ausgeliefert werden. - Ergebnis melden: endgültiger Pfad, Dauer, Größe und QS-Status (TTS); endgültiger SRT/VTT/Text-Pfad und Cue-Anzahl (STT).
- Immer vorab prüfen. Sprache, Modell und Stimme werden vor jeder Anfrage validiert; niemals eine geratene Stimme senden.
- Cache eingeschaltet lassen, es sei denn, der Benutzer wünscht etwas anderes. Er macht Wiederholungen schnell und setzt fehlgeschlagene Konversationen fort.
- Niemals einen Stimmnamen erraten. Er wird mit
voices/suggestaufgelöst oder die UUID übergeben. - Die kostenlose API respektieren: Standard
--workers 4; bei HTTP 429 reduzieren. - Das Skript Text normalisieren lassen. Markdown, URLs, HTML und Emoji werden
standardmäßig entfernt;
--rawnur verwenden, wenn der Benutzer den wörtlichen Text möchte. - Langen Text niemals vorher aufteilen. Das Skript teilt an Satzgrenzen auf und führt automatisch zusammen.
- Für STT immer
-l <Code>übergeben, wenn die Sprache bekannt ist. Auto-Erkennung ist unzuverlässig (Whisper verwechselt Bengalisch/Gujarati);-l bnist für korrektes Bengalisch erforderlich. --jsonverwenden, wenn ein anderes Tool oder Skript das Ergebnis verarbeitet.
Befehle
| Befehl | Zweck |
|---|---|
tts | Synthetisiere einen Textblock (TTS) |
uid | Synthetisiere mit einer benutzerdefinierten Voice-UID (language=uid) |
conversation | Multi-Sprecher-Dialog → eine zusammengefügte, geprüfte MP3 |
stt | Transkribiere eine Audio-/Videodatei → Text (+ optional SRT/VTT) |
transcribe | Alias für stt |
subtitle | Transkribiere und schreibe eine SRT |
verify | Führe Audio-QS für jede Datei aus |
voices -l <Code> | Liste Stimmen für eine Sprache auf |
suggest -l <Code> | Liste Stimmen mit markierten Empfehlungen auf |
presets | Liste integrierte Stimmvoreinstellungen auf |
languages | Liste unterstützte Sprachen auf |
models | Liste Modelle auf (sonic-3.5 Standard) |
cache-clear | Lösche den Synthese-Cache |
Arbeitsablauf A — Text zu Sprache (TTS)
Schritt 1 — Umfang
Identifiziere: Sprache (oder Auto-Erkennung verwenden), Tonfall (Nachrichten / Geschichte / Assistent / Hörbuch), Einzelsprecher oder Dialog, gewünschter Ausgabepfad und ob Untertitel (--srt) oder Metadaten (--title/--artist) benötigt werden.
Schritt 2 — Sprache und Stimme wählen
python3 "$S" languages # 43 Codes
python3 "$S" suggest -l bn # empfohlene Stimmen zuerst
python3 "$S" presets # kuratierte Stimmensets
Wenn der Benutzer eine benutzerdefinierte Voice-UID hat, verwende den uid-Modus. Ansonsten bevorzuge eine Voreinstellung oder eine empfohlene Stimme gegenüber der Standardeinstellung.
Schritt 3 — Synthetisieren
Einzelsprecher:
python3 "$S" tts "Ihr Text" -l bn -o out.mp3
python3 "$S" tts --text-file artikel.md -l en --preset news -o artikel.mp3
Dialog:
python3 "$S" conversation dialog.txt -l bn \
--map "Mensch=Nayem,KI=Pooja - Everyday Assistant" \
--loudnorm --srt dialog.srt -o dialog.mp3
Bei langen oder teuren Durchläufen zuerst --dry-run verwenden.
Schritt 4 — Überprüfen
Die QS läuft automatisch. Zum erneuten Prüfen einer Datei:
python3 "$S" verify out.mp3
Prüft: Dekodierung, Dauer, integrierte Lautstärke (ebur128), wahrer Spitzenwert/Clipping sowie führende/nachfolgende/interne Stille. Exit-Code 5 bedeutet FEHLGESCHLAGEN.
Schritt 5 — Ausliefern
Melde:
out.mp3 — 2,8s, 0,04 MB, QS BESTANDEN (-18,9 LUFS, Spitze -4,2 dBFS)
Roh-JSON nicht einfügen, es sei denn, es wird danach gefragt.
Schritt 6 — Wiederverwenden
Wiederholungen treffen den Cache (~/.cache/speakee-tas). --force zum Neugenerieren,
cache-clear zum Löschen verwenden.
Arbeitsablauf B — Sprache zu Text (STT)
Verwende dies, wenn der Benutzer eine Audio- oder Videodatei hat und ein Transkript,
Untertitel, Bildunterschriften oder eine SRT wünscht. Whisper nicht installieren — das gebündelte Skript
ruft den Speakee /api/stt-Endpunkt direkt auf.
Schritt 1 — Datei bestätigen
python3 "$S" verify /pfad/zu/audio.mp3 # optional: bestätigt, dass es dekodiert
ls -la /pfad/zu/audio.mp3
Schritt 2 — Sprache wählen
# Auto-Erkennung (unzuverlässig — Whisper verwechselt Bengalisch/Gujarati):
python3 "$S" stt audio.mp3
# IMMER die explizite Sprache bevorzugen, wenn bekannt:
python3 "$S" stt audio.mp3 -l bn
Wichtig: -l <Code> für die korrekte Schrift übergeben. Für Bengalisch
-l bn verwenden; Auto-Erkennung gibt Gujarati für bengalisches Audio zurück. Warnungen
mit geringer Konfidenz (< 0.5) bedeuten, dass die erkannte Sprache wahrscheinlich falsch ist.
Schritt 3 — Transkribieren + Untertitel erstellen
# SRT + VTT neben der Eingabe schreiben und das Transkript speichern:
python3 "$S" stt audio.mp3 -l bn \
--srt --srt-path audio.srt --vtt --vtt-path audio.vtt \
-o audio.txt
# Kurzform: nur die SRT (Untertitel-Befehl):
python3 "$S" subtitle audio.mp3 -l bn -o audio.srt
# Maschinenlesbares JSON (für andere Tools):
python3 "$S" stt audio.mp3 -l bn --json -o ergebnis.json
# Lange Aufnahmen: automatisch in ~120s Chunks aufgeteilt; kleinere Chunks erzwingen oder einen Upload:
python3 "$S" stt audio.mp3 -l bn --chunk-seconds 60
python3 "$S" stt audio.mp3 -l bn --no-chunk # nur wenn < ~3,5 MB
Schritt 4 — Ausliefern
Melde:
audio.srt — 111 Cues (8,05 Min, Bengalisch)
audio.txt — Transkript gespeichert
STT-Flags: --srt, --srt-path, --vtt, --vtt-path, --no-word-timestamps
(schneller, geschätztes Timing), --chunk-seconds, --no-chunk, --workers,
--max-chars, --max-line-seconds.
Konversationsmodus (TTS)
Skriptformat, eine Zeile pro Sprecherwechsel:
Die Show beginnt. <- kein "Sprecher:"-Präfix -> Erzählerstimme
Mensch: Bruder, wie viel ist 2+2?
KI: Ihre Frage wurde angenommen.
- Sprecherbezeichnungen sind kurze Tokens vor
:(≤16 Zeichen, keine Leerzeichen). - Zeilen ohne
Sprecher:-Präfix sind der Erzähler/Kommentator. Der Erzähler wird mit dem speziellen Schlüsselnarratorabgebildet, daher ist eine 3. eigene Stimme--map "narrator=StimmeC,Mensch=StimmeA,KI=StimmeB". --map "sprecher=stimme"akzeptiert einen Stimmnamen (unscharf) oder eine UUID.- Ohne
--mapwerden automatisch verschiedene Stimmen zugewiesen. - Stimmen müssen sich unterscheiden. Wenn zwei Sprecher zur selben Stimme aufgelöst werden, gibt das
Skript eine
WARNUNGaus; ordne jedem Sprecher eine andere Stimme zu. Gib der KI und dem Menschen immer unterschiedliche Stimmen (und eine 3. Stimme für den Erzähler, wenn eine Kommentator-/Erzählerzeile vorhanden ist). --silence 0.35Pause zwischen den Sprecherwechseln;--loudnormnormalisiert auf −16 LUFS.--manifest DATEIzeichnet jedes Segment auf;--srt DATEIschreibt Untertitel.--no-stitchbehält einzelne Segmentdateien statt einer einzigen MP3.--workerssteuert parallele Anfragen (Standard 4).
Optionen (am häufigsten verwendet)
| Flag | Standardwert | Bedeutung |
|---|---|---|
-l, --language | Auto-Erkennung | ISO-Code oder uid |
-m, --model | sonic-3.5 | sonic-3.5 / sonic-3 / sonic-turbo / sonic-2 |
-v, --voice_id | Voreinstellung/Standard | Stimmname oder UUID |
-o, --out | auto | Ausgabedatei / -verzeichnis (--no-stitch) |
-s, --speed | 1.2 | 0,5–2,0 |
--preset | — | news, story, assistant, audiobook |
--chunk-limit | 1200 | Zeichen pro Anfrage |
--retries | 4 | Wiederholungen mit exponentiellem Backoff |
--workers | 4 | Parallele Anfragen |
--no-cache / --force | aus | Cache umgehen / neu generieren |
--no-verify | aus | Automatische QS überspringen (nicht empfohlen) |
--dry-run | aus | Plan ausgeben, keine Anfragen stellen |
--json | aus | Maschinenlesbare Ausgabe |
STT-Optionen
| Flag | Standardwert | Bedeutung |
|---|---|---|
-l, --language | auto | ISO-Code (für Bengalisch bn verwenden) |
--chunk-seconds | 120 | Audio-Sekunden pro Upload |
--no-chunk | aus | Eine Anfrage (max. ~3,5 MB) |
--workers | 2 | Parallele Uploads |
--srt / --srt-path | aus | SRT schreiben |
--vtt / --vtt-path | aus | WebVTT schreiben |
--no-word-timestamps | aus | Schneller; Untertitel-Timing wird geschätzt |
--max-chars | 42 | Maximale Cue-Zeichen |
--max-line-seconds | 6.0 | Maximale Cue-Sekunden |
--timeout / --retries | 300 / 3 | Timeout pro Anfrage / Wiederholungen |
Caching und Sicherheit
- Segmente werden nach Content-Hash in
~/.cache/speakee-tasgecacht; Wiederholungen und erneute Versuche werden automatisch fortgesetzt. - Temporäre Concat-Dateien werden immer entfernt;
--no-cache-Temp-Verzeichnisse werden beim Beenden bereinigt. - Antworten werden validiert (
Content-Type: audio/*+ MP3-Header), sodass Fehler-JSON niemals als Audio gespeichert wird. - HTTP 429 beachtet
Retry-After; 5xx/Timeouts wiederholen mit Backoff; permanente 4xx schlagen sofort mit der Servermeldung fehl. - STT läuft vollständig prozessintern mit der Python-Standardbibliothek — keine Netzwerkinstallation, kein Modell-Download, kein Pip.
- Exit-Codes:
0ok,1Fehler,2Verwendung,3Validierung,4Netzwerk/API,5Audio-QS fehlgeschlagen.
Referenzdateien
references/api.md— Endpunkte, Payload, Validierung, Wiederholungen, Caching.references/voices.md— Sprach-/Stimmkatalog, UID-Modus, Voreinstellungen.references/troubleshooting.md— Symptome, Lösungen, häufige Fehlermodi.assets/presets.json— kuratierte Stimmvoreinstellungen (bearbeiten, um eigene hinzuzufügen).