OpenAI Realtime API로 음성 상담 프로토타입 구축
배경
사내 고객 상담 시스템에 음성 응답 기능을 추가하는 프로젝트를 맡았다. 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'],
voice: 'alloy',
input_audio_transcription: { model: 'whisper-1' },
turn_detection: { type: 'server_vad' }
}
}));
});
VAD 처리
Server-side VAD를 사용하니 음성 구간 감지를 직접 구현할 필요가 없었다. input_audio_buffer.speech_started와 speech_stopped 이벤트로 사용자 발화를 추적했다.
ws.on('message', (data) => {
const event = JSON.parse(data.toString());
switch(event.type) {
case 'input_audio_buffer.speech_started':
console.log('사용자 발화 시작');
break;
case 'response.audio.delta':
// Base64 오디오 청크를 디코딩해서 재생
playAudioChunk(event.delta);
break;
}
});
문제와 해결
-
응답 지연: 초기 응답까지 2~3초가 걸렸다.
turn_detection.silence_duration_ms를 기본 500ms에서 300ms로 줄이니 체감 속도가 개선됐다. -
오디오 끊김: 네트워크 지터 때문에 재생이 끊겼다. 작은 버퍼 큐를 두고 50ms 정도 미리 적재하는 방식으로 해결했다.
-
비용: 분당 약 $0.06으로 기존 TTS+STT 조합보다 비쌌다. 상담 시간 제한을 두는 것으로 정리했다.
결과
프로토타입 데모는 성공적이었다. 다만 프로덕션 투입은 비용 검증이 더 필요할 것 같다. Function calling과 통합하면 상담 중 DB 조회도 가능할 것으로 보인다.