用Python绘制语音信号的波形图及解决遇到的问题

一、用Python画语音信号的波形

音频信号是模拟信号,我们需要将其保存为数字信号,才能对语音进行算法操作,WAV是Microsoft开发的一种声音文件格式,通常被用来保存未压缩的声音数据。

语音信号有三个重要的参数:声道数、取样频率和量化位数。

  • 声道数:可以是单声道或者是双声道;
  • 采样频率:一秒内对声音信号的采集次数,44100Hz采样频率意味着每秒钟信号被分解成44100份;
  • 量化位数:用多少bit表达一次采样所采集的数据,通常有8bit、16bit、24bit和32bit等几种。

1、打开wav文件

f = wave.open(r"audio.wav", "rb")

2、读取格式信息

wava模块为WAV声音格式提供了方面的界面,它不支持压缩/解压,但支持单声道/立体声。

# (nchannels, sampwidth, framerate, nframes, comptype, compname)
params = f.getparams()
nchannels, sampwidth, framerate, nframes = params[:4]

3、读取波形数据

str_data = f.readframes(nframes)
f.close()

4、将波形数据转换为数组并绘波形

wave_data = np.fromstring(str_data, dtype=np.short)
if nchannels == 2:
    wave_data.shape = -1, 2
    wave_data = wave_data.T
    time = np.arange(0, nframes) * (1.0 / framerate)
    pl.subplot(211)
    pl.plot(time, wave_data[0])
    pl.subplot(212)
    pl.plot(time, wave_data[1], c="g")
    pl.xlabel("time (seconds)")
    pl.show()
elif nchannels == 1:
    wave_data.shape = -1, 1
    wave_data = wave_data.T
    time = np.arange(0, nframes) * (1.0 / framerate)
    pl.subplot(211)
    pl.plot(time, wave_data[0])
    pl.xlabel("time (seconds)")
    pl.show()

5、画出的波形图

用Python绘制语音信号的波形图及解决遇到的问题_第1张图片

二、遇到的问题及解决办法

用Python绘制语音信号的波形图及解决遇到的问题_第2张图片
此处提示缺的时pylab模块,但是若直接去装它,用pip install pylab这条命令的话,会出错,说找不到。
这是因为需要先安装numpy、spy和matplotlib,之后才能获得pylab。
但是若直接用命令pip install matplotlib也不对,说是找不到相关联的文件。而用命令python -m pip install matplotlib经常会出现下载到一半就会报错,尝试了很多次都不行;最后,我采用的是先把matplotlib-3.2.1-cp37-cp37m-win_amd64.whl下载到电脑上,并保存在D\download目录下,之后进行下面的操作。
(1)按win+r,输入cmd并回车;
(2)键入d:
(3)输入dir;
(4)输入cd download;
(5)输入python -m pip install matplotlib-3.2.1-cp37-cp37m-win_amd64.whl;
这可能会多次出现下载到一半就出错的情况,这时候就要耐下心来进行多次尝试,直到成功;结果如下:
用Python绘制语音信号的波形图及解决遇到的问题_第3张图片
至此,PyCharm中所缺失的库就装好了,此时再次运行代码就能得出音频信号的波形图了,见上所示。

你可能感兴趣的:(笔记)