python⾳频处理⽤到的操作的⽰例代码
前⾔
本⽂主要记录python下⾳频常⽤的操作,以.wav格式⽂件为例。其实⽹上有很多现成的⾳频⼯具包,如果仅仅调⽤,⼯具包是更⽅便的。
更多pyton下的操作可以参考:
1、批量读取.wav⽂件名:
这⾥⽤到字符串路径:
1.通常意义字符串(str)
2.原始字符串,以⼤写R 或⼩写r开始,r'',不对特殊字符进⾏转义
3.Unicode字符串,u'' basestring⼦类
如:
path = './file/n'
path = r'.\file\n'
path = '.\\file\\n'
三者等价,右划线\为转义字符,引号前加r表⽰原始字符串,⽽不转义(r:raw string).
常⽤获取帮助的⽅式:
>>> help(str)
>>> dir(str)
>>> place)
2、读取.wav⽂件
wave.open ⽤法:
wave.open(file,mode)
mode可以是:
‘rb',读取⽂件;
‘wb',写⼊⽂件;
不⽀持同时读/写操作。
params⽤法:
f = wave.open(file,'rb')
params = f.getparams()
nchannels, sampwidth, framerate, nframes = params[:4]
其中最后⼀⾏为常⽤的⾳频参数:
1. nchannels:声道数
2. sampwidth:量化位数(byte)
3. framerate:采样频率
4. nframes:采样点数
单通道
对应code:
import wave
import matplotlib.pyplot as plt
import numpy as np
import os
filepath = "./data/" #添加路径
filename= os.listdir(filepath) #得到⽂件夹下的所有⽂件名称
f = wave.open(filepath+filename[1],'rb')
params = f.getparams()
nchannels, sampwidth, framerate, nframes = params[:4]
strData = f.readframes(nframes)#读取⾳频,字符串格式
waveData = np.fromstring(strData,dtype=np.int16)#将字符串转化为int
waveData = waveData*1.0/(max(abs(waveData)))#wave幅值归⼀化
# plot the wave
time = np.arange(0,nframes)*(1.0 / framerate)
plt.plot(time,waveData)
plt.xlabel("Time(s)")
plt.ylabel("Amplitude")
plt.title("Single channel wavedata")
结果图:
多通道
这⾥通道数为3,主要借助np.reshape⼀下,其他同单通道处理完全⼀致,对应code: # -*- coding: utf-8 -*-
"""
Created on Wed May 3 12:15:34 2017
@author: Nobleding
"""
import wave
import matplotlib.pyplot as plt
import numpy as np
import os
filepath = "./data/" #添加路径
filename= os.listdir(filepath) #得到⽂件夹下的所有⽂件名称
f = wave.open(filepath+filename[0],'rb')
params = f.getparams()
nchannels, sampwidth, framerate, nframes = params[:4]
strData = f.readframes(nframes)#读取⾳频,字符串格式waveData = np.fromstring(strData,dtype=np.int16)#将字符串转化为int waveData = waveData*1.0/(max(abs(waveData)))#wave幅值归⼀化waveData = np.reshape(waveData,[nframes,nchannels])
f.close()
# plot the wave
time = np.arange(0,nframes)*(1.0 / framerate)
plt.figure()
plt.subplot(5,1,1)
plt.plot(time,waveData[:,0])
plt.xlabel("Time(s)")
plt.ylabel("Amplitude")
plt.title("Ch-1 wavedata")
plt.subplot(5,1,3)
plt.plot(time,waveData[:,1])
plt.xlabel("Time(s)")
plt.ylabel("Amplitude")
plt.title("Ch-2 wavedata")
plt.subplot(5,1,5)
plt.plot(time,waveData[:,2])
plt.xlabel("Time(s)")
python新手代码示例
plt.ylabel("Amplitude")
plt.title("Ch-3 wavedata")
plt.show()
效果图:
单通道为多通道的特例,所以多通道的读取⽅式对任意通道wav⽂件都适⽤。需要注意的是,waveData在reshape之后,与之前的数据结构是不同的。即waveData[0]等价于reshape之前的waveData,但不影响绘图分析,只是在分析频谱时才有必要考虑这⼀点。
3、wav写⼊
涉及到的主要指令有三个:
参数设置:
nchannels = 1 #单通道为例
sampwidth = 2
fs = 8000
data_size = len(outData)
framerate = int(fs)
nframes = data_size
comptype = "NONE"
compname = "not compressed"
outwave.setparams((nchannels, sampwidth, framerate, nframes, comptype, compname))
待写⼊wav⽂件的存储路径及⽂件名:
outfile = filepath+'out1.wav'
outwave = wave.open(outfile, 'wb')#定义存储路径以及⽂件名
数据的写⼊:
for v in outData:
outwave.writeframes(struct.pack('h', int(v * 64000 / 2)))#outData:16位,-32767~32767,注意不要溢出
单通道数据写⼊:
import wave
#import matplotlib.pyplot as plt
import numpy as np
import os
import struct
#wav⽂件读取
filepath = "./data/" #添加路径
filename= os.listdir(filepath) #得到⽂件夹下的所有⽂件名称
f = wave.open(filepath+filename[1],'rb')
params = f.getparams()
nchannels, sampwidth, framerate, nframes = params[:4]
strData = f.readframes(nframes)#读取⾳频,字符串格式
waveData = np.fromstring(strData,dtype=np.int16)#将字符串转化为int
waveData = waveData*1.0/(max(abs(waveData)))#wave幅值归⼀化
f.close()
#wav⽂件写⼊
outData = waveData#待写⼊wav的数据,这⾥仍然取waveData数据
outfile = filepath+'out1.wav'
outwave = wave.open(outfile, 'wb')#定义存储路径以及⽂件名
nchannels = 1
sampwidth = 2
fs = 8000
data_size = len(outData)
framerate = int(fs)
nframes = data_size
comptype = "NONE"
compname = "not compressed"
outwave.setparams((nchannels, sampwidth, framerate, nframes,
comptype, compname))
for v in outData:
outwave.writeframes(struct.pack('h', int(v * 64000 / 2)))#outData:16位,-32767~32767,注意不要溢出
outwave.close()
多通道数据写⼊:
多通道的写⼊与多通道读取类似,多通道读取是将⼀维数据reshape为⼆维,多通道的写⼊是将⼆维的数据reshape为⼀维,其实就是⼀个逆向的过程:
import wave
#import matplotlib.pyplot as plt
import numpy as np
import os
import struct
#wav⽂件读取
filepath = "./data/" #添加路径
filename= os.listdir(filepath) #得到⽂件夹下的所有⽂件名称
f = wave.open(filepath+filename[0],'rb')
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论