最近在智慧語音中用到了資料集cn-celeb。這個資料集的音訊格式是flac,而在做資料增強(augmentation)以及模型訓練時用的資料格式是wav,因此需要把音訊格式從flac轉到wav。我在ubuntu下摸索了一番,找到了兩種方法。
1,基於Linux下的sox命令寫shell指令碼實現
SoX(即 Sound eXchange)是一個跨平臺(Windows,Linux,MacOS 等)的命令列實用程式,可以將各種格式的音訊檔轉換為需要的其他格式。在Ubuntu下安裝sox命令如下:sudo apt install sox。Sox裝好後就開始寫shell指令碼,基於sox做音訊格式轉換的shell指令碼如下:
#!/bin/bash echo "$0 $@ $#" srcdir=$1 outdir=$2 echo "insrc: $srcdir, outdir: $outdir" echo "doing, pls waiting" for x in $srcdir/*.flac; do name=`basename $x` dirx=`dirname $x` array=(${name//./ }) filename=${array[0]} newfile=$filename".wav" echo $newfile sox $x -t wav $outdir/$newfile done echo "done,pls check!!"
2,基於pydub的python庫寫python程式碼實現
Pydub是一個依賴於ffmpeg的python音訊處理庫,因此要先安裝ffmpeg,安裝命令如下:sudo apt install ffmpeg # version 7:4.2.7-0ubuntu0.1。安裝後用命令ffmpeg –version檢視是否安裝好,如下圖:
ffmpeg安裝好後再在一個conda環境下安裝pydub庫,命令如下:pip install pydub。可以用pip list看一下是否裝好以及版本,如下圖:
這些都ready後就開始寫python程式碼,基於pydub做音訊格式轉換的python程式碼如下:
from glob import glob
from pydub import AudioSegment
import os
def find_files(directory, ext='flac'):
return sorted(glob(directory + f'/**/*.{ext}', recursive=True))
def trans_flac_to_wav(file_path):
file_dir = os.path.dirname(file_path)
new_name = os.path.basename(file_path).replace('.flac', '.wav')
new_file = os.path.join(file_dir, new_name)
song = AudioSegment.from_file(file_path)
song.export(new_file, format="wav")
print('===== Begin to Do converter =====')
audio_files = find_files('/home/....../format_converter/flac')
for audio_file in audio_files:
# do converter
trans_flac_to_wav(audio_file)
以上就是將音訊格式從flac轉到wav的兩種方法。對其他音訊格式之間的互轉,方法也是適用的,只不過程式碼上有可能需要做一點小的改動。