콘텐츠로 이동

이벤트 참조

/sohri는 JSON text frame과 binary PCM frame을 함께 사용합니다. JSON 응답은 생산자에 따라 봉투가 다르므로 소비자는 type을 먼저 보고 필요한 위치를 읽어야 합니다.

봉투 형태

표준 응답은 다음 형태입니다.

{
  "type": "speech_started",
  "data": {},
  "timestamp": 1710000000000
}

다음 이벤트는 평평한 형태이거나 별도 생산자가 직접 직렬화합니다.

  • 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가 직접 보내는 welcome dialog_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은 다음처럼 전달됩니다.

{
  "type": "realtime_event",
  "event": {
    "type": "input_audio_buffer.speech_started"
  }
}

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은 들린 구간의 기록으로 보존합니다.

세부 흐름은 일반 턴, 바지인, TTS 스트리밍을 참고하세요.