对于一个经过分帧、加窗处理后的长度为N音频序列,其短时能量可以定义为
有时候也用短时能量幅值来代替短时能量
短时能量/短时能量幅值用途:语音检测(有语音时,能量大,无语音时,能量小),清浊音分类(浊音的短时能量普遍大于清音)
相关代码如下
import soundfile as sf
import matplotlib.pyplot as plt
import numpy as np
y, sr = sf.read('q1.wav')
# 为演示方便,采用无重叠分帧
frame_size = 160
num_frames = len(y) // frame_size
energy_p = np.zeros(num_frames)
energy_a = np.zeros(num_frames)
for index in range(0, num_frames):
energy_p[index] = np.cumsum(y[index * frame_size:(index+1) * frame_size] ** 2)[-1]
energy_a[index] = np.cumsum(np.abs(y[index*frame_size:(index + 1) * frame_size]))[-1]
time = np.arange(0, frame_size * num_frames) * (1 / sr)
plt.subplot(211)
plt.plot(time, y[: frame_size * num_frames])
plt.ylabel('Amplitude')
plt.subplot(212)
plt.plot(time, np.repeat(energy_p, frame_size))
plt.show()
相应的语音波形以及对应的短时能量波形如下图所示。
https://mp.weixin.qq.com/s/0jKryrA7kQgm3WJzOCGxZA