Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help


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 文件

:::info 以下是Hermes在触发该技能时加载的完整技能定义。当技能处于激活状态时,智能体看到的指令即为内容。
::

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数学运算、数组操作、向量化特效处理
信号处理层SciPyFFT变换、峰值检测(用于音频相关模式)
图像处理层Pillow (PIL)字体光栅化、帧解码、图像读写
视频处理层ffmpeg(命令行工具)输入文件解码、输出文件编码、音频混合处理
并行处理层concurrent.futures支持多个工作线程,用于批量或片段渲染
TTS处理层ElevenLabs API(可选)生成旁白视频片段
可选扩展层OpenCV视频帧采样、边缘检测

流程架构

所有模式都遵循相同的6阶段处理流程:

INPUT → ANALYZE → SCENE_FN → TONEMAP → SHADE → ENCODE
  1. INPUT — 加载/解码源素材(视频帧、音频样本、图像,或无数据)
  2. ANALYZE — 提取每帧的特征(音频频段、视频亮度/边缘信息、运动矢量)
  3. SCENE_FN — 场景函数会将结果渲染到像素画布上(格式为uint8 H,W,3)。可通过_render_vf()函数结合像素混合模式来组合多个字符网格。详情请参阅references/composition.md
  4. TONEMAP — 基于分位数的自适应亮度归一化处理。相关内容参见references/composition.md中的“自适应色调映射”部分
  5. SHADE — 通过ShaderChainFeedbackBuffer实现后期处理。详情请参阅references/shaders.md
  6. 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文件。各组成部分及其参考资料如下:

  1. 硬件检测与性能配置references/optimization.md
  2. 输入数据加载模块 — 具体实现方式取决于所选模式;参考references/inputs.md
  3. 特征分析模块 — 通过音频FFT分析、视频亮度分析或合成数据等方式提取特征
  4. 网格与渲染模块 — 支持多密度网格,并配备位图缓存功能;参考references/architecture.md
  5. 字符调色板模块 — 每个项目可拥有多个调色板;参考architecture.md中的“调色板”部分
  6. 色彩系统模块 — 结合HSV色彩模型、离散RGB颜色以及自动配色算法;参考architecture.md中的“色彩”部分
  7. 场景函数模块 — 每个函数都会返回一个格式为canvas (uint8 H,W,3)的渲染结果;参考references/scenes.md
  8. 色调映射模块 — 负责自适应亮度归一化处理;参考references/composition.md
  9. 着色器管线模块 — 由ShaderChainFeedbackBuffer共同构成;参考references/shaders.md
  10. 场景表与调度模块 — 根据时间戳匹配对应的场景函数及配置信息;参考references/scenes.md
  11. 并行编码模块 — 使用多个工作线程,通过ffmpeg管道实现片段渲染
  12. 主控制模块 — 负责协调整个处理流程的运行

第四步:质量检查

  • 先测试单帧效果:在完整渲染之前,先在关键时间点渲染单帧图像进行测试
  • 亮度检查:所有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()函数、FeedbackBufferPixelBlendStack、遮罩/模板系统
references/effects.md效果构建模块:数值场生成器、色调场、噪声/fBM/域变形、Voronoi图、反应-扩散模型、元胞自动机、SDF函数、奇异吸引子、粒子系统、坐标变换、时间连贯性处理
references/shaders.mdShaderChain_apply_shader_step()调度机制、38种着色器目录、音频响应式缩放、过渡效果、色调预设、输出格式编码、终端渲染功能
references/scenes.md场景协议、Renderer类、SCENES表、render_clip()函数、节拍同步剪辑、并行渲染、设计模式(层级结构、方向性弧线、视觉隐喻、构图技巧)、各复杂度级别的完整场景示例、场景设计检查清单
references/inputs.md音频分析(FFT、频段、节拍检测)、视频采样、图像转换、文本/歌词处理、TTS集成(ElevenLabs、语音分配、音频混音)
references/optimization.md硬件检测、质量配置文件、向量化模式、并行渲染、内存管理、性能预算设定
references/troubleshooting.mdNumPy广播机制的常见陷阱、混合模式的问题、多进程处理与序列化问题、亮度诊断、ffmpeg相关问题、字体问题、常见错误

创意发散(仅当用户要求实验性/创意性/独特输出时使用)

如果用户希望获得具有创意、实验性、惊喜感或非传统风格的输出,应在生成代码之前选择最合适的策略,并详细规划其实施步骤。

  • 强制关联法 —— 当用户需要跨领域的灵感时(例如“让画面看起来更自然”、“工业风风格”)
  • 概念融合法 —— 当用户指定两种元素进行结合时(例如“海洋与音乐的融合”、“太空与书法的结合”)
  • 间接策略法 —— 当用户完全开放接受新想法时(例如“给我一个惊喜”、“我从未见过的东西”)

强制关联法

  1. 选择一个与视觉目标无关的领域(如天气系统、微生物学、建筑学、流体动力学、纺织编织)
  2. 列出该领域的核心视觉/结构元素(如侵蚀作用→逐渐显现;有丝分裂→分裂复制;编织工艺→交错图案)
  3. 将这些元素映射为ASCII字符和动画模式
  4. 进行综合创作——在字符网格中,“侵蚀”或“结晶”会呈现为何种形态?

概念融合法

  1. 指定两个截然不同的视觉/概念空间(例如海浪与乐谱)
  2. 建立对应关系(波峰=高音符,波谷=休止符,泡沫=断奏)
  3. 有选择地进行融合——保留最有趣的对应关系,舍弃强行搭配的部分
  4. 挖掘仅在融合状态下才出现的独特属性

间接策略法

  1. 列出若干指导原则:“将错误视为隐含的意图”/“运用旧有的创意”/“你的密友会怎么做?”/“突出缺陷”/“将画面倒置”/“只取部分而非整体”/“反向操作”
  2. 根据当前的ASCII动画任务来解读这些指导原则
  3. 在编写代码之前,先将这些间接思路应用到视觉设计中 |