From forge
Gerencia o TTS (text-to-speech) dos canais Forge — escolhe engine (Edge/Piper), instala backends, baixa vozes, testa síntese e edita overrides por canal. Use quando o usuário quiser configurar áudio, trocar voz, instalar Piper, baixar modelo novo ou desativar voz em um canal.
npx claudepluginhub guilhermevang/forge-plugin --plugin forgeThis skill is limited to using the following tools:
Esta skill é **o único lugar** onde o TTS é configurado. A skill `/forge:configure` não mexe mais em voz — canal novo nasce com a engine default disponível; trocar engine, instalar Piper, baixar vozes, ou desativar áudio em um canal são feitos aqui.
Searches, retrieves, and installs Agent Skills from prompts.chat registry using MCP tools like search_skills and get_skill. Activates for finding skills, browsing catalogs, or extending Claude.
Checks Next.js compilation errors using a running Turbopack dev server after code edits. Fixes actionable issues before reporting complete. Replaces `next build`.
Guides code writing, review, and refactoring with Karpathy-inspired rules to avoid overcomplication, ensure simplicity, surgical changes, and verifiable success criteria.
Share bugs, ideas, or general feedback.
Esta skill é o único lugar onde o TTS é configurado. A skill /forge:configure não mexe mais em voz — canal novo nasce com a engine default disponível; trocar engine, instalar Piper, baixar vozes, ou desativar áudio em um canal são feitos aqui.
Argumentos recebidos: $ARGUMENTS
edge — Microsoft Edge-TTS. CLI Python, online, sem API key. Vozes neurais Azure. Instalação rápida, ~10MB. Default do plugin.piper — Piper TTS. Neural offline, open-source, roda em CPU. Cada voz é um modelo .onnx baixado separadamente (~60MB cada). Mais natural que Edge em pt-BR; independe de rede.none — desativa TTS (o tool forge_reply_voice retorna silenciosamente sem enviar áudio).pt-BR-FranciscaNeural, pt-BR-AntonioNeural, pt-BR-ThalitaMultilingualNeural...pt_BR-faber-medium, pt_BR-cadu-medium, en_US-lessac-medium...FORGE_TTS_PROVIDER, FORGE_TTS_EDGE_VOICE, FORGE_TTS_PIPER_VOICE, FORGE_TTS_PIPER_FORMAT, FORGE_TTS_PIPER_MODELS_DIR. Valem pra todos os canais do host.~/.claude/channels/<nome>/access.json): campos voiceProvider, voiceName, voiceReply. Sobrescrevem o global.access.voiceProvider/voiceName → default do service (env).~/.local/share/piper-voices/ (ou o que FORGE_TTS_PIPER_MODELS_DIR apontar). Cada voz = dois arquivos: <nome>.onnx + <nome>.onnx.json.Igual à skill /forge:access. Parse $ARGUMENTS:
status, use, install, download, list, remove, test, set, off, on), o canal alvo é inferido:
./.claude/forge-channel no cwd. Se existir, use.~/.claude/channels/. Se houver exatamente um, use-o./forge:voice <canal> <comando>./forge:configure primeiro.<canal> e o resto como subcomando.Comandos que não precisam de canal (só afetam o host): install <engine>, download <voice>, remove <voice>, list. Esses rodam mesmo sem canal selecionado.
status — panoramacommand -v edge-tts, command -v piper, command -v ffmpeg.ls ~/.local/share/piper-voices/*.onnx 2>/dev/null. Pra cada um, extraia o nome curto (sem extensão) e o tamanho (stat).~/.claude/channels/, leia access.json e extraia voiceProvider, voiceName, voiceReply.🔊 Engines no host:
edge-tts ✅ <path> (ou ❌ não instalado)
piper ✅ <path> (ou ❌ não instalado)
ffmpeg ✅ <path> (opcional, só pra Piper em OGG)
🎙️ Vozes Piper instaladas (N):
pt_BR-faber-medium 63 MB
en_US-lessac-medium 63 MB
📡 Canais (provider / voz / ativo):
backend edge pt-BR-FranciscaNeural ✅
dropflux piper pt_BR-faber-medium ✅
mobile — (default) 🔇 voiceReply=false
voiceProvider=piper mas Piper não instalado, ou apontando pra voz ausente), sinalize com um aviso no fim e proponha o comando pra corrigir.use <engine> — trocar engine do canal alvo<engine> ∈ edge | piper | none.
<engine>. Se inválido, liste as opções e pare.<engine> = piper, verifique pré-requisitos:
command -v piper. Se ausente, pergunte: "Piper não está instalado. Instalo agora? (s/n)" Se sim, execute o fluxo install piper (abaixo) antes de continuar; se não, pare informando.~/.local/share/piper-voices/. Se não houver, pergunte qual baixar (mostre o catálogo de list) e rode download <voice> antes de continuar.~/.claude/channels/<canal>/access.json:
voiceProvider = <engine>.<engine> = piper e voiceName atual for de Edge (começa com pt-BR- ou contém Neural), limpe voiceName — o service cairá no default do Piper. Oriente o usuário a escolher voz explícita via set voice <nome> se quiser.<engine> = edge e voiceName atual for de Piper (contém _, ex: pt_BR-...), limpe igualmente.<engine> = none, mantenha os outros campos — voiceProvider=none já basta pra desativar.JSON.stringify(obj, null, 2) + newline final, modo 0600.<canal> agora usa engine <engine>, voz <voiceName ou default>. Mudança vale na próxima mensagem — access.json é relido a cada requisição."install <engine> — instalar backend no host<engine> ∈ edge | piper.
Fluxo comum:
command -v <engine> (edge-tts ou piper). Se já existe, avise e pule.pipx → pip3 --user → pip --user. Se nenhum, oriente instalar Python+pipx e pare.<engine> via <instalador>. Prosseguir? (s/n)"pipx install edge-tts (ou fallback pip)pipx install piper-tts (ou fallback pip)
Capture stdout+stderr. Se falhar com "externally-managed-environment" (PEP 668), recomende pipx explicitamente.command -v. Se ainda ausente, avise sobre PATH (~/.local/bin; sugerir pipx ensurepath + reabrir terminal).~/.local/share/piper-voices/, pergunte se quer baixar a voz default (pt_BR-faber-medium, ~63MB). Se sim, rode download pt_BR-faber-medium.ffmpeg não, mencione no fim: "Opcional: instale ffmpeg pra enviar áudios Piper como voice note nativo do Telegram (formato OGG/Opus). Sem ffmpeg, áudios saem como WAV — funciona, mas aparece como arquivo. No Ubuntu/Debian: sudo apt install ffmpeg."download <voice> — baixar modelo Piperhttps://huggingface.co/rhasspy/piper-voices/resolve/main/<lang>/<lang_REGION>/<speaker>/<quality>/<voice>.onnx
e mesmo path pro .onnx.json. Exemplo pt_BR-faber-medium:
https://huggingface.co/rhasspy/piper-voices/resolve/main/pt/pt_BR/faber/medium/pt_BR-faber-medium.onnxhttps://huggingface.co/rhasspy/piper-voices/resolve/main/pt/pt_BR/faber/medium/pt_BR-faber-medium.onnx.json~/.local/share/piper-voices/ (ou o dir configurado) com mkdir -p.curl -L --fail -o <dest> <url> (ou wget como fallback). Os dois arquivos. Se falhar, limpe parciais com rm -f.test -s <path>.onnx && test -s <path>.onnx.json. Mostre o tamanho final.<voice> baixada. Pra usá-la neste canal: /forge:voice use piper e depois /forge:voice set voice <voice>."Catálogo curado (exponha ao usuário em list ou quando perguntarem):
| voice | idioma | sexo | tamanho |
|---|---|---|---|
pt_BR-faber-medium | pt-BR | M | ~63 MB |
pt_BR-cadu-medium | pt-BR | M | ~63 MB |
pt_BR-edresson-low | pt-BR | F | ~25 MB |
en_US-lessac-medium | en-US | F | ~63 MB |
en_US-ryan-medium | en-US | M | ~63 MB |
en_US-amy-medium | en-US | F | ~63 MB |
Caminhos HuggingFace correspondentes:
pt/pt_BR/faber/medium/pt/pt_BR/cadu/medium/pt/pt_BR/edresson/low/en/en_US/lessac/medium/en/en_US/ryan/medium/en/en_US/amy/medium/Para vozes fora do catálogo, peça ao usuário a URL .onnx (e a .onnx.json ao lado) ou oriente navegar em https://huggingface.co/rhasspy/piper-voices/tree/main.
list — listar vozesls ~/.local/share/piper-voices/*.onnx → nome curto + tamanho.pt-BR-FranciscaNeural (F, default histórico)pt-BR-AntonioNeural (M, expressiva)pt-BR-ThalitaNeural (F)pt-BR-ThalitaMultilingualNeural (F, multilingue — mais natural)edge-tts --list-voices | grep pt-BRremove <voice> — remover modelo Piper~/.local/share/piper-voices/<voice>.onnx (+ .onnx.json).voiceName em qualquer access.json). Se sim, avise e peça confirmação explícita.rm -f <path>.onnx <path>.onnx.json.test — smoke test da config do canalaccess.json do canal alvo.access.voiceProvider ou FORGE_TTS_PROVIDER (default edge); access.voiceName ou env correspondente.voiceReply=false, avise e pare.edge-tts --voice <voz> --text "olá, teste do Forge" --write-media /tmp/forge-voice-test.mp3echo "olá, teste do Forge" | piper --model ~/.local/share/piper-voices/<voz>.onnx --output_file /tmp/forge-voice-test.wavtest -s /tmp/forge-voice-test.* e mostre tamanho. Não toque áudio — só confirma que a síntese funciona.set voice <voz> — mudar voz do canal<lang>-<region>- e termina em Neural (aviso se formato parecer errado, mas aceite).~/.local/share/piper-voices/<voz>.onnx existe. Se não, pergunte se quer baixar (dispara download <voz>).access.json, set voiceName = <voz>.off / on — desativar/ativar voz no canaloff → set voiceReply = false em access.json.on → set voiceReply = true (ou remove o campo — o default é habilitado).Confirme e lembre que a mudança vale na próxima mensagem.
~/.claude/channels/<nome>/.env ou globais)FORGE_TTS_PROVIDER = edge | piper | none — engine default.FORGE_TTS_EDGE_VOICE = voz default do Edge (fallback pra FORGE_TTS_VOICE).FORGE_TTS_PIPER_VOICE = voz default do Piper.FORGE_TTS_PIPER_MODELS_DIR = diretório onde os .onnx vivem. Default ~/.local/share/piper-voices.FORGE_TTS_PIPER_FORMAT = wav (default) | ogg. OGG requer ffmpeg no PATH e vira voice note nativo no Telegram.Overrides por canal em access.json têm precedência sobre qualquer env.
access.json — sempre leia, mute o campo específico, escreva de volta preservando o resto.access.json.tmp + chmod 600 + rename. (Ou use Write direto — o server relê a cada requisição, não há race crítica.)access.json estiver corrompido, não tente consertar — avise e pare. O server já tem fallback, mas não queremos perpetuar dados ruins.(provider, voice, rate, pitch, volume, text). Trocar voz invalida naturalmente.use piper é o passo pesado (instala backend + baixa modelo + edita access). Divida em confirmações explícitas, não faça tudo em silêncio.