Скрипт для запуска 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 файла - это монопары, а третий - выходной стереофайл.

Это здорово, но мне бы хотелось иметь скрипт, который будет автоматически находить все монопары и объединять их в стереофайлы.

Т.е. мне нужно найти все файлы с одинаковыми именами, кроме .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 ответа

Решение

Исходя из предложения 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'.

Попробуйте это с консоли 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

ПРИМЕЧАНИЕ. "./" представляет музыкальный каталог, в котором находятся ваши файлы.

Для людей, которым нужно сделать это в Windows с командным файлом:

4 правила, которые должны быть выполнены:

1) Пакетный файл должен быть помещен в каталог, где установлен SOX

2) Монофонические файлы должны иметь окончания.L.WAV и.R.WAV

3) Нет пробелов в имени файла

4) Поместите все ваши монофайлы / папки в новую папку с именем input внутри установочной папки SOX.

После запуска пакетного файла вы получите новую папку с именем output со всеми стереофайлами и той же структурой папок, что и входная папка.

Код комментируется, поэтому легко следовать каждому этапу процесса, не стесняйтесь изменять и публиковать здесь улучшенные версии этого скрипта (часть копирования должна быть движущейся, но я не очень разбираюсь в командном коде 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

решение Python с использованием sox, вызываемое через os.system()

У меня есть модель Tascam 12, которую я использую для записи, и когда я импортирую папки, я хочу объединить основной микс в стереодорожку. Делать это в галке всегда немного раздражает, особенно если уже поздняя ночь, и все, что мне хочется, это лечь спать и послушать только что сделанную запись.

Я сделал это так, чтобы вы могли объединить несколько папок в вызов командной строки, и он мог бы с ними справиться разумно, также вы можете вызвать его из нужной папки.

Я дал ему chmod +x и поместил его в свой /usr/local/bin на Mac OS, и он отлично работает, вызывая его из других каталогов. Вероятно, он несовместим с Windows из-за косой черты, но его можно легко отредактировать для вашей системы или, приложив небольшие усилия, можно заставить работать обе файловые системы. Делюсь здесь только потому, что давно собирался это сделать, и это прекрасно работает.

Я начал с попыток написать функцию, которая бы делала это на fish, а потом просто решил, что будет быстрее, хотя и немного уродливее, сделать это на Python. Но, с другой стороны, это означает, что он не зависит от оболочки.

Некрасиво и не прокомментировано, но, возможно, это сэкономит немного времени кому-то, кто хочет сделать что-то подобное.

Для пояснения, tascam сохраняет свои файлы в папке с датой, поэтому я использую имя папки в качестве префикса имени выходного файла, а TR11 и TR12 — это основные монофайлы микса, которые я хочу сделать левыми и правыми соответственно. И я сохраняю выходные файлы WAV на одну папку выше. Все это следует изменить в соответствии с любой ситуацией, с которой вы имеете дело.

Сложение «+ «норма -1»» нормализуется до -1 дБ. Также значительно замедляет процесс, поэтому, если вы работаете с большим количеством файлов и вам не нужно нормализовать, оставьте этот параметр выключенным, и он будет работать быстрее.

имя файла: merge_tascam_tracks.py

      #!/usr/bin/env python
# -*- coding: utf-8 -*-


import os, glob, sys


original_path = os.getcwd()



def combine_files(this_path='.'):
    os.chdir(this_path)
    print(os.getcwd())
    
    left_wav  = glob.glob("*TR11.wav")[0]
    right_wav = glob.glob("*TR12.wav")[0]
    
    date_prefix = os.path.split(os.getcwd())[-1]
    
    output_filename = "../" + date_prefix + '_stereo.wav'
    
    sox_command = 'sox -M ' + left_wav + ' ' + right_wav + ' ' + output_filename + " norm -1"
    print(sox_command)
    
    exit_code = os.system(sox_command)
    
    print()
    print('sox exited with code', exit_code)
    print()
    os.chdir(original_path)
    


if len(sys.argv) > 1:
    
    for new_path in sys.argv[1:]:
        combine_files(new_path)
else:
    combine_files()
Другие вопросы по тегам