홍익인간(弘益人間)
"널리 인간을 이롭게 하라" — 단군신화 건국 이념
표준화된 데이터 형식은 상호운용성의 토대입니다. WIA 감정 AI 데이터 형식은 어떤 적합 시스템에서도 감정 데이터를 공유·처리할 수 있도록 보장합니다. 본 장은 표준의 4단계 아키텍처 가운데 가장 기초가 되는 Phase 1을 깊이 있게 다루며, 한국 의료·교육·자동차 영역의 가명처리·KCD 코드 매핑·KISA-PIMS 형식 요구사항을 함께 정합화하는 방법을 제시합니다.
Phase 1은 감정 분석 결과를 표현하는 JSON 기반 데이터 형식을 정의합니다. 이 표준화된 형식이 가능하게 하는 것은 다음과 같습니다.
JSON 형식을 채택한 이유는 (1) 사람이 읽을 수 있고, (2) 거의 모든 프로그래밍 언어에서 표준 라이브러리로 지원되며, (3) JSON Schema·OpenAPI 같은 자동 검증 도구가 풍부하고, (4) 웹·모바일 환경에서 자연스럽게 작동하기 때문입니다. XML·Protocol Buffers·MessagePack 같은 대체 형식도 부속서에서 변환 가이드를 제공하지만, 1차 권장 형식은 JSON입니다.
| 목표 | 구현 방식 |
|---|---|
| 단순성 | JSON 형식, 명확한 필드 이름 |
| 완전성 | 모든 감정 모델·모달리티 지원 |
| 확장성 | 접두사 규칙으로 사용자 정의 필드 허용 |
| 검증성 | 자동 검증을 위한 JSON Schema |
| 정밀성 | 고해상도 타임스탬프와 값 |
설계 목표는 서로 균형을 이뤄야 하며, 어느 한 목표만 강조한 형식은 실제 채택률이 낮다는 표준화 역사의 교훈을 반영합니다. 예를 들어 단순성만 추구한 형식은 완전성이 부족해 실무에서 사용자 정의 확장이 난립하게 되고, 완전성만 추구한 형식은 학습 곡선이 가팔라 도입이 지연됩니다. WIA Phase 1은 5가지 목표를 측정 가능한 지표로 변환하여 균형을 평가합니다.
{
"$schema": "https://wiastandards.com/emotion-ai/v1/schema.json",
"format": "WIA-EMOTION-AI-v1.0",
"timestamp": "2026-05-01T10:30:00.000Z",
"subject_id": "user_12345",
"session_id": "sess_abc123",
"modality": "facial",
"emotions": {
"primary": {
"label": "happiness",
"confidence": 0.87
},
"secondary": {
"label": "surprise",
"confidence": 0.23
},
"all": [
{ "label": "happiness", "confidence": 0.87 },
{ "label": "surprise", "confidence": 0.23 },
{ "label": "neutral", "confidence": 0.15 },
{ "label": "sadness", "confidence": 0.05 },
{ "label": "anger", "confidence": 0.03 },
{ "label": "fear", "confidence": 0.02 },
{ "label": "disgust", "confidence": 0.01 }
]
},
"dimensions": {
"valence": 0.72,
"arousal": 0.45,
"dominance": 0.55
},
"action_units": [
{ "au": "AU6", "intensity": 0.8, "name": "Cheek Raiser" },
{ "au": "AU12", "intensity": 0.9, "name": "Lip Corner Puller" },
{ "au": "AU1", "intensity": 0.3, "name": "Inner Brow Raiser" }
],
"face": {
"detected": true,
"bbox": { "x": 120, "y": 80, "width": 200, "height": 250 },
"landmarks": 68,
"pose": { "pitch": 5.2, "yaw": -3.1, "roll": 1.2 }
},
"metadata": {
"model_version": "2.1.0",
"model_name": "WIA-EmotionNet",
"processing_time_ms": 45,
"device_id": "cam_001",
"culture_context": "ko-KR"
}
}
위 메시지는 표정 모달리티의 가장 일반적인 출력을 보여 줍니다. emotions·dimensions·action_units·face·metadata의 5개 객체가 핵심 페이로드를 구성하며, 후속 시스템은 이 가운데 필요한 부분만 선택적으로 처리할 수 있습니다. 메시지 크기는 평균 1~2 KB이며, 압축 후에는 약 0.4~0.8 KB로 줄어듭니다. 5G 환경에서 30 fps 스트리밍 시 분석 결과 메시지의 대역폭 비용은 표정 카메라 영상 자체에 비해 무시할 수 있는 수준입니다.
| 필드 | 타입 | 필수 여부 | 설명 |
|---|---|---|---|
| format | string | 필수 | 형식 식별자: "WIA-EMOTION-AI-v1.0" |
| timestamp | string (ISO 8601) | 필수 | 분석 타임스탬프 |
| subject_id | string | 선택 | 주체 식별자(가명처리 권장) |
| session_id | string | 선택 | 세션 식별자 |
| modality | string | 필수 | 입력 유형: facial, voice, text, biosignal, multimodal |
한국 환경에서 subject_id는 「개인정보 보호법 시행령」 제25조의2 가명처리 가이드를 따라 결합 가능성이 실질적으로 차단된 형태로 생성되어야 합니다. 실명·주민등록번호·이메일 등 식별성이 높은 값을 그대로 넣으면 표준 적합성 위반은 물론 법령 위반에 해당할 수 있습니다. 권장 형태는 (1) UUID v4, (2) HMAC 기반 해시(키 분리), (3) 「가명정보 처리 가이드라인」 부록의 가명화 절차 출력 가운데 하나입니다.
| 필드 | 타입 | 필수 여부 | 설명 |
|---|---|---|---|
| emotions.primary | object | 필수 | 최고 신뢰도 감정 |
| emotions.primary.label | string | 필수 | 감정 라벨(happiness, sadness 등) |
| emotions.primary.confidence | number (0-1) | 필수 | 신뢰도 점수 |
| emotions.secondary | object | 선택 | 두 번째 신뢰도 감정 |
| emotions.all | array | 선택 | 모든 감정 점수 |
기본 감정 (필수 지원): "happiness" - 기쁨, 즐거움, 만족 "sadness" - 슬픔, 비통, 우울 "anger" - 불쾌, 좌절, 분노 "fear" - 불안, 공포, 두려움 "disgust" - 역겨움, 거부 "surprise" - 놀람, 경이 "neutral" - 강한 감정 미탐지 확장 감정 (선택): "contempt" - 경멸, 무시 "confusion" - 혼란, 당혹 "interest" - 호기심, 참여 "boredom" - 무관심, 권태 "excitement" - 고각성 긍정 "anxiety" - 걱정, 불안 한국형 확장 라벨 (Annex KR): "embarrassment" - 당황 "han" - 한 "jeong" - 정 "seosaeham" - 섭섭함 "dapdap" - 답답함 "jjajeung" - 짜증
| 필드 | 타입 | 범위 | 설명 |
|---|---|---|---|
| dimensions.valence | number | -1.0 ~ +1.0 | 긍정·부정 정도 |
| dimensions.arousal | number | -1.0 ~ +1.0 | 에너지·활성화 수준 |
| dimensions.dominance | number | -1.0 ~ +1.0 | 통제·영향(선택) |
| 필드 | 타입 | 설명 |
|---|---|---|
| action_units[].au | string | AU 코드(AU1, AU2, AU4 등) |
| action_units[].intensity | number (0-1) | 활성화 강도 |
| action_units[].name | string | 사람이 읽을 수 있는 이름(선택) |
{
"modality": "facial",
"face": {
"detected": true,
"count": 1,
"bbox": {
"x": 120,
"y": 80,
"width": 200,
"height": 250
},
"landmarks": 68,
"pose": {
"pitch": 5.2,
"yaw": -3.1,
"roll": 1.2
},
"quality": {
"blur": 0.1,
"exposure": 0.8,
"occlusion": 0.05
}
},
"action_units": [
{ "au": "AU6", "intensity": 0.8 },
{ "au": "AU12", "intensity": 0.9 }
]
}
face.quality 객체는 입력 영상의 품질 지표를 제공하며, 후속 시스템이 결과의 신뢰성 판단에 활용합니다. blur(흐림), exposure(노출), occlusion(가림) 세 지표가 모두 0에 가까울수록 좋은 품질이며, 이 가운데 어느 하나라도 0.5를 초과하면 결과의 신뢰성이 낮아질 수 있다는 신호가 됩니다. 한국 차량 환경에서 occlusion 지표는 햇빛 가림막·모자·마스크 같은 다양한 가림 요소를 정량화하는 데 유용합니다.
face.pose의 pitch·yaw·roll 값은 모두 도(degree) 단위이며, 각각 위·아래(pitch), 좌·우(yaw), 기울기(roll)를 나타냅니다. 정면 자세는 세 값이 모두 0에 가까우며, 절대값이 30도를 초과하면 측면 자세로 분류되어 정확도 저하가 예상됩니다. 차량용 응용에서는 운전자가 미러를 보거나 옆 좌석을 보는 짧은 자세 변화를 일시적인 측면 자세로 처리하고, 5초 이상 측면 자세가 지속되면 주의 산만 신호로 분류합니다.
{
"modality": "voice",
"voice": {
"duration_ms": 3500,
"sample_rate": 44100,
"features": {
"pitch_mean": 180.5,
"pitch_std": 25.3,
"intensity_mean": 65.2,
"speech_rate": 4.2,
"pause_ratio": 0.15
},
"language": "ko-KR",
"transcript": "정말 행복해요!"
}
}
한국어 화자의 경우 language 필드는 "ko-KR"로 설정하며, 사투리 권역을 추가로 표시할 때는 BCP 47 확장 태그(예: "ko-KR-x-yeongnam")를 사용합니다. transcript 필드의 저장은 「통신비밀보호법」 양 당사자 동의가 확보된 경우에 한해 권장됩니다.
voice.features 객체의 항목들은 음성 운율 분석의 핵심 지표를 담습니다. pitch_mean(피치 평균, Hz)·pitch_std(피치 표준편차, Hz)·intensity_mean(강도 평균, dB)·speech_rate(발화 속도, 음절/초)·pause_ratio(휴지 비율, 0~1)의 5가지가 의무 항목이며, 추가로 jitter(피치 미세 변동)·shimmer(강도 미세 변동)·spectral_centroid(스펙트럼 중심)·spectral_rolloff(스펙트럼 롤오프) 같은 지표를 선택적으로 포함할 수 있습니다. 한국어 운율 분석에서는 어말 종결 어미의 피치 패턴이 감정 단서로 작동하므로, voice.features.final_syllable_pitch_pattern 같은 한국어 특화 지표를 사용자 정의 필드("x_") 접두사 규칙으로 추가하는 일이 권장됩니다.
{
"modality": "text",
"text": {
"content": "이 제품은 정말 놀라워요!",
"language": "ko",
"length": 14,
"sentiment": {
"polarity": 0.92,
"subjectivity": 0.85
},
"entities": [
{
"text": "제품",
"emotion": "happiness",
"confidence": 0.88
}
],
"aspects": [
{
"aspect": "품질",
"sentiment": 0.95
}
]
}
}
{
"modality": "biosignal",
"biosignal": {
"signals": ["ecg", "eda"],
"duration_ms": 60000,
"metrics": {
"heart_rate": {
"mean": 75,
"std": 8,
"hrv_rmssd": 42.5
},
"eda": {
"scl_mean": 3.2,
"scr_count": 5,
"scr_amplitude_mean": 0.8
}
},
"derived": {
"stress_level": 0.35,
"engagement": 0.72,
"relaxation": 0.55
}
}
}
의료 등급 활용에서는 「의료기기법」 제19조의3에 따라 별도의 인허가 절차가 필요하며, biosignal 객체에 추가로 medical_device_id·certification_id 필드를 의무로 두어 추적 가능성을 보장합니다. 일반 헬스케어 활용에서는 derived 객체의 추정 지표만으로도 사용자에게 가치 있는 정보를 제공합니다.
derived.stress_level은 0~1 범위로 정규화되며, 0.0~0.3은 낮음, 0.3~0.6은 중간, 0.6~1.0은 높음으로 해석됩니다. 사용자에게 표시되는 인터페이스에서는 정규화된 값보다 직관적인 등급 표시(낮음·중간·높음)가 권장됩니다. derived.engagement는 학습·콘텐츠 소비 환경에서 사용자의 주의 집중 정도를 추정하며, 디지털 명상 앱·교육 앱에서 활용됩니다. derived.relaxation은 정신건강 모니터링 앱에서 회복 상태를 추적하는 데 유용합니다.
의료 등급 응용에서 생체신호의 샘플률은 일반 헬스케어보다 높게 설정됩니다. 의료용 ECG는 250 Hz 이상, EEG는 256 Hz 이상이 권고되며, 이는 식약처 SaMD 인허가 절차의 신호 품질 요건을 만족하기 위함입니다. WIA Phase 1은 sample_rate 필드를 명시적으로 두어 후속 시스템이 이 정보를 활용할 수 있도록 합니다.
{
"modality": "multimodal",
"modalities_used": ["facial", "voice"],
"fusion_method": "weighted_average",
"modality_weights": {
"facial": 0.6,
"voice": 0.4
},
"modality_results": {
"facial": {
"emotions": { "primary": { "label": "happiness", "confidence": 0.85 } },
"dimensions": { "valence": 0.7, "arousal": 0.5 }
},
"voice": {
"emotions": { "primary": { "label": "happiness", "confidence": 0.78 } },
"dimensions": { "valence": 0.6, "arousal": 0.6 }
}
}
}
멀티모달 메시지는 융합 결과 외에 modality_results에 각 모달리티의 개별 결과도 포함합니다. 이는 (1) 결과 추적성, (2) 모달리티 단독 분석 재활용, (3) 융합 알고리즘 디버깅의 세 가지 용도를 동시에 지원합니다. 가중치 합은 1.0이 되도록 정규화되어야 하며, 합이 1.0이 아닌 경우 표준 적합성 검사에서 실패로 분류됩니다.
fusion_method 필드의 허용 값은 "weighted_average"·"max_confidence"·"voting"·"attention"의 4가지이며, 표준은 이 4가지 외의 사용자 정의 값을 "x_" 접두사 규칙으로 허용합니다(예: "x_my_custom_fusion"). 사용자 정의 값 사용 시 해당 알고리즘의 설명을 부속 메타데이터에 포함시켜야 하며, 설명이 누락된 경우 자동 검증에서 경고가 발생합니다.
멀티모달 융합 메시지의 페이로드 크기는 단일 모달리티 메시지의 약 2~3배이며, 모달리티 결과 객체가 추가되기 때문입니다. 대역폭이 제한된 환경에서는 modality_results를 생략하고 융합 결과만 출력하는 옵션도 허용되지만, 디버깅·감사를 위해서는 modality_results의 포함이 권장됩니다.
| 필드 | 타입 | 설명 |
|---|---|---|
| model_version | string | 분석 모델 버전 |
| model_name | string | 사용된 모델 이름 |
| processing_time_ms | integer | 처리 소요 시간 |
| device_id | string | 입력 장치 식별자 |
| culture_context | string | 해석을 위한 문화 맥락(예: ko-KR) |
| wia_certified | boolean | WIA 인증 여부 |
| data_residency | string | 데이터 처리·보관 위치(예: KR, US, EU) |
| consent_id | string | 「개인정보 보호법」 동의 식별자(권장) |
한국 시장에서는 data_residency·consent_id 필드가 사실상의 의무 항목으로 작동합니다. data_residency는 사용자에게 데이터 처리 위치를 투명하게 알려 주며, consent_id는 사후 감사 시 동의 이력을 추적 가능하게 합니다. 두 필드는 KISA-PIMS 인증 시 형식 요구사항으로 권고됩니다.
{
"format": "WIA-EMOTION-AI-v1.0",
"timestamp": "2026-05-01T10:30:00.123Z",
"subject_id": "user_hash_abc123def456",
"session_id": "sess_kakao_call_20260501_001",
"modality": "facial",
"emotions": {
"primary": {
"label": "happiness",
"confidence": 0.87
},
"secondary": {
"label": "surprise",
"confidence": 0.23
},
"all": [
{ "label": "happiness", "confidence": 0.87 },
{ "label": "surprise", "confidence": 0.23 },
{ "label": "neutral", "confidence": 0.15 },
{ "label": "sadness", "confidence": 0.05 },
{ "label": "anger", "confidence": 0.03 },
{ "label": "fear", "confidence": 0.02 },
{ "label": "disgust", "confidence": 0.01 }
]
},
"dimensions": {
"valence": 0.72,
"arousal": 0.45
},
"action_units": [
{ "au": "AU6", "intensity": 0.8, "name": "Cheek Raiser" },
{ "au": "AU12", "intensity": 0.9, "name": "Lip Corner Puller" },
{ "au": "AU1", "intensity": 0.3, "name": "Inner Brow Raiser" },
{ "au": "AU2", "intensity": 0.25, "name": "Outer Brow Raiser" },
{ "au": "AU25", "intensity": 0.4, "name": "Lips Part" }
],
"face": {
"detected": true,
"count": 1,
"bbox": { "x": 120, "y": 80, "width": 200, "height": 250 },
"landmarks": 68,
"pose": { "pitch": 5.2, "yaw": -3.1, "roll": 1.2 },
"quality": { "blur": 0.1, "exposure": 0.8, "occlusion": 0.05 }
},
"metadata": {
"model_version": "2.1.0",
"model_name": "WIA-EmotionNet-KR-v2",
"processing_time_ms": 45,
"device_id": "webcam_001",
"culture_context": "ko-KR",
"wia_certified": true,
"certification_level": 2,
"data_residency": "KR",
"consent_id": "consent_20260501_abc123"
}
}
{
"$schema": "http://json-schema.org/draft-07/schema#",
"$id": "https://wiastandards.com/emotion-ai/v1/schema.json",
"title": "WIA Emotion AI Data Format",
"type": "object",
"required": ["format", "timestamp", "modality", "emotions"],
"properties": {
"format": {
"type": "string",
"pattern": "^WIA-EMOTION-AI-v[0-9]+\\.[0-9]+$"
},
"timestamp": {
"type": "string",
"format": "date-time"
},
"modality": {
"type": "string",
"enum": ["facial", "voice", "text", "biosignal", "multimodal"]
},
"emotions": {
"type": "object",
"required": ["primary"],
"properties": {
"primary": { "$ref": "#/definitions/emotionScore" },
"secondary": { "$ref": "#/definitions/emotionScore" },
"all": {
"type": "array",
"items": { "$ref": "#/definitions/emotionScore" }
}
}
},
"dimensions": {
"type": "object",
"properties": {
"valence": { "type": "number", "minimum": -1, "maximum": 1 },
"arousal": { "type": "number", "minimum": -1, "maximum": 1 },
"dominance": { "type": "number", "minimum": -1, "maximum": 1 }
}
},
"action_units": {
"type": "array",
"items": { "$ref": "#/definitions/actionUnit" }
}
},
"definitions": {
"emotionScore": {
"type": "object",
"required": ["label", "confidence"],
"properties": {
"label": { "type": "string" },
"confidence": { "type": "number", "minimum": 0, "maximum": 1 }
}
},
"actionUnit": {
"type": "object",
"required": ["au", "intensity"],
"properties": {
"au": { "type": "string", "pattern": "^AU[0-9]+$" },
"intensity": { "type": "number", "minimum": 0, "maximum": 1 },
"name": { "type": "string" }
}
}
}
}
JSON Schema 자동 검증 도구로는 ajv(JavaScript), jsonschema(Python), justify(Java) 등이 널리 사용됩니다. WIA 표준 적합성 시험의 1차 단계는 이 JSON Schema 검증의 통과 여부이며, 모든 출력 메시지가 자동 검증을 통과해야 다음 시험 단계(인구통계 공정성·정확도·지연 시험)로 진행됩니다.
JSON Schema 검증은 메시지 구조의 정합성만 확인하며, 의미적 적정성은 별도 검증이 필요합니다. 예를 들어 dimensions.valence 값이 -0.99이지만 emotions.primary.label이 "happiness"인 경우 JSON Schema는 통과하지만 의미적으로는 모순입니다. WIA는 이러한 의미적 모순을 잡아내는 추가 검증 도구(WIA-Lint)를 제공하며, 표 3-2의 V-A 일반 범위와 라벨이 일치하는지 자동 점검합니다. WIA-Lint는 표준 GitHub 저장소에서 MIT 라이선스로 공개됩니다.
또한 JSON Schema는 표준 메시지의 후방 호환성을 보장하는 도구로도 활용됩니다. v1.0 메시지는 v1.1 검증기로 검사 가능하지만, v2.0 메시지는 v1.x 검증기로 검사하면 실패합니다. 이러한 구분은 의미 버전 관리 원칙을 자동으로 강제하는 효과를 가지며, 사용자가 업그레이드 시 어떤 변경을 예상해야 하는지를 형식적으로 명시합니다.
한국 의료 환경에서 감정 데이터를 한국표준질병사인분류(KCD-8) 코드와 매핑하는 일은 정신건강 보조 진단의 핵심 절차입니다. 우울 에피소드(F32), 범불안장애(F41.1), 외상후 스트레스장애(F43.10) 등의 KCD 코드는 감정 데이터의 시계열 추세와 함께 분석되어 임상의의 진단 보조에 활용됩니다.
| KCD 코드 | 진단명 | 감정 AI 시계열 지표 |
|---|---|---|
| F32 | 우울 에피소드 | 2주 이상 valence ≤ -0.4 평균 + sadness 라벨 비율 ≥ 30 % |
| F33 | 재발성 우울장애 | F32 패턴이 12개월 내 2회 이상 반복 |
| F41.1 | 범불안장애 | arousal ≥ 0.6 + fear/anxiety 라벨 비율 ≥ 25 % (6개월) |
| F43.10 | 외상후 스트레스장애 | 특정 자극에 대한 fear arousal 급격 상승 패턴 |
| F90 | 주의력결핍 과잉행동 | 주의 산만 감지 비율 + 학습 참여도 저하 |
이 매핑은 임상 진단을 대체하지 않으며 보조 정보로만 활용됩니다. 「의료기기법」에 따른 SaMD 인허가를 받은 경우에 한해 의료적 의사결정에 입력으로 사용 가능하며, 그 외 환경에서는 사용자에게 일반 정보로만 제공해야 합니다.
KISA-PIMS(개인정보보호 관리체계) 인증 시에는 메시지 형식에 대해 다음 4가지 추가 요구사항이 적용됩니다. 첫째, subject_id는 가명처리 절차의 출력이어야 하며 결합 가능성이 실질적으로 차단되어야 합니다. 둘째, data_residency 필드를 통해 데이터 처리 위치를 명시해야 합니다. 셋째, consent_id 필드를 통해 동의 이력 추적이 가능해야 합니다. 넷째, metadata에 retention_period 필드를 추가하여 보관 기간을 명시해야 합니다.
이 4가지 요구사항은 「개인정보 보호법」 §15·17·22·25의2의 처리 절차를 메시지 형식 차원에서 보강하는 역할을 하며, KISA-PIMS 인증 심사 시 자동 검증 도구가 이 필드들의 존재와 적정성을 검사합니다. retention_period 필드는 ISO 8601 duration 표기(예: "P30D"는 30일, "P6M"은 6개월)를 따르며, 보관 기간이 만료된 데이터는 자동 폐기되어야 합니다. 자동 폐기 절차는 Phase 4 통합 가이드의 의무 항목입니다.
KISA가 운영하는 「가명정보 처리 가이드라인」(2024)은 가명처리의 5단계 절차(목적 명확화 → 사전 준비 → 가명처리 → 적정성 검토 → 안전조치)를 정의하며, WIA Phase 1 메시지 형식의 subject_id는 이 5단계 절차의 출력으로만 채워져야 합니다. 단순한 SHA-256 해시는 키가 노출될 경우 결합 가능성이 회복되므로 결합 가능성 차단 요건을 충족하지 못하며, HMAC 기반 키 분리 또는 차분 프라이버시(differential privacy) 적용이 권장됩니다.
한국 기업이 기존 시스템 출력을 WIA Phase 1로 변환하는 어댑터를 구현할 때 자주 사용되는 5가지 패턴은 다음과 같습니다. 첫째, 주요 한국 콜봇은 자사 내부 음성 감정 분석 출력을 WIA voice 모달리티로 매핑하는 어댑터를 운영하며, transcript 저장은 「통신비밀보호법」 동의 확보 시에만 활성화합니다. 둘째, 주요 한국 플랫폼 음성 서비스는 자사 텍스트 감성 분석 SDK 출력을 WIA text 모달리티로 변환하는 어댑터를 제공합니다. 셋째, 주요 한국 건강 플랫폼는 갤럭시 워치의 PPG·EDA 출력을 WIA biosignal 모달리티로 매핑하며, 의료 등급 사용 시 medical_device_id를 함께 출력합니다. 넷째, 현대모비스는 차량 인캐빈 카메라의 표정·자세 데이터를 WIA facial 모달리티로 변환하면서 face.quality 지표를 차량 진동·조명 변화에 따라 동적으로 업데이트합니다. 다섯째, 한 한국 공공 미디어 디지털교과서는 학습자 표정·텍스트를 결합한 multimodal 메시지를 출력하며, 14세 미만 학습자에 대해서는 보호자 동의 식별자를 consent_id에 기록합니다.
이러한 어댑터 패턴은 모두 기존 시스템의 코어 로직을 변경하지 않고 출력 계층에만 추가되므로 위험이 낮으며, 일반적으로 2~4개월의 작업으로 Compliant 인증까지 도달할 수 있습니다.
어댑터 구현 시 자주 발견되는 흔한 실수는 (1) 신뢰도 값이 0~1 범위를 벗어나는 경우, (2) 감정 라벨에 표준 어휘가 아닌 자사 내부 코드(예: "EMO_001")를 사용하는 경우, (3) timestamp의 시간대(time zone)가 누락되어 UTC 기준 비교가 어려운 경우, (4) action_units 배열의 AU 코드 형식이 표준과 다른 경우(예: "AU01" 대신 "AU1"), (5) 감정 분포 합이 1.0이 아닌 경우의 다섯 가지입니다. WIA Phase 1 자동 검증 도구는 이 다섯 가지 실수를 모두 잡아내며, 어댑터 개발 초기 단계에서 검증을 반복적으로 수행하면 회귀를 막을 수 있습니다.
또한 어댑터 출력은 단위 시험뿐 아니라 통합 시험을 통해 후속 시스템과의 결합을 검증해야 합니다. 주요 한국 콜봇·주요 한국 플랫폼 음성 서비스·주요 한국 건강 플랫폼 사례에서 어댑터 출력이 후속 분석 파이프라인에 잘못된 형식으로 전달되는 일이 빈번히 보고되었으며, 이는 자동 검증 도구를 CI 파이프라인에 통합하면 사전 차단할 수 있는 문제입니다. WIA는 GitHub Actions·GitLab CI·Jenkins 환경에서 작동하는 검증 워크플로우 템플릿을 제공합니다.
핵심 내용 일곱 가지.
제5장에서는 Phase 2 — API 인터페이스의 REST 엔드포인트 설계, 인증, 모달리티별 호출 방식, 오류 처리, 호출 제한율을 다룹니다. Phase 1의 데이터 형식은 Phase 2 API의 요청·응답 본문에 직접 사용되므로, 본 장의 학습이 다음 장의 전제가 됩니다.
실습 권고. 본 장의 JSON Schema와 완전 예시를 사용하여 자동 검증 도구를 한 번 실행해 보면 표준의 작동 방식을 직접 체감할 수 있습니다. ajv 사용 시 명령은 `npx ajv -s schema.json -d example.json`이며, jsonschema 사용 시는 `python -m jsonschema -i example.json schema.json`입니다. 예시 메시지가 검증을 통과하는지 확인한 뒤, 의도적으로 잘못된 값을 넣어 보면 어떤 항목이 검사되는지 명확히 볼 수 있습니다.
본 장에서 정의된 데이터 형식은 후속 장에서 API 요청·응답·스트리밍 메시지의 페이로드로 반복적으로 등장합니다. 따라서 본 장의 표 4-2~4-6과 그림 4-1·4-8을 별도로 표기해 두면 후속 장 학습 시 빠른 참조가 가능합니다. 본권 표준의 진화 이력은 GitHub 공개 저장소에 기록된다.[99]
WIA-Official/wia-standards-public/tree/main/emotion-ai — 본권 전반에 인용된 시뮬레이터·스펙·API·전자책 자산의 소스코드를 제공하는 오픈 표준 이니셔티브이며, 본 장이 인용하는 모든 1차 출처에 대한 표준 개정위원회의 정식 검증 기록 위치이다. 표준의 진화 로드맵·개정 이력·SDK 소스코드는 GitHub 저장소에서 공개적으로 갱신된다. ↑