É comum encontrar arquivos MP3 longos contendo várias faixas em sequência. Quando não há metadados ou cue sheets, a única alternativa precisa é separar com base nos silêncios naturais entre as músicas. Neste post, você verá como fazer isso de forma automatizada no Linux, usando apenas ffmpeg
e bash
, sem ferramentas de terceiros nem interfaces gráficas.
Requisitos
Instale o ffmpeg
, caso ainda não tenha:
sudo apt install ffmpeg
Etapa 1 – Detectando os silêncios
O ffmpeg
possui um filtro chamado silencedetect
, que analisa o áudio e exibe os pontos onde há silêncio.
ffmpeg -i arquivo.mp3 -af silencedetect=noise=-30dB:d=1 -f null - 2> silences.log
Explicação dos parâmetros:
noise=-30dB
: define o que é considerado silêncio. Valores como-35dB
ou-40dB
podem funcionar melhor para arquivos com ruído de fundo.d=1
: duração mínima (em segundos) para que o trecho seja considerado um silêncio real.2> silences.log
: salva os logs de detecção de silêncio em um arquivo para posterior análise.
Esse comando processa o áudio completo, independente do tempo de duração.
Etapa 2 – Interpretando a saída
O arquivo silences.log
gerado contém trechos como:
[silencedetect @ ...] silence_start: 123.45
[silencedetect @ ...] silence_end: 125.67 | silence_duration: 2.22
Cada par silence_start
e silence_end
marca um espaço onde há silêncio, ou seja, um possível delimitador entre faixas.
Etapa 3 – Script completo para separar as faixas
Este script analisa os silêncios detectados e corta o arquivo automaticamente, gerando uma pasta com os trechos já separados.
Salve como split_por_silencio.sh
:
#!/bin/bash
if [ -z "$1" ]; then
echo "Uso: $0 arquivo.mp3"
exit 1
fi
ARQUIVO="$1"
BASENAME=$(basename "$ARQUIVO" .mp3)
LOG="silences.log"
TMP="tempos.txt"
echo "[+] Detectando silêncios em '$ARQUIVO'..."
ffmpeg -i "$ARQUIVO" -af silencedetect=noise=-30dB:d=1 -f null - 2> "$LOG"
grep -E 'silence_start|silence_end' "$LOG" | awk '{print $NF}' > "$TMP"
echo "[+] Gerando comandos de corte..."
mkdir -p cortes
start=0
i=1
mapfile -t tempos < "$TMP"
for ((j=0; j<${#tempos[@]}; j+=2)); do
silence_start=${tempos[j]}
silence_end=${tempos[j+1]}
out="cortes/${BASENAME}_parte$(printf "%02d" "$i").mp3"
ffmpeg -y -i "$ARQUIVO" -ss "$start" -to "$silence_start" -c copy "$out"
echo " - Criado: $out"
start=$silence_end
((i++))
done
DURACAO=$(ffprobe -i "$ARQUIVO" -show_entries format=duration -v quiet -of csv="p=0")
if (( $(echo "$start < $DURACAO" | bc -l) )); then
out="cortes/${BASENAME}_parte$(printf "%02d" "$i").mp3"
ffmpeg -y -i "$ARQUIVO" -ss "$start" -to "$DURACAO" -c copy "$out"
echo " - Criado: $out"
fi
echo "[✔] Finalizado. Arquivos salvos em ./cortes/"
Depois de salvar, torne-o executável:
chmod +x split_por_silencio.sh
E execute passando o arquivo MP3 como argumento:
./split_por_silencio.sh arquivo.mp3
Resultado
O script criará uma pasta cortes/
contendo os trechos automaticamente separados com base nos intervalos de silêncio detectados:
cortes/
├── nome_parte01.mp3
├── nome_parte02.mp3
├── ...
Dicas
- Se os silêncios forem muito curtos, aumente
d=1
parad=2
ou mais. - Se o volume do silêncio for muito baixo (como em gravações antigas), diminua o
noise=-30dB
para-35dB
ou-40dB
.
Alternativa com mp3splt
Se você preferir uma ferramenta pronta para cortar com base no silêncio, sem necessidade de script personalizado, pode usar o mp3splt
.
Instalação:
sudo apt install mp3splt
Uso básico:
mp3splt -s -p th=-30,min=1 arquivo.mp3
Explicação:
-s
: modo automático (auto split)-p th=-30,min=1
: define o threshold de silêncio em -30dB e duração mínima de 1 segundo
Esse comando cria vários arquivos MP3 separados automaticamente, com base nos pontos de silêncio detectados. É uma opção prática e rápida, embora com menos controle do que o script com ffmpeg
.
Conclusão
Esse método é confiável, não depende de tags ID3, não exige software gráfico e funciona com qualquer arquivo MP3 longo. É o tipo de abordagem que prioriza eficiência e controle total, sem depender de softwares intermediários. O mp3splt
também é válido para situações onde a praticidade é mais importante do que o controle detalhado.
Se quiser que essa solução seja integrada ao DevData como um CLI próprio ou ferramenta empacotada, entre em contato.