# 【WEB前端2024】3D智体编程:乔布斯3D纪念馆-第53课-语音指令跳舞

使用dtns.network德塔世界(开源的智体世界引擎),策划和设计《乔布斯超大型的开源3D纪念馆》的系列教程。dtns.network是一款主要由JavaScript编写的智体世界引擎(内嵌了three.js编辑器的定制版-支持以第一视角游览3D场馆),可以在浏览器和node.js、deno、electron上运行,它是一个跨平台的软件,支持多个操作系统使用!并且支持使用内置的poplang智体编程语言实现3D组件的智能化编程——语法超简单,一句话语法,人人轻松上手!

下面分为几步介绍,如何基于dtns.network智体世界引擎实现语音指令机器人跳舞。通过将现代的浏览器打造成接收语音指令的agent,将语音翻译成中文指令传递给3d轻应用,以便3D轻应用执行跳舞指令。从而实现了复杂的语音指令控制机器人的目标——更接近真实的场景对机器人的语音控制,后续拓展可以根据大语言模型,实时语音指令机器人实现包含跳舞的任意功能。从而将行者机器人底盘打造成真正具备场景应用能力的强大机器人底盘平台。

为了实现机器人的语音指令编程,通过浏览器使用artyom.js库实现语音识别并通过dtns-api的实时频道通知到3d轻应用中(onRobotEvent接收实时频道传递过来的消费)。从而根据指令判断是否是跳舞、还是执行旋风舞步。亦或是执行其它的机器人实时动作。

# 第一步:打开头榜页面,找到3D纪念馆xverse轻应用

1.png

注:找到标题为“机器人控制-接收语音指令-跳舞”的xverse轻应用。

# 第二步:点击右上角...进入头榜编辑器

2.png

注:因为每一个xverse轻应用均是以xverse.json的方式进行源码级应用的分享的。故每一个社区用户均可通过编辑xverse轻应用源码来实现DIY和定制。

# 第三步:点击正面的“编辑xverse轻应用源码”,进入3D场馆编辑器

3.png

注:点击3D场景中间的avatar的3D对象,在右侧的属性面板中找到脚本-编辑。

# 第四步:编辑墙体avatar玩家3D组件的poplang代码

4.png

注:首先使用了ib3.event.bus.on rtrobot-channel onRobotEvent实现了实时语音指令的接收(在onRobotEvent中完成了语音指令的判断,是dance跳舞还是dance_xf,亦或是其它机器人动作指令)。在使用该订阅事件总线指令之前,使用dtns-api:/rtchannel/create和/rtchannel/focus完成rtrobot-channel机器人实时信号频道的创建和订阅。并在3d_stop的3D轻应用退出事件中,进行unfocus和ib3.event.bus.remove删除事件订阅(避免退出后依然接收实时数据,浪费内存和cpu资源)。

# 第五步:点击顶部菜单“文件”推送头榜(作品),将此3D纪念馆以xverse轻应用方式分享给其他用户

5.png

# 第六步:将新的头榜标题设置为“机器人控制--接收语音指令-跳舞(2个舞步)”,点击右上角确认完成头榜发布

6.png

注:标题为xmsg,不能误删除“”双引号,否则会发布失败——仅修改xmsg属性的文字内容即可。

# 第七步:找到刚发布的xverse轻应用头榜,点击进入3D场景游览器

7.png

注:轻轻一点击,即可进入体验刚发布好的xverse-3D轻应用(智体应用),我们相当于可以无限地分享和裂变这个开源的3D轻应用(智体应用)。这样大家便可以按自己的需求,轻松的修改和定制这些动画的源码模板了。可以形成自己的故事、自己的动画、自己的3D场馆、自己的3D互动剧情等等。随心所欲地发挥,所以智体世界、智体OS也相当于【元宇宙】【开放世界】!

# 第八步:进入3D轻应用后,我们首先开始与机器人实现视频的实时连接(然后通过打开的audio_cmd.html进行实时的语音识别控制——agent)

8.png

下发语音指令:跳舞或旋风舞步(如下图所示),会发现机器人正在执行相应的舞步指令。

9.png

继续执行舞步指令(如下图)

10.png

我们回顾一下audio_cmd.html的代码

11.png

注:从上图可看到,有跳舞和旋风舞步的两个中文语音指令,通过调用dtns-api:dtns://web3:svrdev/rtchanne/send实现了对指令的实时派发。从而在3d轻应用中接收到指令之后,再执行相应的舞步指令。

通过上8步,我们成功完成了通过3D轻应用中实现了跳舞的语音指令控制,这大大增强了在真实场景下的复杂机器人控制功能。并有机会结合AGI通用人工智能和大语言模型,实现复杂多样的真实场景的人与机器人的配合工作。从而为人类增加上强大的智体agent助手!

我们也看到了poplang智体编程语言的强大能量,一两行简单的指令,即可完成复杂的3D互动的交互效果、音效效果的开发。并且通过xverse-json源文件(3D轻应用)的方式进行社区分享,使得开源开放、公开透明的3D场馆的设计,能被大家更多的学习和继承,达到互动学习、互动成长的目的。这也是智体OS、智体互动式教育-学习的目标。

注:dtns.network德塔世界(开源的智体世界引擎)是在github和gitee上开源的项目!

附录(poplang智体代码——实现语音指令机器人跳舞):


pop.func.define 3d_move

= event 3d_move_event

object.get event.turn turn

object.get event.forward forward

$.Math.abs turn

= aturn $ret

$.Math.abs forward

= aforward $ret

< aforward aturn turnflag

pop.ifelse turnflag turnNow goNow

pop.func.end

 

pop.func.define turnNow

 

set z 0

> turn z leftFlag

pop.ifelse leftFlag left right

 

pop.func.end

 

pop.func.define goNow

set z 0

> forward z goFlag

pop.ifelse goFlag move back

pop.func.end

 

 

pop.func.define left

/rtphone/robot/action?action=left

set tips 左转

#$.g_2d_voice_play tips

pop.func.end

 

pop.func.define right

/rtphone/robot/action?action=right

set tips 右转

#$.g_2d_voice_play tips

pop.func.end

 

pop.func.define move

/rtphone/robot/action?action=move

set tips 前进

#$.g_2d_voice_play tips

pop.func.end

 

pop.func.define back

/rtphone/robot/action?action=back

set tips 后退

#$.g_2d_voice_play tips

pop.func.end

 

set chatid msg_chat02G7TLu59Tzs

$.g_3d_show_rtcchat chatid

 

#订阅capture事件

pop.func.define onEvent

= data $event_data

object.get data.base64 base64

$.g_2d_pose_find base64

= cret $ret

object.get cret.w w

object.get cret.h h

object.get cret.pose.keypoints points

object.get cret.pose.score score

set i 0

+ i i i

set iw 9

+ iw i iw

    array.get points i nose

array.get points iw leftWrist

set leftr 0.33

set rightr 0.66

set scoreMin 0.2

    * w leftr leftw

* w rightr rightw

    * h leftr toph

    object.get nose.position.x npx

object.get nose.position.y npy

    object.get leftWrist.position.y wpy

object.get leftWrist.score ws

    < wpy npy backok

< npx leftw leftok

    > npx rightw rightok

    < npy h moveok

> score scoreMin sok

    > ws scoreMin wsok

    && backok wsok backok

    ! backok notback

    pop.ifelse backok back

    && sok notback sok

    && leftok sok leftok

    && rightok sok rightok

    && moveok sok moveok

pop.ifelse leftok right donothing

    pop.ifelse rightok left donothing

    || leftok rightok turnok

    ! turnok notturn

    && notturn moveok moveok

    && moveok sok moveok

    pop.ifelse moveok move donothing

pop.func.end

 

ib3.event.bus.on rtcchat_capture onEvent

$.g_2d_rtcchat_capture_start

 

pop.func.define 3d_stop

ib3.event.bus.remove rtcchat_capture

$.g_2d_rtcchat_capture_stop

#机器人频道

/rtchannel/unfocus?channel=rtrobot-channel

ib3.event.bus.remove rtrobot-channel

pop.func.end

 

/rtchannel/create?channel=rtrobot-channel

/rtchannel/focus?channel=rtrobot-channel

 

pop.func.define onRobotEvent

= data $event_data

object.get data.notify_type notify_type

set xtype dance

== notify_type xtype xflag

pop.ifelse xflag dance doNo

    set xtype dance_xf

    == notify_type xtype xflag

    pop.ifelse xflag dance_xf doNo

pop.func.end

 

ib3.event.bus.on rtrobot-channel onRobotEvent

 

 

pop.func.define dance

 

set step 500

move

pop.sleep step

move

pop.sleep step

back

pop.sleep step

back

pop.sleep step

left

pop.sleep step

left

pop.sleep step

right

pop.sleep step

right

pop.sleep step

right

pop.sleep step

right

pop.sleep step

left

pop.sleep step

left

pop.sleep step

move

pop.sleep step

left

pop.sleep step

left

pop.sleep step

left

pop.sleep step

left

pop.sleep step

left

pop.sleep step

left

pop.sleep step

left

pop.sleep step

left

pop.sleep step

left

pop.sleep step

left

pop.sleep step

left

pop.sleep step

left

pop.sleep step

left

pop.sleep step

left

pop.sleep step

left

pop.sleep step

left

pop.sleep step

left

pop.sleep step

left

pop.sleep step

left

pop.sleep step

left

pop.sleep step

left

pop.sleep step

left

pop.sleep step

left

pop.sleep step

left

pop.sleep step

left

pop.sleep step

left

pop.sleep step

left

pop.sleep step

left

pop.sleep step

left

pop.sleep step

left

pop.sleep step

left

pop.sleep step

left

pop.sleep step

left

pop.sleep step

left

pop.sleep step

left

pop.sleep step

left

pop.sleep step

left

pop.sleep step

left

pop.sleep step

left

pop.sleep step

left

pop.sleep step

left

pop.sleep step

left

pop.sleep step

left

pop.sleep step

left

pop.sleep step

left

pop.sleep step

left

pop.sleep step

left

pop.sleep step

left

pop.sleep step

left

pop.sleep step

left

pop.sleep step

left

pop.sleep step

left

pop.sleep step

left

pop.sleep step

left

pop.sleep step

left

pop.sleep step

left

pop.sleep step

left

pop.sleep step

left

pop.sleep step

left

pop.sleep step

left

pop.sleep step

right

pop.sleep step

right

pop.sleep step

right

pop.sleep step

right

pop.sleep step

right

pop.sleep step

right

pop.sleep step

right

pop.sleep step

left

pop.sleep step

move

pop.sleep step

move

pop.sleep step

back

 

pop.func.end

 

pop.func.define dance_xf

 

set step

move

pop.sleep step

move

pop.sleep step

back

pop.sleep step

back

pop.sleep step

left

pop.sleep step

left

pop.sleep step

right

pop.sleep step

right

pop.sleep step

right

pop.sleep step

right

pop.sleep step

left

pop.sleep step

left

pop.sleep step

move

pop.sleep step

left

pop.sleep step

left

pop.sleep step

left

pop.sleep step

left

pop.sleep step

left

pop.sleep step

left

pop.sleep step

right

pop.sleep step

right

pop.sleep step

right

pop.sleep step

right

pop.sleep step

right

pop.sleep step

right

pop.sleep step

right

pop.sleep step

left

pop.sleep step

move

pop.sleep step

move

pop.sleep step

back

 

pop.func.end

poplang的人脸识别并认主的控制代码到此结束!

# 开源地址:

github地址:https://github.com/dtnsman/dtns (opens new window)

Gitee地址:https://github.com/dtnsman/dtns (opens new window)

官方文档:https://dtns.network.yunapi.org (opens new window)

加入QQ群:279931001

加入微信群:

wechat-qr (2).png