SoX: преобразование звуковых файлов из командной строки Печать
Добавил(а) microsin   

Утилита 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 -

Воспроизвести файл через звуковое устройство по умолчанию:

$ sox input_snd.wav -d

Примечание: можно использовать команду 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.