语音信号处理-python

article/2025/10/22 0:43:10

语音信号处理

1.语音信号的产生与特性

我们要对语音进行分析,首先要提取能够表示该语音的特征参数,有了特征参数才可能利用这些参数进行有效的处理,在对语音信号处理的过程中,语音信号的质量不仅取决于处理方法,同时取决于时候选对了合适的特征参数。

语音信号是一个非平稳的时变信号,但语音信号是由声门的激励脉冲通过声道形成的,而声道(人的口腔、鼻腔)的肌肉运动是缓慢的,所以“短时间”(10~30ms)内可以认为语音信号是平稳时不变的。由此构成了语音信号的“短时分析技术”。

提取的不同的语音特征参数对应着不同的语音信号分析方法:时域分析、频域分析、倒谱域分析…由于语音信号最重要的感知特性反映在功率谱上,而相位变化只起到很小的作用,所有语音频域分析更加重要。

2.语音的读取

本实验使用wave库,实现语音文件的读取、波形图绘制,相关的库还有librosa、scipy等

import wave #调用wave模块
import matplotlib.pyplot as plt #调用matplotlib.pyplot模块作为Plt
import numpy as np  #调用numpy模块记作np
import scipy.signal as signal
import pyaudio%matplotlib inline
plt.rcParams['font.sans-serif'] = ['SimHei']  # 用来正常显示中文标签
plt.rcParams['axes.unicode_minus'] = False  # 用来正常显示符号f = wave.open(r"C:\Users\zyf\Desktop\Jupyter\1.wav", "rb")#读取语音文件
params = f.getparams() #返回音频参数
nchannels, sampwidth, framerate, nframes = params[:4] #赋值声道数,量化位数,采样频率,采样点数
print(nchannels,sampwidth,framerate,nframes)# 输出声道数,量化位数,采样频率,采样点数str_data = f.readframes(nframes) # 读取nframes个数据,返回字符串格式
f.close()
wave_data = np.frombuffer(str_data, dtype=np.short) # 将字符串转换为数组,得到一维的short类型的数组
wave_data = wave_data * 1.0 / (max(abs(wave_data))) # 赋值的归一化
time = np.arange(0, nframes) * (1.0 / framerate) # 最后通过采样点数和取样频率计算出每个取样的时间
# 整合左声道和右声道的数据,如果语音为双通道语音,具体代码需做调整
#wave_data = np.reshape(wave_data, [nframes, nchannels])
# wave_data.shape = (-1, 2)   # -1的意思就是没有指定,根据另一个维度的数量进行分割
plt.figure() # 单通道语音波形图
plt.plot(time, wave_data[:])
plt.xlabel("时间/s",fontsize=14)
plt.ylabel("幅度",fontsize=14)
plt.title("波形图",fontsize=14)
plt.grid()  # 标尺plt.tight_layout()  # 紧密布局
plt.show()

在这里插入图片描述

3.语音的播放

# 音频的播放,本实验使用pyaudio(代码相对matlab较麻烦,后期简化)
import pyaudio
import wavechunk = 1024
wf = wave.open(r"C:\Users\zyf\Desktop\Jupyter\1.wav", 'rb')
p = pyaudio.PyAudio()# 打开声音输出流
stream = p.open(format = p.get_format_from_width(wf.getsampwidth()),channels = wf.getnchannels(),rate = wf.getframerate(),output = True)# 写声音输出流到声卡进行播放
while True:data = wf.readframes(chunk)if data == "":breakstream.write(data)stream.stop_stream()
stream.close()
p.terminate()   # 关闭PyAudio

4.音频文件的写入

# 音频文件的写入、存储
# 使用wave库,相关的库还有librosa、scipy等,读写操作上的差异参阅博客: https://blog.csdn.net/weixin_38346042/article/details/119906391
import wave
import numpy as np
import scipy.signal as signalframerate = 44100   # 采样频率
time = 10           # 持续时间t = np.arange(0, time, 1.0/framerate)# 调用scipy.signal库中的chrip函数,
# 产生长度为10秒、取样频率为44.1kHz、100Hz到1kHz的频率扫描波
wave_data = signal.chirp(t, 100, time, 1000, method='linear') * 10000# 由于chrip函数返回的数组为float64型,
# 需要调用数组的astype方法将其转换为short型。
wave_data = wave_data.astype(np.short)# 打开WAV音频用来写操作
f = wave.open(r"sweep.wav", "wb")f.setnchannels(1)           # 配置声道数
f.setsampwidth(2)           # 配置量化位数
f.setframerate(framerate)   # 配置取样频率
comptype = "NONE"
compname = "not compressed"# 也可以用setparams一次性配置所有参数
# outwave.setparams((1, 2, framerate, nframes,comptype, compname))# 将wav_data转换为二进制数据写入文件
f.writeframes(wave_data.tobytes())
f.close()

5.语音的分帧加窗

5.1 分帧

语音数据和视频数据不同,本没有帧的概念,但是为了传输与存储,我们采集的音频数据都是一段一段的。为了程序能够进行批量处理,会根据指定的长度(时间段或者采样数)进行分段,结构化为我们编程的数据结构,这就是分帧。语音信号在宏观上是不平稳的,在微观上是平稳的,具有短时平稳性(10—30ms内可以认为语音信号近似不变),这个就可以把语音信号分为一些短段来进行处理,每一个短段称为一帧(CHUNK)。

5.2 帧移

由于我们常用的信号处理方法都要求信号是连续的,也就说必须是信号开始到结束,中间不能有断开。然而我们进行采样或者分帧后数据都断开了,所以要在帧与帧之间保留重叠部分数据,以满足连续的要求,这部分重叠数据就是帧移。

帧长=重叠+帧移

5.3 加窗

我们处理信号的方法都要求信号是连续条件,但是分帧处理的时候中间断开了,为了满足条件我们就将分好的帧数据乘一段同长度的数据,这段数据就是窗函数整个周期内的数据,从最小变化到最大,然后最小。

常用的窗函数:矩形窗、汉明窗、海宁窗
在这里插入图片描述加窗即与一个窗函数相乘,加窗之后是为了进行傅里叶展开.
1.使全局更加连续,避免出现吉布斯效应
2.加窗时候,原本没有周期性的语音信号呈现出周期函数的部分特征。
加窗的代价是一帧信号的两端部分被削弱了,所以在分帧的时候,帧与帧之间需要有重叠。
在这里插入图片描述

# 加窗分帧(接上)
# 语音分帧、加窗
wlen=512 # 每帧信号长度
inc=128  # 帧移
signal_length=len(wave_data) #信号总长度
print(signal_length)
if signal_length<=wlen: #若信号长度小于一个帧的长度,则帧数定义为1nf=1
else:                 #否则,计算帧的总长度nf=int(np.ceil((1.0*signal_length-wlen+inc)/inc))   # nf 为帧数
# np.ceil向上取整,所以会导致实际分帧后的长度大于信号本身的长度,所以要对原来的信号进行补零
pad_length=int((nf-1)*inc+wlen) #所有帧加起来总的铺平后的长度
zeros=np.zeros((pad_length-signal_length,)) #不够的长度使用0填补,类似于FFT中的扩充数组操作
pad_signal=np.concatenate((wave_data,zeros)) #填补后的信号记为pad_signal
indices=np.tile(np.arange(0,wlen),(nf,1))+np.tile(np.arange(0,nf*inc,inc),(wlen,1)).T  #相当于对所有帧的时间点进行抽取,得到nf*wlen长度的矩阵
indices=np.array(indices,dtype=np.int32) #将indices转化为矩阵
frames=pad_signal[indices] #得到帧信号,587*512的矩阵信号
#a=frames[30:31]
#print(frames.shape)
winfunc = signal.hamming(wlen) # 调用窗函数,本初以汉明窗为例
#print(winfunc.shape) 
win=np.tile(winfunc,(nf,1)) #窗函数为一维数组(512,),因此需要按照信号帧数进行变换得到(587*512)矩阵信号
#print(win.shape)
my = frames*win   # 这里的*指的是计算矩阵的数量积(即对位相乘)。
# python中矩阵运算分为两种形式,一是np.array,而是np.matrix
# ----------------------------------
#  绘制分帧加窗后的图像(接上)
# 因为分帧加窗后的信号为587*512的矩阵信号,为了绘图,将其转换为一维信号
t=my.flatten()  
t=t.T
print(t.shape)
time = np.arange(0, len(t)) * (1.0 / framerate)   # 调整时间轴
plt.figure()
plt.plot(time,t,c="g")
plt.grid()
plt.show()

在这里插入图片描述

6.语音的频谱分析

6.1 频谱图

通过FFT对时域语音信号进行处理,得到频谱图

import numpy as np
from scipy.io import wavfile
import matplotlib.pyplot as plt%matplotlib inline
sampling_freq, audio = wavfile.read(r"C:\Users\zyf\Desktop\Jupyter\1.wav")   # 读取文件audio = audio / np.max(audio)   # 归一化,标准化# 应用傅里叶变换
fft_signal = np.fft.fft(audio)
print(fft_signal)fft_signal = abs(fft_signal)
print(fft_signal)# 建立时间轴
Freq = np.arange(0, len(fft_signal))# 绘制语音信号的
plt.figure()
plt.plot(Freq, fft_signal, color='blue')
plt.xlabel('Freq (in kHz)')
plt.ylabel('Amplitude')
plt.show()

在这里插入图片描述

6.2 语谱图

语谱图综合了时域和频域的特点,明显的显示出来了语音频率随时间的变化情况**,语谱图的横轴为时间,纵轴为频率任意给定频率成分在给定时刻的强弱用颜色深浅表示。**颜色深表示频谱值大,颜色浅表示频谱值小,谱图上不同的黑白程度形成不同的纹路,称为声纹,不用讲话者的声纹是不一样的,可以用做声纹识别。

import wave
import matplotlib.pyplot as plt
import numpy as npf = wave.open(r"C:\Users\zyf\Desktop\Jupyter\1.wav", "rb")
params = f.getparams()
nchannels, sampwidth, framerate, nframes = params[:4]
strData = f.readframes(nframes)#读取音频,字符串格式
waveData = np.fromstring(strData,dtype=np.int16)#将字符串转化为int
waveData = waveData*1.0/(max(abs(waveData)))#wave幅值归一化
waveData = np.reshape(waveData,[nframes,nchannels]).T
f.close()plt.specgram(waveData[0],Fs = framerate, scale_by_freq = True, sides = 'default')
plt.ylabel('Frequency(Hz)')
plt.xlabel('Time(s)')
plt.colorbar()
plt.show()

在这里插入图片描述
参考博客:
https://www.cnblogs.com/zhenmeili/p/14830176.html
https://blog.csdn.net/sinat_18131557/article/details/105340416
https://blog.csdn.net/weixin_38346042/article/details/119906391
https://www.jb51.net/article/126984.htm


http://chatgpt.dhexx.cn/article/Vn1YcH7y.shtml

相关文章

python实验六 语音信号处理

目录 实验目的&#xff1a; 实验原理&#xff1a; 实验准备&#xff1a; 实验步骤与内容&#xff1a; 参考代码&#xff1a; 实验目的&#xff1a; 依托语音信号处理领域的声学特征提取任务&#xff0c;学习常用的语音信号处理工具&#xff0c;实现对语音数据的预处理和常…

matlab的语音信号处理

人类交换信息最方便的、最快捷的一种方式是语言&#xff0c;在高度发达的信息社会中&#xff0c;用数字化的方法进行语音的识别、合成、增强、传送和储存等是整个数字化通信网中最重要、最基本的组成部分之一。数字电话通信、高音质的窄带语音通信系统、智能机器人、声控打字机…

语音信号处理 —— 笔记(一)音频信号处理

声音的产生 &#xff1a;能量通过声带使其振动产生一股基声音&#xff0c;这个基声音通过声道 &#xff0c;与声道发生相互作用产生共振声音&#xff0c;基声音与共振声音一起传播出去。 一、音频信号简介 1.声音波形图 传感器以某种频率探测声音的振幅强度以及振动方向&…

语音信号处理的过程及其应用

一、语音信号处理的过程 在信号处理领域&#xff0c;信息加工和处理的一般流程下图所示。 在语音信号的具体情况下&#xff0c;信息源就是说话的人&#xff0c;通过观察和测量得到的就是语音的波形。信号处理包括以下几个内容&#xff0c;首先根据一个给定的模型得到这一信号的…

语音信号处理基础知识-常用特征及预处理

目录 一、语音信号的特点二、常用语音特征参数三、语音信号预处理四、参考链接 一、语音信号的特点 其主要特点如下所示&#xff1a;     a) 语音信号的带宽约为 5 K h z 5Khz 5Khz , 主要能量集中在低频段。     b) 语音信号总体为非平稳时变信号&#xff0c;一般认为…

语音信号基本知识和处理

语音信号&#xff08;音频&#xff1b;声音&#xff09;是模拟信号&#xff0c;现实生活中表现为连续的、平滑的波形&#xff0c;其横坐标为时间轴&#xff0c;纵坐标表示声音的强弱。 我们需要将其保存为数字信号再进行处理。 1. 声音三要素 1.1 音调 人耳对声音高低的感觉…

语音信号处理

文章目录 语音信号处理第一章 绪论第二章 语音信号处理基础知识语音和语言 **浊音的声带振动基本频率&#xff08;fundamental frequency&#xff09;称为基音频率。浊音的基音频率&#xff08;pitch&#xff09;&#xff1a;**&#xff1f;&#xff1f;&#xff1f;&#xff1…

语音信号处理概述及流程

一、语音信号处理的三个主要方向。 1&#xff0c;语音合成。 语音合成的是为了让计算机产生高质量的、高自然度的连续语音。计算机语音合成系统又称文语转换系统&#xff08;TTS&#xff09;&#xff0c;主要是将文本输出语音。 发展过程&#xff1a;共振峰合成、LPC合成、PSOL…

基于matlab的语音信号处理

摘要 利用所学习的数字信号处理知识&#xff0c;设计了一个有趣的音效处理系统&#xff0c;首先设计了几种不同的滤波器对声音进行滤波处理&#xff0c;分析了时域和频域的变化&#xff0c;比较了经过滤波处理后的声音与原来的声音有何变化。同时设计实现了语音的倒放&#xff…

【无线通信篇 | Zstack协议栈】CC2530 Zigbee Zstack协议栈组网项目及详细讲解篇

演示视频&#xff1a;https://www.bilibili.com/video/BV1Ew411o7Fp 物联网无线通信技术&#xff0c;ZigBee无线传感网络 CC2530最大的特点就是一个拥有无线收发器&#xff08;RF&#xff09;的单片机&#xff0c;既能实现单片机功能&#xff0c;也能实现无线传输 Zstack协议…

【Zigbee】进阶篇(1) Zigbee协议栈创建简单项目,协议栈、事件、消息学习

大家好&#xff0c;我是皮皮猫吖&#xff01; 每文一言&#xff1a;梦想不会逃跑&#xff0c;会逃跑的永远都是自己&#xff01; 本篇文章&#xff1a; 主要是协议栈的介绍&#xff0c;使用协议栈完成一个简单例子&#xff0c;协调器创建网络的相关问题&#xff0c;学会在协议…

ZigBee协议栈TI Z-Stack分析

ZigBee协议栈TI Z-Stack分析 2010-11-05 11:26 转载自 slcfhr 最终编辑 slcfhr 标签(TAG)&#xff1a; ZigBee 协议栈 Z-Stack 2007年4月&#xff0c;德州仪器推出业界领先的ZigBee协议栈&#xff08;Z-Stack&#xff09;。Z-Stack符合ZigBee 2006规范&#xff0c;支持…

lesson7-1 Zigbee协议栈的使用

目录 协议栈的使用 协议栈的安装和协议栈工程创建 协议栈工程配置 选项卡选择 用户代码编写注意 信道选择及PANID分配 协议栈的使用 协议栈的安装和协议栈工程创建 首先进行协议栈的安装 如何创建自己的协议栈工程&#xff1a; &#xff08;1&#xff09;先把整个协议…

物联网--Zigbee协议(一):Zigbee初识

物联网--Zigbee协议 前言一、Zigbee初识什么是物联网&#xff1f;什么是Zigbee&#xff1f; 二、Zigbee协议的基础知识Zigbee三种设备类型Zigbee三种网络拓扑结构Zigbee工作频段 三、Zigbee协议架构总结 前言 最近在学习Zigbee的相关知识&#xff0c;发现网上、论坛找到的知识…

ZigBee 快速入门(协议栈,协调器,路由器,终端设备,加入网络,安全,路由功能,频段)

文章目录 1、ZigBee 是什么2、ZigBee 目标3、ZigBee 协议栈4、设备类型5、Mesh网络 拓扑结构6、加入一个 ZigBee 网络7、ZigBee 安全8、频段和速率9、ZigBee相关特性和名词9.1 CSMA/CD&#xff0c;CSMA/CA9.2 信道访问机制9.3 dB、dBm、dBi9.4 传播损耗9.5 RSSI、LQI9.6 接收灵…

ZigBee协议介绍

简介 ZigBee是一种无线通信标准&#xff0c;是由ZigBee Alliance于 2001 年基于IEEE802.15.4标准定制的&#xff0c;这一标准界定了低功耗、低传输速率、近距离无线通信技术所需的所有相关通信协议。基于ZigBee协议的无线通信网络的工作频段主要有2.4GHz、915MHz、868MHz三个频…

zigbee协议栈工作流程 From zigbee菜鸟笔记(十 一)

一.ZigBee 协议栈简介 有问题发送邮件至468078841qq.com 什么是ZigBee 协议栈呢&#xff1f;它和ZigBee 协议有什么关系呢?协议是一系列的通信标准&#xff0c;通信双方需要共同按照这一标准进行正常的数据发射和接收。协议栈是协议的具体实现形式&#xff0c;通俗点来理解就…

ZigBee协议

ZigBee协议 简介 这个zigbee教程描述了您想要了解的有关Zigbee协议栈的所有内容。现在&#xff0c;一天的zigbee在低数据速率无线应用中变得非常流行。 Zigbee设备用于智能能源&#xff0c;医疗和家庭自动化。在智能能源应用中&#xff0c;zigbee产品用于监控和控制能源和水…

物联网--Zigbee协议(二):Zigbee协议架构以及数据帧结构

上一篇整理了关于Zigbee协议的一些基础知识&#xff0c;接下来主要讨论Zigbee协议的架构&#xff0c;希望通过这篇文章能够帮助小伙伴们更好地理解Zigbee协议&#xff0c;废话不多说&#xff0c;进入正题吧。 文章目录 一、Zigbee协议架构二、Zigbee协议的数据帧结构总结 一、Z…

Zigbee协议栈中文说明

1.概述 1.1解析ZigBee堆栈架构 ZigBee堆栈是在IEEE 802.15.4标准基础上建立的&#xff0c;定义了协议的MAC和PHY层。ZigBee设备应该包括IEEE802.15.4(该标准定义了RF射频以及与相邻设备之间的通信)的PHY和MAC层&#xff0c;以及ZigBee堆栈层&#xff1a;网络层(NWK)、应用层和…