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

如何在Python中检测空波形文件?,python,wave,Python,Wave,我试图通过一堆音频样本进行分类,其中一些是完全空白的。有人能帮我找出最好的方法来检测一个文件在其持续时间内是否为空白(静默)吗?我已经找到了一系列读取wav文件的方法,但到目前为止,还没有任何关于如何确定文件是否为空的方法 迄今为止,我所掌握的守则: import soundfile as sf path = '/Users/InNov8/Desktop/Elektron_Octotrack_Chain_Maker_v2/Bar 25 -- High 303/' file1 = 'Bar 2

我试图通过一堆音频样本进行分类,其中一些是完全空白的。有人能帮我找出最好的方法来检测一个文件在其持续时间内是否为空白(静默)吗?我已经找到了一系列读取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

检查文件中的数据是否仅包含零。
soundfile
模块基于NumPy,因此您可以使用一些比仅使用
any()
更快的函数来实现这一点。见:


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

检查文件中的数据是否只包含零。
soundfile
模块基于NumPy,因此您可以使用一些比仅使用
any()
更快的函数来实现这一点。见:


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

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

首先,您可以使用在windows上安装
pydub

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

每个网站:

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

加载文件并找出其响度

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

loudness = sound.dBFS
您可以加载多个文件并如上所述比较响度


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

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

首先,您可以使用在windows上安装
pydub

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

每个网站:

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

加载文件并找出其响度

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

loudness = sound.dBFS
您可以加载多个文件并如上所述比较响度


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

感谢迪特里希·埃普让我走上了正确的道路

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

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'
将声音文件导入为np
导入操作系统
导入系统
进口舒蒂尔
path='/Users/InNov8/Desktop/Elektron\u Octotrack\u Chain\u Maker\u v2/'
震源='条形25--高303/'
dst='条形25--高303--空白/'
源\路径=路径+源
dst_路径=路径+dst
文件=[]
对于os.walk(源路径)中的dirname、dirname和文件名:
对于文件名中的文件名:
如果文件名中的“aif”或文件名中的“wav”:
如果文件名中没有“asd”:
打印os.path.join(目录名、文件名)
files.append(文件名)
对于文件中的f:
x、 fs=np.read(源路径+f)
vol_rms=x.max()-x.min()
打印f
打印卷

感谢迪特里希·埃普让我走上正轨

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

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'
将声音文件导入为np
导入操作系统
导入系统
进口舒蒂尔
path='/Users/InNov8/Desktop/Elektron\u Octotrack\u Chain\u Maker\u v2/'
震源='条形25--高303/'
dst='条形25--高303--空白/'
源\路径=路径+源
dst_路径=路径+dst
文件=[]
对于os.walk(源路径)中的dirname、dirname和文件名:
对于文件名中的文件名:
如果文件名中的“aif”或文件名中的“wav”:
如果文件名中没有“asd”:
打印os.path.join(目录名、文件名)
files.append(文件名)
对于文件中的f:
x、 fs=np.read(源路径+f)
vol_rms=x.max()-x.min()
打印f
打印卷

如果有,谢谢!对于所有文件的any()测试,我得到了“false”结果,其中我测试了一个“空”文件和一个明显有声音的文件。因此,有没有办法测试文件的容量是否低于某个阈值,b/c您关于非常安静的文件导致故障的观点似乎正在发生。这不是真正的故障,但安静的文件与安静的文件不同。您可以测试文件的RMS值或峰值(例如,
np.max(data)-np.min(data)
)的大小)。这两个值都不是真正的“音量”,因为音量是一种心理声学现象。但是他们会给你不同的方法来测量信号的大小。方差或标准差呢?@wwii:a.k.a.RMSThanks!对于所有文件的any()测试,我得到了“false”结果,其中我测试了一个“空”文件和一个明显有声音的文件。因此,是否有一种方法可以测试文件的卷是否低于某个阈值,b/c您对q的看法