Python 语音识别系列-实战学习-语音识别特征提取

news2024/11/26 23:45:27

Python 语音识别系列-实战学习-语音识别特征提取

  • 前言
    • 1.预加重、分帧和加窗
    • 2.提取特征
    • 3.可视化特征
    • 4.总结

前言

语音识别特征提取是语音处理中的一个重要环节,其主要任务是将连续的时域语音信号转换为连续的特征向量,以便于后续的语音识别和语音处理任务。在特征提取阶段,这些特征向量能够捕捉到语音信号中的关键信息,如音调、音色和音节等。

特征提取主要可以分为以下几个方面:

  • 时域特征提取:包括自相关函数、方差、峰值等。
  • 频域特征提取:如傅里叶变换、快速傅里叶变换、波束傅里叶变换等。
  • 时频域特征提取:包括短时傅里叶变换、波形分解、时频图等。
  • 高级特征提取:涉及语言模型、语音模型、语音合成等。

在具体实践中,语音特征提取的方法和技术,如:

  1. 梅尔频率倒谱系数 (MFCC):这是最常用的特征提取方法之一。它通过将音频信号的频率变换为梅尔尺度,来模拟人类耳朵的听觉特性。
  2. 滤波器组的Fbank特征(Filter bank)/MFSC:Fbank特征的提取方式相当于MFCC去掉最后一步的离散余弦变换。与MFCC特征相比,Fbank特征保留了更多的原始语音数据。
  3. 线性预测分析(LPC):假设系统的传递函数与全极点的数字滤波器相似,通过计算语音信号的采样值和线性预测的采样值,并最小化两者之间的均方误差(MSE),从而得到LPC特征。
  4. 感知线性预测系数(PLP):这是一种基于听觉模型的特征参数,等效于LPC特征,但它是基于人耳听觉的,通过计算应用到频谱分析中,将输入语音信号经过人耳听觉模型处理,有利于抗噪声语音特征的提取。

这些特征通常会被用于构建机器学习模型,如隐马尔可夫模型 (HMM)、深度神经网络 (DNN) 等,以进行更精准的语音识别。在实际应用中,可能会结合多种特征提取技术来优化识别效果。

在进行语音识别的特征处理前,对原始音频数据进行一系列预处理步骤是非常重要的,这些步骤有助于提高最终识别系统的准确性和鲁棒性。以下是一些在特征提取之前常见的音频预处理技术

  1. 预加重: 预加重是一个高通滤波过程,用于放大高频成分。这有助于平衡音频信号中由于声带和嘴唇效应造成的频率衰减。
  2. 分帧和加窗: 由于语音信号是非平稳的,通过将长的音频信号分割成短时帧,可以近似地认为每个短时帧是平稳的。每帧通常包括20到40毫秒的音频。为了减少相邻帧之间的边界效应,会对每帧使用窗函数(如汉明窗或汉宁窗)。
  3. 去噪: 去噪旨在减少背景噪声,提高语音信号的清晰度。常用的方法包括频谱减法、Wiener滤波器、深度学习方法等。对于实时或近实时的应用,非因果性去噪方法(如使用预先录制的噪声模型)可能更为有效。
  4. 归一化: 音频信号的归一化(如均值归零和方差归一化)有助于减少不同录音条件下的变异,使特征提取更加稳定。

1.预加重、分帧和加窗

import numpy as np
import librosa

def pre_emphasis(signal, alpha=0.97):
    """
    对给定的音频信号应用预加重。
    预加重可以增强信号的高频部分,常用于语音处理中。
    参数:
    - signal: 原始音频信号数组
    - alpha: 预加重系数,通常介于0.95到0.97之间
    返回:
    - 预加重后的音频信号
    """
    return np.append(signal[0], signal[1:] - alpha * signal[:-1])

def frame_signal(signal, frame_size, hop_size, sample_rate):
    """
    将音频信号分割成多个帧。
    参数:
    - signal: 预加重后的音频信号
    - frame_size: 帧大小,以秒为单位
    - hop_size: 帧之间的跳跃大小,以秒为单位
    - sample_rate: 音频的采样率
    返回:
    - 分帧后的音频数据
    """
    frame_length = int(frame_size * sample_rate)
    hop_length = int(hop_size * sample_rate)
    return librosa.util.frame(signal, frame_length=frame_length, hop_length=hop_length)

def apply_window(frames, frame_size, sample_rate, window_type='hamming'):
    """
    对每帧音频数据应用窗函数。
    窗函数有助于减少边界效应,提高频谱分析的质量。
    参数:
    - frames: 分帧后的音频数据
    - frame_size: 帧大小,以秒为单位
    - sample_rate: 音频的采样率
    - window_type: 使用的窗函数类型,例如'hamming', 'hanning'
    返回:
    - 加窗后的帧
    """
    frame_length = int(frame_size * sample_rate)
    if window_type == 'hamming':
        window = np.hamming(frame_length)
    elif window_type == 'hanning':
        window = np.hanning(frame_length)
    else:
        window = np.ones(frame_length)  # 矩形窗
    return frames * window[:, np.newaxis]

# 示例使用
audio_file = '跑步.wav'
signal, sr = librosa.load(audio_file, sr=None)  # 加载音频文件

# 预加重
pre_emphasized_signal = pre_emphasis(signal)

# 分帧
frames = frame_signal(pre_emphasized_signal, 0.025, 0.01, sr)  # 设定帧大小为25毫秒,帧间隔为10毫秒

# 加窗
windowed_frames = apply_window(frames, 0.025, sr)

print("加工处理后的帧形状:", windowed_frames.shape)

在这段代码中:
首先对原始音频信号进行预加重处理,这有助于后续处理中更好地提取高频特征。
然后将音频信号分割成短时帧,每帧25毫秒长,帧与帧之间的间隔为10毫秒。
最后,对每个帧应用汉明窗函数,以减少边界处的信号不连续性,改善频谱分析的效果。

也可以用 librosa.effects.preemphasis 来进行预加重 :

import numpy as np
import librosa
import librosa.display
from matplotlib import pyplot as plt

audio_file = '跑步.wav'
audio, s_r = librosa.load(audio_file, sr=16000)

print(audio.shape, '|', s_r)
signal = librosa.effects.preemphasis(audio)  # 进行预加重 

plt.figure(dpi=200)
plt.subplot(211)
plt.title( "orignal_wav")
plt.tight_layout()
librosa.display.waveshow(audio, sr=s_r)

plt.subplot(212)
plt.title( "after_emphasis")
plt.tight_layout()
librosa.display.waveshow(signal, sr=s_r,color='r')

在这里插入图片描述

2.提取特征

要在音频特征提取过程中加入语音去噪等预处理步骤,可以使用noisereduce库对音频信号进行去噪处理。这有助于提高后续特征提取的准确性和效果。需要安装noisereduce库:pip install noisereduce

需将audio_path变量替换为你的音频文件的实际路径。这段代码将输出两种特征的尺寸,验证特征是否正确提取。

import librosa
import numpy as np
import noisereduce as nr

def extract_features(audio_path):
    # 加载音频文件
    signal, sample_rate = librosa.load(audio_path, sr=None)  # 使用原始采样率

    # 去噪处理
    noise_clip = signal[0:int(0.5 * sample_rate)]  # 假设前0.5秒为噪声部分
    reduced_noise_signal = nr.reduce_noise(audio_clip=signal, noise_clip=noise_clip, verbose=False)

    # 提取MFCC特征
    mfccs = librosa.feature.mfcc(y=reduced_noise_signal, sr=sample_rate, n_mfcc=13)

    # 提取Filterbank特征
    fbank = librosa.feature.melspectrogram(y=reduced_noise_signal, sr=sample_rate, n_mels=40)
    fbank = librosa.power_to_db(fbank)

    return mfccs, fbank

# 使用示例
audio_path = '跑步.wav'
mfccs, fbank = extract_features(audio_path)

print("MFCCs:", mfccs.shape)
print("Filterbank Features:", fbank.shape)

代码解释:

  1. 加载音频文件:librosa.load函数用来加载音频文件。sr=None参数确保使用音频文件的原始采样率。
  2. 提取MFCC特征:使用librosa.feature.mfcc函数提取MFCC特征。n_mfcc=13指定提取13个MFCC特征。
  3. 提取Filterbank特征:librosa.feature.melspectrogram用于计算mel频谱图,n_mels=40定义了使用40个mel滤波器。然后,使用librosa.power_to_db将mel频谱的能量转换为分贝值。

3.可视化特征

import librosa
import librosa.display
import matplotlib.pyplot as plt
import numpy as np

# 读取音频文件
audio_path = '跑步.wav'
audio, sample_rate = librosa.load(audio_path)

# 计算滤波器组特征
melspec = librosa.feature.melspectrogram(y=audio, sr=sample_rate, n_fft=2048, hop_length=512, n_mels=128)
melspec_db = librosa.power_to_db(S=melspec, ref=np.max)

# 计算MFCC特征
mfccs = librosa.feature.mfcc(S=melspec_db, sr=sample_rate, n_mfcc=13)

# 可视化滤波器组特征
plt.figure()
librosa.display.specshow(melspec_db, x_axis='time', y_axis='mel', sr=sample_rate, fmax=8000)
plt.colorbar(format='%+2.0f dB')
plt.title('Mel-frequency spectrogram')
plt.tight_layout()

# 可视化MFCC特征
plt.figure()
librosa.display.specshow(mfccs, x_axis='time', y_axis='mel', sr=sample_rate)
plt.colorbar()
plt.title('MFCC')
plt.tight_layout()

plt.show()

在这里插入图片描述

4.总结

此次学习了语音特征分析之前的语音预处理步骤,且主要讲解了MFCC特征和 Filterbank特征的python实现,下一步将采用一些模型对语音进行建模。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1631699.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

qt学习篇---C++基础学习

本学习笔记学习下面视频总结,感兴趣可以去学习。讲的很详细 【北京迅为】嵌入式学习之QT学习篇_哔哩哔哩_bilibilihttps://www.bilibili.com/video/BV1tp4y1i7EJ/?spm_id_from333.337.search-card.all.click&vd_source8827cc0da16223b9f2ad8ae7111de9e2 目录 C…

Spring ai 快速入门及使用,构建你自己的ai

第一步:创建springboot项目 jdk必须是17及以上 1.8用不了 第二步 选择web和ai的依赖 选择openai 第三步 需要配置openai key 配置 分享个免费或的apikey的地方New API 会免费赠送1刀的token spring.application.namespringAI spring.ai.openai.base-urlhttps://ap…

封装形式,进化,DIP封装及键出方法

本文主要讨论芯片封装的主要形式,概念,以及芯片封装的演化,最后以DIP封装为例,分析键出方式。 1-IC封装的形式 IC 封装是指将组成电子器件的各个组成部分,包括半导体芯片、基板、管脚连接线等,按照要求布局…

【maven】pom文件详解和延伸知识

【maven】pom文件详解 【一】maven项目的pom文件详解【1】maven项目的目录结构【2】根元素和必要配置【3】父项目和parent元素【4】项目构建需要的信息【5】项目依赖相关信息(1)依赖坐标(2)依赖类型(3)依赖…

文件上传安全以及防止无限制文件上传

文件上传安全以及防止无限制文件上传 在网络应用中,文件上传是一项常见功能,用户可以通过它上传图片、文档或其他媒体文件。然而,如果没有适当的安全措施,文件上传功能可能成为安全漏洞的源头。本文将探讨文件上传过程中的安全风…

在网站源码后台增加响应式布局

一本教材上的网站源码,后台在手机上查看还是按照电脑的页面样式,不方便查看和发布新内容。教材上讲了响应式布局。对于页面结构简单的网站,可以利用响应式,使页面自动适用各种屏幕的分辨率。 今天在一个网站源码的后台使用了响应…

夸克网盘免费领取1TB空间的方法

夸克网盘背靠阿里这颗大树,经历了这两年的发展,用户规模早已是千万级体量,用户体验个人也觉得非常不错,并且在日臻完善的路上,必会越走越远。现在已经不能领取一个月会员,也没有了2TB免费空间的说法&#x…

基于python-flask技术的社区信息交流平台【数据库+15000文档】

预览 介绍 系统只需使用者通过电脑浏览器即可实现系统的访问和操作的WEB模式的信息化系统。为了保证系统数据的准确性、安全性的数据存储,系统应用MySQL数据库进行系统数据存储服务。根据对社区工作的深入调研和对社区居民的走访调查,详细分析整体系统的…

vue2左侧菜单栏收缩展开功能

目录 1. Main.vue页面代码 a. 修改侧边栏属性 b. 修改头部导航栏 c. 定义我们的变量 d. collapse函数 2. Header.vue页面代码 3. Aside.vue页面代码 vue2左侧菜单栏收缩展开目前是非常常见的,我们在日常开发过程中经常会碰到。这一小节我们就详细了解一下这个…

Spring IOC(二)

1. Bean的定义与获取 1.1 定义Bean 在Spring 中定义Bean的方式主要有三种&#xff1a; 1、基于XML配置文件的方式&#xff08;了解&#xff09;&#xff1a;通常会在配置文件中使用<bean>标签来定义Bean&#xff0c;并设置Bean的属性、依赖关系等信息。 2、基于注解的方…

基于Spring Boot的商务安全邮件收发系统设计与实现

基于Spring Boot的商务安全邮件收发系统设计与实现 开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/idea 系统部分展示 已发送效果图&#xff0c;用户可以对已发送信息…

javaweb学习week6

javaweb学习 九.登录认证 5.登录后下发令牌 生成令牌&#xff1a;引入JWT令牌操作工具类&#xff0c;登录完成后&#xff0c;调用工具类生成JWT令牌&#xff0c;并返回 代码实例&#xff1a; 6.Filter入门 概念&#xff1a;Filter过滤器&#xff0c;是Javaweb三大组件之一…

构建本地大语言模型知识库问答系统

MaxKB 2024 年 4 月 12 日&#xff0c;1Panel 开源项目组正式对外介绍了其官方出品的开源子项目 ——MaxKB&#xff08;github.com/1Panel-dev/MaxKB&#xff09;。MaxKB 是一款基于 LLM&#xff08;Large Language Model&#xff09;大语言模型的知识库问答系统。MaxKB 的产品…

【生活日常】听歌识曲失败后,寻找一首曲子的心路历程……

Have a nice day :) 0x00 事情经过 叶子现在心情很是激动&#xff01;是这样的…… 昨天下午呢&#xff0c;去了家不错的咖啡厅&#xff0c;点了杯冰美式&#xff0c;很不错&#xff01; 而且店里的 Marshall 音箱也很带劲&#xff01; 然后我听到了种类似 "合成器节奏…

SpringMVC进阶(过滤器解决中文乱码,处理json以及文件上传下载)

文章目录 1.中文乱码处理1.引出问题1.恢复原来取消掉的属性绑定2.启动服务器&#xff0c;引出问题 2.自定义中文乱码过滤器1.MyCharacterFilter.java2.web.xml配置过滤器&#xff08;这个解决乱码的过滤器放到最前面&#xff09;3.结果展示 3.使用Spring过滤器处理&#xff08;…

物联网通信网关的主要功能体现在哪些方面?-天拓四方

在信息化、智能化的时代&#xff0c;物联网技术的广泛应用正在逐渐改变我们的生活方式。物联网通过各种传感器和设备&#xff0c;将现实世界与数字世界紧密相连&#xff0c;从而实现智能化、自动化的生活和工作方式。作为物联网生态系统中的重要组成部分&#xff0c;物联网通信…

解决Pytorch的cuDNN error: CUDNN_STATUS_NOT_INITIALIZED

目录 1. 问题报错2. 可能原因2.1 GPU内存不足2.2 缓存问题2.3 CUDA和Pytorch版本不兼容2.4 CUDA和cuDNN版本不兼容 3. 验证CUDA是否可用4. 参考 1. 问题报错 在使用GPU加速模型训练的过程中经常会遇到这样的错误&#xff1a; RuntimeError: cuDNN error: CUDNN_STATUS_NOT_IN…

8_手眼标定总结_auboi5机械臂与海康平面相机

经过不断地学习与调试&#xff0c;不断地学习网络上其他同志分享的资料&#xff0c;opencv手眼标定迎来了阶段性结束。实际测试结果在机械臂坐标系中X方向差5mm左右。 代码参考《https://blog.csdn.net/wanggao_1990/article/details/81435660》 注意事项&#xff1a; ①标定…

开源相机管理库Aravis例程学习(五)——camera-api

开源相机管理库Aravis例程学习&#xff08;五&#xff09;——camera-api 简介例程代码函数说明arv_camera_get_regionarv_camera_get_pixel_format_as_stringarv_camera_get_pixel_formatARV_PIXEL_FORMAT_BIT_PER_PIXEL 简介 本文针对官方例程中的&#xff1a;03-camera-api…

Kafka(十二)Streams

目录 Streams1 什么式是流式处理2 流式处理的相关概念2.1 拓扑2.2 时间2.2.1 输入时间2.2.2 输出时间 2.3 状态2.4 流和表2.5 时间窗口2.5.1 测试时间窗口 2.6 处理保证 3 流式处理设计模式3.1 单事件处理3.2 使用本地状态3.3 多阶段处理和重分区3.4 使用外部查找&#xff1a;流…