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