语音识别(ASR)-- Kaldi学习笔记
语音识别简介
语音识别(Speech Recognition)技术,也被称为自动语音识别(Automatic Speech Recognition, ASR)、计算机语音识别(Computer Speech Recognition)或是语音转文本识别(Speech To Text),其目标是用计算机自动将人类的语音内容转换为相应的文字。
语音识别,大体上可分为“传统”识别方式与“端到端”识别方式,其主要差异体现在声学模型上。“传统”方式的声学模型一般采用隐马尔可夫模型(HMM),而“端到端”方式一般采用深度神经网络(DNN)。
- 声学模型:是将声学和发音学的知识进行整合,以特征提取部分生成的特征作为输入,并为可变长特征序列生成声学模型分数。
- 语音模型:通过从训练语料(通常是文本形式)学习词之间的相互关系,来估计假设词序列的可能性,又叫语言模型分数。
- GMM:Gaussian Mixture Model,高斯混合模型,描述基于傅里叶频谱语音特征的统计模型,用于传统声学模型的建模中。
- HMM:Hidden Markov Model,隐马尔可夫模型,是一种用来描述含有未知参数的马尔可夫过程,其难点是从可观察的参数中确定该过程的隐含参数。然后利用这些参数来作进一步的分析,例如模式识别。
- MFCC:Mel-Frequency Cepstral Coefficients,梅尔频录倒谱系数,是组成梅尔频率倒谱的系数。衍生自音讯片段的倒频谱(cepstrum)。倒谱与梅尔倒谱的区别在于,梅尔频率倒谱的频带划分是在梅尔刻度上等距划分的,它比用于正常的对数倒频谱中的线性间隔的频带更接近人类的听觉系统。广泛应用于语音识别中。
- Fbank:Mel Frequency Filter Bank,梅尔频率滤波器组。
- WER:Word Error Rate,词错误率,是最常见的衡量语音识别系统性能的指标。
GMM-HMM基本原理
一个语音识别系统主要包括信号处理和特征提取、声学模型训练、语言模型训练以及识别引擎等几个核心部分:
- 特征提取:语音识别的第一步就是特征提取,去掉语音信号中对于语音识别无用的冗余信息(如背景噪音),保留能够反映语音本质特征的信息(为后面的声学模型提取合适的特征向量),并用一定的形式表示出来;较常用的特征提取算法又MFCC。
- 声学模型训练:根据语音库的特征参数训练出声学模型参数,在识别的时候可以将待识别的语音特征参数同声学模型进行匹配,从而得到识别结果。目前主流的语音识别系统多采用HMM进行声学模型建模。
- 语言模型训练:就是用来计算一个句子出现的概率模型,主要用于决定哪个词序列的可能性更大。语言模型分为三个层次:字典知识、语法知识、句法知识。对训练文本库进行语法、语义分析,经过基于统计模型训练得到语言模型。
- 语音解码与搜索算法:其中解码器就是针对输入的语音信号,根据已经训练好的声学模型、语言模型以及字典建立一个识别网络,再根据搜索算法在该网络中寻找一条最佳路径,使得能够以最大概率输出该语音信号的词串,这样就确定这个语音样本的文字。
DNN-HMM(基于神经网络)
把之前的GMM换成DNN,深度学习模型可以更好的模拟语音信号。
Kaldi
Kaldi架构简介
Kaldi语音识别工具将HTK比较零碎的各种各样的指令和功能进行整理集合,使用perl脚本调用。同时也加入了深度神经网络的分类器(DNN),本身由原来做HTK开发的人员制作而成,可以说是HTK的升级加强版。
kaldi官方网站请见:http://kaldi.sourceforge.net/index.html
如上图所示,最上面是外部的工具,包括用于线性代数库BLAS/LAPACK和OpenFST。中间是Kaldi的库,包括HMM和GMM等代码,下面是编译出来的可执行程序,最下面是一些脚本,用于实现语音识别的不同步骤(比如特征提取,训练单因子模型等等)。
Kaldi在Windows下的安装
工具准备
- Git
- CMake
- Visual Studio 2017
vs2017安装时要注意安装Win8.1 SDK,如果已经安装了vs2017,也可以在上方的菜单栏中的工具–获取工具和功能来查看是否安装。
编译OpenFST
首先从 github 上将 openfst clone 下来。然后这里用 cmake 的方式来先编译出 vs 的工程文件,具体操作方法如下:
$ git clone https://github.com/kkm000/openfst.git
$ cd openfst
$ mkdir build64
$ cd build64
$ cmake -G "Visual Studio 15 2017 Win64" ../
如果这一步成功会显示以下提示:
**-- The C compiler identification is MSVC 19.11.25547.0
-- The CXX compiler identification is MSVC 19.11.25547.0
-- Check for working C compiler: C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/VC/Tools/MSVC/14.11.25503/bin/Hostx86/x64/cl.exe
-- Check for working C compiler: C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/VC/Tools/MSVC/14.11.25503/bin/Hostx86/x64/cl.exe -- works
-- Detecting C compiler ABI info
-- Detecting C compiler ABI info - done
-- Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/VC/Tools/MSVC/14.11.25503/bin/Hostx86/x64/cl.exe
-- Check for working CXX compiler: C:/Program Files (x86)/Microsoft Visual Studio/2017/Community/VC/Tools/MSVC/14.11.25503/bin/Hostx86/x64/cl.exe -- works
-- Detecting CXX compiler ABI info
-- Detecting CXX compiler ABI info - done
-- Detecting CXX compile features
-- Detecting CXX compile features - done
-- The following ICU libraries were not found:
-- data (required)
-- i18n (required)
-- io (required)
-- test (required)
-- tu (required)
-- uc (required)
-- Failed to find all ICU components (missing: ICU_INCLUDE_DIR ICU_LIBRARY _ICU_REQUIRED_LIBS_FOUND)
-- Could NOT find ZLIB (missing: ZLIB_LIBRARY ZLIB_INCLUDE_DIR)
-- Configuring done
-- Generating done
-- Build files have been written to: C:/Users/jtrmal/Documents/openfst/build64**
成功后会在 build64 目录下面生成一个 openfst.sln 文件,用 vs2017 打开这个文件,分别用 Debug|x64 和 Release|x64 来生成一遍,如果失败为 0 则代表编译通过。
配置PortAudio
- 从http://www.portaudio.com/download.html下载PortAudio并解压缩文件夹
- 打开实例或Powershell或命令提示符,导航到portaudio目录并键入:$ cmake -G“ Visual Studio 15 2017 Win64”
- CMake将在目录中生成一个portaudio.sln。 打开它
- 右键单击portaudio_static->属性-> C / C +±>代码生成->运行时库,从多线程调试(/ MTd)更改为多线程调试DLL(/ MDd)
配置Kaldi
- 从 github 上先将 kaldi clone 下来
$ git clone https://github.com/kaldi-asr/kaldi.git kaldi
- 配置线性代数库OpenBLAS,用下面的命令来下载 OpenBLAS 的二进制包(在 kaldi/tools 目录下):
(kaldi)/tools$ curl -L -O http://sourceforge.net/projects/openblas/files/v0.2.14/OpenBLAS-v0.2.14-Win64-int32.zip
(kaldi)/tools$ curl -L -O http://sourceforge.net/projects/openblas/files/v0.2.14/mingw64_dll.zip
(kaldi)/tools$ unzip OpenBLAS-v0.2.14-Win64-int32.zip
(kaldi)/tools$ unzip mingw64_dll.zip
注意这里要下载 Win64-int32 版本,而不是 Win64-int64 版本
- 进入 kaldi/windows 路径想,将 varialbes.props.dev 复制一份重命名为 variables.props,打开 variables.props库修改为自己的路径。
- 同样还是在 kaldi/windows 路径下,因为我们是使用 OpenBLAS 所以就把 kaldiwin_openblas.props 复制一份重命名为 kaldiwin.props。
- 在 windows 路径下用 git bash 运行以下命令:
./generate_solution.pl --vsver vs2017 --enable-openblas
./get_version.pl
- 打开 kaldi/kaldiwin_vs2017_OPENBLAS 这个新生成的文件夹,打开里面的 kaldiwin_vs2017.sln 工程文件,这里面就包括了所有 kaldi/src 中 * bin 中的. cc 文件。这时候需要来测试一下 kaldi 能否运行,首先要把 Debug|Win32 改为 Debug|x64,然后点击生成。如果生成成功则代表之前的工作都做对啦,kaldi 已经配置好了,文件会生成在 kaldiwin_vs2017_OPENBLAS/x64/Debug 中。
Kaldi目录说明
一级目录 | 内容 |
---|---|
egs | Kaldi的实例,包含了语音识别,语种识别,声纹识别,关键字识别等 |
misc | 包含了一些pdf,以及相关docker, htk等资源 |
scripts | 只用来存放Rnnlm,以及相应的运行脚本 |
src | 存放Kaldi的源代码,包含GMM, Ivextor, Nnet等一系列的传统语音识别算法 |
tools | 主要存放Kaldi依赖库的安装脚本,线性代数库、OpenFST等 |
Windows | 在Windows平台运行所必须的脚本以及相关的执行程序 |