语音特征公式与python实现

本文介绍了语音特征的计算,包括过零率、能量、振幅扰动度、声强/响度、基频及其频率抖动度、谐噪比、共振峰、能量熵、频谱质心、频谱延展度、谱熵、频谱通量、频谱滚降点和梅尔倒谱系数。详细探讨了各种特征的数学公式及Python实现,涉及pyAudioAnalysis、openSmile等工具。
摘要由CSDN通过智能技术生成

1.过零率

zero crossing rate
每帧信号内,信号过零点的次数,体现的是频率特性。
Z n = 1 2 ∑ m = 0 N − 1 ∣ s g n [ x n ( m ) ] − s g n [ x n ( m − 1 ) ] ∣ Z_n = \frac{1}{2}\sum_{m=0}^{N-1}|sgn[x_n(m)]-sgn[x_n(m-1)]| Zn=21m=0N1sgn[xn(m)]sgn[xn(m1)]

import numpy as np
def stZCR(frame):
   # computing zero crossing rate
   count = len(frame)
   count_z = np.sum(np.abs(np.diff(np.sign(frame)))) / 2
   return (np.float64(count_z) / np.float64(count - 1))

2.能量

energy
短时能量,即每帧信号的平方和,体现的是信号能量的强弱
E n = ∑ m = 0 N − 1 x n 2 ( m ) E_n = \sum_{m=0}^{N-1}x_n^2(m) En=m=0N1xn2(m)

import numpy as np
def stEnergy(frame):
   return (np.sum(frame ** 2) / np.float64(len(frame)))

2.1 振幅扰动度-分贝形式

shimmer in DB
S h i m m e r ( d B ) = 1 N − 1 ∑ i = 1 N − − 1 ∣ 20 l o g ( A i + 1 / A i ) ∣ Shimmer(dB) = {\frac{1}{N-1}}\sum_{i=1}^{N--1}|20log(A_{i+1}/A_i)| Shimmer(dB)=N11i=1N120log(Ai+1/Ai)

import numpy as np
def stShimmerDB(frame):
    '''
     amplitude shimmer 振幅扰动度
     expressed as variability of the peak-to-peak amplitude in decibels 分贝
     [3]
    '''
    count = len(frame)
    sigma = 0
    for i in range(count):
        if i == count - 1:
            break
        sigma += np.abs(20 * (np.log10(np.abs(frame[i + 1] / (frame[i] + eps)))))
    return np.float64(sigma) / np.float64(count - 1)

2.2 振幅扰动度-百分数形式

S h i m m e r ( r e l a t i v e ) = 1 N − 1 ∑ N − 1 i = 1 ∣ A i − A i + 1 ∣ 1 N ∑ i = 1 N A i Shimmer(relative) = \frac{\frac{1}{N-1}\sum_{N-1}^{i=1}|A_i-A_{i+1}|}{\frac{1}{N}\sum_{i=1}^{N}A_i} Shimmer(relative)=N1i=1NAiN11N1i=1AiAi+1

def stShimmerRelative(frame):
    '''
    shimmer relative is defined as average absolute difference between the amplitude
    of consecutive periods divided by the average amplitude, expressed as percentage
    [3]
    '''
    count = len(frame)
    sigma_diff = 0
    sigma_sum = 0
    for i in range(count):
        if i < count - 1:
            sigma_diff += np.abs(np.abs(frame[i]) - np.abs(frame[i + 1]))
        sigma_sum += np.abs(frame[i])
    return np.float64(sigma_diff / (count - 1)) / np.float64(sigma_sum / count + eps)

3. 声强/响度

intensity / loudness

  • intensity: mean of squared input values multiplied by a Hamming window
    声强和响度是对应的概念,参考openSmile程序
    i n t e n s i t y = ∑ m = 0 N − 1 h a m W i n [ m ] ∗ x n 2 ( m ) ∑ m = 0 N − 1 h a m W i n [ m ] intensity = \frac{\sum_{m=0}^{N-1}hamWin[m]*x_n^2(m)}{\sum_{m=0}^{N-1}hamWin[m]} intensity=m=0N1hamWin[m]m=0N1hamWin[m]xn2(m)
    l o u d n e s s = ( i n t e n s i t y I 0 0.3 ) loudness =( {\frac{intensity}{I0}}^{0.3}) loudness=(I0intensity0.3) I 0 = 1 × 1 0 − 12 I0=1\times10^{-12} I0=1×1012
###################
##
## from opensimle
##
#####################
def stIntensity(frame):
    '''
    cannot understand what differ from energy
    '''
    fn = len(frame)
    hamWin = np.hamming(fn)
    winSum = np.sum(hamWin)
    if winSum <= 0.0:
        winSum = 1.0
    I0 = 0.000001
    Im = 0
    for i in range(fn):
        Im = hamWin[i] * frame[i] ** 2
    intensity = Im/winSum
    loudness = (Im / I0) ** .3
    return intensity, loudness

4. 基频

计算基频的方法包括倒谱法、短时自相关法和线性预测法。本文采用短时自相关法
1)基音检测预处理:语音端点检测
由于语音的头部和尾部不具有周期性,因此为了提高基音检测的准确性,在基音检测时采用了端点检测。使用谱熵法进行端点检测。
语音信号时域波形为 x ( i ) x(i) x(i),加窗分帧后第 n n n帧语音信号为 x n ( m ) x_n(m) xn(m),其FFT表示为 X n ( k ) X_n(k) Xn(k) k k k表示第 k k k条谱线。该语音帧在频域中的短时能量 E n E_n En
E n = ∑ k = 0 N / 2 X n ( k ) X n ∗ ( k ) E_n = \sum_{k=0}^{N/2}X_n(k)X_n^*(k) En=k=0N/2Xn(k)Xn(k)
N N N为FFT长度,只取正频率部分
某一谱线 k k k的能量谱为 Y n ( k ) = X n ( k ) X n ( k ) ∗ Y_n(k) = X_n(k)X_n(k)^* Yn(k)=Xn(k)Xn(k),则每个频率分量的归一化谱概率密度函数定义为 p n ( k ) = Y n ( k ) E n = Y n ( k ) ∑ l = 0 N / 2 Y n ( l ) p_n(k)=\frac{Y_n(k)}{E_n}=\frac{Y_n(k)}{\sum_{l=

  • 11
    点赞
  • 50
    收藏
    觉得还不错? 一键收藏
  • 37
    评论
语音特征融合中的决策及融合算法有多种,因此这里给出一种常见的决策及融合算法——加权平均法的Python代码实现。 加权平均法将多个语音特征提取器提取的特征进行加权平均,得到最终的特征表示。具体地,设有 $n$ 个特征提取器提取的特征为 $f_1, f_2, ..., f_n$,它们的权重为 $w_1, w_2, ..., w_n$,则加权平均法的公式为: $$ f = \frac{\sum_{i=1}^n w_i f_i}{\sum_{i=1}^n w_i} $$ 下面是实现该算法的Python代码: ```python import numpy as np def weighted_average(features, weights): """ 加权平均法 :param features: 多个特征提取器提取的特征,每个特征为一个numpy数组 :param weights: 每个特征提取器的权重,为一个列表 :return: 加权平均后的特征,为一个numpy数组 """ # 计算加权平均后的特征 weighted_features = np.zeros_like(features[0]) total_weight = sum(weights) for i in range(len(features)): weighted_features += weights[i] * features[i] weighted_features /= total_weight return weighted_features ``` 使用方法: ```python # 假设有两个特征提取器提取的特征,分别为f1和f2,权重分别为w1和w2 f1 = np.array([1, 2, 3]) f2 = np.array([2, 3, 4]) weights = [0.3, 0.7] # 计算加权平均后的特征 f = weighted_average([f1, f2], weights) print(f) # 输出:[1.7 2.6 3.5] ``` 需要注意的是,加权平均法需要对不同的特征提取器进行权重的设置,这通常需要通过实验来确定最优的权重,或者使用机器学习方法来学习权重。
评论 37
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值