Narração AI para Vídeos de Produto: Do "Soa Estranho" ao Nível Profissional
Este skill nasceu de uma reformulação real. Um vídeo de hackathon de 2 minutos e 43 segundos em inglês (11 frases de narração, sincronizadas com as cenas) recebeu o feedback de que a narração "ainda soava um pouco estranha". Após 9 versões, dezenas de mecanismos e vozes TTS, avaliações calibradas e amostragem estatística, a abordagem final foi: geração contínua única com MOSS-TTS + corte baseado em verificação de conteúdo + pós-processamento clássico que não danifica a voz. O usuário aprovou.
O método de avaliação está em references/evaluation.md, as decisões de processamento acústico em references/acoustic-polish.md, e os scripts reutilizáveis em scripts/.
1. Diagnosticando o "Estranho": Geralmente Não é a Qualidade, é a Prosódia
[!IMPORTANT] TTS de boa qualidade já supera gravações comuns em qualidade de áudio. Pontuações UTMOS / Distill-MOS são superiores às de leituras humanas limpas (LibriSpeech), então o "estranho" quase sempre vem da prosódia. Usando locuções profissionais de domínio público (documentários da NASA, voz separada com Demucs) como referência, as características medidas são:
| Característica | Locução Profissional | TTS de Clone por Frase (Versão Inicial) |
|---|---|---|
| Variação de Tom (F0 Std, semitons) | 4.6 | 2.7 (plano) |
| Queda no Final da Frase (semitons) | 0.7 | 2.3 (final cai muito) |
| Velocidade de Fala (sílabas/s) | 4.2 | 4.55 (um pouco rápida) |
| Pausa Média (segundos) | 0.39 | 0.54 |
Use scripts/prosody_compare.py, scripts/end_fall.py e scripts/take_features.py para comparar candidatos e referências no mesmo conjunto de características. Use dados, não impressões.
2. Geração: Leia o Texto Inteiro de Uma Vez, Não Junte Frases Isoladas
- Priorize a geração contínua. Ao gerar frase por frase, cada uma começa sua própria variação de tom, ênfase e pausa respiratória. Juntá-las resulta em "estranheza". Faça o TTS ler toda a narração de uma vez, separando as frases com linhas em branco. O modelo vê o contexto e as frases se conectam. Neste exemplo, usamos o modo de clone do MOSS-TTS v1.5, com um áudio de referência de ~15 segundos com tom apropriado. Geramos 4 vezes com 4 sementes aleatórias, cada uma com ~2 min 10 s e taxa de erro de palavras (WER) de 2-6%.
- Resultados da comparação de candidatos (mesmo método de avaliação):
- MOSS contínuo: distância prosódica para locução profissional 0.29 (menor), menos defeitos;
- Qwen3-TTS VoiceDesign por frase, com instruções de atuação e seleção por prosódia: distância 0.37, naturalidade comparável ao MOSS;
- OpenAI gpt-audio: distância 0.57;
- Clone por frase: distância 0.89.
- Armadilhas conhecidas:
- MOSS-VoiceGenerator (descrição textual da voz) para em ~33s com texto longo, não serve para geração contínua.
- Gemini TTS exige o formato "AUDIO PROFILE / DIRECTOR'S NOTES / TRANSCRIPT" em seções, senão lê as instruções. A camada gratuita tem apenas 10 chamadas por modelo por dia.
- A voz da OpenAI tem pouca variação de tom na avaliação. Se usar voz AI comercial, indique nos créditos finais.
- Selecione a semente pelas características prosódicas: Com WER aceitável, escolha a semente com menor distância para a referência profissional. Se uma frase específica ficar ruim (ex.: slogan final com voz muito grave), substitua apenas essa frase pela versão de outra semente com a mesma voz de referência.
3. Corte: Verifique pelo Conteúdo, Não Confie Apenas nos Timestamps
O áudio contínuo gerado precisa ser cortado em frases para sincronizar com as cenas. O script scripts/align_split.py faz:
- Obter timestamps a nível de palavra com SenseVoice e alinhar com o roteiro por distância de edição.
- Cortar nos silêncios entre pares de frases.
- Verificar pelo conteúdo: Para cada silêncio dentro de 1,5s do ponto de corte, tente cortar ali, reconheça cada lado e selecione a posição com a menor soma de WER dos dois lados.
Confiar apenas nos timestamps causa erros: TTS costuma pausar dentro de frases (ex.: "Just | sentences.") e conectar frases sem pausa, enquanto os timestamps de palavras atrasam em relação ao início real da fala. Sem verificação, "does | it" e "Just | sentences" seriam cortados no início da próxima frase.
4. Pós-processamento: Apenas Problemas Quantificáveis, Sem Mexer no Tom
| Processamento | Conclusão |
|---|---|
Ajuste de pausas por pontuação (pause_fix_en.py: 0,10s dentro do grupo, 0,25s na vírgula, 0,33s no dois-pontos, 0,45s no final da frase; slogans curtos mantêm 0,8s) | Manter: Apenas encurta, não alonga. Fica mais próximo das pausas da locução profissional |
Normalização de loudness (cada frase a -20 LUFS), HPF 70 Hz, -2 dB em 300 Hz, de-esser leve, reverb de sala pequena 6% (vo_post.py) | Manter: A pontuação de qualidade do áudio não cai |
| Limitador | Remover: Distill-MOS cai ~0,14. Substituir por controle de pico com ganho linear |
| Elevar final de frase ou ampliar variação de tom com WORLD vocoder ou Praat PSOLA | Descartar: As características ficam mais próximas do profissional, mas a pontuação na avaliação rigorosa cai (WORLD piora quanto mais se aplica; pior nível −0,30, IC [−0,61, −0,03]) |
Princípio: Problemas de final de frase e variação de tom são resolvidos gerando várias vezes e selecionando, não ajustando o tom depois.
5. Mixagem: A Música Não Deve "Bombear" nas Pausas
scripts/duck_curve.py: Quando a pausa entre frases é menor que 2,5s, a música permanece baixa (−11 dB); a redução começa 0,25s antes e a recuperação usa suavização de polo único de 0,9s. A média móvel de 0,3s original fazia a música subir em cada pausa, dando a sensação de "respiração ofegante". O vídeo final tem −14 LUFS, pico abaixo de −1 dBFS; o WER da narração na mixagem fica entre 0 e 6,5%.
6. Duração das Cenas
- Se a narração não couber na cena, a parte animada pode ser desacelerada em ~5%, e a gravação de tela pode ser estendida. Não comprima a voz.
- Vírgulas em excesso podem fazer o TTS soar artificial. Ajuste o texto sem mudar o sentido, ex.: mude "Here it is, live, on real footage" para "running live on real footage".
7. Critérios de Aprovação
- WER por frase do roteiro não ultrapassa 0,08, e o mesmo se aplica na mixagem.
- Cada frase é verificada individualmente pelo Gemini quanto a defeitos (uma por vez): sem cortes, sem engolir palavras, sem erros de leitura, sem final de frase com voz muito grave.
- A distância prosódica em relação à locução profissional e o teste rigoroso de naturalidade (frase única, amostra grande, intervalo de confiança bootstrap) não são inferiores à referência. Consulte o documento de avaliação.
- Aprovação final pelo usuário. A avaliação AI não pode provar que "não soa estranho", veja a próxima seção.
8. Lições sobre "Avaliação por AI"
- Comparação pareada do Gemini é inútil: Em 86% dos casos, escolhe a primeira a tocar; invertendo a ordem, a conclusão se inverte.
- Ranking de múltiplas amostras é instável: Duas rodadas com o mesmo material deram rankings contraditórios.
- Notas sem referência não são confiáveis: Gravações amadoras de humanos recebem ~5, abaixo do TTS (~6).
- Método utilizável: Teste rigoroso de frase única com locução profissional como referência, combinado com amostra grande e intervalo de confiança. Mesmo assim, o item "classificado como humano" tem muito ruído (mesmo áudio pode ter 0/8 ou 3/8; atores profissionais também são classificados como AI).
- Verifique opiniões da AI: Por exemplo, a alegação de que "a mixagem está bombeando" contradiz a curva de ganho medida; confie na medição.