소개
WebSocket을 통해 저지연 실시간 음성 세션을 구성합니다. OpenAI Realtime API와 호환됩니다. 연결 후 이벤트 프로토콜로 오디오와 텍스트를 주고받으며, 음성 비서, 실시간 번역 등에 적합합니다. Base URL:wss://api.gravitex.ai/v1/realtime
일반 HTTP POST가 아닌 WebSocket 프로토콜을 사용해야 합니다.
model은 쿼리 파라미터로 전달해야 하며, 그렇지 않으면 게이트웨이가 400을 반환합니다.인증
WebSocket 연결 시 다음 헤더를 포함합니다:string
필수
Bearer 토큰, 예:
Bearer sk-xxxxxxxxxxstring
필수
realtime=v1 고정연결
string
필수
실시간 모델 ID, 예:
gpt-realtime-1.5, gpt-realtime-2. 현재 API Key에서 사용 가능한 모델과 일치해야 합니다.session.created를 수신하면 session.update를 전송해 세션을 구성합니다.
세션 구성
연결 후session.update로 지시문, 출력 모달리티, 오디오 형식을 설정합니다:
선택 가능한 음색 (
output_modalities에 audio 포함 시):
alloy · ash · ballad · coral · echo · sage · shimmer · verse · marin
session.updated를 수신한 후 대화를 시작합니다.
메시지 전송
각 턴은 두 단계로 구성됩니다:conversation.item.create— 사용자 메시지 작성response.create— 모델 응답 생성 트리거
텍스트 입력
오디오 입력
녹음은 PCM16 raw bytes(WAV 헤더 없음)여야 하며 Base64로 인코딩해 전송합니다:응답 수신
일반적인 서버 이벤트:
오디오 증분 필드는
audio 또는 delta일 수 있으므로 클라이언트는 둘 다 처리해야 합니다.
사용량
각response.done은 해당 Response의 사용량만 반환하며, 세션 누적이 아닙니다. 공식 문서: “The tokens used for a Response can be read from the response.done event”. 다중 턴 대화에서는 턴별 사용량과 세션 누적 사용량을 함께 기록하는 것을 권장합니다.
usage 구조 예시:
필드 설명
- output.text_tokens: 오디오 출력을 선택해도 자동 transcript로 텍스트 토큰이 발생하며, 정상 과금입니다. OpenAI Realtime 과금 참고.
- input.cached_tokens:
input_tokens의 부분집합이며 추가 합산이 아닙니다. OpenAI는cached_tokens_details(텍스트/오디오 분리)를 반환하고, 일부 업스트림(예: Azure GA)이 반환하지 않으면 게이트웨이가 텍스트/오디오 입력 비율로 추정합니다. - 다중 턴 비용: 각 Response는 전체 대화 기록을 전송하므로 턴이 진행될수록
input_tokens가 커집니다. 초기 턴은 prompt cache에 히트할 가능성이 높아 할인율이 큽니다(예:gpt-realtime-2오디오 캐시 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 증분을 올바르게 디코딩했는지 확인하세요.
