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

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 librosadef 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 pltaudio_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 nrdef 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.rhkb.cn/news/317825.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【开源设计】京东慢SQL组件:sql-analysis

京东慢SQL组件:sql-analysis 一、背景二、源码简析三、总结 地址:https://github.com/jd-opensource/sql-analysis 一、背景 开发中,无疑会遇到慢SQL问题,而常见的处理思路都是等上线,然后由监控报警之后再去定位对应…

Linux进程——进程的创建(fork的原理)

前言:在上一篇文章中,我们已经会使用getpid/getppid函数来查看pid和ppid,本篇文章会介绍第二种查看进程的方法,以及如何创建子进程! 本篇主要内容: 查看进程的第二种方法创建子进程系统调用函数fork 在开始前&#xff…

2023 广东省大学生程序设计竞赛(部分题解)

目录 A - Programming Contest B - Base Station Construction C - Trading D - New Houses E - New but Nostalgic Problem I - Path Planning K - Peg Solitaire A - Programming Contest 签到题:直接模拟 直接按照题目意思模拟即可,为了好去…

C——双向链表

一.链表的概念及结构 链表是一种物理存储单元上非连续、非顺序的存储结构,数据元素的逻辑顺序是通过链表中的指针链接次序实现的。什么意思呢?意思就是链表在物理结构上不一定是连续的,但在逻辑结构上一定是连续的。链表是由一个一个的节点连…

CMake使用

一、CMake 是什么 CMake 是一个跨平台的自动化构建系统,它使用配置文件 CMakeLists.txt 来管理软件构建过程。CMake 基于 Makefile 做了二次开发。 二、单个文件目录 # CMake 最低版本号要求 cmake_minimum_required(VERSION 3.16.3)# 工程名 project(CMakeSingle)…

uniapp0基础编写安卓原生插件和调用第三方jar包和编写语音播报插件之使用jar包插件

前言 如果你不会编写安卓插件,你可以先看看我之前零基础的文章(uniapp0基础编写安卓原生插件和调用第三方jar包和编写语音播报插件之零基础编写安卓插件), 我们使用第三方包,jar包编写安卓插件 开始 把依赖包,放到某个模块的/libs目录(myTestPlug/libs) 还要到build…

缓存分享(1)——Guava Cache原理及最佳实践

Guava Cache原理及最佳实践 1. Guava Cache是什么1.1 简介1.2 核心功能1.3 适用场景 2. Guava Cache的使用2.1 创建LoadingCache缓存2.2 创建CallableCache缓存 缓存的种类有很多,需要根据不同的应用场景来选择不同的cache,比如分布式缓存如redis、memca…

Java设计模式 _结构型模式_桥接模式

一、桥接模式 1、桥接模式 桥接模式(Bridge Pattern)是一种结构型设计模式。用于把一个类中多个维度的抽象化与实现化解耦,使得二者可以独立变化。 2、实现思路 使用桥接模式,一定要找到这个类中两个变化的维度:如支…

【消息队列】RabbitMQ五种消息模式

RabbitMQ RabbitMQRabbitMQ安装 常见的消息模型基本消息队列SpringAMQPWorkQueue消息预取发布订阅模式Fanout ExchangeDirectExchangeTopicExchange 消息转换器 RabbitMQ RabbitMQ是基于Erlang语言开发的开源消息通信中间件 官网地址:https://www.rabbitmq.com/ R…

C语言趣味代码(四)

这一篇主要编写几个打字练习的小程序,然后通过这些小程序的实现来回顾复习我们之前学过的知识,然后通过这写打字练习的小程序来提升我们的打字技术和编程技术。 1. 打字练习 1.1 基本打字练习 1.1.1 基本实现 首先我们来制作一个用于计算并显示输入一…

嵌入式学习59-ARM7(自动设备号和混杂设备)

知识零碎: 头文件查找: /arm/路径下的头文件 linux驱动程序的编写,编译,运行过程 -------------------------------------------------------------------------------------------------------------------------------- 1.…

【C语言】深入了解文件:简明指南

🌈个人主页:是店小二呀 🌈C语言笔记专栏:C语言笔记 🌈C笔记专栏: C笔记 🌈喜欢的诗句:无人扶我青云志 我自踏雪至山巅 文章目录 一、文件的概念1.1 文件名:1.2 程序文件和数据文件 二、数据文…

手拉手springboot整合kafka

前期准备安装kafka 启动Kafka本地环境需Java 8以上 Kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理消费者在网站中的所有动作流数据。 Kafka启动方式有Zookeeper和Kraft,两种方式只能选择其中一种启动,不能同时使用。 Kafka下载…

头歌:Spark的安装与使用

第1关:Scala语言开发环境的部署 相关知识 Scala是一种函数式面向对象语言,它融汇了许多前所未有的特性,而同时又运行于JVM之上。随着开发者对Scala的兴趣日增,以及越来越多的工具支持,无疑Scala语言将成为你手上一件…

第5篇:创建Nios II工程之Hello_World<四>

Q:最后我们在DE2-115开发板上演示运行Hello_World程序。 A:先烧录编译Quartus硬件工程时生成的.sof文件,在FPGA上成功配置Nios II系统;然后在Nios II Eclipse窗口右键点击工程名hello_world,选择Run As-->Nios II …

如何使用Go语言进行并发安全的数据访问?

文章目录 并发安全问题的原因解决方案1. 使用互斥锁(Mutex)示例代码: 2. 使用原子操作(Atomic Operations)示例代码: 3. 使用通道(Channels) 在Go语言中,进行并发编程是常…

SpringMVC整体工作流程

. 用户发起一个请求,请求首先到达前端控制器前端控制器接收到请求后会调用处理器映射器,由此得知,这个请求该由哪一个Controller来进行处理(并未调用Controller);前端控制器调用处理器适配器,告诉处理器适配器应该要…

搭建vue3组件库(三): CSS架构之BEM

文章目录 1. 通过 JS 生成 BEM 规范名称1.1 初始化 hooks 目录1.2 创建 BEM 命名空间函数1.3 通过 SCSS 生成 BEM 规范样式 2. 测试 BEM 规范 BEM 是由 Yandex 团队提出的一种 CSS 命名方法论,即 Block(块)、Element(元素&#xf…

qt-C++笔记之滑动条QSlider和QProgressBar进度条

qt-C笔记之滑动条QSlider和QProgressBar进度条 —— 2024-04-28 杭州 本例来自《Qt6 C开发指南》 文章目录 qt-C笔记之滑动条QSlider和QProgressBar进度条1.运行2.阅读笔记3.文件结构4.samp4_06.pro5.main.cpp6.widget.h7.widget.cpp8.widget.ui 1.运行 2.阅读笔记 3.文件结构…

安装VMware Tools报错处理(SP1)

一、添加共享文件 因为没有VMware Tools,所以补丁只能通过共享文件夹进行传输了。直接在虚拟机的浏览器下载的话,自带的IE浏览器太老了,网站打不开,共享文件夹会方便一点,大家也可以用自己的方法,能顺利上…