用 Leaf 程式設計 AI / 建立你自己的 Leaf
在 Leaf 中新增新的人
以下內容僅適用於版本 01-01-07,但它可能對其他版本也起到指導作用。
此過程分為兩部分。一部分是將人新增到 Leaf 的“大腦”中,另一部分是載入參考影像,以便 Leaf 可以“看到”你。
我們將從將你新增到 Leaf 的大腦開始。如果 Leaf 不知道他/她正在看著誰,那麼 Leaf 能夠看到你沒有多大意義。
請注意,在一些程式碼片段中,單詞前面有一個“characture”。這很重要,它必須是正確的標點符號,否則當您儲存檔案時,lisp 編譯器會給出錯誤。
在這個例子中,我們將使用“BOB”這個名字,如果你不是 BOB,那就把 BOB 改成你的名字。
首先,Leaf 需要能夠理解你在說你的名字時所說的話。轉到“speech.xml”,然後新增
<P>this is Bob</P>
在
<LIST>
和
<P>this is Bruce</P>
之間。然後儲存檔案。
在 lisp 編輯器中開啟“leaf.lisp”(先儲存一份副本,以防出現問題)。
首先,我們需要一個用於該人的物件。
找到這行
;;;; OBJECTS: "nothing person alex bruce gary robin obstacle wall door recharger"
這是新增新人的區域的開頭。
向下滾動到
(make-instance 'robin))
之後,但在
;;; defclass:osla:object:toy ;;;
之前。Robin 是當前定義的最後一個人。
使用以下程式碼新增新的人
;;; defclass:osla:object:person:bob ;;;
(defclass bob (person) ())
;
;; defparameter:osla:object:person:robin
(defparameter bob
(make-instance 'bob))
現在 Leaf 有了一個物件來儲存你。
現在你希望 Leaf 能夠和你一起玩遊戲,所以找到這行
;;; defclass:osla:activity:play ;;;
這是為每個人配置遊戲的開始。
向下滾動到
(defparameter playgary
(make-instance 'play
:happy '(setf happy (+ happy 10))
:sad '(setf sad (/ sad 2))))
和
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
之間的間隙。Gary 是最後一個定義了遊戲的玩家。我們將設定 Bob 玩“掃雷”。我們還將使 Leaf 在我們玩遊戲時更快樂,更少悲傷。
插入以下程式碼
(defmethod play ((x bob)) ;for specific instances
"(play bob)"
(sapi-tts '"Would you like to play mine sweeper?")
(system:call-system '("c:\\WINDOWS\\system32\\winmine.exe") :wait nil))
(defparameter playbob
(make-instance 'play
:happy '(setf happy (+ happy 10))
:sad '(setf sad (/ sad 2))))
我們還希望 Leaf 為你播放音樂。我們將使用“碟中諜”,我們還將使 Leaf 更快樂,更少悲傷。
這是下一部分,所以向下滾動到
(defparameter playmusicbruce
(make-instance 'playmusic
:happy '(setf happy (+ happy 10))
:sad '(setf sad (/ sad 2))))
和
;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
之間,然後新增以下內容
(defmethod playmusic ((play-bob bob)) ;for specific instances
"(playmusic bob)"
(sapi-tts '"Here's mission impossible.")
(PlayWav mi01))
(defparameter playmusicbob
(make-instance 'playmusic
:happy '(setf happy (+ happy 10))
:sad '(setf sad (/ sad 2))))
我們希望 Leaf 對我們有感情,所以我們添加了一個行為指令碼。
找到這行
;;;; BEHAVIOR SCRIPTS ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
並向下滾動到
(defun robinscript ()
(NowFocusOn 'robin)
(setf lonely 0)
(updatemood)
(ChangeFacialExpression)
(sapi-tts '"Hello, Robin.")
(sapi-tts (concatenate 'string "Now I'm feeling " (updatemood))))
和
(defun bebravescript ()
之間。Robin 是最後一個人。新增以下內容
(defun bobscript ()
(NowFocusOn 'bob)
(setf lonely 0)
(updatemood)
(ChangeFacialExpression)
(sapi-tts '"Hello, Bob.")
(sapi-tts (concatenate 'string "Now I'm feeling " (updatemood))))
我們還可以更新孤獨的指令碼,以便 Leaf 會要求 Bob。
找到這行
(defun lonelyscript ()
並向下滾動到
(sapi-tts (string (car (imagine-if '(ana bruce alex gary)))))
將 Bob 新增到此行,使其現在變為
(sapi-tts (string (car (imagine-if '(ana bruce alex gary bob)))))
如果我們希望 Leaf 能夠最喜歡我們,請找到
(defun whodoyoulikebestscript ()
滾動到這行
(sapi-tts (string (car (imagine-if '(ana bruce alex robin gary)))))
並將它更改為
(sapi-tts (string (car (imagine-if '(ana bruce alex robin gary bob)))))
最後,我們希望 Leaf 在我們說出名字時採取行動,所以找到這行
;; LEAF CHECKS TO SEE IF HE'S HEARD A PHRASE HE RECOGNIZES
並向下滾動到
((string-equal *text-phrase*
(concatenate 'string robot " this is Ana")) ;behavior
(setf *text-phrase* nil)
(anascript))
和
((string-equal *text-phrase*
(concatenate 'string robot " who am I")) ;behavior
(setf *text-phrase* nil)
(WhoAmIscript))
並新增以下內容
((string-equal *text-phrase*
(concatenate 'string robot " this is Bob")) ;behavior
(setf *text-phrase* nil)
(bobscript))
儲存並編譯。
現在 Leaf 能夠在你說出名字時知道你是誰了。
嘗試說
"leaf,這是 bob"
"leaf,播放一些音樂"
Leaf 應該播放“碟中諜”。
現在我們可以新增你的照片,以便 Leaf 知道你長什麼樣。
首先確保 Leaf 正在執行並且可以看見攝像頭。
詢問 Leaf“leaf,我是誰”。Leaf 應該回答“你看起來像 XXX”,其中 XXX 可以是 Gary、Alex、Ana 或 Bruce。
如果 Leaf 回答“我無法看見你”,請嘗試移動,以便你直接看著攝像頭,因為這似乎表明 OpenCV 無法在影像中找到人臉。
對我來說,它在一個便宜的網路攝像頭上的效果很好,距離大約在 18 英寸到 3 英尺之間。
一旦你讓 Leaf 回答“你看起來像 XXX”,你就可以讓 Leaf 認出你了。
開啟“C:\program files\leaf\leaffaces”資料夾,在裡面你會找到一個名為“image.jpg”的檔案。請注意,此影像末尾沒有數字。
在影像檢視器中開啟此檔案,並檢查它是否看起來像你。它不必非常完美。
將此檔案重新命名為“image4.jpg”(假設你已經有了影像 0 到 3,分別是 Gary、Alex、Ana 和 Bruce)。
在同一個目錄中開啟“names.txt”檔案,並將你的名字新增到列表的末尾。使用大寫字母,並在 BRUCE 和你的名字之間留一個空格。儲存檔案。
在同一個目錄中開啟“distances.txt”檔案,然後新增以下內容
“Euclidean distance to image 4:
0.00”
請注意,在最後一條條目和此新文字之間有一行,並在末尾有一行空白。儲存此檔案。
現在,當你問 Leaf“Leaf,我是誰?”時,Leaf 應該回答你的名字。並且現在有了新的、偉大的 moe!!