批量转换音频采样率–用sox
在处理音频数据中,常见到16000Hz ,22050Hz, 48000Hz等音频数据,不同的模型需要不同采样率,因此需要批量转换。
比如,现有音频,查看采样率:
若没有sox,下载地址 https://sourceforge.net/projects/sox/files/sox/
sox --i 000030.wav
出现下图,
要转成22050.
方法一:
想到librosa里的resample函数:
import librosa
import os
from tqdm import tqdm
path = "D:\练习\Wave"
list = os.listdir(path)[:-1]
for i in tqdm(list):
y, sr = librosa.load(path + i, sr=48000)
y_16 = librosa.resample(y, sr, 22050)
librosa.output.write_wav(path + i, y_16, 22050)
可看转换后结果:
采样率是变了,但精度没变成16bit,还是原来的24bit
可以送进去模型,但是模型识别不出来它的梅尔谱图
方法二:
写一个脚本,保存为.sh文件,然后就在cmd里调用,即直接输入脚本名称.sh,回车:
for %i in (*.wav) do
"H:\sox\sox-14-4-2\sox.exe" %i
-r 22050
D:\练习\sox\%i
结果:
方法三:
还可以使用scipy库
打开原始音频文件,读取数据和采样率
import wave
# 打开音频文件
with wave.open('input.wav', 'rb') as wav_file:
# 获取音频文件的参数
params = wav_file.getparams()
# 获取采样率和采样数据
rate = wav_file.getframerate()
data = wav_file.readframes(params[3])
使用scipy库的resample函数:
from scipy.signal import resample
# 将采样率转换为 16K
new_rate = 16000
data = resample(data, int(len(data) * new_rate / rate))
保存:
# 创建新的音频文件
with wave.open('output.wav', 'wb') as wav_file:
# 设置音频参数
wav_file.setparams(params)
wav_file.setframerate(new_rate)
# 将转换后的采样数据写入文件中
wav_file.writeframes(data)
方法四:
ffmpeg库
import ffmpeg
ffmpeg.input('input.mp3').output('output.mp3', ar=16000).run()
方法五:
pydub库:
from pydub import AudioSegment as am
sound = am.from_file(filepath, format='wav', frame_rate=22050)
sound = sound.set_frame_rate(16000)
sound.export(filepath, format='wav')
方法六:
有人自己写的函数:
def Resample(input_signal,src_fs,tar_fs):
'''
:param input_signal:输入信号
:param src_fs:输入信号采样率
:param tar_fs:输出信号采样率
:return:输出信号
'''
dtype = input_signal.dtype
audio_len = len(input_signal)
audio_time_max = 1.0*(audio_len-1) / src_fs
src_time = 1.0 * np.linspace(0,audio_len,audio_len) / src_fs
tar_time = 1.0 * np.linspace(0,np.int(audio_time_max*tar_fs),np.int(audio_time_max*tar_fs)) / tar_fs
output_signal = np.interp(tar_time,src_time,input_signal).astype(dtype)
return output_signal