【问题标题】:C:Split wav file by silence gapC:通过静音间隙分割wav文件
【发布时间】:2011-12-12 03:13:38
【问题描述】:

我有一群人类正在阅读简单的句子(hello world)作为 wav 文件, 如何通过自动识别单词之间的间隙来打破每个包含单词(hello 和 world)的 2 个 wav 文件的 wav 文件? 不幸的是,我找不到为我做这件事的工具,所以我将编写 C 代码来做这件事, 至于我的理解,间隔应该是 wav 文件中的低数值,对吗? 我知道如何破解文件, 我很高兴能找到解决差距识别问题的方法。 谢谢!

【问题讨论】:

    标签: c wav break gaps-in-data


    【解决方案1】:

    我处理此类任务的方法是将 wav 文件分解为每个 0.05 秒的块,计算每个块的 RMS 幅度,并将 RMS 放大器与阈值进行比较。如果录音是在仔细控制的条件下完成的,并且语音音量相对较好地归一化,则阈值可能是静态值,但另一种方法是动态地检查是否存在比前一个块大得多的块。然后,您将超过阈值的块视为单词的开头。

    但是,在随意的演讲中,单词之间可能没有太多停顿。如果我毫不停顿地对你说“helloworld”,你就会很容易理解我的意思。

    RMS 幅度定义为各个样本的平方随时间的平均值的平方根。

    【讨论】:

    • 那么pasudo代码会是这样吗?
      SAMPLE_SIZE = 0.05; for(int idxFile=0;idxFile<FILE_SIZE;idxFile++) { float fSum=0; for(int i=0;i<SAMPLE_SIZE;i++){ byte = read_next_byte(); fSum = fSum + SQUARE(byte); } RMS_amplitude = SQUARE(fSum / SAMPLE_SIZE ) if(RMS_amplitude < threshold){ print("Gap detected at byte:" + idxFile) } }
    • cmets 没有新行,难以置信...link
    • 样本不是秒。样本不是字节。否则,这是非常粗略的想法。
    • 抱歉我的无知,我如何确定样本量?这个信息是 WAV 标头吗?
    • 是的。如果您还不熟悉音频信号处理工作,那么您可能已经超出了您的深度。概括地说,你想用这个来完成什么?
    【解决方案2】:

    请参阅this answer 关于音符开始检测(检测 WAV 文件中音符的开头和结尾与检测 WAV 文件中口语单词的开头和结尾的问题完全相同)。

    但是请注意,如果没有极其复杂(而且还不存在)的人工智能,您为自己设定的任务基本上是不可能的。当一个人在录音中说话时,单个单词之间的间隙通常与多音节单词中单个音节之间的间隙在数字上没有任何不同。

    【讨论】:

      【解决方案3】:

      http://digitalcardboard.com/blog/2009/08/25/the-sox-of-silence/

      我确定这是您需要的链接。

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

      SoX 会在检测到 5 秒或更长时间的静音时拆分音频。您最终会得到名为 out001.wav、out002.wav 等的输出文件。

      【讨论】:

      • ./sox in.wav out.wav 静音 1 0.1 0% 1 0.1 0% : newfile : 重启
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-07-04
      • 2018-01-13
      • 2017-05-14
      • 2010-09-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多