19浏览
查看: 19|回复: 7

[K10教程] 【花雕动手做】K10 实验之语音识别来控制板载 WS2812 灯

[复制链接]
【花雕动手做】K10 实验之语音识别来控制板载 WS2812 灯图2

行空板K10是一款专为快速体验物联网和学习人工智能而设计的开发学习板,100%采用国产芯片,知识产权自主可控,符合信息科技课程中编程学习、物联网及人工智能等教学需求。该板集成2.8寸LCD彩屏、WiFi蓝牙、摄像头、麦克风、扬声器、RGB指示灯、多种传感器及丰富的扩展接口。凭借高度集成的板载资源,教学过程中无需额外连接其他设备,便可轻松实现传感器控制、物联网应用以及人脸识别、语音识别、语音合成等AI人工智能项目。

主要特点
集成摄像头&内置算法,可进行离线图像检测
集成麦克风&内置算法,可进行离线语音识别
集成扬声器&内置算法,可进行离线语音合成
2.8寸彩色屏幕,数据展示更清晰
集成度高,利于教学
接口丰富,兼容软件多,扩展性好


【花雕动手做】K10 实验之语音识别来控制板载 WS2812 灯图1

驴友花雕  高级技神
 楼主|

发表于 4 小时前

【花雕动手做】K10实验之语音识别来控制板载WS2812灯

主打:人工智能模块

【花雕动手做】K10 实验之语音识别来控制板载 WS2812 灯图1

语音识别相关说明

【花雕动手做】K10 实验之语音识别来控制板载 WS2812 灯图2



回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 4 小时前

【花雕动手做】K10实验之语音识别来控制板载WS2812灯

辅助:屏幕显示相关积木

【花雕动手做】K10 实验之语音识别来控制板载 WS2812 灯图2

LED控制模块

【花雕动手做】K10 实验之语音识别来控制板载 WS2812 灯图1

回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 4 小时前

【花雕动手做】K10实验之语音识别来控制板载WS2812灯

本帖最后由 驴友花雕 于 2026-6-25 10:45 编辑

【花雕动手做】K10 实验之语音识别来控制板载 WS2812 灯图3

知识点:语音识别(ASR)
一、什么是语音识别(ASR)
语音识别英文缩写是 ASR(Automatic Speech Recognition),简单来说:让单片机、电脑听懂人说话,把麦克风采集到的声音信号,转换成文字或者指令。
分为两大类:
在线语音识别:需要联网,把声音上传到云端服务器解析,识别词汇量巨大;
离线语音识别:不需要 WiFi、不需要网络,语音模型预先存放在芯片内部,本地直接处理声音,适合单片机、行空板、Arduino 这类硬件。
你代码里使用的就是离线本地 ASR 语音模块。

二、离线语音模块核心功能(对应你 K10 代码)
1. 两种工作模式
(1)持续拾音模式 CONTINUOUS
麦克风一直处于收音状态,不间断监听声音,专门用来做语音唤醒。
对应代码:asr.asrInit(CONTINUOUS, CN_MODE, 12000);
(2)按键触发模式
按下按键才开始录音识别,省电,一般用于命令词识别。
2. 语言模式 CN_MODE
CN_MODE:中文模式,只识别汉语;
EN_MODE:英文模式,识别英语。
本程序开启中文识别,用来识别唤醒词:你好小新。
3. 灵敏度阈值(第三个参数 12000)
数值代表声音检测灵敏度:
数值越大:越不容易被环境杂音误触发,抗干扰强;
数值越小:轻声说话就能识别,但是容易被噪音误唤醒。
12000 属于中等灵敏度,适合室内环境使用。

三、语音唤醒技术(本项目核心)
1. 唤醒词机制
唤醒词就是开门密码。模块平时处于低功耗监听状态,只监听这一句话,其他普通对话会直接忽略。
只有说出预设唤醒词(你好小新),模块才会被 “唤醒”,进入待命状态,之后才可以识别后续控制指令。
2. 代码里的唤醒检测函数


  1. asr.isWakeUp()
复制代码


检测到唤醒词,函数返回 true;
没有检测到唤醒词,返回 false。
3. 模块状态标志

  1. asr._asrState
复制代码

值 = 0:语音模块正在启动、模型加载中,暂时无法工作;
值 ≠ 0:初始化完成,可以正常收音识别。
程序中用 while 循环等待模块就绪,避免硬件未启动造成程序崩溃。

四、硬件运行完整工作流程
上电初始化行空板主板与显示屏;
启动 ASR 语音芯片,加载离线语音模型;
等待语音模块就绪;
屏幕打印实验标题;
模块持续收音,安静待机,只监听唤醒词;
使用者说出:你好小新;
程序捕捉到唤醒信号,屏幕切换文字提示 “已唤醒行空板”;
没有听到唤醒词,则一直显示唤醒词提示语句;
每秒刷新一次屏幕,并清除文字,防止画面重叠。

五、离线语音识别优缺点
优点
完全离线,不用网络、不用流量;
响应速度极快,话音刚落立刻识别;
单片机就能驱动,成本低,非常适合机器人、智能音箱、门禁、实验教具;
不受网络波动影响,设备在野外也能正常使用。
缺点
词汇数量有限,一般只能预先录入几十条唤醒词 + 控制指令;
对嘈杂环境比较敏感,噪音大会出现识别失败;
无法自由识别任意一句话,只能识别预先烧录好的词语。

六、拓展功能(可以在现有代码上升级)
多级指令识别
唤醒之后,再识别 “开灯”“关灯”“前进”“后退”,控制电机与 LED 灯;
自定义唤醒词
修改库文件,把 “你好小新” 改成 “你好行空板”;
多句话语音交互
唤醒后连续识别多条语音命令;
调节收音灵敏度,解决误唤醒或者识别不到声音的问题。

七、容易遇到的常见问题
识别不到唤醒词
调低阈值数值,靠近麦克风,降低环境噪音。
无缘无故自动唤醒(误触发)
把灵敏度数值调高,提高抗干扰能力。
程序卡死在初始化循环
语音模块接线异常,串口通信断开,导致模块始终处于未就绪状态。


【花雕动手做】K10 实验之语音识别来控制板载 WS2812 灯图2

【花雕动手做】K10 实验之语音识别来控制板载 WS2812 灯图1
回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 4 小时前

【花雕动手做】K10实验之语音识别来控制板载WS2812灯

【花雕动手做】行空板 K10 系列实验之人工智的语音识别来控制板载WS2812灯
实验开源代码

  1. // 导入语音识别功能头文件,提供ASR语音唤醒、指令识别相关函数
  2. #include "asr.h"
  3. // 导入行空板K10主控库,用来控制屏幕、RGB彩灯等硬件外设
  4. #include "unihiker_k10.h"
  5. // 实例化硬件对象
  6. UNIHIKER_K10 k10;   // 行空板主板对象,操控屏幕、板载彩灯
  7. ASR          asr;    // 离线语音识别模块对象,处理收音、语音识别
  8. // 定义屏幕旋转方向参数,数值2代表屏幕倒置显示
  9. uint8_t      screen_dir=2;
  10. //=====================初始化函数=====================
  11. // setup函数:设备上电或者重启时只运行一次,完成硬件初始化与指令配置
  12. void setup() {
  13.         // 初始化行空板底层硬件,开启串口、总线、外设基础资源
  14.         k10.begin();
  15.         // 初始化离线语音识别模块
  16.         // 参数1:CONTINUOUS 持续收音模式,时刻监听人声
  17.         // 参数2:CN_MODE 中文识别模式
  18.         // 参数3:12000 声音灵敏度,数值越大越不容易被杂音误触发
  19.         asr.asrInit(CONTINUOUS, CN_MODE, 12000);
  20.         // 阻塞等待语音模块启动完成
  21.         // _asrState=0 代表模块正在加载语音模型,尚未就绪
  22.         // 每隔100ms检测一次状态,避免硬件未就绪导致程序出错
  23.         while(asr._asrState == 0){delay(100);}
  24.         // 根据设定的方向初始化LCD显示屏
  25.         k10.initScreen(screen_dir);
  26.         // 创建屏幕绘图画布,所有文字都绘制在画布缓冲区中
  27.         k10.creatCanvas();
  28.         // 添加第一条语音指令
  29.         // 参数1:指令编号ID,0+1 = 1号指令
  30.         // 参数2:语音拼音指令 "kai deng" 对应中文:开灯
  31.         asr.addASRCommand(0+1, "kai deng");
  32.         // 添加第二条语音指令
  33.         // 指令ID:1+1 = 2号指令,拼音 "guan deng" 对应中文:关灯
  34.         asr.addASRCommand(1+1, "guan deng");
  35. }
  36. //=====================主循环函数=====================
  37. // loop函数:初始化结束后无限循环运行,实时监测语音信号
  38. void loop() {
  39.         // 判断是否识别到唤醒词“你好小新”
  40.         if (asr.isWakeUp()) {
  41.                 // 唤醒成功:在第6行写入红色提示文字
  42.                 k10.canvas->canvasText("已唤醒行空板.......", 6, 0xFF0000);
  43.                 // 将画布内容刷新到实体屏幕上
  44.                 k10.canvas->updateCanvas();
  45.         }
  46.         else {
  47.                 // 未被唤醒:第4行写入蓝色文字,提示唤醒关键词
  48.                 k10.canvas->canvasText("唤醒词为“你好小新”", 4, 0x0000FF);
  49.                 k10.canvas->updateCanvas();
  50.         }
  51.         // 判断是否识别到1号语音指令:开灯
  52.         if (asr.isDetectCmdID(0+1)) {
  53.                 // 第8行写入黑色文字
  54.                 k10.canvas->canvasText("检测语音命令", 8, 0x000000);
  55.                 // 第10行写入蓝色文字
  56.                 k10.canvas->canvasText("打开白色灯光", 10, 0x0000FF);
  57.                 k10.canvas->updateCanvas();
  58.                 // 控制板载全部RGB灯点亮为纯白色
  59.                 // 参数-1代表控制所有灯珠,0xFFFFFF为纯白色RGB值
  60.                 k10.rgb->write(-1, 0xFFFFFF);
  61.         }
  62.         // 判断是否识别到2号语音指令:关灯
  63.         if (asr.isDetectCmdID(1+1)) {
  64.                 // 清空第10行文字,防止文字重叠
  65.                 k10.canvas->canvasClear(10);
  66.                 k10.canvas->canvasText("检测语音命令", 8, 0x000000);
  67.                 k10.canvas->canvasText("关闭白色灯光", 10, 0x0000FF);
  68.                 k10.canvas->updateCanvas();
  69.                 // 关闭所有RGB彩灯,颜色值0x000000代表熄灭
  70.                 k10.rgb->write(-1, 0x000000);
  71.         }
  72.         // 延时2秒,保持屏幕文字停留显示
  73.         delay(2000);
  74.         // 清空第6行及以下所有文字,清除上一轮显示内容
  75.         k10.canvas->canvasClear(6);
  76. }
复制代码


回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 4 小时前

【花雕动手做】K10实验之语音识别来控制板载WS2812灯

代码解读
本程序运行在行空板 K10,实现离线语音唤醒 + 语音指令控制彩灯:
先说唤醒词 “你好小新” 唤醒设备,再说出 “开灯”“关灯”,屏幕同步显示文字,同时控制板载 RGB 灯亮灭。

第一部分:头文件与对象创建

  1. #include "asr.h"
  2. #include "unihiker_k10.h"
复制代码

asr.h:离线语音识别驱动,提供唤醒检测、自定义语音命令功能。
unihiker_k10.h:行空板硬件库,用来操控屏幕、RGB 彩灯。

  1. UNIHIKER_K10 k10;
  2. ASR          asr;
复制代码

k10:行空板硬件实例,管理屏幕、彩灯。
asr:语音识别实例,管理收音、语音解析。

  1. uint8_t screen_dir=2;
复制代码

定义屏幕旋转方向,数值 2 代表屏幕倒置。

第二部分:setup () 初始化函数(上电只运行一次)

  1. k10.begin();
复制代码

初始化行空板所有底层硬件,开启串口、屏幕、外设总线。

  1. asr.asrInit(CONTINUOUS, CN_MODE, 12000);
复制代码

语音模块初始化:
CONTINUOUS:持续收音,一直监听人声;
CN_MODE:中文识别模式;
12000:收音灵敏度,数值越大,抗噪音能力越强,不容易误触发。

  1. while(asr._asrState == 0){delay(100);}
复制代码

等待语音模块启动完成。
_asrState=0代表模块正在加载语音模型,未就绪。程序暂停循环等待,每 100ms 查询一次状态,避免硬件未就绪造成程序卡死。

  1. k10.initScreen(screen_dir);
  2. k10.creatCanvas();
复制代码

按照预设方向初始化 LCD 屏幕。
创建画布,所有文字先写入画布缓冲区,再统一刷新到屏幕。

  1. asr.addASRCommand(0+1, "kai deng");
  2. asr.addASRCommand(1+1, "guan deng");
复制代码

预先添加自定义语音命令(离线指令)
函数格式:addASRCommand (指令编号,拼音口令)
编号 1:拼音 kai deng 对应中文 “开灯”;
编号 2:拼音 guan deng 对应中文 “关灯”。
离线语音只能识别提前注册好的命令,必须使用拼音填写汉字口令。

第三部分:loop () 无限主循环
1. 唤醒状态判断

  1. if (asr.isWakeUp())
复制代码

检测是否说出唤醒词 “你好小新”:
唤醒成功:屏幕显示红色文字 “已唤醒行空板”;
未唤醒:屏幕蓝色文字提示唤醒词。
执行updateCanvas()把文字刷新到显示屏。
2. 第一条语音指令:开灯

  1. if (asr.isDetectCmdID(0+1))
复制代码

检测是否识别到 1 号指令 “开灯”:
在屏幕指定行打印提示文字;
刷新屏幕画面;
k10.rgb->write(-1, 0xFFFFFF);
参数 -1:控制所有板载 RGB 灯珠;
0xFFFFFF:纯白色灯光,点亮彩灯。
3. 第二条语音指令:关灯

  1. if (asr.isDetectCmdID(1+1))
复制代码

检测到 2 号指令 “关灯”:
先清空第 10 行文字,防止文字重叠;
屏幕打印 “关闭白色灯光”;
0x000000,RGB 灯熄灭。
4. 屏幕刷新延时与清理

  1. delay(2000);
  2. k10.canvas->canvasClear(6);
复制代码

延时 2 秒,让文字保持显示 2 秒钟;
清空第 6 行及下方所有文字,清除本次显示内容,准备下一轮循环。

完整运行流程
设备上电,初始化主板与语音模块,等待语音芯片加载完成;
预先录入两条语音命令:开灯、关灯;
麦克风不间断监听唤醒词;
说出 “你好小新”,设备唤醒,屏幕弹出唤醒提示;
说出 “开灯”,屏幕更新文字,彩灯变白灯亮起;
说出 “关灯”,屏幕切换文字,彩灯熄灭;
文字停留 2 秒后自动清空,继续等待下一次语音指令。


回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 4 小时前

【花雕动手做】K10实验之语音识别来控制板载WS2812灯

Mind+图形编程

【花雕动手做】K10 实验之语音识别来控制板载 WS2812 灯图1

回复

使用道具 举报

驴友花雕  高级技神
 楼主|

发表于 4 小时前

【花雕动手做】K10实验之语音识别来控制板载WS2812灯

实验场景图与视频记录

【花雕动手做】K10 实验之语音识别来控制板载 WS2812 灯图1

【花雕动手做】K10 实验之语音识别来控制板载 WS2812 灯图2
08 (3).jpg
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

为本项目制作心愿单
购买心愿单
心愿单 编辑
[[wsData.name]]

硬件清单

  • [[d.name]]
btnicon
我也要做!
点击进入购买页面
上海智位机器人股份有限公司 沪ICP备09038501号-4 备案 沪公网安备31011502402448

© 2013-2026 Comsenz Inc. Powered by Discuz! X3.4 Licensed

mail