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