跳到主要内容

ASCII 视频

将视频/音频转换为彩色 ASCII MP4/GIF。

技能元数据

来源内置 (默认安装)
路径skills/creative/ascii-video
平台linux, macos, windows
信息

以下是当该技能被触发时,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 § 文本/歌词
语音合成旁白文本引用 + 语音合成API带有打字文本的叙述性证言/引用视频references/inputs.md § 语音合成集成

技术栈

每个项目一个独立的Python脚本。无需GPU。

层级工具用途
核心Python 3.10+、NumPy数学、数组操作、向量化效果
信号SciPyFFT、峰值检测(音频模式)
成像Pillow (PIL)字体栅格化、帧解码、图像输入输出
视频输入输出ffmpeg(CLI)解码输入、编码输出、混合音频
并行concurrent.futuresN个工作者用于批量/片段渲染
语音合成ElevenLabs API(可选)生成叙述片段
可选OpenCV视频帧采样、边缘检测

流程架构

每种模式都遵循相同的6阶段流程:

输入 → 分析 → 场景函数 → 色调映射 → 着色 → 编码
  1. 输入 — 加载/解码源材料(视频帧、音频样本、图像或无)
  2. 分析 — 提取每帧特征(音频频带、视频亮度/边缘、运动矢量)
  3. 场景函数 — 场景函数渲染到像素画布(uint8 H,W,3)。通过 _render_vf() + 像素混合模式组合多个字符网格。参见 references/composition.md
  4. 色调映射 — 基于百分位数的自适应亮度归一化。参见 references/composition.md § 自适应色调映射
  5. 着色 — 通过 ShaderChain + FeedbackBuffer 进行后处理。参见 references/shaders.md
  6. 编码 — 将原始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(8px) 到 xxl(40px),每层可混合architecture.md § 网格系统
坐标空间笛卡尔、极坐标、平铺、旋转、鱼眼、莫比乌斯、域扭曲effects.md § 变换
反馈缩放隧道、彩虹轨迹、幽灵回声、旋转曼陀罗、颜色演化composition.md § 反馈
遮罩圆形、环形、渐变、文本模板、动画虹膜/擦除/溶解composition.md § 遮罩
过渡交叉淡化、擦除、溶解、故障剪切、虹膜、基于遮罩的揭示shaders.md § 过渡

分节变化

绝不要对整个视频使用相同的配置。对于每个部分/场景:

  • 不同的背景效果(或组合2-3种)
  • 不同的字符集(匹配情绪)
  • 不同的颜色策略(或至少不同的色相)
  • 变化着色器强度(高潮时更多泛光,安静时更多噪点)
  • 不同的粒子类型(如果粒子激活)

项目特定创新

对于每个项目,至少发明以下之一:

  • 一个匹配主题的自定义字符集
  • 一个自定义背景效果(组合/修改现有构建块)
  • 一个自定义颜色调色板(匹配品牌/情绪的离散RGB集)
  • 一个自定义粒子字符集
  • 一个新颖的场景过渡或视觉时刻

不要只是从目录中选择。目录是词汇——而你在创作诗歌。

工作流程

第1步:创意构想

在编写任何代码之前,阐明创作概念:

  • 情绪/氛围:观众应该感受到什么?活力、冥想、混乱、优雅、不祥?
  • 视觉故事:在持续时间内发生了什么?构建张力?转变?消散?
  • 色彩世界:暖/冷?单色?霓虹?土色?主色调是什么?
  • 字符纹理:密集数据?稀疏星星?有机点?几何块?
  • 是什么让这个不同:是什么让这个项目独一无二?
  • 情感弧线:场景如何进展?以活力开始,构建到高潮,解决?

将用户的提示映射到美学选择。"轻松的低保真可视化器"需要与"故障赛博朋克数据流"完全不同的东西。

第2步:技术设计

  • 模式 — 以上6种模式中的哪一种
  • 分辨率 — 景观1920x1080(默认)、肖像1080x1920、方形1080x1080 @ 24fps
  • 硬件检测 — 自动检测核心/内存,设置质量配置文件。参见 references/optimization.md
  • 分节 — 将时间戳映射到场景函数,每个都有自己的效果/调色板/颜色/着色器配置
  • 输出格式 — MP4(默认)、GIF(640x360 @ 15fps)、PNG序列

第3步:构建脚本

单个Python文件。组件(带参考):

  1. 硬件检测 + 质量配置文件references/optimization.md
  2. 输入加载器 — 模式相关;references/inputs.md
  3. 特征分析器 — 音频FFT、视频亮度或合成
  4. 网格 + 渲染器 — 带位图缓存的多密度网格;references/architecture.md
  5. 字符集 — 每个项目多个;references/architecture.md § 字符集
  6. 颜色系统 — HSV + 离散RGB + 和谐生成;references/architecture.md § 颜色
  7. 场景函数 — 每个返回 canvas (uint8 H,W,3)references/scenes.md
  8. 色调映射 — 自适应亮度归一化;references/composition.md
  9. 着色器管线ShaderChain + FeedbackBufferreferences/shaders.md
  10. 场景表 + 调度器 — 时间 → 场景函数 + 配置;references/scenes.md
  11. 并行编码器 — N工作者片段渲染,使用ffmpeg管道
  12. 主程序 — 编排完整流程

第4步:质量验证

  • 先测试帧:在完整渲染前,在关键时间戳渲染单帧
  • 亮度检查:所有ASCII内容的 canvas.mean() > 8。如果太暗,降低gamma
  • 视觉连贯性:所有场景是否感觉属于同一视频?
  • 创意愿景检查:输出是否匹配第1步的概念?如果看起来平淡,请返回重做

关键实现说明

亮度 — 使用 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

每场景gamma值:默认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/域变形、泰森多边形、反应扩散、细胞自动机、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. 在编写代码之前,将这种横向洞察力应用于视觉设计