REST 공통 규격: POST /api/v1/{service}/{operation} —
multipart/form-data(권장, 파트 request + audio)
또는 application/json(오디오 base64) 두 가지 방식을 지원합니다.
요청·응답 필드 표는 모두 JSON 기준입니다. 필드명의 .은 객체 안의 하위 필드를,
[]는 배열의 각 요소를 뜻합니다 (예: params.audio_format.sample_rate →
{"params": {"audio_format": {"sample_rate": 16000}}}).
raw PCM16LE로 해석되는 값 pcm 그 외 값은 검증하지 않고 컨테이너로 디코딩을 시도합니다 (wav · flac · ogg · mp3 등)
인코딩 힌트 (선택). 소문자·trim 후 비교하며, 미지정 시 컨테이너를 탐색한 뒤 raw PCM16LE로 간주합니다.
params.audio_format.sample_rate
int
선택
양의 정수
샘플링 레이트 (기본 16000, 권장 16000). 16kHz로 변환되어 처리됩니다.
params.audio_format.channels
int
선택
양의 정수
채널 수 (기본 1, 권장 1). mono로 변환되어 처리됩니다
params.recognition_mode
string
선택
no_epd— EPD 미사용 — 오디오 전체를 인식 use_epd— EPD로 발화 구간을 검출해 인식 use_epd_with_sil_append— EPD 사용 + 검출 구간 뒤에 묵음(SIL) 추가
끝점 검출 방식 (기본 use_epd_with_sil_append). 대소문자 무관
params.set_text_type
string
선택
LIST— 여러 문장 후보 중 1문장을 인식 (후보는 ;로 구분) CHUNK— 1문장을 단어 단위로 분리 입력 (;로 구분) CHUNK_SKIP— CHUNK + 단어 1개를 건너뛸 수 있는 형식 CHUNK_SERIAL— CHUNK + 어느 단어까지 발성했는지 확인 CHUNK_SERIAL_N_SKIP— CHUNK_SKIP과 CHUNK_SERIAL을 함께 적용
텍스트 매칭 방식 (기본 LIST). 대소문자 무관
params.config
object
선택
아래 config.* 하위 필드
세부 옵션. 범위를 벗어나거나 타입이 맞지 않는 값은 거부되지 않고 무시되며, result.config_status에 -100(정상은 1)으로 보고됩니다
params.config.level
int
선택
0–4
거절의 강도 (기본 1). 값이 클수록 거절 강도가 커집니다.
params.config.tm_limit
int
선택
3–600
한 번의 인식에서 처리할 수 있는 최대 음성 길이(초, 기본 30). 이 길이를 넘는 음성은 인식에 실패합니다.
params.config.pause_th
int
선택
250–2500
발화가 끝났다고 판정하기 위한 최소 묵음 길이(ms, 기본 500). 이 길이만큼 묵음이 이어지면 인식을 종료합니다.
session.heartbeat — ① session.started를 받은 뒤부터 ⑤ session.end를 보내기 전까지 사이에 보냅니다. WebSocket 연결을 오래 유지하는 경우 세션이 만료되지 않도록 주기적으로 호출해 세션을 연장하는 데 사용합니다 (30초 주기 권장).
① session.start — 세션 시작
요청Client → Server · Text 프레임 (JSON)
필드
타입
필수
허용 값
설명
type
string
필수
session.start
메시지 종류
user_sid
string
필수
사용자 식별자
service
string
필수
sr
서비스
operation
string
필수
recognize
오퍼레이션
params
object
필수
아래 params.* 하위 필드
인식 파라미터. REST 요청의 params와 같습니다
params.text
string
필수
자유 문자열
인식 기준이 되는 텍스트
params.resource_name
string
필수
배포 설정에 선언된 리소스에 한함 (대소문자 무관)
인식 리소스. 인식 언어도 이 값으로 결정됩니다. 선언되지 않은 이름은 거부됩니다
params.audio_format
object
선택
아래 audio_format.* 하위 필드
object가 아닌 값(문자열 등)은 무시됩니다
params.audio_format.encoding
string
선택
raw PCM16LE로 해석되는 값 pcm 그 외 값은 검증하지 않고 컨테이너로 디코딩을 시도합니다 (wav · flac · ogg · mp3 등)
인코딩 힌트 (선택). 소문자·trim 후 비교하며, 미지정 시 컨테이너를 탐색한 뒤 raw PCM16LE로 간주합니다.
params.audio_format.sample_rate
int
선택
양의 정수
샘플링 레이트 (기본 16000, 권장 16000). 16kHz로 변환되어 처리됩니다.
params.audio_format.channels
int
선택
양의 정수
채널 수 (기본 1, 권장 1). mono로 변환되어 처리됩니다
params.recognition_mode
string
선택
no_epd— EPD 미사용 — 오디오 전체를 인식 use_epd— EPD로 발화 구간을 검출해 인식 use_epd_with_sil_append— EPD 사용 + 검출 구간 뒤에 묵음(SIL) 추가
끝점 검출 방식 (기본 use_epd_with_sil_append). 대소문자 무관
params.set_text_type
string
선택
LIST— 여러 문장 후보 중 1문장을 인식 (후보는 ;로 구분) CHUNK— 1문장을 단어 단위로 분리 입력 (;로 구분) CHUNK_SKIP— CHUNK + 단어 1개를 건너뛸 수 있는 형식 CHUNK_SERIAL— CHUNK + 어느 단어까지 발성했는지 확인 CHUNK_SERIAL_N_SKIP— CHUNK_SKIP과 CHUNK_SERIAL을 함께 적용
텍스트 매칭 방식 (기본 LIST). 대소문자 무관
params.config
object
선택
아래 config.* 하위 필드
세부 옵션. 범위를 벗어나거나 타입이 맞지 않는 값은 거부되지 않고 무시되며, result.config_status에 -100(정상은 1)으로 보고됩니다
params.config.level
int
선택
0–4
거절의 강도 (기본 1). 값이 클수록 거절 강도가 커집니다.
params.config.tm_limit
int
선택
3–600
한 번의 인식에서 처리할 수 있는 최대 음성 길이(초, 기본 30). 이 길이를 넘는 음성은 인식에 실패합니다.
params.config.pause_th
int
선택
250–2500
발화가 끝났다고 판정하기 위한 최소 묵음 길이(ms, 기본 500). 이 길이만큼 묵음이 이어지면 인식을 종료합니다.
session.started를 받기 전에 command·Binary 프레임·session.heartbeat·session.end를 보내면
PROTOCOL_VIOLATION으로 연결이 종료됩니다.
api_key 필드는 넣을 수 없으며(INVALID_MESSAGE), API Key는 연결 handshake에서만 전달합니다.
아래 표는 REST 응답 본문과 WebSocket recognition.result 메시지에 공통으로 적용됩니다. REST는 응답 본문 최상위에, WebSocket은 결과 메시지 본문에 같은 필드가 담기며, WebSocket 메시지에는 type·is_final이 추가됩니다. REST 전용 표시가 있는 필드는 WebSocket 결과 메시지에 없습니다.
sr/recognize 결과
sr/recognize 응답 결과 구조입니다.
필드
타입
설명
session_id
string
세션 ID
server_time
string
응답 서버 시각 (ISO 8601 UTC)
statistics.action
string
실행된 엔진 액션명
statistics.sdk
string
SDK명 (SelvySR)
statistics.runtime
string
런타임 구현체 (sr2lib_runtime) — 런타임 계층의 값이 우선 적용되어 runtime_implementation과 동일한 값이 반환됩니다
statistics.runtime_implementation
string
런타임 구현체 ID (sr2lib_runtime)
statistics.audio_size
int
사용자 음성 바이트 수
statistics.reference_audio_size
int
참조 음성 바이트 수 (없으면 0)
statistics.elapsed_ns
int
처리 소요 시간 (nanoseconds)
statistics.invoke_started_at_ns
int
invoke 시작 타임스탬프 (nanoseconds)
statistics.invoke_completed_at_ns
int
invoke 완료 타임스탬프 (nanoseconds)
statistics.recognition_mode
string
사용된 인식 모드
statistics.resource_name
string
사용된 리소스명
error
object
오류 발생 시 포함 (정상 응답 시 부재) REST 전용 — WebSocket은 command.error·session.error 메시지로 전달됩니다
result.result_type
string
"recognition" 고정
result.text
string
인식된 텍스트 (최상위 후보)
result.score
float
전체 인식 점수 (0–100)
result.confidence
float
인식 신뢰도 (엔진에 따라 제공, SelvySR 엔진에서는 부재)
result.words[]
array
어절 배열
result.words[].text
string
어절 텍스트
result.words[].score
float
어절 점수 (0–100)
result.words[].confidence
float
어절 신뢰도 (엔진에 따라 제공)
result.words[].start_ms
int
시작 시각 (ms)
result.words[].end_ms
int
종료 시각 (ms)
result.words[].raw_data.str
string
어절 텍스트
result.words[].raw_data.score
float
어절 점수 (0–100)
result.words[].raw_data.start_ms
int
epd_start_ms 기준 시작점 (ms)
result.words[].raw_data.end_ms
int
epd_start_ms 기준 끝점 (ms)
result.words[].raw_data.time_weight
float
문장 전체 시간 대비 해당 어절의 시간 비율
result.words[].raw_data.time_weighted_score
float
시간 가중 어절 점수
result.words[].raw_data.stressScore
float
문장 내 강세 점수 (0–100)
result.words[].raw_data.phonemes[].str
string
ARPABET 기호
result.words[].raw_data.phonemes[].score
float
음소 점수 (0–100)
result.words[].raw_data.phonemes[].start_ms
int
epd_start_ms 기준 시작점 (ms)
result.words[].raw_data.phonemes[].end_ms
int
epd_start_ms 기준 끝점 (ms)
result.words[].raw_data.phonemes[].phonme_id
int
음소 내부 ID
result.words[].raw_data.phonemes[].type
int
음소 종류 비트마스크 — bit0(1) 자음, bit1(2) 모음. 0은 비음성 구간
result.words[].raw_data.phonemes[].is_vowel
bool
모음 여부
result.words[].raw_data.phonemes[].is_speech
bool
음성 구간 여부
result.alternatives[]
array
candidate_count > 1 시 추가 후보 배열
result.alternatives[].text
string
후보 텍스트
result.alternatives[].score
int
후보 점수
result.alternatives[].confidence
float
후보 신뢰도 (엔진에 따라 제공)
result.alternatives[].raw_data
object
후보 엔진 원본
result.metadata
object
엔진 부가 정보. SelvySR 엔진 정상 결과에서는 빈 object이며, 인식 거절 시 아래 status* 필드가 채워짐
result.metadata.status
string
인식 거절 시 "rejected" (정상 결과에서는 부재)
result.metadata.status_code
string
거절 사유 코드명 (recognition_rejected · recognition_speech_failed 등)
raw PCM16LE로 해석되는 값 pcm 그 외 값은 검증하지 않고 컨테이너로 디코딩을 시도합니다 (wav · flac · ogg · mp3 등)
인코딩 힌트 (선택). 소문자·trim 후 비교하며, 미지정 시 컨테이너를 탐색한 뒤 raw PCM16LE로 간주합니다.
params.audio_format.sample_rate
int
선택
양의 정수
샘플링 레이트 (기본 16000, 권장 16000). 16kHz로 변환되어 처리됩니다.
params.audio_format.channels
int
선택
양의 정수
채널 수 (기본 1, 권장 1). mono로 변환되어 처리됩니다
params.config
object
선택
아래 config.* 하위 필드
세부 옵션. 범위를 벗어나거나 타입이 맞지 않는 값은 거부되지 않고 무시되며, result.config_status에 -100(정상은 1)으로 보고됩니다
params.config.level
int
선택
0–4
거절의 강도 (기본 1). 값이 클수록 거절 강도가 커집니다.
params.config.tm_limit
int
선택
3–600
한 번의 인식에서 처리할 수 있는 최대 음성 길이(초, 기본 30). 이 길이를 넘는 음성은 인식에 실패합니다.
params.config.pause_th
int
선택
250–2500
발화가 끝났다고 판정하기 위한 최소 묵음 길이(ms, 기본 500). 이 길이만큼 묵음이 이어지면 인식을 종료합니다.
호출 샘플
curl -X POST "https://{host}/api/v1/sr/recognize_long" \
-H "Authorization: Bearer $API_KEY" \
-F 'request={"user_sid":"user-2001","params":{"text":"This is my family. My father is a doctor. My mother is a teacher.",
"resource_name":"KONG_ALL"}};type=application/json' \
-F "audio=@paragraph.wav"
import requests, json
resp = requests.post(
"https://{host}/api/v1/sr/recognize_long",
headers={"Authorization": f"Bearer {API_KEY}"},
files={
"request": (None, json.dumps({
"user_sid": "user-2001",
"params": {
"text": "This is my family. My father is a doctor. My mother is a teacher.",
"resource_name": "KONG_ALL",
},
}), "application/json"),
"audio": ("paragraph.wav", open("paragraph.wav", "rb"), "audio/wav"),
},
)
result = resp.json()["result"]
print(result["text"], result["score"])
# 미발화 어절은 score·start_ms·end_ms 가 0 으로 내려옵니다.
for w in result["words"]:
print(w["text"], w["score"], w["raw_data"]["is_spoken"])
const fs = require("fs");
const path = require("path");
const HOST = "https://{host}";
async function main() {
const filePath = "./paragraph.wav";
const fd = new FormData();
fd.append(
"request",
new Blob(
[
JSON.stringify({
user_sid: "user-2001",
params: {
text: "This is my family. My father is a doctor. My mother is a teacher.",
resource_name: "KONG_ALL",
},
}),
],
{ type: "application/json" }
)
);
fd.append("audio", new Blob([fs.readFileSync(filePath)]), path.basename(filePath));
const res = await fetch(`${HOST}/api/v1/sr/recognize_long`, {
method: "POST",
headers: { Authorization: `Bearer ${API_KEY}` },
body: fd,
});
if (!res.ok) {
console.error("HTTP Error:", res.status, await res.text());
return;
}
const result = (await res.json()).result;
console.log(result.text, result.score);
}
main();
session.heartbeat — ① session.started를 받은 뒤부터 ⑤ session.end를 보내기 전까지 사이에 보냅니다. WebSocket 연결을 오래 유지하는 경우 세션이 만료되지 않도록 주기적으로 호출해 세션을 연장하는 데 사용합니다 (30초 주기 권장).
① session.start — 세션 시작
요청Client → Server · Text 프레임 (JSON)
필드
타입
필수
허용 값
설명
type
string
필수
session.start
메시지 종류
user_sid
string
필수
사용자 식별자
service
string
필수
sr
서비스
operation
string
필수
recognize_long
오퍼레이션
params
object
필수
아래 params.* 하위 필드
요청 파라미터. REST 요청의 params와 같습니다
params.text
string
필수
자유 문자열
인식 기준이 되는 텍스트
params.resource_name
string
필수
배포 설정에 선언된 리소스에 한함 (대소문자 무관)
인식 리소스. 인식 언어도 이 값으로 결정됩니다. 선언되지 않은 이름은 거부됩니다
params.audio_format
object
선택
아래 audio_format.* 하위 필드
object가 아닌 값(문자열 등)은 무시됩니다
params.audio_format.encoding
string
선택
raw PCM16LE로 해석되는 값 pcm 그 외 값은 검증하지 않고 컨테이너로 디코딩을 시도합니다 (wav · flac · ogg · mp3 등)
인코딩 힌트 (선택). 소문자·trim 후 비교하며, 미지정 시 컨테이너를 탐색한 뒤 raw PCM16LE로 간주합니다.
params.audio_format.sample_rate
int
선택
양의 정수
샘플링 레이트 (기본 16000, 권장 16000). 16kHz로 변환되어 처리됩니다.
params.audio_format.channels
int
선택
양의 정수
채널 수 (기본 1, 권장 1). mono로 변환되어 처리됩니다
params.config
object
선택
아래 config.* 하위 필드
세부 옵션. 범위를 벗어나거나 타입이 맞지 않는 값은 거부되지 않고 무시되며, result.config_status에 -100(정상은 1)으로 보고됩니다
params.config.level
int
선택
0–4
거절의 강도 (기본 1). 값이 클수록 거절 강도가 커집니다.
params.config.tm_limit
int
선택
3–600
한 번의 인식에서 처리할 수 있는 최대 음성 길이(초, 기본 30). 이 길이를 넘는 음성은 인식에 실패합니다.
params.config.pause_th
int
선택
250–2500
발화가 끝났다고 판정하기 위한 최소 묵음 길이(ms, 기본 500). 이 길이만큼 묵음이 이어지면 인식을 종료합니다.
응답Server → Client · session.started
필드
타입
설명
type
string
"session.started" 고정
session_id
string
발급된 세션 ID. 이후 서버가 보내는 모든 메시지에 포함됩니다
subscription_uuid
string
세션에 적용된 구독 UUID
subscription_plan_uid
int
구독 플랜 ID
subscription_status
string
구독 상태
server_time
string
응답 서버 시각 (ISO 8601 UTC)
// 클라이언트 → 서버
{
"type": "session.start",
"user_sid": "user-2001",
"service": "sr",
"operation": "recognize_long",
"params": {
"text": "Once upon a time there lived a little girl. She loved to read books.",
"resource_name": "KONG_ALL",
"audio_format": { "sample_rate": 16000, "channels": 1, "encoding": "pcm" }
}
}
// 서버 → 클라이언트
{
"type": "session.started",
"session_id": "01HXXXXXXXXXXXXXXXXXXXXXXX",
"subscription_uuid": "…",
"subscription_plan_uid": 0,
"subscription_status": "…",
"server_time": "2026-02-12T10:30:45Z"
}
session.started를 받기 전에 command·Binary 프레임·session.heartbeat·session.end를 보내면
PROTOCOL_VIOLATION으로 연결이 종료됩니다.
api_key 필드는 넣을 수 없으며(INVALID_MESSAGE), API Key는 연결 handshake에서만 전달합니다.
아래 표는 REST 응답 본문과 WebSocket recognition.result 메시지에 공통으로 적용됩니다. REST는 응답 본문 최상위에, WebSocket은 결과 메시지 본문에 같은 필드가 담기며, WebSocket 메시지에는 type·is_final이 추가됩니다. REST 전용 표시가 있는 필드는 WebSocket 결과 메시지에 없습니다.
sr/recognize_long 결과
sr/recognize_long은 문단 단위 장문 인식 오퍼레이션입니다.
필드
타입
설명
session_id
string
세션 ID
server_time
string
응답 서버 시각 (ISO 8601 UTC)
error
object
오류 발생 시 포함 (정상 응답 시 부재). 이때 result·statistics는 부재 REST 전용 — WebSocket은 command.error·session.error 메시지로 전달됩니다
statistics.action
string
실행된 엔진 액션명
statistics.sdk
string
SDK명 (SelvySR)
statistics.runtime
string
런타임 구현체 (sr2lib_runtime) — 런타임 계층의 값이 우선 적용되어 runtime_implementation과 동일한 값이 반환됩니다
statistics.runtime_implementation
string
런타임 구현체 ID (sr2lib_runtime)
statistics.audio_size
int
사용자 음성 바이트 수
statistics.reference_audio_size
int
참조 음성 바이트 수 (없으면 0)
statistics.elapsed_ns
int
처리 소요 시간 (nanoseconds)
statistics.invoke_started_at_ns
int
invoke 시작 타임스탬프 (nanoseconds)
statistics.invoke_completed_at_ns
int
invoke 완료 타임스탬프 (nanoseconds)
statistics.resource_name
string
사용된 리소스명 (recognize_long은 recognition_mode를 포함하지 않음)
result.result_type
string
"recognition" 고정
result.text
string
인식된 전체 텍스트
result.score
float
전체 인식 점수 (0–100)
result.metadata
object
엔진 부가 정보 (없으면 빈 object)
result.words[]
array
어절 배열 (스크립트 순서)
result.words[].text
string
어절 텍스트
result.words[].score
float
어절 점수 (0–100, 미발화 시 0)
result.words[].start_ms
int
시작 시각 (ms, 미발화 시 0)
result.words[].end_ms
int
종료 시각 (ms, 미발화 시 0)
result.words[].raw_data.str
string
어절 텍스트
result.words[].raw_data.score
float
어절 점수 (0–100, 미발화 시 0)
result.words[].raw_data.start_ms
int
시작 시각 (ms, 미발화 시 0)
result.words[].raw_data.end_ms
int
종료 시각 (ms, 미발화 시 0)
result.words[].raw_data.is_spoken
bool
발화 여부
result.words[].raw_data.phonemes[]
array
음소 배열 (발화된 어절에만 포함)
result.words[].raw_data.phonemes[].str
string
ARPABET 기호 (유사 표기)
result.words[].raw_data.phonemes[].score
float
음소 점수 (0–100)
result.words[].raw_data.phonemes[].start_ms
int
음소 시작 시각 (ms)
result.words[].raw_data.phonemes[].end_ms
int
음소 종료 시각 (ms)
result.words[].raw_data.phonemes[].is_vowel
bool
모음 여부
result.raw_data.str
string
인식된 전체 텍스트 — 미발화 어절은 괄호로 감싸짐 (예: "hello (world)")
result.raw_data.score
float
전체 인식 점수 (0–100) — 발화된 어절만의 평균 (미발화 어절은 분자·분모에서 제외, 전부 미발화 시 0)
result.raw_data.err_msg
string
오류 메시지 (정상 시 빈 문자열)
result.raw_data.wpm
float
분당 단어 수
result.raw_data.words[]
array
어절 배열 (스크립트 순서, 미발화 어절 포함) — result.words[].raw_data와 동일 구조
result.raw_data.input_info.lang
string
인식 모델 언어
result.raw_data.input_info.model_name
string
인식 모델 이름
result.raw_data.input_info.input_text
string
인식 스크립트 문장
result.raw_data.input_info.recognition_config
object
인식에 사용된 설정값 (Config)
result.raw_data.input_info.recognition_time
int
인식 시작 시각 (UTC timestamp)
result.raw_data.extra.api_name
string
호출 API 이름
result.raw_data.extra.params
string
API 호출 파라미터
result.raw_data.extra.returns
string
API 반환값
result.raw_data.extra.tag
string
반환값 구분자
result.raw_data.extra.call_time
int
API 호출 시각 (UTC timestamp)
result.raw_data.extra.return_time
int
API 반환 시각 (UTC timestamp)
result.raw_data.extra.input_config
object
실제 엔진 호출 시 사용된 설정값
비교평가
REST 프로토콜
POST /api/v1/sr/assess
요청 필드 JSON 기준
참조 지정 방식 2가지 중 하나를 사용합니다.
필드
타입
필수
허용 값
설명
user_sid
string
필수
사용자 식별자
① 직접 음성 전달 방식 — reference_audio 멀티파트를 함께 전송
params.reference_text
string
필수
자유 문자열
평가 기준 텍스트. ① 방식에서만 필수입니다
② 등록 ID 방식 — 사전 등록된 참조 음성 지정. 아래 중 하나 전송
아래 중 하나
params.reference_id
string
택1
자유 문자열
등록된 참조 음성 ID. 가장 우선 적용됩니다
params.reference_resource_name
string
택1
자유 문자열
사전 등록 리소스명
params.resource_key
string
택1
자유 문자열
리소스 검색 키
params.resource_id
string
택1
자유 문자열
리소스 ID
공통 선택 파라미터
params.enable_intonation
bool
선택
true · false
억양 곡선 포함 (기본 false). bool이 아닌 값은 무시됩니다
params.recognition_mode
string
선택
no_epd— EPD 미사용 — 오디오 전체를 인식 use_epd— EPD로 발화 구간을 검출해 인식 use_epd_with_sil_append— EPD 사용 + 검출 구간 뒤에 묵음(SIL) 추가
기본 use_epd_with_sil_append. 대소문자 무관
params.set_text_type
string
선택
LIST— 여러 문장 후보 중 1문장을 인식 (후보는 ;로 구분) CHUNK— 1문장을 단어 단위로 분리 입력 (;로 구분) CHUNK_SKIP— CHUNK + 단어 1개를 건너뛸 수 있는 형식 CHUNK_SERIAL— CHUNK + 어느 단어까지 발성했는지 확인 CHUNK_SERIAL_N_SKIP— CHUNK_SKIP과 CHUNK_SERIAL을 함께 적용
기본 LIST. 대소문자 무관
params.resource_name
string
필수
배포 설정에 선언된 리소스에 한함 (대소문자 무관)
인식 리소스. 인식 언어도 이 값으로 결정됩니다. 선언되지 않은 이름은 거부됩니다
params.audio_format
object
선택
아래 audio_format.* 하위 필드
object가 아닌 값(문자열 등)은 무시됩니다
params.audio_format.encoding
string
선택
raw PCM16LE로 해석되는 값 pcm 그 외 값은 검증하지 않고 컨테이너로 디코딩을 시도합니다 (wav · flac · ogg · mp3 등)
인코딩 힌트 (선택). 소문자·trim 후 비교하며, 미지정 시 컨테이너를 탐색한 뒤 raw PCM16LE로 간주합니다.
params.audio_format.sample_rate
int
선택
양의 정수
샘플링 레이트 (기본 16000, 권장 16000). 16kHz로 변환되어 처리됩니다.
params.audio_format.channels
int
선택
양의 정수
채널 수 (기본 1, 권장 1). mono로 변환되어 처리됩니다
params.config
object
선택
아래 config.* 하위 필드
세부 옵션. 범위를 벗어나거나 타입이 맞지 않는 값은 거부되지 않고 무시되며, result.config_status에 -100(정상은 1)으로 보고됩니다
params.config.level
int
선택
0–4
거절의 강도 (기본 1). 값이 클수록 거절 강도가 커집니다.
params.config.tm_limit
int
선택
3–600
한 번의 인식에서 처리할 수 있는 최대 음성 길이(초, 기본 30). 이 길이를 넘는 음성은 인식에 실패합니다.
params.config.pause_th
int
선택
250–2500
발화가 끝났다고 판정하기 위한 최소 묵음 길이(ms, 기본 500). 이 길이만큼 묵음이 이어지면 인식을 종료합니다.
② 방식의 식별자 우선순위 — reference_id가 있으면 이 값이 사용되고,
없으면 reference_resource_name → resource_key → resource_id 순으로
처음 발견된 비어 있지 않은 값이 식별자로 사용됩니다.
네 필드 중 하나라도 채워져 있으면 등록 ID 방식으로 동작하며, 조회 실패 시 요청이
INVALID_REQUEST로 거부됩니다.
한 연결에서 아래 순서로 메시지를 주고받습니다. Text 프레임은 JSON 제어 메시지이고, Binary 프레임은 오디오입니다. 아래 요청·응답 필드는 모두 JSON 메시지 기준입니다.
연결 인증은 인증 (API Key)과 브라우저 인증을 참고하세요.
참조 지정 방식에 따라 흐름이 다르며, ② 등록 ID 방식은 ②·③ 단계를 건너뜁니다.
session.heartbeat — ① session.started를 받은 뒤부터 ⑦ session.end를 보내기 전까지 사이에 보냅니다. WebSocket 연결을 오래 유지하는 경우 세션이 만료되지 않도록 주기적으로 호출해 세션을 연장하는 데 사용합니다 (30초 주기 권장).
① session.start — 세션 시작
요청Client → Server · Text 프레임 (JSON)
필드
타입
필수
허용 값
설명
type
string
필수
session.start
메시지 종류
user_sid
string
필수
사용자 식별자
service
string
필수
sr
서비스
operation
string
필수
assess
오퍼레이션
params
object
필수
아래 params.* 하위 필드
요청 파라미터. REST 요청의 params에 ① 방식용 params.mode가 추가됩니다
① 직접 음성 전달 방식 — 참조 음성을 Binary 프레임으로 전송 (아래 ②·③ 단계)
params.mode
string
필수
instance
① 방식 지정. 이 값이 있어야 prepare_reference 전에 받은 Binary 프레임을 참조 음성으로 누적합니다. WebSocket 전용 — REST는 reference_audio 파트로 구분하므로 필요 없습니다
params.reference_text
string
필수
자유 문자열
평가 기준 텍스트. ① 방식에서만 필수입니다
② 등록 ID 방식 — 사전 등록된 참조 음성 지정. 아래 중 하나 전송
아래 중 하나
params.reference_id
string
택1
자유 문자열
등록된 참조 음성 ID. 가장 우선 적용됩니다
params.reference_resource_name
string
택1
자유 문자열
사전 등록 리소스명
params.resource_key
string
택1
자유 문자열
리소스 검색 키
params.resource_id
string
택1
자유 문자열
리소스 ID
공통 선택 파라미터
params.enable_intonation
bool
선택
true · false
억양 곡선 포함 (기본 false). bool이 아닌 값은 무시됩니다
params.recognition_mode
string
선택
no_epd— EPD 미사용 — 오디오 전체를 인식 use_epd— EPD로 발화 구간을 검출해 인식 use_epd_with_sil_append— EPD 사용 + 검출 구간 뒤에 묵음(SIL) 추가
기본 use_epd_with_sil_append. 대소문자 무관
params.set_text_type
string
선택
LIST— 여러 문장 후보 중 1문장을 인식 (후보는 ;로 구분) CHUNK— 1문장을 단어 단위로 분리 입력 (;로 구분) CHUNK_SKIP— CHUNK + 단어 1개를 건너뛸 수 있는 형식 CHUNK_SERIAL— CHUNK + 어느 단어까지 발성했는지 확인 CHUNK_SERIAL_N_SKIP— CHUNK_SKIP과 CHUNK_SERIAL을 함께 적용
기본 LIST. 대소문자 무관
params.resource_name
string
필수
배포 설정에 선언된 리소스에 한함 (대소문자 무관)
인식 리소스. 인식 언어도 이 값으로 결정됩니다. 선언되지 않은 이름은 거부됩니다
params.audio_format
object
선택
아래 audio_format.* 하위 필드
object가 아닌 값(문자열 등)은 무시됩니다
params.audio_format.encoding
string
선택
raw PCM16LE로 해석되는 값 pcm 그 외 값은 검증하지 않고 컨테이너로 디코딩을 시도합니다 (wav · flac · ogg · mp3 등)
인코딩 힌트 (선택). 소문자·trim 후 비교하며, 미지정 시 컨테이너를 탐색한 뒤 raw PCM16LE로 간주합니다.
params.audio_format.sample_rate
int
선택
양의 정수
샘플링 레이트 (기본 16000, 권장 16000). 16kHz로 변환되어 처리됩니다.
params.audio_format.channels
int
선택
양의 정수
채널 수 (기본 1, 권장 1). mono로 변환되어 처리됩니다
params.config
object
선택
아래 config.* 하위 필드
세부 옵션. 범위를 벗어나거나 타입이 맞지 않는 값은 거부되지 않고 무시되며, result.config_status에 -100(정상은 1)으로 보고됩니다
params.config.level
int
선택
0–4
거절의 강도 (기본 1). 값이 클수록 거절 강도가 커집니다.
params.config.tm_limit
int
선택
3–600
한 번의 인식에서 처리할 수 있는 최대 음성 길이(초, 기본 30). 이 길이를 넘는 음성은 인식에 실패합니다.
params.config.pause_th
int
선택
250–2500
발화가 끝났다고 판정하기 위한 최소 묵음 길이(ms, 기본 500). 이 길이만큼 묵음이 이어지면 인식을 종료합니다.
응답Server → Client · session.started
필드
타입
설명
type
string
"session.started" 고정
session_id
string
발급된 세션 ID. 이후 서버가 보내는 모든 메시지에 포함됩니다
subscription_uuid
string
세션에 적용된 구독 UUID
subscription_plan_uid
int
구독 플랜 ID
subscription_status
string
구독 상태
server_time
string
응답 서버 시각 (ISO 8601 UTC)
// 클라이언트 → 서버 — ① 직접 음성 전달 방식
{
"type": "session.start",
"user_sid": "user-2001",
"service": "sr",
"operation": "assess",
"params": {
"mode": "instance",
"reference_text": "Hello world",
"resource_name": "KONG_ALL",
"audio_format": { "sample_rate": 16000, "channels": 1, "encoding": "pcm" }
}
}
// 클라이언트 → 서버 — ② 등록 ID 방식
{
"type": "session.start",
"user_sid": "user-2001",
"service": "sr",
"operation": "assess",
"params": {
"reference_id": "ref-0001",
"resource_name": "KONG_ALL",
"audio_format": { "sample_rate": 16000, "channels": 1, "encoding": "pcm" }
}
}
// 서버 → 클라이언트
{
"type": "session.started",
"session_id": "01HXXXXXXXXXXXXXXXXXXXXXXX",
"subscription_uuid": "…",
"subscription_plan_uid": 0,
"subscription_status": "…",
"server_time": "2026-02-12T10:30:45Z"
}
② 방식에서 참조 조회에 실패하면 session.started 대신 session.error가 오고 연결이 종료됩니다. session.started를 받기 전에 command·Binary 프레임·session.heartbeat·session.end를 보내면
PROTOCOL_VIOLATION으로 연결이 종료됩니다.
api_key 필드는 넣을 수 없으며(INVALID_MESSAGE), API Key는 연결 handshake에서만 전달합니다.
② Binary 오디오 프레임 — 참조 음성 전송 ① 방식만
요청Client → Server · Binary 프레임
프레임
내용
설명
Binary
참조 음성 바이트
①의 params.audio_format 형식으로 해석합니다. JSON 래핑 없이 바이트 그대로 보냅니다
응답Server → Client · data_chunk.ack (프레임마다 1회)
필드
타입
설명
type
string
"data_chunk.ack" 고정
session_id
string
세션 ID
bytes
int
이번 프레임의 수신 바이트 수
server_time
string
응답 서버 시각 (ISO 8601 UTC)
server_processing_time_ns
int
서버 처리 소요 시간 (nanoseconds)
params.mode: "instance" 세션에서 ③ prepare_reference 전에 받은 Binary 프레임은 모두 참조 음성으로 누적됩니다.
③ 이후에 받은 프레임부터 사용자 음성이 됩니다.
③ command: prepare_reference — 참조 확정 ① 방식만
요청Client → Server · Text 프레임 (JSON)
필드
타입
필수
허용 값
설명
type
string
필수
command
메시지 종류
command
string
필수
prepare_reference
커맨드 이름
응답 1Server → Client · ref.ok · ref.failed
필드
타입
설명
type
string
"ref.ok" 또는 "ref.failed"
session_id
string
세션 ID
mode
string
"instance"
reference.ready
bool
참조 준비 성공 여부 (ref.ok는 true)
reference.audio_bytes
int
누적된 참조 음성 바이트 수 (16kHz mono PCM16LE 기준)
reference.text
string
기준 텍스트 (params.reference_text가 있을 때만 포함)
message
string
처리 메시지. 실패 시 사유 (예: reference audio is required for sr/assess instance mode)
ref.ok·ref.failed가 command.ack·command.error보다 먼저 옵니다.
params.reference_text가 없거나 참조 음성을 받지 못했으면 ref.failed 다음 command.error가 옵니다.
이 상태에서 ⑥ finalize_audio를 보내면 reference_not_ready로 거부되므로, 새 세션으로 다시 시작하세요.
이미 확정된 뒤 다시 보내면 ref.ok(message = reference already prepared)를 다시 보냅니다.
아래 표는 REST 응답 본문과 WebSocket assessment.result 메시지에 공통으로 적용됩니다. REST는 응답 본문 최상위에, WebSocket은 결과 메시지 본문에 같은 필드가 담기며, WebSocket 메시지에는 type·is_final이 추가됩니다. REST 전용 표시가 있는 필드는 WebSocket 결과 메시지에 없습니다.
sr/assess 결과
sr/assess 응답 결과 구조입니다. result.ass_res에 종합 점수, result.user_result에 어절·음소 상세가 담깁니다.
필드
타입
설명
session_id
string
세션 ID
server_time
string
응답 서버 시각 (ISO 8601 UTC)
error
object
오류 발생 시 포함 (정상 응답 시 부재). 이때 result·statistics는 부재 REST 전용 — WebSocket은 command.error·session.error 메시지로 전달됩니다
statistics.action
string
실행된 엔진 액션명
statistics.sdk
string
SDK명 (SelvySR)
statistics.runtime
string
런타임 구현체 (sr2lib_runtime) — 런타임 계층의 값이 우선 적용되어 runtime_implementation과 동일한 값이 반환됩니다
session.heartbeat — ① session.started를 받은 뒤부터 ⑤ session.end를 보내기 전까지 사이에 보냅니다. WebSocket 연결을 오래 유지하는 경우 세션이 만료되지 않도록 주기적으로 호출해 세션을 연장하는 데 사용합니다 (30초 주기 권장).
① session.start — 세션 시작
요청Client → Server · Text 프레임 (JSON)
필드
타입
필수
허용 값
설명
type
string
필수
session.start
메시지 종류
user_sid
string
필수
사용자 식별자
service
string
필수
sr
서비스
operation
string
필수
intonation
오퍼레이션
params
object
선택
아래 params.* 하위 필드
요청 파라미터. REST 요청의 params와 같습니다
params.recognition_mode
string
선택
no_epd— EPD 미사용 — 오디오 전체를 인식 use_epd— EPD로 발화 구간을 검출해 인식 use_epd_with_sil_append— EPD 사용 + 검출 구간 뒤에 묵음(SIL) 추가
기본 use_epd_with_sil_append. 대소문자 무관
params.audio_format
object
선택
아래 audio_format.* 하위 필드
object가 아닌 값(문자열 등)은 무시됩니다
params.audio_format.encoding
string
선택
raw PCM16LE로 해석되는 값 pcm 그 외 값은 검증하지 않고 컨테이너로 디코딩을 시도합니다 (wav · flac · ogg · mp3 등)
인코딩 힌트 (선택). 소문자·trim 후 비교하며, 미지정 시 컨테이너를 탐색한 뒤 raw PCM16LE로 간주합니다.
params.audio_format.sample_rate
int
선택
양의 정수
샘플링 레이트 (기본 16000, 권장 16000). 16kHz로 변환되어 처리됩니다.
params.audio_format.channels
int
선택
양의 정수
채널 수 (기본 1, 권장 1). mono로 변환되어 처리됩니다
params.config
object
선택
아래 config.* 하위 필드
세부 옵션. 범위를 벗어나거나 타입이 맞지 않는 값은 거부되지 않고 무시되며, result.config_status에 -100(정상은 1)으로 보고됩니다
params.config.level
int
선택
0–4
거절의 강도 (기본 1). 값이 클수록 거절 강도가 커집니다.
params.config.tm_limit
int
선택
3–600
한 번의 인식에서 처리할 수 있는 최대 음성 길이(초, 기본 30). 이 길이를 넘는 음성은 인식에 실패합니다.
params.config.pause_th
int
선택
250–2500
발화가 끝났다고 판정하기 위한 최소 묵음 길이(ms, 기본 500). 이 길이만큼 묵음이 이어지면 인식을 종료합니다.
session.started를 받기 전에 command·Binary 프레임·session.heartbeat·session.end를 보내면
PROTOCOL_VIOLATION으로 연결이 종료됩니다.
api_key 필드는 넣을 수 없으며(INVALID_MESSAGE), API Key는 연결 handshake에서만 전달합니다.
아래 표는 REST 응답 본문과 WebSocket intonation.result 메시지에 공통으로 적용됩니다. REST는 응답 본문 최상위에, WebSocket은 결과 메시지 본문에 같은 필드가 담기며, WebSocket 메시지에는 type·is_final이 추가됩니다. REST 전용 표시가 있는 필드는 WebSocket 결과 메시지에 없습니다.
sr/intonation 결과
sr/intonation 응답 결과 구조입니다.
필드
타입
설명
session_id
string
세션 ID
server_time
string
응답 서버 시각 (ISO 8601 UTC)
error
object
오류 발생 시 포함 (정상 응답 시 부재). 이때 result·statistics는 부재 REST 전용 — WebSocket은 command.error·session.error 메시지로 전달됩니다
statistics.action
string
실행된 엔진 액션명
statistics.sdk
string
SDK명 (SelvySR)
statistics.runtime
string
런타임 구현체 (sr2lib_runtime) — 런타임 계층의 값이 우선 적용되어 runtime_implementation과 동일한 값이 반환됩니다
statistics.runtime_implementation
string
런타임 구현체 ID (sr2lib_runtime)
statistics.audio_size
int
사용자 음성 바이트 수
statistics.reference_audio_size
int
참조 음성 바이트 수 (없으면 0)
statistics.elapsed_ns
int
처리 소요 시간 (nanoseconds)
statistics.invoke_started_at_ns
int
invoke 시작 타임스탬프 (nanoseconds)
statistics.invoke_completed_at_ns
int
invoke 완료 타임스탬프 (nanoseconds)
result.Intonation
float[]
pitch draw contour 값 배열
result.Loudness
float[]
energy draw contour 값 배열
STT STT(자유 발화)
자유 발화
REST 프로토콜
POST /api/v1/stt/transcribe
요청 필드 JSON 기준
필드
타입
필수
허용 값
설명
user_sid
string
필수
사용자 식별자
params.resource_name
string
필수
배포 설정에 선언된 리소스에 한함
선언되지 않은 이름은 거부됩니다
params.epd
string
선택
off— EPD 미사용 auto_stop— AUTO-STOP — 발화 종료 시 자동 정지, 중간 상세결과 없음 chunk— CHUNK — 구간 검출 시 중간 상세결과 제공 chunk_mid— CHUNK — 구간 검출과 무관하게 중간 상세결과를 계속 제공 bargein— BARGEIN — 끼어들기 감지 전용, 중간 상세결과 없음 auto_stop_mid— AUTO-STOP + 중간 상세결과 제공
끝점 검출 방식 (기본 auto_stop). 대소문자 무관. WebSocket 스트리밍에서 미지정 시 chunk_mid가 적용됩니다. 그 외 값은 400
params.async_mode
int
선택
0— 동기 1— 비동기
기본 0이며, WebSocket 스트리밍은 미지정 시 1
params.async_mid_result
int
선택
0— 비활성 1— 활성
중간 결과 수신. 기본 0이며, WebSocket 스트리밍은 미지정 시 1. 0·1 외의 값은 거부됩니다
params.audio_format
object
선택
아래 audio_format.* 하위 필드
object가 아닌 값(문자열 등)은 무시됩니다
params.audio_format.encoding
string
선택
raw PCM16LE로 해석되는 값 pcm 그 외 값은 검증하지 않고 컨테이너로 디코딩을 시도합니다 (wav · flac · ogg · mp3 등)
인코딩 힌트 (선택). 소문자·trim 후 비교하며, 미지정 시 컨테이너를 탐색한 뒤 raw PCM16LE로 간주합니다.
params.audio_format.sample_rate
int
선택
양의 정수
샘플링 레이트 (기본 16000, 권장 16000). 16kHz로 변환되어 처리됩니다.
params.audio_format.channels
int
선택
양의 정수
채널 수 (기본 1, 권장 1). mono로 변환되어 처리됩니다
params.config
object
선택
위 파라미터와 동일한 키 + 아래 config.* 하위 필드
위 파라미터를 중첩 객체로 전달할 수 있습니다(동일 키 병합). 아래 필드는 config로만 지정합니다
params.config.epd_start_timeout_sec
int
선택
0 이상
발화 시작 대기 타임아웃(초, 기본 0=미사용). epd_duration_timeout_sec와 함께 설정하거나 둘 다 0이어야 하며, 한쪽만 0보다 크면 400
params.config.epd_duration_timeout_sec
int
선택
0 이상
발화 길이 타임아웃(초, 기본 0=미사용). 위와 동일한 쌍 제약
params.config.epd_margin_sec
float
선택
임의의 실수
EPD 구간 마진(초, 기본 -1.0=미지정)
params.config.async_result
int
선택
0— 비활성 1— 활성
비동기 최종 결과 수신 (기본 0). WebSocket 스트리밍에서 미지정 시 1
인식 언어는 resource_name으로 선택하세요.
model_id는 이 문서에서 안내하지 않습니다 — resource_name과 역할이 같기 때문입니다.
모델 선택은 resource_name 하나만 사용하세요.
params 외에 멀티파트 audio 파트를 반드시 함께 전송해야 합니다.
응답은 recognition.result 형식이며, WebSocket 사용 시
recognition.partial 중간 결과를 함께 수신할 수 있습니다.
한 연결에서 아래 순서로 메시지를 주고받습니다. Text 프레임은 JSON 제어 메시지이고, Binary 프레임은 오디오입니다. 아래 요청·응답 필드는 모두 JSON 메시지 기준입니다.
연결 인증은 인증 (API Key)과 브라우저 인증을 참고하세요.
STT · 자유 발화 세션 흐름도
Client Server
────── ──────
① session.start ─▶
◀─ session.started (session_id 발급)
② command: start_audio ─▶
◀─ command.ack (STT 스트리밍 시작)
③ [binary audio frame] ─▶
◀─ data_chunk.ack (프레임마다 1회)
◀─ recognition.partial … (중간 결과, 비동기)
④ command: finalize_audio ─▶
◀─ command.ack (처리 접수)
◀─ recognition.partial … (마무리 중 변경 시)
◀─ recognition.result (최종 결과)
⑤ session.end ─▶
◀─ session.ended
※session.heartbeat ─▶ (① ~ ⑤ 사이, 30초 권장)
◀─ session.heartbeat.ack
session.heartbeat — ① session.started를 받은 뒤부터 ⑤ session.end를 보내기 전까지 사이에 보냅니다. WebSocket 연결을 오래 유지하는 경우 세션이 만료되지 않도록 주기적으로 호출해 세션을 연장하는 데 사용합니다 (30초 주기 권장). 특히 finalize_audio 뒤 결과를 기다리는 동안에는 ack의 operation_async로 처리 진행 상태도 확인할 수 있습니다.
① session.start — 세션 시작
요청Client → Server · Text 프레임 (JSON)
필드
타입
필수
허용 값
설명
type
string
필수
session.start
메시지 종류
user_sid
string
필수
사용자 식별자
service
string
필수
stt
서비스
operation
string
필수
transcribe
오퍼레이션
params
object
필수
아래 params.* 하위 필드
요청 파라미터. REST 요청의 params와 같습니다
params.resource_name
string
필수
배포 설정에 선언된 리소스에 한함
선언되지 않은 이름은 거부됩니다
params.epd
string
선택
off— EPD 미사용 auto_stop— AUTO-STOP — 발화 종료 시 자동 정지, 중간 상세결과 없음 chunk— CHUNK — 구간 검출 시 중간 상세결과 제공 chunk_mid— CHUNK — 구간 검출과 무관하게 중간 상세결과를 계속 제공 bargein— BARGEIN — 끼어들기 감지 전용, 중간 상세결과 없음 auto_stop_mid— AUTO-STOP + 중간 상세결과 제공
끝점 검출 방식 (기본 auto_stop). 대소문자 무관. WebSocket 스트리밍에서 미지정 시 chunk_mid가 적용됩니다. 그 외 값은 400
params.async_mode
int
선택
0— 동기 1— 비동기
기본 0이며, WebSocket 스트리밍은 미지정 시 1
params.async_mid_result
int
선택
0— 비활성 1— 활성
중간 결과 수신. 기본 0이며, WebSocket 스트리밍은 미지정 시 1. 0·1 외의 값은 거부됩니다
params.audio_format
object
선택
아래 audio_format.* 하위 필드
object가 아닌 값(문자열 등)은 무시됩니다
params.audio_format.encoding
string
선택
raw PCM16LE로 해석되는 값 pcm 그 외 값은 검증하지 않고 컨테이너로 디코딩을 시도합니다 (wav · flac · ogg · mp3 등)
인코딩 힌트 (선택). 소문자·trim 후 비교하며, 미지정 시 컨테이너를 탐색한 뒤 raw PCM16LE로 간주합니다.
params.audio_format.sample_rate
int
선택
양의 정수
샘플링 레이트 (기본 16000, 권장 16000). 16kHz로 변환되어 처리됩니다.
params.audio_format.channels
int
선택
양의 정수
채널 수 (기본 1, 권장 1). mono로 변환되어 처리됩니다
params.config
object
선택
위 파라미터와 동일한 키 + 아래 config.* 하위 필드
위 파라미터를 중첩 객체로 전달할 수 있습니다(동일 키 병합). 아래 필드는 config로만 지정합니다
params.config.epd_start_timeout_sec
int
선택
0 이상
발화 시작 대기 타임아웃(초, 기본 0=미사용). epd_duration_timeout_sec와 함께 설정하거나 둘 다 0이어야 하며, 한쪽만 0보다 크면 400
session.started를 받기 전에 command·Binary 프레임·session.heartbeat·session.end를 보내면
PROTOCOL_VIOLATION으로 연결이 종료됩니다.
api_key 필드는 넣을 수 없으며(INVALID_MESSAGE), API Key는 연결 handshake에서만 전달합니다.
// 서버 → 클라이언트 (오디오 수신 중 수시로)
{
"type": "recognition.partial",
"session_id": "01HXXXXXXXXXXXXXXXXXXXXXXX",
"is_final": false,
"result": { … },
"mid": "Hello my name",
"statistics": { "streaming": true, "runtime_event": true, "runtime_msg": "progress", "runtime_phase": "…" },
"server_time": "2026-02-12T10:30:45Z"
}
data_chunk.ack는 수신 확인일 뿐 최종 결과가 아닙니다. 최종 결과는 ④ finalize_audio 이후에 옵니다. recognition.partial은 중간 인식 결과(텍스트·EPD 상태 등)가 바뀔 때만 data_chunk.ack와 별개로 전송됩니다. params.async_mid_result를 0으로 두면 보내지 않습니다.
EPD가 발화 종료를 검출하면 그 프레임의 ack에 statistics.streaming_end_detected: true가 실립니다. 이후 프레임은 오류 없이 ack되지만 인식에는 반영되지 않으므로(audio_accepted: false), 오디오 전송을 멈추고 ④로 진행하세요.
// 클라이언트 → 서버
{ "type": "command", "command": "finalize_audio" }
// 서버 → 클라이언트 (1) 처리 접수
{
"type": "command.ack",
"session_id": "01HXXXXXXXXXXXXXXXXXXXXXXX",
"command": "finalize_audio",
"server_time": "2026-02-12T10:30:46Z",
"server_processing_time_ns": 120000
}
// 서버 → 클라이언트 (2) 최종 결과
{
"type": "recognition.result",
"session_id": "01HXXXXXXXXXXXXXXXXXXXXXXX",
"is_final": true,
"result": { "result_type": "recognition", "text": "Hello my name is Tom", … },
"statistics": { … },
"server_time": "2026-02-12T10:30:47Z"
}
WebSocket 스트리밍은 기본적으로 비동기(params.async_mode 미지정 시 1)로 마무리됩니다.
command.ack는 처리 접수만 뜻하며, 마무리 중 중간 결과가 바뀌면 recognition.partial이 더 올 수 있고
마지막에 recognition.result가 한 번 옵니다. params.async_mode를 0으로 두면
처리를 마친 뒤 command.ack와 recognition.result를 연달아 보냅니다.
비동기 처리 중에는 session.heartbeat.ack의 operation_async로 진행 상태를 확인할 수 있습니다.
operation_async.state는 queued → running → completed 순으로 바뀌며,
처리에 실패하면 별도 오류 메시지 없이failed가 되고 operation_async.progress.error_code·error_message에 사유가 실립니다.
결과가 오지 않으면 heartbeat로 이 상태를 확인하세요.
session.end는 finalize_audio를 대신 실행하지 않습니다. 결과가 필요하면 ④를 먼저 보내세요. 최종 결과를 받기 전에 보내면 진행 중인 처리가 취소됩니다.
세션을 오래 유지할 때는 session.heartbeat를 주기적으로 보내 세션을 연장하세요 (30초 주기 권장).
오류 응답
서버는 상황에 따라 두 종류의 오류 메시지를 보냅니다. 오류 코드는 에러 코드를 참고하세요.
타입
발생 시점
세션
command.error
start_audio · finalize_audio 등 커맨드 처리 실패 (예: STT 스트리밍 시작 실패, 필수 입력 누락)
아래 표는 REST 응답 본문과 WebSocket recognition.result 메시지에 공통으로 적용됩니다. REST는 응답 본문 최상위에, WebSocket은 결과 메시지 본문에 같은 필드가 담기며, WebSocket 메시지에는 type·is_final이 추가됩니다. REST 전용 표시가 있는 필드는 WebSocket 결과 메시지에 없습니다.
stt/transcribe 결과
stt/transcribe 응답 결과 구조입니다.
필드
타입
설명
session_id
string
세션 ID
server_time
string
응답 서버 시각 (ISO 8601 UTC)
statistics.audio_size
int
사용자 음성 바이트 수
statistics.data_chunks
int
수신한 오디오 청크 수
statistics.streaming
bool
스트리밍(WebSocket) 세션 여부
statistics.streaming_end_detected
bool
스트리밍 중 EPD 종료 검출 여부
statistics.runtime
string
런타임 서비스 키 (selvasai_lvcsr)
statistics.runtime_implementation
string
런타임 구현체 ID (selvasai_lvcsr_runtime)
result.result_type
string
결과 유형 ("recognition"). WebSocket 메시지의 type은 recognition.result
result.text
string
인식된 전사 텍스트
result.score
float
인식 신뢰도 점수
result.words[]
array
토큰 단위 어절 배열
result.words[].text
string
어절 텍스트
result.words[].score
float
어절 인식 신뢰도
result.words[].start
int
시작 시각 (ms)
result.words[].end
int
종료 시각 (ms)
result.words[].raw_data
object
토큰 원본 데이터
result.words[].raw_data.text
string
토큰 텍스트
result.words[].raw_data.score
float
토큰 인식 신뢰도
result.words[].raw_data.start
int
시작 시각 (ms)
result.words[].raw_data.end
int
종료 시각 (ms)
result.words[].raw_data.speaker
int
화자 ID (-1: 화자 미구분)
result.raw_data
object
SDK 원본 전체 데이터 (엔진 passthrough)
result.raw_data.streaming
bool
스트리밍 세션 여부 — WebSocket 응답에만 포함
result.raw_data.phase
string
스트리밍 단계 (예: end) — WebSocket 응답에만 포함
result.raw_data.open
bool
엔진 세션 유지 여부 — WebSocket 응답에만 포함
result.raw_data.send
object
중간 결과 전송 진단 정보 (send.mid.*) — WebSocket 응답에만 포함
result.raw_data.result
object
WebSocket 응답에서는 아래 text·score·speakers·epd·timestamp·tokens[]·result_poll_attempts가 이 result.raw_data.result.* 아래에 한 단계 더 중첩됩니다. REST 단발 응답에서는 result.raw_data.* 직하에 위치합니다
result.raw_data.text
string
인식 텍스트
result.raw_data.score
float
인식 신뢰도
result.raw_data.speakers
int
화자 수
result.raw_data.transaction_id
string
트랜잭션 ID
result.raw_data.result_poll_attempts
int
결과 폴링 시도 횟수
result.raw_data.final_wait_mid_results[]
array
최종 결과 대기 중 수집된 중간 결과 목록 (스트리밍 + 중간결과 활성 시에만 포함)
result.raw_data.epd
object
음성 구간 검출 정보
result.raw_data.epd.start
int
음성 시작 시각 (ms)
result.raw_data.epd.end
int
음성 종료 시각 (ms)
result.raw_data.timestamp
object
처리 시간 정보
result.raw_data.timestamp.start
int
EPD 시작 오프셋 (ms)
result.raw_data.timestamp.end
int
EPD 종료 오프셋 (ms)
result.raw_data.timestamp.start_time
object
처리 시작 시각 (year, month, day, hour, minute, second, millisecond)
result.raw_data.timestamp.end_time
object
처리 종료 시각 (year, month, day, hour, minute, second, millisecond)
result.raw_data.tokens[]
array
인식 토큰 원본 배열
result.raw_data.tokens[].text
string
토큰 텍스트
result.raw_data.tokens[].score
float
토큰 인식 신뢰도
result.raw_data.tokens[].start
int
시작 시각 (ms)
result.raw_data.tokens[].end
int
종료 시각 (ms)
result.raw_data.tokens[].speaker
int
화자 ID (-1: 화자 미구분)
result.metadata
object
처리 부가 정보
result.metadata.speakers
int
화자 수
result.metadata.transaction_id
string
트랜잭션 ID
result.metadata.epd
object
음성 구간 검출 정보 (start, end)
result.metadata.timestamp
object
처리 시간 정보 (start, end, start_time, end_time)
result.metadata.streaming
bool
스트리밍 세션 여부 — WebSocket 응답에만 포함
result.metadata.phase
string
스트리밍 단계 — WebSocket 응답에만 포함
result.metadata.open
bool
엔진 세션 유지 여부 — WebSocket 응답에만 포함
Phonics 파닉스
파닉스 분석
REST 프로토콜
POST /api/v1/phonics/analyze
요청 필드 JSON 기준
필드
타입
필수
허용 값
설명
user_sid
string
필수
사용자 식별자
params.phonics_type
string
필수
word— 단어 단위 분석 sentence— 문장 단위 분석
분석 단위. 대소문자 무관. 미지정 시 phonics_type is required 오류, 그 외 값은 400
params.phonics_id
int
택1
임의의 정수
파닉스 콘텐츠 ID (phonics_text와 정확히 하나만 전송 — 둘 다 있거나 둘 다 없으면 오류)
params.phonics_text
string
택1
영문자·공백·ASCII 구두점 영문자 1자 이상 필수, 숫자 불가
분석 대상 텍스트 (phonics_id와 택1). 구두점은 단어 경계로 정규화됩니다
params.resource_name
string
필수
배포 설정에 선언된 Phonics 전용 리소스에 한함
일반 STT 모델을 지정하면 실패합니다
params.audio_format
object
선택
아래 audio_format.* 하위 필드
object가 아닌 값(문자열 등)은 무시됩니다
params.audio_format.encoding
string
선택
raw PCM16LE로 해석되는 값 pcm 그 외 값은 검증하지 않고 컨테이너로 디코딩을 시도합니다 (wav · flac · ogg · mp3 등)
인코딩 힌트 (선택). 소문자·trim 후 비교하며, 미지정 시 컨테이너를 탐색한 뒤 raw PCM16LE로 간주합니다.
params.audio_format.sample_rate
int
선택
양의 정수
샘플링 레이트 (기본 16000, 권장 16000). 16kHz로 변환되어 처리됩니다.
params.audio_format.channels
int
선택
양의 정수
채널 수 (기본 1, 권장 1). mono로 변환되어 처리됩니다
params.epd
string
선택
off— EPD 미사용 auto_stop— AUTO-STOP — 발화 종료 시 자동 정지, 중간 상세결과 없음 chunk— CHUNK — 구간 검출 시 중간 상세결과 제공 chunk_mid— CHUNK — 구간 검출과 무관하게 중간 상세결과를 계속 제공 bargein— BARGEIN — 끼어들기 감지 전용, 중간 상세결과 없음 auto_stop_mid— AUTO-STOP + 중간 상세결과 제공
끝점 검출 방식 (기본 auto_stop). 대소문자 무관. 그 외 값은 400
params.config
object
선택
위 파라미터와 동일한 키 (phonics_type·epd 포함) + 아래 config.* 하위 필드
위 파라미터를 중첩 객체로 전달할 수 있습니다(동일 키 병합). async_* 계열은 전달해도 phonics가 항상 동기 처리되어 효과가 없습니다
params.config.epd_start_timeout_sec
int
선택
0 이상
발화 시작 대기 타임아웃(초, 기본 0=미사용). epd_duration_timeout_sec와 함께 설정하거나 둘 다 0이어야 하며, 한쪽만 0보다 크면 400
params.config.epd_duration_timeout_sec
int
선택
0 이상
발화 길이 타임아웃(초, 기본 0=미사용). 위와 동일한 쌍 제약
params.config.epd_margin_sec
float
선택
임의의 실수
EPD 구간 마진(초, 기본 -1.0=미지정)
params.config.async_result
int
선택
0— 비활성 1— 활성
비동기 최종 결과 수신 (기본 0). WebSocket 스트리밍에서 미지정 시 1
model_id는 이 문서에서 안내하지 않습니다 — resource_name과 역할이 같기 때문입니다.
모델 선택은 resource_name 하나만 사용하세요.
async_mode·async_mid_result도 전달은 가능하지만 phonics는 항상 동기 처리되어 효과가 없습니다.
결과 타입 phonics.result는 WebSocket 메시지의 type이며, REST 단발 응답 본문에는
type·result_type 필드가 없습니다.
session.heartbeat — ① session.started를 받은 뒤부터 ⑤ session.end를 보내기 전까지 사이에 보냅니다. WebSocket 연결을 오래 유지하는 경우 세션이 만료되지 않도록 주기적으로 호출해 세션을 연장하는 데 사용합니다 (30초 주기 권장).
① session.start — 세션 시작
요청Client → Server · Text 프레임 (JSON)
필드
타입
필수
허용 값
설명
type
string
필수
session.start
메시지 종류
user_sid
string
필수
사용자 식별자
service
string
필수
phonics
서비스
operation
string
필수
analyze
오퍼레이션
params
object
필수
아래 params.* 하위 필드
요청 파라미터. REST 요청의 params와 같습니다
params.phonics_type
string
필수
word— 단어 단위 분석 sentence— 문장 단위 분석
분석 단위. 대소문자 무관. 미지정 시 phonics_type is required 오류, 그 외 값은 400
params.phonics_id
int
택1
임의의 정수
파닉스 콘텐츠 ID (phonics_text와 정확히 하나만 전송 — 둘 다 있거나 둘 다 없으면 오류)
params.phonics_text
string
택1
영문자·공백·ASCII 구두점 영문자 1자 이상 필수, 숫자 불가
분석 대상 텍스트 (phonics_id와 택1). 구두점은 단어 경계로 정규화됩니다
params.resource_name
string
필수
배포 설정에 선언된 Phonics 전용 리소스에 한함
일반 STT 모델을 지정하면 실패합니다
params.audio_format
object
선택
아래 audio_format.* 하위 필드
object가 아닌 값(문자열 등)은 무시됩니다
params.audio_format.encoding
string
선택
raw PCM16LE로 해석되는 값 pcm 그 외 값은 검증하지 않고 컨테이너로 디코딩을 시도합니다 (wav · flac · ogg · mp3 등)
인코딩 힌트 (선택). 소문자·trim 후 비교하며, 미지정 시 컨테이너를 탐색한 뒤 raw PCM16LE로 간주합니다.
params.audio_format.sample_rate
int
선택
양의 정수
샘플링 레이트 (기본 16000, 권장 16000). 16kHz로 변환되어 처리됩니다.
params.audio_format.channels
int
선택
양의 정수
채널 수 (기본 1, 권장 1). mono로 변환되어 처리됩니다
params.epd
string
선택
off— EPD 미사용 auto_stop— AUTO-STOP — 발화 종료 시 자동 정지, 중간 상세결과 없음 chunk— CHUNK — 구간 검출 시 중간 상세결과 제공 chunk_mid— CHUNK — 구간 검출과 무관하게 중간 상세결과를 계속 제공 bargein— BARGEIN — 끼어들기 감지 전용, 중간 상세결과 없음 auto_stop_mid— AUTO-STOP + 중간 상세결과 제공
끝점 검출 방식 (기본 auto_stop). 대소문자 무관. 그 외 값은 400
params.config
object
선택
위 파라미터와 동일한 키 (phonics_type·epd 포함) + 아래 config.* 하위 필드
위 파라미터를 중첩 객체로 전달할 수 있습니다(동일 키 병합). async_* 계열은 전달해도 phonics가 항상 동기 처리되어 효과가 없습니다
params.config.epd_start_timeout_sec
int
선택
0 이상
발화 시작 대기 타임아웃(초, 기본 0=미사용). epd_duration_timeout_sec와 함께 설정하거나 둘 다 0이어야 하며, 한쪽만 0보다 크면 400
session.started를 받기 전에 command·Binary 프레임·session.heartbeat·session.end를 보내면
PROTOCOL_VIOLATION으로 연결이 종료됩니다.
api_key 필드는 넣을 수 없으며(INVALID_MESSAGE), API Key는 연결 handshake에서만 전달합니다.
처리가 끝나면 command.ack와 phonics.result가 이 순서로 연달아 옵니다.
커맨드가 실패하면 두 메시지 대신 command.error가 오며, 세션은 유지됩니다.
Phonics는 스트리밍 인식을 하지 않으며 recognition.partial을 보내지 않습니다. async_* 값과 관계없이 항상 동기로 처리됩니다.
아래 표는 REST 응답 본문과 WebSocket phonics.result 메시지에 공통으로 적용됩니다. REST는 응답 본문 최상위에, WebSocket은 결과 메시지 본문에 같은 필드가 담기며, WebSocket 메시지에는 type·is_final이 추가됩니다. REST 전용 표시가 있는 필드는 WebSocket 결과 메시지에 없습니다.
phonics/analyze 결과
phonics/analyze 응답 결과 구조입니다. phonics_type에 따라 sentence / word 두 가지 형태로 반환됩니다.
sentence 모드
필드
타입
설명
session_id
string
세션 ID
server_time
string
응답 서버 시각 (ISO 8601 UTC)
error
object
오류 발생 시 포함 (정상 응답 시 부재). 이때 result·statistics는 부재 REST 전용 — WebSocket은 command.error·session.error 메시지로 전달됩니다
statistics.audio_size
int
사용자 음성 바이트 수
statistics.data_chunks
int
수신한 오디오 청크 수
statistics.streaming
bool
스트리밍 채널 사용 여부 (phonics는 항상 false)
statistics.streaming_end_detected
bool
스트리밍 EPD 종료 검출 여부 (phonics는 항상 false)
statistics.runtime
string
런타임 서비스 키 (selvasai_lvcsr)
statistics.runtime_implementation
string
런타임 구현체 ID (selvasai_lvcsr_runtime)
result.phonics_type
string
"sentence"
result.text
string
ARPABET 기호 인식 텍스트
result.score
float
인식 확률값 (0–1) — 발음 점수가 아닌 SDK 인식 신뢰도
result.phonics_count
int
phonics 배열 크기
result.transaction_id
string
트랜잭션 ID
result.epd
object
음성 구간 검출 정보
result.epd.start
int
음성 시작 시각 (ms)
result.epd.end
int
음성 종료 시각 (ms)
result.tokens[]
array
인식 토큰 배열
result.tokens[].text
string
토큰 텍스트 (ARPABET 기호)
result.tokens[].score
float
토큰 인식 신뢰도
result.tokens[].start
int
시작 시각 (ms)
result.tokens[].end
int
종료 시각 (ms)
result.tokens[].speaker
int
화자 ID
result.phonics[]
array
단어별 Phonics 결과
result.phonics[].score
float
Correctness 비율 (Match / Total, 0–1) — sentence 모드에서는 SDK가 값을 채우지 않아 0.0으로 반환됨
result.phonics[].json_raw
string
SDK 원본 JSON 문자열
result.phonics[].json
object
SDK 원본 파싱 결과
result.phonics[].json.text
string
단어 표기
result.phonics[].json.uid
string
단어 고유 식별자
result.phonics[].json.arpabet
string
ARPABET 기호
result.phonics[].json.ipa
string
IPA 기호
result.phonics[].json.phones[]
array
음소 배열
result.phonics[].json.phones[].text
string
음소에 해당하는 철자
result.phonics[].json.phones[].arpabet
string
ARPABET 기호
result.phonics[].json.phones[].ipa
string
IPA 기호
result.phonics[].json.phones[].ipa#
int
IPA 기호 코드값
result.phonics[].json.phones[].score
float
발음 점수 (0–100)
result.phonics[].json.phones[].soundlike
object
실제 들린 음소 정보
result.phonics[].json.phones[].soundlike.arpabet
string
실제 들린 ARPABET 기호
result.phonics[].json.phones[].soundlike.ipa
string
실제 들린 IPA 기호
result.phonics[].json.phones[].soundlike.score
float
유사도 점수
result.phonics[].json.phones[].DF[]
array
변별적 자질 진단
result.phonics[].json.phones[].DF[].text
string
자질 이름
result.phonics[].json.phones[].DF[].defined
string
목표값 ("+" / "-")
result.phonics[].json.phones[].DF[].detected
bool
실제 발화 검출 여부
result.phonics[].json.evals[]
array
음절-음소 매핑 평가 배열
result.phonics[].json.evals[].text
string
철자
result.phonics[].json.evals[].arpabet
string
ARPABET 기호
result.phonics[].json.evals[].ipa
string
IPA 기호
result.phonics[].json.evals[].score
float
발음 점수 (0–100)
result.phonics[].json.evals[].pSt
int
음소 시작 인덱스 — 문장 전체 기준이며 해당 단어의 phones[] 지역 인덱스가 아님
result.phonics[].json.evals[].pEd
int
음소 종료 인덱스 (exclusive, 문장 전체 기준)
result.phonics[].json.syllables[]
array
음절 배열
result.phonics[].json.syllables[].text
string
음절 철자
result.phonics[].json.syllables[].arpabet
string
음절 ARPABET 기호
result.phonics[].json.syllables[].ipa
string
음절 IPA 기호
result.phonics[].json.syllables[].score
float
음절 발음 점수
result.phonics[].json.syllables[].eSt
int
evals[] 시작 인덱스 — 문장 전체 기준
result.phonics[].json.syllables[].eEd
int
evals[] 종료 인덱스 (exclusive, 문장 전체 기준)
word 모드
필드
타입
설명
session_id
string
세션 ID
server_time
string
응답 서버 시각 (ISO 8601 UTC)
error
object
오류 발생 시 포함 (정상 응답 시 부재). 이때 result·statistics는 부재 REST 전용 — WebSocket은 command.error·session.error 메시지로 전달됩니다
statistics.audio_size
int
사용자 음성 바이트 수
statistics.data_chunks
int
수신한 오디오 청크 수
statistics.streaming
bool
스트리밍 채널 사용 여부 (phonics는 항상 false)
statistics.streaming_end_detected
bool
스트리밍 EPD 종료 검출 여부 (phonics는 항상 false)
statistics.runtime
string
런타임 서비스 키 (selvasai_lvcsr)
statistics.runtime_implementation
string
런타임 구현체 ID (selvasai_lvcsr_runtime)
result.phonics_type
string
"word"
result.text
string
ARPABET 기호 인식 텍스트
result.score
float
인식 신뢰도 점수
result.correctness_score
float
발음 정확도 점수 (0–100)
result.transaction_id
string
트랜잭션 ID
result.epd
object
음성 구간 검출 정보
result.epd.start
int
음성 시작 시각 (ms)
result.epd.end
int
음성 종료 시각 (ms)
result.json_raw
string
SDK 원본 JSON 문자열
result.json
object
SDK 원본 파싱 결과
result.json.text
string
단어 표기
result.json.uid
string
단어 고유 식별자
result.json.arpabet
string
ARPABET 기호
result.json.ipa
string
IPA 기호
result.json.phones[]
array
음소 배열
result.json.phones[].text
string
음소에 해당하는 철자
result.json.phones[].arpabet
string
ARPABET 기호
result.json.phones[].ipa
string
IPA 기호
result.json.phones[].ipa#
int
IPA 기호 코드값
result.json.phones[].score
float
발음 점수 (0–100)
result.json.phones[].soundlike
object
실제 들린 음소 정보
result.json.phones[].soundlike.arpabet
string
실제 들린 ARPABET 기호
result.json.phones[].soundlike.ipa
string
실제 들린 IPA 기호
result.json.phones[].soundlike.score
float
유사도 점수
result.json.phones[].DF[]
array
변별적 자질 진단
result.json.phones[].DF[].text
string
자질 이름
result.json.phones[].DF[].defined
string
목표값 ("+" / "-")
result.json.phones[].DF[].detected
bool
실제 발화 검출 여부
result.json.evals[]
array
음절-음소 매핑 평가 배열
result.json.evals[].text
string
철자
result.json.evals[].arpabet
string
ARPABET 기호
result.json.evals[].ipa
string
IPA 기호
result.json.evals[].score
float
발음 점수 (0–100)
result.json.evals[].pSt
int
phones[] 시작 인덱스
result.json.evals[].pEd
int
phones[] 종료 인덱스 (exclusive)
result.json.syllables[]
array
음절 배열
result.json.syllables[].text
string
음절 철자
result.json.syllables[].arpabet
string
음절 ARPABET 기호
result.json.syllables[].ipa
string
음절 IPA 기호
result.json.syllables[].score
float
음절 발음 점수
result.json.syllables[].eSt
int
evals[] 시작 인덱스
result.json.syllables[].eEd
int
evals[] 종료 인덱스 (exclusive)
result.tokens[]
array
인식 토큰 배열
result.tokens[].text
string
토큰 텍스트
result.tokens[].score
float
토큰 인식 신뢰도
result.tokens[].start
int
시작 시각 (ms)
result.tokens[].end
int
종료 시각 (ms)
result.tokens[].speaker
int
화자 ID
RFA 읽기 유창성
읽기 유창성 평가
REST 프로토콜
POST /api/v1/rfa/rfa
기준 문장을 읽은 사용자 발화를 음성 인식하여 제시문장의 완독률을 분석한 후 SR을 통해 발음 유창성을 평가하는 복합 오퍼레이션입니다.
요청 필드 JSON 기준
필드
타입
필수
허용 값
설명
user_sid
string
필수
사용자 식별자
params.reference_text
string
필수
자유 문자열 (비어 있지 않아야 함)
기준 문장. 비어 있으면 요청이 거부됩니다
params.resource_name
string
필수
배포 설정에 선언된 리소스에 한함
평가 엔진 리소스. 인식 언어도 이 값으로 결정됩니다
params.stt_resource_name
string
선택
배포 설정에 선언된 리소스에 한함
음성 인식 모델 요청별 override
params.config
object
선택
아래 config.* 하위 필드
음성 인식 세부 옵션 override
params.config.epd
string
선택
off— EPD 미사용 (RFA 기본값) auto_stop— AUTO-STOP — 발화 종료 시 자동 정지 chunk— CHUNK — 구간 검출 시 중간 상세결과 제공 chunk_mid— CHUNK — 중간 상세결과를 계속 제공 bargein— BARGEIN — 끼어들기 감지 전용
RFA 기본값은 off(EPD 미사용)이라 발화 전체를 평가합니다. RFA는 auto_stop_mid를 지원하지 않으며, 해석할 수 없는 값은 거부되지 않고 그대로 전달됩니다
params.config.epd_start_timeout_sec
int
선택
0 이상
발화 시작 대기 타임아웃(초, 기본 0=미사용). epd_duration_timeout_sec와 함께 설정하거나 둘 다 0이어야 하며, 한쪽만 0보다 크면 400
params.config.epd_duration_timeout_sec
int
선택
0 이상
발화 길이 타임아웃(초, 기본 0=미사용). 위와 동일한 쌍 제약
params.config.epd_margin_sec
float
선택
임의의 실수
EPD 구간 마진(초, 기본 -1.0=미지정)
params.audio_format
object
선택
아래 audio_format.* 하위 필드
16kHz mono로 디코딩됩니다. object가 아닌 값은 무시됩니다
params.audio_format.encoding
string
선택
raw PCM16LE로 해석되는 값 pcm 그 외 값은 검증하지 않고 컨테이너로 디코딩을 시도합니다 (wav · flac · ogg · mp3 등)
인코딩 힌트 (선택). 소문자·trim 후 비교하며, 미지정 시 컨테이너를 탐색한 뒤 raw PCM16LE로 간주합니다.
params.audio_format.sample_rate
int
선택
양의 정수
샘플링 레이트 (기본 16000, 권장 16000). 16kHz로 변환되어 처리됩니다.
params.audio_format.channels
int
선택
양의 정수
채널 수 (기본 1, 권장 1). mono로 변환되어 처리됩니다
응답 (REST batch)
공통 필드에 더해 recognition(음성 인식 결과 이벤트 전체)과 events[] 배열이 항상 포함됩니다.
recognition은 이벤트 봉투이므로 인식 텍스트는 recognition.result.text로 접근합니다.
curl -X POST "https://{host}/api/v1/rfa/rfa" \
-H "Authorization: Bearer $API_KEY" \
-F 'request={"user_sid":"user-2001","params":{
"reference_text":"Honeybees are small insects that play a huge role in nature.",
"resource_name":"KONG_ALL"}};type=application/json' \
-F "audio=@reading.wav"
import requests, json
resp = requests.post(
"https://{host}/api/v1/rfa/rfa",
headers={"Authorization": f"Bearer {API_KEY}"},
files={
"request": (None, json.dumps({
"user_sid": "user-2001",
"params": {
"reference_text": "Honeybees are small insects that play a huge role in nature.",
"resource_name": "KONG_ALL",
# 필요 시 음성 인식 모델 override:
# "stt_resource_name": "…", "config": {"epd": 0},
},
}), "application/json"),
"audio": ("reading.wav", open("reading.wav", "rb"), "audio/wav"),
},
)
body = resp.json()
# recognition은 이벤트 봉투이므로 한 단계 더 들어갑니다.
print("인식:", body["recognition"]["result"]["text"])
print("RFA:", body["result"]["accuracy"], body["result"]["completeness"])
const fs = require("fs");
const path = require("path");
const HOST = "https://{host}";
async function main() {
const filePath = "./reading.wav";
const fd = new FormData();
fd.append(
"request",
new Blob(
[
JSON.stringify({
user_sid: "user-2001",
params: {
reference_text: "Honeybees are small insects that play a huge role in nature.",
resource_name: "KONG_ALL",
},
}),
],
{ type: "application/json" }
)
);
fd.append("audio", new Blob([fs.readFileSync(filePath)]), path.basename(filePath));
const res = await fetch(`${HOST}/api/v1/rfa/rfa`, {
method: "POST",
headers: { Authorization: `Bearer ${API_KEY}` },
body: fd,
});
if (!res.ok) {
console.error("HTTP Error:", res.status, await res.text());
return;
}
const json = await res.json();
console.log(json.result);
}
main();
한 연결에서 아래 순서로 메시지를 주고받습니다. Text 프레임은 JSON 제어 메시지이고, Binary 프레임은 오디오입니다. 아래 요청·응답 필드는 모두 JSON 메시지 기준입니다.
연결 인증은 인증 (API Key)과 브라우저 인증을 참고하세요.
RFA · 읽기 유창성 평가 세션 흐름도
Client Server
────── ──────
① session.start ─▶
◀─ session.started (session_id 발급)
② command: start_audio ─▶
◀─ command.ack (RFA 스트리밍 시작)
③ [binary audio frame] ─▶
◀─ data_chunk.ack (프레임마다 1회)
◀─ recognition.partial … (RFA 중간 결과, 비동기)
④ command: finalize_audio ─▶
◀─ command.ack (처리 접수)
◀─ recognition.result (최종 인식 결과)
◀─ rfa.result (RFA 평가 결과)
⑤ session.end ─▶
◀─ session.ended
※session.heartbeat ─▶ (① ~ ⑤ 사이, 30초 권장)
◀─ session.heartbeat.ack
session.heartbeat — ① session.started를 받은 뒤부터 ⑤ session.end를 보내기 전까지 사이에 보냅니다. WebSocket 연결을 오래 유지하는 경우 세션이 만료되지 않도록 주기적으로 호출해 세션을 연장하는 데 사용합니다 (30초 주기 권장). 특히 finalize_audio 뒤 결과를 기다리는 동안에는 ack의 operation_async로 처리 진행 상태도 확인할 수 있습니다.
① session.start — 세션 시작
요청Client → Server · Text 프레임 (JSON)
필드
타입
필수
허용 값
설명
type
string
필수
session.start
메시지 종류
user_sid
string
필수
사용자 식별자
service
string
필수
rfa
서비스
operation
string
필수
rfa
오퍼레이션
params
object
필수
아래 params.* 하위 필드
요청 파라미터. REST 요청의 params와 같습니다
params.reference_text
string
필수
자유 문자열 (비어 있지 않아야 함)
기준 문장. 비어 있으면 요청이 거부됩니다
params.resource_name
string
필수
배포 설정에 선언된 리소스에 한함
평가 엔진 리소스. 인식 언어도 이 값으로 결정됩니다
params.stt_resource_name
string
선택
배포 설정에 선언된 리소스에 한함
음성 인식 모델 요청별 override
params.config
object
선택
아래 config.* 하위 필드
음성 인식 세부 옵션 override
params.config.epd
string
선택
off— EPD 미사용 (RFA 기본값) auto_stop— AUTO-STOP — 발화 종료 시 자동 정지 chunk— CHUNK — 구간 검출 시 중간 상세결과 제공 chunk_mid— CHUNK — 중간 상세결과를 계속 제공 bargein— BARGEIN — 끼어들기 감지 전용
WebSocket에서는 chunk_mid 사용을 권장합니다. RFA는 auto_stop_mid를 지원하지 않으며, 해석할 수 없는 값은 거부되지 않고 그대로 전달됩니다
params.config.epd_start_timeout_sec
int
선택
0 이상
발화 시작 대기 타임아웃(초, 기본 0=미사용). epd_duration_timeout_sec와 함께 설정하거나 둘 다 0이어야 하며, 한쪽만 0보다 크면 400
params.config.epd_duration_timeout_sec
int
선택
0 이상
발화 길이 타임아웃(초, 기본 0=미사용). 위와 동일한 쌍 제약
params.config.epd_margin_sec
float
선택
임의의 실수
EPD 구간 마진(초, 기본 -1.0=미지정)
params.config.async_mid_result
int
선택
0— 비활성 1— 활성
중간 인식 결과(recognition.partial) 전송 여부 (기본 1). WebSocket 전용
params.audio_format
object
선택
아래 audio_format.* 하위 필드
16kHz mono로 디코딩됩니다. object가 아닌 값은 무시됩니다
params.audio_format.encoding
string
선택
raw PCM16LE로 해석되는 값 pcm 그 외 값은 검증하지 않고 컨테이너로 디코딩을 시도합니다 (wav · flac · ogg · mp3 등)
인코딩 힌트 (선택). 소문자·trim 후 비교하며, 미지정 시 컨테이너를 탐색한 뒤 raw PCM16LE로 간주합니다.
params.audio_format.sample_rate
int
선택
양의 정수
샘플링 레이트 (기본 16000, 권장 16000). 16kHz로 변환되어 처리됩니다.
params.audio_format.channels
int
선택
양의 정수
채널 수 (기본 1, 권장 1). mono로 변환되어 처리됩니다
응답Server → Client · session.started
필드
타입
설명
type
string
"session.started" 고정
session_id
string
발급된 세션 ID. 이후 서버가 보내는 모든 메시지에 포함됩니다
subscription_uuid
string
세션에 적용된 구독 UUID
subscription_plan_uid
int
구독 플랜 ID
subscription_status
string
구독 상태
server_time
string
응답 서버 시각 (ISO 8601 UTC)
// 클라이언트 → 서버
{
"type": "session.start",
"user_sid": "user-2001",
"service": "rfa",
"operation": "rfa",
"params": {
"reference_text": "Honeybees are small insects that play a huge role in nature.",
"resource_name": "KONG_ALL",
"audio_format": { "sample_rate": 16000, "channels": 1, "encoding": "pcm" }
}
}
// 서버 → 클라이언트
{
"type": "session.started",
"session_id": "01HXXXXXXXXXXXXXXXXXXXXXXX",
"subscription_uuid": "…",
"subscription_plan_uid": 0,
"subscription_status": "…",
"server_time": "2026-02-12T10:30:45Z"
}
session.started를 받기 전에 command·Binary 프레임·session.heartbeat·session.end를 보내면
PROTOCOL_VIOLATION으로 연결이 종료됩니다.
api_key 필드는 넣을 수 없으며(INVALID_MESSAGE), API Key는 연결 handshake에서만 전달합니다.
// 서버 → 클라이언트 (오디오 수신 중 수시로)
{
"type": "recognition.partial",
"session_id": "01HXXXXXXXXXXXXXXXXXXXXXXX",
"is_final": false,
"result": { … },
"mid": "Honeybees are small insects",
"statistics": { "streaming": true, "runtime_event": true, "runtime_msg": "…", "runtime_phase": "…" },
"server_time": "2026-02-12T10:30:45Z"
}
data_chunk.ack는 수신 확인일 뿐 최종 결과가 아닙니다. 최종 결과는 ④ finalize_audio 이후에 옵니다. recognition.partial은 중간 인식 텍스트가 바뀔 때마다 data_chunk.ack와 별개로 비동기 전송됩니다. 발생 빈도는 params.config.epd 설정과 인식 엔진에 따라 다르며, params.config.async_mid_result를 0으로 두면 보내지 않습니다. 평가 결과가 아닌 진행 표시용입니다.
// 클라이언트 → 서버
{ "type": "command", "command": "finalize_audio" }
// 서버 → 클라이언트 (1) 처리 접수
{
"type": "command.ack",
"session_id": "01HXXXXXXXXXXXXXXXXXXXXXXX",
"command": "finalize_audio",
"server_time": "2026-02-12T10:30:46Z",
"server_processing_time_ns": 95000
}
// 서버 → 클라이언트 (2) 최종 인식 결과
{
"type": "recognition.result",
"session_id": "01HXXXXXXXXXXXXXXXXXXXXXXX",
"is_final": true,
"result": { "result_type": "recognition", "text": "Honeybees are small insects that play a huge role in nature.", … },
"statistics": { … },
"server_time": "2026-02-12T10:30:47Z"
}
// 서버 → 클라이언트 (3) RFA 평가 결과
{
"type": "rfa.result",
"session_id": "01HXXXXXXXXXXXXXXXXXXXXXXX",
"is_final": true,
"result": { "accuracy": 82.5, "completeness": 91.0, "total_type_counts": { … }, … },
"statistics": { … },
"server_time": "2026-02-12T10:30:48Z"
}
RFA는 finalize_audio를 비동기로 처리합니다. command.ack는 처리 접수만 뜻하며,
음성 인식이 끝나면 recognition.result, 이어서 평가가 끝나면 rfa.result가 차례로 옵니다.
rfa.result를 받은 뒤 ⑤로 진행하세요.
처리 중에 보낸 session.heartbeat의 ack에는 진행 상태 operation_async가 함께 실립니다.
접수 뒤 인식·평가 단계에서 실패하면 결과 대신 session.error가 옵니다. 이때도 ⑤로 세션을 종료하세요.
session.end는 finalize_audio를 대신 실행하지 않습니다. 결과가 필요하면 ④를 먼저 보내세요. rfa.result를 받기 전에 보내면 진행 중인 평가가 취소됩니다.
세션을 오래 유지할 때는 session.heartbeat를 주기적으로 보내 세션을 연장하세요 (30초 주기 권장).
오류 응답
서버는 상황에 따라 두 종류의 오류 메시지를 보냅니다. 오류 코드는 에러 코드를 참고하세요.
타입
발생 시점
세션
command.error
start_audio · finalize_audio 등 커맨드 처리 실패 (예: start_audio의 스트리밍 인식 시작 실패)
유지
session.error
세션 시작 실패, 메시지 순서 위반, 잘못된 메시지 형식, Binary 프레임 처리 실패, finalize_audio 접수 뒤 인식·평가 실패
아래 표는 REST 응답 본문과 WebSocket rfa.result 메시지에 공통으로 적용됩니다. REST는 응답 본문 최상위에, WebSocket은 rfa.result 메시지 본문에 같은 필드가 담깁니다. REST 전용으로 표시한 recognition·events[]는 REST batch 응답에만 있으며, WebSocket에서는 같은 내용이 recognition.result 등 개별 메시지로 따로 옵니다.
rfa/rfa 결과
공통 필드는 session_id · server_time · statistics · result(RFA 평가 결과)이며,
REST batch 응답에는 recognition(음성 인식 결과) · events[]가 추가됩니다.
필드
타입
설명
session_id
string
세션 ID
server_time
string
응답 서버 시각 (ISO 8601)
type
string
메시지 타입 — "rfa.result"WebSocket 메시지와 REST batch events[] 항목에만 포함, REST 응답 최상위에는 없음
is_final
bool
최종 결과 여부 WebSocket 메시지와 REST batch events[] 항목에만 포함, REST 응답 최상위에는 없음
# 티켓 발급 — Set-Cookie 를 cookie.txt 에 저장
curl -X POST "https://{host}/api/v1/ws-tickets" \
-H "Authorization: Bearer $API_KEY" \
-H "Content-Type: application/json" \
-c cookie.txt \
-d '{"purpose":"session.start","user_sid":"user-2001"}'
# 응답: {"expires_in":30,"purpose":"session.start"}
# 이후 30초 안에 cookie.txt 의 쿠키를 실어 wss://{host}/ws/v1 로 연결
import requests
# Session 을 쓰면 Set-Cookie 가 자동으로 보관됩니다
session = requests.Session()
resp = session.post(
"https://{host}/api/v1/ws-tickets",
headers={"Authorization": f"Bearer {API_KEY}"},
json={"purpose": "session.start", "user_sid": "user-2001"},
)
print(resp.json()) # {"expires_in": 30, "purpose": "session.start"}
# 30초 안에 같은 쿠키로 WebSocket 연결 (websocket-client 예시)
cookie = "; ".join(f"{c.name}={c.value}" for c in session.cookies)
# ws = websocket.create_connection(
# "wss://{host}/ws/v1", header=[f"Cookie: {cookie}"])
command.ack와 session.heartbeat.ack에는 server_processing_time_ns가 함께 포함됩니다.
주의 — session.started 수신 전에 command/binary를 보내면
PROTOCOL_VIOLATION으로 연결이 종료됩니다.
session.end는 finalize_audio를 자동 실행하지 않으므로
결과가 필요하면 종료 전에 반드시 finalize 하세요.
session.heartbeat
WebSocket 연결을 오래 유지하는 동안 세션을 연장하는 keep-alive 메시지입니다.
장시간 연결을 유지할 때는 주기적으로 호출해 세션을 연장해야 하며, 수신하면 세션이 연장되고
session.heartbeat.ack로 응답합니다. 세션 타임아웃이 120초이므로 30초 주기를 권장합니다.
전송 구간 — 반드시 session.started를 받은 뒤부터 session.end를 보내기 전까지
사이에 보내야 합니다. 이 구간 안에서는 start_audio·Binary 프레임·finalize_audio 등
다른 메시지와 순서 제약 없이 언제든 보낼 수 있으며, finalize_audio 뒤 결과를 기다리는 동안에도 보낼 수 있습니다.
details는 값이 없으면 키 자체가 생략되며, ap_request_id도 상관관계 ID가 없으면 생략됩니다.
실제로 사용되는 details 키는 reason · command · state · wait_ms ·
issued_session_id · saw_recognition_result 등입니다.
응답 헤더 X-AP-Request-Id로도 동일한 요청 ID를 확인할 수 있습니다.
code
Http Response
의미
INVALID_REQUEST / INVALID_MESSAGE
400
잘못된 요청 형식, 필수 파라미터 누락 (user_sid 등). 같은 원인이지만 REST는 INVALID_REQUEST, WebSocket은 INVALID_MESSAGE로 전달됩니다