添加链接
link之家
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接

在语音处理中,音频文件读写是基本操作。
然而读写方式乃至归一化处理的多样化,有可能导致后续处理的偏差乃至错误。
本文汇集实践中所遇的一些方法,并参考了其他文章,确保读写操作的准确性和一致性。

本文以实践中常见的音频文件参数(wav格式,PCM编码,单通道,采样率16KHz,位深16bit)为例,如果参数不同需做对应调整。

一. 文件读取

1. librosa

  import librosa
  wav_path=''
  sample_rate=16000
  data = librosa.core.load(wav_path, sr=sample_rate)[0]
  print(type(data)) #<class 'numpy.ndarray'>

返回的数组数据类型为float32,数据大小位于(-1,1)之间。该接口内部其实是调用soundfile实现,和方法2类似。

2. soundfile

  import soundfile as sf
  wav_path=''
  with sf.SoundFile(wav_path) as sf_desc:
      data = sf_dest.read(dtype=np.float32)
  print(type(data)) #<class 'numpy.ndarray'>

或者如下方式:

  import soundfile as sf
  wav_path=''
  data = sf.read(wav_path)[0]
  print(type(data)) #<class 'numpy.ndarray'>

3. scipy

  from scipy.io import wavfile
  wav_path=''
  data = wavfile.read(wav_path)[1]
  data = data / 32768 #2^15
  print(type(data)) #<class 'numpy.ndarray'>

该方法需注意的是调用read后返回的数据为int,需要除以32768(2^15,由于位深16bit),才能与其他读取方式获取数据保持一致。

4. wave

  from wave
  wav_path=''
  with wave.open(wav_path, 'rb') as f:
      params = f.getparams()
      nchannels, sampwidth, framerate, nframes = params[0:4]
      strdata = f.readframes(nframes)
      data = np.fromstring(strdata, dtype=np.int16)
      data = data / 32768
      print(type(data)) #<class 'numpy.ndarray'>

wave为python内置包,但该方法读取过程略显麻烦,同样需要除以32768。

二. 文件写入

1. soundfile

  import soundfile as sf
  write_wav_path=''
  sf.write(write_wav_path, data, sample_rate, 'PCM_16')

写入和读取一样简单。

2. scipy

  from scipy.io import wavfile
  write_wav_path=''
  data *= 32768
  wavefile.write(write_wav_path, sample_rate, data.astype(np.int16))

与读取相反(除以32768,转为float32),需要将数据乘以32768,并转为int进行保存。

3. wave

  from wave
  write_wav_path=''
  nchannels=1
  sampwidth=2
  framerate=16000
  nframes=len(data)
  comptype='NONE'
  compname='not compressed'
  with wave.open(write_wav_path, 'wb') as fw:
      fw.setparams(nchannels, sampwidth, framerate, nframes, comptype, compname)
      data=(data*32768).astype(np.int16)
      fw.writeframes(data.tostring())

该方法写入过程仍然麻烦,并同样需要乘以32768,转为int。

三. 小结

       除了以上列出方法,还存在其他读写方法,例如kaldiio包等。并且以上方法没有考虑时间复杂度差异,有兴趣的同学可以自己试试。

在语音处理中,音频文件读写是基本操作。然而读写方式乃至归一化处理的多样化,有可能导致后续处理的偏差乃至错误。本文汇集实践中所遇的一些方法,并参考了其他文章,确保读写操作的准确性和一致性。前置条件&nbsp; &nbsp; &nbsp; &nbsp;本文以实践中常见的音频文件参数(wav格式,PCM编码,单通道,采样率16KHz,位深16bit)为例,如果参数不同需做对应调整。一. 文件读取1. librosa import librosa wav_path='' sample_r.
File "/home/hwja/anaconda3/envs/py2/lib/python2.7/site-packages/soundfile.py", line 373, in read subtype, endian, format, closefd) as f: File "/home/hwja/anaconda3/envs/py2/lib/python2.7/site-packages/soundfile.py", line 740, ininit self._file = self._ope.
(1)音调 人耳对声音高低的感觉称为音调(也叫音频)。音调主要与声波的频率有关。声波的频率高,则音调也高。一般音频 儿童>女生>男生。 人耳听觉音频范围是20Hz-20000Hz(做音频压缩时不在这个范围内的数据就可以砍掉)。 (2)音量 也就是响度。人耳对声音强弱的主观感觉称为响度。响度和声波振动的幅度有关。一般说来,声波振动幅度越大则响度也越大... 由于本人研究的音频方面,一开始读取音频文件的时候就遇到了一些问题,比如,这个函数返回的是numpy,另外一个函数返回tensor,巴拉巴拉等等问题,所以在这里做一个简单的整理。 1、wavefile.read 代码示例如下: from scipy.io import wavfile fs, .
1: os.listdir(path) //path为目录 功能相当于在path目录下执行dir命令,返回为list类型 print os.listdir(‘..’) 2: os.path.walk(path,visit,arg) path :是将要遍历的目录 visit :是一个函数指针,函数圆形为: callback(arg,dir,fileList) 其中arg为为传给walk的arg , dir是path下的一个目录,fileList为dir下的文件和目录组成的list, arg:传给visit用的 3:os.path.split(path) path 为一个路径, 输出,把path分
python中对文件、文件夹(文件操作函数)的操作需要涉及到os模块和shutil模块。 得到当前工作目录,即当前Python脚本工作的目录路径: os.getcwd() 返回指定目录下的所有文件和目录名:os.listdir() 函数用来删除一个文件:os.remove() 删除多个目录:os.removedirs(r“c:\python”) 检验给出的路径是否是一个文件:os.path.isfile() 检验给出的路径是否是一个目录:os.path.isdir() 判断是否是绝对路径:os.path.isabs() 检验给出的路径是否真地存:os.path.exists() 返回一个路径的
wavfile 一个轻量级的库,用于在本地Python类型列表中读写波形音频文件。 该库当前仅限于PCM(整数)格式,但支持任意精度,包括16位,24位,32位和64位样本。 用法:读取wave文件 f = wavfile.open(file, 'r') 其中file是wave文件的路径或打开文件的指针。 这将返回具有以下属性的wavfile.wavread.WavRead对象: num_channels流中的音频通道数。 sample_rate音频流的采样率/频率。 bits_per_sample每个音频样本的位数。 num_frames音频流中音频帧的总数。 一帧是一组样本,每个通道一个样本,对应一个采样点。 该对象还具有以下方法: read_int([N]) -从音频流中最多读取N帧未经修改的整数格式。 该方法返回大小为(N,C)的列表的列表,其中C是音频通道的数量。