前言
本文主要记录python下音频常用的操作,以.wav格式文件为例。其实网上有很多现成的音频工具包,如果仅仅调用,工具包是更方便的。
1、批量读取.wav文件名:
1 2 3 4 5 6 |
import os filepath = "./data/" #添加路径 filename = os.listdir(filepath) #得到文件夹下的所有文件名称 for file in filename: print (filepath + file ) |
这里用到字符串路径:
1.通常意义字符串(str)
2.原始字符串,以大写R 或 小写r开始,r'',不对特殊字符进行转义
3.Unicode字符串,u'' basestring子类
如:
1 2 3 |
path = './file/n' path = r '.\file\n' path = '.\\file\\n' |
三者等价,右划线\为转义字符,引号前加r表示原始字符串,而不转义(r:raw string).
常用获取帮助的方式:
>>> help(str)
>>> dir(str)
>>> help(str.replace)
2、读取.wav文件
wave.open 用法:
mode可以是:
‘rb’,读取文件;
‘wb’,写入文件;
不支持同时读/写操作。
Wave_read.getparams用法:
1 2 3 |
f = wave. open ( file , 'rb' ) params = f.getparams() nchannels, sampwidth, framerate, nframes = params[: 4 ] |
其中最后一行为常用的音频参数:
nchannels:声道数
sampwidth:量化位数(byte)
framerate:采样频率
nframes:采样点数
对应code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
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" ) plt.grid( 'on' ) #标尺,on:有,off:无。 |
结果图:
这里通道数为3,主要借助np.reshape一下,其他同单通道处理完全一致,对应code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
# -*- 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
|