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文件的读入的帧数、通道数、采样率都是一样的,说明程序运行成功。

  • 3
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
### 回答1: 要使用Python读写PCM WAV文件,可以使用Python的标准库中的`wave`模块。以下是一个简单的示例代码,可以帮助您读取和写入PCM WAV文件。 ```python import wave # 打开PCM WAV文件进行读取 with wave.open('input_file.wav', 'rb') as input_file: # 获取音频文件参数 sample_width = input_file.getsampwidth() # 样本宽度(以字节为单位) num_channels = input_file.getnchannels() # 声道数 sample_rate = input_file.getframerate() # 采样率 num_frames = input_file.getnframes() # 采样帧数 # 读取PCM数据 pcm_data = input_file.readframes(num_frames) # 打开PCM WAV文件进行写入 with wave.open('output_file.wav', 'wb') as output_file: # 设置音频文件参数 output_file.setsampwidth(sample_width) output_file.setnchannels(num_channels) output_file.setframerate(sample_rate) output_file.setnframes(num_frames) # 写入PCM数据 output_file.writeframes(pcm_data) ``` 在上述代码中,`wave`模块中的`open()`函数用于打开PCM WAV文件进行读取或写入。`'rb'`和`'wb'`参数分别表示读取和写入二进制文件。使用`get*()`方法可以获取音频文件的各种参数,如样本宽度、声道数、采样率和采样帧数等。使用`readframes()`和`writeframes()`方法可以读取和写入PCM数据。 ### 回答2: 在Python中,可以使用`wave`库来实现PCMWAV文件的读写。 首先,要读取PCM文件,需要使用`wave`库中的`open()`函数打开PCM文件,并利用`readframes()`函数读取PCM数据。具体的代码如下: ```python import wave pcm_file = wave.open('input.pcm', 'rb') # 获取PCM文件的参数 params = pcm_file.getparams() # 读取PCM数据 pcm_data = pcm_file.readframes(params.nframes) pcm_file.close() ``` 对于WAV文件的写入,同样需要使用`wave`库中的`open()`函数来打开新的WAV文件,并设置参数。然后使用`writeframes()`函数将PCM数据写入WAV文件中。具体的代码如下: ```python import wave pcm_file = wave.open('input.pcm', 'rb') wav_file = wave.open('output.wav', 'wb') # 设置WAV文件的参数 wav_file.setparams(pcm_file.getparams()) # 写入PCM数据到WAV文件 wav_file.writeframes(pcm_file.readframes(pcm_file.getnframes())) pcm_file.close() wav_file.close() ``` 以上就是使用Python实现PCMWAV文件的读写的方法。需要注意的是,读写前要先导入`wave`库,并且读取时需要注意PCM数据的编码格式。 ### 回答3: 在Python中,我们可以使用第三方库来实现PCM WAV文件的读写。下面是一个简单的例子: 1. 首先,我们需要安装`wave`库,它提供了WAV文件的读写功能。可以使用以下命令安装该库: ``` pip install wave ``` 2. 读取PCM WAV文件: ```python import wave # 打开PCM WAV文件 with wave.open("input.wav", "rb") as wav_file: # 获取音频参数 channels = wav_file.getnchannels() sample_width = wav_file.getsampwidth() sample_rate = wav_file.getframerate() num_frames = wav_file.getnframes() # 读取所有音频数据 frames = wav_file.readframes(num_frames) # 打印音频参数 print("Channels:", channels) print("Sample Width:", sample_width) print("Sample Rate:", sample_rate) # 将音频数据写入输出PCM WAV文件 with wave.open("output.wav", "wb") as wav_file: # 设置音频参数 wav_file.setnchannels(channels) wav_file.setsampwidth(sample_width) wav_file.setframerate(sample_rate) # 写入音频数据 wav_file.writeframes(frames) ``` 在上面的示例中,我们使用`wave.open()`函数打开PCM WAV文件,并使用`readframes()`方法读取所有音频数据。然后,我们可以使用`getnchannels()`、`getsampwidth()`和`getframerate()`方法获取音频参数,并使用`setnchannels()`、`setsampwidth()`和`setframerate()`方法设置输出文件的音频参数。最后,使用`writeframes()`方法将音频数据写入输出PCM WAV文件。 注意:在使用本示例代码之前,请确保你有一个名为`input.wav`的PCM WAV文件,并且它的参数与示例代码中的参数匹配。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值