數據準備(快速構建ASR系統)

數據準備在Kaldi官方文檔中已經有了較爲全面、詳盡的說明。
然而在自己拿到語音數據後,要快速構建一個簡單的ASR語音識別系統,對於新手來說,思路可能並不
清晰。
下面,以自己的操作過程爲例,進行簡單的說明。

1. 音頻文件

  首先需要準備的是音頻文件,劃分爲3部分,分別放在train,dev,test目錄下的wav文件夾中。train中的數據作訓練用,dev中的作模型調校,test中的作測試。

音頻文件建議爲採樣率16k,位深16bit,單聲道的wav文件。

2. 音頻相關數據

其他必須提供的音頻相關的文件有text,wav.scp,utt2spk。spk2utt可由utt2spk轉換得到。

  • text

text即音頻的轉譯文本,包含音頻中每句話對應的文本信息,格式爲:

<utt-id> <text-transcription>

其中,utt-id爲語句的id。

  • wav.scp

wav.scp將音頻文件和對應轉譯文本關聯起來,格式爲

<utt-id> <path-of-audio>
  • utt2spk

utt2spk將描述了語句的說話人信息,格式爲

<utt-id> <speaker-id>
  • spk2utt

說話人對應的所有語句,可由以下命令得到

utils/utt2spk_to_spk2utt.pl utt2spk > spk2utt

3. 語言數據

首先需要提供的是音素集,發音詞典和語言模型。

然後,需要生成silence_phones.txt, optional_silence.txt, nonsilence_phones.txt

  • silence_phones.txt

    靜音音素。寫入sil

  • optional_silence.txt

    可選靜音音素。寫入sil

  • nonsilence_phones.txt
    非靜音音素。音素集phones.txt除去silence_phones.txt中的所有音素,不能包含<eps>.

還需要設置oov詞,訓練過程中,詞彙表外的所有詞都會被映射成oov。在lexicon中需要加入該oov詞及其發音

<SPOKEN_NOISE> sil

4. 訓練模型,構建系統

  需要準備的數據基本完成,接下來可以在kaldi中調用接口,訓練模型(train_mono.sh),生成解碼圖(mkgraph.sh),並利用測試集數據進行測試(decode.sh)。

5. 音頻目錄結構,源碼

音頻相關數據的目錄結構,及部分文件如下圖所示
這裏寫圖片描述

源碼如下:

#run.sh
#!/bin/bash

. ./cmd.sh ## You'll want to change cmd.sh to something that will work on your system.
           ## This relates to the queue.
. ./path.sh

H=`pwd`  #exp home
n=8      #parallel jobs

#corpus and trans directory
speech_data=/mnt/Corpus/Speech/HUB4CHN

#data preparation 
#generate text, wav.scp, utt2pk, spk2utt
local/data_prep.sh $H $speech_data || exit 1;

#produce MFCC features 
rm -rf data/mfcc && mkdir -p data/mfcc &&  cp -R data/{train,dev,test} data/mfcc || exit 1;
for x in train dev test; do
   #make  mfcc 
   steps/make_mfcc.sh --nj $n --cmd "$train_cmd" data/mfcc/$x exp/make_mfcc/$x mfcc/$x || exit 1;
   #compute cmvn
   steps/compute_cmvn_stats.sh data/mfcc/$x exp/mfcc_cmvn/$x mfcc/$x || exit 1;
done

#prepare language stuff
#build a large lexicon that invovles words in both the training and decoding. 
(
  echo "make word graph ..."
  cd $H; mkdir -p data/{dict,lang,graph} && \
  echo sil > data/dict/silence_phones.txt
  echo sil > data/dict/optional_silence.txt
  grep -v -F -f data/dict/silence_phones.txt phones.txt | grep -v '<eps>' | cut -f 1 > data/dict/nonsilence_phones.txt
  echo -e "<SPOKEN_NOISE>\tsil" | cat - $H/lexicon.txt | sort -u > data/dict/lexicon.txt || exit 1;
  utils/prepare_lang.sh --position_dependent_phones false data/dict "<SPOKEN_NOISE>" data/local/lang data/lang || exit 1;
  gzip -c $H/my.lm > data/graph/word.3gram.lm.gz || exit 1;
  utils/format_lm.sh data/lang data/graph/word.3gram.lm.gz $H/lexicon.txt data/graph/lang || exit 1;
)

#monophone
steps/train_mono.sh --boost-silence 1.25 --nj $n --cmd "$train_cmd" data/mfcc/train data/lang exp/mono || exit 1; 

#test monophone model  (mkgraph & decode)
local/my_decode.sh --mono true --nj $n "steps/decode.sh" exp/mono data/mfcc &

#local/data_prep.sh(僅列出關鍵部分)

dir=$1
corpus_dir=$2

cd $dir

echo "creating data/{train,dev,test}"
mkdir -p data/{train,dev,test}

#create wav.scp, utt2spk.scp, spk2utt.scp, text
(
for x in train dev test; do
  echo "cleaning data/$x"
  cd $dir/data/$x
  rm -rf wav.scp utt2spk spk2utt word.txt phone.txt text
  echo "preparing scps and text in data/$x"
  cp $corpus_dir/$x/wav.scp wav.scp
  cp $corpus_dir/$x/utt2spk utt2spk
  cp $corpus_dir/$x/text text
  cp text word.txt

  sort wav.scp -o wav.scp
  sort utt2spk -o utt2spk
  sort text -o text

done
) || exit 1

utils/utt2spk_to_spk2utt.pl data/train/utt2spk > data/train/spk2utt
utils/utt2spk_to_spk2utt.pl data/dev/utt2spk > data/dev/spk2utt
utils/utt2spk_to_spk2utt.pl data/test/utt2spk > data/test/spk2utt


#local/my_decode.sh(僅列出關鍵部分)

decoder=$1
srcdir=$2
datadir=$3

#decode word
utils/mkgraph.sh $opt data/graph/lang $srcdir $srcdir/graph_word  || exit 1;
$decoder --cmd "$decode_cmd" --nj $nj $srcdir/graph_word $datadir/test $srcdir/decode_test_word || exit 1

6. 參考文章

  1. 數據準備-Kaldi官方文檔 http://www.kaldi-asr.org/doc/data_prep.html
  2. Kaldi傻瓜教程-Kaldi官方文檔 http://www.kaldi-asr.org/doc/kaldi_for_dummies.html
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章