利用python分析语音信号基音频率曲线代码
时间: 2023-07-22 08:12:13 浏览: 77
以下是一个简单的Python代码,可以实现对语音信号的基音频率曲线进行分析和绘制:
```python
import numpy as np
import matplotlib.pyplot as plt
import librosa
# 读取语音信号文件
y, sr = librosa.load('speech.wav', sr=None)
# 预处理语音信号
pre_emphasis = 0.97
emphasized_signal = np.append(y[0], y[1:] - pre_emphasis * y[:-1])
# 分帧
frame_size = 0.025 # 每一帧的大小,单位为秒
frame_stride = 0.01 # 相邻帧之间的距离,单位为秒
frame_length, frame_step = frame_size * sr, frame_stride * sr
signal_length = len(emphasized_signal)
num_frames = int(np.ceil(float(np.abs(signal_length - frame_length)) / frame_step))
# 对每一帧进行基音周期的提取
pitches = []
for i in range(num_frames):
# 计算当前帧的起始和终止位置
start = int(i * frame_step)
end = int(min(i * frame_step + frame_length, signal_length))
frame = emphasized_signal[start:end]
# 计算自相关函数
autocorr = np.correlate(frame, frame, mode='full')
autocorr = autocorr[len(autocorr) // 2:]
# 基于互相关函数的算法
diff = np.diff(autocorr)
start = np.argmax(diff > 0)
peak = np.argmax(autocorr[start:]) + start
pitches.append(float(sr) / peak)
# 绘制基音频率曲线
plt.plot(pitches)
plt.xlabel('Frame Number')
plt.ylabel('Pitch (Hz)')
plt.show()
```
需要注意的是,上述代码中使用了预加重、自相关函数和基于互相关函数的算法来进行基音周期的提取,这些算法都有其优缺点,实际应用时需要根据具体情况进行选择。同时,由于语音信号中的噪声和变化很大,基音频率曲线的分析结果也可能存在误差和不稳定性,需要进行合理的后续处理和校正。
相关推荐
![zip](https://img-home.csdnimg.cn/images/20210720083736.png)
![rar](https://img-home.csdnimg.cn/images/20210720083606.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)