所以我编写了一个非常简单的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编写这个简单的转换器,你会怎么做?你会做些什么来使它比这更有效?
答案 0 :(得分:0)
您在worker()
中使用的pydub包已经非常高效,因为它由不是用Python编写的低级媒体库支持:FFmpeg。也就是说,在引擎盖下,pydub使用ffmpeg
模块调用subprocess
命令(请参阅pydub code)来执行转换,从而产生如下命令:
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的)编码器最有可能在保持相同音频质量的同时产生更好的效果。
答案 1 :(得分:0)
如果您有很多小文件(例如,用于语音识别的音频样本),那么单个文件的转换只需花费一秒钟的时间,那么您可以通过将多个文件打包在一起进行转换来减少多处理模块的调度开销,以便每个进程一次转换多个文件。例如。修改文件名循环,或在convertlist中将项目分组,然后在worker中添加迭代。