读取 wav 格式声音文件
读取 wav 格式声音文件
http://bigsec.net/b52/scipydoc/wave_pyaudio.html
Python 支持 wav 文件的读写,实时的声音输入输出需要安装 pyAudio
,pyMedia
进行 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_data
的 sharp
之后:
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 格式声音文件相关推荐
- python用os.system打开wav文件_使用python读取wav格式文件
** 使用python读取wav格式文件 ** - 基本概念 [采样频率] 即取样频率, 指每秒钟取得声音样本的次数.采样频率越高,声音的质量也就越好,声音的还原也就越真实,但同时它占的资源比较多.由 ...
- RIFF格式声音文件的实现(转)
摘要:本文简述RIFF格式声音文件的构成,通过调用多媒体文件I/O的三个重要函数及WAVEFormatX结构数据的使用方法来实例阐述RIFF格式声音文件的实现过程. 关键词:RIFF[资源交换文件]格 ...
- ajax读取文件数据,Ajax 实现读取 properties 格式资源文件数据
Ajax 的核心是 JavaScript 对象 XmlHttpRequest.该对象在 Internet Explorer 5 中首次引入,它是一种支持异步请求的技术.简而言之,XmlHttpRequ ...
- Java读取UTF-8格式txt文件第一行出现乱码及解决;Java读带有BOM的UTF-8文件乱码原因及解决方法(转载)...
原文地址:http://blog.csdn.net/jackpk/article/details/5702964/ Java读取UTF-8的txt文件第一行出现乱码"?"及解决 t ...
- python读取.pkl格式的文件
运行代码工具jupyter notebook 读取文件放在运行目录下 #读取.pkl格式的文件 #读取.pkl格式的文件 import pickle path='test_keys.pkl' f=op ...
- java 录音并包装成wav格式的文件方法-与-WAV解析-大小端-寄存器!,提取wav数据音频,一篇讲完!
简单了解什么是WAV? 它是微软公司为Windows系统开发的一种标准的数字音频可,直接存储声音波形,并且它的波形曲线还原的真实感很好,但是也有缺点:存储磁盘空间大,多用于存储简短的声音片段. 是PC ...
- (原创)speex与wav格式音频文件的互相转换(二)
之前写过了如何将speex与wav格式的音频互相转换,如果没有看过的请看一下连接 http://www.cnblogs.com/dongweiq/p/4515186.html 虽然自己实现了相关的压缩 ...
- (原创)speex与wav格式音频文件的互相转换
我们的司信项目又有了新的需求,就是要做会议室.然而需求却很纠结,要继续按照原来发语音消息那样的形式来实现这个会议的功能,还要实现语音播放的计时,暂停,语音的拼接,还要绘制频谱图等等. 如果是wav,m ...
- Android 手机录制wav格式音频文件实现
上一篇文章已经实现了在Android手机上使用MediaRecorder录音,但是后期在处理这些音频文件的时候发现3gp格式的音频不大方便处理,使用wav格式的音频处理起来更方便一些! 这里需要用到A ...
- Android 读取csv格式数据文件
前言 什么是csv文件呢?百度百科上说 CSV是逗号分隔值文件格式,也有说是电子表格的,既然是电子表格,那么就可以用Excel打开,那为什么要在Android中来读取这个.csv格式的文件呢?因为现在 ...
最新文章
- file.delete删除不了文件_如何解决C盘莫名出现的msdia80.dll文件
- python dlib 的安装
- BCH压力测试即将开始,你确定不来凑凑热闹?
- 洛谷 - P1886 滑动窗口(单调队列/线段树)
- 关于反射Assembly.Load(程序集).CreateInstance(命名空间.类)
- IDEA常用快捷键大合集
- Spring中RedirectAttributes对象重定向传参
- Shell命令-线上查询及帮助之man、help
- VB图像识别、语音识别源代码+注释
- 平面向量内积坐标公式推导_平面向量内积的坐标运算与距离公式
- 多边形的凹凸性判断及python实现
- 分享几个边玩儿边学的游戏App,学习从未如此轻松有趣
- android 代码设置密码,android-如何在MIFARE Ultralight EV1标签上设置和取消设置密码?...
- 思考型人格分析,思考型人格的职业发展方向
- 如何把html文件格式转为视频格式,如何将qlv格式转换成mp4-太平洋软件资讯-太平洋电脑网...
- 用Springboot写饼状图
- 使用c#完成数据库的crud操作
- 免费的小程序微商城系统它不香吗?
- 如何写3DMAX的插件
- 美国零售业发展强劲:2019愿景向好?