OpenAI Realtime API 음성 대화 구현 후기
배경
고객 상담 자동화 프로젝트에서 음성 기반 대화 기능이 필요했다. 기존에는 Whisper API로 음성을 텍스트로 변환하고, GPT-4o로 응답을 생성한 뒤, TTS API로 다시 음성화하는 3단계 파이프라인이었다. OpenAI의 Realtime API가 이 과정을 하나로 통합한다는 점에서 도입을 검토했다.
구현
WebSocket 기반으로 동작하며, 클라이언트에서 오디오 스트림을 직접 전송할 수 있다.
const ws = new WebSocket(
'wss://api.openai.com/v1/realtime?model=gpt-4o-realtime-preview-2024-10-01',
{
headers: {
'Authorization': `Bearer ${OPENAI_API_KEY}`,
'OpenAI-Beta': 'realtime=v1'
}
}
);
ws.on('open', () => {
ws.send(JSON.stringify({
type: 'session.update',
session: {
modalities: ['text', 'audio'],
instructions: '당신은 친절한 고객 상담원입니다.',
voice: 'alloy',
input_audio_transcription: { model: 'whisper-1' }
}
}));
});
ws.on('message', (data) => {
const event = JSON.parse(data);
if (event.type === 'response.audio.delta') {
playAudio(event.delta);
}
});
이슈
1. 레이턴시
초기 응답까지 평균 800ms 정도 소요됐다. 기존 파이프라인보다 빠르지만, 실시간 대화로 느끼기엔 미묘한 지점이었다. temperature를 낮추고 max_response_output_tokens를 제한해 개선했다.
2. 비용
입력 $100/1M 토큰, 오디오 출력 $200/1M 토큰으로 기존 대비 약 2배였다. 세션 타임아웃을 30초로 설정하고, 침묵 감지 로직을 추가해 불필요한 연결을 줄였다.
3. 에러 핸들링
WebSocket 재연결 로직이 필수였다. exponential backoff 방식으로 구현했고, 네트워크 불안정 시 자동 복구되도록 했다.
결과
파이프라인이 단순해지면서 유지보수 포인트가 줄었다. 음성 품질도 만족스러웠고, 사용자 피드백도 긍정적이었다. 다만 비용 문제로 프리미엄 고객에게만 제한적으로 제공하기로 했다.