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ção | Custo | Qualidade | Temporização das legendas |
|---|---|---|---|
| Voz gratuita (padrão) | Grátis | Clara, um pouco monótona | Exata, cada palavra acende enquanto é dita |
| ElevenLabs | Plano pago ou créditos gratuitos | Mais natural | Exata quando o modelo fornece timestamps |
| Própria voz | Grátis | A mais pessoal | Estimada 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:
| Tipo | Soa como | Bom para |
|---|---|---|
whoosh swell | Ar subindo | Mudanças, coisas voando para dentro |
swipe | Esfregada rápida de ar | Movimentos rápidos |
pop | Estalo redondo pequeno | Coisas aparecendo |
tick | Tique minúsculo e seco | Contadores, pequenos momentos |
click | Clique agudo de interruptor | Interruptores de luz, botões |
knock | Bater de nós dos dedos na madeira | Portas, mesas |
thump | Batida baixa | Aberturas, grandes revelações |
stamp | Palmada forte com peso | Vereditos, 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.