ascii-video

Converts video, audio, and text inputs into colored ASCII character videos encoded as MP4 or GIF.

Updated Jul 3, 2026
One-click install
npx skills add https://github.com/CHENHUI-X/toolbox --skill ascii-video-chenhui-x
Or copy as Structured Prompt for Agent
Please help me install this Agent Skill.
Skill: ascii-video
Source: https://github.com/CHENHUI-X/toolbox/tree/main/official-skills/creative/ascii-video
Command: npx skills add https://github.com/CHENHUI-X/toolbox --skill ascii-video-chenhui-x

SYSTEM DOCUMENTATION & REQUIREMENTS

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

What problem does it solve? Creating animated ASCII art videos requires building a full rendering pipeline from scratch: font rasterization, character grid composition, audio analysis, shader post-processing, and ffmpeg encoding. This Skill gives an agent the complete architecture and reference implementations to produce colored ASCII video from any source material without a GPU. ## Core Features & Use Cases - Six production modes: video-to-ASCII conversion, audio-reactive visualizers with FFT beat detection, generative procedural animation, hybrid video+audio, timed lyrics/text overlays, and TTS-narrated quote videos via ElevenLabs. - Deep effect vocabulary: 21 value field generators (fBM noise, voronoi, reaction-diffusion, strange attractors), 38 composable shaders, 24 character palettes, 20 blend modes, particle systems, and feedback buffers for temporal trails. - Production pipeline: multi-density grid composition, adaptive percentile-based tonemapping, parallel multi-worker ffmpeg encoding, and hardware-adaptive quality profiles from 540p drafts to 4K. - Use Case: Given a music track, generate a 3-minute audio-reactive ASCII visualizer where each section uses distinct effects, beat-triggered particles, and cycling color palettes, rendered at 1080p 24fps. ## Quick Start Ask the agent to create an audio-reactive ASCII music visualizer from your audio file, specifying the mood, resolution, and output format you want.

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?

Sample frames from the source video, map per-cell luminance to characters from a density-sorted palette, and sample original pixel colors for hue. Render each frame onto a pixel canvas with pre-rasterized font bitmaps, then pipe raw RGB frames to ffmpeg for H.264 encoding.

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

Extract per-frame audio features with SciPy: 6-band FFT, RMS energy, spectral centroid, and beat detection with exponential decay. Drive value field generators, particle triggers, and shader intensity from these features, then encode frames to MP4 with the audio muxed.

Does ASCII video rendering require a GPU?

No GPU is required. The pipeline runs on CPU with NumPy-vectorized effects and Pillow font rasterization, using concurrent.futures workers for parallel encoding. A 1080p 24fps frame renders in roughly 100-200ms, with quality profiles adapting to available cores and RAM.

Why does my ASCII video look too dark after rendering?

ASCII characters are small bright dots on black backgrounds, so linear brightness multipliers clip highlights while leaving frames dark. Use percentile-based adaptive tonemapping with gamma correction instead: default gamma 0.75, lower to 0.50-0.60 for solarize or posterize scenes.

Why does ffmpeg hang when encoding long ASCII videos?

Setting stderr=subprocess.PIPE on a long-running ffmpeg process deadlocks once the buffer fills at about 64KB. Redirect stderr to a log file instead, and pipe only raw RGB frames through stdin for the encode.

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

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