ascii-video

Generate colored ASCII character videos from video, audio, images, or generative math using Python and ffmpeg.

Updated Jul 10, 2026
One-click install
npx skills add https://github.com/timchap/dot-hermes --skill ascii-video-timchap
Or copy as Structured Prompt for Agent▼
Please help me install this Agent Skill.
Skill: ascii-video
Source: https://github.com/timchap/dot-hermes/tree/main/skills/creative/ascii-video
Command: npx skills add https://github.com/timchap/dot-hermes --skill ascii-video-timchap

SYSTEM DOCUMENTATION & REQUIREMENTS

💡 This Skill requires numpy, pillow, scipy, ffmpeg, opencv, elevenlabs, and includes references (resource) components.

What problem does it solve? Creating animated ASCII art videos requires coordinating font rasterization, grid rendering, audio analysis, shader post-processing, and video encoding — a complex pipeline that is difficult to build from scratch. This Skill gives an agent the complete production pipeline to turn video, audio, images, text, or pure math into colored ASCII character MP4/GIF output without a GPU. ## Core Features & Use Cases - Six input modes: video-to-ASCII conversion, audio-reactive visualizers (FFT bands, beat detection), generative procedural animation, hybrid video+audio, timed lyrics/text overlays, and TTS-narrated quote videos via ElevenLabs. - Full effect vocabulary: 21 value field generators (fBM noise, voronoi, reaction-diffusion, strange attractors, SDFs), 24 character palettes, 38 composable shaders, 20 blend modes, particle systems, feedback buffers, and masking. - Production pipeline: 6-stage flow (INPUT → ANALYZE → SCENE_FN → TONEMAP → SHADE → ENCODE) with adaptive tonemapping, multi-density grids, hardware-adaptive quality profiles, and parallel ffmpeg encoding. - Use Case: Ask for an audio-reactive music visualizer and the agent writes a single Python script that analyzes the track's frequency bands and beats, renders multi-grid ASCII scenes with per-section palettes and shaders, and encodes a 1080p 24fps MP4 with muxed audio. ## Quick Start Create an audio-reactive ASCII visualizer from my song.mp3 at 1080p with beat-triggered glitch effects and export it as an MP4.

Frequently Asked Questions about ascii-video

High-intent search queries and answers about installing and using this skill.

FAQPage Schema
How do I convert a video to ASCII art animation in Python?▼

Decode the source video with ffmpeg, sample per-frame luminance and edges, then map brightness values to characters from a density-sorted palette on a fixed grid. Composite pre-rasterized font bitmaps onto a pixel canvas and pipe raw RGB frames back to ffmpeg for H.264 encoding.

How do I make an audio-reactive ASCII visualizer?▼

Analyze the audio with SciPy FFT to extract 6 frequency bands, RMS energy, spectral centroid, and beat detection per frame. Drive value field generators, hue fields, and beat-triggered shaders like glitch bands and chromatic aberration from those features, then encode to MP4 with the audio muxed.

Does ASCII video rendering require a GPU?▼

No GPU is required. Rendering runs on CPU with NumPy-vectorized effect math and parallel workers via concurrent.futures, typically at 100-200ms per frame at 1080p. Hardware detection auto-adjusts resolution and worker count based on available cores and RAM.

Why does my ASCII video look too dark?▼

ASCII characters are small bright dots on black backgrounds, so linear brightness multipliers clip highlights and leave frames dark. Use adaptive percentile-based tonemapping with gamma correction (default gamma 0.75) instead, and verify canvas mean brightness stays above 8.

Why does ffmpeg hang when piping rendered frames?▼

Long-running ffmpeg encodes deadlock when stderr is piped because the buffer fills at about 64KB. Redirect stderr to a log file instead of subprocess.PIPE, and keep stdin as the raw RGB frame pipe.

What are the limitations of Unicode character palettes in ASCII video?▼

Not all Unicode characters render in every monospace font, and Pillow's textbbox returns wrong heights on macOS. Validate palettes at initialization by rendering each character and dropping blank glyphs, and use font.getmetrics() ascent plus descent for cell height.