fix(desktop-skills): Fix YAML frontmatter for Claude Desktop compatibility

- Remove 'version' field from 13 SKILL.md files
- Quote descriptions containing colons (Triggers:) in 9 files
- Fix 20-gtm-audit binary file (extract proper SKILL.md from ZIP)
- Add missing 'description:' key in 41-jamie-brand-audit
- Add new skill 44-jamie-youtube-subtitle-checker with both desktop/ and code/ versions

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
2025-12-23 18:19:17 +09:00
parent 7d672110ce
commit 4d9da597ca
25 changed files with 1585 additions and 28 deletions

View File

@@ -0,0 +1,244 @@
# Jamie YouTube Subtitle Editor
SBV 자막 파일 오타 교정 및 YouTube 메타데이터 생성 도구.
## Quick Commands
```bash
# SBV 파일 오타 교정
python scripts/sbv_corrector.py --input "subtitle.sbv" --output "subtitle_corrected.sbv"
# 챕터 추출
python scripts/chapter_extractor.py --input "subtitle.sbv"
# 전체 워크플로우 (교정 + 챕터 + 메타데이터)
python scripts/process_subtitle.py --input "subtitle.sbv" --output-dir "./output"
```
## Workflow
```
[Input: SBV 자막 파일]
[1. SBV 파싱 및 텍스트 추출]
[2. 오타 자동 교정 (typo_dictionary.json)]
[3. 의학 용어 표준화]
[4. 챕터 타임스탬프 추출]
[5. YouTube 메타데이터 생성]
[Output: 교정된 SBV + youtube_video_info.md]
```
## SBV Format
```
H:MM:SS.sss,H:MM:SS.sss
자막 텍스트
0:00:05.120,0:00:08.450
안녕하세요 제이미성형외과입니다
```
## Core Functions
### SBV 파싱
```python
import re
def parse_sbv(content: str) -> list[dict]:
"""Parse SBV content into list of subtitle blocks."""
blocks = content.strip().split('\n\n')
subtitles = []
for block in blocks:
lines = block.strip().split('\n')
if len(lines) >= 2:
timestamp = lines[0]
text = '\n'.join(lines[1:])
# Extract start time
match = re.match(r'(\d+:\d+:\d+\.\d+),', timestamp)
start_time = match.group(1) if match else "0:00:00.000"
subtitles.append({
'timestamp': timestamp,
'start': start_time,
'text': text
})
return subtitles
```
### 오타 교정
```python
import json
def load_typo_dict(path: str = "references/typo_dictionary.json") -> dict:
"""Load typo correction dictionary."""
with open(path, 'r', encoding='utf-8') as f:
return json.load(f)
def correct_text(text: str, typo_dict: dict) -> tuple[str, list]:
"""Apply typo corrections and return corrected text with change log."""
corrected = text
changes = []
for wrong, right in typo_dict.items():
if wrong in corrected:
changes.append({'original': wrong, 'corrected': right})
corrected = corrected.replace(wrong, right)
return corrected, changes
```
### 챕터 추출
```python
CHAPTER_KEYWORDS = {
"intro": ["안녕하세요", "제이미성형외과", "정기호"],
"problem": ["고민", "걱정", "불편", "문제"],
"explanation": ["이란", "무엇", "어떤", "방법"],
"procedure": ["수술", "시술", "과정", "진행"],
"benefits": ["장점", "효과", "결과", "좋은"],
"recovery": ["회복", "관리", "주의", "후에"],
"closing": ["상담", "문의", "감사", "추천"]
}
def extract_chapters(subtitles: list[dict]) -> list[dict]:
"""Extract chapter timestamps from subtitles."""
chapters = []
seen_types = set()
for sub in subtitles:
for chapter_type, keywords in CHAPTER_KEYWORDS.items():
if chapter_type not in seen_types:
if any(kw in sub['text'] for kw in keywords):
# Convert to M:SS format
start = sub['start']
parts = start.split(':')
if len(parts) == 3:
h, m, s = parts
total_min = int(h) * 60 + int(m)
sec = int(float(s))
formatted = f"{total_min}:{sec:02d}"
else:
formatted = start
chapters.append({
'time': formatted,
'type': chapter_type
})
seen_types.add(chapter_type)
break
return chapters
```
### SBV 재구성
```python
def rebuild_sbv(subtitles: list[dict]) -> str:
"""Rebuild SBV content from subtitle blocks."""
blocks = []
for sub in subtitles:
blocks.append(sub['timestamp'])
blocks.append(sub['text'])
blocks.append('')
return '\n'.join(blocks)
```
### 메타데이터 생성
```python
def generate_metadata(chapters: list, changes: list, procedure_name: str = "") -> str:
"""Generate YouTube metadata markdown."""
chapter_text = '\n'.join([f"{c['time']} {c['type']}" for c in chapters])
changes_table = "| 위치 | 원본 | 수정 |\n|------|------|------|\n"
for c in changes[:10]: # Top 10 changes
changes_table += f"| - | {c['original']} | {c['corrected']} |\n"
return f"""# YouTube 영상 정보
## 추천 제목
{procedure_name} | 제이미성형외과 정기호 원장
## 챕터 (Chapters)
{chapter_text}
## 영상 설명 (Description)
⏱️ 타임스탬프
{chapter_text}
🏥 제이미성형외과
📍 서울시 강남구 압구정로 136 EHL빌딩 3층
📞 02-542-2399
🌐 https://jamie.clinic
#제이미성형외과 #{procedure_name} #압구정성형외과
## 오타 수정 내역
{changes_table}
"""
```
## 오타 사전 (typo_dictionary.json)
주요 교정 패턴:
| 카테고리 | 오타 | 정정 |
|----------|------|------|
| 브랜드 | 데이미, 재이미 | 제이미 |
| 브랜드 | 성액과, 성현외과 | 성형외과 |
| 시술 | 쌍거풀, 쌍커풀 | 쌍꺼풀 |
| 시술 | 매물법, 메몰법 | 매몰법 |
| 시술 | 이마거상 | 이마거상술 |
| 의학 | 절계, 절게 | 절개 |
| 의학 | 수면 마취 | 수면마취 |
## 공식 시술명
### 눈 성형
- 퀵 매몰법
- 하이브리드 쌍꺼풀
- 안검하수 눈매교정술
- 눈밑지방 재배치
- 듀얼 트임 수술
### 이마 성형
- 내시경 이마 거상술
- 내시경 눈썹 거상술
### 동안 성형
- 스마스 리프팅
- 자가 지방이식
- 하이푸 리프팅
## Output Files
| 파일 | 설명 |
|------|------|
| `{filename}_corrected.sbv` | 교정된 SBV 자막 |
| `youtube_video_info.md` | YouTube 메타데이터 |
| `correction_report.md` | 오타 수정 내역 |
## Quality Checklist
- [ ] 브랜드명 "제이미성형외과" 정확히 표기
- [ ] 시술명 공식 명칭으로 통일
- [ ] 챕터 0:00 인트로 포함
- [ ] 해시태그 3-5개 포함
## Reference Files
- `references/typo_dictionary.json` - 오타 교정 사전
- `references/chapter_patterns.md` - 챕터 추출 패턴
- `references/youtube_metadata.md` - 메타데이터 템플릿

View File

@@ -0,0 +1,246 @@
# 챕터 추출 패턴 가이드
> 정기호 원장 영상의 구조적 특징을 기반으로 챕터 타임스탬프를 추출합니다.
---
## 영상 유형별 구조
### Type A: 시술 소개 영상 (3-10분)
```
0:00 인트로 (인사)
└─ "안녕하세요. 제이미성형외과 정기호 원장입니다"
0:15~ 문제 제기 / 공감
└─ "~로 고민하시는 분들", "~때문에 걱정"
0:30~ 시술 소개
└─ "[시술명]이란", "어떤 방법", "특징"
1:00~ 수술 과정 / 방법
└─ "수술은", "진행", "과정", "방법"
2:00~ 장점 / 효과
└─ "장점", "효과", "결과", "좋은 점"
3:00~ 회복 / 주의사항
└─ "회복 기간", "주의", "관리", "~후에"
마지막 20초 마무리 / CTA
└─ "상담", "문의", "감사합니다"
```
### Type B: 짧은 설명 영상 (1-3분)
```
0:00 인트로
0:10~ 핵심 설명
0:40~ 장점/특징
1:20~ 마무리
```
### Type C: Q&A / FAQ 영상
```
0:00 인트로 + 질문 소개
0:15~ 답변 1
0:45~ 답변 2 (있는 경우)
1:15~ 정리 / 마무리
```
---
## 챕터 감지 키워드
### Primary Keywords (높은 우선순위)
| 챕터 유형 | 키워드 |
|----------|--------|
| **인트로** | "안녕하세요", "제이미성형외과", "정기호 원장" |
| **시술 소개** | "[시술명]이란", "무엇인가요", "어떤 수술" |
| **수술 과정** | "수술 과정", "진행", "방법은", "어떻게" |
| **장점** | "장점", "좋은 점", "효과", "결과" |
| **회복** | "회복 기간", "회복은", "관리", "주의사항" |
| **마무리** | "상담", "문의", "감사합니다", "추천드립니다" |
### Secondary Keywords (보조)
| 챕터 유형 | 키워드 |
|----------|--------|
| **문제 제기** | "고민", "걱정", "불편", "힘든" |
| **비교** | "차이", "비교", "vs", "다른 점" |
| **대상** | "적합한 분", "추천", "이런 분" |
| **비용/시간** | "시간", "기간", "비용" |
---
## 챕터 추출 알고리즘
### Step 1: 텍스트에서 키워드 탐지
```python
def detect_chapter_candidates(subtitles, keywords):
candidates = []
for i, sub in enumerate(subtitles):
text = sub['text']
start_time = parse_start_time(sub['timestamp'])
for chapter_type, kw_list in keywords.items():
for kw in kw_list:
if kw in text:
candidates.append({
'time': start_time,
'type': chapter_type,
'keyword': kw,
'context': text
})
break
return candidates
```
### Step 2: 중복 제거 및 정리
```python
def deduplicate_chapters(candidates, min_gap_seconds=15):
"""
같은 유형의 챕터가 15초 이내에 있으면 첫 번째만 유지
"""
result = []
last_by_type = {}
for c in sorted(candidates, key=lambda x: x['time']):
ctype = c['type']
if ctype in last_by_type:
if c['time'] - last_by_type[ctype] < min_gap_seconds:
continue
result.append(c)
last_by_type[ctype] = c['time']
return result
```
### Step 3: 챕터 제목 생성
```python
chapter_titles = {
'intro': '인트로',
'problem': '이런 고민 있으신가요?',
'explanation': '{procedure_name}이란?',
'procedure': '수술 과정',
'benefits': '장점 및 효과',
'recovery': '회복 및 관리',
'closing': '마무리'
}
```
---
## 시간 형식 변환
### SBV → YouTube 챕터 형식
```python
def sbv_to_chapter_time(sbv_time):
"""
"0:01:23.450""1:23"
"0:00:45.120""0:45"
"""
parts = sbv_time.split(':')
if len(parts) == 3:
h, m, s = parts
s = s.split('.')[0] # 밀리초 제거
h, m, s = int(h), int(m), int(s)
if h > 0:
return f"{h}:{m:02d}:{s:02d}"
else:
return f"{m}:{s:02d}"
return sbv_time
```
---
## 챕터 출력 형식
### YouTube 설명란용 형식
```
0:00 인트로
0:17 하이브리드 쌍꺼풀이란?
0:33 수술 과정
0:50 장점 및 특징
1:10 회복 기간
1:25 마무리
```
### 상세 형식 (내부 문서용)
```markdown
| 시간 | 챕터 | 감지 키워드 | 컨텍스트 |
|------|------|------------|----------|
| 0:00 | 인트로 | "안녕하세요" | 인사말 |
| 0:17 | 시술 소개 | "이란" | "하이브리드 쌍꺼풀이란..." |
```
---
## 시술별 챕터 템플릿
### 눈 성형 영상
```
0:00 인트로
0:XX [시술명]이란?
0:XX 수술 방법
0:XX 장점 (자연스러움, 빠른 회복 등)
0:XX 회복 기간 및 주의사항
0:XX 마무리
```
### 이마/리프팅 영상
```
0:00 인트로
0:XX 노화의 원인
0:XX [시술명] 소개
0:XX 수술 과정
0:XX 효과 및 유지 기간
0:XX 회복 및 관리
0:XX 마무리
```
### Q&A 영상
```
0:00 인트로 및 질문 소개
0:XX Q1. [질문1]
0:XX Q2. [질문2]
0:XX Q3. [질문3]
0:XX 마무리
```
---
## Edge Cases
### 1. 챕터가 너무 적을 때
영상 길이 대비 챕터가 2개 이하면:
- 영상을 3등분하여 강제 챕터 생성
- "전반부", "중반부", "후반부" 사용
### 2. 인트로가 감지되지 않을 때
- 0:00에 "인트로" 강제 추가
- 첫 번째 자막 내용으로 제목 생성
### 3. 짧은 영상 (1분 미만)
- 챕터 최소 2개만 생성
- 0:00 인트로 + 마지막 구간
---
*Version 1.0.0 | 2025-12-23*

View File

@@ -0,0 +1,126 @@
{
"metadata": {
"version": "1.0.0",
"updated": "2025-12-23",
"description": "제이미성형외과 YouTube 자막 오타 교정 사전"
},
"brand_typos": {
"데이미": "제이미",
"재이미": "제이미",
"제의미": "제이미",
"제이이미": "제이미",
"성액과": "성형외과",
"성형과": "성형외과",
"성현외과": "성형외과",
"성형외가": "성형외과",
"제이미성과": "제이미 성형외과",
"제이미 성과": "제이미 성형외과",
"제이미성형와과": "제이미성형외과"
},
"procedure_typos": {
"eye_surgery": {
"쌍거풀": "쌍꺼풀",
"쌍거플": "쌍꺼풀",
"쌍커풀": "쌍꺼풀",
"쌍커플": "쌍꺼풀",
"쌍꺼플": "쌍꺼풀",
"쌍거 풀": "쌍꺼풀",
"매물법": "매몰법",
"매몰밥": "매몰법",
"메몰법": "매몰법",
"매물밥": "매몰법",
"눈메교정": "눈매교정",
"눈매 교정": "눈매교정",
"안겁하수": "안검하수",
"안검 하수": "안검하수",
"눈밑 지방": "눈밑지방",
"지방재배치": "지방 재배치",
"듀얼트임": "듀얼 트임",
"듀얼트 임": "듀얼 트임",
"눈섭밑": "눈썹밑",
"눈썹 밑": "눈썹밑"
},
"forehead_surgery": {
"이마 거상": "이마거상",
"이마거상 술": "이마거상술",
"눈섭거상": "눈썹거상",
"눈썹 거상": "눈썹거상",
"내시경이마": "내시경 이마",
"내시경눈썹": "내시경 눈썹"
},
"anti_aging": {
"스마 스": "스마스",
"SMAS": "스마스",
"smas": "스마스",
"앞광대리프팅": "앞광대 리프팅",
"앞 광대": "앞광대",
"하이프": "하이푸",
"하이 푸": "하이푸",
"지방이식": "지방 이식",
"자가지방": "자가 지방",
"실리프팅": "실 리프팅"
},
"others": {
"쁘띠성형": "쁘띠 성형",
"흉터성형": "흉터 성형",
"재수술": "재수술"
}
},
"medical_terms": {
"요분의": "여분의",
"수면 마취": "수면마취",
"국소 마취": "국소마취",
"절계": "절개",
"절게": "절개",
"봉헙": "봉합",
"봉 합": "봉합",
"회복기간": "회복 기간",
"부기": "붓기",
"멍이": "멍",
"통증이": "통증",
"마취가": "마취",
"수술이": "수술",
"시술이": "시술"
},
"common_speech_recognition_errors": {
"정 기호": "정기호",
"정기 호": "정기호",
"기호 원장": "정기호 원장",
"하이브 리드": "하이브리드",
"하이 브리드": "하이브리드",
"리프 팅": "리프팅",
"내시 경": "내시경"
},
"spacing_fixes": {
"제이미 성형외과": "제이미성형외과",
"정기호원장": "정기호 원장",
"수술후": "수술 후",
"수술전": "수술 전",
"시술후": "시술 후",
"시술전": "시술 전"
},
"official_procedure_names": [
"퀵 매몰법",
"하이브리드 쌍꺼풀",
"안검하수 눈매교정술",
"눈밑지방 재배치",
"듀얼 트임 수술",
"눈썹밑 피부절개술",
"눈 재수술",
"내시경 이마 거상술",
"내시경 눈썹 거상술",
"앞광대 리프팅",
"스마스 리프팅",
"자가 지방이식",
"실 리프팅",
"하이푸 리프팅",
"쁘띠 성형",
"흉터 성형"
]
}

View File

@@ -0,0 +1,172 @@
# YouTube 영상 정보 템플릿
> 이 템플릿을 기반으로 YouTube 메타데이터를 생성합니다.
---
## 추천 제목
### 제목 공식
```
[시술명] | [핵심 베네핏/키워드] | 제이미성형외과
```
### 제목 예시
- `하이브리드 쌍꺼풀 | 자연스러운 눈매의 비결 | 제이미성형외과`
- `내시경 이마거상술 | 동안 효과의 원리 | 제이미성형외과`
- `퀵 매몰법 | 티 안 나는 쌍꺼풀 | 제이미성형외과`
### 제목 작성 규칙
- 60자 이내 (한글 기준 30자 내외)
- 시술명을 앞부분에 배치
- 브랜드명 "제이미성형외과" 포함
- 과장 표현 금지
---
## 챕터 (Chapters)
### 기본 형식
```
0:00 인트로
0:XX [섹션1]
0:XX [섹션2]
0:XX [섹션3]
0:XX 마무리
```
### 작성 규칙
- 반드시 0:00으로 시작
- 최소 3개 챕터 권장
- 시간 형식: M:SS (예: 1:23)
- 챕터명은 간결하게 (10자 이내)
---
## 영상 설명 (Description)
### 템플릿
```
[시술명]에 대해 알아보세요.
제이미성형외과 정기호 원장이 설명합니다.
⏱️ 타임스탬프
{챕터_목록}
📋 영상 내용
{영상_요약_2-3문장}
🏥 제이미성형외과
📍 서울시 강남구 압구정로 136 EHL빌딩 3층
📞 02-542-2399
🌐 https://jamie.clinic
💬 카카오톡: @제이미성형외과
{해시태그}
---
※ 본 영상은 정보 제공 목적이며, 개인에 따라 결과가 다를 수 있습니다.
수술 전 반드시 전문의와 상담하시기 바랍니다.
```
---
## 해시태그 (Hashtags)
### 필수 태그
- `#제이미성형외과`
- `#압구정성형외과`
### 시술별 태그
| 시술 카테고리 | 권장 해시태그 |
|--------------|--------------|
| 눈 성형 | `#쌍꺼풀` `#눈성형` `#눈매교정` `#매몰법` |
| 이마 성형 | `#이마거상술` `#이마성형` `#눈썹거상` `#내시경수술` |
| 동안 성형 | `#동안성형` `#리프팅` `#안티에이징` `#스마스리프팅` |
| 지방이식 | `#지방이식` `#자가지방` `#볼륨성형` |
### 해시태그 규칙
- 3-5개 권장 (최대 15개)
- 시술 관련 태그 우선
- 지역 태그 포함 (`#압구정`, `#강남성형외과`)
---
## 태그 (Tags) - YouTube Studio용
### 브랜드 태그
```
제이미성형외과, Jamie Plastic Surgery, 압구정성형외과, 강남성형외과
```
### 시술 태그 (예시: 눈 성형)
```
쌍꺼풀, 쌍꺼풀수술, 눈성형, 눈매교정, 매몰법, 절개법,
하이브리드쌍꺼풀, 안검하수, 눈밑지방, 눈재수술
```
### 일반 태그
```
성형외과, 성형수술, 미용성형, 정기호원장, 성형정보
```
---
## 썸네일 가이드
### 필수 요소
- 정기호 원장 얼굴 또는 시술 관련 이미지
- 시술명 텍스트 (큰 글씨)
- 브랜드 로고 (우측 하단)
### 색상
- 배경: 밝은 톤 또는 브랜드 그린 (#79A233)
- 텍스트: 고대비 (검정 또는 흰색)
### 텍스트 예시
```
하이브리드
쌍꺼풀
```
---
## 오타 수정 내역 리포트
### 형식
```markdown
## 오타 수정 내역
**총 수정 건수**: X건
| # | 위치 (시간) | 원본 | 수정 |
|---|------------|------|------|
| 1 | 0:05 | 성액과 | 성형외과 |
| 2 | 0:12 | 쌍거풀 | 쌍꺼풀 |
| 3 | 0:28 | 매물법 | 매몰법 |
```
### 카테고리별 집계
```markdown
### 수정 유형별 집계
- 브랜드명 오타: X건
- 시술명 오타: X건
- 의학 용어 오타: X건
- 띄어쓰기: X건
```
---
## 출력 파일 구조
```
outputs/
├── {영상명}_corrected.sbv # 교정된 자막
└── youtube_video_info.md # 메타데이터 패키지
```
---
*Version 1.0.0 | 2025-12-23*