script para executar o sox para combinar várias faixas mono para estéreo

4

Eu tenho uma pasta cheia de .wav arquivos de áudio.

Alguns são estéreo, a maioria é mono splits.

Os pares de divisão mono são todos denominados foo bar track.L.wav e foo bar track.R.wav

Eu posso usar a ferramenta de linha de comando sox para combinar um par mono em uma faixa estéreo como esta:

sox -M track1.L.wav track1.R.wav track1.Stereo.wav

onde os 2 primeiros arquivos são os pares mono e o terceiro é o arquivo estéreo de saída.

Isso é ótimo, mas eu gostaria de ter um script que irá encontrar automaticamente todos os pares mono e combiná-los em arquivos estéreo.

Ou seja, preciso encontrar todos os arquivos com o mesmo nome, exceto o .L. e .R. antes da extensão, e executar sox neles, exibindo um novo arquivo com o mesmo nome sem o sufixo L/R .

Por exemplo, se minha pasta contiver esses arquivos:

track1.L.wav
track2.L.wav
track3.L.wav
track4.L.wav
track1.R.wav
track2.R.wav
track3.R.wav
track4.R.wav
track6.wav
track7.wav

Eu preciso executar estes comandos:

sox -M track1.L.wav track1.R.wav track1.Stereo.wav
sox -M track2.L.wav track2.R.wav track2.Stereo.wav
sox -M track3.L.wav track3.R.wav track3.Stereo.wav
sox -M track4.L.wav track4.R.wav track4.Stereo.wav

Aqui é onde eu estou até agora:

for file in ./*.L.wav;
do 
    file2='echo $file | sed 's_\(.*\).L.wav_.R.wav_'';
    out='echo $file | sed 's_\(.*\).L.wav_.STEREO.wav_'';
    echo $file - $file2 - $out;
done

Isso funciona, mas quando substituo a linha echo por

sox -M $file $file2 $out;

não funciona; espaços nos nomes dos arquivos fazem com que ele falhe.

    
por Ze'ev 04.10.2012 / 23:54

3 respostas

2

Indo da sugestão do sgmart, resolvi:

for file1 in ./*.L.wav; do 
  file2='echo $file1 | sed 's_\(.*\).L.wav_.R.wav_'';
  out='echo $file1 | sed 's_\(.*\).L.wav_.STEREO.wav_'';
  sox -MS "$file1" "$file2" "$out";
  mv "$file1" mono; mv "$file2" mono;
done

Necessário " em torno das variáveis.

E adicionei um pouco para mover os arquivos processados para uma subpasta "mono".

    
por 05.10.2012 / 03:31
5

Tente com isso em um console GNU / Linux:

for file in ./*L*wav;
do
    for file2 in ./*R*wav;
    do
        $out = "Stereo"
        sox -M $file $file2 $file-$out.wav;
    done;
done

NOTA: "./" representa o diretório de músicas onde seus arquivos estão.

    
por 05.10.2012 / 00:27
0

Para pessoas que precisam fazer isso no Windows com um arquivo em lotes:

As 4 regras que precisam ser preenchidas são:

1) O arquivo de lote deve ser colocado no diretório onde o SOX está instalado

2) Os arquivos Mono precisam ter terminações de .L.WAV e .R.WAV

3) Não há espaços em branco no nome do arquivo

4) Coloque todos os seus arquivos / pastas mono em uma nova pasta chamada entrada dentro da pasta de instalação SOX

Depois de executar o arquivo em lote, você obterá uma nova pasta chamada saída com todos os arquivos estéreo e a mesma estrutura de pastas que a entrada pasta

O código é comentado, por isso é fácil seguir cada etapa do processo, sinta-se à vontade para modificar e postar aqui versões melhoradas deste script (A parte da cópia deve ser um movimento, mas não sou muito especialista em código de lote cmd !).

Aqui vamos nós:

cd %~dp0
setlocal enabledelayedexpansion

REM for each file with extension .L.WAV in input folder and its subdirectories do:
for /R %~dp0input %%F in (*.L.WAV) do (

    REM get fullpath name and then remove the last 6 characters. ex: MYWAVE.L.WAV -> MYWAVE
    set fileName=%%F
    set finalName=!filename:~0,-6!

    REM set names for each parameter used by sox
    set wavL=!finalName!.L.WAV
    set wavR=!finalName!.R.WAV
    set wavST=!finalName!.ST.WAV

    REM call sox for mono to stereo conversion
    sox !wavL! !wavR! !wavST! -MS

)

REM creat output folder
mkdir %~dp0output

REM copy files to output folder 
echo d | xcopy %~dp0input %~dp0output /S

REM delete ST files from input folder 
for /R %~dp0input %%F in (*.ST.WAV) do del %%F

REM delete L files from output folder 
for /R %~dp0output %%F in (*.L.WAV) do del %%F

REM delete R files from output folder 
for /R %~dp0output %%F in (*.R.WAV) do del %%F
    
por 29.10.2015 / 09:17