跳转至内容

用 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!!

华夏公益教科书