BillAI Bass: 使用 Strands Agents 和 Amazon Nova 2 Sonic 构建 AI 驱动的语音助手
BillAI Bass: 使用 Strands Agents 和 Amazon Nova 2 Sonic 构建 AI 驱动的语音助手
BillAI Bass 是一个 AI 驱动的仿生项目,它将 Big Mouth Billy Bass 转换为实时语音助手。通过将 Raspberry Pi 5 与 Strands Agents 的双向流式传输 (BidiAgent) 以及 Amazon Bedrock 上的 Amazon Nova 2 Sonic 集成,这条鱼可以进行低延迟的语音对话,并伴有同步的嘴部动作、头部转动和尾部摆动。
技术架构
该项目利用双向流式传输架构来最小化延迟,并将物理动作与音频输出同步。
核心组件
- Brain: Raspberry Pi 5 (建议使用 8GB 版本) 运行 Raspberry Pi OS Lite (64-bit)。
- AI Model: 通过 Amazon Bedrock 使用 Amazon Nova 2 Sonic,负责语音对语音的处理。
- Orchestration: Strands Agents
BidiAgent管理 Pi 与云端模型之间的双向音频流。 - Hardware Interface: 一个 MX1508 双 H 桥电机驱动器,将 Pi 的 3.3V GPIO 信号转换为驱动鱼类电机所需的 5V 电流。
- Audio I/O: USB mini speaker 和 USB gooseneck microphone。
唇形同步与动画逻辑
由于 AI 模型流式传输音频的速度快于播放速度,该项目并不根据数据到达来触发动画。相反,它实现了一个自定义的音频输出类 (BillyBody),用于实时测量作用于扬声器的音频字节的响度。
- Mouth Movement: 由平滑的响度水平驱动;当音频超过特定阈值 (
MOUTH_OPEN) 时,激活嘴部电机。 - Head Position: 当音频正在积极播放时,头部抬起,在一段静音 (
SILENCE阈值) 后落下。 - Tail Flapping: 由响度峰值 (
EMPHASIS阈值) 或特定的对话事件(如响应的开始或完成)触发。
硬件实现
电机配置
该项目是为现代的 "Gemmy" 版本 Billy Bass 设计的,该版本使用两个电机:一个用于嘴部,另一个共享电机负责根据旋转方向控制头部和尾部。
布线与电源
一个关键要求是使用 27W USB-C PD 电源。标准的手机充电器通常会导致 Raspberry Pi 限制 USB 端口的功率,这可能导致电机驱动器或音频设备的稳定性问题。
焊接与组装
MX1508 驱动板需要焊接 10 个焊点,将 Pi 的 GPIO 引脚连接到电机输出端。指南强调进行 "tug test" (拉力测试) 和 "bridge check" (桥接检查) 以确保连接牢固且没有短路,特别是正负电源轨之间。
云端集成与安全
最低权限 IAM 设置
为了防止与在物理设备上存储 AWS 密钥相关的安全风险,该项目采用了严格限定范围的 IAM 用户。该策略被限制在 us-east-1 区域内对特定模型资源 (amazon.nova-2-sonic-v1:0) 的单个操作 (bedrock:InvokeModelWithBidirectionalStream)。
生产级身份验证
对于大规模部署,该项目提供了一个可选路径,使用 AWS IoT Core。这用 X.509 证书取代了长期有效的访问密钥。设备使用这些证书向 IoT 凭据端点请求临时 IAM 凭据,从而确保 SD 卡上不存储任何永久性秘密。
社区洞察与不同观点
虽然该项目展示了高度的集成度,但 Hacker News 上的社区讨论强调了一些技术考虑因素:
- Local vs. Cloud: 一些用户建议使用本地对话模型(如 Gemma)取代 Amazon Bedrock,以消除订阅费用并减少对互联网连接的依赖。
- Hardware Tools: 有经验的创作者(makers)指出,使用斜口钳来剥线是次优的方案,并建议使用合适的剥线钳以获得更干净的连接。 。
- Interaction Models: 有建议提出实现本地 "thought" (思考) 生成,即由一个小模型在后台生成响应,并将其保存为音频文件,以便在物理触发(如戳一下鱼)时播放。
常见故障排除
| 症状 | 主要原因 | 解决方案 |
|---|---|---|
IndentationError |
SSH 粘贴时添加了前导空格 | 使用 sed -i 's/^ //' file.py |
| Weak mouth movement | 电机方向不对称 | 在 Pi header 上交换两个嘴部通道的插头 |
Audio Invalid sample rate |
~/.asoundrc 配置错误 |
使用 arecord -l 和 aplay -l 验证卡名称 |
| Head stays up | 响应结束事件未触发 | 将头部状态基于音频静音阈值而非模型事件来设定 |