本人对原网址的内容进行了翻译以及一些自己的理解和小结
原文网址:http://kaldi-asr.org/doc/kaldi_for_dummies.html
目录
1.介绍
2.环境配置
3.下载KALDI
4.kaldi目录介绍
5.具体的项目工程
6.数据准备
7.工程最后一步
8.running脚本的创建
9.得到结果
10.总结
1.介绍
这个教程一步一步的教零基础初学者如何在kaldi工具箱上创建一个简单的ASR(自动语音识别)系统。使用自己的录制音频数据。你将学习如何安装Kaldi,如何使其工作,以及如何使用你自己的音频数据运行ASR系统。运行结束后你会的得到你的第一个语音解码结果。
首先 - 了解Kaldi究竟是什么,为什么你应该这样去使用它而不是别的东西。Kaldi需要扎实
的语音识别相关的和了解ASR系统的一般知识。它也可以很好的了解脚本语言的基础知识(bash, perl,
python)。C++也许在未来用的到(可能你会想要在源代码中进行一些修改)
To read:
http://kaldi.sourceforge.net/about.html
http://kaldi.sourceforge.net/tutorial_prereqs.html
2.环境配置
规则一:使用linux。虽然也可以在Windows上运行Kaldi,但发现大多数人说Linux在完成工作时会
有更少的问题。当你的Linux运行正确的,请打开一个终端,并安装一些必要的东西(如果你还没有安装):
(has to be installed)-必须安装
atlas – automation and optimization of calculations in the field of
linear algebra,
autoconf – automatic software compilation on different operating
systems,
automake – creating portable Makefile files,
git – distributed revision control system,
libtool – creating static and dynamic libraries,
svn – revision control system (Subversion), necessary for Kaldi
download and installation,
wget – data transfer using HTTP, HTTPS and FTP protocols,
zlib – data compression,
(probably has to be installed)-可能要安装
awk – programming language, used for searching and processing
patterns in files and data streams,
bash – Unix shell and script programming language,
grep – command-line utility for searching plain-text data sets for
lines matching a regular expression,
make – automatically builds executable programs and libraries from
source code,
perl – dynamic programming language, perfect for text files
processing.
完成。 操作系统和所有必要的Linux工具都准备好了。
3.kaldi的下载
安装过程按照下述网址步骤安装
需要注意的是:第一条指令:sudo apt-get install autoconf automaker gcc g++ libtool subversion gawk 中的automaker改为automake
跟着下面的步骤:https://zhuanlan.zhihu.com/p/26464775
4.kaldi目录结构
尝试确认特定的Kaldi组件的放置位置。 请阅读每个“README”文件,你会发现它会很有用。
‘kaldi’ - 主要Kaldi目录都包含在里面
‘egs’ – 示例脚本允许您快速构建ASR系统超过30个流行的语音语料库(文件被附带在每个工程上)
‘misc’ – 额外的工具和用品。
‘src’ – Kaldi 源代码
‘tools’ – 有用的组件和外部工具
‘windows’ – 使用Windows运行Kaldi的工具。
最重要的目录显然是“egs”。 在这里你将创建您自己的ASR系统。
5.具体的项目工程
你的前提:你有一些只包含口语数字的音频数据(zero, one, two…)至少是包含了几个说话者的。每
个音频文件是一个完整的英语句子(e.g. ‘one, nine, five’).
你的目的:你想把你的数据分成train和test集,建立一个ASR系统,训练它,测试它并得到一些解码结果。
你的首要任务:首先创建一个 'digits’文件夹 在 kaldi-trunk/egs/ 目录下.你会把所有与你的项目相关的东西放置的的地方。
6.数据准备
6.1.AUDIO DATA(音频数据)
假设你想要建立一个基于你自己音频数据的ASR系统。举个例子–让它变为100个文件形式。文件的格式是WAV。每个文件包含三个英语数字的语音的录音,一个接着一个。音频文件的命名的方法如下所示:e.g. 1_5_6.wav,这个形式意味着语音句子是’one, five, six’。放在可辨认的文件夹下代表特定的说话人在特定的语句下的音频(有可能的录音情况是同一个人,但在两个不同的录音环境下,也许有噪声的情况-把它们放进不同的文件夹内)。所以总结一点:我的具体数据如下设置的:
无论你开始的数据是什么,调整我的例子对你特定的案件。注意大数据的设置和复杂的语法-先从一些简单的开始。在这个案例中只包含英语数字的句子是完美的。
TASK:
去kaldi/egs/digits 目录下 创建一个 'digits_audio’文件夹. 在 kaldi/egs/digits/digits_audio 目录下创建两个文件夹:‘train’ and ‘test’.选择一个说话者去做为‘测试集’. 使用说话者的 ‘speakerID’ 作为kaldi-trunk/egs/digits/digits_audio/test 下的一个新文件夹的名字。然后将关于说话者的音频信息全部放到这个文件夹内。.将剩下9个说话者的信息放在‘训练集’的文件夹内-这将作为你的训练的数据。也要在里面分别创建9个说话人的子文件夹和上面一样。
6.2.ACOUSTIC DATA(声学数据)
现在你必须创建一些文本文件来让Kaldi进入与你的音频数据进行对应。 将这些文件视为“必须”
要做的”。您将在本节(以及“语言数据”部分中)中创建的每个文件都可以视为包含一定数量的字符串(每个字符串换行)的文本文件。这些字符串需要排序。如果遇到任何排序问题,可以使用Kaldi脚本进行检查(utils / validate_data_dir.sh)和修复(utils / fix_data_dir.sh)数据顺序(至关重要).对于你的信息 - utils目录将被附加到你的项目的工具附件部分.
TASK:
在 kaldi-trunk/egs/digits 目录下, 创建一个文件夹 ‘data’. 然后分别创建 ‘test’ and ‘train’ 子文件夹放在里面. 然后又分别文件夹中放置如下的文件。
a.) spk2gender
这个文档包含了说话者性别的信息. 和我们所想的一样, ‘speakerID’
是每个说话者的名字(在这个例子中它也可以是 ‘recordingID’ - 每个说话者只有一个音频数据文件夹 从一个录音会话中.在我的例子中有5个男的和5个女的 (f = female, m = male).
PATTERN:
----- exemplary spk2gender starts -----
july f
cristine f
dad m
josh m
----- exemplary spk2gender ends -----
b.) wav.scp
这个文件将每个会话与一个与之相关的音频文件连接起来这个话语(在特定的录音期间 一个人说了一句话) .
PATTERN:
----- exemplary wav.scp starts -----
july_1_2_5 /home/{user}/kaldi-
trunk/egs/digits/digits_audio/train/july/1_2_5.wav
july_6_8_3 /home/{user}/kaldi-
trunk/egs/digits/digits_audio/train/july/6_8_3.wav
dad_4_4_2 /home/{user}/kaldi-
trunk/egs/digits/digits_audio/train/dad/4_4_2.wav
----- exemplary wav.scp ends -----
c.) text
该文件包含与其文本匹配的每个话语转录。
PATTERN:
----- exemplary text starts -----
july_1_2_5 one two five
july_6_8_3 six eight three
dad_4_4_2 four four two
----- exemplary text ends -----
d.) utt2spk
这个文件告诉我们在ASR系统中,哪个会话属于特定的说话者。
PATTERN:
----- exemplary utt2spk starts -----
july_1_2_5 july
july_6_8_3 july
dad_4_4_2 dad
----- exemplary utt2spk ends -----
e.) corpus.txt
这个文件是有点稍微不同。 In kaldi/egs/digits/data 中创建另一个文件夹 ‘local’.
在kaldi/egs/digits/data/local文件夹中创造一个 corpus.txt文件。该文件夹包含了ASR系统中单一音频到文字的转换。(在我们的例中在将会有100个音频文件对应转换的文字).
PATTERN:
one two five
six eight three
four four two
----- exemplary corpus.txt ends -----
6.3 语言模型
这个部分与语言模型文件有关,需要知道哪一些文件必须去做。具体语法的细节在这个网址:http://kaldi.sourceforge.net/data_prep.html(每个文件都是精确的描述)。也可以随意浏览一下‘egs’里面的脚本文件。
TASK:
在kaldi/egs/digits/data/local 的目录下, 创建‘dict’文件夹. 然后在创建 ‘test’ 和 ‘train’ 子文件夹放在里面. 在kaldi/egs/digits/data/local/dict下创建如下的文件:
a.) lexicon.txt
这个文件包含了你字典里的每一个单词和它的‘音素的对应’(taken from /egs/voxforge)
PATTERN:
----- exemplary lexicon.txt starts -----
!SIL sil
spn
eight ey t
five f ay v
four f ao r
nine n ay n
one hh w ah n
one w ah n
seven s eh v ah n
six s ih k s
three th r iy
two t uw
zero z ih r ow
zero z iy r ow
----- exemplary lexicon.txt ends -----
b.) nonsilence_phones.txt
此文件列出您的项目中存在的非沉默音素(nonsilence phones)。
PATTERN:
----- exemplary nonsilence_phones.txt starts -----
ah
ao
ay
eh
ey
f
hh
ih
iy
k
n
ow
r
s
t
th
uw
w
v
z
----- exemplary nonsilence_phones.txt ends -----
c.) silence_phones.txt
这个文件列出了沉默音素(silence phones)。
PATTERN:
----- exemplary silence_phones.txt starts -----
sil
spn
----- exemplary silence_phones.txt ends -----
d.) optional_silence.txt
这个文件列出来一些可选择的沉默静音(optional silence phones)
PATTERN:
----- exemplary optional_silence.txt starts -----
sil
----- exemplary optional_silence.txt ends -----
7.工程最后一步
运行脚本创建之前的最后一章。 您的项目结构将完成。
7.1 工具附件
您需要添加必要的Kaldi工具,广泛应用于示例性脚本。
TASK:
从kaldi/egs/wsj/s5文件夹中复制两个文件夹(整个目录) ‘utils’ 和 ‘steps’ - 然后把它们放进 kaldi/egs/digits目录下.
7.2 打分脚本
这个脚本将帮助你获得解码结果。
TASK:
kaldi/egs/voxforge/local复制文件 score.sh到你相同项目的文件夹内 (kaldi-trunk/egs/digits/local).
7.3 配置文件
没有必要创建配置文件,但它对将来来说是一个的好习惯。
TASK:
I在kaldi/egs/digits内创建一个文件夹 ‘conf’. 在kaldi/egs/digits/conf文件夹内创建以下两个文件夹 (一些解码模型的配置和mfcc特征提取的过程-来自/egs/voxforge文件内):
a.) decode.config
----- exemplary decode.config starts -----
first_beam=10.0
beam=13.0
lattice_beam=6.0
----- exemplary decode.config ends -----
b.) mfcc.conf
----- exemplary mfcc.conf starts -----
–use-energy=false
----- exemplary mfcc.conf ends -----
7.4 SRILM的安装
你也需要安装语言模型工具使用在例子中-SRI语言模型工具箱(SRILM)
SRILM下载网址如下所示:http://www.speech.sri.com/projects/srilm/download.html
SRILM安装网址如下所示:http://blog.csdn.net/u011500062/article/details/50781101
8.运行脚本创建
在Kaldi环境下编写的第一个ASR系统已经接近完成了。你最后的工作是准备运行脚本来创建你选择的ASR系统。为了便于理解,我在准备好的脚本中添加了一些注释。
这些脚本基于/ egs / voxforge目录中使用的解决方案。
我决定使用两种不同的训练方法:
TASK:
在kaldi/egs/digits目录下创建 以下3个脚本:
export KALDI_ROOT=pwd
/…/…
export
PATH= P W D / u t i l s / : PWD/utils/: PWD/utils/:KALDI_ROOT/src/bin: K A L D I R O O T / t o o l s / o p e n f s t / b i n : KALDI_ROOT/tools/openfst/bin: KALDIROOT/tools/openfst/bin:K
ALDI_ROOT/src/fstbin/: K A L D I R O O T / s r c / g m m b i n / : KALDI_ROOT/src/gmmbin/: KALDIROOT/src/gmmbin/:KALDI_ROOT/src/featbin
/: K A L D I R O O T / s r c / l m / : KALDI_ROOT/src/lm/: KALDIROOT/src/lm/:KALDI_ROOT/src/sgmmbin/: K A L D I R O O T / s r c / s g m m 2 b i n / : KALDI_ROOT/src/sgmm2b in/: KALDIROOT/src/sgmm2bin/:KALDI_ROOT/src/fgmmbin/: K A L D I R O O T / s r c / l a t b i n / : KALDI_ROOT/src/latbin/: KALDIROOT/src/latbin/:PWD:$PATH
directory!)
export DATA_ROOT="/home/{user}/kaldi-trunk/egs/digits/digits_audio"
export LD_LIBRARY_PATH= L D L I B R A R Y P A T H : LD_LIBRARY_PATH: LDLIBRARYPATH:(pwd)/tools/mitlm-svn/lib
#!/bin/bash
. ./path.sh || exit 1
. ./cmd.sh || exit 1
nj=1 # number of parallel jobs - 1 is perfect for such a small data set
lm_order=1 # language model order (n-gram quantity) - 1 is enough for digits grammar
. utils/parse_options.sh || exit 1
[[ $# -ge 1 ]] && { echo “Wrong arguments!”; exit 1; }
rm -rf exp mfcc data/train/spk2utt data/train/cmvn.scp data/train/feats.scp data/train/split1 data/test/spk2utt data/test/cmvn.scp data/test/feats.scp data/test/split1 data/local/lang data/lang data/local/tmp data/local/dict/lexiconp.txt
echo
echo “===== PREPARING ACOUSTIC DATA =====”
echo
utils/utt2spk_to_spk2utt.pl data/train/utt2spk > data/train/spk2utt
utils/utt2spk_to_spk2utt.pl data/test/utt2spk > data/test/spk2utt
echo
echo “===== FEATURES EXTRACTION =====”
echo
mfccdir=mfcc
steps/make_mfcc.sh --nj n j − − c m d " nj --cmd " nj−−cmd"train_cmd" data/train exp/make_mfcc/train $mfccdir
steps/make_mfcc.sh --nj n j − − c m d " nj --cmd " nj−−cmd"train_cmd" data/test exp/make_mfcc/test $mfccdir
steps/compute_cmvn_stats.sh data/train exp/make_mfcc/train $mfccdir
steps/compute_cmvn_stats.sh data/test exp/make_mfcc/test $mfccdir
echo
echo “===== PREPARING LANGUAGE DATA =====”
echo
utils/prepare_lang.sh data/local/dict “” data/local/lang data/lang
echo
echo “===== LANGUAGE MODEL CREATION ="
echo "= MAKING lm.arpa =====”
echo
loc=which ngram-count
;
if [ -z l o c ] ; t h e n i f u n a m e − a ∣ g r e p 64 > / d e v / n u l l ; t h e n s d i r = loc ]; then if uname -a | grep 64 >/dev/null; then sdir= loc];thenifuname−a∣grep64>/dev/null;thensdir=KALDI_ROOT/…/Downloads/srilm/bin/i686-m64
else
sdir=$KALDI_ROOT/…/Downloads/srilm/bin/i686
fi
if [ -f $sdir/ngram-count ]; then
echo "Using SRILM language modelling tool from s d i r " e x p o r t P A T H = sdir" export PATH= sdir"exportPATH=PATH:$sdir
else
echo “SRILM toolkit is probably not installed.
Instructions: tools/install_srilm.sh”
exit 1
fi
fi
local=data/local
mkdir $local/tmp
ngram-count -order $lm_order -write-vocab $local/tmp/vocab-full.txt -wbdiscount -text $local/corpus.txt -lm $local/tmp/lm.arpa
echo
echo “===== MAKING G.fst =====”
echo
lang=data/lang
arpa2fst --disambig-symbol=#0 --read-symbol-table=$lang/words.txt $local/tmp/lm.arpa $lang/G.fst
echo
echo “===== MONO TRAINING =====”
echo
steps/train_mono.sh --nj n j − − c m d " nj --cmd " nj−−cmd"train_cmd" data/train data/lang exp/mono || exit 1
echo
echo “===== MONO DECODING =====”
echo
utils/mkgraph.sh --mono data/lang exp/mono exp/mono/graph || exit 1
steps/decode.sh --config conf/decode.config --nj n j − − c m d " nj --cmd " nj−−cmd"decode_cmd" exp/mono/graph data/test exp/mono/decode
echo
echo “===== MONO ALIGNMENT =====”
echo
steps/align_si.sh --nj n j − − c m d " nj --cmd " nj−−cmd"train_cmd" data/train data/lang exp/mono exp/mono_ali || exit 1
echo
echo “===== TRI1 (first triphone pass) TRAINING =====”
echo
steps/train_deltas.sh --cmd “$train_cmd” 2000 11000 data/train data/lang exp/mono_ali exp/tri1 || exit 1
echo
echo “===== TRI1 (first triphone pass) DECODING =====”
echo
utils/mkgraph.sh data/lang exp/tri1 exp/tri1/graph || exit 1
steps/decode.sh --config conf/decode.config --nj n j − − c m d " nj --cmd " nj−−cmd"decode_cmd" exp/tri1/graph data/test exp/tri1/decode
echo
echo “===== run.sh script is finished =====”
echo
9.得到结果
现在你所要做的就是运行run.sh脚本。 如果我在本教程中有任何的错误,终端的日志应该指导你如何处理它。
除了在终端窗口中您会注意到一些解码结果之外,还可以去新建的’kaldi/ egs / digits / exp’。 你可能会注意到有“mono”和“tri1”结果的文件夹 - 目录结构是一样的。 得到“单声道/解码”目录。 在这里你可以找到结果文件(以’wer_ {number}'命名)。 日志解码过程可以在“日志”文件夹(同一目录)中找到。
这只是一个例子。 这个简短教程的目的是向你展示如何在Kaldi中创建“任何东西”,获得更好的结果。并学会使用这个工具包时怎么去思考。Kaldi安装成功后,我启动了一些示例脚本(Yesno, Voxforge, LibriSpeech - 他们相对容易并有免费的声音/语言数据下载 ).
http://kaldi.sourceforge.net/index.html (现在是http://kaldi-asr.org/)-官方这项目的网址。对于初学者来说,有两个非常有用的部分:
a.) http://kaldi.sourceforge.net/tutorial.html -几乎“一步一步”教程如何建立一个ASR系统; 直到某一点,这可以在没有RM数据集的情况下完成。
b.) http://kaldi.sourceforge.net/data_prep.html -非常详细的解释如何在Kaldi中使用自己的数据。