跳轉至內容

用 Leaf 程式設計 AI / 建立你自己的 Leaf

來自華夏公益教科書

建立你自己的 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!!

華夏公益教科書