gpt4 book ai didi

python - 使用多处理将 .wav 批量转换为 .flac(Python、Pydub)

转载 作者:太空宇宙 更新时间:2023-11-03 12:00:22 25 4
gpt4 key购买 nike

所以我编写了一个非常简单的 Python 3 程序来获取工作目录中的所有 .wav 音频文件并将它们转换为 .flac。不要担心它所做的任何假设(比如 .wav 文件有效、输出文件名已经存在等)。见下文:

import os
from multiprocessing import Pool
from pydub import AudioSegment

def worker(filename):
song = AudioSegment.from_wav(filename)
song.export(filename.replace(".wav",".flac"), format = "flac")

if __name__ == '__main__':
converted_count = 0
convertlist = []
for filename in os.listdir(os.getcwd()):
if filename.endswith(".wav"):
convertlist.append(filename)
converted_count += 1
p = Pool(processes=min(converted_count, os.cpu_count()))
p.map(worker, convertlist)

我已经对这个进行了计时,并且在我的系统上,与完全不使用多处理相比,我注意到了显着的加速。然而,这似乎太简单了;我对多处理(也不是多线程)不是很有经验,所以老实说,我不确定是否有更快、更有效的方法来做到这一点。

如果您的任务是用 Python 编写这个简单的转换器,您会怎么做?您会怎么做才能使它比这更有效率?

最佳答案

您在 worker() 中使用的 pydub 包已经非常高效,因为它由一个不是用 Python 编写的低级媒体库支持:FFmpeg。也就是说,在幕后,pydub 使用 subprocess 模块(参见 pydub code )调用 ffmpeg 命令来执行转换,结果命令如下所示:

ffmpeg -y -f wav -i input.wav -write_xing 0 -f flac output.flac 

不幸的是,FFmpeg 的 FLAC 编码器实现 does not seem并行化,因此不可能提高每个独立文件的编码速度,同时保持相同的编码质量,使用这个特定的编码器。假设您想继续使用 pydub 及其 FFmpeg FLAC 编码器,您解决问题的方法包括在不同的进程中处理每个文件听起来很合理。

但是,如果您真的想不惜一切代价提高性能,另一种选择是用音频质量换取转换速度。为此,您可以调整一些编码参数,例如降低采样频率:

# export the song with a lower sampling frequency
low_quality_song = song.set_frame_rate(11025)
low_quality_song.export(flac_filename, format="flac")

话虽如此,鉴于您的目标是无损格式,切换到更高效(可能基于 GPU)的编码器很可能会产生更好的结果,同时保持相同的音频质量。

关于python - 使用多处理将 .wav 批量转换为 .flac(Python、Pydub),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50662610/

25 4 0
文章推荐: c# - 如何导入 System.Net.Http.ObjectContent 以便我可以将 HttpResponseMessage.Content 转换为它?