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 ${process.env.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' }
    }
  }));
});

오디오 스트리밍 처리

브라우저에서 마이크 입력을 받아 16kHz PCM으로 변환 후 base64 인코딩하여 전송했다.

const audioContext = new AudioContext({ sampleRate: 24000 });
const processor = audioContext.createScriptProcessor(4096, 1, 1);

processor.onaudioprocess = (e) => {
  const inputData = e.inputBuffer.getChannelData(0);
  const pcm16 = convertFloat32ToPCM16(inputData);
  const base64Audio = btoa(String.fromCharCode(...pcm16));
  
  ws.send(JSON.stringify({
    type: 'input_audio_buffer.append',
    audio: base64Audio
  }));
};

이슈

VAD 민감도 조정

기본 설정에서는 고객이 말을 마치기 전에 응답이 시작되는 경우가 잦았다. turn_detection 설정의 thresholdsilence_duration_ms를 조정해서 해결했다.

turn_detection: {
  type: 'server_vad',
  threshold: 0.7,  // 기본값 0.5에서 증가
  silence_duration_ms: 800
}

레이턴시

평균 응답 지연이 1.2초 정도였다. 실시간 상담에는 적합하지만 즉각적인 반응을 기대하는 경우 체감 지연이 있었다.

결과

간단한 문의(영업시간, 위치 안내 등)에 대해서는 만족스러운 응답 품질을 보였다. 다만 복잡한 계약 조건 설명이나 개인정보 처리 시나리오는 추가 검증이 필요했다.

프로토타입 단계에서는 충분히 가능성을 확인했고, 실제 도입을 위해서는 법률 검토와 폴백 시나리오 설계가 필요하다는 결론을 내렸다.