// 언어 메타데이터 인터페이스
interface LanguageMetadata {
code: string; // ISO 639-3 코드
name: string; // 영어 이름
nativeName: string; // 원어민 표기
glottologId: string; // Glottolog ID
family: string; // 언어 가족
endangerment: {
status: EndangermentLevel;
unescoLevel: number; // 0-5
speakerCount: number;
lastUpdated: string;
};
region: {
countries: string[];
areas: string[];
coordinates: { lat: number; lng: number };
};
script: {
primary: string;
romanization: string;
unicodeBlocks: string[];
};
dialects: Dialect[];
}
type EndangermentLevel =
| 'safe'
| 'vulnerable'
| 'definitely_endangered'
| 'severely_endangered'
| 'critically_endangered'
| 'extinct';
// 병렬 말뭉치 형식
interface ParallelCorpusEntry {
id: string;
source: {
language: string;
text: string;
romanization?: string;
gloss?: string;
};
target: {
language: string;
text: string;
romanization?: string;
};
metadata: {
domain: string;
formality: 'formal' | 'informal' | 'polite';
dialect?: string;
verified: boolean;
verifier?: string;
culturalSignificance?: string;
usageRestrictions?: string;
};
}
// 예시 데이터
const ainuJaParallel: ParallelCorpusEntry = {
id: 'ain-ja-001',
source: {
language: 'ain',
text: 'イランカラプテ',
romanization: 'irankarapte',
gloss: 'greet-polite'
},
target: {
language: 'ja',
text: 'こんにちは',
romanization: 'konnichiwa'
},
metadata: {
domain: 'greetings',
formality: 'polite',
dialect: 'Hokkaido',
verified: true
}
};
| 필드 | 타입 | 설명 | 필수 |
|---|---|---|---|
| audio.path | string | 오디오 파일 경로 | ✅ |
| audio.duration | number | 재생 시간(초) | ✅ |
| transcription.text | string | 전사 텍스트 | ✅ |
| speaker.id | string | 화자 ID (익명) | ✅ |
| speaker.dialect | string | 방언 | ⚪ |
| recording.environment | string | 녹음 환경 | ⚪ |
// TTS 훈련 데이터
interface TTSTrainingData {
id: string;
text: {
raw: string;
normalized: string;
phonemes: string;
prosodyMarkers?: string;
};
audio: {
path: string;
duration: number;
sampleRate: number; // 권장: 22050
};
phonemeAlignment: PhonemeTimestamp[];
prosody?: {
pitch: number[];
energy: number[];
speakingRate: number;
};
}
interface PhonemeTimestamp {
phoneme: string;
start: number;
end: number;
}
| 형식 | 용도 | 플랫폼 | 파일 |
|---|---|---|---|
| HuggingFace | 사전 훈련 | PyTorch | pytorch_model.bin |
| ONNX | 배포 | 크로스 플랫폼 | model.onnx |
| TFLite | 모바일 | Android/iOS | model.tflite |
| Adapter | 미세조정 | 경량화 | adapter_model.bin |
// 어댑터 기반 미세 조정
interface AdapterConfig {
adapterSize: number; // 64 (기본 768에서 축소)
adapterLayers: number[]; // [6, 11] 중간/마지막만
trainableParams: number; // 전체의 0.5%
compressionRatio: number; // 200배 압축
baseModel: string; // 참조할 기본 모델
}
// 파일 구조
// ain-ja-translation-adapter/
// ├── adapter_config.json (설정)
// ├── adapter_model.bin (5MB, 가중치만)
// └── base_model: "ain-bert-base"
// WIA-LANG-005 데이터 검증기
class WIALang005Validator {
async validateDataset(path: string): Promise<ValidationResult> {
const errors: string[] = [];
// 1. 스키마 검증
if (!await this.validateSchema(path)) {
errors.push('Schema validation failed');
}
// 2. 메타데이터 검증
const metadata = await this.loadMetadata(path);
if (!this.validateMetadata(metadata)) {
errors.push('Invalid metadata');
}
// 3. 언어 코드 검증 (ISO 639-3)
if (!this.validateLanguageCode(metadata.language.code)) {
errors.push('Invalid ISO 639-3 code');
}
// 4. 데이터 무결성
if (!await this.validateDataIntegrity(path)) {
errors.push('Data integrity failed');
}
// 5. 체크섬 검증
if (!await this.validateChecksums(path)) {
errors.push('Checksum mismatch');
}
return {
valid: errors.length === 0,
errors
};
}
}
// 익명화 요구사항
interface PrivacyConfig {
anonymizationRequired: boolean;
piiFields: string[]; // 개인정보 필드
anonymizationMethods: {
speakerId: 'hashed_uuid';
location: 'generalized_to_region';
dates: 'year_only';
};
retention: {
rawAudio: 'encrypted_storage';
transcriptions: 'hashed_speaker_ids';
accessLogs: '90_days';
};
}
언어 메타데이터의 주요 항목과 중요성을 설명하시오.
MT용 병렬 말뭉치와 ASR용 음성 데이터셋의 차이를 비교하시오.
어댑터 기반 미세 조정이 저자원 언어에 유리한 이유를 논하시오.
데이터 증강 기법 중 텍스트와 오디오에 적용 가능한 것을 설명하시오.
문화적으로 민감한 데이터의 접근 제어 방법을 서술하시오.
WIA-LANG-005 검증 프로세스의 5단계를 설명하시오.
LanguageMetadata 인터페이스를 확장 구현하시오.
ONNX 형식이 배포에 유리한 이유를 분석하시오.
© 2025 SmileStory Co., Ltd. / WIA · 弘益人間