当前位置: 首页 > news >正文

基于STM32开发的智能语音助手系统

目录

  1. 引言
  2. 环境准备工作
    • 硬件准备
    • 软件安装与配置
  3. 系统设计
    • 系统架构
    • 硬件连接
  4. 代码实现
    • 初始化代码
    • 控制代码
  5. 应用场景
    • 智能家居控制
    • 个人语音助理
  6. 常见问题及解决方案
    • 常见问题
    • 解决方案
  7. 结论

1. 引言

随着人工智能技术的发展,智能语音助手已经逐渐进入了人们的日常生活。通过语音识别和自然语言处理,智能语音助手可以帮助用户完成各种任务,如控制家电、设置提醒和查询信息。本文将介绍如何使用STM32微控制器设计和实现一个基础的智能语音助手系统。

2. 环境准备工作

硬件准备

  • STM32开发板(例如STM32F103C8T6)
  • 音频输入模块(例如麦克风模块)
  • 音频输出模块(例如扬声器模块)
  • Wi-Fi模块(例如ESP8266,用于联网处理语音数据)
  • OLED显示屏(用于显示系统状态)
  • 按钮和LED(用于用户交互)
  • 面包板和连接线
  • USB下载线

软件安装与配置

  • Keil uVision:用于编写、编译和调试代码。
  • STM32CubeMX:用于配置STM32微控制器的引脚和外设。
  • ST-Link Utility:用于将编译好的代码下载到STM32开发板中。
  • 在线语音识别服务(例如Google Speech-to-Text API):用于语音数据处理。

步骤:

  1. 下载并安装Keil uVision。
  2. 下载并安装STM32CubeMX。
  3. 下载并安装ST-Link Utility。
  4. 注册并获取语音识别API的访问密钥。

3. 系统设计

系统架构

智能语音助手系统通过STM32微控制器连接麦克风、扬声器和Wi-Fi模块,实现语音采集、处理和反馈。语音数据通过Wi-Fi模块发送到在线语音识别服务进行处理,并根据识别结果控制设备或执行指令。系统包括语音采集模块、语音处理模块、设备控制模块和用户交互模块。

硬件连接

  1. 将麦克风模块的输出引脚连接到STM32的ADC引脚(例如PA0),VCC引脚连接到STM32的3.3V引脚,GND引脚连接到GND。
  2. 将扬声器模块的输入引脚连接到STM32的DAC引脚(例如PA4),VCC引脚连接到STM32的3.3V引脚,GND引脚连接到GND。
  3. 将Wi-Fi模块(例如ESP8266)的TX、RX引脚分别连接到STM32的USART引脚(例如PA9、PA10),VCC引脚连接到STM32的3.3V引脚,GND引脚连接到GND。
  4. 将OLED显示屏的VCC引脚连接到STM32的3.3V引脚,GND引脚连接到GND,SCL引脚连接到STM32的SCL引脚(例如PB6),SDA引脚连接到STM32的SDA引脚(例如PB7)。
  5. 将按钮的一个引脚连接到STM32的GPIO引脚(例如PA1),另一个引脚连接到GND。
  6. 将LED的正极引脚连接到STM32的GPIO引脚(例如PA2),负极引脚连接到GND。

4. 代码实现

初始化代码

#include "stm32f1xx_hal.h"
#include "wifi.h"
#include "audio_input.h"
#include "audio_output.h"
#include "oled.h"
#include "button.h"
#include "led.h"void SystemClock_Config(void);
static void MX_GPIO_Init(void);
static void MX_USART1_UART_Init(void);
static void MX_ADC1_Init(void);
static void MX_DAC_Init(void);
static void MX_I2C1_Init(void);int main(void) {HAL_Init();SystemClock_Config();MX_GPIO_Init();MX_USART1_UART_Init();MX_ADC1_Init();MX_DAC_Init();MX_I2C1_Init();WiFi_Init();AudioInput_Init();AudioOutput_Init();OLED_Init();Button_Init();LED_Init();while (1) {if (Button_IsPressed()) {OLED_DisplayString("Listening...");char audioData[512];AudioInput_Capture(audioData, sizeof(audioData));OLED_DisplayString("Processing...");char* result = WiFi_SendAudioForProcessing(audioData);OLED_DisplayString(result);if (strcmp(result, "Turn on the light") == 0) {LED_On();AudioOutput_Play("Light turned on");} else if (strcmp(result, "Turn off the light") == 0) {LED_Off();AudioOutput_Play("Light turned off");}HAL_Delay(1000);}}
}void SystemClock_Config(void) {// 配置系统时钟
}static void MX_GPIO_Init(void) {// 初始化GPIO__HAL_RCC_GPIOA_CLK_ENABLE();GPIO_InitTypeDef GPIO_InitStruct = {0};GPIO_InitStruct.Pin = GPIO_PIN_1 | GPIO_PIN_2;GPIO_InitStruct.Mode = GPIO_MODE_OUTPUT_PP;GPIO_InitStruct.Pull = GPIO_NOPULL;GPIO_InitStruct.Speed = GPIO_SPEED_FREQ_LOW;HAL_GPIO_Init(GPIOA, &GPIO_InitStruct);
}static void MX_USART1_UART_Init(void) {// 初始化USART1huart1.Instance = USART1;huart1.Init.BaudRate = 115200;huart1.Init.WordLength = UART_WORDLENGTH_8B;huart1.Init.StopBits = UART_STOPBITS_1;huart1.Init.Parity = UART_PARITY_NONE;huart1.Init.Mode = UART_MODE_TX_RX;huart1.Init.HwFlowCtl = UART_HWCONTROL_NONE;huart1.Init.OverSampling = UART_OVERSAMPLING_16;if (HAL_UART_Init(&huart1) != HAL_OK) {Error_Handler();}
}static void MX_ADC1_Init(void) {// 初始化ADC1ADC_ChannelConfTypeDef sConfig = {0};hadc1.Instance = ADC1;hadc1.Init.ScanConvMode = ADC_SCAN_DISABLE;hadc1.Init.ContinuousConvMode = ENABLE;hadc1.Init.DiscontinuousConvMode = DISABLE;hadc1.Init.ExternalTrigConv = ADC_SOFTWARE_START;hadc1.Init.DataAlign = ADC_DATAALIGN_RIGHT;hadc1.Init.NbrOfConversion = 1;if (HAL_ADC_Init(&hadc1) != HAL_OK) {Error_Handler();}sConfig.Channel = ADC_CHANNEL_0;sConfig.Rank = ADC_REGULAR_RANK_1;sConfig.SamplingTime = ADC_SAMPLETIME_55CYCLES_5;if (HAL_ADC_ConfigChannel(&hadc1, &sConfig) != HAL_OK) {Error_Handler();}HAL_ADC_Start(&hadc1);
}static void MX_DAC_Init(void) {// 初始化DACDAC_ChannelConfTypeDef sConfig = {0};hdac.Instance = DAC;hdac.Init.DAC_Trigger = DAC_TRIGGER_NONE;hdac.Init.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE;if (HAL_DAC_Init(&hdac) != HAL_OK) {Error_Handler();}sConfig.DAC_Trigger = DAC_TRIGGER_NONE;sConfig.DAC_OutputBuffer = DAC_OUTPUTBUFFER_ENABLE;if (HAL_DAC_ConfigChannel(&hdac, &sConfig, DAC_CHANNEL_1) != HAL_OK) {Error_Handler();}HAL_DAC_Start(&hdac, DAC_CHANNEL_1);
}static void MX_I2C1_Init(void) {// 初始化I2C1hi2c1.Instance = I2C1;hi2c1.Init.ClockSpeed = 100000;hi2c1.Init.DutyCycle = I2C_DUTYCYCLE_2;hi2c1.Init.OwnAddress1 = 0;hi2c1.Init.AddressingMode = I2C_ADDRESSINGMODE_7BIT;hi2c1.Init.DualAddressMode = I2C_DUALADDRESS_DISABLE;hi2c1.Init.OwnAddress2 = 0;hi2c1.Init.GeneralCallMode = I2C_GENERALCALL_DISABLE;hi2c1.Init.NoStretchMode = I2C_NOSTRETCH_DISABLE;if (HAL_I2C_Init(&hi2c1) != HAL_OK) {Error_Handler();}
}

控制代码

#include "wifi.h"
#include "audio_input.h"
#include "audio_output.h"
#include "oled.h"
#include "button.h"
#include "led.h"void WiFi_Init(void) {// 初始化Wi-Fi模块
}char* WiFi_SendAudioForProcessing(char *audioData) {// 发送音频数据到服务器进行处理// 返回处理结果
}void AudioInput_Init(void) {// 初始化音频输入模块
}void AudioInput_Capture(char *buffer, int length) {// 采集音频数据
}void AudioOutput_Init(void) {// 初始化音频输出模块
}void AudioOutput_Play(char *message) {// 播放音频提示
}void OLED_Init(void) {// 初始化OLED显示屏
}void OLED_DisplayString(char *str) {// 在OLED显示屏上显示字符串
}void Button_Init(void) {// 初始化按钮
}bool Button_IsPressed(void) {// 检测按钮是否按下
}void LED_Init(void) {// 初始化LED
}void LED_On(void) {// 打开LED
}void LED_Off(void) {// 关闭LED
}

⬇帮大家整理了单片机的资料

包括stm32的项目合集【源码+开发文档】

点击下方蓝字即可领取,感谢支持!⬇

点击领取更多嵌入式详细资料

问题讨论,stm32的资料领取可以私信!

 

5. 应用场景

智能家居控制

通过语音助手,用户可以使用自然语言控制家中的各类智能设备,如灯光、空调、电视等,实现便捷的智能家居体验。

个人语音助理

智能语音助手还可以用于个人语音助理,帮助用户设置提醒、查询信息,甚至执行一些简单的日常任务,如计算、转换单位等。

6. 常见问题及解决方案

常见问题

  1. 语音识别不准确
  2. Wi-Fi模块无法连接网络
  3. 音频播放效果不佳

解决方案

  1. 优化麦克风输入
    • 选择高质量的麦克风模块,并调整音频采集参数,以提高语音识别的准确性。
  2. 检查Wi-Fi连接
    • 确认Wi-Fi模块与STM32连接正常,确保网络配置正确。
  3. 调整音频输出
    • 调整DAC输出参数或更换扬声器模块,确保音频播放的清晰度和音量。

7. 结论

本文介绍了如何使用STM32微控制器和多种模块实现一个智能语音助手系统,从硬件准备、环境配置到代码实现,详细介绍了每一步的操作步骤。通过本文的学习,读者可以掌握基本的嵌入式开发技能,并将其应用到人工智能项目中。

相关文章:

基于STM32开发的智能语音助手系统

目录 引言环境准备工作 硬件准备软件安装与配置系统设计 系统架构硬件连接代码实现 初始化代码控制代码应用场景 智能家居控制个人语音助理常见问题及解决方案 常见问题解决方案结论 1. 引言 随着人工智能技术的发展,智能语音助手已经逐渐进入了人们的日常生活。…...

基于python的图像去雾算法研究系统设计与实现

博主介绍: 大家好,本人精通Java、Python、C#、C、C编程语言,同时也熟练掌握微信小程序、Php和Android等技术,能够为大家提供全方位的技术支持和交流。 我有丰富的成品Java、Python、C#毕设项目经验,能够为学生提供各类…...

自定义 View 可以播放一段视频

请实现一个自定义 View 的核心代码,核心要求可以响应如下事件: // - 要求自定义 View 可以播放一段视频 / - 在 view 左侧区域上下滑动,可以提高减少音量 / / - 在 view 右侧区域上下滑动可以提高减少屏幕亮度 // - 在 view 左右滑动可以…...

LVS负载均衡集群部署之—NAT模式的介绍及搭建步骤

一、环境准备 1.准备三台rhel9服务器 服务器名称 主机名 ip地址备注LVS调度服务器lvs.timinglee.org eth0:172.25.254.100(外网) eth1:192.168.0.100(内网) 关闭selinux和防火墙webserver2网站服务器webserver1.timinglee.orgeth0:192.168.…...

【算法】浅析哈希算法【附代码示例】

哈希算法:数据存储与检索的基石 1. 引言 在计算机科学中,哈希算法是一种用于将数据(如文件、网络地址或数据库记录)转换为固定长度的哈希值的过程。哈希值通常是一个较短的数字或字符串,用于快速检索原始数据或验证数…...

2024.8.12

2024.8.12 【梦最让我费解的地方在于&#xff0c;明明你看不清梦里人们的脸&#xff0c;却清晰地知道他们是谁。】 Monday 七月初九 序理论 最小链覆盖&最长反链长度 我们设定一个二元关系符R和一个集合A 我们设定<A,R>这样一个类群&#xff0c;那么对于任意 a i…...

使用Python解析pdf、docx等格式文件。

针对不同类型的文件&#xff0c;需要采取特定的访问与解析策略来有效获取其中蕴含的知识。下面我们将介绍对于不同数据源数据的获取方式。 1 解析Docx文档 1.1 获取Docx文档中文本 from docx import Document # pip install python-docx # python-docx 0.8.11 filename xx…...

Linux网络通信基础API

这篇文章只有Linux网络通信基础API大参数信息&#xff0c;和返回值&#xff0c;这篇文章并没有这些基础API的参数类型介绍。accept的第二个参数可以查看客户端信息。 创建socket #include <sys/types.h> /* See NOTES */#include <sys/socket.h>int sock…...

Python爬虫:下载4K壁纸

&#x1f381;&#x1f381;创作不易&#xff0c;关注作者不迷路&#x1f380;&#x1f380; 目录 &#x1f338;完整代码 &#x1f338;分析 &#x1f381;基本思路 &#x1f381;需要的库 &#x1f381;提取图片的链接和标题 &#x1f453;寻找Cookie和User-Agent &…...

2024年【北京市安全员-B证】新版试题及北京市安全员-B证免费试题

题库来源&#xff1a;安全生产模拟考试一点通公众号小程序 2024年【北京市安全员-B证】新版试题及北京市安全员-B证免费试题&#xff0c;包含北京市安全员-B证新版试题答案和解析及北京市安全员-B证免费试题练习。安全生产模拟考试一点通结合国家北京市安全员-B证考试最新大纲…...

python爬取B站视频实验

实验17&#xff1a;爬虫2 文章目录 实验17&#xff1a;爬虫21.实验目标及要求2. 实验主要内容3.实验小结 1.实验目标及要求 &#xff08;1&#xff09;掌握有关爬虫的包 &#xff08;2&#xff09;掌握爬虫方法 &#xff08;3&#xff09;爬取B站卡塔尔世界杯若干视频 2. 实验…...

10步搞定Python爬虫从零到精通!

学习Python网络爬虫可以分为以下几个步骤&#xff0c;每一步都包括必要的细节和示例代码&#xff0c;以帮助你从零开始掌握这一技能。 第一步&#xff1a;理解网络爬虫基础 什么是网络爬虫&#xff1f; 网络爬虫是一种自动化程序,用来从互联网上收集数据.它通过发送 HTTP 请求…...

SpringMVC学习笔记---带你快速入门和复习

一、初识SpringMVC 1.1、什么是SpringMVC 1.1.1、什么是MVC MVC是一种软件架构模式&#xff08;是一种软件架构设计思想&#xff0c;不止Java开发中用到&#xff0c;其它语言也需要用到&#xff09;&#xff0c;它将应用分为三块&#xff1a; M&#xff1a;Model&#xff0…...

Linux系统编程 day09 线程同步

Linux系统编程 day09 线程同步 1.互斥锁2.死锁3.读写锁4.条件变量&#xff08;生产者消费者模型&#xff09;5.信号量 1.互斥锁 互斥锁是一种同步机制&#xff0c;用于控制多个线程对共享资源的访问&#xff0c;确保在同一时间只有一个线程可以访问特定的资源或执行特定的操作…...

Vue快速入门(四)——Vue3及组合式API(一)

文章目录 一、认识Vue31. Vue2 选项式 API vs Vue3 组合式API2. Vue3的优势二、使用create-vue搭建Vue3项目1、认识create-vue2. 使用create-vue创建项目三、组合式API - setup选项1. setup选项的写法和执行时机2. setup中写代码的特点3. `<script setup>`语法糖4.小结四…...

vue项目名修改、webstorm和idea创建的项目重命名、重构项目、修改项目名称

一、需求 就是创建了一个项目&#xff0c;后期需要重命名&#xff0c;怎么办&#xff1f;----> 直接修改&#xff1f;肯定不行&#xff0c;因为里面有些配置也需要修改&#xff0c;假如你只改文件夹名称的话&#xff0c;里面配置都没修改&#xff0c;后期可能会出问题。 二…...

【MySQL】数据库约束和多表查询

目录 1.前言 2.数据库约束 2.1约束类型 2.2 NULL约束 2.3 NUIQUE&#xff1a;唯一约束 2.4 DEFAULT&#xff1a;默认值约束 2.5 PRIMARY KEY&#xff1a;主键约束 2.6 FOREIGN KEY&#xff1a;外键约束 1.7 CHECK约束 3.表的设计 3.1一对一 3.2一对多 3.3多对多 …...

抖店飞鸽客服自动回复软件开发教程与下载体验(.NET版)

转载请注明出处&#xff01; 原文链接&#xff1a;https://blog.csdn.net/zgyulongfei/article/details/140960430 本文适合的读者为&#xff1a; 抖店&#xff08;抖音小店&#xff09;个体商家&#xff1b;抖店店群商家&#xff08;店群商家&#xff1a;指的是开了几十个抖…...

如何关闭redis的自动清理缓存,声明式事务(含有redis)如何解决,redis setnx锁的使用。

20240809 一、解决redis数据被删除的方案1、发现问题2、解决注意&#xff01;&#xff01; 二、声明式事务&#xff08;当有redis的时候&#xff09;1. 先看代码2. Transactional(rollbackFor Exception.class)3. 如何解决redis在事务里面&#xff0c;如何保证原子性和一致性3…...

C#中抽象类的使用

前言 我们在C#中使用抽象类可以发挥C#多态的功能&#xff0c;把具有共性的方法定义在抽象类中&#xff0c;然后在不同的类中去实现&#xff0c;可增强代码的可读性、扩展性。 1、不使用抽象类 我们定义了下面两个类XiaoWang、XiaoMing&#xff0c;他们有一个Country方法&…...

揭秘网络攻击:深入理解JavaScript中的跨站点请求伪造(CSRF)

标题&#xff1a;揭秘网络攻击&#xff1a;深入理解JavaScript中的跨站点请求伪造&#xff08;CSRF&#xff09; 在当今数字化时代&#xff0c;网络安全已成为每个开发者和用户必须关注的重点。其中&#xff0c;跨站点请求伪造&#xff08;CSRF&#xff09;是一种常见的网络攻…...

【项目实战】C++视频共享点播系统

目录 一、项目介绍 1.1 对视频共享点播系统的认识 1.2服务端程序负责功能 1.3 服务端功能模块划分 1.4 项目界面演示 1.5预备知识 二.环境搭建 2.1 安装 Jsoncpp 库 2.1.1 使用jsoncpp 2.2 引入httplib库 2.2.1 安装Git&#xff08;如果你的系统尚未安装Git&#xf…...

Android逆向题解 攻防世界难度4- Android2.0

Jeb打开apk 关键代码在Native函数getResult IDA 打开 so 发现代码比较简单&#xff0c;可以直接静态分析。 输出字符串也就是flag 长度是15&#xff0c;然后分成三段&#xff0c;第一段是可以整除3&#xff0c;第二段是除3取余1&#xff0c;第三段是除3取余等于2&#xff1…...

P4155 [SCOI2015] 计划

[SCOI2015] 计划 - 洛谷 核心思路 注意到&#xff0c; 可推出&#xff0c; 表示 战士 走 步到达战士位置。 若可以走到且 r < 终点 则答案 然后再加上自己这个哨兵&#xff0c;和走回自己的一个哨兵即可。 AC 代码 #include<bits/stdc.h> using namespace std…...

今日(2024年8月12日)科技新闻

国内&#xff1a; 航空航天领域 我国成功发射卫星互联网高轨卫星。我国试验性冰川保护项目取得积极成效&#xff0c;被形容为“为冰川盖棉被”。2024西太平洋国际航次科考队起航&#xff0c;开启探秘深海海山之旅。我国首架固定翼海上专业搜救航空器正式列编。“祥云”as700载…...

CP AUTOSAR标准之ECUStateManager(AUTOSAR_SWS_ECUStateManager)(更新中……)

1 简介和功能概述 ECU管理器模块(如本文档中所述)是一个基本软件模块(参见[1]),用于管理ECU状态的常见方面。具体来说,ECU管理器模块: 初始化和取消初始化OS、SchM和BswM以及一些基本软件驱动模块。根据请求配置ECU进入休眠和关机状态。管理ECU上的所有唤醒事件ECU管理器模块…...

Java中的中介者模式:解耦复杂系统的有效策略

Java中的中介者模式&#xff1a;解耦复杂系统的有效策略 在软件开发中&#xff0c;随着系统规模的扩大和复杂度的增加&#xff0c;各组件之间的直接交互会导致代码的耦合性增高&#xff0c;从而影响系统的可维护性和可扩展性。为了应对这种复杂性&#xff0c;中介者模式&#…...

transformer(李宏毅老师系列)

自学参考&#xff1a; Transformer:Attention Is All You Need Transformer论文逐段精读 视频课 课件资料 笔记 一、引入 seq2seq&#xff1a;输入一个序列的向量作为input&#xff0c;output的长度由机器自己决定seq2seq model应用: 语音辨识 输入是声音讯号的一串vector 输出…...

XCode15.4真机运行调试

更新Xcode后&#xff0c;没有模拟器内容&#xff0c;而且真机也不显示&#xff0c;编译按钮无法点击&#xff0c;设备在管理运行目标中可见&#xff0c;但无法选中解决方案&#xff1a;下载iOS17.5模拟器&#xff0c;但最坑的是直接点击“Get”下载总是中断&#xff0c;且无法断…...

Google Mock 和 Google Test编写单元测试入门(环境配置、简单执行)

文章目录 环境的配置方法1&#xff1a;从源代码构建第一步&#xff1a;克隆库的源代码第二步&#xff1a;构建库 方法 2&#xff1a;使用 CMake 的 FetchContent示例 CMakeLists.txt 项目的创建项目结构CMakeLists.txt (根目录)main.cpp (示例程序)tests/CMakeLists.txt (测试部…...