新型语音电子钟设计资料Word文档下载推荐.docx
《新型语音电子钟设计资料Word文档下载推荐.docx》由会员分享,可在线阅读,更多相关《新型语音电子钟设计资料Word文档下载推荐.docx(29页珍藏版)》请在冰豆网上搜索。
研究特点以孤立字语音识别为主,通常把孤立字作为一个整体来建立模块。
80年代,语音识别研究重点之一是链接词语音识别,开发了各种连接词语音识别和关键词识别算法,如多级动态规划语音识别算法[2]。
目前在语音识别研究领域非常活跃的课题为稳健语音识别、说话人自适应技术、大词汇量关键词识别算法、语音说识别的可信度评测算法。
基于类的语言模型和自适应语言模型,一级深层次的自然语音的理解。
[3]国内外语音识别根据说话人可以分为:
特定人,任意人。
本系统特性为特定人的简单语音识别。
语音识别未来面临的主要问题:
自然语言的识别和理解、语音信息量大、语音的模糊性、语音特性的变动、环境噪声和干扰降低了识别率。
[4]
单片机是超大规模集成电路技术的产物,包括中央处理器CPU、存储器、定时/计数器、中断系统、I/O和DAC(ADC)电路。
早起单片机都是8位或者4位的,随着技术的发展高端的32位单片机诞生,主频超过300MHz,处理速度提高很多倍。
单片机由于集成度高,系统结构简单,模块化,可靠性高,处理速度快,目前在生活中的各个领域随处可见,广泛应用于仪器仪表、航空航天、医用设备等。
单片机诞生于20世纪70年代末,经历了SCM、MCU、SoC三大阶段。
随着超大规模集成电路技术的发展,单片机的应用更加广泛和深入。
第二章研究的主要内容及预期目标
第一节研究的理论基础
理论基础:
(1)模/数电子技术
(2)电路分析原理
(3)单片机原理
(4)数字信号处理(DSP)
(5)语音识别技术
研究的主要内容:
(1)语音识别技术
(2)D/A、A/D技术
(3)数字信号处理(DSP)技术
(4)接口电路及键盘电路设计
(5)系统的各子程序模块设计
(6)系统的稳定性和抗干扰性
系统的预期目标和可行性:
(1)系统的预期目标
(2)1SPLC501上面显示时间、日期、星期
(3)时间的可调性和闹铃选择
(4)备忘录提示
(5)语音识别控制报时功能
(6)系统的可行性
(7)系统的稳定性
本系统采用高度集成的单片机SPCE061A,处理速度快,SPCE061A的实时时钟32768Hz经过PLL倍频电路产生系统时钟频率再经过分频得到CPU时钟频率。
时基信号来于32768HZ为系统提供中断信号。
电源的的前后两组电容用来去耦滤波。
[5]为了获得标准3.3V电压,在板子上加入SPY0029A三端稳压器,两个二极管,是为防止误将电源接反造成不必要损失保证了系统的稳定性。
第三章系统的硬件设计
第一节ISPCE061单片机系统电路
图3.1.1系统硬件结构图
系统的硬件电路包括:
单片机系统(DAC(ADC、语音识别、定时/计数等)、时钟芯片单元、音频输入输出单元、显示单元、接口电路单元、电源电路单元、键盘中断单元。
IOA的高八位接到液晶模组的八个数据端,同时也连接了液晶模组的电源,即直接用一根10pin的排线连接61板“+”、IOA8~15、“-”与SPLC501A液晶显示模组的“+”、DB0~7、“-”,主要用来向液晶模组传送命令和数据;
IOB6接EP,IOB5接R/W,IOB4接AO,用来控制液晶的显示和工作方式。
3.1SPCE061单片机系统电路
图3.1.2SPCE061系统电路
图3.1.2附系统的存储单元分段
SPCE061A包括:
FLASH(闪存)、SRAM(静态内存)、通用I/O端口、定时器/计数器、中断控制、CPU时钟锁相环(PLL)、ADC(模拟数字转换器)、DAC(数字模拟转换器)输出、UART(同步串行输入输出接口)、SIO(串行输入输出接口)、低电压监测/低电压复位模块、Watchdog。
声音模/数转换器输入通道内置麦克风放大器,并具有自动增益控制(AGC)功能。
内置在线仿真电路接口ICE(在线实时仿真/除错器)。
SPCE061A的系统时钟由时钟发生器(32768Hz晶振)、锁相环(PLL)和时间基准信号(RTC)组成。
32768Hz的实时时钟经过PLL倍频电路产生系统时钟频率(Fosc),Fosc再经过分频得到CPU时钟频率(CPUCLK)。
锁相环PLL(PhaseLockLoop)振荡器电路的作用是将系统提供的实时时钟的基频(32768Hz)进行倍频。
时间基准信号,简称时基信号,来自于32768Hz实时时钟,通过频率选择组合而成。
时基信号发生器为定时/计数器提供各种频率选择信号并为中断系统提供中断源信号。
此外,时基信号发生器还可以通过分频产生时基信号,为中断系统提供各种实时中断源信号。
第二节晶振电路
图3.2
晶振电路32768Hz的实时时钟经过PLL倍频电路产生系统时钟频率(Fosc),Fosc再经过分频得到CPU时钟频率(CPUCLK)。
第三节麦克风输入电路
图3.3麦克风输入电路
此电路主要人通过MIC把语音信号输入到系统中,单片机通过dsp算法、A\D转换存储在flash中,然后通过API函数模式匹配进行语音控制识别及时报时等。
第四节音频输出电路
图3.4音频输出电路
当触发MIC_In通道输入后,产生一个开始信号(b15(RDY)=0)。
然后,逐次逼近式ADC首先设置最高位,然后清除SAR的其它位(1000000000B)。
这时,DAC0输出电压(1/2AVdd)与输入电压Vin进行比较。
如果Vin>VDAC,保持原先设置为‘1’的位(最高有效位)仍为‘1’;
否则,该位会被清为‘0’。
这个过程重复10次,直到这些位都被比较过。
转换结果将会保存在SAR内。
A/D转换完成之后,P_ADC_Ctrl(读)($7015H)的第15位RDY被置为”1”。
第五节电源电路
图3.5电源电路
采用3节5号电池进行供电,由J10接入,其中的前后两组电容用来去耦滤波,使其供给芯片更加平滑。
为了获得标准3.3V电压,在板子上加入SPY0029A三端稳压器。
两个二极管,是为防止误将电源接反造成不必要损失而设置的,在操作过程中千万不要将电源接反,因为反向电压超过一定的值,二极管将会被损坏,达不到保护的目的。
后面的零电阻及其电源分不同的几路是为了减少电磁干扰设置的。
第六节SPLC501液晶显示系统电路
图3.6液晶显示系统电路
SPLC501为液晶显示控制驱动器,集行、列驱动器和控制器于一体,广泛应用于小规模液晶显示模块。
SPLC501单芯片液晶驱动,可以直接与其他微控制器接口总线相连。
微控制器可以将显示数据通过8位数据总线或者串行接口写到SPLC501的显存中。
SPLC501的特点:
1.内置8580位显示RAM。
RAM中的一位数据控制液晶屏上的一个象素点的亮、暗状态。
“1”亮“0”暗。
2.具有65行驱动输出和132列驱动输出。
3.可以直接与80系列和68系列微处理器相连。
4.内置晶振电路,也可以外接晶振。
5.工作温度范围为-40摄氏度和+85摄氏度之间。
SPLC501液晶显示模组采用GPG12063YS3LCD模块,此模块内嵌SPLC501芯片,采用先进的COG技术,将芯片嵌在LCD玻璃上。
第七节电路板、pc连接电路(下载区)
图3.7下载连接电路图
ICE基本运行方式是通过控制clock及通过ICE伪指令方式,来控制CPU的运行及缓存器资料和内存资料的存取,因此必须通过控制缓存器值的设定来控制目前CPU的动作。
板上的74HC244主要是在我们用下载线进行程序下载时起作用,主要起缓存的作用和完成对SDA是用来作为数据回送还是数据下载进行选择。
3.8晶振、指示灯、复位、电源电路等略。
第四章系统的软件设计
系统的软件设计就是个子程序系统设计,包括:
初始主程序、功能程序、语音函数库程序、中断程序
图4.1程序结构图
第一节中断程序系统
4.1.1语音识别中断
语音识别技术主要是音频压缩技术的问题,本系统采用的是特定人的语音识别SD(SpeakerDependent):
是指语音样板由单个人训练,也只能识别训练人的语音命令,而他人的命令识别率较低或几乎不能识别。
[8]接口是API(ApplicationProgrammingInterface,应用程序编程接口)是一些预先定义的函数。
图4.2识别简图
API函数:
intBSR_DeleteSDGroup(0)
intBSR_Train(intCommandID,intTraindMode)
voidBSR_InitRecognizer(intAudioSource)
intBSR_GetResult(Void)
voidBSR_StopRecognizer(void)
voidBSR_FIQ_Routine
初始化:
【API格式】C:
intBSR_DeleteSDGroup(0);
ASM:
F_BSR_DeleteSDGroup(0)
【功能说明】SRAM初始化。
【参数】该参数是辨识的一个标识符,0代表选择SRAM,并初始化。
【返回值】当SRAM擦除成功返回0,否则,返回-1。
训练部分:
1)【API格式】C:
intBSR_Train(intCommandID,intTraindMode);
F_BSR_Train
【功能说明】训练函数。
【参数】
CommandID:
命令序号,范围从0x100到0x105,并且对于每组训练语句都是唯一的。
TraindMode:
训练次数,要求使用者在应用之前训练一或两遍:
BSR_TRAIN_ONCE:
要求训练一次。
BSR_TRAIN_TWICE要求训练两次。
【返回值】训练成功,返回0;
没有声音返回-1;
训练需要更多的语音数据来训练,返回-2;
当环境太吵时,返回-3;
当数据库满,返回-4;
当两次输入命令不通,返回-5;
当序号超出范围,返回-6。
【备注】
①在调用训练程序之前,确保识别器正确的初始化。
②训练次数是2时,则两次一定会有差异,所以一定要保证两次训练结果接近。
③为了增强可靠性,最好训练两次,否则辨识的命令就会倾向于噪音。
④调用函数后,等待2秒开始训练,每条命令只有1.3秒,也就是说,当训练命令超出1.3秒时,只有前1.3秒命令有效。
辨识部分:
1)
【API格式】C:
voidBSR_InitRecognizer(intAudioSource)
F_BSR_InitRecognizer
【功能说明】辨识器初始化。
【参数】定义语音输入来源。
通过MIC语音输入还是LINE_IN电压模拟量输入。
【返回值】无。
2)
intBSR_GetResult();
F_BSR_GetResult
【返回值】=R1
【功能说明】辨识中获取数据。
【参数】无。
【返回值】
当无命令识别出来时,返回0;
识别器停止未初始化或识别未激活返回-1;
当识别不合格时返回-2;
当识别出来时返回命令的序号。
`【备注】该函数用于启动辨识,BSR_GetResult();
3)
voidBSR_StopRecognizer(void);
F_BSR_StopRecognizer
【功能说明】停止辨识。
【参数】无。
【返回值】无。
【备注】该函数是用于停止识别,当调用此函数时,FIQ_TMA中断将关闭。
中断部分:
【API格式】ASM:
_BSR_InitRecognizer
【功能说明】在中断中调用,并通过中断将语音信号送DAC通道播放。
①该函数在中断FIQ_TMA中调用。
②当主程序调用BSR_InitRecognizer时,辨识器便打开8K采样率的FIQ_TMA
中断并开始将采样的语音数据填入辨识器的数据队列中。
③应用程序需要设置一下程序段在FIQ_TMA中:
.PUBLIC_FIQ
.EXTERNAL_BSR_FIQ_Routine//定义全局变量
.TEXT
_FIQ:
PUSHR1,R4to[SP]//寄存器入栈保护
R1=[P_INT_Ctrl]
CALL_BSR_FIQ_Routine//调用子程序
R1=0x2000//清中断标志位
[P_INT_Clear]=R1
POPR1,R4from[SP];
//寄存器组出栈
RETI
END
其中实时监控是用来观察辨识是否正常工作,如果辨识正常则会产生一16ms连续稳定方波,否则如果CPU超载则会产生不稳定波形,此时需要删除命令,或是优化程序否则会丢失语音数据产生辨识出现错误的信息。
图4.3识别过程函数功能
识别识别过程:
触发识别训练
"
请输入第一条命令"
请输入第二条命令"
请再说一遍"
(以上提示音每说完一遍出现此命令)
没有听到任何声音"
(当没有检测到声音时出现此命令)
两次输入名称不相同"
(当两次输入的名称不同时出现此命令)
两次输入命令不相同"
(当两次输入的命令有差异时出现此命令)
准备就绪,请开始辨识"
(以上三条语句全部训练成功时,进入......)
图4.3识别功能实现流程图
4.1.2键盘扫描中断
KEY2
+KEY3
图4.4键盘选择说明
语音播报及闹铃程序段:
//文件名称:
bobao.c
//功能描述:
日期和时间的语音播报
#include"
SPCE061A.h"
s480.h"
#defineC_T000
#defineC_T011
#defineC_T022
#defineC_T033
#defineC_T044
#defineC_T055
#defineC_T066
#defineC_T077
#defineC_T088
#defineC_T099
#defineC_T1010
#defineC_DIAN11
#defineC_MIN12
#defineC_YEAR13
#defineC_MONTH14
#defineC_DAY15
#defineC_BELL16
externunsignedintyear;
externunsignedintgmonth;
externunsignedintgday;
externunsignedinthour;
externunsignedintmin;
//语法格式:
PlayRespond(unsignedintResult)
//实现功能:
对对传入的实参序号的语音资源进行播报
voidPlayRespond(unsignedintResult)
{
SACM_S480_Initial
(1);
*P_INT_Ctrl_New=*P_INT_Ctrl_New|0x0004;
//使初始化后不影响2KZ中断
SACM_S480_Play(Result,3,3);
while((SACM_S480_Status()&
0x0001)!
=0)
{
SACM_S480_ServiceLoop();
*P_Watchdog_Clear=0x0001;
}
SACM_S480_Stop();
}
PlaySpeakYear(intYearTemp)
播报年
voidPlaySpeakYear(intYearTemp)
PlayRespond((YearTemp/1000));
PlayRespond((YearTemp%1000)/100);
PlayRespond((YearTemp%100)/10);
PlayRespond((YearTemp%10));
PlayRespond(C_YEAR);
PlaySpeakMonth(intMonthTemp)
播报月
voidPlaySpeakMonth(intMonthTemp)
if(MonthTemp<
10)
PlayRespond(MonthTemp);
elseif(MonthTemp==10)
PlayRespond(C_T10);
elseif(MonthTemp==11)
PlayRespond(C_T01);
elseif(MonthTemp==12)
PlayRespond(C_T02);
PlayRespond(C_MONTH);
PlaySpeakDay(intDayTemp)
播报日
voidPlaySpeakDay(intDayTemp)
{
if((DayTemp/10)>
1)
PlayRespond(DayTemp/10+C_T00);
//十位>
1报
0)
//报十,十位为1不报1
if((DayTemp%10)!
=0)
PlayRespond(DayTemp%10+C_T00);
PlayRespond(C_DAY);
PlaySpeakHour(intDayTemp)
播报时
voidPlaySpeakHour(intDayTemp)
if(DayTemp<
10)
PlayRespond(DayTemp);
elseif(DayTemp==10)
else