Скрипт для запуска 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()