gpt4 book ai didi

python - aubio 可以用来检测仅节奏片段吗?

转载 作者:行者123 更新时间:2023-12-01 07:00:10 31 4
gpt4 key购买 nike

aubio 是否有办法检测一段音频中缺少音调元素(仅节奏)的部分?我测试了一段开头有 16 秒节奏的音乐,但所有 aubiopitch 和 aubiotes 算法似乎都能检测到节奏部分的音调。是否可以通过某种方式对其进行调整以区分音调和非音调开始?或者有相关的库可以做到这一点吗?

最佳答案

过去几天很忙 - 但今天开始研究这个......

我想这需要一段时间才能完善,但我想我应该给你一些想法和一些我已经开始研究的代码来解决这个问题!

首先,伪代码是设计初始方法的好方法。

1/使用import matplotlib.pyplot as plt对音频进行频谱分析,并绘制各种fft和音频信号。

2/import numpy as np 用于基本的类似数组的结构处理。

(我知道这不仅仅是伪代码,但是嘿:-)

3/plt.specgram 创建音频的频谱图。除了它创建的图像(可用于开始手动解构音频文件)之外,它还返回 4 个结构。

例如

ffts,频率,时间,img = plt.specgram(signal,Fs=44100)

ffts 是一个二维数组,其中列是时间部分(行)的 ffts(快速傅立叶变换)。

普通的specgram分析256个样本长的时间部分,每次向前步进128个样本。

这以相当快的速度提供了非常低分辨率的频率阵列。

当以大约 10 Hz 的频率播放时,音符会合并成一个声音,因此我决定使用 specgram 选项将音频分为 4096 个样本长度(约 10 Hz),每个样本长度向前步进一次2048 个样本(即每秒 20 次)。

这提供了不错的频率分辨率,并且间隔 20 秒的时间部分比人们感知单个音符的速度要快。

这意味着按如下方式调用specgram:

plt.specgram(signal,Fs=44100,NFFT=4096,noverlap=2048,mode='magnitude')

(注意模式 - 这似乎给了我 0 - 0.1 之间的幅度:我有一个问题 fft 没有给我与音频信号相同比例的幅度(你可能已经看到我发布的问题)。但是我们在这里......

4/接下来我决定消除返回的 ffts 中的噪音。这意味着我们可以专注于适当幅度的频率,并将ffts中始终存在的噪声归零(根据我的经验)。

这是我的功能:

def gate(signal,minAmplitude):
return np.array([int((((a-minAmplitude)+abs(a-minAmplitude))/2) > 0) * a for a in signal])

看起来有点疯狂 - 我确信一个合适的数学家可以想出更有效的东西 - 但这是我能发明的最好的。它将任何幅度小于 minAmplitude 的频率归零。

这是从 plt.specgram 返回的 ffts 调用它的相关代码,如下所示,我的函数更复杂,因为它是类的一部分,并且还有它引用的其他函数 - 但这应该足够了:

def fft_noise_gate(minAmplitude=0.001,check=True):
'''
zero the amplitudes of frequencies
with amplitudes below minAmplitude
across self.ffts
check - plot middle fft just because!
'''
nffts = ffts.shape[1]
gated_ffts = []
for f in range(nffts):
fft = ffts[...,f]
# Anyone got a more efficient noise gate formula? Best I could think up!
fft_gated = gate(fft,minAmplitude)
gated_ffts.append(fft_gated)
ffts = np.array(gated_ffts)
if check:
# plot middle fft just to see!
plt.plot(ffts[int(nffts/2)])
plt.show(block=False)
return ffts

这应该给你一个开始,我仍在努力,当我有进一步的进展时会回复你 - 但如果你有任何想法,请分享。

无论如何,我的策略是:

1/找到峰值(即任何声音的开始)2/寻找同步上升和下降的频率范围(即组成声音)。

还有

3/将它们区分为单独的乐器(更具体地说是声源),并绘制其时间和幅度以创建您的分析(分数)。

希望您能从中获得乐趣 - 我知道我是这样。

正如我所说的任何想法......

问候

托尼

关于python - aubio 可以用来检测仅节奏片段吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58675412/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com