在 Pydub 和 Librosa 之间转换音频文件
Converting Audio files between Pydub and Librosa
我正在尝试在 Librosa 中打开音频文件。 Trim 它,然后使用 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 加载它 - 但这似乎是一种非常低效的做事方式。
包版本:
图书馆 - 0.7.1.
Pydub - 0.23.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]
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 的代码没有为我将数字转换为浮点数。
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
我正在尝试在 Librosa 中打开音频文件。 Trim 它,然后使用 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 加载它 - 但这似乎是一种非常低效的做事方式。
包版本:
图书馆 - 0.7.1.
Pydub - 0.23.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]
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 的代码没有为我将数字转换为浮点数。
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