Community코딩 & 개발github.com

Salt-555/SaltySkills

Hermes-Agent용 재미있는 스킬을 게시하는 공간입니다. 원하는 것을 가져가되, 대화에서 언급된다면 저를 칭찬해주세요.

SaltySkills란 무엇인가요?

이 스킬은 '시네마틱 비트(Cinematic Beats)' 비디오 스타일을 구현하기 위한 완전한 파이프라인을 제공합니다. TTS(텍스트 음성 변환)는 비트당 한 문장으로 제한되며, 시각 자료는 자연스러운 런타임으로 재생되어 잘리거나 속도가 조정되지 않습니다. 비트 스크립트 작성, VHS 필터가 적용된 이미지 생성, p5js/manim/ASCII 애니메이션, TTS 오디오 생성, 드라이/웨트 비트크러시 필터 적용, 그리고 하드 컷으로 비트를 합성하는 전 과정을 안내합니다. 사용자는 각 생산 단계 후에 에셋을 검토하고 승인할 수 있으며, 모든 결정과 수정 사항은 프로젝트 문서에 기록됩니다. 이 스킬은 Claude Code, Cursor, Codex, Hermes-Agent와 같은 에이전트 플랫폼에서 사용할 수 있도록 설계되었습니다.

지원 대상~Claude Code✓Codex CLI~Cursor
npx skills add Salt-555/SaltySkills

Installed? Explore more 코딩 & 개발 skills: steipete/bluebubbles, steipete/eightctl, steipete/blucli · View all 6 →

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

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

문서

시네마틱 비트 비디오 스타일

핵심 철학

시각이 타이밍을 주도합니다. 오디오는 따라옵니다. 애니메이션과 ASCII 장면은 자연스러운 런타임으로 실행됩니다 — 오디오 길이에 맞추기 위해 잘리거나, 빨라지거나, 마지막 프레임에서 정지되지 않습니다. 비트 사이의 침묵은 의도적인 디자인이며, 채워야 할 빈 공간이 아닙니다.

  • TTS: 클립당 한 문장. 최대 신호 대 잡음비. 불필요한 나레이션 없음.
  • 시각 자료: 전체 자연 런타임. 애니메이션이 숨 쉴 여유를 주십시오.
  • 컷: 하드 컷만 사용. 크로스페이드 없음.
  • 음악: 사용자가 제공한 트랙에 음성 구간 중 자동 덕킹 적용.
  • 확인: 각 제작 단계 후, 다음 단계로 진행하기 전에 에셋을 사용자에게 전달하여 검토를 받으십시오.

프로젝트 구조

~/videos/[project-name]/
  project.md          # 살아있는 문서 — 스토리보드, 결정 사항, 수정 노트
  beats/              # 개별 비트 에셋
    beat-01/
      visual.mp4      # 생성된 시각 자료 (모션이 있는 이미지 또는 애니메이션)
      audio.mp3       # 이 비트의 TTS 클립 (MP3만 — 중요 규칙 참조)
      note.txt        # 이 비트가 보여주는 내용에 대한 한 줄 설명
    beat-02/
      ...
  music/              # 사용자가 제공한 배경 음악 트랙
  output/             # 중간 및 최종 렌더링

1단계: 비트 스크립트

비트 분석과 함께 project.md를 생성하십시오. 각 비트 = 하나의 시각 자료 + 한 문장의 TTS.

비트 작성

TTS 규칙:

  • 비트당 한 문장. 예외 없음.
  • 최대 신호 대 잡음비 — 모든 단어는 그 자리를 정당화해야 합니다.
  • 생각을 표현하는 데 두 문장이 필요하다면, 두 개의 비트로 만드십시오.
  • 목표: 클립당 5-15단어. 짧을수록 좋습니다.
  • 도입부 불필요한 말 없음("그래서...", "이제 살펴보겠습니다..."). 요점부터 시작하십시오.

시각 자료 규칙:

  • 시각 자료가 무엇을 보여주는지 설명하십시오 — 얼마나 오래 지속되는지가 아닙니다.
  • 시각 자료 런타임은 자연스러운 완료 시간에 의해 결정되며, TTS 길이에 의해 결정되지 않습니다.
  • 이미지 컷: Ken Burns 모션(느린 줌/팬)이 적용된 정적 이미지. 런타임: 최소 4-6초.
  • 애니메이션 컷(p5js/manim/ascii): 전체 애니메이션이 재생됩니다. 8초, 12초, 15초 등 필요한 만큼 걸립니다.
  • 비트 지속 시간 = max(시각_지속시간, 오디오_지속시간) + 일시 정지.

project.md의 비트 템플릿:

# [프로젝트 이름]

## 컨셉
[한 문단 — 이 비디오가 무엇에 관한 것인지, 추구하는 분위기]

## 음악
- 트랙: [사용자가 제공할 음악 파일명 또는 설명]
- 분위기: [설명]

## 비트

### 비트 01
**시각:** [유형: image | p5js | manim | ascii] — [프롬프트/설명]
**TTS:** "한방에 전달하는 한 문장."
**상태:** [ ] 시각 [ ] 오디오 [ ] 승인됨

### 비트 02
...

## 노트
[결정 사항, 수정 사항, 사용자 피드백에 대한 실행 기록]

컷 유형

유형도구런타임가장 적합한 용도
imageimage_generate + Ken Burns4-6초사진, 장면, 초상화, 확립 샷
p5jsp5js 스킬자연 (8-15초)생성 예술, 입자, 데이터 시각화, 플로우 필드
manimmanim-video 스킬자연 (8-20초)수학 애니메이션, 다이어그램, 기술 설명
asciiascii-video 스킬자연 (6-12초)터미널 미학, 레트로 컴퓨팅, 해킹 주제
captionffmpeg drawtext4-8초어두운 배경에 중앙 정렬된 TTS 텍스트 — 단어에 초점 집중

중요: p5js/manim/ascii 비트를 생성하기 전에 먼저 skill_view(name)으로 스킬을 로드하십시오. 이 스킬들에는 정확히 따라야 하는 브랜드 팔레트, 글꼴 규칙, 구현 패턴이 포함되어 있습니다.

2단계: 스크립트 승인 관문

중단. project.md를 사용자에게 제시하십시오. 명시적으로 승인될 때까지 에셋을 생성하지 마십시오.

승인 타임스탬프로 project.md 노트 섹션을 업데이트하십시오.

3단계: 시각 자료 생성

유형별로 모든 시각 에셋을 생성하십시오. beats/beat-XX/visual.mp4로 저장하십시오.

이미지 비트 (VHS 필터 적용 Ken Burns)

  1. image_generate를 통해 이미지 생성
  2. 이미지에 VHS 필터 적용 (그레인, 스캔라인, 비네트, 색수차):
python3 scripts/vhs-filter.py \
  --input beat-XX-image.png \
  --output beat-XX-vhs.png \
  --seed 42 \
  --intensity 1.0

요구 사항: pip install numpy Pillow (배열 효과를 위한 numpy, 이미지 입출력을 위한 Pillow).

강도 레벨: 0.7 (미묘 — 그레인 + 비네트만), 1.0 (표준 — 모든 효과), 1.5 (강함 — 강한 색수차, 눈에 띄는 스캔라인). 기본값은 1.0입니다.

  1. VHS 필터링된 이미지에 Ken Burns 모션을 적용하여 MP4 생성:
ffmpeg -loop 1 -i beat-XX-vhs.png -t 5 \
  -vf "zoompan=z='min(zoom+0.001,1.3)':x='iw/2-(iw/zoom/2)':y='ih/2-(ih/zoom/2)':d=125:s=1920x1080:fps=25" \
  -c:v libx264 -pix_fmt yuv420p -r 25 beats/beat-XX/visual.mp4

왜 VHS를 먼저 적용하고 Ken Burns를 나중에 적용합니까? zoompan 필터는 그레인과 스캔라인을 흐리게 할 수 있습니다. 정적 이미지에 먼저 VHS를 적용한 다음, 그 위에 모션을 추가하십시오. VHS 필터링된 이미지 위의 Ken Burns 움직임은 오래된 영상을 약간 열화된 CRT로 보는 것 같은 생생한 아날로그 느낌을 만듭니다.

애니메이션 비트 (p5js/manim/ascii)

먼저 관련 스킬을 로드한 다음 생성하십시오. 출력을 beats/beat-XX/visual.mp4로 저장하십시오.

해상도: 모든 시각 자료는 1920x1080, 25fps여야 합니다. manim 출력 크기 조정:

ffmpeg -y -i raw-manim.mp4 \
  -vf "scale=1920:1080:flags=lanczos,setsar=1:1,fps=25" \
  -c:v libx264 -pix_fmt yuv420p -r 25 beats/beat-XX/visual.mp4

image_generate 호출은 6개 그룹으로 일괄 처리하십시오. 플래그가 지정되면 중립적으로 바꾸어 한 번 재시도하십시오.

VHS 필터 참조

VHS 필터(scripts/vhs-filter.py)는 단일 이미지에 다음 효과를 적용합니다:

효과기능시각적 결과
색수차R/B 채널 오프셋 (0-2px)가장자리에 색상 번짐, 정렬이 잘못된 CRT처럼
아날로그 노이즈채널당 ±8 그레인 (강도 기반)그림자와 중간톤의 필름 같은 질감
스캔라인4번째 행마다 96%로 어둡게CRT 인광체 그리드 오버레이
CRT 비네트가장자리 어둡게 하기 (강도에 따라 15-35%)둥근 화면 모서리, 구형 TV처럼

이미지의 경우: 모든 효과가 단일 무작위 시드로 한 번 적용됩니다. 색수차와 노이즈는 눈에 띕니다. 지터/트래킹 라인은 단일 프레임이므로 미묘합니다.

참고: 이 필터는 이미지 전용입니다 — 비디오 입력을 처리하지 않습니다. 모션을 얻으려면 먼저 정적 프레임에 필터를 적용한 다음 Ken Burns/zoompan을 위에 추가하십시오.

3.5단계: 시각 자료 확인 관문

중단. 각 시각 클립을 사용자에게 검토를 위해 보내십시오.

MEDIA: 경로와 함께 스크린샷 또는 MP4를 포함하십시오. 번호를 매겨 제시하십시오:

비트 01: [MEDIA 경로] — [간단한 설명]
비트 02: [MEDIA 경로] — [간단한 설명]
...

"오디오로 진행하기 전에 수정할 사항이 있습니까?"라고 물으십시오.

사용자가 시각 자료를 승인할 때까지 TTS를 생성하지 마십시오. project.md 노트에 피드백을 기록하십시오.

변경이 요청되면 영향을 받은 비트만 다시 생성하고 재확인하십시오.

4단계: TTS 오디오 생성

모든 TTS 클립을 생성하십시오 — 비트당 하나씩. text_to_speech 도구를 output_path와 함께 .mp3로 사용하십시오. beats/beat-XX/audio.mp3로 저장하십시오.

중요: 오디오에는 항상 MP3 형식을 사용하십시오. OGG는 Telegram 전송 및 ffmpeg concat 작업에서 코덱 호환성 문제가 있습니다. TTS 제공자를 OpenAI로 설정하고 MP3 출력을 사용하십시오.

규칙:

  • 호출당 한 문장. 연결하지 마십시오.
  • 생성 후 ffprobe로 각 클립 지속 시간을 측정하십시오.
  • project.md의 각 비트 옆에 지속 시간을 기록하십시오.
ffprobe -v error -show_entries format=duration -of csv=p=0 beats/beat-XX/audio.mp3

4.5단계: 오디오 확인 관문

중단. 오디오 클립을 사용자에게 제시하십시오.

음성 필터 적용 (필수)

모든 TTS 클립에 드라이/웨트 비트크러시 체인을 적용하십시오 — 이것이 우리의 시그니처 음성입니다. 전체 기술 및 함정에 대해서는 references/dry-wet-bitcrush.md를 참조하십시오.

두 가지 접근 방식 사용 가능:

A) 정적 믹스 (간단, 일관됨):

# 1단계: wav 중간 파일을 통해 크러시된 버전 생성 (지속 시간 유지)
ffmpeg -y -i beats/beat-XX/audio.mp3 \
  -af "aresample=resampler=soxr:osr=2000,aformat=sample_fmts=u8,aresample=resampler=soxr,lowpass=f=2500" \
  temp-crushed.wav

# 2단계: 압축 접착제로 드라이 + 웨트 믹스
ffmpeg -y -i beats/beat-XX/audio.mp3 -i temp-crushed.wav \
  -filter_complex "[0:a]volume=0.7[dry];[1:a]volume=0.3[wet];[dry][wet]amix=inputs=2:duration=first:normalize=0,acompressor=threshold=0.05:ratio=4:attack=10:release=100[out]" \
  -map "[out]" beats/beat-XX/audio-filtered.mp3

rm temp-crushed.wav

B) 다이나믹 믹스 (신호 열화 효과 — 선호됨): 올바른 피치로 정통 비트크러시를 위한 제로차수 홀드 업샘플링과 함께 Python 스크립트(scripts/vibey-mix.py)를 사용합니다.

요구 사항: pip install numpy pydub (배열 처리를 위한 numpy, MP3 읽기/쓰기를 위한 pydub).

고정 매개변수 (dec5-bit8 변형):

  • 데시메이션: 5× (5번째 샘플마다 버린 후 제로차수 홀드로 반복)
  • 양자화: 8비트 (고정)
  • 드라이/웨트 기준: 80% 드라이 / 20% 웨트
  • 딥 패턴: 약 1.2초마다 드라이가 약 35%로 떨어지고 웨트가 약 65%로 상승 (지속 시간 약 0.25초)
  • 웨트에만 트레몰로: 4Hz 삼각파, 깊이 70% (웨트가 30-100% 사이에서 맥동)
  • 슬랩백 딜레이: 80ms, -18dB (약 0.12 볼륨), 최종 믹스에 적용
python3 scripts/vibey-mix.py beats/beat-XX/audio.mp3
cp beats/beat-XX/audio-dynamic.mp3 beats/beat-XX/audio-filtered.mp3

체인 분석: 깨끗한 드라이 신호와 극단적인 디지털 아티팩트(5× 데시메이션, 제로차수 홀드 업샘플링을 통한 8비트 양자화)를 레이어링하고, 주기적인 딥으로 웨트 레벨을 높여 "열화되는 전송" 효과를 내며, 웨트 신호에 트레몰로를 적용하여 리드미컬한 맥동을 주고, 슬랩백 딜레이로 공간감을 더합니다. 필요한 경우에만 개별 매개변수를 조정하고 체인 구조는 그대로 유지하십시오.

이후 모든 단계에서 audio-filtered.mp3를 사용하십시오. 참조용으로 원본 audio.mp3를 보관하십시오.

project.md 노트에 결정 사항을 기록하십시오.

5단계: 비트 구성

각 비트에 대해 시각 자료와 오디오를 하드 컷(전환 없음)으로 병합하십시오. 비트 지속 시간은 시각 자료와 오디오 중 더 긴 쪽에 의해 결정됩니다.

시각 >= 오디오인 경우:

오디오가 전체 시각 자료 아래에서 재생됩니다. 패딩이 필요 없습니다.

ffmpeg -i beats/beat-XX/visual.mp4 -i beats/beat-XX/audio-filtered.mp3 \
  -c:v libx264 -pix_fmt yuv420p -c:a aac \
  -shortest -r 25 output/beat-XX-composed.mp4

오디오 > 시각인 경우:

시각 자료는 남은 시간을 채우기 위해 마지막 프레임을 유지합니다. 비디오에 tpad를 사용하십시오:

AUDIO_DUR=$(ffprobe -v error -show_entries format=duration -of csv=p=0 beats/beat-XX/audio-filtered.mp3)
ffmpeg -i beats/beat-XX/visual.mp4 -i beats/beat-XX/audio-filtered.mp3 \
  -vf "tpad=stop_mode=clone:stop_duration=$AUDIO_DUR" \
  -c:v libx264 -pix_fmt yuv420p -c:a aac \
  -t $AUDIO_DUR -r 25 output/beat-XX-composed.mp4

오디오 필터가 적용되지 않은 경우 audio-filtered.mp3 대신 audio.mp3를 사용하십시오.

비트 간 일시 정지

비트 사이에 숨 쉴 공간을 위해 짧은 검은색 프레임을 추가하십시오:

ffmpeg -f lavfi -i color=c=black:s=1920x1080:d=0.15:r=25 \
  -c:v libx264 -pix_fmt yuv420p output/pause-XX.mp4

ASCII 캡션 비트 (단어 집중)

내레이션 자체가 초점일 때 — 시각 자료가 아닌 — TTS 텍스트를 화면 중앙에 표시하는 ASCII 스타일 비트를 사용하십시오. project.md에서 이러한 비트를 [caption] 유형으로 표시하십시오:

비트 템플릿:

### 비트 03 [caption]
**시각:** ascii caption — 중앙 텍스트, 어두운 배경, 미묘한 터미널 미학
**TTS:** "화면에 표시되는 정확한 단어들."
**상태:** [ ] 시각 [ ] 오디오 [ ] 승인됨

ffmpeg drawtext를 검은색/어두운 배경에 고정폭 글꼴과 ALLMIND 골드(#C5A55A) 텍스트로 생성하십시오:

TEXT="여기에 TTS 문장을 입력하세요"
ffmpeg -f lavfi -i color=c=black:s=1920x1080:d=6:r=25 \
  -vf "drawtext=text='${TEXT}':fontsize=42:fontcolor='#C5A55A':fontfile=/usr/share/fonts/truetype/dejavu/DejaVuSansMono.ttf:x=(w-text_w)/2:y=(h-text_h)/2" \
  -c:v libx264 -pix_fmt yuv420p -r 25 output/beat-XX-composed.mp4

참고: 캡션 비트는 일반 텍스트를 표시하지만, 필요할 경우 시각적 강조를 위해 ASCII 테두리 상자로 장식할 수 있습니다. 추가 장식이 있는 경우 project.md의 시각적 설명에 이를 명시하십시오.

최종 비트 타임라인 (참조용)

단계설명담당자게이트
1비트 스크립트 + project.md에이전트사용자 승인
2이미지/애니메이션 생성에이전트시각 확인
3TTS + 비트크러시에이전트오디오 확인
4비트 구성에이전트—
5마스터 합성 + 내보내기에이전트최종 승인

관련 스킬