sox: Разделить звук на тишине, но сохранить тишину

sox: Разделить звук на тишине, но сохранить тишину

У меня есть несколько аудиокниг, которые хранятся в больших mp3-файлах. И я пытаюсь разделить эти большие mp3-файлы на несколько файлов поменьше.

Я нашел инструмент, который может обнаруживать тишину в аудиофайлах и разделять аудиофайлы на основе этого «разделителя».

Вот пример:

sox -V3 audiobook.mp3 audiobook_part_.mp3 \
silence 1 0.5 0.1% 1 0.5 0.1% : newfile : restart

По сути, это будет разделено audiobook.mp3на audiobook_part_001.mp3, audiobook_part_002.mp3, ..., где тишина >= 0,5 секунды.

Проблема в том, что эта команда не только разделяет файл, но и удаляет тишину.

Поэтому при воспроизведении новых файлов в плейлисте дорожки/абзацы звучат сжато.

Так как же сделать soxтак, чтобы файл был разделен, но тишина (в конце каждого трека) осталась?

решение1

Вы можете сохранить все паузы в разделенных частях с помощью небольших изменений. Начиная с вашей оригинальной команды:

silence 1 0.5 0.1%   1 0.5 0.1% 

Первая тройка значений означает удаление тишины, если таковая имеется, в начале до .5 секунд звука выше .1%. Вторая тройка означает остановку, когда будет не менее .5 секунд тишины ниже .1%. Остальная часть вашей команды, : newfile : restart, затем запускает новый выходной файл и снова начинает искать звук в начале. Таким образом, первый файл заканчивается, когда начинается тишина, а второй файл начнется, когда тишина закончится.

Самый простой вариант, доступный для улучшения этого, — silence -l. Он сохранит 0,5 секунды тишины, которая вызвала конец файла. К сожалению, любая более длинная тишина будет удалена, поскольку это начало следующего файла. Простой способ сохранить более длинный промежуток — объединить его -lс более длительным временем обнаружения, например, 2 секунды:

silence -l  1 0.5 0.1%   1 2.0 0.1%

Теперь вы будете разделяться только если есть хотя бы 2 секунды тишины, но вы сохраните первые 2 секунды разрыва. Чтобы не потерять всю тишину, просто удалите обнаружение тишины в начале. Вам нужно заменить триплет на сингл 0:

silence -l  0   1 2.0 0.1%

Если вы хотите поиграть с простыми звуковыми файлами, чтобы увидеть, как soxобрабатывает ситуации, вы можете легко создать 2 звуковых файла, один из которых состоит из 1 секунды тона, а другой из 1 секунды тишины, затем объединить их вместе по своему усмотрению, прежде чем представить результат в качестве входных данных для эффекта silence. Например, создайте:

sox -n gap.wav   trim 0 1
sox -n tone.wav  synth 1.001t sine C5

затем соедините пробел-тон-пробел-тон и создайте, out.wavиспользуя свой эффект, и послушайте результат:

sox gap.wav tone.wav gap.wav tone.wav out.wav silence 1 0.5 0.1%
play out.wav

решение2

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

Видетьэтот ответо том, как использовать сокс-прокладку. Например

files="*.wav"
for f in $files
do
  sox "$f" "${f%.*}-pad.wav" pad 2 3
done

Связанный контент