0 引言
随着微电子技术的迅速发展,嵌入式系统在一些特定的专用设备上得到了广泛应用,通常这些设备的硬件资源(如处理器的运行速度、存储器的容量等)非常有限,并且对成本也有苛刻的要求,有时对实时响应要求也比较高,在数字信号处理芯片上已经实现了语音口令识别系统或语音口令识别系统的部分功能。语音口令识别技术与嵌入式系统的有效结合能够显示出其优势作用,但是也有很多有待进一步提高和改进之处,语音识别技术对运算速度和内存容量的要求都比较高,需要采用一些快速算法提高实时处理的性能。嵌入式微处理器的价格在不断下降,但是其性能却在不断上升,嵌入式系统目前已经广泛地应用于运算量比较大的系统和设备中,而其体积小和低功耗的特点使其能够发挥出更大的优势。
论文给出一种基于嵌入式系统的语音口令识别系统的设计方案,硬件系统的核心芯片是嵌入式微处理器,语音口令识别算法采用连续隐马尔可夫模型,现有的非特定人语音口令识别系统中,多采用状态输出具有连续概率分布的连续隐马尔可夫模型CDHMM(Continuous DensityHidden Markov Model)[3]。操作系统则是采用的目前广泛使用的Windows CE 5.0。
硬件电路的核心芯片是三星公司的嵌入式微处理器S3C2440AL,主频为400MHz。该微处理器具有低功耗、高性能等特点,广泛应用于便携式设备中。基于嵌入式系统的语音口令识别系统需要有接收语音信号的输入芯片配合麦克风实现将模拟语音信号转换成数字信号的功能,然后由嵌入式微处理器对输入的语音口令信号进行处理。完成语音口令信号输入功能的芯片采用的是PHILIPS公司的低功耗芯片UDA1341TS。操作系统采用的是Windows CE5.0。Windows CE 5.0是一个32位操作系统,具有模块化、结构化,能够支持超过1000个公共Microsoft Win32应用程序接口,并且与处理器无关等特点,为各种嵌入式系统和产品设计提供了一种可裁剪的、高效的、可升级的操作系统。
1 系统设计
1.1 硬件电路的设计
论文给出的语音口令识别系统的硬件电路主要由嵌入式微处理器、存储器和语音口令输入芯片组成。核心芯片是嵌入式微处理器Samsung 32位S3C2440AL,其主频为400MHz,最高频率533MHz。64MB SDRAM,64MB的NAND FLASH存储器,用来存储操作系统文件等,2MB的NOR FLASH存储,为安装BIOS使用。
S3C2440AL控制PHILIPS公司的UDA 1341TS完成输入语音口令信号的功能。该音频处理芯片由AD/DA转换、控制逻辑电路、可编程增益放大器(PGA)和数字自动增益控制器(AGC)以及数字信号处理器等部分组成,能进行数字语音处理。
对于一个基于嵌入式系统的语音口令识别系统,主要有以下几个要求:
(1)完成语音口令识别功能时,需要系统对人所发出的语音口令做出快速的响应,然后给出相应的判断结果。
(2)自动获得语音信号。语音口令识别系统一直处于随时接受语音口令的工作状态,无需人工操作就能将人的语音命令与环境噪声分离出来,舍弃静音信号和环境噪声信号部分,仅仅对有效的语音口令信号做处理和识别。
(3)需要有足够的存储器容量存储操作系统文件和训练好的语音口令模型库以及存储大量数据的数据缓冲区。
论文给出的语音口令识别系统选择高性价比的嵌入式微处理器S3C2440AL和64MB随机存储器和64MB的闪存来满足计算速度和数据缓存的要求。
1.2 软件程序的设计
选择Windows CE 5.0为语音口令识别系统的操作系统,Windows CE 5.0是一个多任务操作系统。开发工具主要有Platform. Builder 5.0和EVC++4.0。Platform. Builder5.0用于定制和开发内核,而EVC++4.0则用来编写基于操作系统的应用层程序,也就是算法执行程序与图形化界面,而图形化的界面使用MFC编写。
由于语音口令识别系统算法的运算量比较大,所以为了能够加快运算速度,首先对Windows CE 5.0操作系统进行配置,需要将相应的板级支持包BSP(Board SupportPackage)导入到Platform. Builder 5.0,裁剪掉一些使用不到的资源,保留一些需要的资源,驱动的配置正确后,将配置好的操作系统内核装入到嵌入式平台中,然后进行应用程序的开发。
语音口令识别系统分为训练和识别两个过程。训练时,语音口令信号首先经过预处理,然后提取语音特征参数,采用MFCC(Mel-Frequency Ceptral Coefficients)参数[4],然后建立此口令的连续隐马尔可夫(CDHMM)模型,把所有经过训练的语音口令的模型放在模型库中。在识别阶段,与训练时提取语音口令信号的特征参数一样,也要提取MFCC特征参数,然后与保存在语音口令模型库中的每一条语音口令模型相匹配,根据概率*分确定输出识别结果。语音口令识别系统的程序流程图如图1所示。
图1 语音口令识别系统的程序流程图。
当语音口令识别系统采集到命令语音信号后,要提取参数,做出比较判断,调用相应语音口令识别算法。对每条语音口令信号,先切除静音,进行预加重处理,然后通过Hamming窗分帧,帧长和帧移分别为20ms和10ms,对每一帧语音信号提取16阶MFCC和△MFCC一共32维参数作为特征矢量。语音口令识别软件系统由许多不同的语音信号预处理、识别算法和其它子程序组成,为了实现参数的传递,每个程序执行后的参数以文件的形式输出,而这些程序的调用先后顺序和参数的输入输出文件的位置等都由一个主程序管理。在Windows CE中,编写可执行程序,需要调用应用程序编程接口API(Application Programming Interface)函数,并且要设定程序入口点。调用过程为:无论是进行语音口令训练还是语音口令识别操作,都需要对语音口令信号的采集和实时处理程序,所以对语音口令信号的采集和实时处理程序是语音口令识别系统软件中的重要部分之一。对于语音音频接口的管理是通过Windows CE 5.0里的API函数完成的,对语音口令信号的采集和实时处理程序流程图如图2所示。
图2 信号的采集和处理流程图。
主程序在配置好初始化参数后,建立一个子线程,建立子线程有利于将静音检测的复杂运算过程和主程序的音频数据采集过程分开进行,以确保在静音检测时不会丢掉音频数据。与此同时,主程序开始采集数据,并存入到缓冲区。当预先设定好的缓冲区内的数据采集满后,会将所采集的数据交给子线程,子线程做静音检测判断。主程序会依然继续重新采集新的音频数据。对于子线程,子线程的任务是等待主程序发出命令,然后对数据做处理。如果检测到有语音口令的开始,会继续采集数据,得到完整命令语音口令信号,提取相应的特征参数。
具体程序中有如下几个主要过程:
(1)初始化参数设置:
(a)FuncReturn=waveInOpen(&(Record_Buffer_Manager.hWaveIn),WAVE_MAPPER,&wFormat,(LONG)(RecordBufferFillProc),(DWORD)this,CALLBACK_FUNCTION);//首先要调用API函数打开音频设备接口,并且设置相应的回调(CALLBACK)函数(回调函数是操作系统在每次缓冲区存满后会自动访问的一个特殊函数)
(b)Thread_process=AfxBeginThread((AFX_THREADPROC)RecordThreadProc,(LPVOID)this,THREAD_PRIORITY_NORMAL,0,0,0);//要为其单独建立一个线程,为了实现静音检测,在混杂着环境噪声的前提下,找出语音口令信号。
(c)FuncReturn=waveInStart(Record_Buffer_Manager.hWaveIn);//打开音频数据流,开始录音。(缓冲区存满后,系统会自动访问回调函数)(2)主程序与子线程通信
SetEvent(pRecord-》hRecordEvent );//发出信号,使得子线程函数得到命令,对采集到的音频流进行静音的检测判断。
(3)在子线程内接收消息作出反应
WaitForSingleObject(pRecord-》hRecordEvent,INFINITE);ResetEvent(pRecord-》hRecordEvent);//与回调函数的信号发出程序对应,接受信号,并重新设定状态,等待下一次信号。(……pRecord-》ProcessData((SAMPLE_TYPE *)pRecord-》pLeftData,……);//将得到的数据段进行处理,也就是真正执行静音检测的部分。(4)得到完整语音口令信号后提取特征参数。
2 结束语
论文建立了一种基于Windows CE的语音口令识别系统,并且对上升、下降等14条口令进行测试。实验结果表明,本语音口令识别系统达到了实时的要求,可以广泛应用于便携式设备中。