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 -laplay -l 验证卡名称
Head stays up 响应结束事件未触发 将头部状态基于音频静音阈值而非模型事件来设定

Sources