python脚本同时读入pcm文件和wav文件

前言

在客户调用我们的测试脚本的时候,遇到了这么一个问题,有的客户的智能音箱使用tinycap/arecord录音时,录出的音频是pcm格式,不是wav格式。而我的测试脚本只支持wav格式,这就需要客户将pcm文件转为wav文件。然后,有些客户是真的不会用Audition(这是真事)。因此,写了一个可以同时支持读取pcm文件和wav文件的脚本。

这个脚本最主要的就是用到了python的try函数。下面就先来讲一下try函数。

什么是try函数

try/except语句用来检测try语句块中的错误,从而让except语句捕获异常信息并处理。 如果你不想在异常发生时结束你的程序,只需在try里捕获它。

简单来讲,就是try模块中语句如果出现异常或报错,程序就会转而执行except模块,;如果try模块正常执行没有报错,则不会执行except模块。如果在try子句执行时没有发生异常,python将执行else语句后的语句(如果有else的话)。用代码表示就是:

try:
<语句A>        #如果运行A正常,则正常执行
except<语句B>        #如果运行A报错,转而运行B
else:
<语句C>        #如果A正常执行,执行C,通常用于打印

所以,用于测试脚本的思路就是:

try:
<读取wav格式文件>            #如果运行正常,则读入wav文件数据
except<读取pcm格式文件>            #如果运行try报错,则读入pcm文件数据
else:
<print('读入wav文件!')>     #用于打印try结果,可不添加

脚本实现

接下来就是代码实现过程。python中读入wav和读入pcm原理不一样,调用wave库可以直接读取wav格式的采样率、比特数、通道数等,但是读取pcm格式是读入一组数据,然后输入通道数再重组合为n通道数据。因此,读取pcm文件需要多一个输入参数:channels。

另,很多同学读入pcm文件喜欢使用AudioSegment库,AudioSegment的优势是代码量少。我个人喜欢使用wave库,尽管会麻烦一些,但是熟练了以后可以保证数据准确性。AudioSegment读取pcm格式文件过程如下:

#pcm数据可以这样读取
from pydub import AudioSegment
import numpy as np
pcm_path = 'xxx.pcm' 
voice_data = AudioSegment.from_file(file=pcm_path,sample_width=2, frame_rate=16000,channels=1,) 
pcm_data = np.array(voice_data.get_array_of_samples())
pcm_data = pcm_data/32768.0

我的测试脚本使用的都是wave库,读取pcm代码如下:

pcmf = open(f, 'rb')
pcmdata = pcmf.read()
pcmf.close()
wavfile = wave.open(r'save_file.wav', 'wb')
wavfile.setnchannels(channels)
wavfile.setsampwidth(2)
wavfile.setframerate(16000)
wavfile.writeframes(pcmdata)
wavfile.close()
wavread = wave.open(r'save_file.wav','rb')
fs = wavread.getframerate() #sampling freqency
Nwavlen = wavread.getnframes() #num of total audio data points
Nchannel = wavread.getnchannels() #num of channels
wav_str = wavread.readframes(Nwavlen)
wav_int = np.frombuffer(wav_str, dtype=np.int16)
wav_data = np.reshape(wav_int,[Nwavlen,Nchannel]) #audio data on channels
wav_data = wav_data/2**15
print('fs',fs)
print('wav_data',wav_data.shape)
print('读入pcm文件!')

整个脚本最终显示结果如下:
读入wav文件:
在这里插入图片描述
读入pcm文件:

可以看到,wav文件和pcm文件的读入的帧数、通道数、采样率都是一样的,说明程序运行成功。

你可能感兴趣的:(python,人工智能)