【问题标题】:Reading only a part of a large wav file with Python使用 Python 仅读取大型 wav 文件的一部分
【发布时间】:2020-11-07 11:14:13
【问题描述】:

我有大型 wav 文件(每个约 4GB)。由于我的部署服务器有一个限制,即每个进程不能使用超过 500 MB 的 RAM,我希望能够仅加载和处理音频文件的块,然后再读取并附加它们,比如一个文本文件。

我查看了pydub,但它似乎会加载整个文件,然后我才能切掉一个较小的块来处理(如果我错了,请纠正我)。 scipy.io.wavfile.read 也是如此。我希望能够读取大文件的块,对其进行处理,然后将它们放回去(最好是附加到硬盘驱动器上先前处理的块)。

我能找到的大多数可用的 SO 答案已经假设我可以将大文件加载到主内存中。

How to split a .wav file into multiple .wav files?

Reading *.wav files in Python

【问题讨论】:

    标签: python-3.x audio


    【解决方案1】:

    您可能需要考虑一些用于处理音频的包:soundfile 通常用于 I/O,librosa 也是如此。 “采样率”又名“帧率”是每秒的音频样本数,通常以 kHz 为单位,但在软件中仅以 Hz 为单位。

    还有一个专门的Sound Design StackExchange,您可能会发现搜索更有成效。

    获取文件的一部分称为“寻找”,soundfile.SoundFile 类支持它。

    这个想法是将“光标”的位置移动到特定的帧SoundFile.seek(pos),然后读入一些帧SoundFile.read(n_frames),之后光标的位置将移动那么多帧,您可以通过SoundFile.tell() 获取。

    以下是访问 wav 文件的一部分的示例:

    import soundfile as sf
    
    def read_audio_section(filename, start_time, stop_time):
        track = sf.SoundFile(filename)
    
        can_seek = track.seekable() # True
        if not can_seek:
            raise ValueError("Not compatible with seeking")
    
        sr = track.samplerate
        start_frame = sr * start_time
        frames_to_read = sr * (stop_time - start_time)
        track.seek(start_frame)
        audio_section = track.read(frames_to_read)
        return audio_section, sr
    

    ...要将其写入文件,您只需使用soundfile.write(注意:包中的一个函数,而不是soundfile.SoundFile 类的方法)

    def extract_as_clip(input_filename, output_filename, start_time, stop_time):
        audio_extract, sr = read_audio_section(input_filename, start_time, stop_time)
        sf.write(output_filename, audio_extract, sr)
        return
    

    【讨论】:

      猜你喜欢
      • 2016-12-02
      • 1970-01-01
      • 2012-11-19
      • 2019-06-15
      • 1970-01-01
      • 2020-06-29
      • 2019-05-23
      • 2021-09-02
      • 1970-01-01
      相关资源
      最近更新 更多