【DigiKey好物畅享】UNIHIKER K10 第三回—盲人移动端

【DigiKey好物畅享-晒单#6】UNIHIKER K10 第三回—盲人移动端

之前介绍了如何准备K10编程环境,以及如何基于K10制作一个二维码标签。这次来实践一下,用Mind+做一个盲人移动端。
一、功能设计
盲人移动移动终端的功能比较简单,就是用户先用“你好,小新”激活语音模式,然后对移动终端说出展品的编号ID,终端播放这个ID对应的语音介绍。如果用户不知道现在是否需要激活,可以按A或B键听一下。
二、所需资源
(一)硬件
根据功能定义,需要用到以下板载资源(用黄色标出):

板载功能 功能介绍
麦克风 用于语音唤醒和展品ID识别。
扬声器 播放合成的语音,比如当前状态、语音介绍。
2.8寸高清彩色显示屏 文字显示当前状态,方便明眼人协助。

(二)软件
根据设计的功能,需要用到多个Mind+组件。
1、初始化设置屏幕方向:用于设置屏幕显示方向,显示方向有4种,旋转角度等于设置的数字乘以4。
2、显示纯色背景:如果不设置,屏幕的背景颜色则默认为白色。
3、将缓存内容显示/显示更新:将缓存的内容在屏幕上显示出来。当使用到显示相关指令更新了显示内容后,需要使用这个功能后,才会将内容显示出来。
4、设置语音识别:设置语音识别唤醒后连续/单次识别的工作时长和识别语言,唤醒时长单位为毫秒(ms)。语言为中文时,唤醒词为“你好小行”或“你好小新”。
5、添加语音识别命令词ID和命令词:命令词ID设置范围为0-199,语言为中文时,命令词用拼音填写,且音节与音节间以空格分开,命令词以2~5个音节为佳。
6、语音识别当前状态为唤醒:用于返回判断语音识别模式的当前状态的布尔值。
7、检测到命令词ID:用来检测唤醒后,返回是否识别到指定ID的命令词。
8、语音合成:指定中文文字合成语音,可使用逗号实现语气间隔。
9、设置语音播放的语速:值在1-5之间,默认为2,越大语速越快。。
三、代码逻辑
开机后等待用户操作,以下是Mind+程序,可以看出来运行流程:随时按下A或B键,可以听到现在状态、需要做什么操作的提示;在未激活的情况下,用户说“你好,小新”激活语音模式;在已经激活的情况下,用户对移动终端说出展品的编号ID,终端播放这个ID对应的语音介绍。

在烧写时,Mind+先将图形化代码转成arduino的c代码,再编译烧写。

/*!
 * MindPlus
 * esp32s3bit
 *
 */
#include "asr.h"
#include "unihiker_k10.h"
// 函数声明
void DF_BoFangDangQianZhuangTai();
void DF_XianShiDangQianZhuangTai();
void onButtonAPressed();
void onButtonBPressed();
void onButtonABPressed();
// 创建对象
UNIHIKER_K10 k10;
ASR          asr;
uint8_t      screen_dir=2;


// 主程序开始
void setup() {
	k10.begin();
	asr.asrInit(CONTINUOUS, CN_MODE, 6000);
	while(asr._asrState == 0){delay(100);}
	k10.initScreen(screen_dir);
	k10.creatCanvas();
	asr.setAsrSpeed(2);
	k10.buttonA->setPressedCallback(onButtonAPressed);
	k10.buttonB->setPressedCallback(onButtonBPressed);
	k10.buttonAB->setPressedCallback(onButtonABPressed);
	// 6610
	asr.addASRCommand(2+1, "liu qian liu bai yi shi");
	k10.setScreenBackground(0x99FFFF);
}
void loop() {
	DF_XianShiDangQianZhuangTai();
	if (asr.isDetectCmdID(2+1)) {
		k10.rgb->brightness(round(4));
		k10.rgb->write(-1, 0x00FF00);
		asr.speak("K10学习主控板是一款集成ESP32、摄像头、彩色液晶屏、支持图像检测、语音识别、语音合成、图形化编程的信息科技教学开发板。");
	}
	delay(1000);
	k10.rgb->write(-1, 0x000000);
}


// 自定义函数
void DF_BoFangDangQianZhuangTai() {
	if (asr.isWakeUp()) {
		asr.speak("请讲出展品编号");
	}
	else {
		asr.speak("请讲出:你,好,小,新");
	}
}
void DF_XianShiDangQianZhuangTai() {
	if (asr.isWakeUp()) {
		k10.canvas->canvasText("请说展品编号", 1, 0x009900);
		k10.canvas->updateCanvas();
	}
	else {
		k10.canvas->canvasText("请说:你好,小新", 1, 0x009900);
		k10.canvas->updateCanvas();
	}
}

// 事件回调函数
void onButtonAPressed() {
	DF_BoFangDangQianZhuangTai();
}
void onButtonBPressed() {
	DF_BoFangDangQianZhuangTai();
}
void onButtonABPressed() {
	DF_BoFangDangQianZhuangTai();
}

四、成品效果图

开机后,屏幕显示文字“请说:你好,小新”等待用户说话激活。用户这如果用户说了“你好,小新”,右上角灯会亮起,屏幕显示文字“请说展品编号”,同时进入命令模式,等待用户说出展品编号。此时如果用户说出展品的编号ID,将播放对应的语音介绍。在任何时候按下A或B键,可以听到现在状态、需要做什么的提示。
五、开发经验
Mind+中有K10的合成或识别语音的专用库,可以使用类似scratch的图形化编程,因而十分方便,但是发现2个问题。一个问题是自定义命令词必须使用拼音输入,这就导致还得做个工具转化拼音,比较麻烦。另一个问题是目前文字转换出的语音质量不是太好,比如“你好”转换出就听不太清,而有些词语转换后听起来不大连贯,目前没有太好的解决办法。