东方耀AI技术分享

 找回密码
 立即注册

QQ登录

只需一步,快速开始

搜索
热搜: 活动 交友 discuz
查看: 1330|回复: 2
打印 上一主题 下一主题

[Python] py用wave读取通道数为2的无压缩音频信号

[复制链接]

1365

主题

1856

帖子

1万

积分

管理员

Rank: 10Rank: 10Rank: 10

积分
14432
QQ
跳转到指定楼层
楼主
发表于 2021-9-10 10:58:03 | 只看该作者 |只看大图 回帖奖励 |倒序浏览 |阅读模式


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模块只支持非压缩的数据




  1. # -*- coding: utf-8 -*-
  2. __author__ = u'东方耀 微信:dfy_88888'
  3. __date__ = '2021/9/10 上午9:23'
  4. __product__ = 'PyCharm'
  5. __filename__ = '01_py用wave读取通道数为2的无压缩音频信号'


  6. import wave
  7. import matplotlib.pyplot as plt
  8. import numpy as np
  9. from matplotlib.font_manager import FontProperties

  10. font_fname = "/usr/share/fonts/wps-office/simfang.ttf"
  11. font = FontProperties(fname=font_fname)

  12. # py用wave读取通道数为2的无压缩音频信号
  13. # 语音信号有四个重要的参数:声道数、采样频率、量化位数和比特率
  14. # "rb":只读模式  "wb":只写模式
  15. with wave.open("01.wav", "rb") as f:
  16.     # 读取格式信息
  17.     # (声道数、量化位数、采样频率、采样点数、压缩类型、压缩类型的描述)
  18.     # (nchannels, sampwidth, framerate, nframes, comptype, compname)
  19.     params = f.getparams()
  20.     # print("音频的所有参数:", params)
  21.     nchannels, sampwidth, framerate, nframes = params[:4]
  22.     # nchannels通道数 = 2
  23.     # sampwidth量化位数 是字节数 = 2
  24.     # framerate采样频率 = 44100  44.1k
  25.     # nframes采样点数 = 跟时间有关
  26.     print("读取音频的信息:通道数={},量化位数={},采样率={},单通道的采样点数={}".format(nchannels, sampwidth*8, framerate, nframes))

  27.     # 读取的长度(以取样点为单位),返回的是字符串类型的数据
  28.     str_data = f.readframes(nframes)
  29.     print("看看,奇怪?编码有关?:", type(str_data), len(str_data), str_data[:5])


  30. # 将字符串转换为数组,得到一维的short类型的数组 有取整的意思
  31. wave_data = np.fromstring(str_data, dtype=np.short)
  32. print("numpy处理后的原始数据:", wave_data.shape, wave_data[:3], np.max(wave_data), np.min(wave_data))

  33. # 赋值的归一化
  34. wave_data = wave_data * 1.0 / np.max(wave_data)

  35. # 整合左声道和右声道的数据
  36. wave_data = np.reshape(wave_data, [nframes, nchannels])
  37. # wave_data.shape = (-1, 2)   # -1的意思就是没有指定,根据另一个维度的数量进行分割
  38. print("左右通道分开且归一化后的:", wave_data.shape, wave_data[:3, :])

  39. # 最后通过采样点数和取样频率计算出每个取样的时间
  40. time = np.arange(0, nframes) * (1.0 / framerate)
  41. print("该段音频的持续时间{}s=单通道采样点数{}/采样率{}".format(nframes/framerate, nframes, framerate))
  42. print("计算比特率kbps=", framerate*sampwidth*8*nchannels / 1000)

  43. plt.figure()
  44. # 左声道波形
  45. plt.subplot(2, 1, 1)
  46. plt.plot(time, wave_data[:, 0])
  47. plt.xlabel("时间/s", fontproperties=font, fontsize=14)
  48. plt.ylabel("幅度", fontproperties=font, fontsize=14)
  49. plt.title("左声道", fontproperties=font, fontsize=14)
  50. plt.grid()  # 标尺

  51. plt.subplot(2, 1, 2)
  52. # 右声道波形
  53. plt.plot(time, wave_data[:, 1], c="g")
  54. plt.xlabel("时间/s", fontproperties=font, fontsize=14)
  55. plt.ylabel("幅度", fontproperties=font, fontsize=14)
  56. plt.title("右声道", fontproperties=font, fontsize=14)

  57. plt.tight_layout()  # 紧密布局
  58. plt.show()


复制代码




01.png (117.67 KB, 下载次数: 112)

01.png
让天下人人学会人工智能!人工智能的前景一片大好!
回复

使用道具 举报

0

主题

98

帖子

200

积分

中级会员

Rank: 3Rank: 3

积分
200
沙发
发表于 2021-11-23 19:28:44 | 只看该作者
让天下人人学会人工智能!人工智能的前景一片大好!
回复

使用道具 举报

0

主题

98

帖子

200

积分

中级会员

Rank: 3Rank: 3

积分
200
板凳
发表于 2021-11-23 19:30:14 | 只看该作者
让天下人人学会人工智能!人工智能的前景一片大好!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|人工智能工程师的摇篮 ( 湘ICP备2020019608号-1 )

GMT+8, 2024-4-26 00:40 , Processed in 0.195602 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表