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)

方法出自个人项目经历,如有失误,欢迎留言指正💗

上一篇 下一篇

猜你喜欢

热点阅读