【问题标题】:How to detect empty wave file in Python?如何在 Python 中检测空的波形文件?
【发布时间】:2017-09-02 03:41:33
【问题描述】:

我正在尝试整理一堆音频样本,其中一些是完全空白的。有人可以帮我找出检测文件在其持续时间内是否为空白(静默)的最佳方法吗?我找到了很多读取 wav 文件的方法,但到目前为止还没有关于如何确定文件是否为空白的方法。

到目前为止我的代码:

import soundfile as sf

path = '/Users/InNov8/Desktop/Elektron_Octotrack_Chain_Maker_v2/Bar 25 -- High 303/'

file1 = 'Bar 25 --- [tr] ---  4-Kick 2.aif' # blank
file2 = 'Bar 25 --- [tr] ---  10 Shaker.aif' # not blank
file3 = 'Bar 25 --- [tr] ---  14 HARD SNARE.aif' # blank

f1 = path + file1
x, fs = sf.read(f1)
print x
print fs
f2 = path + file2
x, fs = sf.read(f2)
print x
print fs

【问题讨论】:

  • 它的方差或标准差是一个很小的数字。??

标签: python wave


【解决方案1】:

检查文件中的数据是否只包含零。 soundfile 模块基于 NumPy,因此您可以使用一些比仅使用 any() 快得多的函数来做到这一点。见:Test if numpy array contains only zeros

请注意,仅仅因为文件 听起来 空白并不意味着它实际上全为零。它可能只是非常安静,或者包含少量噪音。

【讨论】:

  • 谢谢!我对所有文件的 any() 测试都得到了“假”结果,我正在测试一个“空”文件和一个明显有声音的文件。因此,有没有办法测试文件的音量是否低于某个阈值,b/c 你关于非常安静的文件导致故障的观点似乎正在发生。
  • 这并不是真正的故障,但是静默文件与静默文件不同。您可以测试文件的 RMS 值或峰值(例如,np.max(data) - np.min(data) 的大小)。
  • 这些值都不是真正的“音量”,因为音量是一种心理声学现象。但它们会为您提供测量信号幅度的不同方法。
  • 方差或标准差如何?
  • @wwii: 又名 RMS
【解决方案2】:

如果我理解正确,您有一堆音频文件,其中一些低于导致问题的特定阈值。 如果您愿意使用外部库,您可以使用pydub 来检测给定的audio_segment 是否高于/低于给定的阈值。

首先,你可以在windows上安装pydub

   pip install pydub

接下来您可以加载音频文件(例如wav,但您可以在link 中找到加载其他类型文件的方法)。

每个网站:

AudioSegment(…).dBFS
返回以 dBFS 为单位的 AudioSegment 的响度(相对于最大可能响度的 db)。最大振幅的方波大约为 0 dBFS(最大响度),而最大振幅的正弦波大约为 -3 dBFS

加载文件并找出它的响度

from pydub import AudioSegment
sound = AudioSegment.from_file("sound1.wav")

loudness = sound.dBFS

您可以加载多个文件并如上所述比较响度。

或者,如果您正在寻找文件特定部分的响度,那么您需要将音频片段分割成块,然后检查每个块的响度。同样,您可以在网站上找到详细信息。

【讨论】:

    【解决方案3】:

    感谢 Dietrich Epp 让我走上正轨。

    这是将几乎空的文件移动到另一个目录的代码

    import soundfile as np
    import os
    import sys
    import shutil
    
    
    path = '/Users/InNov8/Desktop/Elektron_Octotrack_Chain_Maker_v2/'
    
    source = 'Bar 25 -- High 303/'
    
    dst = 'Bar 25 -- High 303 -- blank/'
    
    
    source_path = path + source
    dst_path = path + dst
    
    files = []
    
    for dirname, dirnames, filenames in os.walk(source_path):
        for filename in filenames:
            if 'aif' in filename or 'wav' in filename:
                if 'asd' not in filename:
                    print os.path.join(dirname, filename)
                    files.append(filename)
    
    
    for f in files:
        x, fs = np.read(source_path + f)
        vol_rms =  x.max() - x.min()
    
        print f
        print vol_rms
    
        if vol_rms <= 6.103515625e-05:
            print '\n\nTRUE'
            print 'MOVE: ', source_path + f
            print 'DST: ', dst_path + f
            shutil.move(source_path + f, dst_path + f)
    
        print '\n\n\n'
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-04-01
      • 2020-05-27
      • 1970-01-01
      相关资源
      最近更新 更多