Обнаружение и печать временных меток периодов тишины с использованием SoX

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

Я старался

sox in.wav out.wav silence 1 0.5 1% 1 2.0 1% : newfile : restart

(любезно предоставлено http://digitalcardboard.com/blog/2009/08/25/the-sox-of-silence/)

Хотя это в некоторой степени сделало свою работу, оно также обрезало и отбросило периоды тишины, чего я не хочу.

Является ли «тишина» правильным вариантом или есть более простой способ выполнить то, что мне нужно сделать?

Спасибо.


person progfan    schedule 06.08.2013    source источник
comment
Есть новости по этой теме? Сможете ли вы выполнить это? Мне нужно сделать точно так же. В настоящее время я смело обнаруживаю тишину и экспортирую дорожку метки в виде текстового файла.   -  person 3244611user    schedule 26.10.2015


Ответы (4)


Не существует (по крайней мере, в настоящее время) способа заставить эффект silence выводить положение, в котором он обнаружил тишину, или сохранить весь тихий звук.

Если вы можете самостоятельно перекомпилировать SoX, вы можете самостоятельно добавить оператор вывода, чтобы узнать о позициях вырезания, а затем использовать trim в отдельном вызове для разделения файла. Со стоковой версией вам не повезло.

person chirlu    schedule 08.08.2013
comment
Привет, Чирлу, я надеялся, что это неправда. Я посмотрю, что можно сделать. - person progfan; 09.08.2013

К сожалению, не Sox, но ffmpeg имеет фильтр silencedetect, который делает именно то, что вы ищете:

ffmpeg -i in.wav -af silencedetect=noise=-50dB:d=1 -f null -

(порог обнаружения -50 дБ в течение как минимум 1 секунды, взят из из документации ffmpeg )

... это напечатает такой результат:

Press [q] to stop, [?] for help
[silencedetect @ 0x7ff2ba5168a0] silence_start: 264.718
[silencedetect @ 0x7ff2ba5168a0] silence_end: 265.744 | silence_duration: 1.02612
size=N/A time=00:04:29.53 bitrate=N/A
person Jeff Sisson    schedule 12.05.2016
comment
Существуют ли какие-либо новые библиотеки в 2017 году, которые могут это сделать? то есть, имея аудиофайл, иметь возможность обнаруживать и выводить временные метки периодов речи и периодов тишины. Спасибо. - person kRazzy R; 11.10.2017

SoX может легко предоставить временные метки фактического молчания в текстовом файле. Это не периоды тишины, но вы можете рассчитать их с помощью простого скрипта.

   .dat   Text  Data  files.   These  files  contain a textual representation of the sample data.  There is one line at the beginning that contains the sample
          rate, and one line that contains the number of channels.  Subsequent lines contain two or more numeric data intems: the time since the beginning  of
          the first sample and the sample value for each channel.

          Values are normalized so that the maximum and minimum are 1 and -1.  This file format can be used to create data files for external programs such as
          FFT analysers or graph routines.  SoX can also convert a file in this format back into one of the other file formats.

          Example containing only 2 stereo samples of silence:

              ; Sample Rate 8012
              ; Channels 2
                          0   0    0
              0.00012481278   0    0

Таким образом, вы можете сделать sox in.wav out.dat, затем разобрать текстовый файл и считать молчанием последовательность строк со значением, близким к 0 (в зависимости от вашего порога)

person golimar    schedule 07.06.2019

некропостинг: вы можете запустить отдельный скрипт, который перебирает все выходные файлы sox (для f в *.wav), и использовать команду; soxi -D $f, чтобы получить ПРОДОЛЖИТЕЛЬНОСТЬ звукового клипа. Затем получите системное время в секундах date "+%s", затем вычтите, чтобы найти время начала записи.

person NDP    schedule 20.05.2014