- name
- transcript2html
- description
- Use when the user wants to convert a YouTube transcript.md (produced by /youtube or /youtube2script) into a readable Korean dark-mode HTML document, with frames embedded and a cleaned-up transcript_formatted.md. Triggers - /transcript2html, ํธ๋์คํฌ๋ฆฝํธ HTML, ์คํฌ๋ฆฝํธ ์ฝ๊ธฐ๋ชจ๋, transcript ์ฝ๊ธฐ, ์ ํ๋ธ ์คํฌ๋ฆฝํธ ํ๊ตญ์ด, transcript ํ๊ตญ์ด ๋ณํ.
# Transcript -> Readable Korean HTML
`/youtube2script` ๋๋ `/youtube` ๊ฐ ๋ง๋ `transcript.md` ๋ฅผ ๋ฐ์์ ๋ ๊ฐ์ ํ์ผ์ ๋ง๋ ๋ค:
1. **`transcript_formatted.md`** -- ์๋ณธ ์์ด raw transcript์ ์ ๋ฆฌํด์ ์คํ/์ ์ฌ์ค๋ฅ๋ฅผ ๊ณ ์น๊ณ , 2~3 ์ด์ ๋จ์ chunk์ ๋ฌธ๋จ์ผ๋ก ํฉ์น๊ณ , ์น์
ํค๋๋ฅผ ๋ถ์ด๊ณ , ํ๋ ์์ ๋ณธ๋ฌธ ์ฌ์ด์ ๋ผ์ด **ํ๊ตญ์ด** ์ฝ๊ธฐ์ฉ Markdown.
2. **`transcript.html`** -- dark mode + Stripe ์คํ์ผ + Pretendard ๊ธฐ๋ฐ ์ฝ๊ธฐ์ฉ HTML. ํ๋ ์ ์นด๋ + ๋ณธ๋ฌธ ์นด๋ + pullquote + verdict ๋ธ๋ก.
๋ ๋ค ์๋ณธ `transcript.md` ๊ฐ ์๋ ๋๋ ํ ๋ฆฌ์ ์ ์ฅํ๋ค.
## Input
์ ์ ๊ฐ ๊ฒฝ๋ก๋ฅผ ์ค ์๋ ์๊ณ (ํ์ผ ๋๋ ๋๋ ํ ๋ฆฌ), ์ ์ฃผ๋ฉด ํ์ฌ cwd ์๋ ๊ฐ์ฅ ์ต๊ทผ `output/*/transcript.md` ๋ฅผ ์ฐพ๋๋ค.
```
/transcript2html [path/to/transcript.md or output/dir/]
```
## Step 1. Read
- `transcript.md` ์ฝ๊ธฐ (Read tool)
- ๊ฐ์ ๋๋ ํ ๋ฆฌ์ `metadata.json` ์ฝ๊ธฐ (์์ผ๋ฉด) -- title, channel, duration, url, upload_date
- ๊ฐ์ ๋๋ ํ ๋ฆฌ์ `frames/` ๋๋ ํ ๋ฆฌ ์ค์บ -- `frame_NNN_MMSS.jpg` ํ์
- `transcript.md` ์๋จ์ `Frame source` ํ๋ ํ์ธ: `heatmap` ์ด๋ฉด ์กฐํ์ ํผํฌ, `even` ์ด๋ฉด ๊ท ๋ฑ ๊ฐ๊ฒฉ fallback -- ์ด๊ฑด hero eyebrow์ ๋ฐ์ ("YouTube ํธ๋์คํฌ๋ฆฝํธ · Mo Bitar · ์กฐํ์ ํผํฌ 10์ปท" ๋๋ "๊ท ๋ฑ 10์ปท")
- ๊ฐ ํ๋ ์๋ง๋ค `### @ MM:SS` ์๋ `> **๋์ฌ**: <์๋ฌธ>` ๋ธ๋ก์ด ์๋ค. ์ด๊ฒ ๊ทธ ์์ ์ ์์์์ ์ค์ ๋ก ์ธ๊ธ๋๋ ๋์ฌ ์๋ฌธ. ์ด๊ฑธ **ํ๊ตญ์ด๋ก ๋ฒ์ญํด์** ํ๋ ์ ๋ฐ๋ก ์๋ `.frame-caption` ๋ธ๋ก์ ๋ฃ๋๋ค. (์๋ฌธ๋ `<span class="raw">` ๋ก ์๊ฒ ๋ณ๊ธฐ)
## Step 2. Clean & Segment (์์ด ์๋ณธ)
raw transcript์์:
- 2~3 ์ด์ chunk์ ๋ฌธ๋จ์ผ๋ก ํฉ์น๋ค
- ์ ์ฌ ์ค๋ฅ ๊ต์ : ๊ณ ์ ๋ช
์ฌ(ํ์ฌ๋ช
, ์ฌ๋์ด๋ฆ, ์ ํ๋ช
), ์๋ง ์๋์์ฑ์ด ํํ ํ๋ฆฌ๋ ์คํ ๋ง, `[ __ ]` ๊ฐ์ ๋ง์คํน์ ๋งฅ๋ฝ์ ์์ฐ์ค๋ฌ์ด ๋จ์ด๋ก ๋ณต์ (์ต์ง๋ก ์์ค ๋ฃ์ง ๋ง ๊ฒ -- ๋ฌธ๋งฅ์ ๋ง๋ ํํ ์ ํ)
- ๋ด์ฉ์ ์์ฐ์ค๋ฌ์ด ๊ตฌ๋ถ์ 3~6๊ฐ๋ก ์น์
๋ถํ
- ๊ฐ ์น์
์ ์งง์ ํ๊ตญ์ด ์ ๋ชฉ ๋ถ์ฌ
- ํ๋ ์ ํ์์คํฌํ๋ฅผ ๊ฐ ์น์
๊ฒฝ๊ณ์ ๋งคํ
## Step 3. Translate to Korean
์์ด ์๋ณธ -> ์์ฐ์ค๋ฌ์ด **ํ๊ตญ์ด ์ ์ค์ฒด (~์์ฒด)** ๋ฒ์ญ.
### ์คํ์ผ ๊ท์น (paper-style ์์น ์ฐจ์ฉ)
**๊ธ์ง**:
- ๋ฒ์ญ์ดํฌ ("~์ด๋ค", "~๊ฒ์ด๋ค", "~ํจ์ ์์ด์", "~์ ํตํ์ฌ", "~์ ๋ํ ๊ฒ์ด๋ค")
- AI slop: "์ค์ํ ๊ฒ์", "์ฃผ๋ชฉํ ๋งํ", "ํต์ฌ์", "~์ ๋ค๋ฆ ์๋๋ค", ๊ณผ์ ๋ณ๋ ฌ "A, B, ๊ทธ๋ฆฌ๊ณ C"
- ๊ฒฉ์์ฒด (~ํฉ๋๋ค, ~์
๋๋ค) -- ์ด๊ฑด ๋ด์ค ์๋
- ๋ฐ๋ง (~ํด, ~์ผ) -- ๋ฌธ์ ์ฝ๊ธฐ ์ฉ๋
- ์๋ฏธ ๋ถํ๋ฆฌ๊ธฐ: "ํ์ ์ ์ธ", "๋๋ผ์ด", "ํ๊ธฐ์ ์ธ"
- em dash (U+2014) -- ์ผํ๋ ๊ดํธ ๋๋ ์ค๋ฐ๊ฟ์ผ๋ก
- ๋ณผ๋+์ฝ๋ก ๋ฆฌ์คํธ ("**์๋:** ๋นจ๋ผ์")
- ๊ณผ์ hedging ("~์ผ ์๋ ์์ ๊ฒ ๊ฐ์ต๋๋ค๋ง")
- ์ธ ๊ฐ ๋์ด ํจํด ๋ฐ๋ณต
- ์ด๋ชจ์ง
**๊ถ์ฅ**:
- ํด์์ฒด (~์, ~์ด์, ~๋ค์) ์ ์ง, ํค ์ผ๊ด์ฑ
- ์งง์ ๋ฌธ์ฅ + ๊ธด ๋ฌธ์ฅ ์๊ธฐ. ๊ท ์ผํ ๋ฆฌ๋ฌ์ ๊ธฐ๊ณ ๋๋
- ์์ ์์ ๋์/์ ๋จธ๋ ์ด๋ฆฌ๋ ๊ณผ์ฅํ์ง ๋ง ๊ฒ
- ์์ด ๊ณ ์ ๋ช
์ฌ/์ ํ๋ช
/๊ธฐ์ ์ฉ์ด๋ ๊ทธ๋๋ก: ChatGPT, GPT-5, Claude, Gemini, Reddit, LinkedIn, Substack, Subnautica, PUBG, Krafton, Shark Tank, Mr. Wonderful, Delaware, Harvard Business School, Steam, IKEA, Grammarly, Slack, Iron Dome, Labradoodle, Roomba ๋ฑ
- ๋จ, ์์ญ์ผ๋ก ๋ ์์ฐ์ค๋ฌ์ด ๊ฒ: "prompt engineering" -> "ํ๋กฌํํธ ์์ง๋์ด๋ง" (์์ฐจ), "Inc. magazine" -> "Inc. ๋งค๊ฑฐ์ง", "CEO" -> "CEO" ๊ทธ๋๋ก
- ์๋ฏธ๊ฐ ํ๊ตญ์ด์ ์๋ ํํ์ ์์ญ + ํ์์ ์์ด ์๋ฌธ `<span class="en">original</span>` ๋ณ๊ธฐ (๋จ์ฉ ๊ธ์ง, ๋ฌธ์ ์ ์ฒด 5ํ ์ดํ)
### ์ต์งํด์ ๊ธ์ง
์๋ฌธ์ด ๊ณผ์ฅ์ด๋ฉด ๊ณผ์ฅ ๊ทธ๋๋ก, ๋น๊ผฌ๊ธฐ๋ฉด ๋น๊ผฌ๊ธฐ ๊ทธ๋๋ก. ๋ฒ์ญ์๊ฐ "์ค์ ์ด๋ฐ ์๋ฏธ์
๋๋ค"๋ผ๊ณ ํ์ดํ์ง ๋ง ๊ฒ. ์๋ฌธ์ ์๋ ๋งฅ๋ฝ ์ถ๊ฐ ๊ธ์ง. ์๋ฌธ์ด ๋ชจํธํ๋ฉด ๋ชจํธํ ๋๋ก ๋ฒ์ญ.
## Step 4. Write `transcript_formatted.md`
Markdown ๊ตฌ์กฐ:
```markdown
# {ํ๊ตญ์ด ์ ๋ชฉ}
- **Channel**: ...
- **URL**: ...
- **Duration**: ...
- **Upload Date**: ...
---
## 1. {์น์
1 ์ ๋ชฉ}

{๋ฒ์ญ๋ ๋ฌธ๋จ}
{๋ฒ์ญ๋ ๋ฌธ๋จ}
---
## 2. {์น์
2 ์ ๋ชฉ}
...
```
ํ๋ ์์ ๊ฐ ์น์
์๋จ ๋๋ ์ค๊ฐ์ (์น์
๊ธธ์ด์ ๋ฐ๋ผ). em dash ์ฌ์ฉ ๊ธ์ง -- `--` ๋๋ ์ผํ๋ก.
## Step 5. Write `transcript.html` (dark mode)
ํ
ํ๋ฆฟ: `~/.claude/skills/transcript2html/template_dark.html`
Read๋ก ํ
ํ๋ฆฟ ์ฝ๊ณ , ๋ค์ placeholder๋ค์ ์นํ:
| Placeholder | ๋ด์ฉ |
|---|---|
| `{{TITLE}}` | `<title>` ํ๊ทธ์ฉ -- ํ๊ตญ์ด ์ ๋ชฉ |
| `{{EYEBROW}}` | "YouTube ํธ๋์คํฌ๋ฆฝํธ · {channel}" |
| `{{TITLE_HTML}}` | h1์ฉ HTML -- ๋ ์ค ๋ถ๋ฆฌ ๊ฐ๋ฅ, `<br>` ์ `<span class="dim">` ํ์ฉ |
| `{{LEDE}}` | ํ ๋ฌธ๋จ ์์ฝ (2~3 ๋ฌธ์ฅ, ๋์ ๋ง๊ณ ๋ด๋ฐฑํ๊ฒ) |
| `{{HERO_STATS}}` | 4๊ฐ `<span class="stat-chip"><b>๊ฐ</b> ๋ผ๋ฒจ</span>` -- duration, ์ํธ๋ฆฌ ์, ํต์ฌ ์์น 2๊ฐ |
| `{{SECTIONS}}` | ์ ์ฒด ์น์
๋ธ๋ก |
| `{{URL}}` | ์๋ณธ URL |
| `{{URL_LABEL}}` | URL ์ถ์ฝ ๋ผ๋ฒจ (e.g., `youtube.com/watch?v=...`) |
| `{{DATE}}` | `YYYY.MM.DD` -- ์ค๋ ๋ ์ง |
### ์น์
๋ธ๋ก ๊ตฌ์กฐ
๊ฐ ์น์
:
```html
<section>
<p class="sect-kicker">Act 01</p>
<h2 class="sect-title">{์น์
์ ๋ชฉ}</h2>
<figure>
<img src="frames/frame_NNN_MMSS.jpg" alt="frame at MM:SS">
<figcaption>MM:SS</figcaption>
</figure>
<div class="frame-caption">
<span class="label">์ด ์์ ๋์ฌ · MM:SS</span>
<p class="ko">{ํด๋น ์ด์ ๋์ฌ ํ๊ตญ์ด ๋ฒ์ญ, ์งง๊ฒ 1~2๋ฌธ์ฅ. ํต์ฌ ํค์๋๋ <strong>bold</strong>}</p>
<span class="raw">{์๋ฌธ ์์ด, ๋๋ฌด ๊ธธ๋ฉด ๋ง์ค์}</span>
</div>
<div class="card">
<p>{ํ๊ตญ์ด ๋ณธ๋ฌธ ๋ฌธ๋จ, <u>ํค์๋ ๋ฐ์ค</u>, <strong>ํต์ฌ ๋จ์ด bold</strong>, <span class="key">์ค์ ๊ฐ๋
์ key class</span> ์ ๊ทน ์ฌ์ฉ}</p>
<p>{๋ฌธ๋จ}</p>
</div>
<figure>...</figure>
<div class="frame-caption">...</div>
<div class="card">...</div>
</section>
```
### ๊ฐ์กฐ ๊ท์น (ํ์)
๋ณธ๋ฌธ ์นด๋ ๋ฌธ๋จ์ ์๊ฐ์ ์ผ๋ก ๋๋ ทํด์ผ ํ๋ค. ํ ๋ฌธ๋จ๋น ์ต์ 1~2ํ ๊ฐ์กฐ.
- **`<strong>`**: ์ซ์, ๊ธ์ก, ํต์ฌ ๋ช
์ฌ. ์น์
๋น 3~5ํ.
- **`<u>`**: ์ค์ ์์ ์ด/๊ฐ๋
. ์น์
๋น 2~4ํ. accent ์ปฌ๋ฌ ์ธ๋๋ผ์ธ.
- **`<span class="key">`**: ๊ฐ๋
์ฉ์ด (๋ฐ์ค + accent ์ปฌ๋ฌ + bold). ๋ฌธ์ ์ ์ฒด 6~10ํ.
- **`<span class="hl">`**: ํต์ฌ ๊ตฌ๋ฌธ ๊ฐ์กฐ (accent-soft bg ๋ฐฐ์ง). ๋ฌธ์ ์ ์ฒด 5~8ํ.
- **`<span class="mark-y">`**: ๋
ธ๋ ํ๊ดํ. ๊ฒฐ์ ์ ํ ๋ฌธ์ฅ/ํต์ฌ ์์น์๋ง. ๋ฌธ์ ์ ์ฒด 3~6ํ.
- **`<em>`**: ์ธ์ฉ๋ ๋์ฌ ๋๋ ํค์ด ๋ค๋ฅธ ๋ถ๋ถ.
๊ฐ์ ๋จ์ด๋ฅผ 4์ข
๊ฐ์กฐ ๋ค ์
ํ์ง ๋ง ๊ฒ. ํ ๋ฌธ์ฅ์ ํ ๊ฐ์กฐ๊ฐ ๊ธฐ๋ณธ.
### ํน์ ๋ธ๋ก
- **`.frame-caption`**: ๋ชจ๋ figure ๋ฐ๋ก ์๋์ ๋ฐฐ์น. ๊ทธ ์์ ์ ์์์์ ์ค์ ๋ก ๋์ค๋ ๋์ฌ๋ฅผ ํ๊ตญ์ด ๋ฒ์ญ + ์๋ฌธ ๋ณ๊ธฐ. `<span class="label">์ด ์์ ๋์ฌ · MM:SS</span>` + `<p class="ko">` + `<span class="raw">`.
- **`.pullquote`**: ์น์
๋ด 1ํ, ํต์ฌ ํ ๋ฌธ์ฅ ๊ฐ์กฐ์ฉ -- ๋คํฌ gradient ์นด๋, `<p class="kicker">ํต์ฌ</p>` + `<p>์ธ์ฉ๋ฌธ</p>`. ๋ฌธ์ ์ ์ฒด 0~2ํ.
- **`.verdict`**: ๋ฌธ์ ๋ง๋ฏธ 1ํ. ์๋ฌธ์ ๊ฒฐ๋ก /ํต์ฌ ํต์ฐฐ 1๋ฌธ๋จ. `.kicker`๋ "๊ฒฐ๋ก " ๋๋ "ํต์ฌ".
### Hero stats
4๊ฐ ๊ณ ์ . ์์:
- duration: `07:52`
- ์ํธ๋ฆฌ ์ or ์น์
์: `5 ์น์
`
- ํต์ฌ ์์น1: `30K` + ๋ผ๋ฒจ "์ฐ๊ตฌ ๋ฐ์ดํฐ"
- ํต์ฌ ์์น2: `$250M` + ๋ผ๋ฒจ "์์ก ๊ท๋ชจ"
๊ฐ์ `<b>` ๋ก, ๋ผ๋ฒจ์ `<b>` ๋ค ํ
์คํธ๋ก.
## Step 6. Open
๋ ๋ค ์ฐ๋ค:
```bash
open "path/to/transcript.html"
open -a MarkText "path/to/transcript_formatted.md"
```
## Output summary
์๋ฃ ํ ์ ์ ์๊ฒ:
- ์์ฑ๋ ํ์ผ 2๊ฐ์ ์๋๊ฒฝ๋ก
- ๋๋ต์ ์ธ ์น์
์
- ํ ์ค: "์ ์ฒด ์ฝ๋ ๋ฐ ~๋ถ"
## Notes
- ํ
ํ๋ฆฟ์ `~/.claude/skills/transcript2html/template_dark.html` ํ๋๋ง ์์ (dark + Stripe ์คํ์ผ ๊ธฐ๋ณธ). ์ ์ ๊ฐ "light ๋ชจ๋" ๋๋ "minimal ์คํ์ผ"์ ๋ช
์ํ๋ฉด ๊ฑฐ์ ํ์ง ๋ง๊ณ ์์๋ก CSS๋ฅผ ์์ ํด์ ๋ง๋ค์ด๋ ๋จ (๋์ ๊ธฐ๋ณธ์ dark).
- **ํ๋ ์ ๊ฒฝ๋ก๋ ์๋๊ฒฝ๋ก** (`frames/frame_NNN_MMSS.jpg`) -- HTML์ด transcript.md ์์ ์ ์ฅ๋๋ฏ๋ก ๊ทธ๋๋ก ์๋.
- ์๋ณธ `transcript.md` ๊ฑด๋๋ฆฌ์ง ๋ง ๊ฒ. ์ ํ์ผ๋ง ๋ง๋ ๋ค.
- ์์ฝ·์์ญ ์์ค์ ์ ์ฒด ๋ฌธ์ฅ์ 15% ์ด๋ด. ์๋ฌธ ๋ด์ฉ ๋๋ฝ ๊ธ์ง (๊ด๊ณ /๊ตฌ๋
์์ฒญ ์์ํธ๋ก๋ ์งง๊ฒ ์ฒ๋ฆฌ ๊ฐ๋ฅ).
Auf GitHub ansehen