提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
引言
语音的实际应用场景中,经常是给定一段包含多句句子的长语音,这就产生了语音端点检测的需求,从而实现对句子的分割。端点检测可以是只检测长语音的开始和结束,也可以细化到每一句句子的开始和结束,以下示例为句子级的端点检测。
方法1
使用短时能量和谱质心特征进行端点检测,在matlab上有封装好的函数,以下为python版本。
#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @author: fan weiquan
import os
import numpy as np
import matplotlib.pyplot as plt
from scipy.io import wavfile
import librosa
import scipy.signal
def ShortTimeEnergy(signal, windowLength, step):
"""
计算短时能量
Parameters
----------
signal : 原始信号.
windowLength : 帧长.
step : 帧移.
Returns
-------
E : 每一帧的能量.
"""
signal = signal / np.max(signal) # 归一化
curPos = 0
L = len(signal)
numOfFrames = np.asarray(np.floor((L-windowLength)/step) + 1, dtype=int)
E = np.zeros((numOfFrames, 1))
for i in range(numOfFrames):
window = signal[int(curPos):int(curPos+windowLength-1)];
E[i] = (1/(windowLength)) * np.sum(np.abs(window**2));
curPos = curPos + step;
return E
def SpectralCentroid(signal,windowLength, step, fs):
"""
计算谱质心
Parameters
----------
signal : 原始信号.
windowLength : 帧长.
step : 帧移.
fs : 采样率.
Returns
-------
C : 每一帧的谱质心.
"""
signal = signal / np.max(signal) # 归一化
curPos = 0
L = len(signal)
numOfFrames = np.asarray(np.floor((L - windowLength) / step) + 1, dtype=int)
H = np.hamming(windowLength)
m = ((fs / (2 * windowLength)) * np.arange(1, windowLength, 1)).T
C = np.zeros((numOfFrames, 1))
for i in range(numOfFrames):
window = H * (signal[int(curPos) : int(curPos + windowLength)])
FFT = np.abs(np.fft.fft(window, 2 * int(windowLength)))
FFT = FFT[1 : windowLength]
FFT = FFT / np.max(FFT)
C[i] = np.sum(m * FFT) / np.sum(FFT)
if np.sum(window**2) < 0.010:
C[i] = 0.0
curPos = curPos + step;
C = C /

本文介绍了两种端点检测方法:一是使用短时能量和谱质心特征,二是借助webrtcvad进行逐帧静音判断。两种方法在实际应用中的优缺点及在嘈杂环境中的优化策略被详细讨论。
最低0.47元/天 解锁文章
3917

被折叠的 条评论
为什么被折叠?



