[语音处理] .flac文件转.wav文件

在常用的英语语音识别数据库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倍。

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值