热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

语音识别及其定点DSP实现

语音识别研究的根本目的是研究出一种具有听觉功能的机器,能直接接受人的口呼命令,理解人的意图并做出相应的反映。语音识别系统的研究涉及微机技术、人工智能、数

语音识别研究的根本目的是研究出一种具有听觉功能的机器,能直接接受人的口呼命令,理解人的意图并做出相应的反映。语音识别系统的研究涉及微机技术、人工智能、数字信号处理、模式识别、声学、语言学和认知科学等许多学科领域,是一个多学科综合性研究领域。近年来,高性能数字信号处理芯片DSP(Digital Signal Process)技术的迅速发展,为语音识别的实时实现提供了可能,其中,AD公司的数字信号处理芯片以其良好的性价比和代码的可移植性被广泛地应用于各个领域。因此,我们采用AD公司的定点DSP处理芯片ADSP2181实现了语音信号的识别。

1 语音识别的基本过程

根据实际中的应用不同,语音识别系统可以分为:特定人与非特定人的识别、独立词与连续词的识别、小词汇量与大词汇量以及无限词汇量的识别。但无论那种语音识别系统,其基本原理和处理方法都大体类似。一个典型的语音识别系统的原理图如图1所示。

1a320b36d94e312b29e0ef69570ca013.gif

语音识别过程主要包括语音信号的预处理、特征提取、模式匹配几个部分。预处理包括预滤波、采样和量化、加窗、端点检测、预加重等过程。语音信号识别最重要的一环就是特征参数提取。提取的特征参数必须满足以下的要求:

(1)提取的特征参数能有效地代表语音特征,具有很好的区分性;

(2)各阶参数之间有良好的独立性;

(3)特征参数要计算方便,最好有高效的算法,以保证语音识别的实时实现。

在训练阶段,将特征参数进行一定的处理后,为每个词条建立一个模型,保存为模板库。在识别阶段,语音信号经过相同的通道得到语音特征参数,生成测试模板,与参考模板进行匹配,将匹配分数最高的参考模板作为识别结果。同时,还可以在很多先验知识的帮助下,提高识别的准确率。

2 系统的硬件结构

2.1 ADSP2181的特点

AD公司的DSP处理芯片ADSP2181是一种16b的定点DSP芯片,他内部存储空间大、运算功能强、接口能力强。有以下的主要特点:

(1)采用哈佛结构,外接16.67MHz晶振,指令周期为30ns,指令速度为33MI/s,所有指令单周期执行;

(2)片内集成了80 kB的存储器:16 kB字的(24b)的程序存储器和16kB字(16b)的数据存储器;

(3)内部有3个独立的计算单元:算术逻辑单元(ALU)、乘累加器(MAC)和桶形移位器(SHIFT),其中乘累加器支持多精度和自动无偏差舍人;

(4)一个16b的内部DMA端口(1DMA),供片内存储器的高速存取;一个8b自举DMA(BDMA)口,用于从自举程序存储器中装载数据和程序;

(5)6个外部中断,并且可以设置优先级或屏蔽等。

由于ADSP2181以上的特点,使得该芯片构成的系统体积小、性能高、成本和功耗低,能较好地实现语音识别算法。

2.2 系统的硬件结构

在构成语音识别电路时,我们采用了ADSP2181的主从结构设计方式,通过IDMA口由CPU装载程序。语音识别系统的硬件结构如图2所示。

99edb3946ba80035fd8817ddb6dd9d65.gif

在这种结构中,PC机为主CPU,ADSP2181为从CPU,由PC机通过IDMA口将程序装载到ADSP2181的内部存储器中。PC机总线通过CPLD译码,形成IRD,IWR,IAL,IS等控制信号,与ADSP2181的IDMA口相连。这样,在ADSP2181全速运行时,主机可以查询从机的运行状态,可以访问到ADSP2181内部所有的程序存储器和数据存储器。这对程序的编译和调试,以及语音信号的实时处理带来了极大的方便。

3 语音识别的DSP实现技术

3.1 浮点运算的定点实现

在语音识别的算法中,有许多的浮点运算。用定点DSP来实现浮点运算是在编写语音识别程序中需要首先解决的问题。这个问题可以通过数的定标方法来实现。数的定标就是决定小数点在定点数中的位置。Q表示法是一种常用的定标方法。其表示机制是:

设定点数是J,浮点数是)/,则Q法表示的定点数与浮点数的转换关系为:

浮点数)/转换为定点数x:x= (int)y×2Q;

定点数z转换为浮点数y:y =(float)x×2-Q。

3.2 数据精度的处理

用16b的定点DSP实现语音识别算法时,虽然程序的运行速度提高了,但是数据精度比较低。这可能由于中间过程的累计误差而引起运算结果的不正确。为了提高数据的运算精度,在程序中采用了以下的处理方法:

(1)扩展精度

在精度要求比较高的地方,将计算的中间变量采用32b,甚至48b来表示。这样,在指令条数增加不多的情况下却使运算精度大大提高了。

(2)采用伪浮点法来表示浮点数

伪浮点法即用尾数+指数的方法来表示浮点数。这时,数据块的尾数可以采用Q1.15数据格式,数据块的指数相同。这种表示数据的方法有足够大的数据范围,可以完全满足数据精度的要求,但是需要自己编写一套指数和尾数运算库,会额外增加程序的指令数和运算量,不利于实时实现。

以上两种方法,都可以提高运算精度,但在实际操作时,要根据系统的要求和算法的复杂度,来权衡考虑。

3.3 变量的维护

在高级语言中,有全局变量与局部变量存储的区别,但在DSP程序中,所有声明的变量在链接时都会分给数据空间。所以如果按照高级语言那样定义局部变量,就会浪费大量的DSP存储空间,这对数据空间较为紧张的定点DSP来说,显然是不合理的。为了节省存储空间,在编写DSP程序时,最好维护好一张变量表。每进入一个DSP子模块时,不要急于分配新的局部变量,应优先使用已分配但不用的变量。只有在不够时才分配新的局部变量。

3.4 循环嵌套的处理

语音识别算法的实现,有许多是在循环中实现的。对于循环的处理,需要注意以下几个问题:

(1)ADSP2100系列DSP芯片中,循环嵌套最多不能超过4重,否则就会发生堆栈溢出,导致程序不能正确执行。但在语音识别的DSP程序中,包括中断在内的嵌套程序往往超过4重。这时不能使用DSP提供的do…unTIl…指令,只能自己设计出一些循环变量,自己维护这些变量。由于这时没有使用DSP的循环堆栈,所以也不会导致堆栈溢出。另外,如果采用jump指令从循环指令中跳出,则必须维护好PC,LOOP和CNTR三个堆栈的指针。

(2)尽量减少循环体内的指令数。在多重循环的内部,减少指令数有利于降低程序的执行次数。这样有利于减少程序的执行时间、提高操作的实时性。

3.5 采用模块化的程序设计方法

在语音识别算法的实现中,为了便于程序的设计和调试,采用了模块化的程序设计方法。以语音识别的基本过程为依据进行模块划分,每个模块再划分为若干个子模块,然后以模块为单元进行编程和调试。在编写程序之前,首先用高级语言对每个模块进行算法仿真,在此基础上再进行汇编程序的编写。在调试时,可以采用高级语言与汇编语言对比的调试方式,这样可以通过跟踪高级语言与汇编语言的中间状态,来验证汇编语言的正确性,并及时的发现和修改错误,缩短编程周期。另外,在程序的编写过程中,应在关键的部分加上必要的注释与说明,以增强程序的可读性。

在总调时,需要在各模块中设置好相应的人口参数与出口参数,维护好堆栈指针与中间变量等。

3.6 利用C语言与汇编语言的混合编程

现在,大多数的DSP芯片都支持汇编语言与C或C++语言的混合编程,ADSP2181也不例外。用C语言开发DSP程序具有缩短开发周期、降低程序复杂度的优点,但是,程序的执行效率却不高,会增加额外的机器周期,不利于程序的实时实现。为此,在用C语言编写语音识别算法时,我们采用了定点化处理技术。ADSP2181是16位定点处理器,定点化处理应注意以下几个问题:

(1)ADSP2181支持小数和整数两种运算方式,在计算时应选择小数方式,使计算结果的绝对值都小于1;

(2)用双字定点运算库代替C语言的浮点库,提高运算精度;

(3)注意在每次乘加运算之后进行饱和操作,防止结果的上溢和下溢;

(4)循环处理后的一组数据可能有不同的指数,要进行归一化处理,以便后续定点操作对指数和尾数部分分别处理。

4 结 语

用定点DSP芯片构成的语音识别系统有着广泛的应用前景,在编写语音识别算法时,对其进行定点化处理以及一些原则和方法对其他类似的算法也有着现实指导意义。在实际应用中,应注意根据DSP芯片的特点,对算法进行优化,使得DSP芯片的性能得到充分的发挥。


推荐阅读
  • 生成式对抗网络模型综述摘要生成式对抗网络模型(GAN)是基于深度学习的一种强大的生成模型,可以应用于计算机视觉、自然语言处理、半监督学习等重要领域。生成式对抗网络 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • Week04面向对象设计与继承学习总结及作业要求
    本文总结了Week04面向对象设计与继承的重要知识点,包括对象、类、封装性、静态属性、静态方法、重载、继承和多态等。同时,还介绍了私有构造函数在类外部无法被调用、static不能访问非静态属性以及该类实例可以共享类里的static属性等内容。此外,还提到了作业要求,包括讲述一个在网上商城购物或在班级博客进行学习的故事,并使用Markdown的加粗标记和语句块标记标注关键名词和动词。最后,还提到了参考资料中关于UML类图如何绘制的范例。 ... [详细]
  • 一、Hadoop来历Hadoop的思想来源于Google在做搜索引擎的时候出现一个很大的问题就是这么多网页我如何才能以最快的速度来搜索到,由于这个问题Google发明 ... [详细]
  • Android中高级面试必知必会,积累总结
    本文介绍了Android中高级面试的必知必会内容,并总结了相关经验。文章指出,如今的Android市场对开发人员的要求更高,需要更专业的人才。同时,文章还给出了针对Android岗位的职责和要求,并提供了简历突出的建议。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 如何用UE4制作2D游戏文档——计算篇
    篇首语:本文由编程笔记#小编为大家整理,主要介绍了如何用UE4制作2D游戏文档——计算篇相关的知识,希望对你有一定的参考价值。 ... [详细]
  • 本文介绍了使用PHP实现断点续传乱序合并文件的方法和源码。由于网络原因,文件需要分割成多个部分发送,因此无法按顺序接收。文章中提供了merge2.php的源码,通过使用shuffle函数打乱文件读取顺序,实现了乱序合并文件的功能。同时,还介绍了filesize、glob、unlink、fopen等相关函数的使用。阅读本文可以了解如何使用PHP实现断点续传乱序合并文件的具体步骤。 ... [详细]
  • 图解redis的持久化存储机制RDB和AOF的原理和优缺点
    本文通过图解的方式介绍了redis的持久化存储机制RDB和AOF的原理和优缺点。RDB是将redis内存中的数据保存为快照文件,恢复速度较快但不支持拉链式快照。AOF是将操作日志保存到磁盘,实时存储数据但恢复速度较慢。文章详细分析了两种机制的优缺点,帮助读者更好地理解redis的持久化存储策略。 ... [详细]
  • 解决Cydia数据库错误:could not open file /var/lib/dpkg/status 的方法
    本文介绍了解决iOS系统中Cydia数据库错误的方法。通过使用苹果电脑上的Impactor工具和NewTerm软件,以及ifunbox工具和终端命令,可以解决该问题。具体步骤包括下载所需工具、连接手机到电脑、安装NewTerm、下载ifunbox并注册Dropbox账号、下载并解压lib.zip文件、将lib文件夹拖入Books文件夹中,并将lib文件夹拷贝到/var/目录下。以上方法适用于已经越狱且出现Cydia数据库错误的iPhone手机。 ... [详细]
  • 计算机存储系统的层次结构及其优势
    本文介绍了计算机存储系统的层次结构,包括高速缓存、主存储器和辅助存储器三个层次。通过分层存储数据可以提高程序的执行效率。计算机存储系统的层次结构将各种不同存储容量、存取速度和价格的存储器有机组合成整体,形成可寻址存储空间比主存储器空间大得多的存储整体。由于辅助存储器容量大、价格低,使得整体存储系统的平均价格降低。同时,高速缓存的存取速度可以和CPU的工作速度相匹配,进一步提高程序执行效率。 ... [详细]
  • 浏览器中的异常检测算法及其在深度学习中的应用
    本文介绍了在浏览器中进行异常检测的算法,包括统计学方法和机器学习方法,并探讨了异常检测在深度学习中的应用。异常检测在金融领域的信用卡欺诈、企业安全领域的非法入侵、IT运维中的设备维护时间点预测等方面具有广泛的应用。通过使用TensorFlow.js进行异常检测,可以实现对单变量和多变量异常的检测。统计学方法通过估计数据的分布概率来计算数据点的异常概率,而机器学习方法则通过训练数据来建立异常检测模型。 ... [详细]
  • 背景应用安全领域,各类攻击长久以来都危害着互联网上的应用,在web应用安全风险中,各类注入、跨站等攻击仍然占据着较前的位置。WAF(Web应用防火墙)正是为防御和阻断这类攻击而存在 ... [详细]
  • 恶意软件分析的最佳编程语言及其应用
    本文介绍了学习恶意软件分析和逆向工程领域时最适合的编程语言,并重点讨论了Python的优点。Python是一种解释型、多用途的语言,具有可读性高、可快速开发、易于学习的特点。作者分享了在本地恶意软件分析中使用Python的经验,包括快速复制恶意软件组件以更好地理解其工作。此外,作者还提到了Python的跨平台优势,使得在不同操作系统上运行代码变得更加方便。 ... [详细]
author-avatar
眾于-晴
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有