title: “Ascii Video — ASCII video: convert video/audio to colored ASCII MP4/GIF” sidebar_label: “Ascii Video” description: “ASCII video: convert video/audio to colored ASCII MP4/GIF”
{/* 本页面由 website/scripts/generate-skill-docs.py 根据技能对应的 SKILL.md 文件自动生成。请直接编辑源文件 SKILL.md,而非此页面。 */}
ASCII 视频
ASCII视频:将视频/音频转换为带颜色的ASCII格式MP4/GIF文件。
技能元数据
| 来源 | 内置(默认已安装) |
| 路径 | skills/creative/ascii-video |
| 支持平台 | linux、macos、windows |
参考:完整 SKILL.md 文件
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) | 字体光栅化、帧解码、图像读写 |
| 视频处理层 | ffmpeg(命令行工具) | 输入文件解码、输出文件编码、音频混合处理 |
| 并行处理层 | concurrent.futures | 支持多个工作线程,用于批量或片段渲染 |
| TTS处理层 | ElevenLabs API(可选) | 生成旁白视频片段 |
| 可选扩展层 | OpenCV | 视频帧采样、边缘检测 |
流程架构
所有模式都遵循相同的6阶段处理流程:
INPUT → ANALYZE → SCENE_FN → TONEMAP → SHADE → ENCODE
- INPUT — 加载/解码源素材(视频帧、音频样本、图像,或无数据)
- ANALYZE — 提取每帧的特征(音频频段、视频亮度/边缘信息、运动矢量)
- SCENE_FN — 场景函数会将结果渲染到像素画布上(格式为
uint8 H,W,3)。可通过_render_vf()函数结合像素混合模式来组合多个字符网格。详情请参阅references/composition.md - TONEMAP — 基于分位数的自适应亮度归一化处理。相关内容参见
references/composition.md中的“自适应色调映射”部分 - SHADE — 通过
ShaderChain与FeedbackBuffer实现后期处理。详情请参阅references/shaders.md - ENCODE — 将原始RGB帧传递给ffmpeg,进行H.264/GIF格式编码
创意方向
视觉风格维度
| 维度 | 可选选项 | 参考资料 |
|---|---|---|
| 字符调色板 | 密度渐变、块状元素、符号、文字字体(片假名、希腊字母、卢恩文、盲文)、项目专用风格 | architecture.md中的“调色板”部分 |
| 色彩策略 | HSV色彩模型、OKLAB/OKLCH色彩空间、离散RGB调色板、自动生成的和谐配色、单色风格、不同温度色调 | architecture.md中的“色彩系统”部分 |
| 背景纹理 | 正弦波纹理、fBM噪声、域变形效果、沃罗诺伊图、反应扩散算法、元胞自动机、视频素材 | effects.md |
| 主要视觉效果 | 环形图案、螺旋结构、隧道效果、漩涡效果、波浪效果、干涉现象、极光效果、火焰效果、SDF函数生成的图形、奇异吸引子图案 | effects.md |
| 粒子效果 | 火花、雪花、雨滴、气泡、卢恩文符号、轨道运动、群集行为粒子、流场跟随粒子、轨迹效果 | effects.md中的“粒子效果”部分 |
| 着色器风格 | 复古CRT风格、现代简洁风格、故障艺术风格、电影感风格、梦幻风格、工业风风格、迷幻风格 | shaders.md |
| 网格密度 | 从xs(8像素)到xxl(40像素),各层可设置不同密度 | architecture.md中的“网格系统”部分 |
| 坐标空间 | 笛卡尔坐标系、极坐标系、平铺坐标系、旋转坐标系、鱼眼坐标系、莫比乌斯坐标系、域变形坐标系 | effects.md中的“变换”部分 |
| 反馈效果 | 缩放隧道效果、彩虹轨迹、幽灵回声效果、旋转曼荼罗效果、色彩演变效果 | composition.md中的“反馈效果”部分 |
| 遮罩效果 | 圆形遮罩、环形遮罩、渐变遮罩、文本模板遮罩、动态的光圈/擦除/溶解效果 | composition.md中的“遮罩效果”部分 |
| 转场效果 | 淡入淡出、擦除效果、溶解效果、故障切割效果、光圈过渡效果、基于遮罩的渐显效果 | shaders.md中的“转场效果”部分 |
各片段的不同设计
切勿为整个视频使用完全相同的配置。针对每个片段/场景:
- 使用不同的背景效果(或组合2-3种效果)
- 选择与氛围相匹配的字符调色板
- 采用不同的色彩策略(或至少改变主色调)
- 调整着色器强度——在高潮部分增加光晕效果,在安静部分增加颗粒感
- 若使用粒子效果,则为每个片段选择不同的粒子类型
项目专属创意设计
针对每个项目,至少创造以下一项独特元素:
- 与主题相匹配的定制字符调色板
- 通过组合/修改现有元素打造的定制背景效果
- 与品牌风格或氛围相契合的定制色彩调色板
- 自定的粒子字符集
- 独特的场景转场或视觉亮点
不要仅仅从现有选项中挑选。那些选项只是词汇表——而你需要创作属于自己的作品。
工作流程
第一步:明确创意构思
在编写任何代码之前,先清晰阐述创意概念:
- 氛围感受:希望观众产生怎样的感受?充满活力、宁静沉思、混乱无序、优雅精致,还是阴森诡异?
- 视觉叙事:在整个视频时长内会发生什么?逐步营造紧张感?实现形态转变?还是逐渐消散?
- 色彩风格:偏向暖色调还是冷色调?单色风格?霓虹色调?大地色系?哪种色调占主导地位?
- 字符元素风格:密集的数据点?稀疏的星点?有机形状的点状元素?几何块状元素?
- 独特之处:这个项目最与众不同的地方是什么?
- 情感脉络:各个场景如何层层递进?以活力开场,逐步推向高潮,最后达成收尾?
将用户的提示词与上述视觉风格选项对应起来。例如,“轻松的低保真可视化效果”与“故障风格的赛博朋克数据流”在各个方面都需要完全不同的设计。
第二步:技术设计
- 模式选择 — 从上述6种模式中选定一种
- 分辨率设置 — 默认为横屏1920x1080,竖屏1080x1920,正方形1080x1080,帧率为24fps
- 硬件检测 — 自动检测CPU核心数和内存容量,确定合适的性能配置文件。详情请参阅
references/optimization.md - 片段划分 — 将时间戳与对应的场景函数关联起来,每个场景都有独立的特效/调色板/色彩/着色器配置
- 输出格式 — 默认为MP4格式,也可选择GIF格式(640x360,15fps),或PNG序列格式
第三步:编写脚本
整个脚本为一个Python文件。各组成部分及其参考资料如下:
- 硬件检测与性能配置 —
references/optimization.md - 输入数据加载模块 — 具体实现方式取决于所选模式;参考
references/inputs.md - 特征分析模块 — 通过音频FFT分析、视频亮度分析或合成数据等方式提取特征
- 网格与渲染模块 — 支持多密度网格,并配备位图缓存功能;参考
references/architecture.md - 字符调色板模块 — 每个项目可拥有多个调色板;参考
architecture.md中的“调色板”部分 - 色彩系统模块 — 结合HSV色彩模型、离散RGB颜色以及自动配色算法;参考
architecture.md中的“色彩”部分 - 场景函数模块 — 每个函数都会返回一个格式为
canvas (uint8 H,W,3)的渲染结果;参考references/scenes.md - 色调映射模块 — 负责自适应亮度归一化处理;参考
references/composition.md - 着色器管线模块 — 由
ShaderChain和FeedbackBuffer共同构成;参考references/shaders.md - 场景表与调度模块 — 根据时间戳匹配对应的场景函数及配置信息;参考
references/scenes.md - 并行编码模块 — 使用多个工作线程,通过ffmpeg管道实现片段渲染
- 主控制模块 — 负责协调整个处理流程的运行
第四步:质量检查
- 先测试单帧效果:在完整渲染之前,先在关键时间点渲染单帧图像进行测试
- 亮度检查:所有ASCII内容对应的
canvas.mean()值应大于8。如果画面过暗,则需要降低伽马值 - 视觉一致性检查:所有场景是否看起来都属于同一个视频作品?
- 创意构思核对:最终输出是否与第一步确定的创意概念一致?如果效果显得过于普通,就需要重新调整
关键实现注意事项
亮度处理 — 请使用tonemap()函数,而非线性乘法
这是最容易出现的视觉问题。黑色背景上的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。对于暗色图层,请使用 screen 混合模式(而非 overlay)。
字体单元高度
在 macOS 环境下的 Pillow 库中,textbbox() 函数返回的高度值不正确。应使用 font.getmetrics() 方法:cell_height = ascent + descent。详情请参阅 references/troubleshooting.md。
ffmpeg 流处理死锁问题
在运行时间较长的 ffmpeg 进程中,切勿使用 stderr=subprocess.PIPE —— 因为缓冲区在达到 64KB 时就会导致死锁。应将其输出重定向到文件中。更多信息请参见 references/troubleshooting.md。
字体兼容性
并非所有 Unicode 字符都能在所有字体中正常显示。应在初始化阶段验证字体调色板——逐一渲染每个字符,检查是否有空白输出。详情请参阅 references/troubleshooting.md。
单个片段的处理架构
对于分段视频(如引言、场景、章节),应将其分别作为独立的片段文件进行处理,从而实现并行渲染和有选择性的重新渲染。详情请参阅 references/scenes.md。
性能目标
| 组件 | 时间预算 |
|---|---|
| 特征提取 | 1-5毫秒 |
| 效果函数处理 | 2-15毫秒 |
| 字符渲染 | 80-150毫秒(性能瓶颈) |
| 着色器管线 | 5-25毫秒 |
| 总计 | 约 100-200毫秒/帧 |
参考文档
| 文件 | 内容简介 |
|---|---|
references/architecture.md | 网格系统、分辨率预设、字体选择、20多种字符调色板、颜色系统(HSV + OKLAB + 离散RGB + 和声生成)、_render_vf()辅助函数、GridLayer类 |
references/composition.md | 像素混合模式(20种)、blend_canvas()函数、多网格组合、自适应tonemap()函数、FeedbackBuffer、PixelBlendStack、遮罩/模板系统 |
references/effects.md | 效果构建模块:数值场生成器、色调场、噪声/fBM/域变形、Voronoi图、反应-扩散模型、元胞自动机、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字符和动画模式
- 进行综合创作——在字符网格中,“侵蚀”或“结晶”会呈现为何种形态?
概念融合法
- 指定两个截然不同的视觉/概念空间(例如海浪与乐谱)
- 建立对应关系(波峰=高音符,波谷=休止符,泡沫=断奏)
- 有选择地进行融合——保留最有趣的对应关系,舍弃强行搭配的部分
- 挖掘仅在融合状态下才出现的独特属性
间接策略法
- 列出若干指导原则:“将错误视为隐含的意图”/“运用旧有的创意”/“你的密友会怎么做?”/“突出缺陷”/“将画面倒置”/“只取部分而非整体”/“反向操作”
- 根据当前的ASCII动画任务来解读这些指导原则
- 在编写代码之前,先将这些间接思路应用到视觉设计中 |