我想实现一个相似的歌唱评分功能来确定两个音频的相似性,但我不知道如何简单的实现,看了很多github项目,更多的提到是simhash,但我觉得类似的音频可能不是很好,所以在这里征求意见。
发布于 2022-09-14 10:58:37
一种方法是使用自相关来查找音频段中存在的频率。
这方面有许多实现。例如:鱼腥草、枕叶、矮胖等。
这是一个非常松散和草率的实现,可以让您了解没有libs的算法:
import matplotlib.pyplot as plt
import math
'''
create a test signal
'''
sr = 44100 #hz
freq = 200 #hz
duration = 0.1 #sec
signal = [math.sin(x * (math.pi * 2 * freq) * (1 / sr)) for x in range(0, int(sr * duration))]
'''
compute the auto correlation at a given frequency
'''
def auto_correlation(signal, freq, sr):
sample_delay = int (sr / freq)
score = 0
for i in range(0, len(signal) - sample_delay):
score += signal[i] * signal[i + sample_delay]
return score / len(signal)
'''
iterate over frequency spectrum and test the autocorrelation
'''
start_freq = 150
end_freq = 1000
scores = []
for freq in range(start_freq, end_freq):
scores.append(auto_correlation(signal, freq, sr))
max_index = scores.index(max(scores))
print("estimated frequency : {} hz".format(max_index + start_freq))
plt.ylabel("correlation")
plt.xlabel("frequency Hz")
plt.plot([x + start_freq for x in range(len(scores))], scores)

然后,您可以迭代通过音频文件,测试段的主导频率和比较分数。
另一种可能是通过计算音频文件的FFT来实现这一点,并对它们进行比较。如果您在python领域,librosa是一个很好的库。
https://stackoverflow.com/questions/73700345
复制相似问题