몰입형 독백 (16:9)
참고: Ali Abdaal, "How I'd Create Content in 2026 (If I Had To Start Over)" (youtu.be/A8PxRHQrLJ8, 16분, 1080p).
모션 언어는 해당 비디오에서 차용했습니다. 룩은 FringeLines v2.1 키트입니다:
My Drive/FringeLines Design System files/Fringe Lines Design system v2_1/ 및 토큰은 …/handoff/fringelines-tokens.css에 있습니다.
무엇이 참고 영상을 효과적으로 만드는가
비디오를 2초당 1프레임과 전환 구간의 밀집 샘플로 측정했습니다.
- 약 55%는 일반 토킹헤드. 고정 카메라, 미디엄 샷. 점프 컷은 약 5초마다 (중앙값): 16분 동안 약 122컷. 각 컷은 와이드와 펀치인이 번갈아 나타나 컷이 의도적으로 보이게 합니다.
- 두 가지 레이아웃, 그 이상은 없음:
- 전체 화면 스피커 위에 오버레이: 이름 로어 서드, 좌상단 컬러 콜아웃 카드(작은 레이블 칩 포함), 하단의 흰색 세리프 문장, 머리 근처의 작은 컬러 칩, 중앙 하단의 스폰서/CTA 버튼.
- 종이 캔버스. 스피커가 초상화 PiP(둥근 모서리, 흰색 테두리, 우측, 약 400×560)로 축소되고, 그래픽이 따뜻한 오프화이트 배경 위에 하나의 희미한 곡선과 함께 구성됩니다. 캔버스에는 키네틱 문장, 번호가 매겨진 로드맵 카드, 알약 다이어그램, 피라미드, 그리고 둥근 카드 안의 스크린샷 또는 B-롤(하단 캡션 포함)이 포함됩니다.
- 자막 없음. 화면 텍스트는 선택된 것입니다. 한 번에 한 문장씩, 음성과 동시에 단어 단위로 나타납니다. 각 단어는 희미하고 흐릿하게 시작했다가 선명해집니다. 핵심 구절은 색상이 변경됩니다.
- 다이어그램은 각 항목이 언급될 때 조각별로 구성됩니다. 알약은 약간의 오버슈트와 함께 튀어나옵니다. 피라미드 레이어는 위에서 떨어집니다.
- 카메라는 그래픽 내부에서 움직입니다. 5-카드 로드맵은 각 챕터마다 다시 나타나며, 활성 카드로 확대되고 나머지는 흐려집니다.
- 종료는 컷 대신 흐려집니다. 전체↔PiP 전환은 약 0.4초의 빠른 이지드 모프입니다.
- 리듬: 10-20초마다 새로운 시각적 아이디어, 섹션당 하나의 강조 순간(흑백), 각 인물이 처음 등장할 때 로어 서드.
- 사운드: 레이아웃 변경 시 부드러운 휘파람 소리, 항목이 안착할 때 가벼운 팝 소리, 음성 아래에 잘 묻히도록 유지합니다.
FringeLines에 매핑하는 방법 (이 기준에서 벗어나지 마세요)
| 참고 | FringeLines 버전 |
|---|---|
| 산호 하이라이트가 있는 따뜻한 세리프 | 모든 디스플레이 텍스트에 Instrument Serif. 하이라이트는 기울임꼴 구절, 종이 위에서는 잉크 블루 #1A4F6B, 비디오 위에서는 흰색. 오렌지 #D4622A는 오직 하나의 중요한 숫자에만 사용 ([7 AM], 통계). |
| 알약의 둥근 산세리프 | 알약, 칩, 목록 항목, 스택 레이블에 Archivo 500–600 |
| 작은 대문자 레이블 | IBM Plex Mono 600, 대문자, +0.14em, ≥ 22 px: 눈썹, 레이블 알약, 출처, 메타 |
| 코랄/레드 그라데이션 콜아웃 | 키트 그라데이션: 녹색 (기본값), 파란색 (두 번째 아이디어), 주황색 (경고 또는 "실수") |
| 파스텔 로드맵 카드 | 녹색, 파란색 및 주황색 워시, 모노 번호 배지 및 점선 주황색 커넥터 |
| 크림색 종이 + 곡선 | 종이 #F7F7F5와 하나의 희미한 녹색 워시 곡선 |
| 드롭 섀도우 | 없음. 평평한 표면, 2px 헤어라인 #E3E5DF, PiP의 흰색 테두리, 반경 16–18 |
| 스폰서 알약 | 흰색 CTA 알약 (fringelines.co / 뉴스레터) 및 주황색 모노 "Link in description" 탭 |
| 채널 아웃트로 | 녹색 엔드 카드, Clip Slides 커버: 모노 눈썹, 주황색 규칙, 하나의 기울임꼴 구절이 있는 세리프 헤드라인, Archivo 부제, ● fringelines.co |
키트 규칙은 여전히 적용됩니다:
- 화면당 하나의 아이디어;
- 화면당 하나의 오렌지;
- 녹색은 기본값, 파란색은 비교;
- 모든 통계에는
source가 있어야 함; - 22px 미만 없음.
구성 요소
- 템플릿:
pipeline/remotion/src/Monologue.tsx, 1920×1080 / 30fps의Monologue컴포지션.ShortV2.tsx의 얼굴 추적을 재사용합니다. - 빌드:
pipeline/build_monologue.py,cut및render의 두 단계가 있습니다. - 작업 폴더:
work/monologue/<slug>/에는clip.mp4,props.json,transcript.txt,beats.json및faces.json이 있습니다. - 출력:
out/monologue/<slug>.mp4, -14 LUFS로 노멀라이즈됨. - 작업 예시:
work/monologue/morning-loop-test/beats.json, 10월 30일 에피소드의 Quinn이 등장하는 62초 클립.
1. 테이크 확보
단일 카메라 16:9 녹화본, 좋은 오디오, 한 사람, 약 1-15분. inbox/monologue/<slug>/take.mp4에 넣습니다.
에피소드에서 솔로 구간을 추출하려면 카메라 트랙과 스튜디오 사운드 트랙을 머싱합니다. Descript XML에서 오프셋을 가져오려면 build_short.xml_offsets를 사용하세요. morning-loop-test가 어떻게 만들어졌는지 확인하십시오:
ffmpeg -ss <t0-videoOffset> -t <dur> -i Quinn.mp4 -ss <t0-audioOffset> -t <dur> -i studio-sound-Quinn.m4a -map 0:v -map 1:a … take.mp4
2. 컷
~/.shorts-skill/bin/python pipeline/build_monologue.py cut --slug <slug> --src inbox/monologue/<slug>/take.mp4 \
[--range 12.0:95.5 --range 120:180] [--replace "gtm=>GTM" --replace "quick=>Quick"]
컷 단계가 수행하는 작업:
- Whisper로 테이크를 전사합니다 (
words-src.json에 캐시). - 필러, 더듬거림, 긴 멈춤을 제거합니다 (쇼츠와 동일한 플래너 사용).
- 각 점프 컷에서 펀치인(1.0 / 1.12, 얼굴 중심)을 번갈아 적용합니다.
- 컷 클록을 기준으로
word@seconds형식의transcript.txt를 작성합니다.
--replace는 리빌 타이밍에 사용되는 단어만 수정합니다. 자동 캡션은 생성되지 않습니다.
3. work/monologue/<slug>/beats.json 작성
transcript.txt를 읽고 비트를 계획합니다.
{"brand": "FringeLines", "beats": [
{"type": "title", "at": 0.2, "end": 2.0, "eyebrow": "FringeLines · Monologue", "text": "The *morning loop*"},
{"type": "name", "at": 2.1, "end": 5.4, "text": "Quinn", "role": "Host · Fringe Lines"},
{"type": "chips", "at": 3.0, "end": 7.4, "items": [{"text": "GTM loops", "at": 3.1}, {"text": "Coding loops", "at": 5.1, "tone": "blue"}]},
{"type": "text", "at": 7.6, "end": 11.3, "eyebrow": "What's a loop?", "text": "Loop's just a *stated goal* and then it works *autonomously*"},
{"type": "callout", "at": 11.5, "end": 16.2, "label": "The setup", "tone": "green", "text": "I use Quick Desktop with routines that execute at any time"},
{"type": "overlay", "at": 16.4, "end": 18.3, "text": "I usually run it at [7 AM]"},
{"type": "stack", "at": 22.4, "end": 36.4, "title": "My core team · 4 people", "items": [{"text": "Account executive", "at": 25.6}, "…"]},
{"type": "stat", "at": 51.2, "end": 55.1, "kicker": "My regular account team", "value": 14, "text": "people I'm interacting with on a regular basis", "source": "Quinn's own count · Fringe Lines, Oct 30 2026"},
{"type": "end", "at": 58.4, "end": 61.4, "text": "Building the *morning loop*", "sub": "The full walkthrough is in this week's episode."}
]}
시간
- 시간은 컷 클립 기준 초입니다.
end(또는hold)는 비트를 종료하며, 종료 시 0.3초에 걸쳐 흐려집니다. - 텍스트는 음성과 동기화되어 단어 단위로 나타납니다.
text의 모든 단어는 비트 윈도우 내에서 전사본과 일치됩니다.- 동기화가 작동하도록 스피커의 말을 그대로 인용하세요 (가벼운 다듬기는 괜찮음).
- 텍스트가 의역인 경우, 리빌은 균등한 간격으로 대체됩니다.
"reveal": "even"으로 강제할 수 있습니다.
- 항목
at시간은 기본적으로 균등한 간격입니다. 각 항목이 말해지는 순간으로 설정하세요 (단어보다 약 0.1초 먼저).
마크업
*기울임 하이라이트*: 화면당 하나의 구절.[액센트 숫자]: 주황색, 화면당 하나, 숫자만 가능.
비트 유형
스피커 전체 화면 (오버레이):
| type | fields | 사용 |
|---|---|---|
title | text, eyebrow? | 어두워진 프레임 위의 콜드 오프닝 타이틀 (처음 2-3초) |
name | text, role? | 인물이 처음 등장할 때의 로어 서드 |
overlay | text | 하단의 흰색 세리프체로 표시되는 한 문장: 기억하고 싶은 대사 |
callout | text, label?, tone?, side? | 좌상단(또는 우측)의 컬러 카드와 모노 레이블 알약: "실수 #1", "설정", "규칙" |
chips | items[{text, at, tone?}], side?, tone? | 머리 옆에 나타나는 2-3개의 짧은 태그: 내면의 목소리, 이름, 옵션 |
cta | text, sub? | 하단 알약: 뉴스레터, 에피소드 또는 제안. 보통 비디오 중간에 한 번 |
bw | (none) | 스피커에 대한 흑백 강조; overlay와 함께 사용 |
media + "full": true | src, video?, from? | PiP에 스피커가 있는 전체 화면 B-롤 |
종이 캔버스 (스피커가 PiP로 이동):
| type | fields | 사용 |
|---|---|---|
text | text, eyebrow?, align? | 키네틱 문장: 정의, 논제, "가장 중요한..." 대사 |
stack | items[{text, at, tone?}] (하단→상단), title? | 피라미드 또는 레이어: 기초 → 전략 → 결과, 팀 레이어 |
compare | title?, left{label, items}, right{label, items}, winner? | A vs B: 취미 vs 수익, 이전 vs 이후. 패자는 끝 부분에서 회색으로 변함 |
roadmap | items[{text}] (≤6), active?, zoom? | 비디오 챕터. 시작 부분에 한 번 표시한 후, 각 챕터마다 active = 챕터 인덱스 및 zoom = 확대 시점과 함께 재사용 |
steps | items[{text, at}], title? | 헤어라인 규칙이 있는 번호 매기기 목록: 전문가, 도구, 단계 |
stat | value, prefix?, suffix?, decimals?, kicker?, text, source | 주황색으로 카운트업되는 하나의 숫자; 출처 필수 |
media | src, title?, meta?, video?, from? | 둥근 카드 안의 스크린샷 또는 B-롤, 캡션 포함(타이틀 + 모노 메타 라인). 파일은 작업 폴더에 위치 |
end | text, eyebrow?, sub?, url?, tone? | 녹색 엔드 카드 (2-4초) |
0.7초 미만으로 떨어진 종이 비트는 PiP 레이아웃에 유지되므로 스피커가 바운스되지 않습니다.
페이싱 규칙 (참고 영상 기준)
- 처음 5초 이내에
title과name으로 시작합니다. - 종이 비트는 런타임의 35-45%를 차지합니다. 시각적 변화 없이 약 20초 이상 가지 말고, 종이에 15초 이상 머물지 마십시오.
- 두 레이아웃을 번갈아 사용하세요.
callout을 연속으로 두 번 사용하지 말고, 그 사이에text또는 다이어그램을 넣으십시오. - 비트당 하나의 아이디어.
text비트는 14단어 이하로, 콜아웃은 16단어 이하로 유지하십시오. - 다이어그램 항목은 단어 위에 배치되며, 절대 한 번에 모두 배치되지 않습니다. 다이어그램의 첫 번째 항목은 비트 시작 후 약 1초 이내에 배치되어야 합니다. 그렇지 않으면 비트가 더 늦게 시작됩니다.
- 섹션:
- 인트로 끝에
roadmap을 표시합니다. - 각 섹션 시작 부분에
active를 설정하여 재사용합니다. - 각 섹션을 주요 대사의
overlay로 닫고, 가장 큰 섹션에는bw를 사용합니다.
- 인트로 끝에
- 최대 5분당 한 번
cta, 처음 30초 이내에는 절대 사용하지 않습니다. end카드로 종료합니다. 마지막 단어 이후에도 실행될 수 있습니다.
정직성
- 화면의 숫자는 말한 내용과 같거나, 명명된 출처
source에서 가져와야 합니다. - 다른 사람 콘텐츠의 스크린샷은
meta에 크레딧이 필요합니다. - 스피커의 발언을 조작하지 마십시오: 인용문이 아닌
overlay또는text비트는 레이블로 읽혀야 하며, 발언으로 읽혀서는 안 됩니다.
4. 렌더
~/.shorts-skill/bin/python pipeline/build_monologue.py render --slug <slug> [--sfx-db -22]
- 얼굴을 한 번 추적합니다 (
faces.json; 다시 컷하면 삭제). - 렌더링 시간은 비디오 길이에 비례합니다. 1분 테스트는 Mac mini에서 몇 분 정도 걸렸습니다.
- 음향 효과: 각 레이아웃 변경 시 휘파람 소리, 항목 안착 시 팝 소리, 타이틀 및 엔드 카드로의 라이저. 더 많은 에너지를 위해
--sfx-db를 -18 쪽으로 높이십시오.
5. QA (항상)
for t in 1.5 5 10 20 30 40 50 60; do ffmpeg -v error -y -ss $t -i out/monologue/<slug>.mp4 -frames:v 1 -vf scale=640:-1 /tmp/m_$t.png; done
각 사항을 확인하십시오:
- 텍스트: PiP 아래로 텍스트가 실행되지 않음 (종이 영역은 x = 1320에서 끝남). 스택 레이블이 한 줄에 맞음.
- 하이라이트: 잘못된
*또는[없음. 화면당 최대 하나의 주황색. - 얼굴 프레이밍: 얼굴이 PiP 중앙에 있고, 펀치인이 머리를 자르지 않음.
- 리빌 타이밍: 리빌이 음성 위에 배치됨. 비트가 오랫동안 희미한 단어를 표시하면
at이 너무 이른 것입니다. - 라우드니스:
ffmpeg -i out.mp4 -af ebur128 -f null - 2>&1 | grep " I:"결과가 약 -14로 나타남.
사용자에게 보고:
- 런타임 및 비트 목록 (시간 → 유형 → 텍스트);
- 아직 확인이 필요한 사항: 숫자, 이름 및 스크린샷 크레딧;
- 텍스트가 그대로 인용되지 않아 균등 리빌로 대체된 비트.
아직 구축되지 않음
- 9:16 버전: 컴포지션은 16:9 전용입니다. 세로형의 경우
editorial-short스킬로 쇼트를 자르십시오. - 자동 계획:
beats.json작성은 판단력이 필요하므로 수동으로 또는 Claude가transcript.txt로부터 수행합니다.