Cortar Áudio
Corte um trecho de um mp3, wav, ogg ou m4a na forma de onda, ouça e baixe o resultado como .wav. Roda no navegador.
Carregando a ferramenta…
E agora?
Perguntas frequentes
Por que só é possível baixar em .wav, nunca em .mp3?
É uma limitação de licença, não técnica. Gerar um MP3 de verdade exige um codificador, e a única opção viável em JavaScript puro é a lamejs. O problema está na licença dela: LGPL-3.0. A LGPL permite combinar uma biblioteca com código sob outra licença desde que o usuário final consiga substituí-la — o que pressupõe existir um artefato compilado separado (um .so, um .dll, um objeto isolado) para "religar". Um build feito só em JavaScript não tem isso: a lamejs acabaria embutida diretamente no mesmo arquivo JavaScript que roda a página, sem nenhuma peça separável, então nenhuma das saídas de escape da LGPL se aplica aqui. Usá-la significaria relicenciar esta ferramenta sob LGPL, ou misturar uma biblioteca copyleft dentro de um repositório distribuído sob MIT — nenhuma das duas opções é aceitável. Por isso a ferramenta grava WAV diretamente: não precisa de nenhum codificador, apenas amostras PCM de 16 bits mais um cabeçalho RIFF/WAVE de 44 bytes, escrito à mão no próprio código da ferramenta. Se precisar do trecho cortado de volta em MP3, recodifique o WAV depois com uma ferramenta feita para isso — um app de desktop, ou o ffmpeg na linha de comando, que sim, ligam um codificador de verdade do jeito que a LGPL e a GPL esperam.
O arquivo .wav final costuma ficar bem maior que o original — por quê?
Porque não existe nenhuma compressão no meio do caminho. O MP3 existe justamente para descartar a parte do som que o ouvido humano quase não percebe (compressão psicoacústica); o WAV gerado aqui mantém cada amostra PCM de 16 bits intacta. O cálculo interno, estimateWavBytes, é aritmética direta: 44 bytes de cabeçalho mais o número de amostras vezes o número de canais vezes 2 bytes — sem nenhuma etapa de compressão no meio. Um MP3 de 3 minutos a 192 kbps pesa uns 4 MB; os mesmos 3 minutos em WAV estéreo de 16 bits a 44,1 kHz pesam cerca de 30 MB, sete a oito vezes mais. Não é um bug: é o preço de não perder absolutamente nada pelo caminho.
O áudio que eu envio sai da minha máquina em algum momento?
Não. O arquivo é lido com a File API do navegador e decodificado com AudioContext.decodeAudioData, a mesma API que qualquer player nativo usaria — não existe nenhuma requisição de rede envolvida nessa etapa. Tudo que acontece depois (cortar o trecho escolhido, escrever o WAV de saída) é aritmética pura sobre arrays de amostras (Float32Array) dentro da própria aba. Dá para confirmar abrindo a aba Rede das ferramentas de desenvolvedor antes de enviar o arquivo: nenhuma requisição carrega o conteúdo do áudio para lugar nenhum. E é justamente por não passar pela rede que essa etapa fica fora do alcance da política connect-src 'self' do site — a próxima pergunta explica por que isso importa para a reprodução.
Por que ouvir a seleção não funciona como um player de áudio comum?
Porque a Content-Security-Policy (CSP) deste site bloqueia esse caminho de propósito. A forma mais comum de tocar um arquivo local é criar uma URL blob e atribuí-la ao src de um elemento audio, ou fazer fetch() nessa mesma URL para recuperar os bytes — é exatamente assim que a wavesurfer.js, a biblioteca que desenha a forma de onda, carrega áudio por padrão através do método loadBlob. Mas o connect-src deste site é 'self' sem nenhuma entrada blob:, e também não define media-src (então o áudio cai no padrão default-src 'self') — ou seja, tanto fetch(blobUrl) quanto audio.src = "blob:..." são bloqueados pelo Chrome, algo confirmado por um evento real securitypolicyviolation durante o desenvolvimento desta ferramenta, não uma suposição. A saída foi evitar esse caminho por completo: o arquivo é decodificado com AudioContext.decodeAudioData, a wavesurfer é usada só para desenhar a onda a partir dos dados já decodificados (sem receber nenhuma URL), e ao clicar em tocar o código cria um ctx.createBufferSource() direto sobre o AudioBuffer que já está em memória — em nenhum momento da reprodução existe uma URL blob ou um elemento audio.
Existe um tamanho mínimo para o trecho cortado?
Sim, vinte milissegundos (MIN_TRIM_SECONDS). Abaixo disso, o que foi selecionado deixa de ser um trecho de áudio reconhecível — são só umas dezenas de amostras PCM, o suficiente para um estalo, não para um som com sentido. A ferramenta prefere recusar essa seleção com um erro explícito (rangeTooShort) a devolver um .wav tecnicamente válido, mas inútil na prática. Existe outro detalhe menos visível dentro de validateRange: quando você arrasta a borda da seleção até a ponta da forma de onda, o número de ponto flutuante às vezes vira 29.999999997 segundos em vez de exatos 30; sem um ajuste (clamp) no intervalo [0, duração], essa seleção — perfeitamente válida do seu ponto de vista — poderia ser rejeitada como se estivesse fora do clipe.
Que formatos são aceitos, e dá para cortar mais de um trecho do mesmo arquivo?
Qualquer formato que o AudioContext do seu navegador souber decodificar — a ferramenta não mantém uma lista própria de "formatos suportados", ela simplesmente entrega o arquivo ao navegador e confia na resposta; na prática isso cobre mp3, wav, ogg (Vorbis/Opus) e m4a/aac em qualquer navegador atual, de desktop ou celular. Se a decodificação falhar, o erro é mostrado tal como veio (decodeFailed) em vez de tentar adivinhar a causa. E sim, dá para cortar mais de um trecho do mesmo arquivo sem reenviá-lo: o arquivo original continua em memória durante toda a sessão, então depois de baixar o primeiro .wav basta arrastar a região de seleção para outro trecho da mesma onda e clicar em cortar de novo.
Mais ferramentas de Conversores
- Conversor de Numerais RomanosConvert between Roman numerals and numbers, both directions. Rejects readable-but-invalid forms like IIII and IM.
- Criar ZIPJunte vários arquivos num .zip, com o nível de compressão que escolher. Roda no navegador.
- Descompactar ArquivoAbra um .zip, .7z, .rar, .tar ou .tar.gz e retire os arquivos que precisa. Roda no navegador.
- Conversor JSON ↔ YAML ↔ TOMLConverte entre JSON, YAML e TOML. Detecta o formato de entrada automaticamente. Só no navegador.
- Conversor CSV ↔ JSONConverte entre CSV e JSON. Detecta o delimitador, trata aspas e linha de cabeçalho. Só no navegador.
- Conversor Markdown ↔ HTMLConverte Markdown em HTML e vice-versa. Compatível com GFM (tabelas, listas de tarefas). Só no navegador.