
(4)HMM训练
本系统先使用HInit工具对HMM模型进行初始化,再用HCompv工具来对模型进行平坦初始化。HMM模型的每个状态给定相同的平均向量和变化向量,在整个训练集上全局计算而得。最后用HRest的多次估计迭代,估计出HMM模型参数的最佳值,经多次迭代,将训练得到的单个HMM模型整合到一个hmmsdef.mmf文件中。声学模型HTK训练流程如图5所示。

3.2 Julius应用
3.2.1 Julius部署
在本系统中语音识别部分是部署在Atom Z510上,而Atom Z510上首先需要移植linux操作系统(本系统采用的是ubuntu8.10)以上步骤在此不详细介绍,文献中有详细说明。语音识别的核心部分是Julius识别器,需要将Julius源码编译部署到Atom Z510平台。其步骤如下:
①要确保linux系统中有以下支持库:Zlib、flex、OSS音频驱动接口、ESounD和libsndfile。
②从Julius官网下载源代码Julius-4.1.5。
③解压:tar-zxjf julius-4.1.5。
④编译:%./configure,%make,%make install。
3.2.2 Julius配置
Julius全部采用C语言代码实现,采用模块化设计方式,而且各功能模块可配置。在使用前需要将配置参数写入jconf文件,此文件作为运行参数载入系统,系统扫描参数配置并启动各功能块。其中重点介绍以下几个配置参数:
◆-dfa rtdog.dfa,指定语法文件rtdog.dfa;
◆-v rtdog.dict,指定字典文件;
◆-h rtdog.binhmm,指定HMM模型文件;
◆-lv 8000,设定音频的阈值便于滤去噪音;
◆-rejectshort 600,设定最小的语音长度;
◆-input mic,设定语音的输入方式为microphone。
3.3 语音识别系统软件设计
3.3.1 GUI设计
本系统为了方便测试,采用QT4的图形库来开发人机界面(GUI),同时加入了手动控制的按钮。其总体功能如图6所示。通信线程是本系统的数据传输枢纽,十分重要。在QT中通过对线程类QThread继承来实现新的线程设计。该类提供了创建一个新线程以及控制线程运行的各种方法。线程是通过QThread::run()重载函数开始执行的。在本系统中设计了1个数据通信线程,用它来不断地读取共享内存中的语音命令,然后将其转化为控制命令传给机器人控制模块。

3.3.2 模块间通信
由于系统的3个模块不在同一个平台上部署,运行过程中需要进行数据通信。GUI和Julius都部署在Atom Z510平台上,但属于2个进程,它们之间可以通过共享内存来交互数据。而GUI和机器人控制模块就需要通过网络通信来实现数据交互。这里采用的是基于TCP的socket编程接口来实现模块间的通信,模块间通信流程如图7所示。

4 实验测试
演示系统界面如图8所示。本文使用大量的语音样本来完成HTK的训练和模式构建,语音样本采用16 kHz采样,16位量化。独立的语音识别测试中,将训练集以及测试集中语音样本和识别结果进行了对比分析。本文语音样本的内容包括训练集(语料库中的语音成分)和测试集(本实验中采集的语音)。由于本系统只用提取语音命令,不需要完整句子的识别,所以没有针对句子做测试。

本文对于训练集基于词的识别率为71.7%,测试集基于词的识别率为56.5%,测试结果如表1所列。

表中各符号所表示的意义如下所示:
H,正确;S,替代错误;D,删除错误;I,插入错误;N,标记文件中单元总数;SENT,句子,WORD:基本单元。

结语
本文在给定的实验室机器人平台上,设计了基于语音控制的机器狗系统。其中,语音识别子系统通过HTK和Julius的开源平台构建而成。经过测试分析,该系统能够较好地识别人发出的语音命令,简化了机器人的操作,使机器与人的交互更加智能化。














