Утилита SoX (название обозначает "Swiss army knife of sound", т. е. "Швейцарский Нож для звука") предоставляет широкие возможности по обработке и преобразованию звуковых файлов различных форматов.
Установка:
$ sudo apt install sox
Чтение списков пакетов… Готово
Построение дерева зависимостей
Чтение информации о состоянии… Готово
Предлагаемые пакеты:
libsox-fmt-all
Следующие НОВЫЕ пакеты будут установлены:
sox
Обновлено 0 пакетов, установлено 1 новых пакетов, для удаления отмечено 0 пакетов,
и 1 пакетов не обновлено.
Необходимо скачать 102 kB архивов.
После данной операции объём занятого дискового пространства возрастёт на 200 kB.
Пол:1 http://ru.archive.ubuntu.com/ubuntu focal-updates/universe amd64 sox amd64
14.4.2+git20190427-2+deb11u2build0.20.04.1 [102 kB]
Получено 102 kB за 0с (311 kB/s)
Выбор ранее не выбранного пакета sox.
(Чтение базы данных … на данный момент установлено 272036 файлов и каталогов.)
Подготовка к распаковке …/sox_14.4.2+git20190427-2+deb11u2build0.20.04.1_amd64.d
eb …
Распаковывается sox (14.4.2+git20190427-2+deb11u2build0.20.04.1) …
Настраивается пакет sox (14.4.2+git20190427-2+deb11u2build0.20.04.1) …
Обрабатываются триггеры для man-db (2.9.1-1) …
Обрабатываются триггеры для mime-support (3.64ubuntu1) …
Запуск команды sox без опций (также как и sox -h) предоставляет версию sox и подсказку по опциям командной строки (подробную справку по можно получить командой man sox):
$ sox
sox: SoX v14.4.2
sox FAIL sox: не указаны имена входных файлов.
Формат командной строки: [gopts] [[fopts] infile]... [fopts] outfile [effect [effopt]]...
СПЕЦИАЛЬНЫЕ ИМЕНА ФАЙЛОВ (infile, outfile):
- Пайп/редирект ввода/вывода (stdin/stdout); может потребоваться -t
-d, --default-device Использовать аудиоустройство по умолчанию (если оно доступно)
-n, --null Использовать дескриптор файла 'null'; например с synth effect
-p, --sox-pipe Псевдоним для '-t sox -'
СПЕЦИАЛЬНЫЕ ИМЕНА ФАЙЛОВ (только infile):
"|program [options] ..." Пайп ввода из внешней программы (где это поддерживается)
http://server/file Использовать указанный URL в качестве входного файла (где это поддерживается)
ГЛОБАЛЬНЫЕ ОПЦИИ (gopts) (могут быть указаны в любом месте перед первым effect):
--buffer BYTES Установка размера буферов обработки (по умолчанию 8192)
--clobber Не предупреждать о перезаписи выходного файла (по умолчанию)
--combine concatenate Склеить все входные файлы (по умолчанию для sox, rec)
--combine sequence Последовательно все входные файлы (по умолчанию для play)
-D, --no-dither Не делать дизеринг автоматически
--dft-min NUM Минимальный размер (log2) для DFT-обработки (по умолчанию 10)
--effects-file FILENAME Файл, содержащий эффекты и опции
-G, --guard Использовать временные файлы для защиты от клиппинга
-h, --help Показать номер версии и информацию об использовании
--help-effect NAME Показать использования эффекта с именем NAME, или NAME=для всех эффектов
--help-format NAME Показать информацию по формату NAME, или NAME=для всех форматов
--i, --info Поведение как у soxi(1)
--input-buffer BYTES Переназначить размер входного буфера (по умолчанию: как --buffer)
--no-clobber Запрос для перезаписи выходного файла
-m, --combine mix Микшировать несколько входных файлов (вместо склейки)
--combine mix-power Микшировать до эквивалентной мощности (вместо склейки)
-M, --combine merge Merge multiple input files (вместо склейки)
--magic Использовать 'магию' детектирования типа файла
--multi-threaded Разрешить параллельную обработку каналов
--norm Guard (см. --guard) и нормализация
--play-rate-arg ARG Аргумент по умолчанию 'rate' для auto-resample вместе с 'play'
--plot gnuplot|octave Генерировать скрипт для отображения ответа эффекта фильтра
-q, --no-show-progress Запуск "по-тихому"; противоположность -S
--replay-gain track|album|off По умолчанию: off (sox, rec), track (play)
-R Использовать случайные числа по умолчанию (одинаковые для каждого запуска SoX)
-S, --show-progress Отображать прогресс при обработке аудиоданных.
--single-threaded Запретить параллельную обработку каналов
--temp DIRECTORY Указать директорию для временных файлов
-T, --combine multiply Перемножить выборки соответствующих каналов из всех входных файлов (вместо склейки)
--version Отобразить номер версии SoX и выйти
-V[LEVEL] Инкрементировать или установить уровень подробности вывода (по умолчанию 2);
Уровни:
1: сообщения отказа (failure)
2: предупреждения (warnings)
3: подробности обработки
4-6: повышение уровня для отладочных сообщений
ОПЦИИ ФОРМАТА (fopts):
Для входных файлов опции формата нужны только когда у файлов отсутствует заголовок.
У выходных файлов будет тот же формат, что и у входного, где это возможно и не было переопределено
различными способами, включая опции формата выходного файла.
-v|--volume FACTOR Коэффициент подстройки громкости входного файла (число real)
--ignore-length Игнорировать длину файла, указанную в заголовке, читать до EOF
-t|--type FILETYPE Тип файла звука
-e|--encoding ENCODING Установить кодирование (ENCODING может быть одним из вариантов signed-integer,
unsigned-integer, floating-point, mu-law, a-law, ima-adpcm, ms-adpcm, gsm-full-rate)
-b|--bits BITS Размер кодированной выборки звука в битах
-N|--reverse-nibbles Обратный порядок кодирования нибблов
-X|--reverse-bits Обратный порядок кодирования бит
--endian little|big|swap Порядок следования байт при кодировании; swap означает противоположный к умолчанию
-L/-B/-x Укороченные варианты для опций, перечисленных выше
-c|--channels CHANNELS Количество каналов для аудиоданных; например 2 = stereo
-r|--rate RATE Частота выборок (sample rate) звука
-C|--compression FACTOR Коэффициент компрессии для выходного формата
--add-comment TEXT Добавить комментарий к выходному файлу
--comment TEXT Указывает текст комментария для выходного файла
--comment-file FILENAME Файл, содержащий текст комментария для выходного файла
--no-glob Не использовать подстановочные символы ('glob' wildcard) с последующим именем файла
ФОРМАТЫ АУДИОФАЙЛА: 8svx aif aifc aiff aiffc al amb amr-nb amr-wb anb au avr awb caf cdda cdr cvs cvsd cvu
dat dvms f32 f4 f64 f8 fap flac fssd gsm gsrt hcom htk ima ircam la lpc lpc10 lu mat mat4 mat5 maud nist
ogg paf prc pvf raw s1 s16 s2 s24 s3 s32 s4 s8 sb sd2 sds sf sl sln smp snd sndfile sndr sndt sou sox sph
sw txw u1 u16 u2 u24 u3 u32 u4 u8 ub ul uw vms voc vorbis vox w64 wav wavpcm wv wve xa xi
ФОРМАТЫ ПЛЕЙЛИСТА: m3u pls
ДРАЙВЕРЫ АУДИОУСТРОЙСТВ: alsa
ЭФФЕКТЫ: allpass band bandpass bandreject bass bend biquad chorus channels compand contrast dcshift deemph
delay dither divide+ downsample earwax echo echos equalizer fade fir firfit+ flanger gain highpass hilbert
input# ladspa loudness lowpass mcompand noiseprof noisered norm oops output# overdrive pad phaser pitch
rate remix repeat reverb reverse riaa silence sinc spectrogram speed splice stat stats stretch swap synth
tempo treble tremolo trim upsample vad vol
* Устаревший эффект + Экспериментальный эффект # Эффект только LibSoX
ОПЦИИ ЭФФЕКТА (effopts): зависят от effect; см. --help-effect
[Получение информации об аудиофайле]
SoX считывает и перезаписывает аудиоданные. Как эти данные будут перезаписаны - зависит от вас. Иногда не нужно сохранять преобразованные данные, например когда они посылаются напрямую в ваши динамики для воспроизведения звука. Однако перед преобразованием хорошей идеей будет сначала разобраться, с какими входными данными мы имеем дело.
Чтобы получить информацию о звуковом файле, используйте команду soxi. Эта команда представляет собой символьную ссылку (symlink) на команду sox --info (или sox --i).
$ soxi countdown.mp3
Input File : '/home/tux/countdown.mp3'
Channels : 1
Sample Rate : 44100
Precision : 16-bit
Duration : 00:00:11.21 = 494185 samples...
File Size : 179k
Bit Rate : 128k
Sample Encoding: MPEG audio (layer I, II or III)
Подобный вывод дает хорошую информацию о том, как закодирован файл, размер файла, частота выборок (sample rate), количество каналов.
[Преобразование файлов]
Например, звук в игре показывает отсчет, который предоставлен в файле MP3. Хотя почти все программы редакторов звука позволяют загрузить сжатое audio, но не все они позволяют редактировать сжатые данные звука. Для редактирования звука где-то произойдет преобразование, либо скрыто от пользователя, либо с предложением сохранить копию файла. Хорошая идея - сделать такое преобразование самостоятельно, тогда все будет полностью под вашим контролем.
Преобразование, которое sox выполняет над файлами, представляет конвейер из последовательности следующих шагов:
input combine effects output
В синтаксисе команды шаг effects указывается последним, что несколько запутывает. Т. е. конвейер в командной строке описывается следующим образом:
input → combine → output → effects
Кодирование. Простейшая команда преобразования требует только указания входного и выходного файла. Формат входного файла определяется автоматически, по его заголовку. Формат выходного файла определяется по формату входного файла и по расширению выходного файла. Вот пример команды для преобразования файла MP3 в файл lossless FLAC:
$ sox countdown.mp3 output.flac
$ soxi output.flac
Input File : 'output.flac'
Channels : 1
Sample Rate : 44100
Precision : 16-bit
Duration : 00:00:11.18 = 493056 samples...
File Size : 545k
Bit Rate : 390k
Sample Encoding: 16-bit FLAC
Comment : 'Comment=Processed by SoX'
Эффекты. Цепочка эффектов (effects) указывается в конце строки команды. Эффект может выполнить манипуляции над звуковыми данными перед отправкой их в выходной файл (или устройство воспроизведения). Например, иногда слишком громкий звук в файле может вызвать проблемы преобразования:
$ sox bad.wav bad.ogg
sox WARN sox: `bad.ogg' output clipped 126 samples; decrease volume?
Применение эффекта gain часто позволит решить эту проблему:
$ sox bad.wav bad.ogg gain -1
Фейдинг. Другой полезный эффект это fade (плавное изменение уровня звука). Этот эффект позволяет определить форму изменения (fade-in или fade-out), а также как долго будет выполняться эффект фейдинга.
Пример фейдинга fade-in за 6 секунд в форме инверсной параболы:
$ sox intro.ogg intro.flac fade p 6
Следующий пример указывает 3-секундный fade-in для начала звука и fade-out, начиная с метки 8 секунд (интро-музыка длится только 11 секунд, так что в этом случае fade-out также составляет 3 секунды):
$ sox intro.ogg intro.flac fade p 3 8
Существуют различные виды фейдинга (sine, linear, inverted parabola, и так далее), а также опции направления фейдинга (fade-in - повышение громкости, fade-out - затухание), они перечислены на странице документации sox man.
Синтаксис плагинов эффекта. У каждого плагина эффекта свой синтаксис, так что для подробной информации обратитесь к man-страничке документации по интересующему эффекту.
Эффекты могут быть объедены цепочкой в одной команде, по крайней мере в той степени, как вы хотите их объединить. Другими словами, не существует синтаксиса применить эффект flanger во время 6-секундного fade-out. Иногда для более точного результата вам понадобится графический редактор звука или цифровая аудиостанция наподобие LMMS или Rosegarden. Однако если вам просто нужно однократно применить эффекты, то вы можете их перечислить вместе в одной команде.
Следующая команда применит эффект -1 gain, замедление темпа (tempo stretch) 1.35 и fade-out:
$ sox intro.ogg output.flac gain -1 stretch 1.35 fade p 0 6
$ soxi output.flac
Input File : 'output.flac'
Channels : 1
Sample Rate : 44100
Precision : 16-bit
Duration : 00:00:15.10 = 665808 samples...
File Size : 712k
Bit Rate : 377k
Sample Encoding: 16-bit FLAC
Comment : 'Comment=Processed by SoX'
Combining. SoX может также комбинировать аудиофайлы, либо их склейкой, либо микшированием.
Чтобы соединить (concatenate) несколько файлов друг с другом, в команде указываются эти файлы как входные. Последнее имя файла это выходной файл.
$ sox countdown.mp3 intro.ogg output.flac
В этом примере файл output.flac будет содержать звук из countdown.mp3, за которым идет звук из intro.ogg.
Если вы хотите, чтобы в выходном файле появились звуки входных файлов поверх друг друга (микширование), то можете использовать опцию --combine mix:
$ sox --combine mix countdown.mp3 intro.ogg output.flac
Представим, однако, что два входных файла отличаются не только своими кодеками. Нередки ситуации, когда треки вокала записаны в mono (1 канал), однако музыка записана как минимум в stereo (2 канала). SoX не будет использовать решение по умолчанию, так что вы должны сначала самостоятельно стандартизировать форматы двух файлов.
Изменение аудиофайлов. Опции, связанные с именем файла, указываются перед ним. Например, опция --channels в следующей команде применяется только к файлу input.wav, и не к файлу example.ogg или файлу output.flac:
$ sox --channels 2 input.wav example.ogg output.flac
Это значит, что позиция опции в командной строке имеет большое значение. Если вы указываете опцию в начале команды, вы по существу переопределяете только то, что SoX передает из входных файлов самостоятельно. Однако параметры, размещенные непосредственно перед выходным файлом, определяют способ записи SoX аудиоданных.
Чтобы решить проблему совместимости каналов из предыдущего примера, нужно сначала стандартизировать входные файлы, и затем выполнить mix:
$ sox countdown.mp3 --channels 2 countdown-stereo.flac gain -1
$ soxi countdown-stereo.flac
Input File : 'countdown-stereo.flac'
Channels : 2
Sample Rate : 44100
Precision : 16-bit
Duration : 00:00:11.18 = 493056 samples...
File Size : 545k
Bit Rate : 390k
Sample Encoding: 16-bit FLAC
Comment : 'Comment=Processed by SoX'
$ sox --combine mix \
countdown-stereo.flac \
intro.ogg \
output.flac
Для SoX в случае сложных преобразований абсолютно необходимо использовать несколько команд, так что нормальным будет создание временных файлов по мере необходимости.
Многоканальное audio. Конечно, не все аудиофайлы ограничиваются одним или двумя каналами. Если вы хотите скомбинировать несколько каналов звука в один файл, то можете использовать опцию --combine merge:
$ sox --combine merge countdown.mp3 intro.ogg output.flac
$ soxi output.flac
Input File : 'output.flac'
Channels : 3
[...]
[Примеры использования sox]
Преобразование stereo в mono:
$ sox input_snd.wav --channels 1 output_snd.wav
Нормализация звука:
$ sox input_snd.wav output_snd.wav norm
Передискретизация в 22050 выборок/сек:
$ sox input_snd.wav output_snd.wav rate 22050
Изменение формата на 8-bit Unsigned Integer PCM:
$ sox input_snd.wav -e unsigned-integer -b 8 output_snd.wav
То же самое, но уже с передискретизацией на 22050 выборок/сек:
$ sox input_snd.wav -e unsigned-integer -b 8 output_snd.wav rate 22050
Сохранить левый канал из входного стереофайла:
$ sox input_snd.wav output_snd.wav remix 1
Сохранить правый канал из входного стереофайла:
$ sox input_snd.wav output_snd.wav remix 2
Сохранить микс левого и правого канала из входного стереофайла (результат такой же, как и с опцией --channels 1):
$ sox input_snd.wav output_snd.wav remix -
Воспроизвести файл через звуковое устройство по умолчанию:
Примечание: можно использовать команду play input_snd.wav. Команда play это просто псевдоним для sox файл -d.
Следующая команда формирует плавное нарастание уровня в начале файла и плавное затухание в конце:
$ sox input_snd.wav output_snd.wav fade p 1 3.7 1.5
Здесь используются параметры:
fade название эффекта (фейдинг)
p форма огибающей для изменения уровня в виде инверсной параболы. Можно указать и другие варианты огибающей: q четверть периода синусоиды, h половина периода синусоиды, t линейное изменение, l логарифмическое изменение.
1 интервал нарастания уровня (fade-in) в секундах от начала файла.
3.7 определяет позицию в секундах относительно начала файла, после которой файл будет обрезан, т. е. конец формирования затухания (fade-out). Если этот и следующий за ним параметр не указать, то эффект затухания применяться не будет.
1.5 интервал в секундах, в течение которого формируется fade-out до момента завершения выходного файла. В нашем примере фейдинг начнется от (3.7 - 1.5) = 2.2 секунды относительно начала файла, и завершится в позиции 3.7 секунды относительно начала файла. Весь файл получится длиной 3.7 секунды. Если вместо 3.7 указана длительность, превышающая длительность входного файла, то выходной файл будет дополнен тишиной.
[Ссылки]
1. Convert audio files with this versatile Linux command site:opensource.com. 2. Онлайн-справка по SoX. |