读取音频的双通道波形并绘制波形图及语谱图

本文介绍了如何读取双通道音频波形并绘制波形图、语谱图,涉及信号分帧、加窗、短时能量计算等处理,还涵盖了MFCC特征提取和语音识别的基本步骤。
摘要由CSDN通过智能技术生成
读取双通道波形并绘制波形图
import wave
import matplotlib.pyplot as plt
import numpy as np
"""读取双通道波形并绘制波形图"""
# 打开WAV音频
f = wave.open("./audio/audio.wav", "rb")

# 读取格式信息
# (声道数、量化位数、采样频率、采样点数、压缩类型、压缩类型的描述)
# (nchannels, sampwidth, framerate, nframes, comptype, compname)
params = f.getparams()
nchannels, sampwidth, framerate, nframes = params[:4]
print("声道数---", nchannels)
print("量化位数---", sampwidth)
print("采样频率---", framerate)
print("采样点数---", nframes)

# 读取nframes个数据,返回字符串格式
str_data = f.readframes(nframes)
f.close()

# 将字符串转换为数组,得到一维的short类型的数组
wave_data = np.fromstring(str_data, dtype=np.short)

# 赋值的归一化
wave_data = wave_data * 1.0 / (max(abs(wave_data)))

# 整合左声道和右声道的数据
wave_data = np.reshape(wave_data, [nframes, nchannels])
# wave_data.shape = (-1, 2)   # -1的意思就是没有指定,根据另一个维度的数量进行分割

# 最后通过采样点数和取样频率计算出每个取样的时间
time = np.arange(0, nframes) * (1.0 / framerate)

plt.figure()
# 左声道波形
plt.subplot(3, 1, 1)
plt.plot(time, wave_data[:, 0])
plt.xlabel("time (seconds)")
plt.ylabel("Amplitude")
plt.title("Left channel")
plt.grid()  # 标尺

plt.subplot(3, 1, 3)
# 右声道波形
plt.plot(time, wave_data[:, 1], c="g")
plt.xlabel("time (seconds)")
plt.ylabel("Amplitude")
plt.title("Left channel")
plt.title("right channel")
plt.grid()

plt.show()

这种方法读取的是字符型,需要经过 np.fromstring(str_data, dtype=np.short)类型转换。

第二种读取wav文件的方式:

from scipy.io import wavfile

sampling_freq, audio = wavfile.read(" .wav")

这里读取的audio直接是数组形式。

import wave
import matplotlib.pyplot as plt
import numpy as np
from scipy.io import wavfile
"""读取双通道波形并绘制波形图"""
f = wavfile.read("./audio/audio.wav")
nframes = len(f[1])  #获取采样点数
nchannels = 2  #  通道数=2
framerate = f[0] #  获取采样频率
wave_data = f[1]  #  获取音频数据
wave_data = np.reshape(wave_data, [nframes, nchannels])
# 最后通过采样点数和取样频率计算出每个取样的时间
time = np.arange(0, nframes) * (1.0 / framerate)

plt.figure()
# 左声道波形
plt.subplot(3, 1, 1)
plt.plot(time, wave_data[:, 0])
plt.xlabel("time (seconds)")
plt.ylabel("Amplitude")
plt.title("Left channel")
plt.grid()  # 标尺

plt.subplot(3, 1, 3)
# 右声道波形
plt.plot(time, wave_data[:, 1], c="g")
plt.xlabel("time (seconds)")
plt.ylabel("Amplitude")
plt.title("Left channel")
plt.title("right channel")
plt.grid()
plt.show()

结果如下:

在这里插入图片描述

音频信号的短时频域处理

语音信号处理中,信号再频域或其他变换域上的分析处理非常重要,再频域上研究语音可以使信号在时域上无法表现出来的特征变得十分明显,一个音频信号的本质是由其频率内容来决定的。—短时傅里叶变换

import numpy as np
from scipy.io import wavfile
import matplotlib.pyplot as plt

sampling_freq, audio = wavfile.read("./audio/audio.wav")  # 读取文件

audio = audio / np.max(audio)  # 归一化,标准化

# 应用傅里叶变换
fft_signal = np.fft
  • 11
    点赞
  • 72
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值