개요
Realtime 모델은 장기 유지되는 WebSocket 연결 위에서 동작합니다. 오디오가 들어오고, 오디오가 나가며, 모델은 문장 중간에도 중단될 수 있습니다. 즉, “녹음 → 업로드 → 대기 → 재생” 주기가 없습니다. ASR + 텍스트 모델 + TTS를 이어 붙이는 방식과의 차이는 이것이 엔드투엔드라는 점입니다. 모델이 어조, 멈춤, 감정을 직접 듣고, 직접 말합니다. 지연 시간은 1초 미만 수준입니다. APIYI는 현재 2개 프로토콜에 걸친 4개 모델을 제공하며, 하나의 엔드포인트와 하나의 키를 공유합니다.gpt-realtime-2.1/gpt-realtime-2.1-mini— OpenAI Realtime GA 프로토콜qwen3.5-omni-plus-realtime/qwen3.5-omni-flash-realtime— Alibaba Cloud Model Studio 프로토콜
server_vad 및 semantic_vad 턴 감지, 결과 주입을 포함한 완전한 함수 호출 왕복, 이미지 입력, 그리고 모달리티별로 분리된 usage. 위의 모든 항목은 4개 모델 모두에서 검증되었습니다(2026-08-24, UTC+8).model 매개변수만 바꾸면 작동하지 않습니다 — 이것이 압도적으로 가장 흔한 통합 실패입니다. 차이는 총 6개 필드와 3개 이벤트 이름이며, 아래 “프로토콜 비교”에 모두 정리되어 있습니다.베타 액세스 요청
API 매뉴얼
키와 그룹
호출 로그
AI 에이전트가 통합을 수행하게 하십시오
.md를 덧붙이십시오), 귀하의 스택에 맞는 코드를 작성합니다 — 두 가지 필드 패밀리, 샘플 레이트 기준선, 취소 시맨틱, 유휴 연결 끊김이 모두 요구사항에 반영되어 있습니다.코딩 에이전트에게 Realtime 음성 통합 또는 문제 해결을 맡기십시오. Codex, Claude Code, Cursor 및 유사 도구에 복사해 붙여 넣으십시오.
이 프롬프트가 막아 주는 문제
이 프롬프트가 막아 주는 문제
Realtime Voice를 위한 APIYI를 선택해야 하는 이유
하나의 키, 네 개의 모델
wss endpoint, 동일한 인증입니다. 모델을 전환하려면 model 매개변수와 이에 맞는 필드 템플릿만 변경하면 됩니다. 별도의 벤더 계정을 유지할 필요가 없습니다.직접 접근, 해외 설정 불필요
api.apiyi.com에 접근할 수 있습니다. 상위 벤더 계정, 본인 인증 또는 선결제가 필요하지 않습니다.프로토콜 차이가 이미 매핑되어 있습니다
텍스트로 하는 무상 자체 테스트
측정된 지연 시간과 동시 실행 수
베타 기간 동안의 직접 지원
핵심 기능
양방향 streaming, 중단 가능
response.cancel를 보낼 수 있습니다. 세션은 유지되고 컨텍스트는 보존됩니다. 네 가지 모델 모두에서 검증되었습니다.두 가지 턴 감지 모드
server_vad는 무음 지속 시간에 따라 분할하고, semantic_vad는 의도에 따라 분할합니다(“uh-huh” 같은 군더더기 단어를 더 잘 무시합니다). 두 모드 모두 네 가지 모델에서 검증되었습니다.전체 함수 호출 루프
function_call_output가 결과를 주입하며, 모델이 계속 말합니다. 네 가지 모델 모두에서 엔드투엔드로 검증되었습니다.이미지 입력, 모달리티별 사용량
usage는 텍스트 / 오디오 / 이미지 tokens를 각각 반환하므로 비용을 귀속할 수 있습니다. 네 가지 모델 모두에서 검증되었습니다.지원되는 모델
가격
gpt-realtime-2.1의 경우 오디오 입력 $32 vs 텍스트 입력 $4; 오디오 출력 $64 vs 텍스트 출력 $24). 통합 중에는 텍스트 전용으로 실행하고 연결이 검증되면 오디오로 전환하십시오 — 아래의 “텍스트로 시작”을 참조하십시오.실시간 GA 프로토콜
모델 스튜디오 프로토콜
과금 항목이 다릅니다. 이미지 입력은 텍스트 요금제에 포함되며, 출력은 “텍스트만”과 “텍스트 + 오디오”로 나뉩니다(후자에서는 오디오 부분만 해당 요율로 과금됩니다).액세스 그룹
기술 사양
측정된 지연 시간 및 동시 실행 수
2026-08-24 (UTC+8)에 공개api.apiyi.com 경로를 통해, 20개 동시 세션 × 2개 모델, 단일 턴 텍스트 전용 교환으로 측정:
엔드포인트
model 쿼리 파라미터로 어떤 모델에 연결할지 선택합니다.
⚠️ 프로토콜 비교 (모델을 전환하기 전에 읽으십시오)
두 계열은 엔드포인트, 인증 방식, 전체 이벤트 흐름을 공유합니다. 차이점은session.update 필드 구조와 일부 서버 이벤트 이름에 집중되어 있습니다.
요청 필드 비교
서버 이벤트 비교
session.created, session.updated, conversation.item.create, input_audio_buffer.append, input_audio_buffer.commit, response.create, response.cancel, response.done — 는 양쪽에서 이름이 동일합니다.
두 개의 최소 session.update 페이로드
같은 내용을 두 번 쓴 것입니다. 그대로 복사하십시오. Model Studio 프로토콜:텍스트로 시작하기: 텍스트 채널의 용도와 세 단계 자가 테스트
오디오 파이프라인에는 마이크 캡처, 리샘플링, 청킹, 턴 감지가 포함됩니다. 어떤 연결이라도 끊어지면 “아무 일도 일어나지 않음”으로 나타나며, 이는 진단하기 어렵습니다. 그러므로 마이크부터 시작하지 마십시오.텍스트는 폴백 입력이 아니라 컨트롤 플레인입니다
실시간 음성 모델에서 텍스트는 “입력을 보내는 또 다른 방식”이 아니라, 오디오 스트림을 제외한 전체 제어 채널입니다:세 단계 자가 테스트
1단계: 텍스트만 사용하고 마이크는 사용하지 않음
output_modalities를 텍스트 전용으로 설정하고, 턴 감지를 비활성화한 다음, input_text 하나를 보내십시오. 그것만으로도 핸드셰이크, 키와 그룹, 올바른 필드 템플릿을 선택했는지, session.update가 적용되었는지, 도구가 올바르게 주입되는지, 멀티턴 컨텍스트가 유지되는지, 그리고 동시 실행 수가 어떻게 동작하는지를 검증합니다. 오디오 tokens는 전혀 생성되지 않습니다.2단계: 로컬 wav 파일 다시 재생
input_audio_buffer.append에 입력하십시오. 이렇게 하면 오디오 파이프라인(형식, 샘플 레이트, 청킹, commit, VAD 트리거링)을 비즈니스 로직과 분리할 수 있으며 재현 가능해집니다 — 같은 파일은 두 번 실행해도 같은 결과를 만들어야 합니다.3단계: 라이브 마이크 연결
실행 가능한 텍스트 스모크 테스트
websockets만 있으면 됩니다 (pip install websockets). 프로토콜을 전환하려면 변수 하나만 바꾸십시오:
세션 기능: 음성, 턴 감지, 도구, 이미지
음성
턴 감지: server_vad 및 semantic_vad
server_vad— 무음 지속 시간 기준으로 분할하며, 매개변수가 직관적입니다(threshold,silence_duration_ms,prefix_padding_ms).semantic_vad— 대화 의도 기준으로 분할하며, 군더더기 말과 의미 없는 배경 소음을 무시합니다. 여러 화자가 있는 환경에서 더 견고합니다.- 턴 감지를 비활성화할 수도 있으며(
null또는none), 수동 모드로 실행할 수 있습니다:input_audio_buffer.commit를 직접 전송한 다음response.create를 전송합니다. 이는 UI가 턴을 제어하는 푸시-투-토크 인터페이스에 적합합니다.
함수 호출
이벤트 순서: 모델이response.output_item.done 유형의 function_call를 내보냅니다(call_id 및 arguments 포함) → 클라이언트가 이를 실행합니다 → 결과가 주입됩니다 → 다른 response.create가 모델이 계속 진행하도록 합니다.
이미지 입력
실시간 GA 프로토콜:input_image를 메시지에 직접 넣으십시오; 값은 데이터 URI일 수 있습니다.
Error append image before append audio. 오류가 발생합니다. 테스트에서는 input_image_buffer.append를 input_audio_buffer.append stream에 대략 초당 한 프레임으로 교차 삽입하는 방식이 동작했습니다.
알려진 제한 사항(베타)
아래 4개 항목은 모두 측정된 것이며, 모두 클라이언트 코드에 영향을 줍니다. 통합하기 전에 이 내용을 읽어 보시기 바랍니다.모범 사례
프로토콜 계열별로 먼저 필드 템플릿을 선택합니다
session.update 페이로드를 모델 이름으로 선택되는 두 개의 설정 상수로 작성하고, if 분기로 흩어 두지 마십시오. 이 부분은 6개월 후 유지보수 시 가장 깨지기 쉽습니다.세션 매개변수는 첫 프레임에 고정합니다
output_modalities, voice, speed, turn_detection 및 transcription를 맨 처음 session.update에서 설정합니다. 특히 음성은 — 오디오가 생성된 뒤에는 이미 늦습니다.오디오를 추가하기 전에 텍스트 스모크 테스트를 통과합니다
샘플 레이트와 채널은 클라이언트에서 변환합니다
타임아웃을 두고 output_item.done에서 마무리합니다
response.done만 기다리지 마십시오. 이 방식은 두 계열 모두에서 올바르며, 사용자가 중단해도 턴이 멈춰 버리는 일을 방지합니다.장시간 세션에는 유지 신호와 재연결을 추가합니다
expires_at을 주의하십시오. 재연결한 뒤에는 session.update와 필요한 컨텍스트를 다시 전송하십시오, 그렇지 않으면 새 세션이 기본값으로 실행됩니다.프로덕션에서는 백엔드 릴레이를 사용합니다
오류 및 재시도
event_id와 세션의 session.id를 기록하고, 문제를 보고할 때 함께 포함하십시오 — 진단 시간이 크게 줄어듭니다. 또한 Realtime GA 오류 객체에는 code와 param가 포함됩니다(정확한 필드와 그 허용값을 명시함). 반면 Model Studio의 오류 메시지는 더 거칩니다. 디버깅할 때는 먼저 전자의 필드 구문을 검증하십시오.자주 묻는 질문
이 페이지에 대화형 플레이그라운드가 없는 이유는 무엇입니까?
이 페이지에 대화형 플레이그라운드가 없는 이유는 무엇입니까?
모델 이름만 바꾸어서 네 가지 모델을 서로 전환할 수 있습니까?
모델 이름만 바꾸어서 네 가지 모델을 서로 전환할 수 있습니까?
modalities ↔ output_modalities, voice ↔ audio.output.voice, input_audio_format ↔ audio.input.format, turn_detection ↔ audio.input.turn_detection, input_audio_transcription ↔ audio.input.transcription, 그리고 이벤트 이름 response.text.delta ↔ response.output_text.delta 및 response.audio.delta ↔ response.output_audio.delta도 마찬가지입니다. 전체 매핑은 프로토콜 비교 섹션을 참조하십시오.핸드셰이크가 아예 실패합니다. 어떻게 디버그합니까?
핸드셰이크가 아예 실패합니다. 어떻게 디버그합니까?
wss://이고 https://가 아닙니다. 2. 엔드포인트에 ?model=<model-name>가 포함되어 있습니다. 3. Authorization: Bearer <key> 헤더가 존재합니다. 4. 키가 베타 그룹에 대해 활성화되어 있습니다(아니면 503과 함께 “no available channel”이 반환됩니다). 5. 중간의 역방향 프록시가 Upgrade 헤더를 제거하지 않습니다. 이는 자체 게이트웨이를 통해 릴레이할 때 흔한 문제입니다.브라우저에서 연결할 수 있습니까? 제 키가 유출됩니까?
브라우저에서 연결할 수 있습니까? 제 키가 유출됩니까?
Sec-WebSocket-Protocol 서브프로토콜을 통한 인증을 허용하므로 브라우저 WebSocket가 직접 연결할 수 있습니다. 하지만 그렇게 하면 키를 브라우저에 넘기게 되며, 방문자는 네트워크 패널에서 이를 볼 수 있으므로 로컬 검증에만 적합합니다. 운영 환경에서는 백엔드 릴레이를 작성하십시오. 백엔드가 키를 보유하고 APIYI에 대한 연결을 열며, 프런트엔드는 자체 서비스와만 통신합니다.gpt-realtime-2.1에 16 kHz 오디오를 보내면 실패합니다. 왜 그렇습니까?
gpt-realtime-2.1에 16 kHz 오디오를 보내면 실패합니다. 왜 그렇습니까?
integer_below_min_value가 반환됩니다. 올바른 형식은 "audio": {"input": {"format": {"type": "audio/pcm", "rate": 24000}}}입니다. 두 Model Studio 모델은 대신 16 kHz를 요구하며, 이 둘은 서로 호환되지 않습니다.마이크가 없거나 오디오 테스트가 어렵습니다. 이제 무엇을 해야 합니까?
마이크가 없거나 오디오 테스트가 어렵습니다. 이제 무엇을 해야 합니까?
say 및 afconvert로 한 줄로 생성할 수 있으며, 명령은 해당 섹션에 있습니다.response.cancel을 보낸 뒤 response.done을 전혀 받지 못합니다.
response.cancel을 보낸 뒤 response.done을 전혀 받지 못합니다.
response.text.done, response.content_part.done, response.output_item.done를 받지만, response.done는 전달되지 않습니다. response.output_item.done를 턴 종료 신호로 사용하고 안전장치로 타임아웃을 추가하십시오. 세션 자체는 영향을 받지 않으며 대화는 정상적으로 계속됩니다. 두 Realtime GA 모델은 여기서 올바르게 동작합니다.약 5분 후 연결이 끊깁니다.
약 5분 후 연결이 끊깁니다.
session.update), 연결 끊김을 수용하고 자동으로 재연결하십시오. 재연결 후에는 session.update와 필요한 컨텍스트를 다시 전송해야 함을 기억하십시오.단일 세션은 얼마나 오래 열려 있을 수 있습니까?
단일 세션은 얼마나 오래 열려 있을 수 있습니까?
session.created 이벤트가 expires_at을 전달하며, 이는 연결 후 약 30분 시점의 값으로 측정되고, 그 이후에는 재연결해야 합니다. Model Studio 프로토콜에서 주로 관찰된 제약은 300초 유휴 연결 종료입니다. 세션이 만료된다고 가정하고 긴 대화를 설계하며, 세션 간에 컨텍스트를 어떻게 전달할지도 계획하십시오.음성을 어떻게 설정하며, 변경 시 cannot_update_voice가 반환되는 이유는 무엇입니까?
음성을 어떻게 설정하며, 변경 시 cannot_update_voice가 반환되는 이유는 무엇입니까?
session.update에서 설정합니다. Model Studio에서는 최상위 voice, Realtime GA에서는 audio.output.voice입니다. 세션이 오디오 출력을 생성한 뒤에는 음성을 더 이상 변경할 수 없습니다. 이는 두 프로토콜 모두에 적용되며 cannot_update_voice를 반환합니다. 첫 프레임에 고정하고, 전환하려면 새 세션을 여십시오. 또한 Model Studio에서는 음성으로 빈 문자열을 보내지 마십시오. 400이 반환됩니다.수동 커밋 모드에서 입력 전사가 나오지 않습니다.
수동 커밋 모드에서 입력 전사가 나오지 않습니다.
flash 모델은 수동 commit 모드에서 전사 완료 이벤트를 전달하지 않습니다(실행 전반에서 일관되게 재현됨). plus 모델은 전달하며, 두 모델 모두 VAD 모드에서는 동작합니다. server_vad 또는 semantic_vad로 전환하십시오. 테스트 결과 이 경우 전사 텍스트는 delta 이벤트의 문서화되지 않은 필드에 들어가지만, 해당 필드는 언제든지 변경될 수 있으며 의존해서는 안 됩니다. 이는 UI에서 사용자가 말한 내용을 표시하는 문제에만 영향을 미치며, 대화에는 영향이 없고 모델은 오디오를 올바르게 이해하고 응답합니다.이미지 입력을 지원합니까? 왜 Error append image before append audio.가 표시됩니까?
이미지 입력을 지원합니까? 왜 Error append image before append audio.가 표시됩니까?
input_image를 직접 배치합니다. Model Studio에서는 이미지를 동영상 프레임으로 처리하므로, 오디오는 어떤 이미지보다 먼저 추가되어야 하며, 이것이 해당 오류를 유발합니다. 테스트에서 동작하는 방식은 초당 약 한 프레임 비율로 이미지 프레임을 오디오 스트림에 교차 삽입하는 것입니다.프롬프트 캐싱이 있습니까? 적중을 어떻게 확인합니까?
프롬프트 캐싱이 있습니까? 적중을 어떻게 확인합니까?
usage.input_token_details.cached_tokens에 값이 있었습니다. 두 Model Studio 모델에서는 캐시 적중이 관찰되지 않았습니다.비용은 어떻게 추정합니까? 텍스트와 오디오는 별도로 과금됩니까?
비용은 어떻게 추정합니까? 텍스트와 오디오는 별도로 과금됩니까?
response.done의 usage 객체는 모달리티별 token 수를 보고합니다(텍스트 / 오디오 / 이미지, 입력과 출력은 각각 별도). 따라서 비용을 귀속할 수 있습니다. 오디오 요금은 텍스트보다 훨씬 높으므로 통합 중에는 텍스트 전용을 권장합니다. 실제 과금은 호출 로그를 참조하십시오.