Python中的基音检测

Python中的基音检测,python,signal-processing,speech-recognition,speech-to-text,speech,Python,Signal Processing,Speech Recognition,Speech To Text,Speech,我正在研究的程序的概念是一个Python模块,它检测特定频率(人类语音频率80-300hz),并通过从数据库中检查来显示句子的语调。我使用SciPy来绘制声音文件的频率,但我不能设置任何特定的频率来分析音高。我该怎么做 更多信息:我希望能够在语音中设置一个定义的模式(例如上升、下降),程序会检测声音文件是否遵循特定的模式。您可以尝试以下方法。我相信你知道,人类的声音也有超过300赫兹的谐波。不过,您可以在音频文件中移动一个窗口,并尝试查看最大功率(如下所示)或窗口中一组频率的变化。以下代码用于给

我正在研究的程序的概念是一个Python模块,它检测特定频率(人类语音频率80-300hz),并通过从数据库中检查来显示句子的语调。我使用SciPy来绘制声音文件的频率,但我不能设置任何特定的频率来分析音高。我该怎么做


更多信息:我希望能够在语音中设置一个定义的模式(例如上升、下降),程序会检测声音文件是否遵循特定的模式。

您可以尝试以下方法。我相信你知道,人类的声音也有超过300赫兹的谐波。不过,您可以在音频文件中移动一个窗口,并尝试查看最大功率(如下所示)或窗口中一组频率的变化。以下代码用于给出直觉:

import scipy.fftpack as sf
import numpy as np
def maxFrequency(X, F_sample, Low_cutoff=80, High_cutoff= 300):
        """ Searching presence of frequencies on a real signal using FFT
        Inputs
        =======
        X: 1-D numpy array, the real time domain audio signal (single channel time series)
        Low_cutoff: float, frequency components below this frequency will not pass the filter (physical frequency in unit of Hz)
        High_cutoff: float, frequency components above this frequency will not pass the filter (physical frequency in unit of Hz)
        F_sample: float, the sampling frequency of the signal (physical frequency in unit of Hz)
        """        

        M = X.size # let M be the length of the time series
        Spectrum = sf.rfft(X, n=M) 
        [Low_cutoff, High_cutoff, F_sample] = map(float, [Low_cutoff, High_cutoff, F_sample])

        #Convert cutoff frequencies into points on spectrum
        [Low_point, High_point] = map(lambda F: F/F_sample * M, [Low_cutoff, High_cutoff])

        maximumFrequency = np.where(Spectrum == np.max(Spectrum[Low_point : High_point])) # Calculating which frequency has max power.

        return maximumFrequency

voiceVector = []
for window in fullAudio: # Run a window of appropriate length across the audio file
    voiceVector.append (maxFrequency( window, samplingRate))

现在,根据声音的语调,最大功率频率可能会移动,您可以将其注册并映射到给定语调。这不一定总是正确的,你可能需要同时监测很多频率的变化,但这应该让你开始。

2019年更新,现在有基于神经网络的非常精确的音调跟踪器。而且它们是用Python开箱即用的。检查

2015年的答案。音调检测是一个复杂的问题,谷歌最新的软件包为这项非平凡的任务提供了高度智能的解决方案:


如果您想从Python访问它,可以用Python将其包装起来。

基本上有两类f0(基音)估计:时域(例如,具有自相关/互相关)和频域(例如,通过测量谐波之间的距离来识别基频,或识别具有最大功率的频谱中的频率,如Sahil M在上述示例中所示)。 多年来,我成功地使用了RAPT(用于基音跟踪的鲁棒算法),也是David Talkin提出的REAPER的前身。您提到的广泛使用的Praat软件还包括一个类似RAPT的互相关算法选项。说明和代码可在web上随时获得。DEB安装档案可在以下位置获得:
使用基音函数进行模式检测(上升、下降等)是一个单独的问题。Sahil M提出的在基音函数中使用移动窗口的建议是一个很好的开始。

有许多不同的算法来估计基音,但一项研究发现Praat的算法是最准确的[1].最近,该库使从Python调用Praat函数变得更加容易[2]

[1] :Strömbergsson,Sofia.“当今最常用的F0估计方法,以及它们在干净演讲中估计男性和女性音调的准确性。”INTERSPEECH.2016


[2] :

你说不能按顺序设置频率是什么意思?你能详细描述一下你现在正在做什么吗?我想使用Scipy(或者其他库)来响应特定频率(人类语音),以便它可以指示音调(请参阅PRAAT软件).通过这样做,我希望我的程序能够指示句子中的语调(虽然它不能那么准确,但足以用于语言学研究)@SahilMI不确定我是否理解正确,这段代码是否使用了Scipy?我已经输入了要导入的模块,它使用了Scipy fftpack和numpy。Pitch与最大功率无关。Shimyrev如何将其包装到python中?