Python 中的音调检测
Pitch detection in Python
我正在研究的程序的概念是一个 Python 模块,它检测某些频率(人类语音频率 80-300hz)并通过检查数据库显示句子的语调。我使用 SciPy 来绘制声音文件的频率,但我无法设置任何特定频率来分析音高。我该怎么做?
更多信息:我希望能够在语音中设置定义的模式(例如上升、下降),并且程序会检测声音文件是否遵循特定模式。
您可以尝试以下方法。我相信你知道人声也有超过 300 赫兹的谐波。不过,您可以在音频文件中移动 window,并尝试查看最大功率(如下所示)或 window 中的一组频率的变化。下面的代码是为了给出直觉:
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。检查
https://pypi.org/project/crepe/
2015 年的答案。音调检测是一个复杂的问题,最新的 Google 包为这项重要任务提供了高度智能的解决方案:
https://github.com/google/REAPER
如果您想从 Python 访问它,您可以将其包装在 Python 中。
f0(音高)估计基本上有两种类:时域(例如autocorrelation/cross-correlation)和频域(例如通过测量谐波之间的距离来识别基频,或识别频谱中具有最大功率的频率,如上面 Sahil M 的示例所示)。
多年来,我成功地使用了 RAPT(Robust Algorithm for Pitch Tracking),它是 REAPER 的前身,也是 David Talkin 的。您提到的广泛使用的 Praat 软件还包括类似 RAPT 的互相关算法选项。描述和代码在网络上很容易获得。此处提供 DEB 安装存档:http://www.phon.ox.ac.uk/releases
使用俯仰函数的模式检测(上升、下降等)是一个单独的问题。 Sahil M 上面关于使用移动 window 跨越音调函数的建议是一个很好的开始方式。
有许多不同的算法来估计音高,但一项研究发现 Praat 的算法是最准确的 [1]。最近,Parselmouth 库使得从 Python [2].
调用 Praat 函数变得容易多了
[1]:Strömbergsson,索非亚。 "Today's Most Frequently Used F0 Estimation Methods, and Their Accuracy in Estimating Male and Female Pitch in Clean Speech." 对话。 2016. https://pdfs.semanticscholar.org/ff04/0316f44eab5c0497cec280bfb1fd0e7c0e85.pdf
我正在研究的程序的概念是一个 Python 模块,它检测某些频率(人类语音频率 80-300hz)并通过检查数据库显示句子的语调。我使用 SciPy 来绘制声音文件的频率,但我无法设置任何特定频率来分析音高。我该怎么做?
更多信息:我希望能够在语音中设置定义的模式(例如上升、下降),并且程序会检测声音文件是否遵循特定模式。
您可以尝试以下方法。我相信你知道人声也有超过 300 赫兹的谐波。不过,您可以在音频文件中移动 window,并尝试查看最大功率(如下所示)或 window 中的一组频率的变化。下面的代码是为了给出直觉:
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。检查
https://pypi.org/project/crepe/
2015 年的答案。音调检测是一个复杂的问题,最新的 Google 包为这项重要任务提供了高度智能的解决方案:
https://github.com/google/REAPER
如果您想从 Python 访问它,您可以将其包装在 Python 中。
f0(音高)估计基本上有两种类:时域(例如autocorrelation/cross-correlation)和频域(例如通过测量谐波之间的距离来识别基频,或识别频谱中具有最大功率的频率,如上面 Sahil M 的示例所示)。 多年来,我成功地使用了 RAPT(Robust Algorithm for Pitch Tracking),它是 REAPER 的前身,也是 David Talkin 的。您提到的广泛使用的 Praat 软件还包括类似 RAPT 的互相关算法选项。描述和代码在网络上很容易获得。此处提供 DEB 安装存档:http://www.phon.ox.ac.uk/releases 使用俯仰函数的模式检测(上升、下降等)是一个单独的问题。 Sahil M 上面关于使用移动 window 跨越音调函数的建议是一个很好的开始方式。
有许多不同的算法来估计音高,但一项研究发现 Praat 的算法是最准确的 [1]。最近,Parselmouth 库使得从 Python [2].
调用 Praat 函数变得容易多了[1]:Strömbergsson,索非亚。 "Today's Most Frequently Used F0 Estimation Methods, and Their Accuracy in Estimating Male and Female Pitch in Clean Speech." 对话。 2016. https://pdfs.semanticscholar.org/ff04/0316f44eab5c0497cec280bfb1fd0e7c0e85.pdf