前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >用全志XR806开发板实现语音紧急呼叫系统

用全志XR806开发板实现语音紧急呼叫系统

作者头像
阿志小管家
发布2024-02-02 19:56:30
1430
发布2024-02-02 19:56:30
举报
文章被收录于专栏:全志嵌入式那些事

1.背景介绍

老人和小孩子独自在家的时候如果遇到紧急情况,通过拨打电话或者微信的方式通知家人存在操作不便的问题。例如,如果老人摔倒了手机很可能不在身边,对小孩来说手机的操作又过于复杂。针对这种情况,研发一种主动语音上报的系统,语音实时识别人的求救声,然后通过网络发送信息告知家人。

2.硬件选型

在该语音主动告警系统中,需要语音时别模块和网络告警模块。xr806有丰富的外围接口,能够采集外部多种传感器的数据,功耗低,可以采用移动电源供电,支持wifi和bt,体积小,可以灵活部署于房间的各个角落。语音模块选用天问的ASRPRO模块,该模块集成度高,支持模块化编程,识别率高的特点。 硬件连接框图如下所示,Speech Module支持uart通信和gpio信号,本次实验选用gpio通信,即当识别到特定词汇时拉高gpio向xr806发送信后,xr806接收到信号后发送信息给mqtt client。

硬件连接框图.png
硬件连接框图.png

硬件实物链接如下图所示

硬件实物连接图.png
硬件实物连接图.png

3.软件实现

3.1 软件流程

软件整体的流程如下图所示。xr806完成初始化以后,连接网络,建立mqtt连接等待语音模块的输入,接收到信号后,发送mqtt信息给broken,订阅该topic的所有client都会收到该告警信号。语音试别模块上电完成初始化以后输入语音提示信息并循坏等待语音的输入,匹配到对应语音后拉高gpio发送信号给x806,延迟一秒下拉gpio,并输入提示语音。

程序流程图.png
程序流程图.png
3.2 语音识别(ASR)的实现

天问的语音试别模块支持类似Scrach的模块化图形编程,程序代码如下。

ASR Code.png
ASR Code.png

程序编写完成后先生成模型,然后编译下载即可。

3.3 XR806主机编程
3.3.1 工程的建立

工程建立和编译参考【XR806开发板试用】全志XR806开发板FreeRTOS代码包及开发环境搭建教程

3.3.2 代码开发

官方SDK中提供了参考,代码位于xr806_sdk/project/example,本次实现主要参考gpio和mqtt两个文件,基于mqtt的代码完成整体工程的开发。 官方例程是采用的阿里云的mqtt broken服务,使用前需要注册,本次开发采用EMQX提供的免费的公共MQTT服务器,相关信息如下:

MQTT服务器信息.png
MQTT服务器信息.png

按照此信息修改代码的定义:

代码语言:javascript
复制
#define MQTT_DEMO_CLIENT_ID "xr806-mqtt"
#define MQTT_DEMO_HOST_NAME "mqtt://broker.emqx.io"
#define MQTT_DEMO_PORT      "1883"
// #define MQTT_DEMO_USERNAME  "xr806_senor_set0&vo84Hm3xbUj"
// #define MQTT_DEMO_PASSWORD  "4f9ebb2143f01e4489133c1ea55051fbbfc4c44e"
#define MQTT_DEMO_TOPIC     "/topic/xr806-sos"

客户端采用EMQX免费的MQTTX,该工具跨平台且提供网页版。手机端可以搜到MQTT助手等类似工具。 GPIO直接套用实例中的即可,需要完成默认func等配置的初始化:

代码语言:javascript
复制
static void gpio_input_init(void)
{
	GPIO_InitParam param;
	param.driving = GPIO_DRIVING_LEVEL_1;
	param.mode = GPIOx_Pn_F0_INPUT;
	param.pull = GPIO_PULL_NONE;
	HAL_GPIO_Init(GPIO_INPUT_PORT, GPIO_INPUT_PIN, &param);
}

static  uint8_t gpio_input_read(void)
{
	return (uint8_t)HAL_GPIO_ReadPin(GPIO_INPUT_PORT, GPIO_INPUT_PIN);
}

修改mqtt_demo_funwhile(1)代码块,先判断采集到的gpio信号,然后再publish信息,相关修改如下:

代码语言:javascript
复制
	while (1) {
		if (gpio_input_read()) {
			/* publish message to topic */
			mqtt_demo_publish(MQTT_DEMO_TOPIC, MQTT_DEMO_MSG_TEXT);
			ret = MQTTYield(&mqtt_demo_client, 300);
			if (ret != 0) {
				printf("mqtt yield err, ret:%d\n", ret);
reconnect:
				printf("mqtt reconnect\n");
				mqtt_demo_disconnect();
				ret = mqtt_demo_connect(MQTT_DEMO_HOST_NAME, MQTT_DEMO_PORT);
				if (ret != 0) {
					reconnect_times++;
					if (reconnect_times > 5)
						goto exit;
					OS_MSleep(5000); //5s
					goto reconnect;
				}
			}
		}
		OS_MSleep(10); //10ms
	}
3.3.3 编译执行

编译步骤可以参考工程建立章节提供的链接,官方实例,mqtt的启动依赖于网络的建立,因此系统启动后需要先建立网络,建立网络的命令如下:

代码语言:javascript
复制
# net sta config [ssid] [password]
# net sta enable

系统启动以后,说一句“救命”,XR806就会发送"SOS"信息到broken,同时语音试别模块会发出“我来了”的提示信息。订阅/topic/xr806-sos该topic的Client会收到sos信息,如下:

mqttx client.png
mqttx client.png

4.总结

一方面对XR806芯片本身的功能和开发流程有了更深入的了解,另一方面也接触到了FreeRtos的开发。相对于鸿蒙liteos SDK,FreeRtos的SDK使用起来方便了很多,这也看出了厂商的用心。因为时间的原因XR806的很多功能还没有来得及挖掘,接下来有时间会利用这颗芯片做一些更有意思的设计。

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-02-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.背景介绍
  • 2.硬件选型
  • 3.软件实现
    • 3.1 软件流程
      • 3.2 语音识别(ASR)的实现
        • 3.3 XR806主机编程
          • 3.3.1 工程的建立
          • 3.3.2 代码开发
          • 3.3.3 编译执行
      • 4.总结
      相关产品与服务
      语音识别
      腾讯云语音识别(Automatic Speech Recognition,ASR)是将语音转化成文字的PaaS产品,为企业提供精准而极具性价比的识别服务。被微信、王者荣耀、腾讯视频等大量业务使用,适用于录音质检、会议实时转写、语音输入法等多个场景。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档