批量转换音频采样率–用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
Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐