明星机器人初创公司 Figure,携手 OpenAI 发布令人震撼的全新机器人演示。短短几周内,自 3 月 1 日宣布获得 OpenAI 等巨头投资后,Figure 迅速融合了 OpenAI 的前沿多模态大模型技术。这一突破让我萌生了一个大胆想法——自制一个由大模型加持的玩具,姑且叫他 Figure 3000 吧。
话不多说,先看看我的 Figure 01 平替版 Figure 3000 效果怎么样。
大家可以看到,虽然效果上对标 Figure 01 还是有些差距的,但是 Figure 3000 在成本上做到了遥遥领先,千元以内没有对手:
-
硬件成本在千元以内,主要是火火兔 G6 模具和 FoloToy Core
-
语音识别和语音合成使用阿里灵杰 AI 开放服务,免费 2 个月,先用再说
-
大模型在自己的 MacbookPro 上运行,四舍五入免费
我也把 DIY 的过程记录下来,希望能帮助到大家。
01
—
如何工作的?
先说说工作原理吧,方便大家理解,主要有三个关键步骤:
-
录音:通过 UDP 接收玩具发送的实时录音数据,并调用 STT(声音转文字)API 将声音转换成文字。
-
思考:在接收到之前的文字后,将立即调用 LLM(大型语言模型)API,以流式方式获取 LLM 生成的句子。然后,调用 TTS(文字转声音)API 将句子转换成人类的语音。
-
播放音频:玩具将接收由 FoloToy 服务器生成的 TTS(文字转声音)音频文件流,并按顺序播放。
02
—
开始前的准备
在开始制作你的 LLM(大型语言模型)玩具之前,了解所需的硬件、软件和技术知识至关重要。本节将指导你准备所有必需品,确保顺利开始。
硬件
FoloToy Core:GPT AI 语音交互核心板,作为项目的大脑,使得玩具能够与 AI 进行语音互动。(购买时,请提供我的促销代码 F-001-2 以获得折扣。)
玩具模具: 必须包含基础部件,如麦克风、扬声器、按钮、开关和电源等。这里我用了火火兔 G6 模具,因为它的外观和尺寸都很适合我的项目。家里的小朋友也喜欢这个玩具。
服务器
利用你自己的机器,比如 MacBookPro,确保你的玩具有一个可靠的后端来处理和响应语音交互。或者,用云服务器,比如阿里云、腾讯云等,步骤是一样的。
知识储备
-
Docker(必须):理解 Docker 对于在容器中部署软件至关重要,使你的项目便携且可扩展。我用它来启动 Folo 服务器。
-
MQTT(可选):如果你目标是进行高级定制,熟悉 MQTT(一种轻量级消息传递协议)将对于玩具和服务器之间的通信非常有益。
-
EMQX(可选):用于物联网、工业物联网和连接车辆的开源 MQTT 代理。用于管理你的玩具。
-
ollama(可选):如果你想在本地运行大型语言模型,这是一个不错的选择。
服务和注册
要让你的玩具变得生动,你需要访问特定的 AI 服务。对于这个项目,我选择了使用阿里灵杰 AI 开放服务,因为它提供了免费的语音识别和语音合成服务。你也可以选择其他服务。对于大型语言模型,我用了本地部署的 llama2,你可以根据自己喜好选择,基本上都是兼容的。
-
TTS(文本转语音):阿里的语音识别效果上还是不错的,足以满足日常交流的需求。
-
LLM(大型语言模型):利用大语言模型来理解和生成类似人类的文本响应,当然各个模型我都进行了尝试,总的来说贵有贵的道理,但是我还是选择了本地部署的 llama2。
-
STT(语音转文本):阿里的语音合成效果上还是不错的,有上百个角色可以切换,满足不同的兴趣爱好。
如果你使用的是各种大语言模型,你需要注册并获取 API 密钥,类似 sk-xxx,这个是你调用 API 的凭证。阿里的灵杰 AI 开放服务,你需要注册、创建应用并获取 app_key,access_key_id,access_key_secret。
03
—
组装你的玩具
现在是时候将所有部件组合起来,制作你自己的 LLM(大型语言模型)玩具了。
总体步骤如下,建议先观看视频教程[1]。
-
检查 G6 的录音和播放是否正常。
-
使用螺丝刀拧开 G6 背部的 6 颗螺丝。
-
小心打开 G6 的外壳,拔掉主板上所有的插头,首先拔掉电源插头,插头上有胶,可以使用美工刀轻轻切开,确保不要切到手。
-
拧下主板上的 4 颗螺丝并取下主板。
-
用 FoloToy 的主板替换原来的主板,并拧紧 3 颗螺丝以固定。
-
插入麦克风、灯、扬声器和电源插座,最后插入电源插座。
-
插入所有插座后,不要立刻关闭外壳或安装螺丝。首先打开/关闭兔子尾巴上的开关,看新安装的灯是否能够打开并以蓝色慢慢闪烁。
-
如果没有问题,安装外壳并拧紧螺丝以完成更换过程。
04
—
设置服务器
强大的后端支持是使你的 LLM 玩具理解和响应语音命令的关键。本节将教你如何克隆服务器代码库、配置服务器以及启动 Docker 容器,以确保你的玩具拥有稳定的后端支持。
首先从 GitHub 克隆 Folo 服务器代码库。
git clone git@github.com:FoloToy/folotoy-server-self-hosting.git
然后在 docker-compose.yml 文件中将基础服务器配置更改为你自己的配置。
名称 | 描述 | 示例 |
---|---|---|
AUDIO_DOWNLOAD_URL | 音频文件的 URL。 | http://192.168.x.x:8082 |
SPEECH_UDP_SERVER_HOST | 服务器的 IP 地址。 | 192.168.x.x |
LLM_TYPE | LLM 服务类型 | ollama |
OLLAMA_API_BASE | LLM API 地址 | http://host.docker.internal:11434 |
OLLAMA_MODEL | LLM 模型 | llama2 |
STT_TYPE | 语音识别服务类型 | aliyun-asr |
ALIYUN_ASR_ACCESS_KEY_ID | 阿里云语音识别的 access_key_id | xxx |
ALIYUN_ASR_ACCESS_KEY_SECRET | 阿里云语音识别的 access_key_secret | xxx |
ALIYUN_ASR_APP_KEY | 阿里云语音识别的 app_key | xxx |
TTS_TYPE | 语音合成服务类型 | aliyun-tts |
ALIYUN_TTS_ACCESS_KEY_ID | 阿里云语音合成的 access_key_id | xxx |
ALIYUN_TTS_ACCESS_KEY_SECRET | 阿里云语音合成的 access_key_secret | xxx |
ALIYUN_TTS_APP_KEY | 阿里云语音合成的 app_key | xxx |
注:阿里云的语音识别和语音合成的配置用同一个配置就行。
然后在 config/roles.json
文件中配置你的角色,这里是一个最小示例,完整配置请参考 FoloToy 文档。
{
"1": {
"start_text": "Hello, I'm Figure 3000. What can I do for you?",
"prompt": "You are a helpful assistant."
}
}
接着启动 docker 容器。
docker compose up -d
我在自己的机器上运行 Folo 服务器,如果你想在云端运行,几乎是相同的操作。需要注意的一点是,你需要将 1883、8082、8085、18083 和 8083 端口对公网开放,大部分云服务商都有防火墙设置,可以在控制台设置。
更多信息,请参考 FoloToy 文档[2]。
05
—
本地运行 LLM
在本地运行大型语言模型是一件有趣的事情。你可以运行 Llama 2、Gemma 以及来自世界各地的所有种类的开源大型模型,甚至是你自己训练的模型。使用 ollama,你可以轻松做到这一点。首先安装 ollama,然后运行以下命令以运行 Llama 2 模型。
ollama run llama2
然后,更改角色配置以使用本地 LLM 模型。
{
"1": {
"start_text": "Hello, what can I do for you?",
"prompt": "You are a helpful assistant.",
"llm_type": "ollama",
"llm_config": {
"api_base": "http://host.docker.internal:11434",
"model": "llama2"
}
}
}
api_base 应该是你的 ollama 服务器地址,别忘了重启 Folo 服务器以使更改生效。
docker compose restart folotoy
就这么简单,可以根据你的喜好更换为 Gemma 或其他模型,非常方便。我自己把大部分模型都试了一下,目前
gemma:7b
是最香的,期待马斯克的 Grok-1。
06
—
你的玩具交流
一切准备就绪后,就是与你的 LLM 玩具互动的时刻了。开启玩具背后的开关进行通电,耳朵中的蓝色闪烁灯表明玩具已进入配对模式。
打开你的手机或电脑,选择“FoloToy-xxxx”无线网络。片刻之后,你的手机或电脑将自动打开一个配置页面,在这里你可以设置要连接的 WiFi 网络(SSID 和密码),以及 MQTT 服务器地址(如 192.168.x.x)和端口号(保持默认的 1883)。
配置完成并连接到服务器后,按下中间的大圆形按钮开始对话。你停止说话后,FoloToy 将发出哔的一声,表示录音结束。
周围的 7 个圆形小按钮是角色切换按钮。点击后,角色切换即刻生效。
07
—
调试
无论是服务器还是玩具,你可能会遇到一些技术问题。本节将提供一些基本的调试技巧和工具,帮助你诊断和解决可能的问题,确保你的 LLM 玩具能够顺畅运行。
服务器调试
要检查服务器日志,请运行以下命令。
docker compose logs -f
在
docker-compose.yml
文件中可以设置 LOG_LEVEL 来控制日志级别。
玩具调试
Folo Toy 提供了基于 USB 串口的简便调试方式。你可以使用 Folo Toy Web 工具 来调试玩具。
-
使用 USB 线将玩具与你的电脑连接。
-
打开 Folo Toy Web 工具,然后点击“控制台”按钮以连接到玩具。
-
连接后,你应该能在控制台中看到设备的实时日志。
玩具上还有一个 LED 灯,它会以不同的颜色指示玩具的状态。
MQTT 调试
打开 EMQX Dashboard 检查 MQTT 消息以及设备连接状态等。默认的用户名是 admin,密码是 public。无论如何,在你登录后将密码更改为一个安全的密码。
08
—
高级定制
Folo Toy 还有很多高级的玩法,这里做个简单介绍,抛砖引玉。这一部分适合有一定技术基础的用户,如果你是初学者,可以先跳过。
使用 CloudFlare AI 网关
Cloudflare 的 AI 网关让你能够获得对 AI 应用的可见性和控制权。通过将你的应用连接到 AI 网关,你可以通过分析和日志收集了解人们如何使用你的应用,然后利用缓存、速率限制以及请求重试、模型回退等功能来控制应用的规模。首先,你需要创建一个新的 AI 网关。
然后编辑 docker-compose.yml
文件,将 OPENAI_OPENAI_API_BASE 更改为你的 AI 网关地址,像这样:
services:
folotoy:
environment: OPENAI_OPENAI_API_BASE=https://gateway.ai.cloudflare.com/v1/${ACCOUNT_TAG}/${GATEWAY}/openai
然后你会有一个仪表板,可以看到关于请求、令牌、缓存、错误和成本的指标。
角色语音定制
通过更改角色配置文件中的 voice_name
字段,你可以自定义角色的语音。
Edge TTS 提供了许多可供选择的语音,像这样配置就行:
{
"1": {
"tts_type": "edge-tts",
"tts_config": {
"voice_name": "zh-CN-shaanxi-XiaoniNeural"
}
}
}
这样你的角色就能说陕西话了。
还有个更好玩的,阿里云云语音合成支持个性化人声定制,你可以用自己的声音进行训练,然后在角色配置文件中使用你的声音。这样就能用自己的分身给小朋友讲故事了,是不是很有趣?
声音训练完后会得到一个声音调用 ID,把这个 ID 放到角色配置文件中的 voice_id
字段就行。
{
"1": {
"tts_type": "aliyun-tts",
"tts_config": {
"voice_id": "voice-xxxxxxx"
}
}
}
知识库支持
对于更高级别的定制,比如知识库的支持。建议使用 Dify,它融合了 Backend as Service 和 LLMOps 的理念,涵盖了构建生成式 AI 原生应用所需的核心技术栈,包括一个内置 RAG 引擎。使用 Dify,你可以基于任何模型自部署类似 Assistants API 和 GPTs 的能力。重点说一下内置的 RAG 引擎,它是一个基于检索的生成式模型,可以用于问答、对话、文档摘要等任务。Dify 包括各种基于全文索引或向量数据库嵌入的 RAG 能力,允许直接上传 PDF、TXT 等各种文本格式。把你的知识库上传,就不用担心玩具不清楚背景知识而瞎扯了。
dify 可以自行部署 或者直接使用 cloud 版本 。在Folo 上的配置也非常简单:
{
"1": {
"llm_type": "dify",
"llm_config": {
"api_base": "http://192.168.52.164/v1",
"key": "app-AAAAAAAAAAAAAAAAAAa"
}
}
}
自定义玩具外形
从工作原理来说,任意玩具都能够进行改造。Folo Toy 还提供了八爪鱼 AI 开发套件,它可以将任何普通的玩具转变为一个智能对话玩具。这款芯片小巧轻便,可以轻易地放入任何类型的玩具中,无论是毛绒玩具、塑料玩具,还是木制玩具,都能轻松适应。
我 DIY 了个陕西话的仙人掌。发挥你的想象力,你可以把它放进你喜欢的玩具中,动起手来也不是特别复杂:
-
把玩具打开
-
把八爪鱼 AI 开发套件放进去
-
关上玩具
服务端仍然是用的同一个,可以通过 sn 给不同的玩具分配不同的角色,这里就不展开了,可以查看官网的配置文档。
安全须知
请注意,绝对不要将密钥公布在如 GitHub 这样的公共平台上,否则密钥可能会被滥用。如果你的密钥被泄露,请立即在平台上删除并重新生成一个新的密钥。
你还可以在 docker-compose.yml
中使用环境变量,并在启动容器时传入,以避免在代码中暴露密钥。
services:
folotoy:
environment:
OPENAI_OPENAI_KEY=${OPENAI_OPENAI_KEY}
OPENAI_OPENAI_KEY=sk-...i7TL docker compose up -d
如果你希望使 FoloToy 服务器在互联网上公开可用,强烈建议加强 EMQX 服务的安全性,并且只允许通过密码访问 EMQX。
09
—
送一波粉丝福利
DIY 过程中遇到了各种问题,跟 FoloToy 团队也联系上了,他们的技术支持非常给力,帮助我解决了很多问题。如果想购买这款玩具,可以直接在淘宝上搜索 FoloToy(AI 智趣玩具),产品做得确实不错,这里给他们做个友情推广。
购买 Folo Toy 产品,在联系客服时提供我的促销代码 F-001-2,即可享受折扣。购买 Fofo G6 整机可以节省 20 元,购买 Octopus Dev Suit 可以节省 15 元,其他大部分商品也可享受10元折扣,具体请联系客服咨询。
参考:
[1]: https://www.bilibili.com/video/BV1kC4y157od/
[2]:https://docs.folotoy.com/zh/docs/configuration/roles_config/