BillAI Bass: Strands Agents と Amazon Nova 2 Sonic を使用した AI 搭載音声アシスタントの構築

BillAI Bass: Strands Agents と Amazon Nova 2 Sonic を使用した AI 搭載音声アシスタントの構築

BillAI Bass は、Big Mouth Billy Bass アニマトロニクスをリアルタイム音声アシスタントに変換する AI 搭載プロジェクトです。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 スピーカーおよび USB gooseneck マイク。

リップシンクとアニメーションロジック

AI モデルが音声を再生するよりも速くストリーミングする場合があるため、このプロジェクトではデータの到着に基づいてアニメーションをトリガーするのではなく、スピーカーに届くオーディオバイトの音量をリアルタイムで測定するカスタムオーディオ出力クラス (BillyBody) を実装しています。

  • Mouth Movement: 平滑化された音量レベルによって駆動されます。オーディオが特定のしきい値 (MOUTH_OPEN) を超えると、口のモーターが作動します。
  • Head Position: オーディオがアクティブに再生されている間は頭が上がり、無音状態 (SILENCE しきい値) が続いた後に下がります。
  • Tail Flapping: 音量のピーク (EMPHASIS しきい値) または、応答の開始や完了といった特定の会話イベントによってトリガーされます。

ハードウェアの実装

モーター構成

このプロジェクトは、モーターを2つ使用する現代的な "Gemmy" バージョンの Billy Bass 用に設計されています。1つは口用、もう1つは回転方向によって頭と尾の両方を制御する共有モーターです。

配線と電源

重要な要件は、27W USB-C PD 電源を使用することです。標準的な携帯電話用充電器では、Raspberry Pi が USB ポートへの電力供給を制限することがあり、モータードライバーやオーディオデバイスの不安定さを招く可能性があります。

はんだ付けと組み立て

MX1508 ドライバーボードには、Pi の GPIO ピンをモーター出力に接続するために 10 個のはんだ付け箇所があります。ガイドでは、接続が確実で短絡していないこと(特に正極と負極の電源レール間)を確認するために、"tug test"(引っ張りテスト)と "bridge check"(ブリッジチェック)を推奨しています。

クラウド統合とセキュリティ

最小権限の IAM セットアップ

物理デバイスに AWS キーを保存することによるセキュリティリスクを防ぐため、このプロジェクトでは厳格にスコープされた IAM ユーザーを採用しています。ポリシーは、us-east-1 リージョンにおける特定のモデルリソース (amazon.nova-2-sonic-v1:0) に対する単一のアクション (bedrock:InvokeModelWithBidirectionalStream) に限定されています。

本番環境レベルの ID 管理

大規模な展開を行う場合、プロジェクトでは AWS IoT Core を使用するオプションパスを提供しています。これにより、長期間有効なアクセスキーを代わりに X.509 証明書を使用します。デバイスはこれらの証明書を使用して IoT 認証情報エンドポイントから一時的な IAM 認証情報をリクエストし、SD カードに永続的なシークレットが残らないようにします。

コミュニティの洞察と反論

プロジェクトは高度な連携を実現していますが、Hacker News でのコミュニティの議論では、いくつかの技術的な検討事項が指摘されています。

  • Local vs. Cloud: 一部のユーザーは、サブスクリプション料金やインターネット接続への依存を回避するため、Amazon Bedrock をローカルの対話型モデル(Gemma など)に置き換えることを提案しています。

  • Hardware Tools: 経験豊富なメイカーは、ワイヤーを剥くためにニッパー(diagonal cutters)を使用することは最適ではなく、ワイヤー剥き器(wire strippers)を使用することで、より綺麗な接続を実現することを推奨しています。

  • Interaction Models: 小規模なモデルがバックグラウンドで応答を生成し、物理的なトリガー(魚を突くなど)があった際に再生するためのオーディオファイルを保存しておく、ローカルな "thought" 生成の実装を提案する声もありました。

一般的な失敗のトラブルシューティング

症状 主な原因 解決策
IndentationError SSH ペースト時に先頭にスペースが追加された sed -i 's/^ //' file.py を使用する
口の動きが弱い モーターの回転方向の非対称性 Pi のヘッダーにある2つの口用チャンネルのプラグを入れ替える
オーディオ Invalid sample rate 不正確な ~/.asoundrc 設定 arecord -laplay -l を使用してカード名を検証する
頭が上がったまま 応答終了イベントが発発しない モデルのイベントではなく、オーディオの無音しきい値に基づいて頭の状態を制御する

Sources