Communitygithub.com

hadi-a-azeez/viral-voice

Adiciona narração, legendas sincronizadas por palavra e efeitos sonoros a um reel sem rosto, produzindo o vídeo finalizado. Funciona com voz AI gratuita (Malaiala, Inglês, Hindi, Tamil e muitas outras), ElevenLabs ou gravação própria do usuário.

O que é viral-voice?

Esta skill é o quarto passo do pacote 'viral pack' e completa a produção de um reel animado sem rosto (faceless reel), adicionando narração, legendas com temporização exata por palavra e efeitos sonoros. Ela suporta três opções de voz: uma voz AI gratuita baseada no serviço de leitura em voz alta do Microsoft Edge (via ferramenta open-source edge-tts), a API paga da ElevenLabs para vozes mais naturais, ou a própria gravação do usuário (um arquivo único ou um arquivo por batida). A sincronização das legendas é exata para vozes gratuitas e ElevenLabs quando há timestamps, e estimada para gravações próprias, podendo ser ajustada gravando por batida. Além disso, a skill gera automaticamente efeitos sonoros sintéticos (sem risco de licenciamento) como thumps e whooshes, e finaliza o vídeo com mixagem de áudio, ajuste de loudness e renderização em full quality. É importante notar que o usuário precisa ouvir o áudio gerado para verificar a pronúncia, pois a ferramenta não consegue auditar o som por conta própria.

Funciona com~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/hadi-a-azeez/viral-agent/tree/main/skills/viral-voice

Perguntar na sua IA favorita

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

Documentação

O que viral-voice faz?

Execute a configuração uma vez: bash setup.sh. Os scripts neste guia ficam próximos a este arquivo, portanto use o caminho completo deles.

1. Escolha uma voz

Pergunte qual eles querem e seja direto sobre as vantagens e desvantagens:

OpçãoCustoQualidadeTemporização das legendas
Voz gratuita (padrão)GrátisClara, um pouco monótonaExata, cada palavra acende enquanto é dita
ElevenLabsPlano pago ou créditos gratuitosMais naturalExata quando o modelo fornece timestamps
Própria vozGrátisA mais pessoalEstimada dentro de cada linha. Mais precisa se gravada por batida

A própria voz geralmente tem o melhor desempenho, porque as pessoas percebem quando alguém realmente quer dizer algo. Um reel sem rosto não precisa ser sem voz.

# Voz gratuita. Escolhe Midhun para Malaiala. --voice ml-IN-SobhanaNeural para a outra voz Malaiala.
python3 voice.py <projeto>

# ElevenLabs. Precisa de ELEVENLABS_API_KEY e um id de voz. Malaiala precisa de um modelo que a suporte, como eleven_v3.
python3 voice.py <projeto> --engine elevenlabs --voice <id da voz> --model eleven_v3

# Gravação própria, uma única tomada de todo o roteiro em ordem
python3 voice.py <projeto> --engine file --audio take.m4a

# Gravação própria, um arquivo por batida (voice/b1.m4a, voice/b2.m4a). A temporização é mais precisa assim.
python3 voice.py <projeto> --engine file --audio voice/

Áudio de qualquer outra ferramenta também funciona através de --engine file. Portanto, se uma ferramenta de geração de fala estiver conectada, gere um arquivo por batida e passe a pasta.

Para gravações, cada linha é temporizada pelo comprimento das palavras entre pausas, então uma legenda pode ficar até cerca de um segundo fora do ritmo em uma única tomada longa. Em nosso teste com um reel real de 48 segundos em Malaiala, a maioria das legendas acertou dentro de meio segundo. Se parecer errado, grave por batida.

A voz gratuita roda no serviço de leitura em voz alta do Microsoft Edge através da ferramenta open-source edge-tts. Não é uma API oficial, então pode mudar ou parar de funcionar, e qualquer pessoa que a use para trabalho comercial ou de cliente deve verificar os termos primeiro. Diga isso se o usuário estiver fazendo vídeos para um negócio.

2. Alguém tem que ouvir

Você não consegue ouvir áudio através destas ferramentas, e timing.json mostra apenas as palavras do roteiro, nunca o que a voz realmente disse. Portanto, nada aqui pode confirmar a pronúncia. Peça ao usuário para ouvir voice.wav, ou se uma ferramenta de transcrição estiver conectada, transcreva e compare. Diga claramente que fica sem verificação se nenhum dos dois acontecer.

Quando a voz disser uma palavra errada, adicione "tts" àquela batida em script.json com uma grafia que ela diga corretamente e execute novamente. A legenda continua usando say. Mantenha o mesmo número de palavras em tts e em say quando possível. Se eles diferirem, voice.py imprime um aviso e os tempos da legenda daquela batida se tornam estimados.

Se uma linha parecer apressada, altere --rate (padrão +8%). --gap define a pausa entre batidas.

As estimativas de duração de lint_script.py e timing.py são apenas aproximadas e podem ser de 10 a 15% mais curtas. A duração real é o que voice.py imprime. Para atingir um alvo, altere --rate ou corte palavras e execute novamente.

3. Olhe a imagem novamente

A voz real moveu tudo, então olhe antes da renderização final:

node <pasta viral-animate>/render.mjs <projeto> --stills beats

Abra stills/beats.jpg. O movimento vinculado a k, d ou kit.at seguiu a voz. Qualquer coisa com segundos fixos não seguiu, então corrija isso em scenes.js.

4. Efeitos sonoros

sfx.py executa automaticamente: um thump baixo no início e um whoosh suave a cada mudança de batida. Para uma peça calma e emocional, desligue-os com "sfx_auto": false em script.json. Para adicionar mais, liste-os, em uma palavra para que permaneçam sincronizados:

"sfx": [{ "beat": "b2", "word": "charger", "kind": "pop", "db": -14 }]

Use "at": 1.1 em vez de word para segundos dentro da batida. Uma palavra que a batida não diz para com uma mensagem clara. Tipos:

TipoSoa comoBom para
whoosh swellAr subindoMudanças, coisas voando para dentro
swipeEsfregada rápida de arMovimentos rápidos
popEstalo redondo pequenoCoisas aparecendo
tickTique minúsculo e secoContadores, pequenos momentos
clickClique agudo de interruptorInterruptores de luz, botões
knockBater de nós dos dedos na madeiraPortas, mesas
thumpBatida baixaAberturas, grandes revelações
stampPalmada forte com pesoVereditos, marcar um ponto

Todos são sintetizados, então não há risco de licenciamento. O pacote não adiciona música: mantém a voz clara e evita violações de direitos autorais. Se o usuário quiser música, pode adicioná-la no editor do Instagram.

5. Finalizar

python3 finish.py <projeto>

Isso renderiza a imagem em qualidade total na temporização da voz real, mistura os efeitos, define o volume para aproximadamente -14 LUFS e escreve final.mp4. Adicione --no-render para remixar apenas o som.

Versões de teste: para testar os outros hooks, copie a pasta do projeto, coloque o say de outro hook em b1 e seu label no label de nível superior, então execute voice.py e finish.py na cópia. O movimento vinculado a k, d ou kit.at segue. Verifique se alguma palavra kit.at ainda está no novo hook.

Depois vá para /viral-check. Não considere o reel finalizado antes disso.

Habilidades Relacionadas