Communitygithub.com

크메르 머니 익스플레이너

실제 금전 결정을 주제로 8~10분 분량의 수평형 크메르어 설명 영상을 제작합니다. 깔끔하고 따뜻한 스틱 피규어 스타일(고유 캐릭터, 금액 태그, 저금통, 차트, 차분한 내레이터, 출처 표시)로 Remotion과 KiriTTS를 활용합니다.

크메르 머니 익스플레이너란 무엇인가요?

이 스킬은 개발자와 AI 에이전트 사용자가 크메르어로 된 금융/비즈니스 설명 영상을 자동 생성할 수 있게 해주는 전문 도구입니다. '임대 vs 구매', '급여와 부채', '프랜차이즈 vs 자체 브랜드', '계 vs 은행'과 같이 캄보디아인이 실생활에서 마주치는 금전적 선택지(포크)를 다루며, 두 명의 평범한 인물이 같은 결정을 내렸을 때 누가 더 유리한 결과를 얻는지 계산해 보여줍니다. Remotion 기반의 파이프라인을 통해 스크립트 작성, 수치 계산(calc.py), 음성 합성(KiriTTS), 시각적 렌더링 및 QA까지 전 과정을 자동화하며, 모든 화면 수치는 `numbers.json`에서 가져와 투명성을 보장합니다. 이 스킬은 Claude Code, Cursor, Codex 등 AI 에이전트 환경에서 사용하도록 설계되었습니다. 사용자가 주제를 제시하지 않으면 3개의 후보를 제안하고, 연구와 산술을 거쳐 스크립트를 작성한 후 사용자의 승인을 받아 최종 렌더링까지 진행합니다. 특히 '가장 좋아 보이는 선택의 위험성'까지 양면적으로 제시하여 채널의 신뢰성을 높이는 것이 특징입니다.

지원 대상~Claude Code~Codex CLI~Cursor
npx skills add https://github.com/SopheaktraKP/khmer-money-explainer-skill/tree/HEAD

즐겨 사용하는 AI에게 물어보기

이 에이전트 스킬이 미리 로드된 새 채팅을 엽니다.

문서

크메르 머니 설명 영상

각 영상은 두 명의 평범한 사람이 동일한 금전 결정을 내리는 과정을 따라가며, 계산 과정을 소리 내어 보여주고 시청자가 스스로 결정을 내릴 수 있도록 합니다. 시청자는 숫자에 집중하고 채널을 신뢰하는데, 그 이유는 숫자가 정직하기 때문입니다.

작업 예시는 templates/project/ (src/story/) 디렉토리에 있는 계 vs 은행 영상입니다.

채널 보호 규칙

  • 독창적인 작업만 할 것. 스타일 리서치를 위해 다른 채널을 참고할 수는 있지만, 절대 그들의 스크립트, 캐릭터, 썸네일, 로고 또는 장면을 복사하지 말고 영상이나 설명에서 그 채널을 언급하지 마십시오. 우리의 출연진, 스토리 및 시각적 정체성(크라마를 착용한 가이드 포함)은 우리만의 것입니다.
  • 정직한 금융 정보. 화면에 가정 사항을 표시하십시오. 가장 좋아 보이는 선택의 위험성을 포함하여 양측 관점을 모두 제시하십시오. 개인적인 추천이 아닌, 스스로에게 물어볼 질문을 제공하십시오. 모든 설명은 금융 조언이 아님을 명시하고 캐릭터는 가상임을 밝히는 문구로 끝납니다.
  • 실제 인물은 배제할 것. 특정 개인이나 회사를 겨냥한 사기 혐의 제기는 이 포맷의 역할이 아닙니다. 보도된 사례의 패턴을 설명하고, 설명란에 링크를 추가하십시오.
  • 비용: 음성 제작에는 KiriTTS 크레딧이 사용됩니다. 1,100자 파일럿 영상이 433크레딧을 사용했으므로, 9분 영상은 약 3,000~3,500크레딧이 필요합니다. 음성 제작 전에 get_usage를 확인하고, 사용자에게 예상 비용을 알린 후 스크립트 승인을 먼저 받으십시오.

파이프라인

1. 주제

사용자가 주제를 제시하지 않으면, 각각 한 줄 설명과 함께 3개의 주제를 제안하십시오. 좋은 주제는 **캄보디아의 모든 사람이 인식하는 포크(fork)**이며, 출처를 확인할 수 있는 숫자가 있고, **뒤집힘(twist)**이 있어서 명백한 답이 틀리거나 불완전한 경우입니다. 제안하기 전에 최신 정보를 검색하십시오.

시작할 때 주제를 확정하고, 이미 알려진 정보에 대해서만 물어보십시오: 주제, 음성(기본값 Maly, 계정에 복제된 음성이 있을 수 있음, list_voices 참조), 채널 이름(story.tsx의 CHANNEL, 비워두면 배지 숨김).

2. 리서치 및 산술

  • 가능한 경우 캄보디아의 1차 출처를 사용하십시오: 캄보디아 중앙은행, 통계청, 은행 금리표, 법률 회사 세금 메모, 평판 좋은 언론. 게재 날짜를 명시하십시오: 금리와 세율은 변동됩니다.
  • 주제에 맞게 scripts/calc.py를 다시 작성하십시오. 화면과 나레이션의 모든 숫자는 이 파일에서 비롯되며 src/story/numbers.json에 기록됩니다. 정당성 검증 어설트를 추가하십시오. '승리자'가 패배하는 시나리오를 포함하여 여러 시나리오를 실행하십시오.
  • 출처가 있는 것과 가정된 것을 구분하고, 가정된 값은 화면에 <Note>로 표시하십시오. 사실을 출처로 확인할 수 없으면 명확한 가정으로 구성하거나 삭제하고 사용자에게 알리십시오.

3. 스크립트

810분 분량에 약 7,0009,000자의 크메르어 문자. 파일럿 음성은 초당 약 15자를 사용했습니다. 하나의 비트는 약 70자 정도의 한 두 문장이며, 9분 영상에는 대략 100~120개의 비트가 있습니다. 구조와 크메르어 작성 규칙은 references/script-formula.md를 참조하십시오.

스크립트를 src/story/script.json(씬에는 비트가 포함됨, 형식은 아래 참조)에 작성하고 출처와 가정 사항과 함께 전체 크메르어 스크립트를 사용자에게 보여주십시오. 음성 제작 전에 승인을 기다리십시오. 사용자는 크메르어 표현과 용어에 대한 권위자입니다.

4. 프로젝트 설정

templates/project/를 새 폴더에 복사하고 npm install을 실행한 후, src/story/script.json, src/story/story.tsx, scripts/calc.py를 교체하십시오. 재사용 가능한 무언가를 추가하지 않는 한 src/engine/은 건드리지 마십시오. 짧은 경로를 사용하십시오(Gotchas 참조).

5. 크레딧 소비 전 사전 검토

python scripts/calc.py
python scripts/build_timeline.py --placeholder
python scripts/check_numbers.py
npx tsc --noEmit
node scripts/stills.mjs out/look/x_ 100,400,900 0.5

프레임을 직접 확인하고 references/visual-style.md의 체크리스트와 대조하십시오. 음성이 적용된 후에는 각 줄을 시작 부분과 끝 부분 근처에서 두 번 확인하십시오. 끝 부분에서만 스틸을 찍으면 음성이 숫자에 도달하는 동안 비어 있는 카드가 숨겨질 수 있습니다. 씬을 하나씩 작성하고 각각 확인하십시오. 지금 레이아웃 문제를 수정하는 것이 훨씬 저렴합니다.

6. 음성

python scripts/tts_todo.py

이 명령은 새롭거나 변경된 비트만 나열합니다. 각 비트에 대해 비트의 tts 필드(또는 text)를 사용하고 일관된 음성 하나로 KiriTTS text_to_speech를 호출하고 전달 설정은 설정하지 않은 상태로 두십시오. URL을 다운로드하여 voice/<id>.mp3에 저장하고(링크는 약 하루 후 만료) python scripts/tts_todo.py --done <id> <speech_id>로 기록하십시오. 비트당 하나의 클립이므로 잘못된 단어 하나를 수정하는 데 한 문장만 다시 제작하면 됩니다.

단어 정확한 큐는 선택 사항입니다: get_word_timestamps 출력을 voice/<id>.words.json으로 저장한 다음 at('b03', 'word')를 사용하십시오. at('b03', .5)와 같은 분수만으로도 일반적으로 충분합니다. 숫자, 이름 및 외국어를 듣고 KiriTTS가 잘못 읽는 경우 해당 비트에 tts 철자를 추가하십시오.

7. 타임라인, 사운드, 렌더링

python scripts/build_timeline.py
python scripts/make_audio.py
npx remotion render src/index.ts Main out/video.mp4 --codec h264 --crf 18 --muted
ffmpeg -y -i out/video.mp4 -i out/mix.wav -map 0:v:0 -map 1:a:0 -c:v copy -c:a aac -b:a 192k -shortest out/final.mp4
python scripts/qa.py out/final.mp4 out/qa
npx remotion still src/index.ts Thumbnail out/thumb.png

긴 영상은 시간이 오래 걸리므로 백그라운드에서 렌더링을 실행하십시오. 새로운 스타일이나 음성인 경우 전체 영상 전에 첫 번째 장면의 짧은 파일럿을 렌더링하여 사용자 검토를 받으십시오.

8. QA

out/qa/report.md를 읽고 모든 접촉 시트를 확인하십시오. 검은색 또는 정지된 프레임과 -15 LUFS에서 크게 벗어난 음량을 조사하십시오. 모든 화면 속 수치가 numbers.json과 일치하는지, 크메르어 텍스트가 잘리거나 겹치지 않는지 확인하십시오.

9. 전달

mp4와 썸네일을 SendUserFile로 전송하십시오. 또한 크메르어로 out/description.md를 작성하십시오. 여기에는 후킹, 가정 사항과 위험성 및 스스로에게 물어볼 질문이 포함된 요약, 가상 캐릭터 및 금융 조언 아님 문구, 댓글 유도 질문, timeline.json의 실제 타임스탬프가 포함된 챕터, 출처 링크, 해시태그가 포함됩니다. 사용자가 요청하지 않는 한 절대 업로드하거나 게시하지 마십시오.

script.json 형식

{ "gap": 0.3, "scene_gap": 0.7, "tail": 1.5,
  "scenes": [{ "id": "Hook", "chapter": 0, "music": "light", "beats": [
    { "id": "h1", "text": "크메르어 문장", "tts": "선택적 발음 표기", "sfx": [{"at": 0.75, "type": "coin"}] }
  ]}]}
  • 씬의 id는 story.tsx의 SCENES에 있는 컴포넌트와 일치해야 합니다.
  • chapter는 CHAPTERS를 인덱싱합니다. 0은 후크이며 막대를 숨깁니다.
  • music: light, tense 또는 resolve.
  • sfx 유형: pop whoosh coin cash ding thud tick paper sad tada alarm. at은 비트의 분수입니다. 모든 줄이 아닌, 중요 정보가 공개되는 순간에 사용하십시오.

씬 작성

src/story/story.tsx를 읽으십시오. 이것이 씬 작성 방법의 참조입니다. 요약하면, const {f, at} = useScene()은 프레임과 비트 시간을 제공하며, 모든 요소는 <Show at={...} out={...} x y>를 통해 진입합니다. 시간은 초 단위로 측정되지 않으므로 음성을 다시 제작해도 씬이 깨지지 않습니다.

사용 가능한 부품:

  • engine/Figure: 얼굴, 포즈, 걷기 및 손에 든 소품. 스토리 상단에서 각 캐릭터를 한 번 정의하십시오.
  • engine/Props: Title, Label, Chip, Tag, Bubble, ThoughtCloud, Jar, Coin, Bill, MoneyBag, Calendar, Bank, House, Stall, Notebook, Phone, Rock, Umbrella, StormCloud, CheckMark, VsBadge, Arrow, FlyingMoney, Note, Moto, NameChip.
  • engine/Charts: Card, Counter, Bars, LineChart, MonthGrid 및 money().
  • engine/Stage: mood, tint, zoom, focus.

주제에 새로운 소품이 필요하면 스토리 파일에 동일한 잉크 스타일로 그리고 재사용 가능한 경우 engine/Props.tsx로 이동하십시오.

주의사항 (각각 실제로 발생한 문제입니다)

  • Windows 경로 제한. 프로젝트 경로가 너무 길어 node_modules 내부의 파일이 260자를 초과하면 Remotion이 실패합니다: 스틸에서 Failed to launch the browser process / spawn ... chrome-headless-shell 오류, 전체 렌더에서 getExecutableDir 오류. 다른 브라우저를 지정해도 두 번째 문제는 해결되지 않습니다. 프로젝트를 D:/videos/<name>과 같은 짧은 경로(약 100자 미만)에 유지하고 그곳에서 npm install을 실행하십시오.
  • 임시 공간. 각 번들은 임시 폴더에 복사되며 제거되지 않습니다. C: 드라이브 공간이 부족하면 stills.mjs의 경우 RENDER_TMP를, CLI의 경우 TEMP/TMP를 더 큰 드라이브로 설정하십시오.
  • <Show>의 기본값은 x=0, y=0이므로 중앙 제목이 반쯤 화면 밖으로 나갑니다. 중앙 요소는 항상 x={960}을 전달하십시오.
  • Koulen 글꼴의 숫자가 잘못 읽힙니다 ("12"가 "I2"처럼 보임). Title은 이미 본문 글꼴로 숫자와 기호를 설정합니다. 우회하지 마십시오.
  • 얼굴 위의 태그. 서 있는 인물의 머리는 약 y=470에 닿고, 손을 들면 더 높아집니다. 인물 위의 y≈300-350에 태그를 배치하십시오.
  • Remotion은 --muted와 함께 사용 가능한 오디오를 쓰지 않습니다. 따라서 항상 표시된 대로 나중에 mix.wav를 먹싱하십시오.
  • 많은 TSX를 포함한 Bash heredoc은 일부 Windows 셸에서 구문 분석에 실패할 수 있습니다. 파일 도구로 소스 파일을 작성하십시오.

관련 스킬