查看此答案:Python Scipy FFT wav files
技术部分显而易见且有效,但我有两个理论问题(下面提到的代码):
1)为什么要对帧进行归一化(b = ...
)?如果使用原始数据会发生什么?
2)为仅应使用FFT结果的一半(d = ...
)?
3)为什么应该使FFT结果 abs(c)
?
也许由于不足的WAV格式或FFT的了解,我可能会错过一些东西,但是虽然这段代码完全正常工作,但我很高兴了解它为什么起作用以及如何最好地利用它。
编辑:响应@Trilarion的评论:
我试图编写一个简单的,不是100%准确但更像是概念证明说话人分离程序,使用Python。这意味着获取一个wav文件(目前我正在使用此文件 进行测试),并在每秒钟(或任何其他分辨率)中判断说话人是第一人还是第二人。我预先知道这些是2个人,而且我不试图将它们链接到任何已知的语音签名,只是为了分离。现在取每秒,FFT它(从而获得频率列表),并使用KMeans对它们进行聚类,聚类数介于2和4之间(A,B [,静音[,A + B]])。
我还是新手,在分析wav文件和音频方面。
import matplotlib.pyplot as plt
from scipy.io import wavfile # get the api
fs, data = wavfile.read('test.wav') # load the data
a = data.T[0] # this is a two channel soundtrack, I get the first track
b=[(ele/2**8.)*2-1 for ele in a] # this is 8-bit track, b is now normalized on [-1,1)
c = sfft.fft(b) # create a list of complex number
d = len(c)/2 # you only need half of the fft list
plt.plot(abs(c[:(d-1)]),'r')
plt.show()