Skip to main content

소개

WebSocket을 통해 저지연 실시간 음성 세션을 구성합니다. OpenAI Realtime API와 호환됩니다. 연결 후 이벤트 프로토콜로 오디오와 텍스트를 주고받으며, 음성 비서, 실시간 번역 등에 적합합니다. Base URL: wss://api.gravitex.ai/v1/realtime
일반 HTTP POST가 아닌 WebSocket 프로토콜을 사용해야 합니다. model쿼리 파라미터로 전달해야 하며, 그렇지 않으면 게이트웨이가 400을 반환합니다.

인증

WebSocket 연결 시 다음 헤더를 포함합니다:
string
필수
Bearer 토큰, 예: Bearer sk-xxxxxxxxxx
string
필수
realtime=v1 고정
브라우저에서는 WebSocket 헤더를 직접 설정할 수 없습니다. OpenAI 서브프로토콜로 키를 전달할 수 있습니다(헤더 방식과 동등, 게이트웨이에서 파싱):

연결

string
필수
실시간 모델 ID, 예: gpt-realtime-1.5, gpt-realtime-2. 현재 API Key에서 사용 가능한 모델과 일치해야 합니다.
연결 성공 시 서버는 101 Switching Protocols를 반환합니다. 이후 session.created를 수신하면 session.update를 전송해 세션을 구성합니다.

세션 구성

연결 후 session.update로 지시문, 출력 모달리티, 오디오 형식을 설정합니다:
선택 가능한 음색 (output_modalitiesaudio 포함 시): alloy · ash · ballad · coral · echo · sage · shimmer · verse · marin session.updated를 수신한 후 대화를 시작합니다.

메시지 전송

각 턴은 두 단계로 구성됩니다:
  1. conversation.item.create — 사용자 메시지 작성
  2. response.create — 모델 응답 생성 트리거

텍스트 입력

오디오 입력

녹음은 PCM16 raw bytes(WAV 헤더 없음)여야 하며 Base64로 인코딩해 전송합니다:
한 턴에 여러 입력을 조합할 수 있습니다. 예: 이미지 + 텍스트, 이미지 + 녹음:
이미지 입력 제한: 일부 업스트림(예: Azure OpenAI Realtime)은 이미지를 지원하지 않으며 input_textinput_audio만 지원합니다. 이미지 전송 시 서버 500 오류가 발생할 수 있습니다. Vision 기능은 Realtime이 아닌 Chat Completions / Responses API에서만 사용 가능합니다. Microsoft 공식 설명 참고. Base64 이미지 길이는 1,048,576자(원본 약 750 KB) 이하 권장.
메시지 작성 후 응답을 트리거합니다:

응답 수신

일반적인 서버 이벤트: 오디오 증분 필드는 audio 또는 delta일 수 있으므로 클라이언트는 둘 다 처리해야 합니다.

사용량

response.done해당 Response의 사용량만 반환하며, 세션 누적이 아닙니다. 공식 문서: “The tokens used for a Response can be read from the response.done event”. 다중 턴 대화에서는 턴별 사용량과 세션 누적 사용량을 함께 기록하는 것을 권장합니다. usage 구조 예시:

필드 설명

  1. output.text_tokens: 오디오 출력을 선택해도 자동 transcript로 텍스트 토큰이 발생하며, 정상 과금입니다. OpenAI Realtime 과금 참고.
  2. input.cached_tokens: input_tokens의 부분집합이며 추가 합산이 아닙니다. OpenAI는 cached_tokens_details(텍스트/오디오 분리)를 반환하고, 일부 업스트림(예: Azure GA)이 반환하지 않으면 게이트웨이가 텍스트/오디오 입력 비율로 추정합니다.
  3. 다중 턴 비용: 각 Response는 전체 대화 기록을 전송하므로 턴이 진행될수록 input_tokens가 커집니다. 초기 턴은 prompt cache에 히트할 가능성이 높아 할인율이 큽니다(예: gpt-realtime-2 오디오 캐시 0.40/1M,오디오입력0.40/1M, 오디오 입력 32/1M 대비 98.75% 할인). 공식 문서: “turns later in the session will be more expensive”.

Python 전체 예제

의존성: pip install websockets pyaudio
마이크 녹음, 스피커 재생, 이미지 입력, 턴별 및 누적 사용량 통계를 포함한 전체 상호작용 스크립트는 test_realtime.py를 참고하세요.

FAQ

  • 연결 400: URL에 ?model=... 쿼리 파라미터가 포함되어 있는지 확인하세요.
  • 연결 401: API Key가 유효하지 않거나 권한이 없습니다. GET /v1/models로 Key와 모델 가용성을 확인하세요.
  • 전송 후 응답 없음: session.updated를 수신했고 response.create를 전송했는지 확인하세요.
  • 500 후 연결 종료: 업스트림 오류로 WebSocket이 닫히므로 재연결이 필요합니다.
  • 오디오 무음: 24 kHz PCM16 모노인지, Base64 증분을 올바르게 디코딩했는지 확인하세요.
더 많은 이벤트 유형과 필드는 OpenAI Realtime API 문서를 참고하세요.