Skip to content

Commit 63ab8f4

Browse files
wjdtjddns98claude
andauthored
revert(video): PR #121 되돌리기 — 7/23 상태로 복귀, 직립 마스코트 폐기 (#126)
* Revert "feat(video): 먹방 대개편 — 먹기 체이닝·자막 억제·싸가지 보이스·의인화 직립·3비트 고정 (#121)" This reverts commit 3b2f3a5. * ci: ruff 상한 핀(<0.16) 복원 — 롤백이 CI 인프라까지 되돌린 것 수정 PR #121 revert가 거기 섞여 있던 ruff 상한 핀까지 되돌렸다. CI는 `pip install -e ".[dev]"`로 매번 최신 ruff를 받으므로 신규 기본 규칙 65건이 그대로 터진다(2026-07-28에 이 핀을 넣은 사유와 동일한 65건). 마스코트·연출과 무관한 CI 인프라라 "7/23으로 롤백" 범위에서 제외하고 되살린다. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com> --------- Co-authored-by: Claude Opus 5 (1M context) <noreply@anthropic.com>
1 parent 3b2f3a5 commit 63ab8f4

7 files changed

Lines changed: 143 additions & 272 deletions

File tree

assets/mascot_anthro.png

-1.28 MB
Binary file not shown.

nutti/config.py

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -107,8 +107,6 @@ class Settings(BaseSettings):
107107
default=(
108108
"text, subtitles, captions, words, letters, writing, watermark, "
109109
"on-screen text, caption bar, hardcoded subtitles, korean text overlay, "
110-
"hangul, hangul characters, korean characters, korean subtitles, "
111-
"subtitle bar at bottom, bottom subtitle, lower third text, "
112110
# 클립 끝 페이드아웃 억제 — 끝 프레임이 어두워지면 프레임 체이닝이 망가진다.
113111
"fade out, fade to black, fade in, dimming, darkening, vignette, "
114112
# 클립 끝 자세 변화(누움·이탈) 억제 — 비트 경계 점프의 주원인.

nutti/integrations/ai_text.py

Lines changed: 11 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,11 @@
1717
# ========================= PO 수정 구역 (대본 톤·내용) =========================
1818
# 마스코트가 "무슨 말을, 어떤 톤으로" 할지는 아래 한국어 프롬프트를 고치면 바뀐다.
1919
# · 더 친근하게/전문적으로/재밌게 → 첫 문장(페르소나)과 말투 지시를 수정
20-
# · 비트 수는 pick_beat_count가 단일 소스 — 현재 3비트 고정(≈25초).
20+
# · 비트 수는 편별 완료율 A/B가 결정한다(pick_beat_count: 3비트≈25초 / 4비트≈35초,
21+
# 2026-07-21 PO — 2026 쇼츠 알고리즘이 완료율·루프를 최우선하므로 단축판 실측).
2122
# 비트 수·길이 숫자는 아래 빌더의 f-string이 자동 연동 — 직접 숫자를 고치지 말 것.
2223
# veo_fal 경로: 비트 N개 → 영상 8*N초(독립 8초 클립 스티칭, 앞뒤 침묵 트림).
23-
# · 비트 수 연혁: 4 → 3(비용 절감) → 4(2026-06-12 PO "조금 더 길게") → 3/4 A/B(2026-07-21)
24-
# → 3 고정(2026-07-28 PO "너무 길어서 안 본다").
24+
# · 비트 수 연혁: 4 → 3(비용 절감) → 4(2026-06-12 PO "조금 더 길게") → 3/4 A/B(2026-07-21).
2525
# 한국어 프롬프트라 PO가 직접 고쳐도 안전하다.
2626
_BEAT_STRUCTURES = {
2727
3: "①훅 ②핵심설명·실용 팁 ③마무리·CTA",
@@ -142,14 +142,14 @@ def pick_episode_format(key: str, avoid: str = "") -> str:
142142
return EPISODE_FORMATS[idx]
143143

144144

145-
# 완료율 A/B 종료(2026-07-28 PO "4비트는 너무 길어서 안 본다") — 3비트(약 27초) 고정.
146-
# 2026 쇼츠 알고리즘은 완료율·루프 재생을 최우선하므로 단축판을 채택했다.
147-
# 다시 A/B를 돌리려면 이 리스트에 4를 넣으면 된다(나머지 코드는 자동 연동).
148-
_BEAT_COUNT_VARIANTS = [3]
145+
# 완료율 A/B(2026-07-21 PO): 2026 쇼츠 알고리즘은 완료율·루프 재생을 최우선한다 —
146+
# 32초(4비트)는 완주 부담이 커서 24초(3비트) 단축판을 편별 50/50로 실측 비교한다.
147+
# 승자가 정해지면 이 리스트를 한 값으로 줄이면 된다(A/B 종료).
148+
_BEAT_COUNT_VARIANTS = [3, 4]
149149

150150

151151
def pick_beat_count(key: str) -> int:
152-
"""문자열(주제) CRC32로 편별 비트 수를 결정한다 — 비트 수 단일 소스."""
152+
"""문자열(주제) CRC32로 편별 비트 수(3/4)를 결정한다 — 완료율 A/B 단일 소스."""
153153
return _BEAT_COUNT_VARIANTS[zlib.crc32(f"beats:{key}".encode()) % len(_BEAT_COUNT_VARIANTS)]
154154

155155
# ==================== PO 수정 구역 (주제·메타데이터 SEO) ====================
@@ -458,14 +458,11 @@ def _split_into_beats(text: str, n: int = 4) -> list[str]:
458458
# 프롬프트 지시는 모델이 "참고사항"으로 취급해 간헐적으로 어긴다(실측: 의성어·발음
459459
# 리스크 단어 잔존). 아래 규칙은 코드 레벨로 강제하고, 위반 시 위반 사유를 붙여
460460
# 자동 재생성한다. 목록은 실측 축적 — 새 사례가 나오면 여기에 추가.
461-
_BEAT_COUNT = 3
461+
_BEAT_COUNT = 4
462462
# 지시상 38~44자지만 하드룰은 완충(재생성 무한루프 방지). 이 범위 밖만 반려.
463463
# 2026-07-10 PO 지시로 상한을 타이트하게(40~46→38~44) — 발화가 8초를 덜 채울수록
464464
# 비트 경계 유사도 매칭 여유(발화 끝~클립 끝)가 커져 스티칭이 더 매끄럽다(실측).
465-
# 2026-07-28 PO: 실측상 재시도 3회를 다 쓰고도 글자수만으로 포기하는 편이 반복돼
466-
# 하한을 28자로 완화(짧으면 무음 트림으로 흡수). 상한은 8초 클립 안에 발화가 들어가야
467-
# 하므로(한국어 ≈5.5자/초) 48자까지만 — 더 올리면 대사가 잘린다.
468-
_BEAT_MIN_CHARS, _BEAT_MAX_CHARS = 28, 48
465+
_BEAT_MIN_CHARS, _BEAT_MAX_CHARS = 33, 46
469466
# 의성어 — 대사에 들어가면 Veo가 효과음을 내며 입모양이 어긋난다(립싱크 붕괴 실측:
470467
# '콜록콜록'). 서술("기침을 한다면")로 풀어 쓰게 강제한다.
471468
_BANNED_ONOMATOPOEIA = [
@@ -490,8 +487,7 @@ def validate_script_body(body: str, n_beats: int = _BEAT_COUNT) -> list[str]:
490487
for i, ln in enumerate(lines, start=1):
491488
if not (_BEAT_MIN_CHARS <= len(ln) <= _BEAT_MAX_CHARS):
492489
violations.append(
493-
f"{i}번 비트가 {len(ln)}자 — 공백 포함 "
494-
f"{_BEAT_MIN_CHARS}~{_BEAT_MAX_CHARS}자로 다시 쓸 것"
490+
f"{i}번 비트가 {len(ln)}자 — 공백 포함 38~44자로 다시 쓸 것"
495491
)
496492
for word in _BANNED_ONOMATOPOEIA:
497493
if word in ln:

0 commit comments

Comments
 (0)