|
py用wave读取通道数为2的无压缩音频信号
语音信号有四个重要的参数:声道数、采样频率、量化位数和比特率
(声道数、量化位数、采样频率、采样点数、压缩类型、压缩类型的描述)
比特率=采样频率 * 量化位数
如果你需要自己录制和编辑声音文件,推荐使用Audacity,
它是一款开源的、跨平台、多声道的录音编辑软件。在我的工作中经常使用Audacity进行声音信号的录制,
然后再输出成WAV文件供Python程序处理
sudo apt update
sudo apt install audacity
jiang@jiang-Ubuntu:~$ sudo apt install audacity
正在读取软件包列表... 完成
正在分析软件包的依赖关系树
正在读取状态信息... 完成
audacity 已经是最新版 (2.2.1-1)。
wave库是python的标准库 wave模块只支持非压缩的数据
- # -*- coding: utf-8 -*-
- __author__ = u'东方耀 微信:dfy_88888'
- __date__ = '2021/9/10 上午9:23'
- __product__ = 'PyCharm'
- __filename__ = '01_py用wave读取通道数为2的无压缩音频信号'
- import wave
- import matplotlib.pyplot as plt
- import numpy as np
- from matplotlib.font_manager import FontProperties
- font_fname = "/usr/share/fonts/wps-office/simfang.ttf"
- font = FontProperties(fname=font_fname)
- # py用wave读取通道数为2的无压缩音频信号
- # 语音信号有四个重要的参数:声道数、采样频率、量化位数和比特率
- # "rb":只读模式 "wb":只写模式
- with wave.open("01.wav", "rb") as f:
- # 读取格式信息
- # (声道数、量化位数、采样频率、采样点数、压缩类型、压缩类型的描述)
- # (nchannels, sampwidth, framerate, nframes, comptype, compname)
- params = f.getparams()
- # print("音频的所有参数:", params)
- nchannels, sampwidth, framerate, nframes = params[:4]
- # nchannels通道数 = 2
- # sampwidth量化位数 是字节数 = 2
- # framerate采样频率 = 44100 44.1k
- # nframes采样点数 = 跟时间有关
- print("读取音频的信息:通道数={},量化位数={},采样率={},单通道的采样点数={}".format(nchannels, sampwidth*8, framerate, nframes))
- # 读取的长度(以取样点为单位),返回的是字符串类型的数据
- str_data = f.readframes(nframes)
- print("看看,奇怪?编码有关?:", type(str_data), len(str_data), str_data[:5])
- # 将字符串转换为数组,得到一维的short类型的数组 有取整的意思
- wave_data = np.fromstring(str_data, dtype=np.short)
- print("numpy处理后的原始数据:", wave_data.shape, wave_data[:3], np.max(wave_data), np.min(wave_data))
- # 赋值的归一化
- wave_data = wave_data * 1.0 / np.max(wave_data)
- # 整合左声道和右声道的数据
- wave_data = np.reshape(wave_data, [nframes, nchannels])
- # wave_data.shape = (-1, 2) # -1的意思就是没有指定,根据另一个维度的数量进行分割
- print("左右通道分开且归一化后的:", wave_data.shape, wave_data[:3, :])
- # 最后通过采样点数和取样频率计算出每个取样的时间
- time = np.arange(0, nframes) * (1.0 / framerate)
- print("该段音频的持续时间{}s=单通道采样点数{}/采样率{}".format(nframes/framerate, nframes, framerate))
- print("计算比特率kbps=", framerate*sampwidth*8*nchannels / 1000)
- plt.figure()
- # 左声道波形
- plt.subplot(2, 1, 1)
- plt.plot(time, wave_data[:, 0])
- plt.xlabel("时间/s", fontproperties=font, fontsize=14)
- plt.ylabel("幅度", fontproperties=font, fontsize=14)
- plt.title("左声道", fontproperties=font, fontsize=14)
- plt.grid() # 标尺
- plt.subplot(2, 1, 2)
- # 右声道波形
- plt.plot(time, wave_data[:, 1], c="g")
- plt.xlabel("时间/s", fontproperties=font, fontsize=14)
- plt.ylabel("幅度", fontproperties=font, fontsize=14)
- plt.title("右声道", fontproperties=font, fontsize=14)
- plt.tight_layout() # 紧密布局
- plt.show()
复制代码
|
|