pydub.AudioSegment 从 numpy.ndarray 加载时弄乱了音频数据
pydub.AudioSegment messes up the audio data when loading from a numpy.ndarray
我必须以编程方式混合音频文件(在录音中添加背景噪音),我的所有文件都是 .opus 格式的 8-9 小时长录音。
我曾尝试使用 pydub.AudioSegment
在内存中加载一个,但出现以下错误:
path_to_input = '/path/to/my/input/file.opus'
sound_data = AudioSegment.from_file(path_to_input)
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/pydub/audio_segment.py", line 728, in from_file
fix_wav_headers(p_out)
File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/pydub/audio_segment.py", line 142, in fix_wav_headers
raise CouldntDecodeError("Unable to process >4GB files")
pydub.exceptions.CouldntDecodeError: Unable to process >4GB files
所以显然我不能使用 pydub.AudioSegment
来加载我的文件,因为它们太大了(我试图打开的文件实际上在磁盘上有 48MB,所以我猜它们太大而无法加载到内存中 pydub
?)。无论如何,我已经设法使用 librosa
来加载文件。
sample_rate = 8000
sound_data_librosa = librosa.load(path_to_input, sr=sample_rate, res_type='kaiser_best')
sound_data_librosa = sound_data_librosa[0]
而且我认为我可以通过从 sound_data_librosa
(这是一个 numpy.ndarray
)创建一个 pydub.audio_segment.AudioSegment
对象来解决这个问题。
sound_data = AudioSegment(
sound_data_librosa.tobytes(),
frame_rate=sample_rate,
sample_width=sound_data_librosa.dtype.itemsize,
channels=1
)
这似乎工作正常,但当我将其写回磁盘时,听起来像是随机噪音。
path_to_output = '/path/to/my/output/file.opus'
sound_data.export(path_to_output,
format="opus")
所以我还没有修改任何东西,但不知何故我丢失了所有音频数据。我不明白到底是什么问题。有什么我做错了可以解决的,这样我就不会扭曲音频数据吗?
此外,我不一定非要这样做,只是我一直在使用 pydub.AudioSegment
修改我的音频文件(应用增益、覆盖、写入磁盘作为 .opus 文件)所以这就是为什么我需要将它们加载为 pydub.audio_segment.AudioSegment
对象。如果在 python 中有另一种方法可以做同样的事情,如果你能指出来,我将不胜感激。我主要担心的是缺乏对 .opus 文件(读写)的支持,这就是为什么我要坚持使用 pydub
.
是的,在 MacOS 上使用 opus
和 ffmpeg
有一些奇怪之处。我尝试修复了一段时间的文件大小问题,但没有任何进展。
相反,我的建议是将文件转换为 wav
(或任何其他合适的 (: 格式)并尝试使用它。
我试过将 42MB 的 opus 文件转换为 WAV,结果大约是 2.7GB,但不知何故 pydub
能够读取它。
你可以使用这样的东西来转换文件
import subprocess
def convert_to_wav(name):
command = ['ffmpeg', '-i', f'{name}.opus', f'{name}.wav']
subprocess.run(command, stdout=subprocess.PIPE, stdin=subprocess.PIPE)
或者在 GitHub
上 ping pydub
的所有者
我必须以编程方式混合音频文件(在录音中添加背景噪音),我的所有文件都是 .opus 格式的 8-9 小时长录音。
我曾尝试使用 pydub.AudioSegment
在内存中加载一个,但出现以下错误:
path_to_input = '/path/to/my/input/file.opus'
sound_data = AudioSegment.from_file(path_to_input)
Traceback (most recent call last):
File "<input>", line 1, in <module>
File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/pydub/audio_segment.py", line 728, in from_file
fix_wav_headers(p_out)
File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/pydub/audio_segment.py", line 142, in fix_wav_headers
raise CouldntDecodeError("Unable to process >4GB files")
pydub.exceptions.CouldntDecodeError: Unable to process >4GB files
所以显然我不能使用 pydub.AudioSegment
来加载我的文件,因为它们太大了(我试图打开的文件实际上在磁盘上有 48MB,所以我猜它们太大而无法加载到内存中 pydub
?)。无论如何,我已经设法使用 librosa
来加载文件。
sample_rate = 8000
sound_data_librosa = librosa.load(path_to_input, sr=sample_rate, res_type='kaiser_best')
sound_data_librosa = sound_data_librosa[0]
而且我认为我可以通过从 sound_data_librosa
(这是一个 numpy.ndarray
)创建一个 pydub.audio_segment.AudioSegment
对象来解决这个问题。
sound_data = AudioSegment(
sound_data_librosa.tobytes(),
frame_rate=sample_rate,
sample_width=sound_data_librosa.dtype.itemsize,
channels=1
)
这似乎工作正常,但当我将其写回磁盘时,听起来像是随机噪音。
path_to_output = '/path/to/my/output/file.opus'
sound_data.export(path_to_output,
format="opus")
所以我还没有修改任何东西,但不知何故我丢失了所有音频数据。我不明白到底是什么问题。有什么我做错了可以解决的,这样我就不会扭曲音频数据吗?
此外,我不一定非要这样做,只是我一直在使用 pydub.AudioSegment
修改我的音频文件(应用增益、覆盖、写入磁盘作为 .opus 文件)所以这就是为什么我需要将它们加载为 pydub.audio_segment.AudioSegment
对象。如果在 python 中有另一种方法可以做同样的事情,如果你能指出来,我将不胜感激。我主要担心的是缺乏对 .opus 文件(读写)的支持,这就是为什么我要坚持使用 pydub
.
是的,在 MacOS 上使用 opus
和 ffmpeg
有一些奇怪之处。我尝试修复了一段时间的文件大小问题,但没有任何进展。
相反,我的建议是将文件转换为 wav
(或任何其他合适的 (: 格式)并尝试使用它。
我试过将 42MB 的 opus 文件转换为 WAV,结果大约是 2.7GB,但不知何故 pydub
能够读取它。
你可以使用这样的东西来转换文件
import subprocess
def convert_to_wav(name):
command = ['ffmpeg', '-i', f'{name}.opus', f'{name}.wav']
subprocess.run(command, stdout=subprocess.PIPE, stdin=subprocess.PIPE)
或者在 GitHub
上 pingpydub
的所有者