资源预览内容
第1页 / 共168页
第2页 / 共168页
第3页 / 共168页
第4页 / 共168页
第5页 / 共168页
第6页 / 共168页
第7页 / 共168页
第8页 / 共168页
第9页 / 共168页
第10页 / 共168页
亲,该文档总共168页,到这儿已超出免费预览范围,如果喜欢就下载吧!
资源描述
第6章 语音处理技术及应用 第6章 语音处理技术及应用 6.1 概述概述 6.2 凌阳音频技术简介凌阳音频技术简介 6.3 常用应用程序接口常用应用程序接口 6.4 语音压缩方法语音压缩方法 6.5 键控放音程序键控放音程序 6.6 语音识别技术语音识别技术 第6章 语音处理技术及应用 6.1 概概 述述 6.1.1 音频信号音频信号我们所说的音频是指频率在20Hz20kHz的声音信号,分为波形声音信号、语音信号和音乐信号三种。其中波形声音就是自然界中的声音,是声音数字化的基础。语音也可以表示为波形声音,但波形声音表示不出语言语音学的内涵,语音是对讲话声音的一种抽象,是语言的载体,是人类社会特有的一种信息交流系统,是社会交际工具的符号。音乐与语音相比更规范一些,是符号化了的声音。但音乐不能对所有的声音进行符号化,乐谱是符号化声音的符号组,表示比单个符号更复杂的声音信息。第6章 语音处理技术及应用 6.1.2 音频信号的抽样和量化音频信号的抽样和量化要将音频模拟信号进行数字化处理,就必须将模拟信号转换为数字信号。模拟信号数字化有多种方法,目前采用最多的是信号波形的A/D变换法(波形编码)。它直接将时域信号波形变换为数字序列,接收恢复的信号质量高。此外,还有参量编码(后面介绍)等。常用的波形编码方法有脉冲编码调制(PCM调制)和增量调制(DM)。数字音频信号的质量取决于采样频率和量化位数这两个重要参数。此外,声道的数目、相应的音频设备质量也会影响音频质量。第6章 语音处理技术及应用 6.1.3 音频格式音频格式音频文件通常分为两类:声音文件和MIDI文件。声音文件指的是通过声音录入设备录制的原始声音信号,直接记录了真实声音的二进制数据,通常文件较大。MIDI文件是一种音乐演奏指令序列,相当于乐谱。可以利用声音输出设备或与计算机相连的电子乐器进行演奏,由于不包含声音数据,其文件较小。第6章 语音处理技术及应用 1. 声音文件格式声音文件格式 1)WAVE文件(*.wav)WAVE文件使用三个参数来表示声音,分别是采样位数、采样频率和声道数。在计算机中采样位数一般为8位和16位两种,而采样频率有11025Hz(11kHz)、22050Hz(22kHz)和44100Hz(44kHz)三种。一般WAVE文件的波特率可达到88704kb/s。WAVE格式是Microsoft公司开发的一种声音文件格式,它符合RIFF(Resource Interchange File Format)文件规范。它用于保存Windows平台的音频信息资源,Windows平台及其应用程序均支持WAVE格式。WAVE格式支持多种压缩算法,支持多声道、多种音频位数和采样频率,是PC机上最流行的声音文件格式。但其文件较大,多用于存储简短的声音片段。第6章 语音处理技术及应用 2)AIFF文件(AIF/AIFF)AIFF是音频交换文件格式(AudioInterchangeFileFormat)的英文缩写,是苹果计算机公司开发的声音文件格式。Macintosh平台及其应用程序、NetscapeNavigator浏览器中的LiveAudio、SGI及其它专业音频软件包均支持AIFF文件格式。AIFF支持ACE2、ACE8、MAC3和MAC6压缩,支持16位44.1kHz立体声。第6章 语音处理技术及应用 3)Audio文件(.au)Audio文件是SunMicosystems公司推出的一种经过压缩的数字声音格式,是Internet中常用的声音文件格式。NetscapeNavigatir浏览器中的LiveAudio支持Audio格式的声音文件。第6章 语音处理技术及应用 4)MPEG文件(.mp1/.mp2/.mp3)MPEG是运动图像专家组(MovingPictureExpertsGroup)的英文缩写,MPEG音频层(MPEGAudioLayer)代表MPEG标准中的音频部分。MPEG音频文件的压缩是一种有损压缩,根据压缩质量和编码复杂程度的不同可分为三层(MPEGAudioLayer1/2/3),分别对应MP1、MP2和MP3这三种声音文件。MPEG音频编码具有很高的压缩率,MP1和MP2的压缩率分别为4:1和6:18:1,MP3的压缩率则高达10:112:1,就是说若一分钟CD音质的音乐未经压缩需要10MB存储空间,而经过MP3压缩编码后只需1MB左右的存储空间,其音质基本保持不失真。因此,目前使用最多的是MP3文件格式。第6章 语音处理技术及应用 5)RealAudio文件(.ra/.rm/.ram)RealAudio文件是RealNerworks公司开发的一种新型流式音频StreamingAudio文件格式。它包含在RealMedia中,主要用于在低速的广域网上实时传输音频信息。网络传输速率不同,客户端所获得的声音质量也不尽相同,对于28.8kb/s的速率可以达到广播级的声音质量,如果拥有ISDN或更快的线路连接,则可获得CD音质的声音。第6章 语音处理技术及应用 2. MIDI文件文件(.mid/.rmi)MIDI是乐器数字接口(MusicalInstrumentDigitalInterface)的英文缩写,是数字音乐、电子合成乐器的国际标准。它定义了计算机音乐程序合成器及其它电子设备交换音乐信号的方式,还规定了不同厂家的电子乐器与计算机连接的电缆和硬件及设备间的数据传输协议。用于为不同乐器创建数字声音信号,可以模拟大提琴、小提琴、钢琴等常见乐器。在MIDI文件中,只包含产生某种声音的指令,这些指令包括使用什么MIDI设备的音色、声音的强弱、声音持续时间等,计算机将这些指令发送给声卡,声卡按照指令将声音合成,MIDI在重放时可以有不同的效果。相对于保存真实采样数据的声音文件,MIDI文件显得更加紧凑,其文件大小比声音文件小得多。第6章 语音处理技术及应用 6.1.4 语音压缩编码基础语音压缩编码基础1. 语音压缩编码中的数据量语音压缩编码中的数据量语言压缩编码中的数据量表达式为数据量=(采样频率量化位数)/8声道数目(字节数)压缩编码的目的是通过对数据的压缩,达到高效率存储和数据转换的目的。即在保证一定音质的条件下,以最小数据量来表达和传送声音信息。第6章 语音处理技术及应用 2. 压缩编码的必要性压缩编码的必要性实际应用中音频数据量很大,直接进行传输或存储是不现实的,要通过对信号趋势的预测和冗余信息处理进行数据压缩,这样可以用较少的资源传输或存储更多的语音信息。例如,没有压缩过的CD品质一分钟数据需要占用11MB的内存空间,如果将原始数据进行压缩处理,在确保声音品质不失真的前提下,将数据压缩一半,5.5MB就可以完全达到原来的效果。在实际操作中可以根据需要选择适当的算法。第6章 语音处理技术及应用 3. 常见的几种音频压缩编码常见的几种音频压缩编码1)波形编码波形编码的基本原理是在时间轴上对模拟语音信号按一定的速率抽样,然后将幅度样本量化、编码。译码是其逆过程,将收到的数字序列经过译码和滤波恢复成模拟信号。如脉冲编码调制PCM(PulseCodeModulation)、差值脉冲编码调制DPCM、增量调制DM、自适应差分编码ADPCM、自适应增量调制ADM、自适应差值脉冲编码调制ADPCM、自适应增量调制ADM、自适应传输编码ATC(AdaptiveTransferCoding)和子带编码SBC等都属于波形编码技术。其特点为话音质量高,数码率高,适用于高保真音乐及语音。第6章 语音处理技术及应用 2)参量编码参量编码(又称为声源编码)是将信源信号在频率域或其它正交变换域提取特征参数,并将其变换成数字代码进行存储或传输的过程。它是通过对语音信号特征参数的提取和编码重建语音信号,具有尽可能高的准确性,但重建信号的波形同原语音信号的波形会有相当大的差别。线性预测编码LPC及其它各种改进型编码都属于参量编码。译码是编码的逆过程,将收到的数字序列经变换恢复特征参量,根据特征参量重建语音信号。参数编码比特率可压缩到24.8kb/s甚至更低,但语音质量只能达到中等,自然度较低,常用于设备播报的提示音等。其特点为压缩比大,计算量大,音质一般,廉价。第6章 语音处理技术及应用 3)混合编码混合编码是将参数编码技术和波形编码技术结合起来使用。计算机的发展为语音编码技术的研究提供了强有力的工具,超大规模集成电路的出现则为语音编码的实现提供了技术支持。20世纪80年代以来语音编码技术有了实质性的进展,产生了新一代的编码算法即混合编码。它将波形编码和参数编码结合起来,克服了原有波形编码和参数编码的弱点,结合各自的优点,保持了波形编码的高质量和参数编码的速率低的特点。如多脉冲激励线性预测编码MPLPC、规划脉冲激励线性预测编码KPELPC、码本激励线性预测编码CELP等都是属于混合编码技术,其数据率和音质均介于参数编码与波形编码之间。第6章 语音处理技术及应用 4. 音频压缩技术发展趋势音频压缩技术发展趋势音频压缩技术的发展趋势如下:(1)降低数据率,提高压缩比,用于廉价低保真场合。如电话、机器提示音等。(2)追求高保真度复杂的压缩技术,用于对音质要求较高的场合。如CD、音乐等。第6章 语音处理技术及应用 6.1.5 语音合成和识别技术语音合成和识别技术1. 语音合成技术分类语音合成技术分类按照实现的功能来分,语音合成可分为两类:(1)有限词汇的计算机语音输出技术。(2)基于语音合成技术的文字语音转换技术(TTS,Text-to-Speech)。按照人类语言功能的不同层次分,语音合成可分为三个层次:(1)从文本到语音的合成(Text-to-Speech),如图6.1所示;(2)从概念到语音的合成(Concept-to-Speech);(3)从意向到语音的合成(Intention-to-Speech)。第6章 语音处理技术及应用 图6.1文本到语音转换过程第6章 语音处理技术及应用 2. 语音识别语音识别 语音识别技术有三个研究领域:口音独立、连续语音和可辨认词汇数量。语音识别原理框图如图6.2所示。图6.2语音识别原理框图第6章 语音处理技术及应用 1)口音独立口音独立的特点有:(1) 早期只能辨认特定的使用者即特定语者SD (SpeakerDependent)模式,可针对特定语者辨认词汇(可由使用者自行定义,如人名声控拨号)做简单快速的训练,纪录使用者的声音特性来加以辨认。随着技术的成熟进入了语音适应阶段SA(SpeakAadaptation),使用者只要对于语音识别系统经过适当的口音训练即可达到一定的识别率。(2)非特定语者模式SI(SpeakerIndependent)使用者无需训练即可使用,任何人皆可随时使用此方式。第6章 语音处理技术及应用 2)连续语音连续语音分为下面两种:(1)单字辨认:为了确保每个字音可以正确地切割出来必须逐字分开念,很不自然。(2)整句识别:只要按照正常说话的速度(中间不需停顿)说出来,是最直接最自然的一种方式,当然,难度也最大。虽然现阶段连续语音的识别率及正确率效果还不错,但仍需提高。由于中文有很多同音字,所以目前几乎所有的中文语音识别系统都是以词为依据来判断的。第6章 语音处理技术及应用 3)可辨认词汇数量内建的词汇数据库的大小直接影响其识别能力,因此就语音识别的词汇数量来说可分为小词汇量(10100)、中词汇量(1001000)和无限词汇量(即听写机)三种。第6章 语音处理技术及应用 6.2 凌阳音频技术简介凌阳音频技术简介 6.2.1 压缩算法的编码标准压缩算法的编码标准 表6.1列出了不同音频质量的编码技术标准响应频率。凌阳音频压缩算法处理的语音信号频率范围为200Hz3.4kHz。第6章 语音处理技术及应用 表表6.1 编码技术标准频响编码技术标准频响 第6章 语音处理技术及应用 6.2.2 压缩分类压缩分类压缩分为无损压缩和有损压缩。无损压缩一般指磁盘文件,压缩比低(2:14:1);有损压缩指语音、视频文件,压缩比高(1001)。凌阳音频压缩算法根据不同的压缩比分为以下几种(以压缩8KB16位的WAVE文件为例):SACM_A2000压缩比为8:1,8:1.25,8:1.5;SACM_S480压缩比为80:3,80:4.5;SACM_S240压缩比为80:1.5。音质排序为:A2000S480S240。第6章 语音处理技术及应用 6.2.3 常用的音频形式和压缩算法常用的音频形式和压缩算法1. 波形编码波形编码波形编码采用子带编码技术(SBC,Sub-BandCoding)压缩算法SACM_A2000。特点为话音质量高,编码率高,适用于高保真语音和音乐。2. 参量编码参量编码参量编码采用压缩算法SACM_S240。特点为压缩比高,计算量大,音质一般,价格低廉。第6章 语音处理技术及应用 3. 混合编码混合编码混合编码采用压缩算法SACM_S480。特点为综合了参数编码和波形编码之优点。除此之外,还具有FM音乐合成式即SACM_MS01等。凌阳SPCE061A是16位单片机,具有DSP功能,有很强的信息处理能力,最高时钟可达到49MHz,具备运算速度高的优势。这无疑为语音的录制、播放、合成及识别提供了条件。凌阳压缩算法中SACM_A2000、SACM_S480、SACM_S240主要是用来放音,可用于语音提示;DVR则用来录、放音。第6章 语音处理技术及应用 图6.3语音识别功能框图第6章 语音处理技术及应用 6.3 常用应用程序接口常用应用程序接口 6.3.1 程序接口概述程序接口概述语音和音乐与我们的生活有着非常密切的关系,而单片机对语音的控制如录放音合成及识别也广泛应用于现实生活中。语音处理可以分为A/D编码处理、存储解码处理以及D/A转换等,如图6.4所示。第6章 语音处理技术及应用 由于麦克风输入所生成的WAVE文件占用的存储空间较大,对于单片机来说想要存储大量的信息显然是不现实的,凌阳公司提出了解决的方法,即建立SACM-LIB库及相应的应用程序接口API(ApplicationProgrammingInterface)函数。将A/D编码、解码、存储及D/A转换成相应的模块,每个模块都有其API,我们只需了解每个模块所要实现的功能及其参数的内容,然后调用该API函数即可实现其功能。如在程序中插入语音提示或连续播放一段语音或音乐,也可以根据自己的需要,选择合适的算法,如表6.2所示。第6章 语音处理技术及应用 图6.4语音处理模块组成第6章 语音处理技术及应用 表表6.2 SACM- -LIB库中模块及其算法库中模块及其算法 第6章 语音处理技术及应用 6.3.2 SACM_A2000 1. 相关相关API函数函数SACM_A2000相关API函数及注释如下:voidSACM_A2000_Initial(intInit_Index)/初始化voidSACM_A2000_ServiceLoop(void)/获取语音数据填入译码队列voidSACM_A2000_Play(intSpeech_Index,intChannel,intRamp_Set)/播放voidSACM_A2000_Stop(void)/停止播放voidSACM_A2000_Pause(void)/暂停播放voidSACM_A2000_Resume(void)/暂停后恢复voidSACM_A2000_Volume(Volume_Index)/音量控制unsignedintSACM_A2000_Status(void)/获取模块状态voidSACM_A2000_InitDecode(intChannel)/译码初始化第6章 语音处理技术及应用 voidSACM_A2000_Decode(void)/译码voidSACM_A2000_FillQueue(unsignedintencoded-data)/填充队列unsignedintSACM_A2000_TestQueue(void)/测试队列CallF_FIQ_Service_SACM_A2000/中断服务函数第6章 语音处理技术及应用 2. 功能介绍功能介绍下面对上述的API函数作具体介绍。(1)C:voidSACM_A2000_Initial(intInit_Index)ASM:R1=Init_IndexCallF_SACM_A2000_Initial功能:SACM_A2000语音播放之前的初始化。参数:Init_Index=0表示手动方式。Init_Index=1表示自动方式。返回值:0代表语音模块初始化失败。1代表初始化成功。注意:该函数用于对定时器中断和DAC等初始化。第6章 语音处理技术及应用 (2)C:voidSACM_A2000_ServiceLoop(void)ASM:CallF_SACM_A2000_ServiceLoop功能:从资源中获取SACM_A2000语音数据,并将其填入译码队列中。参数:无。返回值:无。第6章 语音处理技术及应用 (3)C:intSACM_A2000_Play(intSpeech_Index,intChannel,intRamp_Set)ASM:R1=Speech_IndexR2=ChannelR3=Ramp_SetCallSACM_A2000_Play功能:播放资源中SACM_A2000语音或乐曲。第6章 语音处理技术及应用 参数:Speech_Index表示语音索引号。Channel1:通过DAC1通道播放。2:通过DAC2通道播放。3:通过DAC1和DAC2双通道播放。Ramp_Set0:禁止音量增/减调节。1:仅允许音量增调节。2:仅允许音量减调节。3:允许音量增/减调节。返回值:无。第6章 语音处理技术及应用 注意:SACM_A2000的数据率有16kb/s、20kb/s和24kb/s三种,可在同一模块的几种算法中选择一种。 Speech_Index 是 定 义 在 resource.inc 文 件 中 资 源 表T_SACM_A2000_SpeechTable的偏移地址。中断服务子程序F_FIQ_Service_SACM_A2000必须安置在TMA_FIQ中断向量上。函数允许TimerA以所选的数据采样率计数,并产生溢出中断信号。第6章 语音处理技术及应用 例1以SCAM_A2000自动方式播报一段语音,并自动结束。解:程序流程图如图6.5所示。主程序:#includeA2000.h#defineSpeech_10#defineDAC11#defineDAC22#defineRamp_UpDn_Off0#defineRamp_Up_On1#defineRamp_Dn_On2#defineRamp_UpDn_On3第6章 语音处理技术及应用 Main()SACM_A2000_Initial(1);SACM_A2000_Play(Speech_1,DAC1+DAC2,Ramp_UpDn_On);/放音while(SACM_A2000_Status()&0x01)SACM_A2000_ServiceLoop();第6章 语音处理技术及应用 图6.5A2000自动方式主程序流程图第6章 语音处理技术及应用 中断服务程序:_FIQ:PUSHR1,R4TOSP/将寄存器压栈保护CALLF_FIQ_Service_SACM_A2000R1=0x2000/清中断标志位P_INT_Clear=R1POPR1,R4TOSP/寄存器出栈RETI注意:当播放语音文件数据中出现FFFFFFH时停止播放。第6章 语音处理技术及应用 (4)C:voidSACM_A2000_Stop(void)ASM:CallF_SACM_A2000_Stop功能:停止播放SACM_A2000语音或乐曲。参数:无。返回值:无。(5)C:voidSACM_A2000_Pause(void)ASM:CallF_SACM_A2000_Pause功能:暂停播放SACM_A2000语音或乐曲。参数:无。返回值:无。第6章 语音处理技术及应用 (6)C:voidSACM_A2000_Resume(void)ASM:CallF_SACM_A2000_Resume功能:播放暂停播放的SACM_A2000语音或乐曲。参数:无。返回值:无。(7)C:voidSACM_A2000_Volume(Volume_Index)ASM:R1=Volume_IndexCallF_SACM_A2000_Volume功能:在播放SACM_A2000语音或乐曲时改变主音量参数:Volume_Index为音量数,音量从最小到最大可在015之间选择。返回值:无。第6章 语音处理技术及应用 (8)C:unsignedintSACM_A2000_Status(void)ASM:CallF_SACM_A2000_Status返回值=R1功能:获取SACM_A2000语音播放的状态。参数:无。返回值:当R1的bit0=0时,表示语音播放结束;bit0=1表示语音在播放中。第6章 语音处理技术及应用 (9)ASM:CallF_FIQ_Service_SACM_A2000功能:作SACM_A2000语音背景程序的中断服务子程序,通过前台子程序自动方式的ACM_A2000_ServiceLoop及手动方式的SACM_A2000_Decode对语音数据进行解码,然后将其送入DAC通道播放。参数:无。返回值:无。注意:SACM_A2000语音中断服务程序只有汇编指令形式且应将此程序放置在TMA_FIQ中断源上。第6章 语音处理技术及应用 (10)C:voidSACM_A2000_InitDecode(intChannel)ASM:CallF_SACM_A2000_Decode功能:开始对SACM_A2000语音数据以非自动方式(编程控制)进行译码。参数:Channel=1、2、3分别表示使用DAC1、DAC2通道以及DAC1和DAC2双通道。返回值:无。注意:只能通过非自动方式对语音数据解压缩。第6章 语音处理技术及应用 (11)C:voidSACM_A2000_Decode(void)ASM:CallF_SACM_A2000_Decode功能:从语音队列里获取语音数据并进行译码,然后通过中断服务子程序将其送入DAC通道播放。参数:无。返回值:无。注意:只能通过非自动方式对语音数据进行译码。第6章 语音处理技术及应用 (12) C:void SACM_A2000_FillQueue(unsigned int encoded-data)ASM:R1=语音编码数据CallF_SACM_A2000_FillQueue功能:将从用户存储区里获取SACM_A2000语音编码数据填入语音队列中等候译码处理。参数:encoded-data为语音编码数据。返回值:无。注意:只能通过非自动方式对语音数据进行译码。第6章 语音处理技术及应用 (13)C:unsignedintSACM_A2000_TestQueue(void)ASM:CallF_SACM_A2000_TestQueue返回值=R1功能:获取语音队列的状态。参数:无。返回值:R1=0、1、2分别表示语音队列不空不满、语音队列满及语音队列空。注意:只能通过非自动方式测试语音队列状态。第6章 语音处理技术及应用 例2编程控制以非自动方式利用SACM_A2000函数播报语音。解:主程序和中断服务程序流程图如图6.6和图6.7所示。第6章 语音处理技术及应用 图6.6A2000非自动方式主程序流程图第6章 语音处理技术及应用 图6.7中断服务子程序流程图第6章 语音处理技术及应用 主程序:#includeA2000.h#defineManual0#defineAuto1#defineFull1#defineEmpty2#defineDAC11#defineDAC22Main()第6章 语音处理技术及应用 Addr=RES_A32_SA;/长整型资源地址SACM_A2000_Initial(Manual);/选择非自动方式SACM_A2000_InitDecode(DAC1+DAC2);/使用双通道While(SACM_A2000_TestQueue()!=Full) /若队列不满填入数据Ret=GetResource(Addr);/从ROM中取语音数据SACM_A2000_FillQueue(Ret);/将语音数据填入队列Addr+;/指向下一个数据地址While(1)第6章 语音处理技术及应用 If(SACM_A2000_TestQueue()!=Full)/继续填数据到队列中Ret=GetResource(Addr);SACM_A2000_FillQueue(Ret);Addr+;if(Addrsacm2000.exe16*.wav*.out*.16k或(e:sacm2000.exe20*.wav*.out*.20ke:sacm2000.exe24*.wav*.out*.24k)第6章 语音处理技术及应用 2. S480S480的特点如下:(1)采用8KB16位单声道录制一个.wav文件。(2)用s480压缩生成4.8KB或7.2KB压缩率的文件。(3)在MS-DOS环境下:e:sacm.exe*.wav*.48k*.outs48或e:sacm.exe*.wav*.72k*.outs72第6章 语音处理技术及应用 6.4.2 Windows环境下压缩环境下压缩 图图6.11 Windows环境下压缩环境下压缩 第6章 语音处理技术及应用 6.5 键控放音程序键控放音程序 程序模块中的文件大致分为两类,一类是程序,另一类则是程序接口。程序接口是针对高一级的程序模块而言的,通过接口高一级程序模块可以调用本级程序模块中的子程序或函数,或者使用本级模块中定义的全局变量,这无疑会大大增加软件的可维护性,程序既可以用C语言编写也可用汇编语言编写。随着对语音编程越来越熟悉,可以考虑加入一些模块化程序,如键盘,这样可以用按键控制语音播放、停止、暂停、恢复以及音量的大小等。第6章 语音处理技术及应用 图6.12Key.asm程序结构第6章 语音处理技术及应用 6.5.1 常用的键盘常用的键盘API函数函数1. API函数函数常用的键盘API函数如下:CallF_Key_Scan_Initial/键初始化CallF_Key_Scan_ServiceLoop/键盘扫描CallF_Key_DebounceCnt_Down/键盘防抖动处理CallF_SP_GetCh()/获取键值第6章 语音处理技术及应用 2. 功能介绍功能介绍下面对常用的键盘API函数作具体介绍。(1)C:voidKey_Scan_InitialvoidASM:CallF_Key_Scan_Initial功能:键盘扫描初始化。参数:无。返回值:无。(2)C:voidKey_Scan_ServiceLoopvoidASM:CallF_Key_Scan_ServiceLoop功能:键盘扫描服务循环。参数:无。返回值:无。第6章 语音处理技术及应用 (3)C:voidKey_DebounceCnt_DownvoidASM:CallF_Key_DebounceCnt_Down功能:键盘扫描过程中消抖动处理。参数:无。返回值:无。(4)C:unsignedintSP_GetChvoidASM:CallF_SP_GetCh()返回值=R1功能:从扫描缓冲区内获得键值,并将缓冲区清零。参数:无。返回值:无。第6章 语音处理技术及应用 6.5.2 系统资源模块系统资源模块SPCE061A单片机提供了一个系统资源模块,它是建立在上述诸多模块之上的一个模块,其中许多子程序都调用了在它之下模块中的子程序,为了让上一级的程序调用本模块System.asm文件中的子程序,设有一个接口文件System.inc,一般只需要三条调用语句。当然也可以添加一些模块,具体实现可参考如图6.13所示的模块框图。第6章 语音处理技术及应用 图6.13System.asm模块框图第6章 语音处理技术及应用 6.5.3 应用实例应用实例例7通过一个A2000自动按键控制放音的例子来熟悉一下整个程序的执行过程。*主程序(main.c)*main()intKey=0;/初始化键值intSpeechIndex=0;/初始化语音目录索引号intVolumeIndex=7;/初始化音量Ret=System_Initial();Ret=SACM_A2000_Initial(Auto);SACM_A2000_Play(SpeechIndex,DAC1+DAC2,Ramp_UpDn_On);/播放第6章 语音处理技术及应用 while(1)Key=SP_GetCh();switch(Key)case0x00:break;case0x01:SACM_A2000_Play(SpeechIndex,DAC1+DAC2,Ramp_UpDn_On);/播放break;case0x02:SACM_A2000_Stop();/停止放音break;第6章 语音处理技术及应用 case0x04:SACM_A2000_Pause();/暂停放音break;case0x08:SACM_A2000_Resume();/暂停后的恢复break;case0x10:VolumeIndex+;if(VolumeIndexMaxVolume)VolumeIndex=MaxVolume;SACM_A2000_Volume(VolumeIndex); /音量增加break;第6章 语音处理技术及应用 case0x20:if(VolumeIndex=0)VolumeIndex=0;elseVolumeIndex-;SACM_A2000_Volume(VolumeIndex);/音量减break;case0x40:SpeechIndex+;/播放下一首if(SpeechIndex=MaxSpeechNum)SpeechIndex=0;SACM_A2000_Play(SpeechIndex,DAC1+DAC2,Ramp_UpDn_On);break;第6章 语音处理技术及应用 case0x80:if(SpeechIndex=0)/播放前一首SpeechIndex=MaxSpeechNum;SpeechIndex-;SACM_A2000_Play(SpeechIndex,DAC1+DAC2,Ramp_UpDn_On);break;default:break;System_ServiceLoop();/调用系统初始化SACM_A2000_ServiceLoop();/获取A2000数据并填入译码队列等待播放第6章 语音处理技术及应用 *系统子程序System.asm*.PUBLIC_System_Initial.PUBLICF_System_Initial_System_Initial:.PROCF_System_Initial:CALLF_Key_Scan_Initial/键盘扫描/可以添加一些语音类型子程序或初始化内容RETF.ENDP.PUBLIC_System_ServiceLoop.PUBLICF_System_ServiceLoop_System_ServiceLoop:.PROCF_System_ServiceLoop:CALLF_Key_DebounceCnt_Down/调用键扫描防抖动处理子程序第6章 语音处理技术及应用 CALLF_Key_Scan_ServiceLoop/调用键扫描子程序/可添加其它服务程序,完成相应功能RETF.ENDP/键盘子程序Key.asm.RAM.VARR_DebounceReg.defineC_DebounceCnt0x0002.VARR_DebounceCnt.VARR_KeyBuf.VARR_KeyStrobe.CODE第6章 语音处理技术及应用 /键扫描初始化F_Key_Scan_Initial:r1=0x0000R_DebounceReg=r1/初始化R_KeyBuf=r1R_KeyStrobe=r1r1=C_DebounceCntR_DebounceCnt=r1/设定记数初值RETF第6章 语音处理技术及应用 *键扫描*F_Key_Scan_ServiceLoop:r1=P_IOA_Data/由IOA口获取键值r1=r1AND0xFF/保留键值r2=R_DebounceReg/将上次获取的键值送给r2R_DebounceReg=r1/将当前键值送给R_DebounceRegCMPr2,R_DebounceReg/比较两次采样的键值是否相同JEL_KS_StableTwoSample/是,则转r1=C_DebounceCnt/否则设定记数的时间R_DebounceCnt=r1RETFL_KS_StableTwoSample:r1=R_DebounceCnt/判断记数值是否为0JZL_KS_StableOverDebounce /是,则转RETF第6章 语音处理技术及应用 L_KS_StableOverDebounce:r2=R_DebounceReg/将当前采样的键值送给r2r1=R_KeyBuf/暂存上次的键值到r1R_KeyBuf=r2/当前键值送给暂存寄存器r1=r1XOR0x00FF/r1低8位取反r1=r1ANDR_KeyBuf/r1低8位取反后和当前的键值相与r1=r1AND0x00FF/保留与的结果即最后确定的键值r1=r1ORR_KeyStrobeR_KeyStrobe=r1/送键值到键存储单元RETF第6章 语音处理技术及应用 /键扫描防抖动处理F_Key_DebounceCnt_Down:r1=R_DebounceCnt/读计数单元的值JZL_DebounceCntZero/如果计数单元为零则停止记数r1-=0x0001R_DebounceCnt=r1L_DebounceCntZero:RETF第6章 语音处理技术及应用 /从扫描缓冲单元获取键值并清零_SP_GetCh:F_SP_GetCh:r1=R_KeyStrobe/取键值r2=0x0000/清键存储单元R_KeyStrobe=r2RETF第6章 语音处理技术及应用 6.6 语音识别技术语音识别技术 前面我们介绍过语音识别的一些相关内容,这里我们讨论SPCE061A特定语者识别(SD,SpeakerDependent)的一个例子,供有兴趣者参考。SD即语音样板,由单个人训练,也只能识别训练人的语音命令,而他人的命令识别率较低或几乎不能识别。语音识别框图如图6.14所示。第6章 语音处理技术及应用 图6.14语音识别整体框图第6章 语音处理技术及应用 6.6.1 设置设置1. 初始化初始化初始化的设置如下:(1)API格式:C:intBSR_DeleteSDGroup(0)ASM:F_BSR_DeleteSDGroup(0)(2)功能:SRAM初始化。(3)参数:识别的一个标识符,0代表选择SRAM,并初始化。(4)返回值:当SRAM擦除成功返回0,否则返回1。第6章 语音处理技术及应用 2. 训练部分训练部分训练部分的设置如下:(1)API格式:C:intBSR_Train(intCommandID,intTraindMode)ASM:F_BSR_Train(2)功能:训练函数。第6章 语音处理技术及应用 (3)参数:CommandID命令序号范围从0x100到0x105,并且对于每组训练语句都是惟一的。TraindMode训练次数要求使用者在应用之前,训练一遍或两遍用以下函数区别:BSR_TRAIN_ONCE:要求训练一次。BSR_TRAIN_TWICE:要求训练两次。(4)返回值:训练成功返回0,没有声音返回1,训练需要更多的语音数据来训练返回2,环境太吵时返回3,当数据库满返回4,当两次输入命令不同返回5,当序号超出范围返回6。第6章 语音处理技术及应用 3. 识别部分识别部分识别部分的设置如下:(1)C:voidBSR_InitRecognizer(intAudioSource)ASM:F_BSR_InitRecognizer功能:识别器初始化。参数:定义语音输入来源通过MIC语音输入还是LINE_IN电压模拟量输入。返回值:无。第6章 语音处理技术及应用 (2)C:intBSR_GetResult()ASM:F_BSR_GetResult返回值=R1功能:识别中获取数据。参数:无。返回值:当无命令识别出来时返回0;识别器停止未初始化或识别未激活返回-1;当识别不合格时返回-2;当识别出来时返回命令的序号。注意:该函数用于启动识别BSR_GetResult()。第6章 语音处理技术及应用 (3)C:voidBSR_StopRecognizer(void)ASM:F_BSR_StopRecognizer功能:说明停止识别。参数:无。返回值:无。注意:该函数是用于停止识别,当调用此函数时FIQ_TMA中断将关闭。第6章 语音处理技术及应用 (4)ASM:_BSR_InitRecognizer功能:在中断中调用并通过中断将语音信号送DAC通道播放。参数:无。返回值:无。注意:(1)该函数在中断FIQ_TMA中调用。(2)当主程序调用BSR_InitRecognizer时,识别器便打开8kHz采样率的FIQ_TMA中断,并开始将采样的语音数据填入识别器的数据队列中。第6章 语音处理技术及应用 (3)应用程序需要设置以下程序段在FIQ_TMA中。程序如下:.PUBLIC_FIQ.EXTERNAL_BSR_FIQ_Routine/定义全局变量.TEXT_FIQ:PUSHR1,R4TOSP/寄存器入栈保护R1=P_INT_CtrlCall_BSR_FIQ_Routine/调用子程序R1=0x2000/清中断标志位P_INT_Clear=R1POPR1,R4FROMSP/寄存器组出栈RETIEND第6章 语音处理技术及应用 其中,实时监控是用来观察识别是否正常工作。如果识别正常,则会产生一周期为32ms的稳定方波信号,如图6.15所示,否则如果CPU超载,则会产生不稳定的信号,如图6.16所示。此时,需要删除命令或是优化程序,否则会丢失语音数据,产生识别错误的信息。第6章 语音处理技术及应用 图6.15识别正常波形第6章 语音处理技术及应用 图6.16识别不正常波形第6章 语音处理技术及应用 6.6.2 应用实例应用实例以下是特定人识别的一个范例,在程序中通过三条语句的训练,演示特定人连续音识别,其中第一条语句为触发名称,另外两条为命令,训练完毕开始识别。当识别出触发名称后,开始发布命令则会听到自己设置的应答。主程序流程图如图6.17所示,中断流程图如图6.18所示。第6章 语音处理技术及应用 图6.17主程序流程图第6章 语音处理技术及应用 图6.18中断服务程序流程图第6章 语音处理技术及应用 *训练*提示音输入语音-请输入触发名称警卫请输入第一条命令开枪请输入第二条命令你在干什么请再说一遍(以上提示音每说完一遍出现此命令)没有听到任何声音(当没有检测到声音时出现此命令)两次输入名称不相同(当两次输入的名称不同时出现此命令)两次输入命令不相同(当两次输入的命令有差异时出现此命令)准备就绪请开始识别(以上三条语句全部训练成功时进入识别)*识别*发布命令应答-第6章 语音处理技术及应用 警卫在、长官开枪枪声你在干什么我在巡逻、我在休息、我在等人注意:在每次提示音结束后2或3s再输入命令或当上次应答结束2或3s后再发布命令。#includebsrsd.h#defineNAME_ID0x100#defineCOMMAND_ONE_ID 0x101#defineCOMMAND_TWO_ID 0x102#defineRSP_INTR0#defineRSP_NAME1#defineRSP_FIRE2#defineRSP_GUARD3第6章 语音处理技术及应用 #defineRSP_AGAIN4#defineRSP_NOVOICE5#defineRSP_NAMEDIFF6#defineRSP_CMDDIFF7#defineRSP_STAR8#defineRSP_MASTER9#defineRSP_HERE10#defineRSP_GUNSHOT0#defineRSP_PATROL11#defineRSP_READY12#defineRSP_COPY13#defineRSP_NOISY14第6章 语音处理技术及应用 /全程变量intgActivated=0;/该变量用于检测是否有触发命令,当有识别出语句为触发名称时,则该位置1int gTriggerRespond = RSP_MASTER, RSP_HERE,RSP_MASTER;/第一条命令应答intgComm2Respond=RSP_PATROL,RSP_READY,RSP_COPY;/第二条命令应答externvoidClearWatchDog();intPlayFlag=0;voidPlayRespond2(intResult)/枪声放音子程序第6章 语音处理技术及应用 BSR_StopRecognizer();SACM_A2000_Initial(1);SACM_A2000_Play(Result,3,3);while(SACM_A2000_Status()&0x0001)!=0)SACM_A2000_ServiceLoop();ClearWatchDog();SACM_A2000_Stop();BSR_InitRecognizer(BSR_MIC);BSR_EnableCPUIndicator();voidPlayRespond(intResult);/放音子程序第6章 语音处理技术及应用 BSR_StopRecognizer();SACM_S480_Initial(1);SACM_S480_Play(Result,3,3);while(SACM_S480_Status()&0x0001)!=0)SACM_S480_ServiceLoop();ClearWatchDog();SACM_S480_Stop();BSR_InitRecognizer(BSR_MIC);BSR_EnableCPUIndicator();/启动实时监控intTrainWord(intWordID,intRespondID)/命令训练第6章 语音处理技术及应用 intres;PlayRespond(RespondID);while(1)res=BSR_Train(WordID,BSR_TRAIN_TWICE);if(res=0)break;switch(res)case-1:/没有检测出声音PlayRespond(RSP_NOVOICE);return-1;case-2:/需要重新训练一遍PlayRespond(RSP_AGAIN);break;第6章 语音处理技术及应用 case-3:/环境太吵PlayRespond(RSP_NOISY);return-1;case-4:/存储器满return-1;case-5:/检测出声音不同if(WordID=NAME_ID)PlayRespond(RSP_NAMEDIFF);/两次输入名称不同elsePlayRespond(RSP_CMDDIFF);/两次输入命令不同return-1;case-6:/序号错误return-1;第6章 语音处理技术及应用 return0;intmain()intres,timeCnt=0,random_no=0;BSR_DeleteSDGroup(0);/初始化存储器为RAMPlayRespond(RSP_INTR);/播放开始训练的提示音/.训练名称.while(TrainWord(NAME_ID,1)!=0);/.训练第一条命令.while(TrainWord(COMMAND_ONE_ID,2)!=0);/.训练第二条命令.while(TrainWord(COMMAND_TWO_ID,3)!=0);/.开始识别命令.第6章 语音处理技术及应用 BSR_InitRecognizer(BSR_MIC);/识别器初始化BSR_EnableCPUIndicator();PlayRespond(RSP_STAR);/播放开始识别的提示音while(1)random_no+;if(random_no=3)random_no=0;res=BSR_GetResult();if(res0)/识别出命令if(gActivated)timeCnt=0;switch(res)第6章 语音处理技术及应用 caseNAME_ID:PlayRespond(gTriggerRespondrandom_no);break;caseCOMMAND_ONE_ID:PlayFlag=1;PlayRespond2(RSP_GUNSHOT);PlayFlag=0;gActivated=0;break;caseCOMMAND_TWO_ID:PlayRespond(gComm2Respondrandom_no);gActivated=0;第6章 语音处理技术及应用 elseif(res=NAME_ID)PlayRespond(gTriggerRespondrandom_no);gActivated=1;timeCnt=0;elseif(gActivated)if(+timeCnt450)/超出时限第6章 语音处理技术及应用 PlayRespond(RSP_NOVOICE);/在设定时间内没有检测出声音gActivated=0;timeCnt=0;第6章 语音处理技术及应用 中断服务程序:.PUBLIC_FIQ.EXTERNAL_BSR_FIQ_Routine.EXTERNAL_gIsStopRecog/变量值为0识别器忙,为1识别器停止.PUBLIC_BREAK,_IRQ0,_IRQ1,_IRQ2,_IRQ3,_IRQ4,_IRQ5,_IRQ6,_IRQ7.EXTERNAL_PlayFlag.INCLUDEs480.inc.INCLUDEA2000.inc.INCLUDEresource.inc.INCLUDEhardware.inc.TEXT_FIQ:PUSHR1,R4TOSPR1=P_INT_Ctrl第6章 语音处理技术及应用 R1&=0x2000JZ?notTimerA/当不为TIQ_TMA时则转R1=_gIsStopRecogJNZ?BSR_NotBusy/若录音停止则转至放音处理CALL_BSR_FIQ_Routine/调用识别子程序JMP?BSR_Busy/返回中断?BSR_NotBusy:/放音处理R2=_PlayFlagJNZ?Play2000/播放标志为1则是播放SACM2000CALLF_FIQ_Service_SACM_S480/播放标志为0播放SACM480JMP?BSR_Busy/返回中断?Play2000:/SACM2000播放子程序CALLF_FIQ_Service_SACM_A2000?BSR_Busy:/中断返回第6章 语音处理技术及应用 R1=0x2000P_INT_Clear=R1POPR1,R4FROMSPRETI?notTimerA:R1=0x8800P_INT_Clear=R1POPR1,R4FROMSPRETI.END第6章 语音处理技术及应用 表表6.4 API函数使用寄存器一览表函数使用寄存器一览表 第6章 语音处理技术及应用
收藏 下载该资源
网站客服QQ:2055934822
金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号