Twilio Voice와 ConversationRelay, FastAPI, OpenAI를 조합해 ISS 위치, 가시 통과 예측, 하늘 보고, 우주 소음을 전화로 안내하는 음성 우주 안내 서비스를 구축한 과정을 다룬다. 결정론적 API와 LLM을 조합한 인텐트 라우팅 설계와 전화 통화 환경 특화 출력 처리가 핵심이다.
핵심 포인트- 인텐트 라우팅 계층 구조: 확정적 우주 API(ISS 위치/통과 예측) → 큐레이션 오디오(우주 소음) → LLM(오픈엔드 질문). LLM 호출을 마지막 수단으로 두어 신뢰성과 지연 시간 개선.
- 각 통화마다 인메모리 세션 상태로 대화 이력, 위치 데이터, 대기 오디오 태스크를 추적. 프로덕션 스케일링 시 Redis 또는 스티키 라우팅으로 이전 필요.
- 음성 친화적 출력 처리: TTS 출력에서 Markdown, URL, 특수 문장 부호를 사전 제거 — 음성으로 들을 때 어색한 요소 차단.
- ISS 추적은 Open Notify(실시간 위치), N2YO visual passes 엔드포인트(가시 통과 예측) 사용. 하늘 보고는 Skyfield 천문학 라이브러리로 머리 위 별자리/행성 계산.
- Azure Container Apps(최소 1개 워밍 레플리카)로 배포해 콜드 스타트 방지. 세션 상태가 인메모리이므로 수평 스케일링 불가.
상세 정리- 아키텍처 개요: 수신 전화 → Twilio → Python WebSocket 서버(FastAPI) → 인텐트 라우터 → 적절한 핸들러(API/오디오/LLM) 선택 → ConversationRelay로 음성 출력.
- 인텐트 라우팅 설계: 사용자 입력을 정규화 + 분류 후 핸들러 선택. "우주 정거장 어디야?" 같은 질문은 ISS API로, "우주 소리 들려줘"는 큐레이션 오디오로, 자유 형식 질문만 OpenAI로 처리.
- ISS 추적: Open Notify API로 실시간 위도/경도 위치 조회. N2YO visual passes API로 관찰자 위치 기반 ISS 가시 통과 시간 예측.
- 하늘 보고: Skyfield 라이브러리가 현재 위치에서 보이는 별자리와 행성을 계산. 위치 정보는 필요한 기능 사용 시에만 요청(최소 권한 UX).
- 우주 소음: NASA 소니피케이션과 기록된 우주 현상 오디오를 큐레이션. LLM 생성이 아닌 준비된 콘텐츠 사용으로 신뢰성 확보.
- 세션 관리: 통화별 인메모리 상태(대화 이력, 위치, 대기 오디오). 프로덕션 수평 스케일링 시 Redis 또는 스티키 라우팅이 필요함을 명시.
- 음성 친화적 출력: TTS 전달 전 텍스트에서 Markdown 마커, URL, 음성 어색 특수문자 제거. 음성 AI에서 자주 간과되는 처리 단계.
- 우아한 저하: 알 수 없는 요청과 침묵 처리를 위한 폴백 경로 구현.
- 배포: Azure Container Apps, 최소 1개 워밍 레플리카로 콜드 스타트 방지. 상태를 외부 저장소로 이전하기 전까지 단일 인스턴스 운영.
- 설계 패턴 범용성: 결정론적 라우팅 우선 + 신선 데이터용 API + 오픈엔드 질문용 LLM 조합은 천문학 외 다양한 음성 AI 앱에 적용 가능.
왜 읽나Twilio ConversationRelay와 Python으로 음성 AI 서비스를 구축하면서 인텐트 라우팅, 세션 관리, 음성 친화적 출력 처리 설계 패턴을 실제 구현으로 확인하려는 개발자.