python既可以输出文本也可以输出图形声音,python调用音频文件
我有三个观察分享。
首先,经过一些游戏,我得出了一个结论,开始检测算法似乎是为了自动重新调整自己的操作,以便在任何给定的时刻考虑当地的背景噪声。这个可能是有顺序的,所以可以检测到弱部的开始时间,和强部的可能性一样。这有一个令人遗憾的结果,即算法往往会触发廉价麦克风发出的背景噪音——开始检测算法诚实地认为它只是在听低音音乐。
第二个观察结果是,在你的录音例子中(大约前0.1秒),大约前~ 2200个样本有点不稳定,因为在短暂的初始间隔中,噪声确实几乎为零。试试放大起点的波形,你就明白我的意思了。不幸的是,噪音开始后吉他弹奏开始得如此之快(样本3000左右),算法无法独立解决这两个问题——相反它只是将两者合并为一个开始事件,开始时间提前了约0.1秒。所以我为了‘规范’档案,粗略删除了前2240个样本(我不认为这是作弊;如果您之前只录制了第二个左右的初始静音,那么边缘效应可能会消失,并像往常一样选取第一个弦乐)。
我的第三个观察是,基于频率的过滤只有当噪音和音乐实际上在一些不同的频带时才有效。这个案子可能是这样,但是我觉得你还没有证明。因此,我选择尝试一种不同的方法,而不是基于频率的滤波:阈值处理。我使用录音的最后3秒钟,在没有吉他演奏的情况下,估计整个录音中的典型背景噪声水平,以RMS能量单位表示,然后,我使用该中值设置的最小能量阈值被计算为安全地高于中值。只有当均方根能量高于阈值时,检测器返回的初始事件才被视为“有效”。
示例脚本如下:
进口librosa
将numpy作为np导入
将matplotlib.pyplot作为plt导入
#我对此进行了尝试,但最终保留了默认值
霍普伦=512
y,sr=librosa.core.load(。/Vocaroo_s07Dx8dWGAR0.mp3 )
#注意,前2240个样本(0.1秒)是异常低的噪声,
#所以把这部分从处理中去掉
start=2240
y=y[start:]
idx=np.arange(len(y))
#以通常的方式计算开始帧
onset _ frames=librosa . onset . onset _ detect(y=y,sr=sr,hop_length=hoplen)
on STM=librosa . frames _ to _ time(onset _ frames,sr=sr,hop_length=hoplen)
#计算每帧均方根能量。我缩短了画面长度
#默认值,以避免过度平滑
rmse=librosa.feature.rmse(y=y,frame_length=512,hop_length=hoplen)[0,]
env TM=librosa . frames _ to _ time(NP . arange(len(RMSE)),sr=sr,hop_length=hoplen)
#使用最后3秒钟的记录来估计中值噪音水平
#和典型变化
noiseidx=[envtm envtm[-1] - 3.0]
noise median=NP . percentile(RMSE[noise idx],50)
sigma=NP . percentile(RMSE[noise idx],84.1) - noisemedian
#设置申报所需的最小RMS能量阈值
#等于中值以上5 sigma的“发作”事件
阈值=噪声中值5*sigma
threshidx=[rmse阈值]
#选择符合RMS能量的校正开始时间
#最低门槛要求
corrected onstm=on STM[[TM in env TM[threshidx]for TM in on STM]]
#以实际时间(秒)和样品ID号为单位打印
打印(纠正启动/服务请求)
打印(correctedonstm*sr开始)
fg=plt.figure(figsize=[12,8])
#打印波形以及叠加在红色上的开始时间
ax1=fg.add_subplot(2,1,1)
ax1.plot(idx start,y)
对于在correctedonstm*sr启动中的ii:
ax1.axvline(ii,color=r )
ax1.set_ylabel(Amplitude ,fontsize=16)
#用红色打印RMSE和叠加的发病时间
ax2=fg.add_subplot(2,1,2,sharex=ax1)
ax2.plot(envtm*sr start,rmse)
对于在correctedonstm*sr启动中的ii:
ax2.axvline(ii,color=r )
#绘制叠加为黑色jddzc线的阈值
ax2.axhline(threshold,linestyle=:,color=k )
ax2.set_ylabel(RMSE ,fontsize=16)
ax2.set_xlabel(样本号,fontsize=16)
fg.show()
打印输出如下:
在[1]中:%run rosatest
[ 0.17124717 1.88952381 3.74712018 5.62793651]
[ 3776.41664.82624.124096.]
它生成的图如下:
郑重声明:本文由网友发布,不代表盛行IT的观点,版权归原作者所有,仅为传播更多信息之目的,如有侵权请联系,我们将第一时间修改或删除,多谢。