Narração e TTS
A narração conduz a linha do tempo. Gere-a antes de construir os elementos visuais.
Escolha um motor
| Motor | Onde | Pontos fortes | Cuidados |
|---|---|---|---|
| ElevenLabs | API na nuvem | Melhor naturalidade, clonagem de voz | Pago; clone apenas vozes com consentimento |
| OpenAI TTS | API na nuvem | Simples e consistente | Opções limitadas de voz |
| Kokoro | Local | Gratuito, boa qualidade, offline | Requer configuração do Python |
| Piper | Local | Rápido, roda na CPU | Menos expressivo |
| Voz gravada | Microfone | Mais autêntico | Precisa de limpeza |
Mantenha as chaves da API em variáveis de ambiente ou em um arquivo .env que esteja no .gitignore. Nunca imprima ou envie as chaves para o repositório.
Prepare o roteiro para a fala
- Escreva números, unidades e siglas como são falados: "vinte e vinte e seis", "A P I" se deve ser soletrado, "gigabytes".
- Adicione vírgulas para pausas de respiração; use ponto final para uma parada; evite parênteses.
- Coloque nomes difíceis em uma lista de pronúncia e teste-a primeiro com uma amostra curta.
- Divida em um arquivo por cena (
audio/cena-01.mp3). Arquivos por cena permitem regravar uma única linha e manter a flexibilidade de tempo.
Geração (exemplo, REST ElevenLabs)
import os, requests, pathlib
def tts(texto: str, voice_id: str, saida: pathlib.Path) -> None:
r = requests.post(
f"https://api.elevenlabs.io/v1/text-to-speech/{voice_id}",
headers={"xi-api-key": os.environ["ELEVENLABS_API_KEY"], "Accept": "audio/mpeg"},
json={"text": texto, "model_id": "eleven_multilingual_v2",
"voice_settings": {"stability": 0.5, "similarity_boost": 0.75}},
timeout=120,
)
r.raise_for_status()
saida.write_bytes(r.content)
Os nomes dos modelos e endpoints mudam. Confirme na documentação atual do provedor antes de usar.
Meça e ajuste o ritmo
ffprobe -v error -show_entries format=duration -of default=nw=1:nk=1 audio/cena-01.mp3
- Alvo de 140 a 160 palavras por minuto (palavras / segundos * 60). Regere com uma entonação ligeiramente diferente ou corte o texto se uma cena ultrapassar 180 ppm; soará apressado.
- Não estique o tempo da fala em mais de cerca de 10%; soa sintético. Reescreva em vez disso.
Limpe a voz gravada
# Filtro passa-altas, redução suave de ruído, compressão, volume
ffmpeg -i raw.wav -af "highpass=f=80,afftdn=nf=-25,acompressor=threshold=-18dB:ratio=3:attack=5:release=80,loudnorm=I=-16:TP=-1.5:LRA=11" -ar 48000 clean.wav
Remova o silêncio inicial e final:
ffmpeg -i in.wav -af "silenceremove=start_periods=1:start_threshold=-45dB,areverse,silenceremove=start_periods=1:start_threshold=-45dB,areverse" out.wav
Monte
# Junte arquivos de cena com intervalos de 0,4 s
python - <<'PY'
import subprocess, pathlib
arquivos = sorted(pathlib.Path("audio").glob("cena-*.mp3"))
partes = []
for i, f in enumerate(arquivos):
partes += ["-i", str(f)]
n = len(arquivos)
filt = "".join(f"[{i}:a]apad=pad_dur=0.4[a{i}];" for i in range(n)) + "".join(f"[a{i}]" for i in range(n)) + f"concat=n={n}:v=0:a=1[out]"
subprocess.run(["ffmpeg", "-y", *partes, "-filter_complex", filt, "-map", "[out]", "narracao.mp3"], check=True)
PY
Em seguida, misture com música em audio-mixing e adicione legendas usando captions-subtitles.
Ética e direitos
- Clone uma voz apenas com a permissão explícita do locutor.
- Divulgue o uso de voz sintética onde as regras da plataforma ou a lei exigirem.
- Verifique a licença do provedor de TTS para uso comercial.