使用SoX检测和打印静默期的时间戳

时间:2013-08-06 00:05:04

标签: audio 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/

虽然它在某种程度上完成了这项工作,但它也削减并放弃了我不希望发生的沉默时期。

'沉默'是正确的选择,还是有更简单的方法来完成我需要做的事情?

感谢。

4 个答案:

答案 0 :(得分:10)

不幸的是不是Sox,但是ffmpeg有一个silencedetect过滤器,可以完全满足您的需求:

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

(检测到-50db的阈值,至少1秒,跛行from the ffmpeg documentation

...这会打印出这样的结果:

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

答案 1 :(得分:4)

(目前,至少)无法使silence效果输出到检测到静音的位置,或者保留所有无声音频。

如果您能够自己重新编译SoX,可以自己添加输出语句以查找切割位置,然后在单独的调用中使用trim来拆分文件。有了股票版本,你运气不好。

答案 2 :(得分:0)

necroposting: 您可以运行一个单独的脚本来迭代所有sox输出文件(对于f。* .wav),并使用该命令; soxi -D $f获取声音片段的DURATION。 然后,以秒为单位获取系统时间date "+%s",然后减去以查找录制开始的时间。

答案 3 :(得分:0)

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(取决于您的阈值)的行静默