读取 wav 格式声音文件

http://bigsec.net/b52/scipydoc/wave_pyaudio.html

Python 支持 wav 文件的读写,实时的声音输入输出需要安装 pyAudiopyMedia 进行 MP3 的解码和播放。

wav 是 Microsoft 开发的一种声音文件格式,通常被用来保存未压缩的声音数据 (Pulse Code Modulation,PCM,脉冲编码调制)。wav 有三个重要的参数:声道数、采样频率和量化位数。

声道数:单声道 (mono) 或者是双声道 (stereo)。
采样频率:每秒钟声音信号的采集次数。常用的有 8kHz、16kHz、32kHz、48kHz、11.025kHz、22.05kHz、44.1kHz 等。
量化位数:用多少 bit 表达一次采样所采集的数据,通常有 8bit、16bit、24bit 和 32bit 等。CD 中所储存的声音信号是双声道、44.1kHz、16bit。

如果你需要自己录制和编辑声音文件,推荐使用 Audacity。它是一款开源的、跨平台、多声道的录音编辑软件。在工作中使用 Audacity 进行声音信号的录制,然后再输出成 wav 文件供 Python 程序处理。

1. C:\Windows\media

(base) yongqiang@yongqiang:~$ cd /mnt/f/yongqiang_work/
(base) yongqiang@yongqiang:/mnt/f/yongqiang_work$ ll
total 260
drwxrwxrwx 1 yongqiang yongqiang   4096 Jun  4 00:47 ./
drwxrwxrwx 1 yongqiang yongqiang   4096 Jun  3 22:11 ../
-rwxrwxrwx 1 yongqiang yongqiang 191788 Sep 15  2018 Windows_Ding.wav*
-rwxrwxrwx 1 yongqiang yongqiang  70060 Sep 15  2018 ding.wav*
(base) yongqiang@yongqiang:/mnt/f/yongqiang_work$
(base) yongqiang@yongqiang:/mnt/f/yongqiang_work$ pwd
/mnt/f/yongqiang_work
(base) yongqiang@yongqiang:/mnt/f/yongqiang_work$

2. 读 wav 格式声音文件

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# yongqiang chengfrom __future__ import absolute_import
from __future__ import division
from __future__ import print_functionimport wave
import numpy as np# WAV file
audio_file = "/mnt/f/yongqiang_work/ding.wav"
object = wave.open(audio_file, "rb")# (nchannels, sampwidth, framerate, nframes, comptype, compname)
params = object.getparams()
nchannels, sampwidth, framerate, nframes, comptype, compname = params[:6]
print("nchannels = ", nchannels)
print("sampwidth = ", sampwidth)
print("framerate = ", framerate)
print("nframes = ", nframes)
print("comptype = ", comptype)
print("compname = ", compname)# Returns number of audio channels (1 for mono, 2 for stereo).
print("object.getnchannels() = ", object.getnchannels())# Returns sample width in bytes.
print("object.getsampwidth() = ", object.getsampwidth())# Returns sampling frequency.
print("object.getframerate() = ", object.getframerate())# Returns number of audio frames.
print("object.getnframes() = ", object.getnframes())# Returns compression type ('NONE' is the only supported type).
print("object.getcomptype() = ", object.getcomptype())# Human-readable version of getcomptype(). Usually 'not compressed' parallels 'NONE'.
print("object.getcompname() = ", object.getcompname())# Reads and returns at most n frames of audio, as a bytes object.
str_data = object.readframes(nframes)
object.close()
/home/yongqiang/miniconda3/envs/tf_cpu_1.4.1/bin/python /home/yongqiang/pycharm_work/yongqiang.py
nchannels =  2
sampwidth =  2
framerate =  44100
nframes =  17504
comptype =  NONE
compname =  not compressed
object.getnchannels() =  2
object.getsampwidth() =  2
object.getframerate() =  44100
object.getnframes() =  17504
object.getcomptype() =  NONE
object.getcompname() =  not compressedProcess finished with exit code 0

3. 读 wav 格式声音文件

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# yongqiang chengfrom __future__ import absolute_import
from __future__ import division
from __future__ import print_functionimport wave
import numpy as np
import matplotlib.pyplot as plt# WAV file
audio_file = "/mnt/f/yongqiang_work/ding.wav"
object = wave.open(audio_file, "rb")# (nchannels, sampwidth, framerate, nframes, comptype, compname)
params = object.getparams()
nchannels, sampwidth, framerate, nframes, comptype, compname = params[:6]
print("nchannels =", nchannels)
print("sampwidth =", sampwidth)
print("framerate =", framerate)
print("nframes =", nframes)
print("comptype =", comptype)
print("compname =", compname)# Returns number of audio channels (1 for mono, 2 for stereo).
print("object.getnchannels() =", object.getnchannels())# Returns sample width in bytes.
print("object.getsampwidth() =", object.getsampwidth())# Returns sampling frequency.
print("object.getframerate() =", object.getframerate())# Returns number of audio frames.
print("object.getnframes() =", object.getnframes())# Returns compression type ('NONE' is the only supported type).
print("object.getcomptype() =", object.getcomptype())# Human-readable version of getcomptype(). Usually 'not compressed' parallels 'NONE'.
print("object.getcompname() =", object.getcompname())# Reads and returns at most n frames of audio, as a bytes object.
str_data = object.readframes(nframes)
# nframes = 17504,  channels = 2, sampwidth = 2
# str_data (bytes: 70016) = nframes * channels * sampwidth = 17504 * 2 * 2 = 70016
object.close()wave_data = np.fromstring(str_data, dtype=np.short)
wave_data.shape = -1, 2
wave_data = wave_data.T
time = np.arange(0, nframes) * (1.0 / framerate)plt.subplot(211)
plt.plot(time, wave_data[0])
plt.xlabel("left channel - time (seconds)")
plt.subplot(212)
plt.plot(time, wave_data[1], c="g")
plt.xlabel("right channel - time (seconds)")
plt.show()
/home/yongqiang/miniconda3/envs/pt-1.4_py-3.6/bin/python /home/yongqiang/pycharm_work/yongqiang.py
nchannels = 2
sampwidth = 2
framerate = 44100
nframes = 17504
comptype = NONE
compname = not compressed
object.getnchannels() = 2
object.getsampwidth() = 2
object.getframerate() = 44100
object.getnframes() = 17504
object.getcomptype() = NONE
object.getcompname() = not compressedProcess finished with exit code 0

Python 调用 wave.open 打开 wav 文件,注意需要使用 "rb" (二进制模式) 打开文件:

audio_file = "/mnt/f/yongqiang_work/ding.wav"
object = wave.open(audio_file, "rb")

open 返回一个 Wave_read 类的实例,通过调用它的方法读取 wav 文件的格式和数据:

getparams:一次性返回所有的 wav 文件的格式信息,它返回的是一个组元 (tuple):声道数,量化位数 (byte 单位),采样频率,采样点数,压缩类型,压缩类型的描述。wave 模块只支持非压缩的数据,因此可以忽略最后两个信息。

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

nchannels, sampwidth, framerate, nframes, comptype, compname 等方法可以单独返回 wav 文件的特定的信息。

readframes:读取声音数据,传递一个参数指定需要读取的长度 (以取样点为单位),readframes 返回的是二进制数据 (bytes),在 Python 中用字符串表示二进制数据。

# Reads and returns at most n frames of audio, as a bytes object.
str_data = object.readframes(nframes)
# nframes = 17504,  channels = 2, sampwidth = 2
# str_data (bytes: 70016) = nframes * channels * sampwidth = 17504 * 2 * 2 = 70016

接下来需要根据声道数和量化单位,将读取的二进制数据转换为一个可以计算的数组:

wave_data = np.fromstring(str_data, dtype=np.short)

通过 fromstring 函数将字符串转换为数组,通过其参数 dtype 指定转换后的数据格式,由于我们的声音格式是以两个字节表示一个取样值,因此采用 short 数据类型转换。现在得到的 wave_data 是一个一维的 short 类型的数组,但是因为我们的声音文件是双声道的,因此它由左右两个声道的取样交替构成:LRLRLRLR....LR (L 表示左声道的取样值,R 表示右声道取样值)。修改wave_datasharp 之后:

wave_data.shape = -1, 2

将其转置得到:

wave_data = wave_data.T

最后通过取样点数和取样频率计算出每个取样的时间:

time = np.arange(0, nframes) * (1.0 / framerate)

4. sample width in bytes

#!/usr/bin/env python
# -*- coding: utf-8 -*-
# yongqiang chengfrom __future__ import absolute_import
from __future__ import division
from __future__ import print_functionimport wave
import numpy as np
import matplotlib.pyplot as plt# WAV file
audio_file = "/mnt/f/yongqiang_work/ding.wav"
object = wave.open(audio_file, "rb")# (nchannels, sampwidth, framerate, nframes, comptype, compname)
params = object.getparams()
nchannels, sampwidth, framerate, nframes, comptype, compname = params[:6]
print("nchannels =", nchannels)
print("sampwidth =", sampwidth)
print("framerate =", framerate)
print("nframes =", nframes)
print("comptype =", comptype)
print("compname =", compname)# Returns number of audio channels (1 for mono, 2 for stereo).
print("object.getnchannels() =", object.getnchannels())# Returns sample width in bytes.
print("object.getsampwidth() =", object.getsampwidth())# Returns sampling frequency.
print("object.getframerate() =", object.getframerate())# Returns number of audio frames.
print("object.getnframes() =", object.getnframes())# Returns compression type ('NONE' is the only supported type).
print("object.getcomptype() =", object.getcomptype())# Human-readable version of getcomptype(). Usually 'not compressed' parallels 'NONE'.
print("object.getcompname() =", object.getcompname())# Reads and returns at most n frames of audio, as a bytes object.
str_data = object.readframes(nframes)
# nframes = 17504,  channels = 2, sampwidth = 2
# str_data (bytes: 70016) = nframes * channels * sampwidth = 17504 * 2 * 2 = 70016
num_bytes = len(str_data) # num_bytes = 70016
print("num_bytes =", num_bytes, "bytes")
object.close()wave_data = np.fromstring(str_data, dtype=np.short)
wave_data.shape = -1, 2
wave_data = wave_data.T
time = np.arange(0, nframes) * (1.0 / framerate)plt.subplot(211)
plt.plot(time, wave_data[0])
plt.xlabel("left channel - time (seconds)")
plt.subplot(212)
plt.plot(time, wave_data[1], c="g")
plt.xlabel("right channel - time (seconds)")
plt.show()
/home/yongqiang/miniconda3/envs/pt-1.4_py-3.6/bin/python /home/yongqiang/pytorch_work/end2end-asr-pytorch-example/yongqiang.py
nchannels = 2
sampwidth = 2
framerate = 44100
nframes = 17504
comptype = NONE
compname = not compressed
object.getnchannels() = 2
object.getsampwidth() = 2
object.getframerate() = 44100
object.getnframes() = 17504
object.getcomptype() = NONE
object.getcompname() = not compressed
num_bytes = 70016 bytesProcess finished with exit code 0

References

http://bigsec.net/b52/scipydoc/wave_pyaudio.html

读取 wav 格式声音文件相关推荐

  1. python用os.system打开wav文件_使用python读取wav格式文件

    ** 使用python读取wav格式文件 ** - 基本概念 [采样频率] 即取样频率, 指每秒钟取得声音样本的次数.采样频率越高,声音的质量也就越好,声音的还原也就越真实,但同时它占的资源比较多.由 ...

  2. RIFF格式声音文件的实现(转)

    摘要:本文简述RIFF格式声音文件的构成,通过调用多媒体文件I/O的三个重要函数及WAVEFormatX结构数据的使用方法来实例阐述RIFF格式声音文件的实现过程. 关键词:RIFF[资源交换文件]格 ...

  3. ajax读取文件数据,Ajax 实现读取 properties 格式资源文件数据

    Ajax 的核心是 JavaScript 对象 XmlHttpRequest.该对象在 Internet Explorer 5 中首次引入,它是一种支持异步请求的技术.简而言之,XmlHttpRequ ...

  4. Java读取UTF-8格式txt文件第一行出现乱码及解决;Java读带有BOM的UTF-8文件乱码原因及解决方法(转载)...

    原文地址:http://blog.csdn.net/jackpk/article/details/5702964/ Java读取UTF-8的txt文件第一行出现乱码"?"及解决 t ...

  5. python读取.pkl格式的文件

    运行代码工具jupyter notebook 读取文件放在运行目录下 #读取.pkl格式的文件 #读取.pkl格式的文件 import pickle path='test_keys.pkl' f=op ...

  6. java 录音并包装成wav格式的文件方法-与-WAV解析-大小端-寄存器!,提取wav数据音频,一篇讲完!

    简单了解什么是WAV? 它是微软公司为Windows系统开发的一种标准的数字音频可,直接存储声音波形,并且它的波形曲线还原的真实感很好,但是也有缺点:存储磁盘空间大,多用于存储简短的声音片段. 是PC ...

  7. (原创)speex与wav格式音频文件的互相转换(二)

    之前写过了如何将speex与wav格式的音频互相转换,如果没有看过的请看一下连接 http://www.cnblogs.com/dongweiq/p/4515186.html 虽然自己实现了相关的压缩 ...

  8. (原创)speex与wav格式音频文件的互相转换

    我们的司信项目又有了新的需求,就是要做会议室.然而需求却很纠结,要继续按照原来发语音消息那样的形式来实现这个会议的功能,还要实现语音播放的计时,暂停,语音的拼接,还要绘制频谱图等等. 如果是wav,m ...

  9. Android 手机录制wav格式音频文件实现

    上一篇文章已经实现了在Android手机上使用MediaRecorder录音,但是后期在处理这些音频文件的时候发现3gp格式的音频不大方便处理,使用wav格式的音频处理起来更方便一些! 这里需要用到A ...

  10. Android 读取csv格式数据文件

    前言 什么是csv文件呢?百度百科上说 CSV是逗号分隔值文件格式,也有说是电子表格的,既然是电子表格,那么就可以用Excel打开,那为什么要在Android中来读取这个.csv格式的文件呢?因为现在 ...

最新文章

  1. file.delete删除不了文件_如何解决C盘莫名出现的msdia80.dll文件
  2. python dlib 的安装
  3. BCH压力测试即将开始,你确定不来凑凑热闹?
  4. 洛谷 - P1886 滑动窗口(单调队列/线段树)
  5. 关于反射Assembly.Load(程序集).CreateInstance(命名空间.类)
  6. IDEA常用快捷键大合集
  7. Spring中RedirectAttributes对象重定向传参
  8. Shell命令-线上查询及帮助之man、help
  9. VB图像识别、语音识别源代码+注释
  10. 平面向量内积坐标公式推导_平面向量内积的坐标运算与距离公式
  11. 多边形的凹凸性判断及python实现
  12. 分享几个边玩儿边学的游戏App,学习从未如此轻松有趣
  13. android 代码设置密码,android-如何在MIFARE Ultralight EV1标签上设置和取消设置密码?...
  14. 思考型人格分析,思考型人格的职业发展方向
  15. 如何把html文件格式转为视频格式,如何将qlv格式转换成mp4-太平洋软件资讯-太平洋电脑网...
  16. 用Springboot写饼状图
  17. 使用c#完成数据库的crud操作
  18. 免费的小程序微商城系统它不香吗?
  19. 如何写3DMAX的插件
  20. 美国零售业发展强劲:2019愿景向好?

热门文章

  1. 《算法笔记》胡凡 例题/练习 答案
  2. UDS协议(车辆控制单元诊断系统开发架构及DID读取数据流程)
  3. css设置背景透明度
  4. java求职英文简历范本2篇_JAVA英文求职简历范文
  5. 正点原子STM32F103学习笔记(一)
  6. Polar SI9000-PCB阻抗计算
  7. linux的源码安装步骤(以安装nginx为例)
  8. Excel 闪退及老是提示内存不足情况实测解决方法
  9. npm下载报错npm ERR code ERESOLVE
  10. 大象装企营销:装饰公司如何通过差异化营销传播口碑