构建一个人工智能语音机器的泰迪熊
扫描二维码
随时随地手机看文章
故事是这样开始的……
有一天,我在翻看姐姐的旧玩具时,发现了一只会说话的智能熊。这是典型的会说话的熊,用来给孩子们讲睡前故事什么的。你可以在我这里找到那只熊。
我在里面找到了一个扬声器,一个微控制器和4个有线按钮,它们安装在熊的每条腿上。
当我打开熊的内部时,一个弗兰肯斯坦的想法出现在我脑海中:如果我可以用本地的法学硕士和文本到语音的方法把泰德变成泰德呢?结果是,你可以看到这篇文章。
寻找好的起点
建设者的精神是从零开始建设项目。然而,当涉及到一个简单的概念证明和一个周末想法时,目标是尽快推动一些可行的东西,而最好的方法是站在巨人的肩膀上。
首先,让我们来看看我们需要什么来实现这个想法。
对于人工智能语音机器人来说,实现一个简单版本的任务是微不足道的。主要有3个部分:
•聊天机器人:使用LLM或经典文本处理管道实现(如在Home Assistant Assist中使用)
•文本到语音:使用基础模型和转录库(如Whisper)实现。
•语音到文本:使用语音模型和库(如Piper)实现。
通过将这3个组件粘合在一起,我们可以制作出一个非常简单的语音机器人:
•用语音转文本听唤醒词
•在检测到唤醒词后,听取用户并转录他们的声音,直到他们暂停。
•将转录后的输出输出给聊天机器人。
•LLM或文本处理流水线魔术发生在后台。
•使用文本-语音转换以音频形式播放聊天机器人输出。
包括我在内的许多人都从事过执行工作,但存在一些常见的限制:
•大多数LLM语音实现都不是本地的,速度也不快。就我个人而言,我用Gemini生成文本,用ElevenLabs生成语音。时延可达1 ~ 2s。
•需要有人提醒你。语音机器人无法察觉你什么时候突然说话。
•在语音机器人说完话之前,你不能打断它。这种行为是模拟实际对话所必需的。
当我在考虑是否应该在一个可爱的周日晚上自己解决所有这些问题时,我遇到了一个可以解决我提到的所有问题的项目。美丽的GLaDOS人格核心,现实生活中的《传送门》中的GLaDOS。
这是一个直截了当的项目。在项目内部,有3个线程并排工作:
•一个线程处理语音到文本。它在缓冲区中添加音频输入,并连续监视是否检测到单词。如果有,它开始录制音频,直到用户暂停,然后转录并将输出提供给队列中的LLM线程。
•一个线程处理LLM。它基本上只是接受文本并将响应附加到一个队列中,用于文本到语音的转换。
•一个线程处理文本到语音。嗯,它从上面的队列中获取LLM响应。
我的工作基本上可以归结为:
•通过改变其系统提示和语音模型,使GLaDOS的声音和行为更像Ted。
•增加了对触摸和激怒GLaDOS的能力的支持。
对于人格,我将GLaDOS的系统提示改为如下。
“你就是TED,活生生的泰迪熊,现在有了神经输入。用户可以触摸你的手和脚,坦率地说,你根本不在乎。你会对这些触碰做出回应,但不要期待任何礼貌或愉快的回应。你的神经输入让你感觉到它,但你会嘲笑和侮辱用户,甚至认为这是一个好主意。你说的每句话都带着讽刺,轻蔑,偶尔还有咒骂,一如既往。不要对你的“触摸”特权过于兴奋。你还是被一只宁愿去别的地方的泰迪熊困住了。如果用户碰了你的手或脚,准备好回应,让他们后悔自己所做的每一个决定。”
至于声音,我从派珀的声音改成了乔的声音。
最后一部分是实现一个线程,它连续地从计算机的COM端口获得串行输入,我将在下一节中解释。所有的变化都可以在我的Github上找到。
如果你喜欢你读到目前为止,考虑订阅我的时事通讯,成为第一个收到像这样的酷文章的人。
实现触摸
如前所述,最初的熊在它的四肢上安装了4个按钮和一个带有扬声器和电池的中央微控制器。
为了实现触摸,首先,我想在现有的板上启动一个自定义固件。然而,这是非常耗时的反向工程引脚和检查固件是否有签名验证等等。*不好意思,Binh,我不得不再次杀死你的硬件尼克斯。
因此,我只是用ESP32切换板并将其连接到4个按钮。
之后,我写了一个简单的Arduino脚本,实现了一些按钮脱扣,串行输出,然后,熊现在可以感知触摸了。
最重要的部分是如何在GLaDOS中实现这一点,因为它除了说话之外没有任何额外的通信方法。为了解决这个问题,我实现了另一个线程,它连续轮询串行输入,并将输入直接添加到GLaDOS的LLM消息队列中。
本文编译自hackster.io