【问题标题】:Converting Audio files between Pydub and Librosa在 Pydub 和 Librosa 之间转换音频文件
【发布时间】:2019-11-11 23:31:42
【问题描述】:

我正在尝试在 Librosa 中打开一个 AudioFile。修剪它,然后使用 pydub 对其进行修改。这是我的代码:

sound = AudioSegment.from_file(filePath)
samples = sound.get_array_of_samples()
arr = np.array(samples)
print(type(arr))
print(arr)
# then modify samples...
y, index = librosa.effects.trim(arr)

问题在于,即使我遵循此处列出的解决方案:
https://github.com/jiaaro/pydub/issues/289

我似乎无法使用 librosa 的 trim() 函数。它给了我这个错误:

librosa.util.exceptions.ParameterError: Audio data must be floating-point

原因是 Librosa 需要一个浮点 numpy 数组(并与它们一起工作),而 pydub 导出一个整数数组(我将其转换为 np 数组)。 我不知道如何在 2 之间转换 numpy 数组。

我可以从 Pydub 导出到文件,然后使用 Librosa 加载它 - 但这似乎是一种非常低效的处理方式。

软件包版本:
Librosa - 0.7.1.
Pydub - 0.23.1

【问题讨论】:

    标签: python numpy audio librosa pydub


    【解决方案1】:

    Librosa 符合 arr 数据的类型为 int,您需要将其转换为 float,如下所示,

    arr = np.array(samples).astype(np.float32)
    

    代码:

    import librosa
    import numpy as np
    import os
    
    from pydub import AudioSegment
    from pydub.playback import play
    
    sound = AudioSegment.from_file("test.wav")
    samples = sound.get_array_of_samples()
    new_sound = sound._spawn(samples)
    arr = np.array(samples).astype(np.float32)
    print(type(arr))
    #print(arr)
    # then modify samples...
    y, index = librosa.effects.trim(arr)
    print(index)
    print(y) 
    

    修剪后的输出

     <type 'numpy.ndarray'>
    [  0 882]
    [ 0.00000000e+00  0.00000000e+00  1.07629056e+08  1.07629056e+08
    :
    :
    1.09489754e+09  1.09489754e+09]
    

    【讨论】:

      【解决方案2】:
      def audiosegment_to_librosawav(audiosegment):    
          channel_sounds = audiosegment.split_to_mono()
          samples = [s.get_array_of_samples() for s in channel_sounds]
      
          fp_arr = np.array(samples).T.astype(np.float32)
          fp_arr /= np.iinfo(samples[0].typecode).max
          fp_arr = fp_arr.reshape(-1)
      
          return fp_arr
      

      我将此代码用于使用 librosa 的 resemblyzer。 90% 的代码在这里: https://github.com/jiaaro/pydub/blob/master/API.markdown#audiosegmentget_array_of_samples

      Anil_M 的代码没有为我将数字转换为浮点数。

      【讨论】:

      • 这是正确的答案,因为 Paul 将整数正确缩放为浮点数
      【解决方案3】:

      Librosa 以float32 格式加载音频文件,而 pydub 以int16 格式加载。

      所以,转换很简单:

      from pydub import AudioSegment
      import librosa
      
      a = AudioSegment.from_wav("test.wav")
      b, sr = librosa.load("test.wav")
      # librosa to pydub
      b_p = np.array(b* (1<<15), dtype=np.int16)
      a_p = np.array(a.get_array_of_samples(), dtype=np.int16)
      print(b_p)
      print(a_p)
      
      
      array([  7,   9,   8, ..., -12, -46,   0], dtype=int16)
      array([  7,   9,   8, ..., -12, -46,   0], dtype=int16)
      
      def convert(filename):
          y, sr = librosa.load(filename)
          # convert from float to uint16
          y = np.array(y * (1<<15), dtype=np.int16)
          audio_segment = pydub.AudioSegment(
              y.tobytes(), 
              frame_rate=sr,
              sample_width=y.dtype.itemsize, 
              channels=1
          )
          return audio_segment
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2020-01-17
        • 2014-07-07
        • 1970-01-01
        • 2018-08-03
        • 1970-01-01
        • 1970-01-01
        • 2018-10-13
        相关资源
        最近更新 更多