fs_walker / harness xdata fs-sync 의 행동 정본. 본 문서가 명시하지 않은
토큰/패턴은 자동 등록하지 않고 pending 으로 보류해 작업자 판단을 받는다.
KOR/MAIN (한국어 메인 TTS 서비스 카테고리).KOR/PERSONAL/{client}/..., AI_HUB_DATA/..., 타 언어 — 별 규약 추가.{storage_root}/{lang}/{service}/{gender}/{speaker_key}/base_phnseq/
{phoneme_source}_xvoice{phoneme_source_version}/
{utterance_style}[_{v1}[_{v2}...]]/
lang ∈ {KOR} (스코프 내).service ∈ {MAIN}.gender ∈ {female, male}.speaker_key — ADR 0004, 불변. 디렉토리명 그대로 사용.base_phnseq — 고정 문자열. 없으면 해당 speaker 는 pending.phoneme_source + version — 디렉토리명 ^(.+?)_xvoice(\d+(?:\.\d+)?)$
정규식 매칭. 예: manual_xvoice3.1 → source=manual, version=xvoice3.1.utterance_style — 마지막 디렉토리의 첫 세그먼트. §3 의 허용 집합에 속해야
한다.v1 ... vN — 축 값 토큰. §5 규약.natural_key = "{speaker_key}/{lang}/{utterance_style}/{phoneme_source}"
허용 utterance_style (1차 스코프, 정규):
| 값 | 의미 |
|---|---|
common | 일반 문장 |
pat1 / pat2 / pat3 | 패턴 세트 1/2/3 |
qst | 의문문 |
emo | 감정 (세부 감정은 후속 emo_{label} 로 확장 예정) |
실험용 utterance_style (leaf 전체가 정확히 매칭되면 axes 분리 없이 통째로
채택, processed_version.experimental=true):
| 값 | 그룹 |
|---|---|
novel / novel_common / novel_common300 / novel_common700 / novel_dialog / novel_list / novel_prase | 소설 톤 텍스트 (novel_*.txt) |
pat_16k | 16k 패턴 실험 |
emotion / calm / fairy / joy / sad | 감정 라벨 실험 — 정규 emo_{label} 승격 전 임시 |
정규 enum / 실험 enum 어디에도 없는 값은 pending(unknown_utterance_style).
정본은 tools/xdata/fs_walker.py:KNOWN_UTTERANCE_STYLES 와
EXPERIMENTAL_UTTERANCE_STYLES.
utterance_style 뒤 토큰들은 하나의 processed_version 을 구성:
processed_version:
phoneme_encoding: <§5 참조>
phoneme_source_version: "xvoice3.1" # 디렉토리에서 추출
preprocessing:
breath: vanilla | reduce_brth | rm_brth
trim: vanilla | trimIP | trim
sample_rate: native | 16k
sbert: vanilla | sbert
perturbation: vanilla | perturb
data_source: internal | internal_processed # 조합에서 도출 (phase2 §16-A.3 A안)
mfa_set: null # 본 경로 규약 범위 밖 — 수작업 메타
mfa_tnqst: false # 본 경로 규약 범위 밖 — 수작업 메타
paths: {server_162: "<local_path>"}
updated_at: <mtime>
워커(전처리 파이프라인) 는 본 절을 강제 준수한다. 위반 시 fs-sync 가
pending 버킷으로 분리하여 레지스트리 진입을 차단한다.
{utterance_style}[_{v1}[_{v2}...]]
첫 세그먼트는 utterance_style, 이후는 축 값 (value-only, axis 이름 미노출).
한 값은 정확히 한 축에만 속한다. 축 판별은 전역 token 레지스트리
tools/xdata/preprocessing.py 의 PREPROC_TOKEN_MAP + PHONEME_ENCODING_TOKENS
조회로 수행. 신규 값 도입 시 (a) 본 문서 R5 표 (b) 레지스트리를 동시 PR
로 추가한다.
breath → trim → sample_rate → phoneme_encoding → sbert → perturbation
파서는 순서 무관 매칭이나, 전처리 파이프라인은 위 순서로 디렉토리명을 생성한다 (사람이 읽을 때 일관성 + 충돌 조기 감지).
축 기본값(vanilla/native/full)은 경로에 쓰지 않는다.
breath=vanilla & trim=vanilla & sample_rate=native & sbert=vanilla & perturbation=vanilla & subset=full & phoneme_encoding=ko_base
→ 디렉토리명 = common (단독).| value | 축 | 실험? | 의미 |
|---|---|---|---|
reduce_brth | breath | — | 숨소리 감소 |
rm_brth | breath | — | 숨소리 제거 |
trimIP | trim | — | IP-IP trim |
trim | trim | — | 일반 trim |
16k | sample_rate | ● | 16kHz 리샘플 (기본 22.05kHz 외 실험 그룹) |
16000 | sample_rate | ● | 16k 와 동의어, 동일 값으로 정규화 |
sbert | sbert | — | SBERT feature |
perturb | perturbation | ● | pitch/speed perturb (mel) |
perturb_ipa | perturbation | ● | perturb + ipa 결합 실험 |
\d+sen | subset | ● | 고정 N문장 subset (예: 1sen, 500sen) |
\d+sen_[A-Za-z0-9]+ | subset | ● | subset + 분기 태그 (예: 500sen_test, 500sen_xxx) |
ip_aug | experiment_tag | ● | gen_data.py ip_aug (쉼표 기준 분할 augmentation) |
torchmel | experiment_tag | ● | torch 기반 mel 생성 실험 |
yoursbert | experiment_tag | ● | yourTTS spk_yemb + sbert 결합 실험 |
mastering | experiment_tag | ● | 마스터링 실험 (정의 미확정) |
neutral | experiment_tag | ● | common_neutral.txt 기반 — 표준 common 으로 승격 전 임시 |
vad,vad2_1토큰은 정규 매핑에서 빠져 있다. 디스크에 존재하더라도 fs-sync 는unknown_suffix_tokenspending 으로 분리한다 (실험 그룹 자체로 인정되기 전 단계 — VAD 파이프라인 정합성 결정 후 재분류 예정).
실험(●) 축 = ADR 0008 에 정의된 EXPERIMENTAL_AXES(subset, sample_rate,
perturbation, experiment_tag). 해당 축에 기본값이 아닌 토큰이 있으면
processed_version.experimental = true 로 기록되고 기본 export 에서 자동
제외된다 (§5 R8).
| value | 의미 |
|---|---|
ko_base | Korean base encoding |
ko_ipa | Korean IPA |
hts_ipa | HTS IPA |
en_ipa | English IPA |
| 디렉토리 | 이유 |
|---|---|
trim_reduce_brth | 순서 위반 (R3) |
common_brandnew_token | 미등록 token (R2) — 새 PR 에서 R5 + 레지스트리 동시 등록 필요 |
vanilla_common | 기본값 명시 (R4) |
참고:
common_torchmel,common_16000,common_perturb_ipa는 등록되어 있어 accepted (실험 pv 로 분류) — 미등록 token 예시로는 부적합.
fs-sync 실행 시 위반 variant 는 pending 리포트로
통지 — pending_<ts>.json.scripts/lint_fs_paths.py (전처리 PR CI) — 신규
경로를 PR 단계에서 검증. 구현 시점은 운영 경험 축적 후 판단.processed_version.experimentalEXPERIMENTAL_AXES = (subset, sample_rate, perturbation, experiment_tag)
중 한 축이라도 기본값이 아니면 해당 processed_version 은 experimental=true
로 기록된다 (정본: tools/xdata/preprocessing.py:is_experimental).experimental=true (fs_walker._parse_style_dir
의 EXPERIMENTAL_UTTERANCE_STYLES 분기).variant.inclusion_policy != 'excluded' AND pv.experimental == false
(ADR 0008). 실험 pv 는 별도 요청 없이는 기본 훈련셋에 편입되지 않음.PREPROC_TOKEN_MAP / REGEX_TOKEN_MATCHERS
/ EXPERIMENTAL_AXES 동시 갱신 (§7 워크플로우 참조). 새 utterance_style
실험 그룹은 EXPERIMENTAL_UTTERANCE_STYLES 갱신.vad 축은 한때 정규 실험 축이었으나 (vad/vad2_1 토큰) 분류 정합성 정리 전
pending 으로 후퇴 — 디스크에 vad 디렉토리가 있으면 unknown_suffix_tokens
로 들어간다.| 상황 | 결과 | reason 코드 |
|---|---|---|
| root 가 디렉토리 아님 | pending 1건 | root_not_directory |
lang ∉ {KOR} | pending | unsupported_language |
service ∉ {MAIN} | pending | unsupported_service |
gender ∉ {female, male} | pending | unsupported_gender |
speaker 하위 base_phnseq/ 없음 | pending | missing_base_phnseq |
{ps}_xvoice{v} 패턴 불일치 | pending | phoneme_source_pattern_mismatch |
| utterance_style ∉ 허용 집합 | pending | unknown_utterance_style |
| suffix 에 미등록 token 있음 | pending | unknown_suffix_tokens |
| 빈 디렉토리명 | pending | empty_style_name |
새 전처리 단계가 디렉토리 suffix 로 노출될 때 따르는 절차:
tools/xdata/preprocessing.py 의
PREPROC_TOKEN_MAP 또는 PHONEME_ENCODING_TOKENS 확장.DEFAULT_PREPROCESSING 확장 + ADR 0007 추가 PR
(스키마 변경이므로 별 ADR 필요).harness xdata fs-sync --dry-run 에서 관련 pending 이
added/modified 로 승격되는지 확인.docs/decisions/0007-variant-natural-key-schema.mddocs/decisions/0008-variant-inclusion-and-notes.mddocs/superpowers/plans/2026-04-24-fs-walker-registry-sync.mdxdata-guide.md