如何将 AudioSegment 转换为 NumPy 数组并返回?

问题描述 投票:0回答:1

正如标题所述,我在将 PyDub AudioSegment 转换为 NumPy 数组并返回时遇到了困难。我知道如何将 PyDub AudioSegment 转换为 NumPy 数组,并且对 如何将 NumPy 数组转换为 PyDub AudioSegment 有一个模糊的想法,但我学到的方法多种多样,并且不与彼此。那么,我如何可靠地将 AudioSegment 获取到数组并返回?

这是我用来获取数组的代码:

audio= AudioSegment.from_file("/file/path/sillysong.wav")
data = audio.get_array_of_samples()
data = np.array(data)
data = data.reshape(audio.channels, -1, order='F')
data

我不知道如何取回这种形式的数组。对于上下文,我正在使用 TensorFlow,并且需要数据采用数组形式。感谢您的帮助! (我是一名新编码员,所以可能明显缺少一些东西。)

python numpy type-conversion pydub audiosegment
1个回答
0
投票

你的做法是正确的。我有一个 LowRider.wav 的示例,我使用 pydub 读取它:

from pydub import AudioSegment
%matplotlib notebook
import matplotlib.pyplot as plt
import numpy as np

audio = AudioSegment.from_file("LowRider.wav")
data = np.array(audio.get_array_of_samples())
data = data.reshape(audio.channels, -1, order='F')
print("Shape of the converted numpy array:", data.shape)

frame_rate = audio.frame_rate
time_vector = np.linspace(0, len(data[0,:])/frame_rate, num=len(data[0,:]))

plt.figure()
plt.plot(time_vector, data[0,:], "-",  label = "Channel 1")
plt.plot(time_vector, data[1,:], "--", label = "Channel 2")
plt.legend()
plt.xlabel("Time (s)")
plt.ylabel("Signal")
plt.show()

这将为您提供

data
,其中包含来自两个通道的数据。这是两人的剧情:

要转换回

.wav
,请使用以下代码,我提供了一个导出供您测试转换是否成功:

reshaped_data = data.reshape(-1, order='F')

new_audio = AudioSegment(
    reshaped_data.tobytes(),
    frame_rate=audio.frame_rate,
    sample_width=reshaped_data.dtype.itemsize,
    channels=audio.channels
)

new_audio.export("LowRider_Exported.wav", format="wav")

更改文件名并让我知道它是否有效:D

© www.soinside.com 2019 - 2024. All rights reserved.