Pi-C.A.R.D
目录
演示
(更好的视频即将推出)
介绍
Pi-Card 是一个完全运行在树莓派上的 AI 驱动助手。它能够在对话环境中完成标准 LLM(如 ChatGPT)可以做的任何事情。 此外,如果配备了摄像头,你还可以要求 Pi-card 拍照、描述所见内容,并询问关于该图像的问题。
为什么叫 Pi-card?
树莓 Pi - 摄像头 音频 识别 设备。
如果你能想到更好的方式来强制这个缩写,请提交问题或拉取请求。
它是如何工作的?
Pi-Card 完全运行在你的树莓派上。
使用唤醒词。一旦运行 main.py
,系统将监听你的唤醒词。说出唤醒词后,你就正式进入对话。在对话中,你不需要重复唤醒词。系统将继续监听你的命令,直到你说"停止"、"退出"或"再见"之类的话。
使用按钮。如果你能弄到一个面包板、一些线和一个按钮,使用按钮来处理对话是一种更流畅的交互方式(根据我的经验)。这是通过按下按钮,然后说出你的命令来实现的。按钮是一个简单的 GPIO 按钮,可以按照 main_button.py
文件中的说明进行设置。
聊天机器人有一个可配置的对话记忆,这意味着如果你想让助手重复它说过的话,或者详细说明之前的话题,你可以这样做。为了获得更快的响应,你可以在 config.py
文件中将记忆设置为一个较小的数字。
它有多有用?
该系统旨在成为一个有趣的项目,可以作为一个 有点 有帮助的 AI 助手。由于一切都在本地完成,系统的功能和速度不会像基于云的系统那样强大或快速。然而,该系统仍然有很大的改进空间。
为什么这不是一个应用程序?
主要原因是我想创建一个完全离线且不需要任何互联网连接的语音助手。这主要是因为我想确保用户的隐私受到保护,用户的数据不会被发送到任何第三方服务器。我还想知道在完全离线的环境中,语音助手能有多强大。
使用方法
下载存储库、安装所需的软件包并按照其他设置说明操作后,你可以通过运行以下命令来运行主程序:
python main.py
或
python main_button.py
程序运行后,你可以通过说出唤醒词来开始与助手对话。默认的唤醒词是"hey assistant",但你可以在 config.py
文件中更改它。如果使用按钮版本,你可以按下按钮开始对话,或随时打断助手。
设置
软件
为了使系统尽可能快速和精简,我们使用音频转录和视觉语言模型的 C++ 实现。这是通过出色的库 whisper.cpp(用于音频转录)和 llama.cpp(用于视觉语言模型)来完成的。
在这两种情况下,请在你喜欢的位置克隆这些存储库,并将它们的路径添加到 config.py
文件中。
克隆后,请进入每个存储库,按照设置说明让模型运行起来。下面给出一些提示:
对于 llama.cpp,我们使用的是视觉语言模型功能,这与标准设置略有不同。你需要按照 LlaVA 的设置说明进行操作,但将使用的模型更新为更适合这个设备的 Moondream2。
要安装 Moondream,你需要去 HuggingFace 模型中心下载模型。我使用 Python 完成了这个操作,命令如下。再次确保将视觉模型路径添加到 config.py
文件中。
from huggingface_hub import snapshot_download
model_id="vikhyatk/moondream2"
snapshot_download(repo_id=model_id, local_dir=your/local/path, local_dir_use_symlinks=False, revision="main")
工具
为了让 pi-card 更像一个真正的助手,它可以访问几个工具。这些是通过 tool-bert 实现的,这是一个经过微调的 BERT 版本,用于决定何时访问外部信息。关于如何制作这个版本的更多信息可以在这里找到。
该模型很容易安装,但要启用工具访问,请查看 .env.example 文件,了解需要哪些密钥和秘密。
对于 whisper.cpp,你需要按照 README 中的快速入门指南进行操作。
由于这个项目依赖于公开可用的模型,根据使用的模型,这个助手的限制将与模型的限制相同。
硬件
硬件设置相当简单。你需要一个树莓派 5 Model B、一个 USB 麦克风、一个扬声器和一个摄像头。
USB 麦克风和扬声器可以插入树莓派的 USB 端口。摄像头可以连接到树莓派的摄像头端口。
我在我的设置中使用了以下硬件:
请注意,树莓派5有新的摄像头接口,因此需要新的摄像头连接器。同时,虽然这个项目主要针对树莓派5,但它也应该适用于其他设备。
关于设置GPIO按钮,我发现这个教程的前几分钟非常有帮助。
你可以自由选择,这些是对我有用的组件!
基准测试
这个表格是对各种模型响应时间的非常粗略的基准测试。
转录模型
模型 | 加载时间 | 总时间 |
---|---|---|
Whisper Tiny (en) | 0.113秒 | 1.76秒 |
Whisper Base (en) | 0.159秒 | 3.36秒 |
大型语言模型
由于这个因对话/响应的大小而异,这里只列出了大约的每秒令牌处理量。
模型 | 提示 | 评估 | ~响应时间 |
---|---|---|---|
Phi 3 Instruct (3B) (Q4_0) | 4.65令牌/秒 | 3.8令牌/秒 | 3.5秒 |
Llama 3 Instruct (8B) (Q4_0) | 2.37秒 | 2.00秒 | 5.0秒 |
Qwen2 Instruct (1.5B) (Q4_0) | - | - | 1.0秒 |
Picard (0.5B) (fp16) | - | - | 0.9秒 |
(响应时间 ~= 提示评估持续时间)
视觉语言模型
模型 | 在上下文中加载图像时间 | 开始生成时间 |
---|---|---|
Moondream2 | 62秒 | 3.5秒 |
这意味着对于视觉语言模型,最大的瓶颈是将所有"静默"图像令牌加载到LLM内存中。对于Moondream来说,这是729个图像令牌,所以需要一定的时间是可以理解的。
这是Moondream2的5月修订版,我最近没有经常使用它,但如果这个模型改用池化层,它的延迟应该会大幅下降,这将是一个巨大的改进。
超频
请自行承担风险!
我发现加快上述所有数字的一种方法是给我的树莓派超频。你可以按照这里的说明进行操作。我不建议将频率提高到3.0 GHz,而且你的机器可能甚至不允许你这么做。我只能将我的机器提高到2.6 GHz,它崩溃过一次,但除此之外工作正常,并且加快了上述所有基准测试的速度,我认为这大致与提高的时钟速度成正比。
如果你能接受设备烧毁的风险和额外的功耗,我建议你这样做。确保你有一个好的散热系统。
路线图
即将推出,但我计划在这里添加关于当前已实现的功能和未来可以做的事情的注释。以下是一些简要说明:
- 基本对话能力
- 摄像头功能
- 基准响应时间
- 测试超频
- 弄清楚如何加快Whisper的速度
- 添加更多外部服务
- 添加中断助手并提出新问题的能力
- 使用自定义调优模型
- 新的YouTube视频
- 使用带有图像令牌池化的Moondream模型
- 改进外部服务功能模型(tool-bert)
- 连接便携电源时进行测试
- 正式写下我如何进行微调和移植的过程(因为我已经忘记了)
- 将仓库Docker化以便在更多设备上测试