语音特征公式与python实现

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

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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=0}^{N/2}Y_n(l)} pn(k)=EnY

<think>首先,用户的问题是关于使用Python实现实时语音识别的。我需要参考提供的引用内容,但用户说这些引用仅供参考,不是真正的需求,所以我应该基于用户的问题来回答。 用户的问题是:“我想使用Python实现语音识别功能 请问Python 实现 实时 语音识别” 关键点是:Python、实时语音识别。 从引用中,我可以提取一些有用的信息: - 引用[2]提到使用SpeechRecognition库进行语音识别。 - 引用[3]和[5]讨论了实时语音识别,特别是引用[5]提供了代码示例,使用while循环实现持续识别。 - 引用[5]的代码:使用speech_recognition库,在循环中监听麦克风并识别语音。 系统指令要求: - 所有行内数学表达式用$...$格式。但在语音识别上下文中,可能没有数学表达式,所以可能不需要。 - 独立公式用$$...$$格式,但同样,这里可能不适用。 - LaTeX语法正确。 - 使用中文回答。 - 生成相关问题。 - 回答中引用的段落末尾自然地添加引用标识,例如[^1]。 - 回答结构清晰,帮助用户逐步解决问题。 - 尽量保证回答真实可靠。 回答结构: 1. **介绍主题**:简要介绍Python实现实时语音识别。 2. **步骤指南**:逐步解释如何实现,包括安装库、写代码。 3. **代码示例**:提供一个实时语音识别的代码示例。 4. **注意事项**:讨论可能的问题,如准确性、性能。 5. **生成相关问题**:在结尾添加相关问题。 生成相关问题:基于主题,生成几个相关问题,如§§相关问题§§。 参考引用: - 引用[2]:使用SpeechRecognition库。 - 引用[3]:实时语音识别的精度和速度问题。 - 引用[5]:代码示例。 在回答中,如果引用这些内容,添加引用标识。 现在,构建回答: 1. **介绍**:Python实现实时语音识别通常使用SpeechRecognition库,它支持多种语音识别引擎,如Google Speech Recognition。 2. **步骤**: - 安装所需库:pip install SpeechRecognition pyaudio(用于麦克风输入)。 - 写代码:使用while循环持续监听麦克风并识别。 3. **代码示例**:提供类似引用[5]的代码,但要确保它是正确的。引用[5]的代码是: ```python import speech_recognition as sr import logging logging.basicConfig(level=logging.DEBUG) while True: r = sr.Recognizer() mic = sr.Microphone() logging.info('message enter') with mic as source: r.adjust_for_ambient_noise(source) audio = r.listen(source) logging.info('message end and recognize') test = r.recognize_google(audio, language='cmn-Hans-CN', show_all=True) print(test) logging.info('end') ``` 这个代码应该工作,但可以优化一下,比如减少在循环中创建Recognizer和Microphone对象,以提高效率。 改进版:在循环外创建Recognizer和Microphone对象。 4. **注意事项**:实时语音识别的准确性受噪音影响,速度取决于计算机性能和网络(如果使用在线引擎)。 5. **相关问题**:生成几个相关问题。 最后,确保使用中文。</think>### Python 实现实时语音识别指南 实时语音识别是指系统能够持续监听麦克风输入,并即时将语音转换为文本,无需用户手动分段。Python 提供了强大的库来实现这一功能,其中 `SpeechRecognition` 库是最常用的工具之一。它支持多种语音识别引擎(如 Google Speech Recognition),并易于集成。下面我将一步步指导你如何实现实时语音识别,确保回答真实可靠,基于实际开发经验[^2][^5]。 #### 步骤 1: 安装所需库 首先,确保安装必要的 Python 库。`SpeechRecognition` 用于语音识别,`PyAudio` 用于麦克风输入。在终端运行以下命令: ```bash pip install SpeechRecognition PyAudio ``` 如果安装 `PyAudio` 遇到问题(常见于 Windows),可尝试安装预编译版本,如 `pip install pipwin` 然后 `pipwin install PyAudio`[^2][^5]。 #### 步骤 2: 编写实时语音识别代码 实时识别的核心是使用一个无限循环(`while True`)持续监听麦克风。以下是一个优化后的代码示例,减少了资源开销(如避免在循环内重复创建对象): ```python import speech_recognition as sr import logging # 设置日志记录(可选) logging.basicConfig(level=logging.INFO) def real_time_speech_recognition(): # 初始化识别器和麦克风(只创建一次) recognizer = sr.Recognizer() microphone = sr.Microphone() # 调整环境噪音(只执行一次) with microphone as source: recognizer.adjust_for_ambient_noise(source) logging.info("环境噪音校准完成,开始监听...") # 实时识别循环 while True: try: with microphone as source: logging.info("请说话...") audio = recognizer.listen(source, timeout=5) # 设置超时,避免无限等待 text = recognizer.recognize_google(audio, language="cmn-Hans-CN") # 使用Google引擎,中文识别 print(f"识别结果: {text}") except sr.WaitTimeoutError: logging.warning("未检测到语音输入,继续监听...") except sr.UnknownValueError: logging.error("无法识别语音,请重试") except Exception as e: logging.error(f"发生错误: {e}") break if __name__ == "__main__": real_time_speech_recognition() ``` #### 代码说明 - **核心逻辑**:`while True` 循环持续监听麦克风,`recognizer.listen()` 捕获音频,`recognize_google()` 将语音转换为文本。 - **优化点**: - 在循环外初始化 `Recognizer` 和 `Microphone`,减少资源消耗[^5]。 - 添加异常处理(如超时或识别失败),提高鲁棒性。 - 设置 `timeout=5` 避免无语音时卡死。 - **语言支持**:`language="cmn-Hans-CN"` 指定中文识别,可替换为其他语言(如 `en-US`)。 - **性能考虑**:实时识别依赖于网络(Google 引擎需联网)和计算机性能。性能较差的设备可能延迟较高[^3]。 #### 注意事项 1. **准确性噪音**:环境噪音会影响识别精度。使用 `adjust_for_ambient_noise()` 校准可改善效果,但高噪音环境下结果可能不理想[^4]。 2. **网络依赖**:`recognize_google()` 需要互联网连接。如需离线方案,可考虑 `pocketsphinx` 引擎(但精度较低)。 3. **实时性调整**:如果识别延迟高,尝试减少音频采样率或使用本地引擎。引用中提到,在老旧计算机上可能表现不佳[^3]。 4. **隐私合规**:使用在线引擎时,确保遵守数据隐私政策(如 GDPR)。 #### 实际应用案例 - **智能助手**:集成到聊天机器人中,实现语音交互。 - **实时字幕**:为视频会议生成实时字幕。 - **无障碍工具**:帮助听障人士转换语音为文本。 通过以上步骤,你可以快速实现 Python 实时语音识别。如需进一步优化,参考官方文档或社区资源[^2][^5]。
评论 37
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值