在常用的英语语音识别数据库librispeech中,原始语音的格式是.flac,一般来说先要转换成.wav才能继续进行后处理。
转换工具可以使用sox (http://sox.sourceforge.net/):
sox $flac_path -t wav $wav_path
命令很简单,但是缺点是一次只能转换一条语音,所以需要利用脚本完成对librispeech中上万条语音进行自动转换。
一个简单思路是找出语料文件夹下所有以.flac结尾的音频,然后顺序处理。
flac_paths=$(find $DATASET_ROOT_PATH -iname '*.flac')
for flac_path in $flac_paths ; do
dir_path=$(dirname $flac_path)
file_name=$(basename $flac_path)
base=${file_name%.*}
ext=${file_name##*.}
wav_path=$dir_path"/"$base".wav"
if [ $ext = "flac" ]; then
echo "Converting from"$flac_path" to "$wav_path
sox $flac_path -t wav $wav_path
rm -f $flac_path
else
echo "Already converted: "$wav_path
fi
笔者亲测这种方式的时间开销很大(半天都没能跑完),所以需要考虑使用多进程,利用并行能力。
参考https://blog.csdn.net/zongza/article/details/89707462 这篇博文,对处理脚本做出如下修改:
#!/usr/bin/env bash
echo ============================================================================
echo " Librispeech "
echo ============================================================================
DATASET_ROOT_PATH='E:/corpus_en/LibriSpeech_small'
echo ============================================================================
echo " Convert from flac to wav "
echo ============================================================================
Nproc=5 # 可同时运行的最大作业数
function PushQue { # 将PID压入队列
Que="$Que $1"
Nrun=$(($Nrun+1))
}
function GenQue { # 更新队列
OldQue=$Que
Que=""; Nrun=0
for PID in $OldQue; do
if [[ -d /proc/$PID ]]; then
PushQue $PID
fi
done
}
function ChkQue { # 检查队列
OldQue=$Que
for PID in $OldQue; do
if [[ ! -d /proc/$PID ]] ; then
GenQue; break
fi
done
}
function CMD (){ # 测试命令, 随机等待几秒钟
dir_path=$(dirname $1)
file_name=$(basename $1)
base=${file_name%.*}
ext=${file_name##*.}
wav_path=$dir_path"/"$base".wav"
if [ $ext = "flac" ]; then
sox $flac_path -t wav $wav_path
echo "Converting from"$flac_path" to "$wav_path
rm -f $flac_path
else
echo "Already converted: "$wav_path
fi
}
flac_paths=$(find $DATASET_ROOT_PATH -iname '*.flac')
for flac_path in $flac_paths ; do
CMD $flac_path &
PID=$!
PushQue $PID
while [[ $Nrun -ge $Nproc ]]; do
ChkQue
done
done
wait
echo "Done~"
时间几乎节省4倍。