如何在Python中检测空波文件?

时间:2017-09-02 03:41:33

标签: python wave

我正在尝试对一些音频样本进行排序,其中一些音频样本完全空白。有人可以帮我找出检测文件是否为空(无声)持续时间的最佳方法吗?我找到了很多方法来读取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

3 个答案:

答案 0 :(得分:1)

检查文件中的数据是否仅包含零。 soundfile模块基于NumPy,因此您可以使用一些比仅使用any()快一点的函数来实现。请参阅:Test if numpy array contains only zeros

请注意,仅仅因为文件声音空白并不意味着它实际上全为零。它可能非常安静,或含有少量噪音。

答案 1 :(得分:1)

如果我理解正确,你会收到许多音频文件,其中一些低于某个导致问题的阈值。 如果您愿意使用外部库,则可以使用pydub来检测给定的audio_segment是否高于/低于给定的阈值。

首先,您可以使用

在Windows上安装pydub
   pip install pydub

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

每个网站:

  

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

加载文件并找出其响度

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

loudness = sound.dBFS

您可以加载多个文件并比较上面的响度。

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

答案 2 :(得分:0)

感谢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'