Communitygithub.com

talkback — ouça ao invés de ler

Fala em voz alta explicações de qualquer diretório de projeto, salva o áudio e nunca gasta cota silenciosamente. Suporta ElevenLabs (padrão), macOS `say` e OmniVoice local. Modo de conversa ativável por sessão.

O que é talkback — ouça ao invés de ler?

O skill `talkback` transforma texto em fala de forma inteligente e eficiente, projetado para desenvolvedores e agentes de IA que precisam ouvir explicações em vez de lê-las. Ele opera sob demanda por padrão: o usuário solicita uma explicação em voz alta ou executa o script diretamente, e o skill fala o texto. Além disso, possui um **modo de conversa** (talk mode) que, quando ativado para uma sessão específica, faz o agente narrar cada resposta completa automaticamente, permitindo que o usuário se afaste e ainda saiba o que aconteceu. O skill é consciente de marcação Markdown, colapsando blocos de código, URLs e caminhos profundos em placeholders curtos, enquanto preserva identificadores `snake_case` para que possam ser pesquisados posteriormente. Suporta múltiplos backends de TTS: ElevenLabs (padrão, com cota monitorada), `say` do macOS (rápido, gratuito e local) e OmniVoice (local, ilimitado e privado), com fallback automático entre eles para garantir que o áudio nunca seja perdido. Cada fala é salva em disco para reprodução posterior, e o modo de conversa é estritamente por sessão, evitando que agentes paralelos em outras árvores de trabalho falem ao mesmo tempo.

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

Perguntar na sua IA favorita

Abre um novo chat com esta habilidade de agente já pré-carregada.

Documentação

O que talkback — ouça ao invés de ler faz?

Fala texto em voz alta de qualquer diretório de projeto, salva o áudio e nunca gasta uma cota medida silenciosamente.

Sob demanda por padrão. Fala quando solicitado — o usuário diz "explique isso em voz alta" ou o script é executado diretamente. Não narra por conta própria até que alguém ative o modo de conversa, e o modo de conversa pertence a uma sessão por vez.

Como usar

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

$S/talkback.py "Aqui está o que mudou e por que é importante."   # ElevenLabs (padrão)
$S/talkback.py --fast "Linha descartável."                      # local, instantâneo, gratuito
$S/talkback.py --quota                                           # quanto resta
$S/talkback.py --voices                                          # lista de vozes
$S/talkback.py --dry-run "..."                                   # vê o texto falado, não sintetiza nada
$S/talkback.py --help                                            # todas as flags

$S/talkback-hook.py --on                                     # modo de conversa ATIVO, apenas nesta sessão
$S/talkback-hook.py --off                                    # para de falar
$S/talkback-hook.py --status                                 # quem está falando, o hook está conectado
$S/talkback-hook.py --outputs                                # saídas de áudio neste host

O texto também pode ser passado via pipe: git log -1 --format=%B | $S/talkback.py.

Como o agente deve usar

Duas coisas diferentes estão aqui. Falar uma vez é prosa composta que você passa para talkback.py. Modo de conversa é uma configuração permanente que você alterna com talkback-hook.py; você nunca compõe seu texto, o hook lê o turno.

Falar uma vez

Quando o usuário pedir para ouvir uma explicação, escreva para o ouvido, depois fale. Não envie markdown bruto ou um diff para a ferramenta. Componha de duas a cinco frases de prosa falada simples — o que mudou, por que, o que significa para eles — e passe isso. O ouvinte não pode rolar para trás, então comece com a conclusão.

Use a boa voz por padrão — o plano a suporta confortavelmente. Recorra a --fast quando o texto for descartável ou quando quiser latência de rede zero. Informe qual backend foi usado se houve fallback.

Dirigindo o modo de conversa

O que o usuário diz mapeia para um comando. Execute-o; não narre também a mudança manualmente, porque o hook falará o turno que você está escrevendo.

O usuário dizExecute
"modo de conversa ativo", "continue falando", "narre esta sessão"talkback-hook.py --on
"pare de falar", "mudo", "silêncio"talkback-hook.py --off
"apenas os destaques", "menos detalhes"talkback-hook.py --on brief
"só me diga as partes importantes"talkback-hook.py --on marker
"use meus AirPods", "toque em X"talkback-hook.py --outputs, depois --on --output "<nome>"
"use a voz barata", "pare de gastar cota"talkback-hook.py --on --backend say
"está ativo?", "por que não ouço nada?"talkback-hook.py --status
"tem algo mais falando?"talkback-hook.py --sessions
"faça tudo ficar quieto" (todas as sessões)talkback-hook.py --off --all

Três coisas para verificar antes de dizer ao usuário que funciona:

  • --status informa se o hook está registrado. Se não estiver, execute --install e diga a eles que uma reinicialização é necessária.
  • Se --status avisar que o hook foi registrado após o início desta sessão, o modo de conversa está ativo e não fará som aqui. Diga isso — não deixe que eles descubram pelo silêncio.
  • O modo de conversa não sobrevive à sessão. Após uma reinicialização ou um /clear, ele está desativado novamente e precisa de --on. Isso é intencional, não um bug; diga uma vez em vez de deixá-los perguntar novamente.

No modo marker — e sempre que você quiser que a leitura seja um resumo escrito para o ouvido em vez do turno em si — termine a mensagem com um marcador:

<!-- talkback: Refatorei a camada de autenticação, três pontos de chamada, testes verdes. -->

Backends

BackendCustoQualidadeNotas
elevenlabs (padrão)medidomelhorprotegido por cota, faz fallback automático para say
say (--fast)gratuito, ilimitadorazoávelnativo do macOS, ~instantâneo, sem rede
omnivoicegratuito, ilimitadobomlocal + privado; precisa do backend ativo. Não verificado — veja abaixo

A escada

elevenlabs → omnivoice → say, do melhor primeiro. Um degrau que não pode realizar o trabalho — sem chave, cota gasta até a reserva, servidor local offline, erro de síntese — passa para o próximo degrau abaixo, então a voz degrada em vez do áudio desaparecer. TALKBACK_CHAIN reordena isso.

Solicitar um degrau explicitamente inicia a escada lá e apenas desce: --fast significa "local agora" e nunca sobe de volta para um backend medido. Cada fallback imprime o motivo no stderr e o backend escolhido vai para o registro, então uma execução degradada nunca fica silenciosa sobre estar degradada.

--strict transforma qualquer fallback em uma falha grave (código de saída 1), para scripts que não devem degradar silenciosamente.

Cota

A conta é do nível Creator: 130.958 caracteres/mês. Uma explicação falada de dois minutos tem cerca de 1.500 caracteres, então são cerca de 87 por mês — o suficiente para que a boa voz seja o padrão, não um mimo.

Verifique no ponto de uso, nunca pela memória — talkback.py --quota lê ao vivo. O nível já mudou uma vez, e um número em um documento está desatualizado no momento em que o plano muda.

Antes de sintetizar, a ferramenta lê a cota ao vivo e mantém uma reserva de 250 caracteres, para que uma explicação longa nunca esgote o saldo completamente. Se a solicitação não couber, ela avisa no stderr e usa say.

As credenciais são resolvidas na ordem: $ELEVENLABS_API_KEY → ~/.elevenlabs/api_key (escrito por elevenlabs auth login) → ELEVENLABS_API_KEY em ~/broomva/.env.local. Duas chaves distintas existem nesta máquina e resolvem para a mesma conta, então verificar uma é verificar ambas.

O nível Creator também desbloqueia clonagem de voz instantânea e profissional (30 slots de voz, 1 profissional). --voices lista o que a conta pode usar atualmente.

O pacote @elevenlabs/cli não é usado em tempo de execução e não pode fazer isso — sua superfície inteira é auth · agents · tools · tests · components, que gerencia projetos de agente ConvAI hospedados. Não tem comando de síntese. A CLI é útil aqui apenas para auth login, que escreve o arquivo de chave.

Nível OmniVoice não verificado

O backend omnivoice é implementado de acordo com a forma documentada, mas nunca foi exercitado — o backend local estava offline quando isso foi lançado. Ele degrada limpo (cai para say, ou falha sob --strict). Para colocá-lo em funcionamento, veja o skill omnivoice; o repositório já está em ~/broomva/external/OmniVoice-Studio.

Manipulação de texto falado

A prosa do agente não é escrita para ser ouvida, então o texto é preparado primeiro:

  • blocos de código → (código omitido); URLs → (link)
  • cabeçalhos e marcadores se tornam quebras de frase, para que listas não sejam ditas juntas
  • caminhos profundos são encurtados para o nome base (src/lib/engine.py → engine.py); use --keep-paths para ouvi-los por completo
  • a ênfase do markdown é removida apenas onde delimita um intervalo — um sublinhado solto dentro de backend_chain é mantido, porque removê-lo transformaria um símbolo que o ouvinte poderia pesquisar em algo que não pode

Áudio salvo

Cada fala vai para ~/.talkback/audio/ como mp3 (convertido via ffmpeg quando presente) com um nome de arquivo com timestamp e slug, e é anexada a ~/.talkback/ledger.jsonl. Use --no-save para descartar, --out-dir para redirecionar.

Modo de conversa — narre a sessão enquanto ela acontece

O modo de conversa faz o agente falar uma breve leitura no final de cada turno, enquanto a sessão durar. Ele vem desativado, é ativado manualmente e pertence a uma sessão.

$S/talkback-hook.py --on                    # detalhe completo, todo turno, ESTA sessão
$S/talkback-hook.py --on brief              # apenas linhas iniciais
$S/talkback-hook.py --on marker             # apenas turnos com marcador
$S/talkback-hook.py --on --backend elevenlabs   # a boa voz, medida
$S/talkback-hook.py --on --output "AirPods Pro"  # qual alto-falante esta sessão usa
$S/talkback-hook.py --off                   # para de falar (esta sessão)
$S/talkback-hook.py --off --all             # interruptor geral, em todos os lugares
$S/talkback-hook.py --status                # modo, backend, quem mais está falando
$S/talkback-hook.py --sessions              # toda sessão falando no momento

Por que escopo de sessão

O hook Stop é registrado uma vez, global e permanentemente — um toggle que você não pode virar durante uma sessão não é um toggle. Então o hook dispara em todas as sessões, e a flag é o que o escopa: o modo de conversa é uma propriedade de uma sessão, não da máquina.

A flag é ~/.talkback/sessions/<session-id>; uma sessão que nunca optou por isso não tem nenhuma, então o hook sai com 0 sem som. Isso é o que mantém seis agentes paralelos em seis árvores de trabalho silenciosos enquanto a sessão que você está assistindo fala. O design pré-0.3.0 tinha uma única flag para toda a máquina, e é por isso que nunca era ativado: ativá-lo tornava todos os agentes na máquina audíveis ao mesmo tempo.

O id da sessão é lido de CLAUDE_CODE_SESSION_ID ou CLAUDE_SESSION_ID; --session <id> o define explicitamente. Quando nenhum deles responde, o comando imprime pass --session <id> e sai com 2 em vez de adivinhar — costumava cair para a transcrição mais recente no diretório de trabalho, o que significava que com duas sessões abertas em um diretório --on habilitava a sessão que tinha sido tocada mais recentemente, não a que pediu.

Do lado do hook, o session_id do payload é autoritativo: quando presente, é a única chave que o gate autoriza. O tronco do nome do arquivo de transcrição é usado apenas quando esse campo está ausente. Ambos foram aceitos juntos uma vez, o que permitia que um payload nomeando a sessão A e a transcrição da sessão B resolvesse a adesão de B e falasse em A.

--session <id> mirando outra sessão é intencional, e não é uma fronteira de segurança. A sessão A executando talkback-hook.py --session B --off ativa ou desativa o modo de conversa de B sem o consentimento de B — não há verificação de propriedade vinculando uma flag à sessão que a definiu. Isso é um recurso, mantido de propósito em vez de revertido: toda sessão na máquina é executada como o mesmo usuário do SO, então qualquer sessão já pode escrever o arquivo de flag de outra sessão diretamente em ~/.talkback/sessions/. Uma verificação de propriedade dentro da CLI pararia apenas o caminho educado através da flag, não o direto — uma fronteira de mesmo principal não pode parar um escritor que compartilha o principal. A flag escopa áudio, então agentes paralelos permanecem silenciosos por padrão; ela não escopa controle, e nada aqui deve ser lido como se o fizesse.

Níveis de detalhe

ModoFala
full (padrão da sessão)o turno inteiro, todo turno — liderado pelo marcador quando o agente escreveu um
briefos primeiros TALKBACK_HOOK_CHARS (320) de turnos acima de TALKBACK_HOOK_MIN_CHARS (80); um marcador vence quando presente
markerapenas turnos com um marcador <!-- talkback: … -->, e apenas o texto do marcador
offnunca — escrito por --off quando uma flag global reativaria a sessão

full é o padrão porque o objetivo de uma leitura é se afastar e voltar sabendo o que aconteceu. Um trecho limitado é uma prévia da resposta, não a resposta — você ainda teria que ler a tela, que é a coisa que o modo de conversa existe para evitar. O que é descartado é apenas o que não pode ser ouvido (blocos de código, URLs, caminhos profundos — veja Manipulação de texto falado), nunca o que é meramente longo. full também não tem piso de comprimento: "pronto, testes verdes" é um resultado que você quer quando está longe, não ruído.

brief e marker são para um arco longo e não supervisionado onde você quer a forma do progresso, não a transcrição dele.

TALKBACK_FULL_MAX_CHARS coloca um teto em full, desativado por padrão — um teto transforma full de volta em brief exatamente nos turnos que valem a pena ouvir por completo.

As leituras usam toda a escada de backends — ElevenLabs primeiro, descendo apenas quando um degrau está inutilizável. Detalhe completo em todo turno, portanto, gasta cota real: um turno de 1.500 caracteres é ~1% do saldo mensal do Creator, então uma sessão longa atingirá a reserva, ponto em que continua falando no próximo degrau em vez de ficar em silêncio. --on --backend say fixa em baixo, --on brief encurta.

Quando uma leitura encontra a próxima

Uma leitura completa ainda pode estar tocando quando o próximo turno termina. TALKBACK_ON_OVERLAP decide o que acontece:

ValorComportamento
interrupt (padrão)a nova leitura corta a antiga — o estado mais recente é o que vale a pena ouvir
queuetocam em ordem, então uma leitura longa e detalhada nunca é truncada; você fica para trás, mas ouve tudo

queue é a configuração certa para um arco não supervisionado que você pretende ouvir por completo; interrupt é certa quando você está na máquina e quer o mais recente.

O marcador

Para optar por um único turno — no modo marker, ou para falar um resumo escrito para o ouvido em vez das linhas de abertura da mensagem — termine a mensagem com:

<!-- talkback: Refatorei a camada de autenticação, três pontos de chamada, testes verdes. -->

No modo full, o marcador se torna o título: é falado primeiro, depois todo o turno atrás dele, então a leitura começa com a conclusão sem perder o detalhe. No modo brief, o marcador substitui o trecho, e um turno sem marcador cai para as frases iniciais cortadas em um limite de frase.

Qual alto-falante

O áudio sai da máquina executando Claude Code. Uma sessão que você está dirigindo de um telefone, tablet ou outro laptop ainda soa no host, então a alavanca que importa é escolher em qual das saídas do host ele cai — AirPods emparelhados ao Mac, um alto-falante AirPlay, um display, os alto-falantes integrados.

$S/talkback-hook.py --outputs             # pelo que este host pode tocar
$S/talkback-hook.py --on --output "AirPods Pro"
$S/talkback.py -d "MacBook Pro Speakers" "linha avulsa em um dispositivo escolhido"

A saída é armazenada por sessão, então...

[truncado para tradução]

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'.

Habilidades Relacionadas