如何从pydub AudioSegment创建一个numpy数组?

时间:2016-06-24 14:03:37

标签: python arrays numpy wave pydub

我知道以下问题:  How to create a pydub AudioSegment using an numpy array?

我的问题恰恰相反。如果我有一个pydub AudioSegment怎么能把它转换成一个numpy数组?

我想使用scipy过滤器等。 我不太清楚AudioSegment原始数据的内部结构是什么。

3 个答案:

答案 0 :(得分:7)

Pydub有一个获取audio data as an array of samples的工具,它是一个array.array实例(不是一个numpy数组)但你应该能够相对容易地将它转换为一个numpy数组:

from pydub import AudioSegment
sound = AudioSegment.from_file("sound1.wav")

# this is an array
samples = sound.get_array_of_samples()

您可以创建实现的numpy变体。该方法非常简单:

def get_array_of_samples(self):
    """
    returns the raw_data as an array of samples
    """
    return array.array(self.array_type, self._data)

也可以从(修改后的?)样本数组创建新的音频片段:

new_sound = sound._spawn(samples)

以上是有点hacky,它是为AudioSegment类内部使用而编写的,但它主要只是确定你正在使用什么类型的音频数据(样本数组,样本列表,字节,字节串等) )。尽管有下划线前缀,但使用它是安全的。

答案 1 :(得分:3)

您可以从numpy.ndarray获取from pydub import AudioSegment import numpy as np song = AudioSegment.from_mp3('song.mp3') samples = song.get_array_of_samples() samples = np.array(samples) ,然后将其转换为.attr('class', lineCount)

lineCount

答案 2 :(得分:3)

现有的答案都不是完美的,他们错过了重塑和样本宽度。我已经编写了这个函数来帮助将音频转换为 np 中的标准音频表示:

def pydub_to_np(audio: pydub.AudioSegment) -> (np.ndarray, int):
    """Converts pydub audio segment into float32 np array of shape [channels, duration_in_seconds*sample_rate],
    where each value is in range [-1.0, 1.0]. Returns tuple (audio_np_array, sample_rate)"""
    # get_array_of_samples returns the data in format:
    # [sample_1_channel_1, sample_1_channel_2, sample_2_channel_1, sample_2_channel_2, ....]
    # where samples are integers of sample_width bytes.
    return np.array(audio.get_array_of_samples(), dtype=np.float32).reshape((-1, audio.channels)).T / (
            1 << (8 * audio.sample_width)), audio.frame_rate