转换音频采样率

批量转换音频采样率–用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
  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在Java中进行音频采样率转换可以使用javax.sound.sampled包中的类和接口来实现。具体的步骤如下: 1. 读取原始音频数据 使用AudioInputStream类读取原始音频数据,可以从本地文件、网络流或麦克风等不同的数据源中读取音频数据。 ```java AudioInputStream in = AudioSystem.getAudioInputStream(new File("input.wav")); ``` 2. 定义目标音频格式 定义目标音频格式,包括采样率、位深、声道数等属性。 ```java AudioFormat targetFormat = new AudioFormat(44100, 16, 2, true, false); ``` 3. 进行采样率转换 使用AudioSystem类中的getAudioInputStream方法将原始音频数据转换为目标格式的音频数据。 ```java AudioInputStream targetStream = AudioSystem.getAudioInputStream(targetFormat, in); ``` 4. 将转换后的音频数据写入输出文件 使用AudioSystem类将转换后的音频数据写入输出文件。 ```java AudioSystem.write(targetStream, AudioFileFormat.Type.WAVE, new File("output.wav")); ``` 完整代码示例: ```java import javax.sound.sampled.*; public class AudioSampleRateConverter { public static void main(String[] args) { try { // 1. 读取原始音频数据 AudioInputStream in = AudioSystem.getAudioInputStream(new File("input.wav")); // 2. 定义目标音频格式 AudioFormat targetFormat = new AudioFormat(44100, 16, 2, true, false); // 3. 进行采样率转换 AudioInputStream targetStream = AudioSystem.getAudioInputStream(targetFormat, in); // 4. 将转换后的音频数据写入输出文件 AudioSystem.write(targetStream, AudioFileFormat.Type.WAVE, new File("output.wav")); } catch (Exception e) { e.printStackTrace(); } } } ```

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值