
У меня есть несколько аудиокниг, которые хранятся в больших 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