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 OS Lite (64-bit)를 실행하는 Raspberry Pi 5 (8GB 권장).
- AI Model: 음성 대 음성(voice-to-voice) 처리를 담당하는 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 드라이버 보드는 Pi의 GPIO 핀을 모터 출력에 연결하기 위해 10개의 납땜 접점을 필요로 합니다. 가이드는 연결이 확실하고 단락(short-circuit)이 발생하지 않도록, 특히 양극과 음극 전원 레일 사이의 연결을 확인하기 위해 "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: 일부 사용자는 구독료와 인터넷 연결 의존성을 제거하기 위해 Amazon Bedrock을 로컬 대화형 모델(예: Gemma)로 대체할 것을 제안했습니다.
- Hardware Tools: 숙련된 메이커들은 다이아고날 커터(diagonal cutters)를 사용하여 전선을 피복 벗기는 것이 최적이 아니라고 언급하며, 더 깔끔한 연결을 위해 적절한 와이어 스트리퍼(wire strippers)를 사용할 것을 권장했습니다.
- Interaction Models: 작은 모델이 백그라운드에서 응답을을 생성하고, 물리적 트리거(예: 물고기를 찌르는 행위)가 발생했을 때 재생할 오 오디오 파일을 저장하는 로컬 "생각" 생성 방식을 구현하라는 제안이 있었습니다.
일반적인 오류 해결
| 증상 | 주요 원인 | 해결 방법 |
|---|---|---|
IndentationError |
SSH 붙여넣기 시 앞부분에 공백이 추가됨 | sed -i 's/^ //' file.py를 사용하십시오 |
| 약한 입 움직임 | 모터 방향 비대칭 | Pi 헤더의 두 입 채널 플러그를 서로 바꾸십시오 |
오디오 Invalid sample rate |
잘못된 ~/.asoundrc 설정 |
arecord -l 및 aplay -l을 사용하여 카드 이름을 확인하십시오 |
| 머리가 계속 올라가 있음 | 응답 종료 이벤트가 발생하지 않음 | 모델 이벤트 대신 오디오 침묵 임계값을 기준으로 머리 상태를 설정하십시오 |