如何自己创建一个小型的ASR(语言识别)系统

本人对原网址的内容进行了翻译以及一些自己的理解和小结
原文网址: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.具体的项目工程

  1. 对于本教程的目的,想象你和我一样有相同的一组数据(如6.1节所述。音频数据部分)。然后尝试“模仿”我所做的每一个动作在建立你自己的项目的时候。如果你没有任何音频数据或者你想以不同的方式去完成该项目,随时记录你自己的步骤- 这将会学到更多的经验在使用ASR系统上。下面开始了。

你的前提:你有一些只包含口语数字的音频数据(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’。放在可辨认的文件夹下代表特定的说话人在特定的语句下的音频(有可能的录音情况是同一个人,但在两个不同的录音环境下,也许有噪声的情况-把它们放进不同的文件夹内)。所以总结一点:我的具体数据如下设置的:

  • 10 不同的说话者 (ASR 系统测试和训练都要分不同的人,人越多效果越好)
  • 每个说话者说十个句子
  • 100 个句子 (100 .wav 文件被放置在10个文件夹中,每个文件夹代表着特定的说话人。每个文件夹中有 10 个.wav文件.)
  • 300 个词语(从零到九的数字),
  • 每个句子或者话语包含亮3个词语。

无论你开始的数据是什么,调整我的例子对你特定的案件。注意大数据的设置和复杂的语法-先从一些简单的开始。在这个案例中只包含英语数字的句子是完美的。

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

and so on…

----- 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

and so on…

----- 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

and so on…

----- 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

and so on…

----- exemplary utt2spk ends -----

e.) corpus.txt
这个文件是有点稍微不同。 In kaldi/egs/digits/data 中创建另一个文件夹 ‘local’.
在kaldi/egs/digits/data/local文件夹中创造一个 corpus.txt文件。该文件夹包含了ASR系统中单一音频到文字的转换。(在我们的例中在将会有100个音频文件对应转换的文字).

PATTERN: ----- exemplary corpus.txt starts -----
one two five
six eight three
four four two

and so on…

----- 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目录中使用的解决方案。
我决定使用两种不同的训练方法:

  • MONO - monophone training,(单音素训练法)
  • TRI1 - simple triphone training (first triphone pass).(三音素训练法)
    这两种方法足以在仅使用数字词典和小训练数据集的解码结果中显示出明显的差异。

TASK:
在kaldi/egs/digits目录下创建 以下3个脚本:

a.) cmd.sh
----- cmd.sh script starts here -------------------------------------

Setting local system jobs (local CPU - no external clusters)

export train_cmd=run.pl
export decode_cmd=run.pl
----- cmd.sh script ends here ---------------------------------------

b.) path.sh
----- path.sh script starts here ------------------------------------

Defining Kaldi root directory

export KALDI_ROOT=pwd/…/…

Setting paths to useful tools

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

Defining audio data directory (modify it for your installation

directory!)
export DATA_ROOT="/home/{user}/kaldi-trunk/egs/digits/digits_audio"

Variable that stores path to MITLM library

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

Variable needed for proper data sorting

export LC_ALL=C
----- path.sh script ends here --------------------------------------

c.) run.sh
----- run.sh script starts here -------------------------------------

#!/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

Safety mechanism (possible running this script with modified arguments)

. utils/parse_options.sh || exit 1
[[ $# -ge 1 ]] && { echo “Wrong arguments!”; exit 1; }

Removing previously created data (from last run.sh execution)

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

Needs to be prepared by hand (or using self written scripts):

spk2gender [ ]

wav.scp [ ]

text [ ]

utt2spk [ ]

corpus.txt []

Making spk2utt files

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

Making feats.scp files

mfccdir=mfcc

Uncomment and modify arguments in scripts below if you have any problems with data sorting

utils/validate_data_dir.sh data/train # script for checking prepared data - here: for data/train directory

utils/fix_data_dir.sh data/train # tool for data proper sorting if needed - here: for data/train directory

steps/make_mfcc.sh --nj n j − − c m d " nj --cmd " njcmd"train_cmd" data/train exp/make_mfcc/train $mfccdir
steps/make_mfcc.sh --nj n j − − c m d " nj --cmd " njcmd"train_cmd" data/test exp/make_mfcc/test $mfccdir

Making cmvn.scp files

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

Needs to be prepared by hand (or using self written scripts):

lexicon.txt [ …]

nonsilence_phones.txt []

silence_phones.txt []

optional_silence.txt []

Preparing language data

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];thenifunameagrep64>/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 " njcmd"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 " njcmd"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 " njcmd"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 " njcmd"decode_cmd" exp/tri1/graph data/test exp/tri1/decode

echo
echo “===== run.sh script is finished =====”
echo

----- run.sh script ends here ---------------------------------------

9.得到结果

现在你所要做的就是运行run.sh脚本。 如果我在本教程中有任何的错误,终端的日志应该指导你如何处理它。
除了在终端窗口中您会注意到一些解码结果之外,还可以去新建的’kaldi/ egs / digits / exp’。 你可能会注意到有“mono”和“tri1”结果的文件夹 - 目录结构是一样的。 得到“单声道/解码”目录。 在这里你可以找到结果文件(以’wer_ {number}'命名)。 日志解码过程可以在“日志”文件夹(同一目录)中找到。

  1. 总结

这只是一个例子。 这个简短教程的目的是向你展示如何在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中使用自己的数据。

你可能感兴趣的:(语音识别)