簡體   English   中英

使用多處理批量轉換.wav到.flac(Python,Pydub)

[英]Using Multiprocessing to Batch Convert .wav to .flac (Python, Pydub)

所以我編寫了一個非常簡單的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 進程模塊調用ffmpeg命令(請參閱pydub代碼 )來執行轉換,從而產生如下所示的命令:

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

不幸的是,FFmpeg的FLAC編碼器實現似乎沒有並行化,因此使用這種特定的編碼器不可能在保持相同編碼質量的同時提高每個獨立文件的編碼速度。 假設您要繼續使用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的)編碼器最有可能產生更好的結果,同時保持相同的音頻質量。

如果您有許多小文件(例如用於語音識別的音頻樣本),那么單個文件的轉換只需要幾分之一秒,那么您可以通過將多個文件一起批處理以進行轉換來減少多處理模塊的調度開銷,以便每個進程一次轉換多個文件。 例如,修改文件名循環,或在convertlist中對項目進行分組,並在worker中添加迭代。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM