Communitygithub.com

talkback – Hören statt Lesen

Spricht Erklärungen aus jedem Projektverzeichnis laut vor, speichert das Audio und verbraucht niemals lautlos ein kontingentiertes Budget.

Was ist talkback – Hören statt Lesen?

Dieses Skill verwandelt Agentenantworten in gesprochene Ausgaben, die entweder auf Abruf oder im Talk-Modus für jede Interaktion einer Sitzung abgespielt werden. Es unterstützt drei Backends: ElevenLabs (Standard, quota-geschützt), macOS `say` (`--fast`, kostenlos, lokal, sofort) und OmniVoice (kostenlos, unbegrenzt, noch nicht getestet). Der Talk-Modus ist sitzungsbasiert, standardmäßig deaktiviert und für den Rest der Sitzung aktiviert, sodass parallele Agenten in anderen Arbeitsbäumen stumm bleiben. Die Sprachausgabe ist Markdown-bewusst: Code-Fences, URLs und tiefe Pfade werden zu kurzen Platzhaltern zusammengefasst, während snake_case-Bezeichner für die Suchbarkeit erhalten bleiben. Der Skill funktioniert mit Claude Code (primär) und anderen Terminal-Umgebungen und bietet Fallbacks in einer Qualitätsleiter, die von ElevenLabs über OmniVoice zu `say` absteigt, wobei die Quotenerschöpfung durch einen Reservepuffer von 250 Zeichen geschützt wird.

Funktioniert mit✓Claude Code~Codex CLI~Cursor
npx skills add https://github.com/broomva/skills/tree/HEAD/skills/audio/talkback

In Ihrer bevorzugten KI fragen

Öffnet einen neuen Chat, in dem dieser Agent-Skill bereits geladen ist.

Dokumentation

talkback — Hören statt Lesen

Spricht Text aus jedem Projektverzeichnis laut vor, speichert das Audio und verbraucht niemals lautlos ein kontingentiertes Budget.

Standardmäßig auf Abruf. Es spricht, wenn danach gefragt wird – der Benutzer sagt „erkläre das laut“, oder das Skript wird direkt ausgeführt. Es spricht nicht von selbst, bis jemand den Talk-Modus aktiviert, und der Talk-Modus gehört jeweils nur einer Sitzung.

Verwendung

S=~/.claude/skills/talkback/scripts

$S/talkback.py "Hier ist, was sich geändert hat und warum es wichtig ist."   # ElevenLabs (Standard)
$S/talkback.py --fast "Wegwerf-Satz."                                      # lokal, sofort, kostenlos
$S/talkback.py --quota                                                      # was übrig ist
$S/talkback.py --voices                                                     # Stimmen auflisten
$S/talkback.py --dry-run "..."                                              # gesprochenen Text anzeigen, nichts synthetisieren
$S/talkback.py --help                                                       # alle Optionen

$S/talkback-hook.py --on                                                    # Talk-Modus EIN, nur diese Sitzung
$S/talkback-hook.py --off                                                   # Sprechen beenden
$S/talkback-hook.py --status                                                # wer spricht, ist der Hook verbunden
$S/talkback-hook.py --outputs                                               # Audio-Ausgänge auf diesem Rechner

Text kann auch per Pipe übergeben werden: git log -1 --pretty=%B | $S/talkback.py.

Wie der Agent es verwenden sollte

Hier leben zwei verschiedene Dinge. Einmaliges Sprechen ist ausgearbeitete Prosa, die Sie an talkback.py übergeben. Talk-Modus ist eine dauerhafte Einstellung, die Sie mit talkback-hook.py umschalten; Sie verfassen dessen Text nie, der Hook liest den aktuellen Turn.

Einmaliges Sprechen

Wenn der Benutzer um eine Erklärung bittet, schreiben Sie für das Ohr und sprechen Sie sie dann. Leiten Sie keinen rohen Markdown oder einen Diff in das Tool. Verfassen Sie zwei bis fünf Sätze in einfacher, gesprochener Prosa – was sich geändert hat, warum, was es für sie bedeutet – und übergeben Sie diese. Der Zuhörer kann nicht zurückscrollen, also beginnen Sie mit der Schlussfolgerung.

Verwenden Sie standardmäßig die gute Stimme – der Plan erlaubt es bequem. Greifen Sie zu --fast, wenn der Text eine Wegwerfsache ist oder Sie null Netzwerklatenz wünschen. Geben Sie an, welches Backend verwendet wurde, falls ein Fallback stattfand.

Steuerung des Talk-Modus

Was der Benutzer sagt, wird in einen Befehl übersetzt. Führen Sie ihn aus; erzählen Sie die Änderung nicht auch noch von Hand, denn der Hook wird den Turn, den Sie schreiben, vorlesen.

Der Benutzer sagtFühren Sie aus
„Talk-Modus an“, „weiterreden“, „diese Sitzung erklären“talkback-hook.py --on
„Aufhören zu reden“, „Stumm“, „Sei ruhig“talkback-hook.py --off
„Nur die Highlights“, „weniger Details“talkback-hook.py --on brief
„Sag mir nur die wichtigen Teile“talkback-hook.py --on marker
„Benutze meine AirPods“, „Spiele es auf X ab“talkback-hook.py --outputs, dann --on --output "<name>"
„Benutze die billige Stimme“, „Hör auf, das Kontingent zu verbrauchen“talkback-hook.py --on --backend say
„Ist es an?“, „Warum höre ich nichts?“talkback-hook.py --status
„Spricht da noch etwas anderes?“talkback-hook.py --sessions
„Mach alles leise“ (alle Sitzungen)talkback-hook.py --off --all

Drei Dinge, die Sie überprüfen sollten, bevor Sie dem Benutzer sagen, dass es funktioniert:

  • --status zeigt an, ob der Hook registriert ist. Wenn nicht, führen Sie --install aus und teilen Sie mit, dass ein Neustart erforderlich ist.
  • Wenn --status warnt, dass der Hook nach dem Start dieser Sitzung registriert wurde, ist der Talk-Modus an und wird hier keinen Ton erzeugen. Sagen Sie es – lassen Sie ihn nicht durch Stille darauf stoßen.
  • Der Talk-Modus überlebt die Sitzung nicht. Nach einem Neustart oder einem /clear ist er wieder aus und benötigt --on. Das ist beabsichtigt, kein Fehler; sagen Sie es einmal, anstatt dass er erneut fragen muss.

Im marker-Modus – und immer dann, wenn die Rückmeldung eine für das Ohr geschriebene Zusammenfassung sein soll und nicht der Turn selbst – beenden Sie die Nachricht mit einem Marker:

<!-- talkback: Authentifizierungsschicht umgestaltet, drei Aufrufstellen, Tests grün. -->

Backends

BackendKostenQualitätHinweise
elevenlabs (Standard)kontingentiertbestequota-geschützt, fällt automatisch auf say zurück
say (--fast)kostenlos, unbegrenztausreichendmacOS-nativ, ~sofort, kein Netzwerk
omnivoicekostenlos, unbegrenztgutlokal + privat; benötigt laufendes Backend. Ungeprüft – siehe unten

Die Leiter

elevenlabs → omnivoice → say, beste zuerst. Eine Sprosse, die den Job nicht übernehmen kann – kein Schlüssel, Kontingent bis zur Reserve aufgebraucht, lokaler Server ausgefallen, Synthesefehler – gibt an die nächsttiefere weiter, sodass die Stimme nachlässt, anstatt dass das Audio fehlt. TALKBACK_CHAIN ändert die Reihenfolge.

Die explizite Anforderung einer Sprosse startet die Leiter dort und steigt nur ab: --fast bedeutet „jetzt lokal“ und steigt nie wieder zu einem kontingentierten Backend hoch. Jeder Fallback gibt den Grund auf stderr aus und das gewählte Backend landet im Ledger, sodass eine verschlechterte Ausführung nie stillschweigend verschlechtert ist.

--strict verwandelt jeden Fallback in einen harten Fehler (exit 1), für Skripte, die nicht stillschweigend degradieren dürfen.

Kontingent

Der Account ist Creator-Tarif: 130.958 Zeichen/Monat. Eine zweiminütige gesprochene Erklärung umfasst etwa 1.500 Zeichen, also etwa 87 davon pro Monat – genug, dass die gute Stimme die Standardeinstellung sein kann, nicht eine Ausnahme.

Überprüfen Sie zum Zeitpunkt der Verwendung, niemals aus dem Gedächtnis – talkback.py --quota liest es live. Der Tarif hat sich bereits einmal geändert, und eine Zahl in einem Dokument ist veraltet, sobald sich der Plan bewegt.

Vor der Synthese liest das Tool das Live-Kontingent und behält eine Reserve von 250 Zeichen, sodass eine lange Erklärung nie das gesamte Guthaben aufbrauchen kann. Wenn die Anfrage nicht passen würde, warnt es auf stderr und verwendet stattdessen say.

Anmeldedaten werden in dieser Reihenfolge aufgelöst: $ELEVENLABS_API_KEY → ~/.elevenlabs/api_key (geschrieben von elevenlabs auth login) → ELEVENLABS_API_KEY in ~/broomva/.env.local. Auf diesem Rechner existieren zwei verschiedene Schlüssel, die jedoch zum selben Account auflösen, daher prüft der eine auch den anderen.

Der Creator-Tarif entsperrt außerdem die sofortige und professionelle Stimmklonung (30 Stimmslots, 1 professionell). --voices listet auf, was der Account derzeit verwenden kann.

Das Paket @elevenlabs/cli wird zur Laufzeit nicht verwendet und kann dies nicht – seine gesamte Oberfläche ist auth · agents · tools · tests · components, die gehostete ConvAI-Agentenprojekte verwaltet. Es hat keinen Synthesebefehl. Die CLI ist hier nur für auth login nützlich, das die Schlüsseldatei schreibt.

OmniVoice-Tarif ist ungeprüft

Das omnivoice-Backend wurde gegen die dokumentierte Form implementiert, jedoch nie getestet – das lokale Backend war bei der Auslieferung nicht verfügbar. Es degradiert sauber (fällt auf say zurück oder schlägt unter --strict fehl). Um es in Betrieb zu nehmen, siehe das omnivoice-Skill; das Repository befindet sich bereits unter ~/broomva/external/OmniVoice-Studio.

Sprach-Text-Verarbeitung

Agentenprosa ist nicht zum Hören geschrieben, daher wird der Text zuerst aufbereitet:

  • Code-Fences → (code weggelassen); URLs → (link)
  • Überschriften und Aufzählungen werden zu Satzbrüchen, sodass Listen nicht zusammenlaufen
  • Tiefe Pfade werden auf den Basisnamen gekürzt (src/lib/engine.py → engine.py); verwenden Sie --keep-paths, um sie vollständig zu hören
  • Markdown-Hervorhebungen werden nur dort entfernt, wo sie eine Spanne begrenzen – ein bloßer Unterstrich innerhalb von backend_chain bleibt erhalten, denn das Entfernen würde ein Symbol, nach dem der Zuhörer suchen könnte, in eines verwandeln, das er nicht finden kann.

Gespeicherte Audios

Jede Äußerung landet in ~/.talkback/audio/ als mp3 (konvertiert über ffmpeg, falls vorhanden) mit einem Zeitstempel und einem Sluggified-Dateinamen und wird an ~/.talkback/ledger.jsonl angehängt. Verwenden Sie --no-save, um sie zu verwerfen, --out-dir, um das Ziel zu ändern.

Talk-Modus – Die Sitzung während des Verlaufs erklären

Der Talk-Modus bewirkt, dass der Agent am Ende jedes Turns eine kurze Rückmeldung spricht, solange die Sitzung läuft. Er ist standardmäßig aus, wird von Hand eingeschaltet und gehört zu einer Sitzung.

$S/talkback-hook.py --on                    # volle Details, jeder Turn, DIESE Sitzung
$S/talkback-hook.py --on brief              # nur die ersten Zeilen
$S/talkback-hook.py --on marker             # nur Turns mit einem Marker
$S/talkback-hook.py --on --backend elevenlabs   # die gute Stimme, kontingentiert
$S/talkback-hook.py --on --output "AirPods Pro"  # welcher Lautsprecher diese Sitzung verwendet
$S/talkback-hook.py --off                   # Sprechen beenden (diese Sitzung)
$S/talkback-hook.py --off --all             # Kill-Switch, überall
$S/talkback-hook.py --status                # Modus, Backend, wer sonst noch spricht
$S/talkback-hook.py --sessions              # jede derzeit sprechende Sitzung

Warum auf Sitzungsebene begrenzt

Der Stop-Hook wird einmal global und dauerhaft registriert – ein Schalter, den man während einer Sitzung nicht umlegen kann, ist kein Schalter. Also feuert der Hook in jeder Sitzung, und das Flag ist das, was die Begrenzung bewirkt: Der Talk-Modus ist eine Eigenschaft einer Sitzung, nicht des Rechners.

Das Flag ist ~/.talkback/sessions/<sitzungs-id>; eine Sitzung, die nie zugestimmt hat, hat keines, also beendet sich der Hook mit 0 ohne Ton. Das hält sechs parallele Agenten in sechs Arbeitsbäumen stumm, während die eine Sitzung, die Sie beobachten, spricht. Das Design vor 0.3.0 hatte ein einziges maschinenweites Flag, weshalb es nie eingeschaltet wurde: Das Aktivieren machte jeden Agenten auf der Box gleichzeitig hörbar.

Die Sitzungs-ID wird aus CLAUDE_CODE_SESSION_ID oder CLAUDE_SESSION_ID gelesen; --session <id> setzt sie explizit. Wenn keine davon antwortet, gibt der Befehl pass --session <id> aus und beendet sich mit 2, anstatt zu raten – früher fiel er auf das neueste Transkript im Arbeitsverzeichnis zurück, was bedeutete, dass bei zwei geöffneten Sitzungen in einem Verzeichnis --on diejenige Sitzung aktivierte, die zuletzt berührt wurde, nicht die, die darum bat.

Auf der Hook-Seite ist das session_id des Payloads maßgeblich: Wenn es vorhanden ist, ist es der einzige Schlüssel, den das Tor autorisiert. Der Transkript-Dateinamensstamm wird nur verwendet, wenn dieses Feld fehlt. Beide wurden einmal gemeinsam akzeptiert, was dazu führte, dass ein Payload, der Sitzung A und das Transkript von Sitzung B nannte, Bs Opt-In auflöste und in A sprach.

--session <id>, das auf eine andere Sitzung abzielt, ist beabsichtigt und keine Sicherheitsgrenze. Sitzung A, die talkback-hook.py --session B --off ausführt, aktiviert oder deaktiviert Bs Talk-Modus ohne Bs Zustimmung – es gibt keine Besitzprüfung, die ein Flag an die Sitzung bindet, die es gesetzt hat. Das ist eine Funktion, die absichtlich beibehalten wurde, nicht rückgängig gemacht: Jede Sitzung auf der Box läuft als derselbe OS-Benutzer, daher kann jede Sitzung bereits direkt die Flag-Datei einer anderen Sitzung unter ~/.talkback/sessions/ schreiben. Eine Besitzprüfung innerhalb der CLI würde nur den höflichen Weg über das Flag stoppen, nicht den direkten – eine Grenze mit demselben Prinzip kann einen Schreiber, der das Prinzip teilt, nicht aufhalten. Das Flag begrenzt den Ton, sodass parallele Agenten standardmäßig stumm bleiben; es begrenzt nicht die Kontrolle, und nichts hier sollte so gelesen werden, als täte es das.

Detailstufen

ModusSpricht
full (Sitzungsstandard)den gesamten Turn, jeden Turn – angeführt vom Marker, wenn der Agent einen geschrieben hat
briefdie ersten TALKBACK_HOOK_CHARS (320) Zeichen von Turns über TALKBACK_HOOK_MIN_CHARS (80); ein Marker gewinnt, wenn vorhanden
markernur Turns mit einem <!-- talkback: ... --> Marker, und nur den Markierungstext
offniemals – geschrieben von --off, wenn ein globales Flag die Sitzung sonst wieder aktivieren würde

full ist der Standard, denn der Sinn einer Rückmeldung ist, wegzugehen und zurückzukommen und zu wissen, was passiert ist. Ein gekürzter Auszug ist eine Vorschau auf die Antwort, nicht die Antwort – Sie müssten immer noch den Bildschirm lesen, was der Talk-Modus vermeiden soll. Was weggelassen wird, ist nur das, was gar nicht gehört werden kann (Code-Fences, URLs, tiefe Pfade – siehe Sprach-Text-Verarbeitung), niemals das, was nur lang ist. full hat auch keine Längenuntergrenze: „Erledigt, Tests grün“ ist ein Ergebnis, das Sie wollen, wenn Sie nicht am Rechner sind, kein Rauschen.

brief und marker sind für einen langen unbeaufsichtigten Bogen, bei dem Sie die Form des Fortschritts wollen, nicht das Transkript davon.

TALKBACK_FULL_MAX_CHARS setzt eine Obergrenze für full, standardmäßig aus – eine Obergrenze macht full wieder zu brief, und zwar genau bei den Turns, die es wert sind, vollständig gehört zu werden.

Rückmeldungen durchlaufen die gesamte Backend-Leiter – zuerst ElevenLabs, absteigend nur, wenn eine Sprosse nicht verwendbar ist. Volle Details bei jedem Turn verbrauchen daher echtes Kontingent: Ein Turn mit 1.500 Zeichen ist ~1 % des monatlichen Creator-Guthabens, sodass eine lange Sitzung die Reserve erreicht, woraufhin sie auf der nächsten Sprosse weiterredet, anstatt still zu werden. --on --backend say hält es niedrig, --on brief verkürzt es.

Wenn eine Rückmeldung in die nächste läuft

Eine vollständige Rückmeldung kann noch abgespielt werden, wenn der nächste Turn endet. TALKBACK_ON_OVERLAP entscheidet, was passiert:

WertVerhalten
interrupt (Standard)die neue Rückmeldung unterbricht die alte – der neueste Zustand ist der, den es zu hören lohnt
queuesie werden in der Reihenfolge abgespielt, sodass eine lange detaillierte Rückmeldung nie abgeschnitten wird; Sie fallen zurück, hören aber alles

queue ist die richtige Einstellung für einen unbeaufsichtigten Bogen, den Sie später vollständig anhören möchten; interrupt ist richtig, wenn Sie am Rechner sind und die neueste Information wollen.

Der Marker

Um einen einzelnen Turn zu aktivieren – im marker-Modus oder um eine für das Ohr geschriebene Zusammenfassung anstelle der Eröffnungszeilen der Nachricht zu sprechen – beenden Sie die Nachricht mit:

<!-- talkback: Authentifizierungsschicht umgestaltet, drei Aufrufstellen, Tests grün. -->

Im full-Modus wird der Marker zur Schlagzeile: Er wird zuerst gesprochen, dann der gesamte Turn dahinter, sodass die Rückmeldung mit der Schlussfolgerung beginnt, ohne die Details zu verlieren. Im brief-Modus ersetzt der Marker den Auszug, und ein markerloser Turn fällt auf die einleitenden Sätze zurück, die an einer Satzgrenze abgeschnitten werden.

Welcher Lautsprecher

Das Audio kommt von dem Rechner, auf dem Claude Code läuft. Eine Sitzung, die Sie von einem Telefon, einem Tablet oder einem anderen Laptop aus steuern, klingt dennoch auf dem Host, daher ist der Hebel, der zählt, die Auswahl, auf welchem der Host-Ausgänge es landen soll – AirPods, die mit dem Mac gekoppelt sind, ein AirPlay-Lautsprecher, ein Bildschirm, die eingebauten Lautsprecher.

$S/talkback-hook.py --outputs             # was dieser Host abspielen kann
$S/talkback-hook.py --on --output "AirPods Pro"
$S/talkback.py -d "MacBook Pro Lautsprecher" "einmaliger Satz auf einem gewählten Gerät"

Die Ausgabe wird pro Sitzung gespeichert, daher bleibt die Wahl des Geräts für die Dauer der Sitzung erhalten.

…

[gekürzt zur Übersetzung]

Individual skills in this repo

This repo contains 7 individual skills — each has its own dedicated page.

broomva/skills

Local TTS, voice cloning, voice design, and video dubbing via the OmniVoice Studio MCP server (open-source ElevenLabs alternative; nothing leaves the machine, runs on MPS/CUDA/CPU). Use when: (1) generating speech from text in any of 646 languages, (2) cloning a voice from a 3-second reference clip, (3) designing a voice by gender/age/accent/pitch/style, (4) dubbing a video into another language, (5) listing voice profiles or personality presets, (6) producing narration where privacy, cost, or absent API keys matter, (7) non-English narration where Edge TTS/kokoro fall short, (8) batch audio for blog posts or content pipelines. Triggers: 'omnivoice', 'voice clone', 'clone this voice', 'tts', 'narrate', 'generate speech', 'voice synthesis', 'dub video', 'voice design', 'local tts', 'multilingual voice', 'narrate this post', 'elevenlabs alternative'.

broomva/skills

Shop Tiendas D1 (Colombia, d1.com.co) from the command line — search the catalogue, resolve your nearest physical store, price a basket against that store's real stock, and quote delivery. D1 runs VTEX IO (account `d1tiendas`), so this drives its public storefront API with no admin key at all — catalogue and cart work fully anonymously, and a one-time emailed code unlocks order history. Handles the two traps that make naive D1 automation wrong — availability is regionalized (an unregioned query reports a national catalogue nobody can actually buy from) and prices arrive in two different units (search reports whole pesos, checkout reports hundredths, a silent 100x). Builds and prices baskets; it deliberately cannot pay, handing a checkout URL to a human instead. USE WHEN the user wants to find D1 products or prices, check whether D1 delivers somewhere, build or cost a D1 grocery basket, compare D1 items, or review their D1 orders. NOT FOR other Colombian retailers (Éxito, Jumbo, Ara, Alkosto), and not for c...

broomva/skills

Stateful, local-first household toxics inventory + swap engine. Identify the items in a home that carry endocrine disruptors and persistent chemicals (BPA/BPS, phthalates, PFAS/PTFE, parabens, flame retardants, VOCs, microplastics), score each by *real* exposure (severity x presence x how it's used x condition), and track the swap to a safer alternative from "flagged" -> "sourced" -> "swapped". Ships a grounded, cited knowledge graph of ~20 hazards, ~40 item-classes, and ~40 alternatives. Hands sourcing off to the `procurer` skill. The skill's state is the source of truth — the agent is the app.

broomva/skills

Tekton — the shared architecture-intent substrate for co-designing systems with the agent. One typed graph across six tiers (system / journey / data / infra / decisions / qualities); views are queries, not separate diagrams. The canonical artifact is a diff-friendly YAML model both human and agent read and write; it renders to Mermaid (agent-legible, GitHub-native) and a self-contained tabbed HTML viewer (human-visual). Cross-tier traceability (`tekton query <from> <to>`) answers "which infra does this user-journey step touch?" as a path query. USE WHEN: designing or thinking deeply about architecture, a system, a data model, user journeys/flows, or a technical plan WITH the agent; when a Category-C HTML doc isn't enough because you need to see AND edit AND traverse the design across tiers; "let's design X", "architect this", "model the system", "draw the flow", "how does this fit together", "diagram this", "/tekton". NOT FOR: a one-off throwaway diagram (use Mermaid inline); prose-only ADRs (write the ADR...

broomva/skills

Generate a polished Remotion video and X thread showcasing the full agent skills inventory. Use when creating social media content about skills, rendering category-based skill visualizations, or producing animated showcases of agent capabilities. Triggers on "skills video", "showcase skills", "skills thread", "render skills", "social content for skills", or requests to visualize the skills inventory.

broomva/skills

OpenCaptions extension for Content Engine — adds intent-driven CWI (Caption With Intent) captions to the post-production pipeline. Hooks into the grade → caption → final stage. Generates captions that understand video intent (pitch, volume, emotion, emphasis) and style themselves accordingly with variable font weight, size, and color. Uses the OpenCaptions CLI or MCP server. Triggers on: 'add captions', 'opencaptions', 'CWI captions', 'intent captions'.

broomva/skills

Produce polished product launch videos using the Liquid Glass aesthetic — dark void backgrounds, 3D perspective floating UI panels, particle effects, spring animations, and cinematic pacing. Built on Remotion with Imagen 4.0 for frames and Veo 3.1 for B-roll. Use when: (1) creating a product demo or launch video, (2) showcasing a UI/app/tool with cinematic polish, (3) building a social-ready video from screenshots and renders, (4) applying the liquid glass floating panel style, (5) composing Remotion videos with 3D transforms and spring animations. Triggers on: 'launch video', 'product video', 'liquid glass video', 'demo video', 'showcase video', 'remotion video', 'floating panel', 'glass aesthetic'.

Verwandte Skills