Kaldi搭建語音識別系統實踐——發音詞典相關檔案準備
在上一篇文章,我們講述瞭如何利用kaldi進行聲學特徵的提取,以及當前比較流行的聲學特徵(MFCC)。語音識別系統除了聲學特徵外,還有需要音素、發音詞典、聲學單元及kaldi識別的格式*.fst等檔案
發音詞典
開源普通話資料集aishell為我們提供了發音詞典,如下所示
該發音詞典主要採用聲韻母結構,其中a1中數字代表聲調,常用的聲調有5種,分別陰平、陽平、上聲、及去聲,外加一個輕聲;而對於靜音或者噪音,則統一採用SIL(silent的3個首字母)來表示。
聲學單元
kaldi中關於聲學單元有四種檔案,在data/local/dict目錄下,由指令碼生成, 檔案如下所示:
其中:
-
lexicon.txt: aishell提供的發音詞典,指令碼生成過程中拷貝了一份到此處。
-
silence_phones.txt: 靜音因素,此處為sil。
-
nonsilence_phones.txt: 非靜音因素集,除去SIL的音素。
-
optional_silence.txt: 包含一個單獨的音素用來作為詞典中預設的靜音音素。
-
extra_questions.txt: 構建決策樹的問題集,可以是空的,包含多組相同的音素,每一組音素包含相同的重音或者聲調;也有可能是一致表示非語音的靜音/噪音音素;這可以用於增加自動生成問題的數量。
以上就是關於聲學單元相關內容,按照慣例,小編會把kaldi中生成dict的指令碼放到此處,供有興趣的小夥伴一起學習~
#!/usr/bin/env bash
# Copyright 2017 Xingyu Na
# Apache 2.0
# prepare dict resources
if [ -d data/local/dict ]; then
echo "dict is prepared"
exit 0;
fi
. ./path.sh
[ $# != 1 ] && echo "Usage: $0 <resource-path>" && exit 1;
res_dir=$KALDI_ROOT/egs/aishell/s5/aishell/data/resource_aishell
dict_dir=data/local/dict
mkdir -p $dict_dir
cp $res_dir/lexicon.txt $dict_dir
cat $dict_dir/lexicon.txt | awk '{ for(n=2;n<=NF;n++){ phones[$n] = 1; }} END{for (p in phones) print p;}'| \
perl -e 'while(<>){ chomp($_); $phone = $_; next if ($phone eq "sil");
m:^([^\d]+)(\d*)$: || die "Bad phone $_"; $q{$1} .= "$phone "; }
foreach $l (values %q) {print "$l\n";}
' | sort -k1 > $dict_dir/nonsilence_phones.txt || exit 1;
echo sil > $dict_dir/silence_phones.txt
echo sil > $dict_dir/optional_silence.txt
# No "extra questions" in the input to this setup, as we don't
# have stress or tone
cat $dict_dir/silence_phones.txt| awk '{printf("%s ", $1);} END{printf "\n";}' > $dict_dir/extra_questions.txt || exit 1;
cat $dict_dir/nonsilence_phones.txt | perl -e 'while(<>){ foreach $p (split(" ", $_)) {
$p =~ m:^([^\d]+)(\d*)$: || die "Bad phone $_"; $q{$2} .= "$p "; } } foreach $l (values %q) {print "$l\n";}' \
>> $dict_dir/extra_questions.txt || exit 1;
echo "$0: AISHELL dict preparation succeeded"
exit 0;
歡迎有興趣的小夥伴一起來研究kaldi~