PocketSphinx语音识别系统声学模型的训练与使用

zouxy09@qq.com

http://blog.csdn.net/zouxy09

声学模型主要用于计算语音特征和每个发音模板之间的似然度。目的是为每个声学单元建立一套模型参数(通过不断地学习和改进得到最优的,也就是概率最大的一组HMM模型参数)。

需要训练的情况:

1)需要创建一个新的语音或者方言的模型;

2)为你的小词汇的应用创建一个特定的模型;

3)你有足够的大量的语音数据:单的人的话(控制指令)需要1小时的录音,200个人的话需要50小时的录音。

4)你需要有语言的音素结构的知识;

5)你有足够的时间去训练和优化(大概需要一个月)。

如果不具备以上的情况或者条件,那么用模型增强(适应)比训练一个新的模型更有效。

另外,你的语音数据库应该能够比较好地代表你所要识别的语音,而且最好是多个人的录音数据,而且包含多种录音情况,还有所有可能的语言学句子。语音数据库包含两个部分:训练集和测试集,一般来说,测试集占全部数据库的1/10,但最好不要超过4个小时的录音时长。

获得一个语音数据库的一个比较好的方式是:

1)对现有的你需要识别的语音的录音材料进行切割,例如新闻或者电台播音等;

2)把你身边的人,例如家人,朋友或者同事的语音录下来;

3)在voxforge上面收集;

关于语音识别的基础知识和sphinx的知识,具体可以参考我的另外的博文:

语音识别的基础知识与CMUsphinx介绍:

http://blog.csdn.net/zouxy09/article/details/7941585

PocketSphinx语音识别系统的编译、安装和使用:

http://blog.csdn.net/zouxy09/article/details/7942784

PocketSphinx语音识别系统语言模型的训练和声学模型的改进:

http://blog.csdn.net/zouxy09/article/details/7949126

SphinxTrain是CMU大学开发的开源声学模型训练器。此工具可以训练适应于PocketSphinx的半连续HMM声学模型,也可以训练应用于Sphinx3的连续HMM声学模型。

(1)需要准备的文件:

在进行训练之前,先通过SphinxTrain中的wave2feat文件对音频文件进行特征提取,得到的MFCC特征参数文件,并把它们作为声学模型训练的输入。在进行训练之前,需要建立如下准备文件:

分别创建两个目录etc和wav,然后在两个目录下面制作一些数据文件,方便后面训练时使用。待会需要的目录及文件如下所示:

etc:

     your_db.dic - Phonetic dictionary

     your_db.phone – Phone set file

     your_db.lm.DMP - Language model

     your_db.filler - List of fillers

     your_db_train.fileids - List of files for training

     your_db_train.transcription - Transcription for training

     your_db_test.fileids - List of files for testing

     your_db_test.transcription - Transcription for testing

wav:

     speaker_1

         file_1.wav - Recording of speech utterance

     speaker_2

          file_2.wav

下面对以上的文件作用做些说明:

your_db.dic - Phonetic dictionary

主字典文件:该文件中包含要训练的所有词语以及与它们相对应的音素集(记录的是字到语音单元的映射)。如果某个词有两个以上的发音要分别列出。在训练之前,要指明如何将每一个数字的拼音拆解成声学模型。这里我们将数字的每一个音节看成一个声学模型,存放在字典文件中。文件的加载内容为:例如:

三SAN

四SI

五WU

一YAO

一(2) YI

如果是英文的话,例如:

HELLO HH AH L OW

WORLD W AO R L D

另外,对于特殊字符,我们需要对其进行修改,此处不说了。

your_db.phone – Phone set file

音素文件:表示声学模型训练单元,由于数字识别系统只包含10个词的小词汇量识别系统,所以我们的训练单元以这是个词的音节为训练基本单元即可。音素排列以26个字母顺序排列。在数字识别中主要选择音节作为识别单元,故音素文件中包括十二个单元:BA、ER、JIU、LING、LIU、QI、SAN、SI、SIL、WU、YAO、YI。其中SIL表示句子的停顿或静音,或者是录音环境的背景噪声。YAO和YI代表了数字1的两个发音。

例如,如果声学单元是音素的话,就是每个音素一行,最后加上SIL这个静音单元:

AH

AX

DH

your_db.lm.DMP - Language model

语言模型文件:你在训练得到的语言模型。

your_db.filler - List of fillers

补充字典文件:该文件主要列举了非语音单词,它可以包括静音,背景噪声,或者mm,um或者呼吸,笑等等。多音字的情况必须全部列出,除此文件外我们还要建立一个补充字典来说明语音中的停顿,当然这种静音(或停顿)可以理解为背景噪声。每个补充字典文件至少包含以下三项:

<s> SIL

</s> SIL

<sil> SIL

文件中的<s>代表句首的停顿,</s>代表句末的停顿,<sil>代表句中词间的停顿。这些静音词汇共同对应音素SIL。

your_db_train.fileids - List of files for training

控制文件:指明了包含所有训练语音文件的路径。表示如下

wav/train/name1/1.WAV

wav/train/name2/1.WAV

your_db_train.transcription - Transcription for training

脚本文件: 存放每个控制文件(用于训练的)路径的内容(告诉训练器你需要训练哪些语音单元)。文件内容是与控制文件的路径一一对应的语句内容。包括句中的停顿也要用文本列举出来。例如:1.WAV录下的就是hello world这个句子的音,那文件的内容就是:

<s> hello world </s> (1)

<s> foo bar </s> (2)

主要注意的是,每个行都需要以<s>开始和以 </s>结束,而且()括号内的语音文件只包含文件名,不包含文件路径。

your_db_test.fileids - List of files for testing

控制文件:指明了包含所有测试语音文件的路径。

your_db_test.transcription - Transcription for testing

脚本文件: 存放每个控制文件(用于测试的)路径的内容。

在准备这些文件的时候必须注意以下几点:

1)主字典和补充字典必须与音素文件相对应,即字典文件中不允许有音素文件中不存在的音素;

2)确保字典文件中没有重复的单词,不包括多音字的列举;

3)确保脚本文件和控制文件行数相同,并且一一对应;

4)确保脚本文件中的词都存在与字典文件中;

5)确保脚本文件中所有音素都存在于音素文件中,并且音素在训练的脚本文件中出现一次。

以上五点,如有一点不满足条件,训练将自动终止。

(2)准备etc下的数据文件

# mkdir train

# cd train

# mkdir etc wav

# cd etc

1、声音文件我是直接放在wav文件夹下的,命名如下(因为这样方便我用脚本去控制录音):

# vi my_db_train.fileids

voice_0001

voice_0002

voice_0003

voice_0004

voice_0005

voice_0006

voice_0007

voice_0008

voice_0009

voice_0010

voice_0011

voice_0012

voice_0013

voice_0014

voice_0015

voice_0016

voice_0017

2、测试数据和语音数据一样,因为我并没有测试这个步骤,所以把简单的copy了一下:

# cp my_db_train.fileids my_db_test.fileids

3、我的库主要是包含了17个控制的指令,如下:

#vi my_db_train.transcription

<s> 确定 </s> (voice_0001)

<s> 取消 </s> (voice_0002)

<s> 关闭 </s> (voice_0003)

<s> 退出 </s> (voice_0004)

<s> 返回 </s> (voice_0005)

<s> 放大 </s> (voice_0006)

<s> 缩小 </s> (voice_0007)

<s> 音乐 </s> (voice_0008)

<s> 图片 </s> (voice_0009)

<s> 视频 </s> (voice_0010)

<s> 天气 </s> (voice_0011)

<s> 设置 </s> (voice_0012)

<s> 菜单 </s> (voice_0013)

<s> 向左 </s> (voice_0014)

<s> 向右 </s> (voice_0015)

<s> 向上 </s> (voice_0016)

<s> 向下 </s> (voice_0017)

4、#cp my_db_train.transcription my_db_test.transcription

5、# vi my_db.dic

确定 Q UE D ING

取消 Q U X IAO

关闭 G UAN B I

退出 T UI CH U

返回 F AN H UI

放大 F ANG D A

缩小 S UO X IAO

音乐 Y IN Y UE

图片 T U P IAN

视频 SH I P IN

天气 T IAN Q I

设置 SH E ZH IB

菜单 C AI D AN

向左 X IANG Z UO

向右 X IANG Y OU

向上 X IANG SH ANG

向下 X IANG X IA

6、#vi my_db.filler

<s> SIL

</s> SIL

<sil> SIL

7、生成my_db.phone

#cp ../../sourcecode/sphinxtrain-1.0.7/scripts_pl/make_phoneset.pl .

#./make_phoneset.pl my_db.dic my_db.filler > my_db.phone

# vi my_db.phone  //看下有没有多余的

A

AI

AN

ANG

B

C

CH

D

E

F

G

H

I

IA

IAN

IANG

IAO

IB

IN

ING

OU

P

Q

S

SH

SIL

T

U

UAN

UI

UO

UX

UXE

X

Y

Z

ZH

以上若有多余字母,可手工删除。

8、把之前的my_db.lm.DMP也拷贝到etc下。

至此,etc下的数据文件已准备完毕。

注意:以上所有的文件在输入结尾不可留下“/n”。

(3)准备wav下的音频文件

为每一个控制词录制一个语音文件,录音文件的命名需要和my_db_train.transcription与my_db_train.fileids的一致。

注意:此处音频文件采样率16KHz,16bit单声道录音,而且是wav格式。

我在Linux下写了一个处理脚本来实现上面这17个词的录音:rec_wav.sh,内容如下:

#cd ../wav

#vi rec_wav.sh

for i in `seq 1 17`; do

fn=`printf voice_%04d $i`;

read sent; echo $sent;

rec -r 16000 -e signed-integer -b 16 -c 1 $fn.wav 2>/dev/null;

done < ../etc/my_db.dic

在这里我们需要用到rec这个录音命令,这个命令是由Linux下一个很有名的音频转换程序sox携带的,所以我们需要先安装sox:

#apt-get install sox

然后改变rec_wav.sh的运行属性:

#chmod 777 rec_wav.sh

#./rec_wav.sh

这个脚本会显示一个词,然后进入录音,我们把这个词读出来,然后按ctrl+c显示下一个词,然后录音,如此循环到全部的词的语音数据拿到。这样在当前文件夹下面就会显示如下文件:

voice_0001.wav

voice_0002.wav

.....

voice_0017.wav

然后,我们需要测试下每个音频文件是否正常:

for i in *.wav; do play $i; done

他会依次的播放我们录下的这些音频文件;如果不对的话,就得重录,我的就没有什么问题。

(4)an4与sphinxtrain搭建语音训练系统

an4是一个CMU在1991年录的音频数据库。具体见:

http://www.speech.cs.cmu.edu/databases/an4/

需要的包有: sphinxbase、SphinxTrain、pocketsphinx、perl和python,这两个是额外的需要安装的包,如果在windows下的话,建议使用ActivePerl。

配置训练脚本:

注意下面的sphinxtrain-1.0.7和pocketsphinx-0.7是我们当时下载解压的相应的源码目录。

#mkdir /host/xtrain

#cd /host/xtrain

# ../sourcecode/sphinxtrain-1.0.7/scripts_pl/setup_SphinxTrain.pl -task an4

# ../sourcecode/pocketsphinx-0.7/scripts/setup_sphinx.pl -task an4

在当前目录下面会产生如下目录:

bin

bwaccumdir

etc

feat

logdir

model_parameters

model_architecture

scripts_pl

wav

把(2)、(3)中etc、wav下面的文件相应的拷贝到刚生成的wav与etc中。这时候xtrain目录的文件如下:

.

├── bin

│   ├── agg_seg

│   ├── batch.c

……

│   └── tiestate

├── bwaccumdir

├── etc

│   ├── feat.params

│   ├── make_phoneset.pl

│   ├── my_db.dic

│   ├── my_db.filler

│   ├── my_db.phone

│   ├── my_db_test.fileids

│   ├── my_db_test.transcription

│   ├── my_db.tmp.vocab

│   ├── my_db_train.fileids

│   ├── my_db_train.transcription

│   ├── sphinx_decode.cfg

│   └── sphinx_train.cfg

├── feat

├── logdir

├── model_architecture

├── model_parameters

├── scripts_pl

│   ├── 00.verify

│   │  └── verify_all.pl

│   ├── 01.lda_train

│   │  ├── baum_welch.pl

│   │  ├── lda_train.pl

│   │  ├── norm_and_launchbw.pl

│   │  ├── norm.pl

│   │  └── slave_lda.pl

……

│   ├── 90.deleted_interpolation

│   │  └── deleted_interpolation.pl

│   ├── bin

│   ├── bwaccumdir

│   ├── copy_setup.pl

│   ├── decode

│   │  ├── psdecode.pl

│   │  ├── setup_sphinx.pl

│   │  ├── setup_tutorial.pl

│   │  ├── slave.pl

│   │  ├── verify_dec.pl

│   │  └── word_align.pl

│   ├── etc

│   ├── feat

│   ├── lib

│   │  ├── Queue

│   │  │   ├── Job.pm

│   │  │   ├── PBS.pm

│   │  │   └── POSIX.pm

│   │  ├── Queue.pm

│   │  ├── SimpleConfig.pm

│   │  ├── SphinxTrain

│   │  │   ├── Config.pm

│   │  │   └── Util.pm

│   │  └── test_SimpleConfig.pl

│   ├── logdir

│   ├── make_feats.pl

│   ├── make_phoneset.pl

│   ├── maketopology.pl

│   ├── model_architecture

│   ├── model_parameters

│   ├── new_experiment.pl

│   ├── RunAll.pl

│   ├── setup_SphinxTrain.pl

│   ├── setup_tutorial.pl

│   ├── texFormat.pl

│   ├── tune_senones.pl

│   └── wav

├── setup_SphinxTrain.pl

└── wav

├── rec_wav.sh

├── test_wav.sh

├── voice_0001.wav

├── voice_0002.wav

……

├── voice_0016.wav

└── voice_0017.wav

然后我们需要修改etc文件夹下面的配置文件,还要修改很多变量;

(5)修改etc/sphinx_train.cfg配置

1)配置那些文件的路径

# These are filled in at configuration time

$CFG_DB_NAME = "an4";

改为

$CFG_DB_NAME = "my_db";

2)修改语音数据库的音频文件的格式

我们录制的是MSWav格式,所以修改sph为 wav ,修改nist为mswav。

# Audio waveform and feature file information

$CFG_WAVFILES_DIR = "$CFG_BASE_DIR/wav";

$CFG_WAVFILE_EXTENSION = 'sph';

$CFG_WAVFILE_TYPE = 'nist'; # one of nist, mswav, raw

改为

# Audio waveform and feature file information

$CFG_WAVFILES_DIR = "$CFG_BASE_DIR/wav";

$CFG_WAVFILE_EXTENSION = 'wav';

$CFG_WAVFILE_TYPE = 'mswav'; # one of nist, mswav, raw

3)文件命名

#*******variables used in main training of models*******

$CFG_DICTIONARY     = "$CFG_LIST_DIR/$CFG_DB_NAME.dic";

$CFG_RAWPHONEFILE   = "$CFG_LIST_DIR/$CFG_DB_NAME.phone";

$CFG_FILLERDICT     = "$CFG_LIST_DIR/$CFG_DB_NAME.filler";

$CFG_LISTOFFILES    = "$CFG_LIST_DIR/${CFG_DB_NAME}_train.fileids";

$CFG_TRANSCRIPTFILE = "$CFG_LIST_DIR/${CFG_DB_NAME}_train.transcription";

$CFG_FEATPARAMS     = "$CFG_LIST_DIR/feat.params";

确定etc下面的文件是以这种方式命名的。

4)配置模型类型与模型参数

#*******variables used in characterizing models*******

$CFG_HMM_TYPE = '.cont.'; # Sphinx 4, Pocketsphinx

#$CFG_HMM_TYPE  = '.semi.'; # PocketSphinx

#$CFG_HMM_TYPE  = '.ptm.'; # PocketSphinx (larger data sets)

cont表示的是连续模型,semi表示半连续模型,是什么类型,就把前面的注销符号#去掉就行了,pocketsphinx和Sphinx III一样,都是.cont。

5)配置声音特征参数

这里的操作为采样率为8KHz的情况,若采样率为16KHz,则可以直接略过此步操作。

vi feat.params

添加修改如下:

-samprate 8000.0

-nfilt 31

-lowerf 200.00

-upperf 3500.00

-dither yes

(6)配置解码参数etc/sphinx_decode.cfg

1)路径

# These are filled in at configuration time

$DEC_CFG_DB_NAME = 'an4';

改为

$DEC_CFG_DB_NAME = 'my_db';

2)语言模型名称

# This variables, used by the decoder, have to be user defined, and

# may affect the decoder output

$DEC_CFG_LANGUAGEMODEL_DIR = "$DEC_CFG_BASE_DIR/etc";

$DEC_CFG_LANGUAGEMODEL  = "$DEC_CFG_LANGUAGEMODEL_DIR/an4.lm.DMP";

改为

# This variables, used by the decoder, have to be user defined, and

# may affect the decoder output

$DEC_CFG_LANGUAGEMODEL_DIR = "$DEC_CFG_BASE_DIR/etc";

$DEC_CFG_LANGUAGEMODEL  = "$DEC_CFG_LANGUAGEMODEL_DIR/my_db.lm.DMP";

(6)开始训练

#cd /host/xtrain

#./scripts_pl/make_feats.pl -ctl etc/my_db_train.fileids

#./scripts_pl/make_feats.pl -ctl etc/my_db_test.fileids

#./scripts_pl/RunAll.pl

这需要几分钟的训练时间,但如果数据库很大的话,可能需要一个月的训练时间。整一个训练过程最重要的阶段是第一阶段,主要是检查所有的配置是否正确,还有输入的数据是够具有一致性。

新的声学模型在目录model_parameters中生成:

root@ubuntu:/host/xtrain/model_parameters# ls

my_db.cd_cont_1000    my_db.cd_cont_1000_2  my_db.cd_cont_1000_8   my_db.cd_cont_untied  my_db.ci_cont_flatinitial

my_db.cd_cont_1000_1  my_db.cd_cont_1000_4  my_db.cd_cont_initial  my_db.ci_cont

命名规则是:

model_parameters/<your_db_name>.cd_cont_<number_of senones>

或者

model_parameters/<your_db_name>.cd_semi_<number_of senones>

每个模型目录的文件如下:

mdef

feat.params

mixture_weights

means

noisedict

transition_matrices

variances

三、测试使用

#cd /host/xtrain

# pocketsphinx_continuous -hmm model_parameters/my_db.cd_cont_1000 -lm etc/my_db.lm.DMP -dict etc/my_db.dic

 

Reference

CMU sphinx的wiki:http://cmusphinx.sourceforge.net/wiki/

王韵,基于Sphinx的汉语连续语音识别,太原理工大学,硕士学位论文

PocketSphinx语音识别系统声学模型的训练与使用相关推荐

  1. pocketsphinx 模型库_[转] PocketSphinx语音识别系统声学模型的训练与使用

    PocketSphinx语音识别系统声学模型的训练与使用 声学模型主要用于计算语音特征和每个发音模板之间的似然度.目的是为每个声学单元建立一套模型参数(通过不断地学习和改进得到最优的,也就是概率最大的 ...

  2. PocketSphinx语音识别系统语言模型的训练和声学模型的改进

    PocketSphinx语音识别系统语言模型的训练和声学模型的改进 zouxy09@qq.com http://blog.csdn.net/zouxy09 关于语音识别的基础知识和sphinx的知识, ...

  3. [转]PocketSphinx语音识别系统语言模型的训练和声学模型的改进

    PocketSphinx语音识别系统语言模型的训练和声学模型的改进 zouxy09@qq.com http://blog.csdn.net/zouxy09 关于语音识别的基础知识和sphinx的知识, ...

  4. PocketSphinx语音识别系统的编程

    PocketSphinx语音识别系统的编程 zouxy09@qq.com http://blog.csdn.net/zouxy09 关于语音识别的基础知识和sphinx的知识,具体可以参考我的另外的博 ...

  5. PocketSphinx语音识别系统的编译、安装和使用

    PocketSphinx语音识别系统的编译.安装和使用 zouxy09@qq.com http://blog.csdn.net/zouxy09 Sphinx是由美国卡内基梅隆大学开发的大词汇量.非特定 ...

  6. pocketsphinx 模型库_PocketSphinx声学模型的训练与使用

    声学模型主要用于计算语音特征和每个发音模板之间的似然度.目的是为每个声学单元建立一套模型参数(通过不断地学习和改进得到最优的,也就是概率最大的一组HMM模型参数). 需要训练的情况: 1)需要创建一个 ...

  7. 语音识别入门第五节:基于GMM-HMM的语音识别系统

    目录 基于孤立词的GMM-HMM语音识别系统 训练 解码 基于单音素的GMM-HMM语音识别系统 音素/词典 训练 解码 基于三音素的GMM-HMM语音识别系统 三音素 决策树 基于孤立词的GMM-H ...

  8. 用 Python 训练自己的语音识别系统,这波操作稳了

    作者 | 李秋键 责编 | Carol 封图 | CSDN 付费下载自视觉中国 近几年来语音识别技术得到了迅速发展,从手机中的Siri语音智能助手.微软的小娜以及各种平台的智能音箱等等,各种语音识别的 ...

  9. [转]语音识别中区分性训练(Discriminative Training)和最大似然估计(ML)的区别...

    转:http://blog.sina.com.cn/s/blog_66f725ba0101bw8i.html 关于语音识别的声学模型训练方法已经是比较成熟的方法,一般企业或者研究机构会采用HTK工具包 ...

最新文章

  1. Win2008学习(二),群集的仲裁配置
  2. 700多位老人的“智慧”养老记
  3. 前端学习(2718):重读vue电商网站38之通过input输入框优化
  4. 赢在中国 (2008-3-19)
  5. beeline连接hiveserver2报错:User: root is not allowed to impersonate root
  6. avr flash_AVR | USART家庭自动化
  7. c# webclient 保存会话信息_会话保持机制cookie和session
  8. [转载]github在线更改mysql表结构工具gh-ost
  9. ADS软件仿真的问题
  10. 七月文章导读【5G相关】:从摩斯码到5G;5G承载网;5G链路自适应及CQI工作过程
  11. 简易数字电路交通灯设计
  12. 社区宽带繁忙是什么意思_沈阳附近长城宽带安装申请多少钱欢迎咨询_畅鹏城通讯...
  13. 编程实现误差逆传播算法(BP算法)
  14. 【AcWing】语法基础课听课笔记
  15. 【软件】debussy安装过程记录
  16. SDN网络的本质特点
  17. 动态的渐变色网页背景
  18. 百度文心一言可以完胜ChatGPT的4点可能性
  19. Cadence IC617工艺库安装步骤
  20. 笔试题-武汉珞珈德毅笔试题

热门文章

  1. YOLOv4论文笔记
  2. 茂名2021高考成绩查询入口,茂名高考成绩查询入口
  3. sonarqube怎么分析php项目,SonarQube代码质量分析平台介绍
  4. avue里面的select怎么设置默认值_mysql大量的waiting for table level lock怎么办
  5. 匿名函数 lambda
  6. POJ 2287 - Tian Ji -- The Horse Racing(贪心)
  7. echart模块化单文件引入
  8. 【转】eclipse中window-preference选项中没有tomcat的解决方法
  9. C# 获得两日期之间所有月份(包括跨年)
  10. Nginx 的 Location 配置指令块