【毕业设计】基于stm32的语音识别 - 单片机 嵌入式 物联网 语音识别

article/2025/11/8 19:01:31

文章目录

  • 0 简介
  • 1 项目目标
  • 2 项目背景意义
  • 3 需求分析
    • 3.1 功能性需求
    • 3.2 非功能性需求
  • 4 设备器件
    • 4.1 STM32单片机
    • 4.2 LD3320语音识别芯片
    • 4.3 TFT-LCD液晶显示屏
  • 5 设计方案
  • 6 语音识别模块的开发
  • 7 报警电路模块的开发
  • 8 上位机模块的开发
  • 9 项目成果
  • 9 最后


0 简介

Hi,大家好,这里是丹成学长,今天向大家介绍一个 单片机项目

于stm32的智能婴儿车 婴儿床

大家可用于 课程设计 或 毕业设计


单片机-嵌入式毕设选题大全及项目分享:

https://blog.csdn.net/m0_71572576/article/details/125409052


1 项目目标

项目最终实现功能: 用户说出指定的语音,硬件系统(由STM32和LD3320构成)能识别并显示在LCD液晶屏上,并触发预设的报警电路(由蜂鸣器和LED灯组成),还开发了对应的上位机(运行在PC电脑上),上位机可以显示硬件系统的状态,也可以控制其状态。

2 项目背景意义

首先,我们所开发的语音识别报警监控系统可以解放工厂员工的双手,让他们通过说出语音即可对设备进行控制,更方便也更快捷。

其次,当现场的工作人员正忙于操纵设备,无法腾出手来发出警报,或者当他们距离报警系统较远,无法手动发出警报,可以通过该语音识别系统进行发出警报的操作。

最后,我们还开发了上位机,这让工作人员可以无需待在工业现场,在办公室内也可查看当前设备的报警情况,还可通过该上位机发出特定的警报。

3 需求分析

3.1 功能性需求

该语音识别系统能够读入不同报警类型的语音,并予以波形显示;利用单片机对不同报警类型语音进行匹配识别,根据识别结果输出声音报警和光指示报警,要求误报率应低于10%;对语音进行预处理,对语音信号进行特征参数提取;通过STM32单片机编写控制程序;实现上位机的开发,完成嵌入式系统与上位机的交互。

3.2 非功能性需求

考虑相关的社会、健康、安全、法律及环境方面的制约因素;讨论或分析或预测本项目所应用或涉及的相关新技术或新产品、新工艺对本项目的积极意义和对社会、安全、健康、法律及文化方面可能存在的正、负影响。给出两种设计方案并进行论证。

4 设备器件

4.1 STM32单片机

具体型号是STM32F103,对其进行开发的语言是C语言,编译器为keil5。

4.2 LD3320语音识别芯片

LD3320是非特定人语音识别芯片,内部已经集成了语音识别处理器和一些信号调制电路,拥有高性能的A/D转换器、D/A转换器、麦克风音频信号输入接口、音频解码输出接口等,用户只需要用软件编辑好待识别的关键词列表,LD3320最大可以支持50条关键词句,把这些列别以字符的形式传送到芯片中,就可以对待识别的语音信号进行近似度分析,识别后输出结果。

4.3 TFT-LCD液晶显示屏

TFT-LCD即薄膜场效应晶体管,是有源矩阵类型液晶显示屏(AM-LCD)中的一种。

5 设计方案

语音识别报警监控系统主要由 STM32单片机、LD3320 语音识别模块、报警电路模块、上位机模块组成。

将LD3320语音识别芯片与我们自己设计的报警电路接在单片机STM32上,通过对单片机STM32进行编程来实现处理输入的语音信号,触发对应的报警电路等操作,编程语言为C语言,编程软件为KEIL5,由LD3320进行语音的采集,在STM32单片机上对识别结果进行逻辑判断,从而输出端口产生对应的输出信号,由显示屏、LED灯、蜂鸣器构成的报警电路模块用来显示报警效果。用C#语言编写上位机软件,软件安装在PC电脑上,通过串口使得上位机与下位机(单片机STM32)进行通信。

在这里插入图片描述

6 语音识别模块的开发

硬件上将语音识别芯片LD3320接在单片机STM32上。

具体端口连接:LD3320的MISO口与STM32的PA6口相接,MOSI口与PA7口相接,SCK口与PA5口相接,NSS口与PA4口相接,RST口与PB15口相接,WR口与PB13口相接,IRQ口与PB12口相接,NC口悬空。
软件上通过给STM32编写C语言程序来实现对语音信号的处理。

语音识别的操作顺序是:语音识别用初始化(包括通用初始化)→写入识别列表→开始识别,并准备好中断响应函数,打开中断允许位。

这里需要说明一下,如果不用中断方式,也可以通过查询方式工作。在“开始识别”后,读取寄存器 B2H 的值,如果为 21H 就表示有识别结果产生。在此之后读取候选项等操作与中断方式相同。

首先进行通用初始化,再进行语音识别用初始化,再写入识别列表。列表的规则是,每个识别条目对应一个特定的编号(1 个字节),不同的识别条目的编号可以相同,而且不用连续。该芯片最多支持 50个识别条目,每个识别条目是标准普通话的汉语拼音(小写),每 2个字(汉语拼音)之间用一个空格间隔。我们添加了四个关键词,分别是“全亮”、“全灭”、“闪烁”、“流水灯”,这些关键词仅供我们测试所用,在实际的现场可根据实际情况增加、删除和修改关键词。

在这里插入图片描述
接下来是开始识别,在代码中用变量nAsrStatus表示main主程序中表示程序运行的状态,有如下几个状态:LD_ASR_NONE表示没有在作ASR识别,LD_ASR_RUNING表示LD3320正在作ASR识别,LD_ASR_FOUNDOK表示一次识别流程结束后,有一个识别结果,LD_ASR_FOUNDZERO表示一次识别流程结束后,没有识别结果, LD_ASR_ERROR表示一次识别流程中LD3320芯片内部出现不正确的状态。在编程时要把对该状态的设置放在正式 LD3320 芯片开始识别以前。一次ASR识别流程结束后,去取ASR识别结果,通过C语言的switch语句对语音识别的结果进行匹配,从而触发对应的报警电路代码,上位机代码等。

然后当有声音输入时,会产生中断不管是否识别出正常结果,都会产生一个中断信号。而中断程序要根据寄存器的值分析结果。读取 BA 寄存器的值,可以知道有几个候选答案,而 C5 寄存器里的答案是得分最高、最可能正确的答案。例如发音为“全亮”并被成功识别(无其他候选),那么 BA 寄存器里的数值是 1,而 C5 寄存器里的值是对应的编码 3。

7 报警电路模块的开发

报警电路模块主要由一个LCD-TFT、两个LED灯和一个蜂鸣器组成。LED灯与蜂鸣器是直接使用单片机STM32自带的,无需外接,而对于LCD-TFT,将其与单片机STM32相连,硬件连接图如下:

在这里插入图片描述

通过对STM32的编程,来控制报警显示的效果。将不同的状态对应的报警显示效果分别封装成函数,在语音识别之后选择对应的函数执行,从而触发对应的报警显示效果。预设了“全亮”状态下两盏LED灯都亮,LCD显示“当前状态:全亮”;“全灭”状态下两盏LED灯都灭,LCD显示“当前状态:全灭”;“闪烁”和“报警”状态下两盏LED灯闪烁,蜂鸣器响,LCD显示“当前状态:闪烁”;“第一个闪”状态下一个LED灯闪烁,一个LED灯熄灭,LCD显示“当前状态:第一个闪”。

LED灯的亮灭通过控制对应管脚的高低电平即可,蜂鸣器也是一样,对于LCD显示内容的控制,通过取模工具,输入需要的字符,如汉字、数字和字母,该工具会直接生成C语言代码,再通过LCD_ShowString()和LCD_ShowChinese()两个函数控制LCD上显示的内容。

8 上位机模块的开发

开发工具为VS,语言为C#。

首先先新建项目,选择visual C#语言下面的windows窗体应用程序。

在这里插入图片描述

然后设置窗体的组件,在工具箱中有各种各样的组件,使用的话可以拖需要的组件进入到form中即可,按照预期的功能设置窗体,最终窗体界面如下:

在这里插入图片描述
在该窗体中,预设两个下拉框用来设置端口与波特率,一个开关用来连接和断开上位机和单片机间的通信,一个文本框用来显示当前的状态,一个文本框用来显示历史接收数据,一个下拉框用来选择用户想要单片机呈现的状态,一个按钮用来将用户选择的状态信息传输到单片机一端,从而上位机控制的效果。

private void Form1_Load(object sender, EventArgs e){for (int i = 0; i < 20; i++){try{string str = "COM" + i;serialPort1.PortName = str;serialPort1.Open();comboBox1.Items.Add(str);serialPort1.Close();comboBox1.Text = str;}catch { }}comboBox1.Text = "COM3";comboBox2.Text = "115200";}

上述代码用来自动设置上位机的端口号,从而实现上位机与单片机的连接,若已知端口和波特率的话,也可直接设置comboBox1.Text为已知端口号,设置comboBox2.Text为已知波特率。

private void button1_Click(object sender, EventArgs e){if(Button_State){try{serialPort1.PortName = comboBox1.Text;serialPort1.BaudRate = Convert.ToInt32(comboBox2.Text, 10);serialPort1.Open();button1.Text = "断开";Button_State = false;}catch (Exception){if (serialPort1.IsOpen)serialPort1.Close();MessageBox.Show("端口打开失败,请检查端口", "错误");}}else{serialPort1.Close();button1.Text = "连接";Button_State = true;}}

上述代码是点击“断开/连接”按钮后触发的函数代码,用变量Button_State表示当前上位机与单片机间是否连接,根据连接情况与否,通过if 语句执行对应的代码,通过函数serialPort1.Close()来断开连接,通过serialPort1.PortName来设置端口号,通过serialPort1.BaudRate来设置波特率,通过serialPort1.Open()来开启连接。

private void serialPort1_DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e){textBox2.Text=serialPort1.ReadExisting();if (textBox2.Text.Contains("LCD"))textBox2.Text = " ";textBox1.AppendText(textBox2.Text);if (textBox2.Text.Contains("流")) textBox3.Text = "流水灯";else if (textBox2.Text.Contains("闪"))textBox3.Text = "闪烁";else if (textBox2.Text.Contains("第"))textBox3.Text = "第一个";else if (textBox2.Text.Contains("灭"))textBox3.Text = "全灭";else if (textBox2.Text.Contains("亮"))textBox3.Text = "全亮";}

上述代码用来显示当前单片机的状态,通过中断的方式,当单片机向上位机传输数据时,就执行以上代码。在单片机的程序中,向上位机传输数据的代码是printf(),而在上位机的程序中,用textBox2.Text即可拿到传输的数据,Contain()函数表示是否包含某个字符,通过设置textBox3.Text从而在窗体中显示当前的状态。

9 项目成果

在这里插入图片描述

在这里插入图片描述


单片机-嵌入式毕设选题大全及项目分享:

https://blog.csdn.net/m0_71572576/article/details/125409052


9 最后


http://chatgpt.dhexx.cn/article/w69qJw6h.shtml

相关文章

基于80251的嵌入式语音识别

一、文档介绍 嵌入式语音识别技术在251内核的实现。 缩写、术语 解 释 Specific Person Isolated Word Speech Recognition 特定人孤立词语音识别 Endpoint detection 端点检测 Feature parameter extraction 特征参数提取 DTW (Dynamic Time Warping) 动态时间规整…

嵌入式linux 声控,基于Cortex-A9的嵌入式语音识别系统设计

打开文本图片集 摘 要:在人工智能技术发展的进程中,语音识别已经成为重要分支之一。语音识别技术作为人与机器的一种交互方式,将前端处理之后的信号转换成文本或者指令,进而用于控制相关智能设备。当前,基于深度学习的云端语音识别技术已经逐渐成熟,但考虑到离线设备无法…

《嵌入式 - 语音识别TWen-ASR-ONE开发笔记》第3章 TWen-ASR-ONE 多线程和消息队列

3.1 Scratch简介 在开始本章之前&#xff0c;需要介绍下TWen-ASR-ONE的用户开发语言-Scratch&#xff0c;Scratch是麻省理工学院开发的一款简易图形化编程工具主要是为青少年开发的一种编程工具&#xff0c;它图形化编程工具当中最广为人知的一种形式&#xff0c;所有人都可以…

Android导航语音识别——语音听写(嵌入式)

嵌入式项目之Android导航语音识别——语音听写 文章目录 系列文章目录前言一、原理流程图二、语音听写 1.初始化无ui识别听写2.设置识别监听器3.启动功能总结 前言 最近在学习嵌入式系统的一个功能——导航语音识别&#xff0c;该功能是基于Android和科大讯飞语音识别语音合成…

static的三个作用

static作用 一、修饰局部变量-静态局部变量二、修饰全局变量-静态全局变量三、修饰函数-静态函数四、总结和注意点 一、修饰局部变量-静态局部变量 static修饰局部变量时&#xff0c;改变了变量的生命周期&#xff0c;让静态局部变量出了作用域依然存在&#xff0c;到程序结束&…

java中的静态变量的作用域_详解JAVA中static的作用

1、深度总结 引用一位网友的话,说的非常好,如果别人问你static的作用;如果你说静态修饰 类的属性 和 类的方法 别人认为你是合格的;如果是说 可以构成 静态代码块,那别人认为你还可以; 如果你说可以构成 静态内部类, 那别人认为你不错;如果你说了静态导包,那别人认为你…

express.static 作用及用法

express相信是很多人用nodejs搭建服务器的首选框架&#xff0c;相关教程有很多&#xff0c;也教会了大家来如何使用。如果你想更深的了解他的细节&#xff0c;不妨和我一起来研究一下。 先来看一个每个人都用到的方法app.use(express.static(__dirname/public)); 你肯定在你的a…

java static的作用

static是什么 static是java中的关键字&#xff0c;static表示”全局”、“静态”的意思&#xff0c;用来修饰成员变量和成员方法&#xff0c;定义的变量&#xff0c;我们通常将用static修饰的成员称为静态变量&#xff0c;静态方法或者静态成员。 static的作用 被static修饰…

static的作用有哪些?

C语言中的static的作用有&#xff1a;1.修饰局部变量。2.修饰全局变量。3.修饰函数。 1.修饰局部变量。 如图&#xff1a; 当只用int 定义变量a时,此时程序运行结果为&#xff1a; 程序运行结果为10个2&#xff0c;这是为什么呢&#xff1f;&#xff1f; 原因是此时的变量a为…

C语言中 static作用

在C语言中&#xff0c;static的字面意思很容易把我们导入歧途&#xff0c;其实它的作用有三条。隐藏保持数据持久初始化为0 该图是下面文字的总结&#xff1a; 1.先来介绍它的第一条也是最重要的一条&#xff1a;隐藏。 当我们同时编译多个文件时&#xff0c;所有未加static前…

C语言中static作用

1,static修饰局部变量 在局部变量之前加上关键字static&#xff0c;局部变量就被定义成为一个局部静态变量。 特点如下: 1&#xff09;存储区&#xff1a;由于栈变为静态存储区rw data&#xff0c;生存期为整个源程序&#xff0c;只能在定义该变量的函数内使用。退出该函…

对DSP的基本了解(一)--DSP是什么?

Preface&#xff1a;在学习一个新东西之前&#xff0c;我们需要对一些基本概念或者专业术语进行基本的理解&#xff0c;这样才能扫除壁垒&#xff0c;让学习更加高效。因此&#xff0c;DSP学习系列首先会比较注重对DSP相关术语上的理解。所以最开始&#xff0c;我们先来学习一些…

DSP学习

DSP数字电源学习一 软件环境搭建相关硬件资源TMS320C28x 32 位 CPU可编程控制律加速器 (CLA)片上存储器时钟和系统控制1.2V 内核、3.3V I/O 设计系统外设通信外设模拟系统 软件相关控制算法数据记录功能代码示例MathWorks Simulink 模型文档 由于最近工作需要&#xff0c;需要学…

DSP/BIOS详解入门

DSP/BIOS详解入门 百度百科DSPBIOS DSP/BIOS是TI公司特别为其TMS320C6000TM&#xff0c;TMS320C5000TM和TMS320C28xTM系列DSP平台所设计开发的一个尺寸可裁剪的实时多任务操作系统内核&#xff0c;是TI公司的Code Composer StudioTM开发工具的组成部分之一。 DSP/BIOS 实时操作…

DSP基础知识回顾

文章目录 1. 什么是DSP2. DSP与其他主流芯片的区别2.1 DSP与MCU的区别2.2 DSP与ARM的区别2.3 DSP与FPGA的区别 3. TI公司DSP具体型号的含义4. TMS320x2814的片内外设4.1 事件管理器4.2 模拟量转换为数字量的ADC采样模块4.3 串行通信接口SCI4.4 串行外围设备接口SPI4.5 局域网通…

DSP学习 -- 前言

已经换工作20天了&#xff0c;感觉又是换行业了一样。跳入DSP和FPGA的大坑了。 除了C语言基础还算可以&#xff0c;其他要学的东西太多了。 也是&#xff0c;终于可以又回到那种能学习和吸取新鲜知识的节奏了。相对来说虽然很累&#xff0c;但是我还是比较喜欢这种状态。总比吃…

最强ADI SHARC系列DSP:ADSP-SC589的开发入门详解

作者的话 ADI的SHARC系列DSP&#xff0c;现阶段最强的型号是SC589&#xff0c;那么我就以SC589为例&#xff0c;写一点资料&#xff0c;让新手能够比较便捷的熟悉开发环境&#xff0c;软硬件&#xff0c;顺利的进入开发。 文档解决的是入门的问题&#xff0c;所以不会深入去写…

嵌入式开发之DSP学习

一、ARM、DSP、FPGA ARM具有比较强的事务管理功能&#xff0c;可以用来跑界面以及应用程序等&#xff0c;其优势主要体现在控制方面&#xff1b;ARM是32位的单片机&#xff0c;其内部硬件资源的性能较高&#xff0c;可以加载操作系统成为其主要特点&#xff0c;有了操作系统&am…

[培训-DSP快速入门-2]:C54x DSP处理器的架构

作者主页(文火冰糖的硅基工坊)&#xff1a;https://blog.csdn.net/HiWangWenBing 本文网址&#xff1a;https://blog.csdn.net/HiWangWenBing/article/details/118889692 目录 1. C54x芯片的总体基本架构 1.1 冯诺依曼结构 1.2 哈佛结构 1.3 混合结构 1.4 C54x芯片结构 …

dsp基础算法

【小编】发现好文一篇&#xff0c;让大家对DSP中的基础算法和模型有一个初步的了解。 &#xff08;转载请保留原文链接 http://www.techinads.com/archives/41authored by 江申_Johnson&#xff09; 美国有一家很优秀的DSP公司–M6D&#xff08;m6d.com&#xff09;&#xff0c…