저지연 스트리밍과 자연스러운 인터럽션 처리는 AI 음성 에이전트를 로봇처럼 느끼게 하지 않는 핵심 공학 과제다. 이 튜토리얼은 Node.js, Twilio Conversation Relay, OpenAI를 사용해 토큰 단위 스트리밍과 AbortController 기반 인터럽션 핸들링을 구현하고, SSML 마크업과 시스템 프롬프트 설계로 AI 음성의 자연스러움을 개선하는 방법을 단계별로 다룬다.
핵심 포인트- 저지연의 핵심: OpenAI 응답을 요청-응답 방식 대신 토큰 단위로 WebSocket을 통해 Twilio에 직접 스트리밍해 첫 응답 500ms 이내 달성
- 인터럽션 처리 체계: `interrupt` 이벤트 수신 시 AbortController.abort()로 OpenAI 스트림 중단 + Twilio에 `{type: "clear"}` 전송으로 오디오 버퍼 즉시 비움
- ElevenLabs TTS + Deepgram Nova-3 조합이 자연스러운 음성 출력의 기반
- 시스템 프롬프트에 구어체 필러("Oh...", "Uhm..."), 마크다운/이모지 금지, 숫자 영문 발음 지침 삽입
- SSML `<break time="200ms"/>` 태그로 LLM이 출력한 `...`을 명시적 호흡 구간으로 변환
상세 정리- `express-ws`로 WebSocket 서버 구성, `prompt`(발화)와 `interrupt`(인터럽션) 이벤트 분리 처리
- 각 발화 시작 시 새 `AbortController` 생성; 이전 컨트롤러 즉시 abort로 이전 스트림 강제 종료
- OpenAI `gpt-4o` 스트리밍 API의 `signal` 파라미터에 AbortController 연동
- 스트리밍 루프: `data:` 라인 파싱 → `choices[0].delta.content` 추출 → Twilio WebSocket으로 `{type: "text", token, last}` 전송
- 마지막 토큰에 `last: true` 플래그로 Twilio에 발화 턴 종료 신호 전달
- TwiML 설정: `interruptible="any"`, `ignoreBackchannel="true"`, `eotThreshold="0.8"`, `speechModel="nova-3-general"`
- 시스템 프롬프트: 2문장 이내 응답, 콤마/말줄임표로 자연스러운 호흡, 구어체 필러, 불릿/이모지 금지
- tool calling 연동 시 실시간 항공편 조회 등 실제 데이터 처리로 확장 가능
왜 읽나토큰 스트리밍과 AbortController 인터럽션 패턴을 Node.js로 구현해 AI 음성 에이전트의 자연스러움과 반응성을 동시에 끌어올리는 실전 코드 가이드다.