Sound design com AudioFX
AudioFX transforma efeitos de design de som em filtergraphs do ffmpeg. Cada efeito é uma string que vai diretamente para ffmpeg -af, ou é aplicado a um arquivo com a CLI. O que você ouve no estúdio web é exatamente o que sai da renderização.
Comando
Ao longo deste documento, sfx significa:
node {{AUDIOFX_DIR}}/bin/sfx.mjs
Se sfx não for um comando nesta máquina, use o caminho completo. Ele funciona a partir de qualquer pasta. Se falhar por causa do ffmpeg, execute sfx doctor.
| Você precisa | Comando |
|---|---|
| O catálogo | sfx list (ou --json) |
| Parâmetros, intervalos e quando usar um efeito | sfx describe <efeito> |
| Processar um arquivo de áudio ou vídeo | sfx apply <entrada> <saída> <passo...> |
| O filtergraph para seu próprio ffmpeg | sfx graph <passo...> |
| Medir loudness e picos | sfx analyze <arquivo> |
| A duração e cortes duros de um vídeo | sfx cuts <vídeo> |
| Onde uma música sobe (candidatos a drop) e cai | sfx sections <arquivo> |
| Mixar voz, música e efeitos em uma linha do tempo, com a música reduzida sob a voz | sfx mix <saída> --voice v.wav --music m.wav [--sfx hit.wav@6] [--video cut.mp4], ou sfx mix project.json <saída> |
| Manter uma amostra gravada e sobrepô-la | `sfx sample add <arquivo |
| Uma nova voz, som ou música, já processados | `sfx generate <sfx |
| Deixar o usuário ouvir e ajustar | sfx studio (abre http://127.0.0.1:5177) |
Um passo é escrito efeito[:parâmetro=valor,parâmetro=valor][@de-para]:
sfx apply voice.wav voice-phone.wav telephone
sfx apply clip.mp4 clip-fx.mp4 "underwater:[email protected]" --fade 0.4
sfx graph "reverb:space=cathedral,mix=0.4" "fade:in=0,out=2"
- Os passos são executados em ordem.
@3.2-7limita o efeito a essa janela, com um--fadede cruzamento de segundos (0.25 por padrão) entre o sinal seco e o processado.@3.2-significa de 3,2 s até o fim.- Se a saída for
.mp4,.mov,.mkvou.webm, a imagem é copiada sem recodificação e o áudio é substituído. - Se você errar um parâmetro, a CLI lista os válidos. Não adivinhe: execute
sfx describe.
Fluxo de Trabalho
- Leia o roteiro ou a edição e marque os momentos que precisam de tratamento: uma voz vindo de um telefone, a câmera submersa, uma memória, um drop, um corte cômico.
sfx cuts video.mp4imprime a duração do vídeo e seus cortes duros (um--thresholdmais baixo, padrão 10, captura os mais suaves). Anote os tempos em segundos. - Escolha o efeito da tabela abaixo. Quando estiver em dúvida,
sfx listesfx describe. Comece com os padrões: eles são ajustados para soar claros sem exageros. - Trate cada faixa separadamente, antes de mixar. Efeitos de era, personagem e espaço vão na voz ou no efeito específico, não na mixagem completa. A exceção é um recurso narrativo que afeta tudo que você ouve (subaquático, choque de explosão, sonho).
- Use janelas para mudanças dentro de um clipe (
@de-para) em vez de cortar e emendar arquivos. - Mix e normalize no final com
sfx mix(veja "Mixagem"): ele reduz a música sob a voz e normaliza o mestre para -14 LUFS para redes sociais e YouTube (--loudness -16para podcasts,-23para transmissão). Para um único arquivo,loudnessno final de sua cadeia faz o mesmo. Em seguida, verifique comsfx analyzese o loudness está próximo do alvo e se o pico verdadeiro permanece em -1 dBTP ou inferior. - Você não pode ouvir. Diga quais efeitos você aplicou e em que momentos, e ofereça
sfx studiopara que o usuário possa ajustá-los de ouvido. Se eles enviarem novos valores, o estúdio fornece o comando exato para copiar.
Momentos cinematográficos: o que vende um corte
Vídeos de lançamento não soam "cinematográficos" por causa de um filtro na voz, mas por causa de elementos colocados no instante certo: um riser subindo para o corte, um gap de silêncio e um hit com sub quando o produto aparece. Esses efeitos sintetizam esses elementos dentro do mesmo filtergraph (sem amostras licenciadas) e são ancorados com at=<segundo>:
| Momento | Cadeia (o corte em T) |
|---|---|
| Hit no corte, revelação do produto | "riser:at=T,length=2.5" "drop-gap:at=T-0.45,gap=0.45" "hit:at=T" |
| Título ou logo | "braam:at=T" "sub-drop:at=T,level=-4" |
| Texto ou UI entrando | "whoosh:at=T,length=0.8" (pico em T) |
| Corte para preto | "stop-tail:at=T,decay=3.5" "sub-drop:at=T,level=-4" |
| Pontuar uma palavra | "throw:at=T,kind=echo" na voz |
| Falha técnica (glitch) | "stutter:at=T,slice=0.12,repeats=4" (alonga o áudio) |
até o segundo do corte no arquivo que você está processando. Parariseré onde ele termina; parawhoosh, onde ele atinge o pico; paradrop-gap, onde o gap começa.- Ajuste o nível com
level(dB) antes de tocar emgain:hitesub-dropjá vêm altos. - Poucos e precisos: um ou dois momentos a cada 15 s. Um hit em cada corte cansa.
trailer-voice(voz profunda e épica com ambiente) earchival(entrevista de arquivo) são tratamentos de voz, semat.- Precisa de um som real gravado (um impacto com peso, uma porta, vidro, chuva) em vez de um sintetizado? Sobreponha uma amostra em
T: veja a próxima seção.
Amostras reais como camadas
Hits sintetizados são rápidos e gratuitos, mas um impacto gravado, whoosh ou foley geralmente soa mais real. O efeito layer mixa qualquer arquivo de áudio no sinal em um segundo exato, dentro do mesmo filtergraph:
sfx apply mix.wav mix-door.wav "layer:file=door.wav,at=6,align=onset,level=-3"
sfx apply mix.wav mix-hit.wav "riser:at=6,length=2.5" "drop-gap:at=5.55,gap=0.45" "layer:file=library:ab12cd34ef56,at=6,align=onset" "sub-drop:at=6,level=-4"
align=onsetmede onde está o ataque da amostra e coloca isso emat. As amostras geralmente começam com 20-300 ms de silêncio ou pré-roll; com o padrãoalign=start, esse silêncio faz o hit atrasar. Usealign=peakpara whooshes e swells, cujo ponto mais alto é o que cai no corte.levelem dB,lengthpara usar apenas os primeiros segundos,fadeIn/fadeOutpara moldá-lo.sync=<s>define o ponto de sincronização manualmente (comalign=start).- Uma amostra substitui os
hit,braamouwhooshsintetizados; mantenha oriser,drop-gapesub-dropao redor dela. - Para tratar a própria amostra (reverb, distância, um alto-falante), processe-a primeiro com
sfx apply sample.wav sample-fx.wav ...e sobreponha o resultado. - Uma passagem (carro, moto, drone): renderize a amostra isolada através de
dopplercomatem seu ponto mais próximo, depois sobreponha-a comsyncnesse segundo para que a passagem caia no corte:sfx apply car.wav car-pass.wav "doppler:at=2,speed=90", depois"layer:file=car-pass.wav,at=6,sync=2". - Os níveis das amostras variam muito. Após sobrepor, execute
sfx analyzeno resultado e reduzalevelse o pico atingir 0 dBFS.
Onde as amostras vivem
As amostras são áudio licenciado que pertence à assinatura do usuário. Elas vivem em ~/.audiofx/samples, cada uma com um .json (id, título, fonte, tipo, stem) ao lado, e nunca em uma pasta de projeto ou repositório:
sfx sample add <arquivo-ou-url> --title "Porta batendo, madeira pesada" --id <id da biblioteca> --source epidemic-sound
sfx sample list # a referência library:<id> de cada amostra, duração e onde está seu ataque
sample add copia um arquivo local ou baixa uma URL, mede o ataque e imprime a referência library:<id> para usar em layer:file=.... O estúdio mostra as amostras em sua aba Samples, e seus momentos podem usar uma em vez do impacto ou whoosh sintetizado.
Buscando de uma biblioteca de som (Epidemic Sound MCP)
Quando o usuário tem o Epidemic Sound MCP conectado (ferramentas SearchSoundEffects e DownloadSoundEffect):
- Reutilize primeiro.
sfx sample list: se uma amostra adequada já estiver lá, use-a. - Pesquise com
SearchSoundEffects: um termo curto e concreto ("impacto cinematográfico grave", "whoosh rápido curto", "vidro quebrando"),first: 5, e um filtro de duração em milissegundos que se encaixe no uso (impactos e whooshes abaixo de 4000; ambientes mais longos). Escolha por título, tags e duração. - Baixe com
DownloadSoundEffect(fileType: WAV). Ele retorna uma URL assinada que expira. - Mantenha-o:
sfx sample add "<assetUrl>" --title "<título>" --id <id> --source epidemic-sound. Nunca escreva a URL assinada em um arquivo e nunca salve o áudio dentro do projeto. - Use-o com o
library:<id>quesample addimprimiu:"layer:file=library:<id>,at=T,align=onset".
Você não pode ouvir, então não afirme que uma amostra "soa bem". Relate o que você pode medir (duração, onde está o ataque, o pico do resultado) e, quando a escolha for importante, adicione dois ou três candidatos e deixe o usuário escolher de ouvido na aba Samples do estúdio. Se um download falhar com RETRY_LATER, espere os segundos indicados antes de tentar novamente.
Mixagem: sfx mix
sfx mix coloca clipes de voz, música e efeitos em uma linha do tempo, reduz a música sob a voz e normaliza o mestre, em uma única passagem do ffmpeg. A forma rápida usa uma flag por clipe, arquivo@segundo:
sfx mix final.mp4 --video cut.mp4 --voice [email protected] --music library:<id> --sfx [email protected]
sfx mix final.wav --voice vo.wav --music song.wav --duck 14 --loudness -16
sfx mix --video cut.mp4 --voice [email protected] --music song.wav --print > mix.json
- A música cai 10 dB enquanto uma voz toca (
--duck <dB>,--no-duck). O ataque de um clipe--sfxcai em seu segundo, comoalign=onset. - O mestre é normalizado para -14 LUFS (
--loudness <LUFS|off>), depois um teto de -1 dB. A mixagem é medida e levada ao alvo com um ganho fixo, mantendo sua dinâmica; quando os picos atingem o teto primeiro, o limitador é empurrado até 6 dB para fechar a lacuna, então uma mixagem com hits muito altos ainda pode ficar abaixo do alvo: verifique comsfx analyze. O áudio AAC de um vídeo pode atingir cerca de 0,3 dB acima do teto ("master": { "ceiling": -1.5 }mantém em -1 dBTP). - A mixagem dura
--duration, senão a duração do vídeo, senão até o final do último clipe. Com--videoe uma saída de vídeo, a imagem é copiada e o áudio substituído. --printescreve o JSON do projeto em vez de renderizar: edite-o, depoissfx mix mix.json final.mp4.
Um arquivo de projeto dá a cada clipe e faixa suas próprias configurações. Os caminhos são relativos ao arquivo do projeto, e library:<id> funciona onde quer que um arquivo funcione:
{
"version": 1,
"video": "cut.mp4",
"tracks": [
{ "id": "voz", "role": "voice", "clips": [{ "file": "vo.wav", "at": 1.5, "steps": [{ "effect": "voice-clean" }] }] },
{ "id": "musica", "role": "music", "clips": [{ "file": "library:<id>", "fadeOut": 2 }], "duck": { "depth": 12, "release": 600 } },
{ "id": "hits", "role": "sfx", "clips": [{ "file": "door.wav", "at": 7.52, "align": "onset", "gain": -3 }] }
],
"master": { "loudness": -14 }
}
- Clipe:
file,at(segundo na linha do tempo),startelength(a parte do arquivo a ser usada),gain(dB),fadeIn,fadeOut,align(start,onset,peak),steps. - Faixa:
id,role(voice,music,sfx),gain,mute,solo,steps,duck(true,falseou{ depth, attack, release, threshold }; ativado por padrão para música). - Passo:
{ "effect": "underwater", "params": { "depth": 0.8 }, "from": 4, "to": 9.5, "fade": 0.35 }. Passos de clipe são executados no tempo do clipe (0 = início do clipe); passos de faixa são executados no tempo da linha do tempo, então suas janelas se alinham com o vídeo. - Mestre:
steps,loudness(nulldeixa o nível como mixado),ceiling(dB, padrão -1).
Música ajustada ao vídeo
O objetivo é uma faixa cortada na duração exata do vídeo, com seu drop no corte principal do vídeo. Você não pode ouvir qual subida é "o" drop: meça, proponha com números e deixe o usuário confirmar de ouvido. Com o Epidemic Sound MCP (SearchRecordings, DownloadRecording, EditRecording, PollEditRecordingJob, DownloadRecordingEdit):
- Meça o vídeo.
sfx cuts cut.mp4imprime sua duração (digamos 30.000 s) e seus cortes duros. Combine com o usuário o corte principalConde o drop deve cair (digamos 12,4 s). - Encontre e mantenha uma faixa.
SearchRecordingscomquery: { term: "..." }, umfilter(bpm: {min,max},duration: {min,max}
...
[truncado para tradução]