【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輕應用
注:找到標題為“機器人控制-接收語音指令-跳舞”的xverse輕應用。
第二步:點擊右上角…進入頭榜編輯器
注:因為每一個xverse輕應用均是以xverse.json的方式進行源碼級應用的分享的。故每一個社區用戶均可通過編輯xverse輕應用源碼來實現DIY和定制。
第三步:點擊正面的“編輯xverse輕應用源碼”,進入3D場館編輯器
注:點擊3D場景中間的avatar的3D對象,在右側的屬性面板中找到腳本-編輯。
第四步:編輯墻體avatar玩家3D組件的poplang代碼
注:首先使用了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輕應用方式分享給其他用戶
第六步:將新的頭榜標題設置為“機器人控制–接收語音指令-跳舞(2個舞步)”,點擊右上角確認完成頭榜發布
注:標題為xmsg,不能誤刪除“”雙引號,否則會發布失敗——僅修改xmsg屬性的文字內容即可。
第七步:找到剛發布的xverse輕應用頭榜,點擊進入3D場景游覽器
注:輕輕一點擊,即可進入體驗剛發布好的xverse-3D輕應用(智體應用),我們相當于可以無限地分享和裂變這個開源的3D輕應用(智體應用)。這樣大家便可以按自己的需求,輕松的修改和定制這些動畫的源碼模板了。可以形成自己的故事、自己的動畫、自己的3D場館、自己的3D互動劇情等等。隨心所欲地發揮,所以智體世界、智體OS也相當于【元宇宙】【開放世界】!
第八步:進入3D輕應用后,我們首先開始與機器人實現視頻的實時連接(然后通過打開的audio_cmd.html進行實時的語音識別控制——agent)
下發語音指令:跳舞或旋風舞步(如下圖所示),會發現機器人正在執行相應的舞步指令。
繼續執行舞步指令(如下圖)
我們回顧一下audio_cmd.html的代碼
注:從上圖可看到,有跳舞和旋風舞步的兩個中文語音指令,通過調用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_eventobject.get event.turn turnobject.get event.forward forward$.Math.abs turn= aturn $ret$.Math.abs forward= aforward $ret< aforward aturn turnflagpop.ifelse turnflag turnNow goNowpop.func.endpop.func.define turnNowset z 0> turn z leftFlagpop.ifelse leftFlag left rightpop.func.endpop.func.define goNowset z 0> forward z goFlagpop.ifelse goFlag move backpop.func.endpop.func.define left/rtphone/robot/action?action=leftset tips 左轉#$.g_2d_voice_play tipspop.func.endpop.func.define right/rtphone/robot/action?action=rightset tips 右轉#$.g_2d_voice_play tipspop.func.endpop.func.define move/rtphone/robot/action?action=moveset tips 前進#$.g_2d_voice_play tipspop.func.endpop.func.define back/rtphone/robot/action?action=backset tips 后退#$.g_2d_voice_play tipspop.func.endset chatid msg_chat02G7TLu59Tzs$.g_3d_show_rtcchat chatid#訂閱capture事件pop.func.define onEvent= data $event_dataobject.get data.base64 base64$.g_2d_pose_find base64= cret $retobject.get cret.w wobject.get cret.h hobject.get cret.pose.keypoints pointsobject.get cret.pose.score scoreset i 0+ i i iset iw 9+ iw i iwarray.get points i nosearray.get points iw leftWristset leftr 0.33set rightr 0.66set scoreMin 0.2* w leftr leftw* w rightr rightw* h leftr tophobject.get nose.position.x npxobject.get nose.position.y npyobject.get leftWrist.position.y wpyobject.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 notbackpop.ifelse backok back&& sok notback sok&& leftok sok leftok&& rightok sok rightok&& moveok sok moveokpop.ifelse leftok right donothingpop.ifelse rightok left donothing|| leftok rightok turnok! turnok notturn&& notturn moveok moveok&& moveok sok moveokpop.ifelse moveok move donothingpop.func.endib3.event.bus.on rtcchat_capture onEvent$.g_2d_rtcchat_capture_startpop.func.define 3d_stopib3.event.bus.remove rtcchat_capture$.g_2d_rtcchat_capture_stop#機器人頻道/rtchannel/unfocus?channel=rtrobot-channelib3.event.bus.remove rtrobot-channelpop.func.end/rtchannel/create?channel=rtrobot-channel/rtchannel/focus?channel=rtrobot-channelpop.func.define onRobotEvent= data $event_dataobject.get data.notify_type notify_typeset xtype dance== notify_type xtype xflagpop.ifelse xflag dance doNoset xtype dance_xf== notify_type xtype xflagpop.ifelse xflag dance_xf doNopop.func.endib3.event.bus.on rtrobot-channel onRobotEventpop.func.define danceset step 500movepop.sleep stepmovepop.sleep stepbackpop.sleep stepbackpop.sleep stepleftpop.sleep stepleftpop.sleep steprightpop.sleep steprightpop.sleep steprightpop.sleep steprightpop.sleep stepleftpop.sleep stepleftpop.sleep stepmovepop.sleep stepleftpop.sleep stepleftpop.sleep stepleftpop.sleep stepleftpop.sleep stepleftpop.sleep stepleftpop.sleep stepleftpop.sleep stepleftpop.sleep stepleftpop.sleep stepleftpop.sleep stepleftpop.sleep stepleftpop.sleep stepleftpop.sleep stepleftpop.sleep stepleftpop.sleep stepleftpop.sleep stepleftpop.sleep stepleftpop.sleep stepleftpop.sleep stepleftpop.sleep stepleftpop.sleep stepleftpop.sleep stepleftpop.sleep stepleftpop.sleep stepleftpop.sleep stepleftpop.sleep stepleftpop.sleep stepleftpop.sleep stepleftpop.sleep stepleftpop.sleep stepleftpop.sleep stepleftpop.sleep stepleftpop.sleep stepleftpop.sleep stepleftpop.sleep stepleftpop.sleep stepleftpop.sleep stepleftpop.sleep stepleftpop.sleep stepleftpop.sleep stepleftpop.sleep stepleftpop.sleep stepleftpop.sleep stepleftpop.sleep stepleftpop.sleep stepleftpop.sleep stepleftpop.sleep stepleftpop.sleep stepleftpop.sleep stepleftpop.sleep stepleftpop.sleep stepleftpop.sleep stepleftpop.sleep stepleftpop.sleep stepleftpop.sleep stepleftpop.sleep stepleftpop.sleep stepleftpop.sleep stepleftpop.sleep stepleftpop.sleep steprightpop.sleep steprightpop.sleep steprightpop.sleep steprightpop.sleep steprightpop.sleep steprightpop.sleep steprightpop.sleep stepleftpop.sleep stepmovepop.sleep stepmovepop.sleep stepbackpop.func.endpop.func.define dance_xfset stepmovepop.sleep stepmovepop.sleep stepbackpop.sleep stepbackpop.sleep stepleftpop.sleep stepleftpop.sleep steprightpop.sleep steprightpop.sleep steprightpop.sleep steprightpop.sleep stepleftpop.sleep stepleftpop.sleep stepmovepop.sleep stepleftpop.sleep stepleftpop.sleep stepleftpop.sleep stepleftpop.sleep stepleftpop.sleep stepleftpop.sleep steprightpop.sleep steprightpop.sleep steprightpop.sleep steprightpop.sleep steprightpop.sleep steprightpop.sleep steprightpop.sleep stepleftpop.sleep stepmovepop.sleep stepmovepop.sleep stepbackpop.func.end
poplang的人臉識別并認主的控制代碼到此結束!