web-dev-qa-db-ja.com

soxを実行して複数のモノラルトラックをステレオに結合するスクリプト

.wavオーディオファイルでいっぱいのフォルダがあります。

一部はステレオで、ほとんどはモノラルスプリットです。

モノスプリットペアはすべてfoo bar track.L.wavおよびfoo bar track.R.wavという名前です。

コマンドラインツールsoxを使用して、次のようにモノラルペアを1つのステレオトラックに結合できます。

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

ここで、最初の2つのファイルはモノラルペアで、3番目は出力ステレオファイルです。

これは素晴らしいことですが、すべてのモノラルペアを自動的に見つけてステレオファイルに結合するスクリプトが必要です。

つまり、拡張子の前の.L..R.を除いて同じ名前のすべてのファイルを検索し、それらに対してsoxを実行して、新しいファイルに出力する必要があります。 L/Rサフィックスのない同じ名前。

たとえば、フォルダに次のファイルが含まれている場合:

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

これらのコマンドを実行する必要があります。

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

これが私が今のところいるところです:

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

それは機能しますが、echo行を次のように置き換えると

sox -M $file $file2 $out;

それは機能しません。ファイル名にスペースがあると失敗します。

4
Dan

Sgmartの提案から、私はそれを解決しました:

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

必要"は変数の周りにあります。

そして、処理されたファイルを「mono」サブフォルダーに移動するためのビットを追加しました。

2
Dan

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

注:「。/」は、ファイルがある音楽ディレクトリを表します。

5
slackmart

Windowsでバッチファイルを使用してこれを行う必要がある場合:

4つのルール満たす必要があるのは次のとおりです。

1)バッチファイルは、SOXがインストールされているディレクトリに配置する必要があります

2)モノラルファイルには.L.WAVおよび.R.WAVの終端が必要です

ファイル名に空白はありません

4)すべてのモノラルファイル/フォルダーをSOX内のinputという名前の新しいフォルダーに配置しますインストールフォルダ

バッチファイルを実行すると、outputという名前の新しいフォルダーが作成され、すべてのステレオファイルと同じフォルダー構造が表示されます。 inputフォルダー

コードはコメント化されているので、プロセスの各ステップを簡単にたどることができます。このスクリプトの改善されたバージョンを自由に変更してここに投稿してください(コピー部分は移動する必要がありますが、cmdバッチコードの専門家ではありません!)。

さあ行こう:

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
0
alexirae