谢大蟀智能家居

 找回密码
 立即注册

QQ登录

只需一步,快速开始

查看: 21|回复: 0

ASRPRO_小白玩转播报语音“如何判断播报完毕”

[复制链接]

41

主题

46

帖子

162

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
162
发表于 7 天前 | 显示全部楼层 |阅读模式
如何判断语音已播报完毕

即:如何播报完毕后再继续执行执行程序


     因ASRPRO单片机可以播报语音,因此大家经常用语音播报功能做一些功能解说应用,比如展会展品,模型教具,在程序运行前,先解说或提示,后执行动作。此时就需要准确检测语音是否已经播报完毕。

    本篇就是重点讨论如何检测语音已经播报完毕。并建立自定义功能函数,方便使用。

    我们先建立一个点亮PA4板载灯的程序,程序目的是播报完1000ID提示语后,再点亮板载灯。播报完1001提示语后再关闭板载灯。


    上图中核心功能函数是如下这个图形指令:


    下面我们就重点介绍这个自定义功能函数是如何设计的。


    如上图所示,是异步播报自定义功能函数的非阻塞设计,也就是说,它不能判断和等待播报结束。请求播报成功后,直接退出,没有检测播报结束功能。那么我们如何检测播报是否结束呢?我们看如下图形:


    如上图,通过天问留给我们的开源代码,我们可以找到播报ID核心函数和它的参数用途。
我们关注到,天问留给我们的开源代码,指示了我们,其中有一个参数是播报完毕回调函数:myplay_end_callback。
也就是说,当该ID语音播报完毕后,会执行一次这个名为myplay_end_callbackmyplay_end_callback的函数,这正是我们需要的。(有朋友估计会问,这类后台函数哪里能找到,有没有手册?目前没有高级API手册,但祝老师给了我们查询工具和开源工程,详见ASRPRO专业画面右上角-编程手册-附录3,VSCODE相关操作介绍)
    那么myplay_end_callbackmyplay_end_callback从哪来?当然需要我们自己建立一个。建立自定义功能函数步骤如下:


第一步,如上图,打开函数欧能指令集,拖拽一个无返回值的自定义功能框架。
    我们看到,函数自定义功能组里,已经有很多自定义功能,我们不用管他们,只关建立当前的。

第二步,如上图,起一个合适的名字,既然是自定义,当然允许自己起名字,为了避免重名冲突,我们在名字前面加上自己的标志字母,笔者网名是李白500,那么我们就起名为LB前缀的名字。

    当然,也不要忘了改写调用参数名字为LB前缀。如上图。


    如上图,到此我们初步完成了回调自定义工程函数的建立,那么如上图所示,我们如何通知播报自定义功能,播报结束了?经过一个多月的学习演练,我么那当然毫不犹豫的选择消息机制。早先,我们选择用共有变量,但它不便于管理。我们尝试用消息。消息能保持工程的构架清晰,并有助于管理各个程序模块,保持独立性。


第三步,如上图,先在异步播报自定义功能中,建立一个消息队列,用于接收和存储回调函数发来的播报完毕消息。
        在这里,我们利用图形化的便利性,可以自由安排队列的建立点,而不用遵循C++规则。那么我们自然而然,谁用消息,就建立在谁那里。异步播报要用这个消息,那么我们就在异步播报功能函数里,建立消息。这样便于管理和确保模块独立性。

第四步,如上图,内容比较多,修改消息名称,配置消息长度,增加一个私有变量pX,用于存储消息,并利用读取消息指令,判断其是否有回调函数发来的消息,如果有,则结束等待,实现播报完毕再继续执行的设计需求。

第五步,如上图,在回调自定义功能函数中,发送消息给F01异步播报自定义函数。发送什么消息并不重要,我们只需要在播报完毕回调功能函数中,发送一个消息给F01即可。

    至此,如上图,我们完成了自定义函数搭建和封装

    我们折叠起来,并使用刚做好的自定义功能“F01异步播报ID”
从而实现了播报完毕再继续执行程序的设计需求。




上述工程范例可以在最新项目里搜索到。如上图
回复

使用道具 举报

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

本版积分规则

QQ|手机版|谢大蟀智能家居 ( 闽ICP备18020392号-1 )

GMT+8, 2025-4-20 11:41 , Processed in 0.070396 second(s), 21 queries .

Powered by Discuz! X3.4

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表