batch converter arquivos mp3 para wav usando sox

3

para um único .mp3, posso convertê-lo para wav usando

sox ./input/filename.mp3 ./output/filename.wav

Eu tentei:

#!/bin/bash
for i in  $(ls *mp3)
do
    sox -t wav $i waves/$(basename $i)
done

Mas isso gera o seguinte erro:

sox FAIL formats: can't open input file 'filename.mp3': WAVE: RIFF header not found

Como eu rodaria essa conversão sox em todos os arquivos mp3 na pasta de entrada e salvaria os wav gerados na pasta de saída?

PS: Eu não sei porque mostra o arquivo entre uma aspas (') e um apóstrofo '

'filename.mp3'

Eu toquei todos os mp3 e eles funcionam perfeitamente.

    
por kRazzy R 20.02.2018 / 23:14

2 respostas

4

Parece que você está com problemas com espaços no nome do arquivo. Se você tiver um arquivo chamado "My Greatest Hits.mp3", seu comando tentará converter os três arquivos diferentes chamados "My", "Greatest" e "Hits.mp3". Em vez de usar a sintaxe "$ ()", apenas use "* .mp3" na linha for e certifique-se de citar os nomes dos arquivos no comando sox.

Além disso, o comando basename não remove a extensão do arquivo, apenas os nomes das pastas. Portanto, esse comando criará vários arquivos WAV com uma extensão ".mp3". Adicionando "-s .mp3" ao comando diz ao basename para retirar a extensão, e então colocar ".wav" no final adiciona a extensão correta.

Coloque tudo junto e você tem isso:

for i in *.mp3
do
    sox "$i" "waves/$(basename -s .mp3 "$i").wav"
done
    
por 20.02.2018 / 23:53
1

Primeiro, não use ls assim, na verdade não faz nada, já que é o shell que gera os nomes de arquivos no glob *mp3 de qualquer maneira. Além disso, ele quebra se algum de seus arquivos tiver espaço em branco em seus nomes.

Quanto ao erro, acho que sox aqui tenta interpretar o arquivo MP3 como wav, já que você deu o -t wav flag. Eu acho que você poderia fazer sem isso, como você fez no caso de arquivo único. Você só precisa alterar a extensão no nome do arquivo de saída também. basename pode remover o sufixo também, se você disser o que remover.

#!/bin/bash
for i in *.mp3
do
    sox "$i" "waves/$(basename "$i" .mp3).wav"
done

(O backtick-apostrophe é um antigo costume de 'quoting' do nome do arquivo. O backtick deve se parecer com o aspas do lado esquerdo, o que se parece com uma vírgula girada ( veja exemplos na Wikipedia ) Mas, tecnicamente, está errado, e parece horrível na maioria das fontes atuais.

    
por 20.02.2018 / 23:20

Tags