2

我必须以编程方式混合音频文件(在录音中添加背景噪音),我的所有文件都是 .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]

而且我认为我可以通过从(这是 a )创建一个pydub.audio_segment.AudioSegment对象来克服这个问题。sound_data_librosanumpy.ndarray

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 文件(读取和写入)的支持,这就是我试图坚持使用 .opus 文件的原因pydub

4

1 回答 1

2

是的,在 MacOS上使用opusand有一些奇怪的地方。ffmpeg我尝试修复文件大小问题一段时间,但没有任何进展。相反,我建议将文件转换为wav(或任何其他ok-ish(:格式)并尝试使用它。我尝试将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)

或者 ping pydubGitHub 上的所有者

于 2021-01-05T16:11:27.180 回答