ASCII 비디오 제작 파이프라인
사용 시기
사용자가 다음을 요청할 때 사용합니다: ASCII 비디오, 텍스트 아트 비디오, 터미널 스타일 비디오, 문자 아트 애니메이션, 레트로 텍스트 시각화, ASCII 오디오 비주얼라이저, 비디오를 ASCII 아트로 변환, 매트릭스 스타일 효과, 또는 모든 애니메이션 ASCII 출력.
내용
ASCII 아트 비디오 제작 파이프라인 — 모든 형식을 지원합니다. 비디오/오디오/이미지/생성적 입력을 컬러 ASCII 문자 비디오 출력(MP4, GIF, 이미지 시퀀스)으로 변환합니다. 다음을 포함합니다: 비디오-ASCII 변환, 오디오 반응형 뮤직 비주얼라이저, 생성적 ASCII 아트 애니메이션, 하이브리드 비디오+오디오 반응형, 텍스트/가사 오버레이, 실시간 터미널 렌더링.
창의적 기준
이것은 시각 예술입니다. ASCII 문자는 매체이고, 영화는 표준입니다.
코드 한 줄을 작성하기 전에, 창의적 개념을 명확히 하십시오. 분위기는 무엇입니까? 어떤 시각적 이야기를 전달합니까? 이 프로젝트를 다른 모든 ASCII 비디오와 차별화하는 점은 무엇입니까? 사용자의 프롬프트는 출발점일 뿐입니다 — 문자 그대로의 번역이 아닌 창의적인 야망으로 해석하십시오.
첫 번째 렌더링의 우수성은 타협할 수 없습니다. 출력물은 수정 단계 없이도 시각적으로 인상적이어야 합니다. 만약 결과물이 평범하거나, 밋밋하거나, "AI가 생성한 ASCII 아트"처럼 보인다면 잘못된 것입니다 — 배송 전에 창의적 개념을 다시 생각하십시오.
참조 어휘를 넘어서십시오. 참조에 있는 효과 카탈로그, 셰이더 사전 설정, 팔레트 라이브러리는 시작 어휘입니다. 모든 프로젝트에 대해 새로운 패턴을 결합, 수정, 발명하십시오. 카탈로그는 물감 팔레트이고, 당신이 그림을 그립니다.
적극적으로 창의적이 되십시오. 프로젝트가 요구할 때 스킬의 어휘를 확장하십시오. 비전이 요구하는 것이 참조에 없다면 직접 구축하십시오. 사용자가 요구하지 않았지만 감사할 시각적 순간(전환, 효과, 색상 선택)을 하나 이상 포함시키십시오.
기술적 정확성보다 응집력 있는 미학. 비디오의 모든 장면은 통합된 시각적 언어(공유된 색온도, 관련된 문자 팔레트, 일관된 모션 어휘)로 연결되어야 합니다. 모든 장면이 무작위로 다른 효과를 사용하는 기술적으로 올바른 비디오는 미학적 실패입니다.
밀도 있고, 계층적이며, 고려된. 모든 프레임은 시청할 가치가 있어야 합니다. 절대 평평한 검은색 배경을 사용하지 마십시오. 항상 다중 그리드 구성을 사용하십시오. 항상 장면별 변형을 적용하십시오. 항상 의도적인 색상을 사용하십시오.
모드
| 모드 | 입력 | 출력 | 참조 |
|---|---|---|---|
| 비디오-ASCII | 비디오 파일 | 원본 영상의 ASCII 재현 | references/inputs.md § 비디오 샘플링 |
| 오디오 반응형 | 오디오 파일 | 오디오 특성에 의해 구동되는 생성적 시각 자료 | references/inputs.md § 오디오 분석 |
| 생성적 | 없음 (또는 시드 매개변수) | 절차적 ASCII 애니메이션 | references/effects.md |
| 하이브리드 | 비디오 + 오디오 | 오디오 반응형 오버레이가 있는 ASCII 비디오 | 두 입력 참조 |
| 가사/텍스트 | 오디오 + 텍스트/SRT | 시각 효과가 있는 시간 지정 텍스트 | references/inputs.md § 텍스트/가사 |
| TTS 내레이션 | 텍스트 인용문 + TTS API | 입력된 텍스트와 함께 내레이션된 증언/인용문 비디오 | references/inputs.md § TTS 통합 |
스택
프로젝트당 단일 자체 포함 Python 스크립트. GPU 필요 없음.
| 계층 | 도구 | 목적 |
|---|---|---|
| 핵심 | Python 3.10+, NumPy | 수학, 배열 연산, 벡터화된 효과 |
| 신호 | SciPy | FFT, 피크 감지 (오디오 모드) |
| 이미징 | Pillow (PIL) | 폰트 래스터화, 프레임 디코딩, 이미지 I/O |
| 비디오 I/O | ffmpeg (CLI) | 입력 디코딩, 출력 인코딩, 오디오 먹싱 |
| 병렬 처리 | concurrent.futures | 배치/클립 렌더링을 위한 N 워커 |
| TTS | ElevenLabs API (선택 사항) | 내레이션 클립 생성 |
| 선택 사항 | OpenCV | 비디오 프레임 샘플링, 에지 감지 |
파이프라인 아키텍처
모든 모드는 동일한 6단계 파이프라인을 따릅니다:
입력 → 분석 → 장면_함수 → 톤맵 → 셰이딩 → 인코딩
- 입력 — 원본 자료 로드/디코딩 (비디오 프레임, 오디오 샘플, 이미지 또는 없음)
- 분석 — 프레임별 특성 추출 (오디오 대역, 비디오 휘도/에지, 모션 벡터)
- 장면_함수 — 장면 함수가 픽셀 캔버스(
uint8 H,W,3)로 렌더링합니다._render_vf()+ 픽셀 블렌드 모드를 통해 여러 문자 그리드를 구성합니다.references/composition.md참조 - 톤맵 — 백분위수 기반 적응형 밝기 정규화.
references/composition.md§ 적응형 톤맵 참조 - 셰이딩 —
ShaderChain+FeedbackBuffer를 통한 후처리.references/shaders.md참조 - 인코딩 — 원시 RGB 프레임을 ffmpeg로 파이프하여 H.264/GIF 인코딩
창의적 방향
미학적 차원
| 차원 | 옵션 | 참조 |
|---|---|---|
| 문자 팔레트 | 밀도 램프, 블록 요소, 기호, 스크립트(가타카나, 그리스어, 룬 문자, 점자), 프로젝트별 | architecture.md § 팔레트 |
| 색상 전략 | HSV, OKLAB/OKLCH, 이산 RGB 팔레트, 자동 생성 하모니, 단색, 온도 | architecture.md § 색상 시스템 |
| 배경 텍스처 | 사인 필드, fBM 노이즈, 도메인 왜곡, 보로노이, 반응-확산, 세포 자동자, 비디오 | effects.md |
| 주요 효과 | 링, 나선, 터널, 소용돌이, 파동, 간섭, 오로라, 불, SDF, 스트레인지 어트랙터 | effects.md |
| 입자 | 불꽃, 눈, 비, 거품, 룬 문자, 궤도, 무리 짓는 boids, 흐름장 추종자, 자취 | effects.md § 입자 |
| 셰이더 무드 | 레트로 CRT, 세련된 모던, 글리치 아트, 시네마틱, 몽환적인, 산업적인, 사이키델릭 | shaders.md |
| 그리드 밀도 | xs(8px) ~ xxl(40px), 레이어별 혼합 | architecture.md § 그리드 시스템 |
| 좌표 공간 | 데카르트, 극좌표, 타일형, 회전형, 어안, 뫼비우스, 도메인 왜곡 | effects.md § 변환 |
| 피드백 | 줌 터널, 무지개 자취, 유령 같은 메아리, 회전 만다라, 색상 진화 | composition.md § 피드백 |
| 마스킹 | 원, 링, 그라데이션, 텍스트 스텐실, 애니메이션 아이리스/와이프/디졸브 | composition.md § 마스킹 |
| 전환 | 크로스페이드, 와이프, 디졸브, 글리치 컷, 아이리스, 마스크 기반 드러내기 | shaders.md § 전환 |
구간별 변형
전체 비디오에 동일한 구성을 절대 사용하지 마십시오. 각 섹션/장면에 대해:
- 다른 배경 효과 (또는 2-3개 구성)
- 다른 문자 팔레트 (분위기에 맞게)
- 다른 색상 전략 (또는 최소한 다른 색조)
- 셰이더 강도 변화 (피크 시 더 많은 블룸, 조용할 때 더 많은 그레인)
- 입자가 활성화된 경우 다른 입자 유형
프로젝트별 발명
모든 프로젝트에 대해 최소한 다음 중 하나를 발명하십시오:
- 테마에 맞는 사용자 정의 문자 팔레트
- 사용자 정의 배경 효과 (기존 빌딩 블록 결합/수정)
- 사용자 정의 색상 팔레트 (브랜드/무드에 맞는 이산 RGB 세트)
- 사용자 정의 입자 문자 세트
- 새로운 장면 전환 또는 시각적 순간
카탈로그에서 단순히 선택하지 마십시오. 카탈로그는 어휘입니다 — 당신이 시를 씁니다.
워크플로
1단계: 창의적 비전
코드 작성 전에 창의적 개념을 명확히 하십시오:
- 무드/분위기: 시청자가 무엇을 느껴야 합니까? 활기찬, 명상적인, 혼란스러운, 우아한, 불길한?
- 시각적 이야기: 지속 시간 동안 무슨 일이 일어납니까? 긴장 구축? 변형? 소멸?
- 색상 세계: 따뜻함/차가움? 단색? 네온? 흙빛? 지배적인 색조는 무엇입니까?
- 문자 텍스처: 조밀한 데이터? 드문드문 별? 유기적인 점? 기하학적 블록?
- 이 프로젝트를 차별화하는 점: 이 프로젝트를 독특하게 만드는 한 가지는 무엇입니까?
- 감정적 흐름: 장면이 어떻게 진행됩니까? 에너지로 시작, 클라이맥스로 구축, 해결?
사용자의 프롬프트를 미학적 선택에 매핑하십시오. "편안한 로파이 비주얼라이저"는 "글리치 사이버펑크 데이터 스트림"과 모든 것이 달라야 합니다.
2단계: 기술 설계
- 모드 — 위 6가지 모드 중 하나
- 해상도 — 가로 1920x1080 (기본값), 세로 1080x1920, 정사각형 1080x1080 @ 24fps
- 하드웨어 감지 — 코어/RAM 자동 감지, 품질 프로필 설정.
references/optimization.md참조 - 섹션 — 타임스탬프를 장면 함수에 매핑, 각각 고유한 효과/팔레트/색상/셰이더 구성 포함
- 출력 형식 — MP4 (기본값), GIF (640x360 @ 15fps), PNG 시퀀스
3단계: 스크립트 구축
단일 Python 파일. 구성 요소 (참조 포함):
- 하드웨어 감지 + 품질 프로필 —
references/optimization.md - 입력 로더 — 모드 의존적;
references/inputs.md - 특성 분석기 — 오디오 FFT, 비디오 휘도 또는 합성
- 그리드 + 렌더러 — 비트맵 캐시가 있는 다중 밀도 그리드;
references/architecture.md - 문자 팔레트 — 프로젝트당 여러 개;
references/architecture.md§ 팔레트 - 색상 시스템 — HSV + 이산 RGB + 하모니 생성;
references/architecture.md§ 색상 - 장면 함수 — 각각
canvas (uint8 H,W,3)반환;references/scenes.md - 톤맵 — 적응형 밝기 정규화;
references/composition.md - 셰이더 파이프라인 —
ShaderChain+FeedbackBuffer;references/shaders.md - 장면 테이블 + 디스패처 — 시간 → 장면 함수 + 구성;
references/scenes.md - 병렬 인코더 — ffmpeg 파이프를 사용한 N-워커 클립 렌더링
- 메인 — 전체 파이프라인 조정
4단계: 품질 검증
- 먼저 테스트 프레임: 전체 렌더링 전에 주요 타임스탬프에서 단일 프레임 렌더링
- 밝기 확인: 모든 ASCII 콘텐츠에 대해
canvas.mean() > 8. 어두우면 감마 낮추기 - 시각적 일관성: 모든 장면이 동일한 비디오에 속한다고 느껴집니까?
- 창의적 비전 확인: 출력이 1단계의 개념과 일치합니까? 평범해 보이면 다시 시작
중요한 구현 참고 사항
밝기 — 선형 곱셈기가 아닌 tonemap() 사용
이것이 #1 시각적 문제입니다. 검은색 배경의 ASCII는 본질적으로 어둡습니다. 절대 canvas * N 곱셈기를 사용하지 마십시오 — 하이라이트를 잘라냅니다. 적응형 톤맵을 사용하십시오:
def tonemap(canvas, gamma=0.75):
f = canvas.astype(np.float32)
lo, hi = np.percentile(f[::4, ::4], [1, 99.5])
if hi - lo < 10: hi = lo + 10
f = np.clip((f - lo) / (hi - lo), 0, 1) ** gamma
return (f * 255).astype(np.uint8)
파이프라인: scene_fn() → tonemap() → FeedbackBuffer → ShaderChain → ffmpeg
장면별 감마: 기본값 0.75, 솔라라이즈 0.55, 포스터라이즈 0.50, 밝은 장면 0.85. 어두운 레이어에는 overlay가 아닌 screen 블렌드를 사용하십시오.
폰트 셀 높이
macOS Pillow: textbbox()가 잘못된 높이를 반환합니다. font.getmetrics()를 사용하십시오: cell_height = ascent + descent. references/troubleshooting.md 참조.
ffmpeg 파이프 교착 상태
장기 실행 ffmpeg에서 절대 stderr=subprocess.PIPE를 사용하지 마십시오 — 버퍼가 64KB에서 채워져 교착 상태가 발생합니다. 파일로 리디렉션하십시오. references/troubleshooting.md 참조.
폰트 호환성
모든 유니코드 문자가 모든 폰트에서 렌더링되는 것은 아닙니다. 초기화 시 팔레트를 검증하십시오 — 각 문자를 렌더링하고 빈 출력이 있는지 확인하십시오. references/troubleshooting.md 참조.
클립별 아키텍처
세분화된 비디오(인용문, 장면, 챕터)의 경우 각각을 별도의 클립 파일로 렌더링하여 병렬 렌더링 및 선택적 재렌더링을 가능하게 하십시오. references/scenes.md 참조.
성능 목표
| 구성 요소 | 예산 |
|---|---|
| 특성 추출 | 1-5ms |
| 효과 함수 | 2-15ms |
| 문자 렌더링 | 80-150ms (병목) |
| 셰이더 파이프라인 | 5-25ms |
| 총합 | ~100-200ms/프레임 |
참조
| 파일 | 내용 |
|---|---|
references/architecture.md | 그리드 시스템, 해상도 사전 설정, 폰트 선택, 문자 팔레트 (20+), 색상 시스템 (HSV + OKLAB + 이산 RGB + 하모니 생성), _render_vf() 헬퍼, GridLayer 클래스 |
references/composition.md | 픽셀 블렌드 모드 (20가지 모드), blend_canvas(), 다중 그리드 구성, 적응형 tonemap(), FeedbackBuffer, PixelBlendStack, 마스킹/스텐실 시스템 |
references/effects.md | 효과 빌딩 블록: 값 필드 생성기, 색조 필드, 노이즈/fBM/도메인 왜곡, 보로노이, 반응-확산, 세포 자동자, SDF, 스트레인지 어트랙터, 입자 시스템, 좌표 변환, 시간적 일관성 |
references/shaders.md | ShaderChain, _apply_shader_step() 디스패치, 38가지 셰이더 카탈로그, 오디오 반응형 스케일링, 전환, 틴트 사전 설정, 출력 형식 인코딩, 터미널 렌더링 |
references/scenes.md | 장면 프로토콜, Renderer 클래스, SCENES 테이블, render_clip(), 비트 동기화 컷팅, 병렬 렌더링, 설계 패턴 (레이어 계층 구조, 방향적 아크, 시각적 은유, 구성 기술), 모든 복잡성 수준의 완전한 장면 예제, 장면 설계 체크리스트 |
references/inputs.md | 오디오 분석 (FFT, 대역, 비트), 비디오 샘플링, 이미지 변환, 텍스트/가사, TTS 통합 (ElevenLabs, 음성 할당, 오디오 믹싱) |
references/optimization.md | 하드웨어 감지, 품질 프로필, 벡터화된 패턴, 병렬 렌더링, 메모리 관리, 성능 예산 |
references/troubleshooting.md | NumPy 브로드캐스팅 함정, 블렌드 모드 함정, 멀티프로세싱/피클링, 밝기 진단, ffmpeg 문제, 폰트 문제, 일반적인 실수 |
창의적 발산 (사용자가 실험적/창의적/독특한 출력을 요청하는 경우에만 사용)
사용자가 창의적, 실험적, 놀라운 또는 비전통적인 출력을 요청하는 경우, 가장 잘 맞는 전략을 선택하고 코드를 생성하기 전에 해당 단계를 추론하십시오.
- 강제 연결 — 사용자가 교차 도메인 영감을 원할 때 ("유기적으로 보이게", "산업 미학")
- 개념적 혼합 — 사용자가 결합할 두 가지를 지목할 때 ("바다와 음악의 만남", "우주 + 서예")
- 우회 전략 — 사용자가 최대한 개방적일 때 ("놀라게 해줘", "내가 본 적 없는 것")
강제 연결
- 시각적 목표와 관련 없는 도메인을 선택하십시오 (기상 시스템, 미생물학, 건축, 유체 역학, 직물 직조)
- 그 핵심 시각적/구조적 요소를 나열하십시오 (침식 → 점진적 드러내기; 유사 분열 → 분할 복제; 직조 → 맞물림 패턴)
- 해당 요소를 ASCII 문자 및 애니메이션 패턴에 매핑하십시오
- 종합 — 문자 그리드에서 "침식" 또는 "결정화"는 어떻게 보일까요?
개념적 혼합
- 두 가지 별개의 시각적/개념적 영역을 지목하십시오
- 각 영역의 핵심 속성을 추출하십시오 (선, 움직임, 패턴, 질감)
- 어떤 속성이 자연스럽게 매핑되는지 식별하십시오
- 혼합된 결과를 구체화하십시오 (결과의 시각적 규칙을 정의하는 단일 문장으로)