將音訊格式從flac轉到wav的兩種方法

2023-05-08 09:01:52

最近在智慧語音中用到了資料集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的兩種方法。對其他音訊格式之間的互轉,方法也是適用的,只不過程式碼上有可能需要做一點小的改動。