이벤트 참조¶
/sohri는 JSON text frame과 binary PCM frame을 함께 사용합니다. JSON 응답은 생산자에 따라
봉투가 다르므로 소비자는 type을 먼저 보고 필요한 위치를 읽어야 합니다.
봉투 형태¶
표준 응답은 다음 형태입니다.
다음 이벤트는 평평한 형태이거나 별도 생산자가 직접 직렬화합니다.
connection_established:sessionId,timestamp, 선택적dialogId,ttsStream- SOHRI
stt_result:messageId,text,confidence,score,duration,source dm_processing:text,timestamp- OpenAI Realtime의
realtime_event,tts_stream_start,tts_stream_end dm_scenario_update가 직접 보내는 welcomedialog_response
JSON 키 순서는 계약이 아닙니다.
클라이언트 → 서버¶
type |
주요 필드 | 의미 |
|---|---|---|
conversation_session_update |
conversationEngine, externalUser, instructions? |
엔진과 사용자 컨텍스트 확정 |
text |
사용자 텍스트 | SOHRI 텍스트 턴 |
event |
event:"DIALOG_END" |
연결을 닫지 않고 대화 최종화 요청 |
start_conversation |
— | 선인사/명시적 응답 생성 |
cancel_response |
— | 현재 assistant 출력 취소 |
realtime_playback_truncated |
itemId, audioEndMs |
OpenAI upstream item 절단 |
tts_playback_state |
active |
Gateway의 실제 TTS 재생 상태 |
tts_playback_completed |
generation |
실제 재생 완료와 무응답 관찰 시작 |
tts_duck_applied |
activityId, generation, appliedAt, gain, gatewayFrameSeq, hadRecentPlayback?, initialGraceMs |
duck 적용 경계를 EPD로 중계 |
epd_config_update |
minSpeech?, endSilence?, timeout? |
다음 EPD 연결 설정 변경 |
language_selection |
language |
ko, ja, en 선택 |
dm_scenario_update |
시나리오·사용자·TTS 선택 필드 | SOHRI DM 세션 파라미터 설정 |
user_info |
이름·생년월일·성별 | 선택 사용자 정보 저장 |
Binary frame은 선택된 엔진의 입력 PCM입니다. 선택 전 첫 binary frame은 엔진을 sohri로
잠급니다.
서버 → 클라이언트: 연결·설정¶
type |
의미 |
|---|---|
connection_established |
WebSocket 세션 등록과 dialog 생성 시도 완료 |
conversation_session_updated |
요청한 엔진 준비 완료 |
epd_config_updated |
적용값과 appliesOn:"next_epd_connection" |
dm_scenario_updated / dm_scenario_error |
시나리오 설정 결과 |
error |
인증 이후 프로토콜·설정·provider 오류 |
connection_established는 OpenAI upstream 준비를 의미하지 않습니다. OpenAI 엔진은
conversation_session_updated를 기다려야 합니다.
서버 → 클라이언트: SOHRI 턴¶
type |
주요 의미 |
|---|---|
speech_candidate |
EPD 발화 후보, data.activityId |
speech_candidate_cancelled |
후보 취소·억제 |
speech_started |
검증된 발화, 진행 중 generation 중단 |
stt_result |
EPD 통합 STT 결과 |
dm_processing |
DM 호출 전 로딩 상태 |
tts_audio_metadata |
레거시 WAV의 generation·길이·선택적 BOT ID |
dialog_text |
스트리밍 재생 시작 시점의 선행 자막 |
tts_stream_start |
raw PCM 스트림 시작과 포맷 |
tts_stream_end |
completed/aborted 종료 |
dialog_response |
BOT 텍스트·노드·턴·종료 여부·선택적 slots |
tts_error |
TTS soft-fail |
dialog_error |
DM 처리 실패 |
dialog_complete |
DM이 대화 완료를 반환 |
dialog_stop_requested |
클라이언트에 입력 중지를 요청 |
stop_recording |
비연속 세션의 EPD TIMEOUT |
레거시 TTS는 tts_audio_metadata 바로 뒤에 WAV binary 한 프레임을 보냅니다. 스트리밍은
tts_stream_start 뒤 raw PCM binary N개를 보냅니다.
서버 → 클라이언트: 분석·최종화¶
type |
의미 |
|---|---|
emotion_result |
발화 감정 결과 |
dementia_result |
치매 관련 분류 결과 |
depression_result |
우울 관련 분류 결과 |
biomarker_result |
음성 바이오마커 지표 |
summary_result |
일반 대화 요약 |
analysis_processing |
지연 분석 최종화 시작 |
analysis_complete |
지연 분석 최종화 종료 |
OpenAI Realtime 이벤트¶
OpenAI provider JSON은 다음처럼 전달됩니다.
provider audio delta는 JSON이 아니라 raw 24 kHz PCM binary로 전달됩니다. 첫 delta 전에
평평한 tts_stream_start가 오며 generation, sampleRate, channels, itemId를 포함합니다.
응답 종료·취소 뒤에는 평평한 tts_stream_end가 옵니다. provider 발화 시작 시
realtime_playback_interrupt도 전송됩니다.
OpenAI의 response.cancelled/response.done는 realtime_event로 전달되지만, 로컬 stream end와
BOT 저장 여부도 함께 결정합니다. cancelled/failed output은 저장하지 않고, completed/incomplete
output은 들린 구간의 기록으로 보존합니다.