【问题标题】:How can i pad wav file to specific length?如何将 wav 文件填充到特定长度?
【发布时间】:2022-02-02 06:32:20
【问题描述】:

我正在使用波形文件来制作深度学习模型 它们的长度不同,所以我想把它们都垫起来 使用 python 到 16 秒长度

【问题讨论】:

  • 这可以使用scipy.io.wavfile、pydub 或纯 Python 来完成(使用 wav 模块——尽管级别较低且更乏味)。你关心使用哪种工具?

标签: python python-3.x wav


【解决方案1】:

如果我理解正确,问题是要将所有长度固定为给定长度。因此,解决方案会略有不同:

from pydub import AudioSegment

pad_ms = 1000  # Add here the fix length you want (in milliseconds)
audio = AudioSegment.from_wav('you-wav-file.wav')
assert pad_ms > len(audio), "Audio was longer that 1 second. Path: " + str(full_path)
silence = AudioSegment.silent(duration=pad_ms-len(audio)+1)


padded = audio + silence  # Adding silence after the audio
padded.export('padded-file.wav', format='wav')

这个答案与this one 不同,因为这个答案创建了相同长度的所有音频,而另一个答案在最后添加了相同大小的静音。

【讨论】:

    【解决方案2】:

    使用pydub

    from pydub import AudioSegment
    
    pad_ms = 1000  # milliseconds of silence needed
    silence = AudioSegment.silent(duration=pad_ms)
    audio = AudioSegment.from_wav('you-wav-file.wav')
    
    padded = audio + silence  # Adding silence after the audio
    padded.export('padded-file.wav', format='wav')
    

    AudioSegment 对象是不可变的

    【讨论】:

      【解决方案3】:

      您可以使用Librosa。 Librosa.util.fix_length 函数通过将 zeros 附加到 end 包含音频数据的 numpy 数组来为音频文件添加静音补丁:

      from librosa import load
      from librosa.util import fix_length
      
      
      file_path = 'dir/audio.wav'
      
      sf = 44100 # sampling frequency of wav file
      required_audio_size = 5 # audio of size 2 second needs to be padded to 5 seconds
      audio, sf = load(file_path, sr=sf, mono=True) # mono=True converts stereo audio to mono
      padded_audio = fix_length(audio, size=5*sf) # array size is required_audio_size*sampling frequency
      
      
      print('Array length before padding', np.shape(audio))
      print('Audio length before padding in seconds', (np.shape(audio)[0]/fs))
      print('Array length after padding', np.shape(padded_audio))
      print('Audio length after padding in seconds', (np.shape(padded_audio)[0]/fs))
      

      输出:

      Array length before padding (88200,)
      Audio length before padding in seconds 2.0
      Array length after padding (220500,)
      Audio length after padding in seconds 5.0
      

      尽管查看了许多类似的问题,但似乎pydub.AudioSegment 是解决方案。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2021-08-04
        • 2019-03-16
        • 2021-11-30
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-16
        相关资源
        最近更新 更多