{
  "_why": "입 영역 박스는 손으로 고정한다 — 자동 얼굴검출이 틀리면 조용히 결론을 만든다. 여기 좌표가 없으면 문서의 모션비 수치를 아무도 재현할 수 없다(verifier 지적 2026-08-08).",
  "_format": "정규화 좌표 [x0, y0, x1, y1] · skip = 앞에서 제외할 프레임 수",
  "_validation": "각 박스는 openness 상·하위 프레임을 잘라 육안 확인했다(열린 입 / 닫힌 입이 실제로 갈리는지). 검증 이미지 = c_openness_extremes.png · ltx_openness_extremes.png · ltx_*_mouthbox.png · box_*_f*.png",
  "out_5a_h3_j26509.mp4":  {"mouth": [0.40, 0.335, 0.60, 0.415], "skip": 0, "end": null, "who": "한나"},
  "out_5b_h3_j26510.mp4":  {"mouth_jiho": [0.72, 0.30, 0.90, 0.36], "mouth_hanna": [0.30, 0.465, 0.44, 0.525], "skip": 0, "end": null,
                            "_note": "프로필 투샷 — 지호=우상단 / 한나=좌중단. 화자 귀속은 이 두 박스의 모션을 무음구간 baseline 으로 나눠서 판정했다. 영상 8.000s = 오디오 길이라 end 불요"},
  "out_5c_h3_j26511.mp4":  {"mouth": [0.43, 0.36, 0.54, 0.405], "skip": 0, "end": 5.17, "who": "유민",
                            "_note": "팝필터가 얼굴 좌측을 가려 박스를 오른쪽으로 붙였다"},
  "out_5d_probe30s_j26515.mp4": {"mouth": [0.43, 0.36, 0.54, 0.405], "skip": 0, "end": null, "who": "유민"},
  "out_5a_ltx_j26512.mp4": {"mouth": [0.55, 0.49, 0.66, 0.56], "skip": 6, "end": 3.69, "who": "한나"},
  "out_5b_ltx_j26513.mp4": {"mouth": [0.38, 0.64, 0.58, 0.79], "skip": 6, "end": 6.48, "who": "지호"},
  "out_5c_ltx_j26514.mp4": {"mouth": [0.40, 0.34, 0.52, 0.42], "skip": 6, "end": 5.17, "who": "유민"},
  "_skip6": "LTX ia2v 는 **f0 가 입력 이미지 그대로**다(다른 구도·다른 크기). 안 빼면 openness 가 1.0 극단값이 되어 통계를 통째로 오염시킨다.",
  "_end": "★LTX 는 **영상이 오디오보다 길다**(⑤-a 4.04s 영상/3.69s 오디오 · ⑤-b 7.04/6.48 · ⑤-c 6.04/5.18). 그 무음 꼬리를 '무음 구간' 으로 세면 모션비가 통째로 흔들린다 → `--end` 로 **오디오 길이에 맞춰 자른다**. H3 는 영상 길이 = 오디오 길이라 ⑤-c(가창 windows 사용) 외엔 불요.",
  "_singing_windows": {
    "_source": "whisper-cuda-spark · model=whisper-speech · response_format=verbose_json · timestamp_granularities[]=word · out_5c_h3_j26511.mp4 산출 오디오 기준",
    "sung":  [[0.0, 2.60], [3.66, 4.96]],
    "gap":   [[2.60, 3.66], [4.96, 5.17]],
    "_note": "가창은 유성비율 0.99 라 자동 유성구간 검출이 성립하지 않는다 → lipsync_ratio.py --windows 로 이 구간을 준다"
  },
  "_box_sensitivity": {
    "_정본": "★수치는 여기가 아니라 `box_sweep.py` 실행 결과(`box_sweep.json`)가 정본이다. 산문으로 적은 '±0.02 상하좌우' 를 재현자가 다르게 해석해 다른 끝값이 나온 적이 있다(부동소수 잔차 하나로 크롭이 1픽셀 밀린다) → 이동 벡터를 코드에 고정했다. 아래는 그 출력의 사본이다.",
    "_method": "5판 = 원위치 · +x · −x · +y · −y (각 ±0.02 · 좌표는 소수 4자리 반올림 · 박스 크기 불변). 정본 설정(skip·end·windows) 그대로.",
    "LTX_5a": {"실제": "1.71~2.30", "역전": "1.11~1.18", "실제우위": "5/5"},
    "H3_5a":  {"실제": "1.20~1.35", "역전": "0.75~0.87", "실제우위": "5/5"},
    "H3_5c":  {"실제": "0.94~1.18", "역전": "1.06~1.18", "실제우위": "2/5 (역전 우위 3/5) ← 구분 안 됨",
               "_쌍": [[1.09, 1.13], [1.12, 1.11], [1.04, 1.18], [1.18, 1.06], [0.94, 1.08]]},
    "LTX_5c": {"실제": "1.33~1.73", "역전": "0.94~1.08", "실제우위": "5/5",
               "_쌍": [[1.73, 0.94], [1.37, 1.03], [1.62, 0.97], [1.65, 0.97], [1.33, 1.08]]},
    "_읽는 법": "★배수는 박스 의존이라 신뢰하지 마라. 판정에 쓸 수 있는 것은 ⓐ실제/역전 우위가 5/5 인가 ⓑ두 경로의 범위가 겹치는가 두 가지다. 발화 축은 H3 1.20~1.35 vs LTX 1.71~2.30 으로 안 겹치고, 가창의 H3 는 자기 네거티브와도 안 갈린다."
  }
}
