Kaldi搭建語音識別系統—發音詞典相關檔案準備

牙牙學語的猿發表於2022-05-17

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~

相關文章