当前位置: 首页 > 编程笔记 >

Python对wav文件的重采样实例

柯乐童
2023-03-14
本文向大家介绍Python对wav文件的重采样实例,包括了Python对wav文件的重采样实例的使用技巧和注意事项,需要的朋友参考一下

例如从2channel,4.41k hz 重采样到 1 channel,16k hz

def downsampleWav(src, dst, inrate=44100, outrate=16000, inchannels=2, outchannels=1):
 import os,wave,audioop
 if not os.path.exists(src):
  print ('Source not found!')
  return False
 
 if not os.path.exists(os.path.dirname(dst)):
  os.makedirs(os.path.dirname(dst))
 
 try:
  s_read = wave.open(src, 'r')
  s_write = wave.open(dst, 'w')
 except:
  print ('Failed to open files!')
  return False
 
 n_frames = s_read.getnframes()
 data = s_read.readframes(n_frames)
 
 try:
  converted = audioop.ratecv(data, 2, inchannels, inrate, outrate, None)
  if outchannels == 1:
   converted = audioop.tomono(converted[0], 2, 1, 0)
 except:
  print ('Failed to downsample wav')
  return False
 
 try:
  s_write.setparams((outchannels, 2, outrate, 0, 'NONE', 'Uncompressed'))
  s_write.writeframes(converted)
 except:
  print ('Failed to write wav')
  return False
 
 try:
  s_read.close()
  s_write.close()
 except:
  print ('Failed to close wav files')
  return False
 
 return True
 

若in和out都是单通道:

def downsampleWav(src, dst, inrate=48000, outrate=16000, inchannels=1, outchannels=1):
 import os,wave,audioop
 if not os.path.exists(src):
  print ('Source not found!')
  return False
 
 if not os.path.exists(os.path.dirname(dst)):
  os.makedirs(os.path.dirname(dst))
 
 try:
  s_read = wave.open(src, 'rb')
  params = s_read.getparams()
  nchannels, sampwidth, framerate, nframes = params[:4]
  print(nchannels,sampwidth, framerate,nframes)
  s_write = wave.open(dst, 'wb')
 except:
  print ('Failed to open files!')
  return False
 
 n_frames = s_read.getnframes()
 data = s_read.readframes(n_frames)
 
 try:
  converted = audioop.ratecv(data, 2, inchannels, inrate, outrate, None)
  if outchannels == 1 and inchannels != 1:
   converted = audioop.tomono(converted[0], 2, 1, 0)
 except:
  print ('Failed to downsample wav')
  return False
 
 try:
  s_write.setparams((outchannels, 2, outrate, 0, 'NONE', 'Uncompressed'))
  s_write.writeframes(converted[0])
 except Exception as e:
  print(e)
  print ('Failed to write wav')
  return False
 
 try:
  s_read.close()
  s_write.close()
 except:
  print ('Failed to close wav files')
  return False
 
 return True

方案二

y为下采样的结果,类型np.ndarray

You can use Librosa's load() function,

import librosa
y, s = librosa.load('test.wav', sr=8000) # Downsample 44.1kHz to 8kHz

The extra effort to install Librosa is probably worth the peace of mind.

Pro-tip: when installing Librosa on Anaconda, you need to install ffmpeg as well, so

pip install librosa
conda install -c conda-forge ffmpeg

以上这篇Python对wav文件的重采样实例就是小编分享给大家的全部内容了,希望能给大家一个参考,也希望大家多多支持小牛知识库。

 类似资料:
  • 问题内容: 嗨,我需要将wav音频文件的采样率从44.1kHz下采样到8kHz。我必须使用字节数组手动完成所有工作…这是出于学术目的。 我目前正在使用2个类(接收器和源)来弹出和推送字节数组。一切顺利,直到到达需要使用线性插值对数据块进行下采样的部分为止。 由于我是从44100降采样到8000 Hz,因此我该如何插入一个包含约128000000字节的字节数组?现在,我弹出5、6或7个字节,具体取决

  • 本文向大家介绍python wav模块获取采样率 采样点声道量化位数(实例代码),包括了python wav模块获取采样率 采样点声道量化位数(实例代码)的使用技巧和注意事项,需要的朋友参考一下 安装: pip install wave 在wav 模块中 ,主要介绍一种方法:getparams(),该方法返回的结果如下: 参数解释: nchannels:声道数 sampwidth:量化位数(byt

  • 我正在尝试用Python以编程方式拆分wav文件。基于stackoverflow的提示以及Python wave模块的文档,我将执行以下操作 我迭代了许多不同的起始值和结束值,并以这种方式从原始文件中提取音频块。奇怪的是,这种技术对某些块非常有效,而对其他块产生垃圾白噪声。此外,没有明显的模式表明起始位置和结束位置会产生白噪声,只是输入文件会持续产生白噪声。 有人以前经历过这种行为吗?或者知道我做

  • 主要内容:降采样,升采样,频率转换,插值处理数据重采样是将时间序列从一个频率转换至另一个频率的过程,它主要有两种实现方式,分别是降采样和升采样,降采样指将高频率的数据转换为低频率,升采样则与其恰好相反,说明如下: 方法 说明 降采样 将高频率(间隔短)数据转换为低频率(间隔长)。 升采样 将低频率数据转换为高频率。 Pandas 提供了 resample() 函数来实现数据的重采样。 降采样 通过 resample() 函数完成数据的降采样

  • 本文向大家介绍基于Python 的语音重采样函数解析,包括了基于Python 的语音重采样函数解析的使用技巧和注意事项,需要的朋友参考一下 因为工作中会经常遇到不同采样率的声音文件的问题,特意写了一下重采样的程序。 原理就是把采样点转换到时间刻度之后再进行插值,经过测试,是没有问题的。 补充知识:Python 多线程的退出/停止的一种是实现思路 在使用多线程的过程中,我们知道,python的线程是

  • 问题内容: 我尝试pygame播放wav文件,如下所示: 但是它改变了声音,我不知道为什么!我阅读了此链接解决方案,但无法解决播放wave文件的问题! 对于此解决方案,我不知道应该导入什么? 对于这个解决方案/ dev / dsp在新版本的linux中不存在: 而当我尝试pyglet它给我这个错误: 问题答案: 您可以使用PyAudio。我的Linux上的一个示例可以正常工作: