python 修改wav音频的采样率 位数 通道数
2020-05-12 本文已影响0人
牛奶大泡芙
python中 我目前接触到的修改wav等音频文件的“采样率 位数 通道数”等参数的方法有两种
1、wave 读取文件
f = wave.open(audio_name, "wb")
# 配置声道数、量化位数和取样频率
f.setnchannels(1)
f.setsampwidth(2)
f.setframerate(16000)
# 将wav_data转换为二进制数据写入文件
f.writeframes(data)
f.close()
上面的data可以是读取一段音频获得的数据,再写入其他文件中,就达到了按照时间顺序截取音频的目的,但是一般这种操作的“setnchannels”、“setsampwidth”、“setframerate”最好和原文件一致,否则可能会出现音频的失真,获取原文件参数的代码如下:
f = wave.open(r"./xx/xx", "rb")
params = f.getparams()
2、sox
sox可以作为命令行工具使用,也可以安装好了之后在python代码中调用
我在测试过程中发现sox设置参数可以和原音频不同,输出的新wav文件仍然可以成功播放
在修改之前可以先利用sox查看一下音频文件的基本信息,然后再决定修改的操作:
sox -V xxx.wav -n
从命令行中可以得到结果:
sox: SoX v14.4.1
sox INFO formats: detected file format type `wav'
Input File : 'ok1.wav'
Channels : 1
Sample Rate : 16000
Precision : 16-bit
Duration : 00:00:50.00 = 800000 samples ~ 3750 CDDA sectors
File Size : 1.60M
Bit Rate : 256k
Sample Encoding: 16-bit Signed Integer PCM
Endian Type : little
Reverse Nibbles: no
Reverse Bits : no
Output File : '' (null)
Channels : 1
Sample Rate : 16000
Precision : 16-bit
Duration : 00:00:50.00 = 800000 samples ~ 3750 CDDA sectors
sox INFO sox: effects chain: input 16000Hz 1 channels
sox INFO sox: effects chain: output 16000Hz 1 channels
如果仍然需要修改的话,可以进行以下操作
import subprocess
# 复制一份wav文件保存audio_ok_name, 利用sox调整参数:通道-1 位-16 采样率-16k
subprocess.call(["sox {} -r 16000 -b 16 -c 1 {}".format(audio_name, audio_ok_name)], shell=True)
方法出自个人项目经历,如有失误,欢迎留言指正💗