优化Stable Diffusion动画生成的参数调节工具,支持音频同步
Parseq是一个为Deforum扩展设计的参数序列器,允许用户通过脚本化的插值方式控制Stable Diffusion的参数,从而生成动画并实现音频同步。Parseq支持复杂的表达式语言,能够处理变焦、平移及3D旋转等输入参数,并提供前端存储和本地处理的便利。它与Automatic1111的Stable Diffusion界面集成简便,显著简化动画制作流程,并支持模块化管理和分享工作。
你可以直接进入 Parseq:https://sd-parseq.web.app/ 。
一些背景介绍:
Parseq(此工具)是用于Automatic1111的Deforum扩展的参数序列器。你可以使用它生成动画,对许多稳定扩散参数(如种子、比例、提示权重、噪声、图像强度等)进行紧密控制和灵活插值,以及输入处理参数(如缩放、平移、3D旋转等)。
目前,Parseq几乎完全是前端的,默认情况下将所有状态存储在浏览器本地存储中。所有处理,包括音频处理,都在浏览器中完成。登录用户可以选择从UI上传他们的作品,以便于分享。
使用Parseq,你可以:
使用脚本逻辑在提示文本中进行序列、演化和混合提示 | 控制参数和提示权重随时间的变化,可以以可视化和高级表达语言来实现 | 自动检测音频事件,并使用它们来影响你的视频。 |
<img width="400" alt="image" src="https://yellow-cdn.veclightyear.com/35dd4d3f/ef4df9cd-1c22-40ff-9b68-41042ddce7ae.png"> | <img width="400" alt="image" src="https://yellow-cdn.veclightyear.com/35dd4d3f/1b552ace-c799-44f5-85ef-f4131303c389.png"> | <img width="400" alt="image" src="https://yellow-cdn.veclightyear.com/35dd4d3f/a0909552-a5d9-42ed-b638-064452325544.png"> |
从音频中提取音调和幅度数据,并导入任何原始时间序列数据,用于表达式 | 在开始扩散之前预览3D运动和最终提示 | 与A1111的Deforum扩展的简单集成——只需复制一个链接就行了! |
<img width="400" alt="image" src="https://yellow-cdn.veclightyear.com/35dd4d3f/231a8044-40bd-4bd4-8844-e2d3fae4eba1.png"> | <img width="400" alt="image" src="https://yellow-cdn.veclightyear.com/35dd4d3f/583dbea7-a246-44e5-9e80-0d29238f4dac.png"> | <img width="1195" alt="image" src="https://yellow-cdn.veclightyear.com/35dd4d3f/71a9e2b1-dc19-43f2-abe3-4c7e00a2b868.png"> |
请参见项目维基中的 Parseq 更新日志 。
Deforum
扩展下的Init
标签页的底部看到一个“Parseq”部分(点击展开)。了解Parseq功能和核心概念的最佳方式是观看以下教程:这几个教程视频:
总而言之,有两个步骤需要执行:
步骤1:创建参数清单
npm start
)步骤2:生成视频
这里有一些示例展示了可以做什么。这些大部分在20fps下生成,然后用ffmpeg的minterpolate或FILM平滑到60fps。参见Parseq 示例库,查看一系列简单示例及重现所需的所有设置。
示例 | 描述 |
---|---|
<video src="https://github.com/rewbs/sd-parseq/assets/74455/67013869-1dfc-4144-9640-6000ec4a4fe1" /> | 音频控制提示:振幅影响面部表情,音高影响粉彩/矢量效果。查看 YouTube 上的视频 以获得更高质量和所有设置。 |
<video src="https://github.com/rewbs/sd-parseq/assets/74455/a7ff8731-c82a-4809-b128-487926aff40f" /> | 源自 Parseq 教程3 的音频同步示例。查看 YouTube 上的高质量版本。 |
<video src="https://user-images.githubusercontent.com/74455/209022677-568bd283-3e2a-457c-93ab-b27182db7bc6.mp4" /> | 另一个高级音频同步示例。有关其创建的详细描述请见此处。音乐节选自 The Prodigy - Smack My Bitch Up (Noisia Remix)。 |
<video src="https://user-images.githubusercontent.com/74455/228871042-a7a26e6f-aa42-4b24-837a-b5dc93812602.mp4" /> | 结合3D Y轴旋转和X轴平移,围绕对象进行旋转。更多信息请见 Parseq 示例库。 |
<video src="https://user-images.githubusercontent.com/74455/228868895-75da2d24-2fa0-49a3-ba7b-6ac644014935.mp4" /> | 在 Parseq 教程2 中展示的种子传播示例。 |
<video src="https://user-images.githubusercontent.com/74455/228870311-0f59ea4b-880b-449f-8552-daeba5a8d7c9.mp4" /> | 在 Parseq 教程2 中展示的提示操控示例。 |
<video src="https://user-images.githubusercontent.com/74455/199898527-edcf7537-25ac-4d3f-b91f-8e9e89e252dc.mp4" /> | 在几个著名面孔之间振荡,并带有一些3D移动和偶尔的去噪峰值以重置上下文。 |
Parseq 的主要特点是通过关键帧和有趣的插值机制对参数值进行高级控制。
关键帧网格是 Parseq 中的核心用户界面概念。网格中的每一行代表一个关键帧。每个参数有两列:第一列接受该字段的显式值,第二列接受一个 插值公式,定义该值如何“旅行”到下一个关键帧的值。如果在给定关键帧上没有指定插值公式,则继续使用上一个关键帧的公式。默认的插值算法是线性插值。
在网格下方,有一个图表可以让你看到插值的结果(并通过拖动节点来编辑关键帧值):
<img width="500" alt="image" src="https://yellow-cdn.veclightyear.com/35dd4d3f/b643129c-774d-485a-8043-e8a3da6d6127.png">插值公式可以是任意复杂的数学表达式,并且可以使用一系列内置函数和值,包括振荡器和和帮助程序来同步它们的时间戳或节拍:
<img width="500" alt="image" src="https://yellow-cdn.veclightyear.com/35dd4d3f/e6ad3eda-7240-43a5-b540-a1862019613f.png">插值表达式定义了在每一帧中给定字段的值应如何计算。表达式可以返回数字或字符串。字符串字面量必须用双引号(""
)括起来。
以下是你可以在 Parseq 表达式中使用的操作符、值、常量和函数。
💡 你可以使用 Parseq 的实时文档 来可视化和操作所有插值逻辑。💡
操作符 | 描述 | 示例 |
---|---|---|
<expr1> + <expr2> | 两个表达式相加。如果任一表达式为字符串,也可充当字符串连接(与 JavaScript 字符串连接的类型转换语义相同)。 | 使种子在每一帧增加0.25(Parseq 使用分数种子来影响子种子的强度):<img width="800" alt="image" src="https://yellow-cdn.veclightyear.com/35dd4d3f/4d121eca-9d11-4c81-bed1-9373fa87df4e.png"> |
<expr1> - <expr2> | 减去两个表达式。 | |
<expr1> * <expr2> | 两个表达式相乘。 | |
<expr1> / <expr2> | 两个表达式相除。 | |
<expr1> % <expr2> | 取模 | 每4拍重置种子:<img width="802" alt="image" src="https://yellow-cdn.veclightyear.com/35dd4d3f/e9bb0ce1-e110-4668-9efb-dc423612e49b.png"> |
<expr1> != <expr2> | 如果表达式不相等,返回1,否则返回0。 | |
<expr1> == <expr2> | 如果表达式相等,返回1,否则返回0。 | |
<expr1> < <expr2> | 如果 <expr1> 小于 <expr2> ,返回1,否则返回0。 | |
<expr1> <= <expr2> | 如果 <expr1> 小于或等于 <expr2> ,返回1,否则返回0。 | |
<expr1> >= <expr2> | 如果 <expr1> 大于 <expr2> ,返回1,否则返回0。 | |
<expr1> < <expr2> | 如果 <expr1> 大于或等于 <expr2> ,返回1,否则返回0。 | |
<expr1> and <expr2> | 如果 <expr1> 和 <expr2> 都不为0,返回1,否则返回0。 | |
<expr1> or <expr2> | 如果 <expr1> 或 <expr2> 不为0,返回1,否则返回0。 | |
if <cond> <consequent> else <alt> | 如果 cond 评估为任何非0值,返回 consequent ,否则返回 alt 。cond 、consequent 和 alt 都是任意表达式。 | 使用方波在1和-1之间交替渲染步函数和三次样条插值,周期为10帧:<img width="360" alt="image" src="https://yellow-cdn.veclightyear.com/35dd4d3f/e2ce4f08-0d55-43e9-b967-3dc6d81528c7.png"> |
<expr1> : <expr2> | 简化语法,便于创建格式为 (<term>:<weight>) 的字符串。例如,在提示中放入 ${"cat":prompt_weight_1} 会渲染为 ${(cat:0.5)} ,其中0.5是该帧的 prompt_weight_1 值。expr1 必须返回一个字符串,expr2 返回一个数字。 |
你的表达式在一个上下文中运行,该上下文提供了一些有用的变量:
值 | 描述 | 示例 |
---|---|---|
L | (默认) 假设当前帧在前后关键帧值之间的线性插值值 | <img width="360" alt="image" src="https://yellow-cdn.veclightyear.com/35dd4d3f/383c8bf5-b098-4adb-a4d6-49d7ff4c71f7.png"> |
S | 假设当前帧的值为阶跃插值。这相当于 active_keyframe_value ,即值列中最后看到的值。 | <img width="360" alt="image" src="https://yellow-cdn.veclightyear.com/35dd4d3f/35182061-6c32-4510-ad0f-38a188bf80d6.png"> |
C | 假设当前帧的值为所有关键帧值的三次样条插值。 | <img width="360" alt="image" src="https://yellow-cdn.veclightyear.com/35dd4d3f/ad875dda-8f30-44a5-a281-130477d9a08d.png"> |
P | 同上,但使用多项式插值。与三次样条非常相似。 | <img width="360" alt="image" src="https://yellow-cdn.veclightyear.com/35dd4d3f/1a672854-e310-415d-a11f-7e6431ed5c82.png"> |
f | 当前帧编号。单独使用不太有用,但可以在插值算法中引用整体视频的位置。例如,将其添加到种子值中,每帧递增种子。 | <img width="360" alt="image" src="https://yellow-cdn.veclightyear.com/35dd4d3f/22340d5b-23df-4f84-974f-735c7febd7fd.png"> |
k | 自这个字段的活动关键帧开始以来经过的帧数 | <img width="360" src="https://yellow-cdn.veclightyear.com/35dd4d3f/7fb27a3b-2079-40f2-acd5-152cc6ce6989.png" alt="Parseq%20-%20parameter%20sequencer%20for%20Stable%20Diffusion" /> |
b | 当前的节拍位置。取决于BPM和FPS。 | |
s | 当前的秒数位置。取决于FPS。 | |
active_keyframe | 该字段当前活动关键帧的帧号 | <img width="360" src="https://yellow-cdn.veclightyear.com/35dd4d3f/27d5016b-4d2c-45d9-9372-5a6b56392899.png" /> |
next_keyframe | 该字段下一个关键帧的帧号 | <img width="360" src="https://yellow-cdn.veclightyear.com/35dd4d3f/9a29963f-e540-4011-ac0b-8258f80cc366.png" /> |
active_keyframe_value | 该字段当前活动关键帧设置的值。相当于 S (阶跃插值)。 | <img width="360" src="https://yellow-cdn.veclightyear.com/35dd4d3f/e1cf5c4d-32d6-4fd4-8e53-377d0eb39f68.png" alt="Parseq%20-%20parameter%20sequencer%20for%20Stable%20Diffusion" /> |
next_keyframe_value | 该字段下一个关键帧设置的值 | <img width="360" src="https://yellow-cdn.veclightyear.com/35dd4d3f/7ac67b63-2a44-4d60-95c4-2667c93f32d9.png" alt="Parseq%20-%20parameter%20sequencer%20for%20Stable%20Diffusion" /> |
prev_computed_value | 该字段在前一帧计算的值,或在第一帧为0。 | <img src="https://yellow-cdn.veclightyear.com/35dd4d3f/2b06408d-1d89-49ad-a5b9-b40cb0cf0642.png" alt="Parseq%20-%20parameter%20sequencer%20for%20Stable%20Diffusion" /> |
last_frame | 在“最终帧”输入字段中设置的值。类似于deforum中的“max_f”变量。 |
常量 | 描述 | 示例 |
---|---|---|
PI | 常量π。 | |
E | 常量e。 | |
SQRT2 | 2的平方根。 | |
SQRT1_2 | 2的平方根。 | |
LN2 | 2的自然对数。 | |
LN10 | 10的自然对数。 | |
LOG2E | e的以2为底的对数。 | |
LOG10E | e的以10为底的对数。 |
单位可以附加到数值常量后,通过文档的FPS和BPM从帧转换为节拍/秒。这在指定振荡器的周期(或其他代表时间周期的事物)时特别有用。
单位 | 描述 | 示例 |
---|---|---|
f | (默认) 帧 | sin(p=10f) (等同于 sin(p=10) ) |
s | 秒 | sin(p=2s) |
b | 节拍 | sin(p=4b) |
使用这些函数在帧、节拍和秒之间转换:
单位 | 函数 | 示例 |
---|---|---|
f2b(x) | 帧到节拍 | |
b2f(x) | 节拍到帧 | |
f2s(x) | 帧到秒 | |
s2f(x) | 秒到帧 |
所有函数可以通过未命名参数(例如sin(10,2)
)或命名参数(例如sin(period=10, amplitude=2)
)调用。大多数参数都有长名称和短名称(例如sin(p=10, a=2)
)。
在下面的例子中,注意振荡器的幅度设置为字段的线性插值值(L
),从第0帧的初始值1
到第120帧的值0
。这就是振荡器幅度随时间减小的原因。
函数 | 描述 | 示例 |
---|---|---|
sin() | 正弦波振荡器。见下文参数(仅周期是必需的)。 | <img width="724" alt="image" src="https://yellow-cdn.veclightyear.com/35dd4d3f/9ceaeb14-4ab5-438a-bade-7e8d34184d44.png"> |
sq() | 方波振荡器 | <img width="512" alt="image" src="https://yellow-cdn.veclightyear.com/35dd4d3f/a77f0a3e-d546-403b-a574-077437373c86.png"> |
tri() | 三角波振荡器。 | <img width="512" alt="image" src="https://yellow-cdn.veclightyear.com/35dd4d3f/97807d62-f0bf-43fc-90ed-7edca333cbf1.png"> |
saw() | 锯齿波振荡器。 | <img width="512" src="https://yellow-cdn.veclightyear.com/35dd4d3f/3c52d6c3-73b3-4cee-a177-f758271bfe2d.png" alt="Cursor%20and%20Parseq%20-%20parameter%20sequencer%20for%20Stable%20Diffusion" /> |
pulse() | 脉冲波振荡器。 | <img width="512" alt="image" src="https://yellow-cdn.veclightyear.com/35dd4d3f/140e4167-3827-4a80-a718-a26fccaff60b.png"> |
振荡器参数:
p
必需: 振荡的周期。默认单位是帧,但您可以通过添加适当的后缀指定秒或节拍(例如sin(p=4b)
或sin(p=5s)
)。a
(默认值:1
):振荡的幅度。sin(p=4b, a=2)
等同于sin(p=4b)*2
。ps
(默认值:0
):振荡的x轴偏移量,即从帧号中减去多少以获得该帧的振荡x位置。有用的值是-active_keyframe
,这将使周期从关键帧位置开始。见下文示意图。c
(默认值:0
):振荡的y轴偏移量。sin(p=4b, c=2)
等同于sin(p=4b)+2
。li
(默认值:0
): 如果 >0,限制重复的周期数。pw
(默认值:5
):仅pulse()函数 脉冲宽度。示例:
<img src="https://yellow-cdn.veclightyear.com/35dd4d3f/40833593-3457-4dab-ab7d-f6ad09e80fe4.png" alt="Parseq%20-%20parameter%20sequencer%20for%20Stable%20Diffusion" /> | 使用sin(p=2b, a=L) 定义一个幅度线性增加的正弦波,意思是幅度是关键帧值的线性插值。 |
<img src="https://yellow-cdn.veclightyear.com/35dd4d3f/4683b6eb-cc28-4af8-8ce8-6446c3917308.png" alt="Parseq%20-%20parameter%20sequencer%20for%20Stable%20Diffusion" /> | 在每个关键帧处限制为1个周期,使用li=1 。注意相对于完整正弦波保持相位,因此周期不会从关键帧开始。 |
<img src="https://yellow-cdn.veclightyear.com/35dd4d3f/2161f0b4-e207-4797-85c1-97b2d06a25ac.png" alt="Parseq%20-%20parameter%20sequencer%20for%20Stable%20Diffusion" /> | 将相移设置为关键帧的负偏移量,使用ps=-active_keyframe ,可以确保周期从关键帧点开始。 |
功能 | 描述 | 示例 |
---|---|---|
rand() | 返回在 min 和 max 之间的随机数(默认0和1),使用种子 s (默认当前时间使用高精度计时器),保持该值的 'h' 帧(默认1)。参见图片中的3个示例。prompt_weight_1 每帧在0和1之间变换值,并且每次渲染时都会获得一组新值。prompt_weight_2 每40帧获取一个新的在1和2之间的随机值,并且每次渲染时也会获得一组新值。prompt_weight_3 每一拍获取一个新的在2和3之间的随机值,并且在每次渲染时使用相同的一系列值。 | <img src="https://yellow-cdn.veclightyear.com/35dd4d3f/4103f9a8-de96-427b-95fc-77901b974260.png" alt="Parseq%20-%20parameter%20sequencer%20for%20Stable%20Diffusion" /> |
smrand() | 平滑随机函数(simplex 噪声)。参数有平滑因子 sm (较大的值意味着更平滑的噪声,默认10),min (默认0),max (默认1)和种子 s (默认当前时间使用高精度计时器)。由于 simplex 本质上是一个 >2D 噪声生成算法,还存在一个 y 参数(默认0),你可以增加它(比如0.05),以稍微改变整体的噪声模式。 | |
perlin() | 类似于 smrand() ,但使用 perlin 算法代替 simplex。 | |
vibe() | 在随机间隔处绘制点,并在它们之间绘制贝塞尔曲线。取 min 和 max 定义值范围(默认 0, 1),pmin 和 pmax 定义点之间的帧数间隔范围(默认:1, 20),或使用 p 覆盖 pmin 和 pmax 为相同值,随机种子 s (默认当前时间使用高精度计时器),以及 c 或 x1,y1,x2,y2 定义贝塞尔曲线的形状(参见 bez() 上文)。 |
功能 | 描述 | 示例 |
---|---|---|
min() | 返回两个参数中的最小值 | <img width="512" src="https://yellow-cdn.veclightyear.com/35dd4d3f/f659f24a-fc62-487f-80bc-b4ce21936d41.png" alt="Parseq%20-%20parameter%20sequencer%20for%20Stable%20Diffusion" /> |
max() | 返回两个参数中的最大值 | <img width="512" src="https://yellow-cdn.veclightyear.com/35dd4d3f/1b816b25-caff-4da4-b5a9-6bd25843b5fe.png" alt="Parseq%20-%20parameter%20sequencer%20for%20Stable%20Diffusion" /> |
abs() | 返回参数的绝对值 | <img src="https://yellow-cdn.veclightyear.com/35dd4d3f/e9da86a9-e5d1-4a52-a140-7a4223fcdafb.png" alt="Parseq%20-%20parameter%20sequencer%20for%20Stable%20Diffusion" /> |
round() | 返回参数的四舍五入值。第二个参数指定精度(默认: 0)。 | <img src="https://yellow-cdn.veclightyear.com/35dd4d3f/e7d4d2e3-07c6-40cc-adb9-9625106057a5.png" alt="Parseq%20-%20parameter%20sequencer%20for%20Stable%20Diffusion" /> |
floor() | 返回取整后的参数值。第二个参数指定精度(默认: 0)。 | |
ceil() | 返回向上取整后的参数值。第二个参数指定精度(默认: 0)。 |
以下是暴露的一系列来自 Javascript Math 对象 的方法,以 _
为前缀。
注意,不像上面的 sin()
振荡器,这些函数并不是振荡器,它们只是简单的函数。
功能 | 描述 | 示例 |
---|---|---|
_acos() | 相当于 Javascript 的 Math.acos() | |
_acosh() | 相当于 Javascript 的 Math.acosh() | |
_asin() | 相当于 Javascript 的 Math.asin() | |
_asinh() | 相当于 Javascript 的 Math.asinh() | |
_atan() | 相当于 Javascript 的 Math.atan() | |
_atanh() | 相当于 Javascript 的 Math.atanh() | |
_cbrt() | 相当于 Javascript 的 Math.cbrt() | |
_clz32() | 相当于 Javascript 的 Math.clz32() | |
_cos() | 相当于 Javascript 的 Math.cos() | |
_cosh() | 相当于 Javascript 的 Math.cosh() | |
_exp() | 相当于 Javascript 的 Math.exp() | |
_expm1() | 相当于 Javascript 的 Math.expm1() | |
_log() | 相当于 Javascript 的 Math.log() | |
_log10() | 相当于 Javascript 的 Math.log10() | |
_log1p() | 相当于 Javascript 的 Math.log1p() | |
_log2() | 相当于 Javascript 的 Math.log2() | |
_sign() | 相当于 Javascript 的 Math.sign() | |
_sinh() | 相当于 Javascript 的 Math.sinh() | |
_sqrt() | 相当于 Javascript 的 Math.sqrt() | |
_tan() | 相当于 Javascript 的 Math.tan() | |
_tanh() | 相当于 Javascript 的 Math.tanh() | |
_sin() | 相当于 Javascript 的 Math.sin() |
所有关键帧都有一个可选的“信息”字段,该字段可以包含任意字符串。你可以在表达式中查询这些字段。例如,你可以使用函数检查当前关键帧的文本是否符合正则表达式,或计算过去包含某个子字符串的关键帧数量,或展望下一个包含给定字符串的关键帧何时出现。 <SOURCE_TEXT>
function | description | example |
---|---|---|
info_match() | 接受一个正则表达式作为参数。如果当前活动关键帧的信息标签与正则表达式匹配,则返回1,否则返回0。 | <img src="https://yellow-cdn.veclightyear.com/35dd4d3f/fae452a4-22d7-4141-8a1d-a68152203118.png" alt="Parseq%20-%20parameter%20sequencer%20for%20Stable%20Diffusion" /> |
info_match_count() | 接受一个正则表达式作为参数。返回信息标签到目前为止匹配正则表达式的关键帧数量。 | <img src="https://yellow-cdn.veclightyear.com/35dd4d3f/e6d08f92-dc8c-4139-9fd0-5a198c1ed91c.png" alt="Cursor%20and%20Parseq%20-%20parameter%20sequencer%20for%20Stable%20Diffusion" /> |
info_match_last() | 接受一个正则表达式作为参数。返回匹配正则表达式的前一个关键帧的帧编号,如果当前帧是匹配关键帧,则返回当前帧编号,如果没有匹配,则返回-1。 | <img src="https://yellow-cdn.veclightyear.com/35dd4d3f/d6647b4a-4efe-4781-8582-08c891af2078.png" alt="Parseq%20-%20parameter%20sequencer%20for%20Stable%20Diffusion" /> |
info_match_next() | 接受一个正则表达式作为参数。返回匹配正则表达式的下一个关键帧的帧编号,如果没有匹配,则返回-1。 | <img src="https://yellow-cdn.veclightyear.com/35dd4d3f/d6647b4a-4efe-4781-8582-08c891af2078.png" alt="Parseq%20-%20parameter%20sequencer%20for%20Stable%20Diffusion" /> |
提示可以包括任何 Parseq 表达式。例如,以下是一个包含条件操作符 :
和字符串连接 +
的有效提示:
一幅画 ${ 如果 (f<10) "一只猫":prompt_weight_1 否则 "一只狗":prompt_weight_2 + "有垂耳朵" } ,非常详细
在帧数少于10的情况下,它会生成类似于一幅(一只猫:0.45)的画,非常详细
这样的提示,而在帧数为10及其以上时,它会生成一幅(一只狗:0.45)有垂耳朵的画,非常详细
。
请注意,如果您想确保生成图像中不会出现某物,通常在正提示中给它一个负权重是不够的:您需要将该术语放在负提示中。因此,如果您想让某物出现然后消失,就有必要在正提示和负提示之间“移动”它。可以通过条件语句来完成此操作,但以下函数使其变得更容易。
function | description | example |
---|---|---|
posneg(<term>, <weight>) | <term> 必须评估为字符串,<weight> 必须评估为数字。根据权重,在正提示和负提示之间自动切换术语。例如,如果 posneg("猫", prompt_weight_1) 在正提示中,那么 prompt_weight_1 为正的帧中会在正提示中包含 (猫:abs(prompt_weight_1)),而在 prompt_weight_1 为负的帧中会在负提示中包含 (猫:abs(prompt_weight_1))。 | 请参见这个 YouTube 示例视频。视频描述中包含 Parseq 文档的链接。 |
posneg_lora(<lora_name>, <weight>) | 同上,但适用于 loras。 posneg("Smoke", prompt_weight_1) 评估为 <"lora":"Smoke":prompt_weight_1> | 请参见这个 YouTube 示例视频。视频描述中包含 Parseq 文档的链接。 |
请参见上面的 :
操作符。
Parseq 提供一系列功能,帮助您创建具有精确定时参数波动的动画,例如用于音乐同步。
Parseq 允许您指定每秒帧数(FPS)和每分钟节拍数(BPM),用于将帧编号映射到时间和节拍偏移量。例如,如果您将FPS 设置为10,将 BPM 设置为120,当您将鼠标悬停在第 40 帧(在网格或图形中)上时,会显示该帧将出现在视频的4秒或8节拍内。
此外,您的插值公式可以使用 b 和 s 后缀引用节拍和秒。例如,这里我们定义了一个周期为1拍的正弦波振荡器(绿色),以及一个周期为5秒且脉冲宽度为0.5秒的脉冲振荡器(灰色):
<img width="500" alt="image" src="https://yellow-cdn.veclightyear.com/35dd4d3f/dff7ca51-f032-4f5d-90b5-70b1555b52db.png">默认情况下,关键帧的位置是根据它们的帧编号来定义的,即使FPS 或 BPM 发生变化,帧编号也会保持不变。例如,如果您以10fps 开始,并在120 BPM 音轨的第4 节拍上创建一个关键帧,关键帧将在第20 帧处。但如果您决定将FPS 更改为20,并将音轨更新为140 BPM,您的动画将会失去同步,因为第4 节拍现在应该位于第34 帧上!
为了解决这个问题,您可以将关键帧锁定到它们的节拍(或秒)位置。完成此操作后,即使您更改FPS 或 BPM,它们也会保持同步。
您可以使用“在间隔”选项卡快速创建与常规事件对齐的关键帧。例如,这里我们在前8 个节拍的每个节拍位置创建一个关键帧。关键帧位置将根据文档的 BPM 和FPS 进行确定。请注意,只有6 个关键帧会被创建,因为第0 和第 4 拍已经存在关键帧:
<img src="https://yellow-cdn.veclightyear.com/35dd4d3f/41fe69e0-7616-4cc0-9f79-4112a416bec9.png" alt="Parseq%20-%20parameter%20sequencer%20for%20Stable%20Diffusion" />一个常见的做法是标记关键帧以指示它们代表的音频事件(例如“低音鼓”、“军鼓”等)。然后您可以在插值公式中引用所有这些关键帧,例如 info_match_last()
、info_match_next()
和 info_match_count()
函数,以及批量编辑对话框中。
为了帮助您对齐关键帧和公式与音频,您可以加载音频文件以在参数图旁边查看其波形。缩放和平移图表将应用于音频(单击并拖动以平移,按住alt/option键并用鼠标滚轮缩放)。滚动音频将会平移图表。图表和音频之间提供了视口控件。在两个可视化上显示了提示、节拍和光标标记。
https://user-images.githubusercontent.com/74455/228865210-be0a3202-3c9e-4037-8d9f-cd5bb3c8fd65.mp4
手动创建和标记音频事件的关键帧可能很繁琐。Parseq 通过使用 AubioJS 的音频事件检测功能改进了这一点:
<img src="https://yellow-cdn.veclightyear.com/35dd4d3f/02d7434e-73cd-4a3b-9d46-6eb320ab2a6f.png" alt="Parseq%20-%20parameter%20sequencer%20for%20Stable%20Diffusion" />加载参考音频文件后,转到波形下的事件检测选项卡并点击检测事件。标记将在波形上表示检测到的事件位置。
您可以通过控制以下选项来调整事件检测结果:
一旦您对检测到的事件满意,可以切换到关键帧生成选项卡来创建关键帧。您可以选择一个自定义标签,这将分配给所有新生成的关键帧。如果某个位置已经存在关键帧,该标签将与现有标签组合。
请在 此教程 中观看事件检测和关键帧生成的实际操作。
时间序列是 Parseq 的一个强大功能,允许您导入任何一系列数字,并在 Parseq 公式中引用它们。一个主要应用场景是将参数变化与音频音高或振幅同步。
点击“添加时间序列”并选择要处理的音频文件。然后您可以选择提取音高或振幅。当提取音高时,您可以从一系列方法中进行选择(有关详细信息,请参见 aubiopitch CLI 文档)。
提供了一个二阶滤波器,允许您在执行音高/振幅提取之前对音频进行预处理。
在提取数据后,您可以对其进行后处理,如取绝对值、排除在给定范围之外的数据点、钳制在给定范围之外的数据点,并归一化到目标范围。
使用绝对值对于振幅特别有价值,因为未处理的振幅将在正负之间振荡。
<img src="https://yellow-cdn.veclightyear.com/35dd4d3f/8569c294-8a23-4587-9d17-7a4b977780b8.png" /> <img src="https://yellow-cdn.veclightyear.com/35dd4d3f/2742273e-ebf0-42ee-8ab9-2f4c9ea2e7ad.png" />最终的时间序列将减少到最大 2000 点。绿色点表示帧落在这些点上。
一旦时间序列被创建,您可以为其选择一个别名,然后在公式中引用它们。
<img src="https://yellow-cdn.veclightyear.com/35dd4d3f/78715361-f3b3-4078-b5cb-cbe131f2a891.png" /> </SOURCE_TEXT> 有两种引用时间序列的方法:方法 | 描述 | 示例 |
---|---|---|
timeseries_name | 返回当前帧的时间序列值,相当于 timeseries_name(f) | 复制的时间序列:<img src="https://yellow-cdn.veclightyear.com/35dd4d3f/ccd6fede-09ec-4f75-9c37-e062d9e07d6c.png" /> |
timeseries_name(n) | 返回帧 n 的时间序列值 | 重复前10帧时间序列:<img src="https://yellow-cdn.veclightyear.com/35dd4d3f/cb6428d4-3b93-4699-a1bf-68388f234445.png" /> |
请在此教程中查看音高检测的实际应用。
此功能已被弃用。请参见其在Parseq wiki上的存档文档。
除了音频音高和振幅数据之外,您还可以将任何CSV文件加载为时间序列。这意味着您可以导入几乎任何数列以在Parseq中使用。
CSV文件的格式必须是 timestamp,value
。在导入之前,您可以选择时间戳表示毫秒或帧。
例如,这里我们导入了ChatGPT 4生成的数据,询问后得到如下结果:
<img width="400" alt="image" src="https://yellow-cdn.veclightyear.com/35dd4d3f/0400ce3d-ad41-4971-b10a-a5326b0b7f46.png">请生成格式为 x,y 的CSV输出,其中x从0到100递增1,y值绘制一个简单的城市天际线。仅输出CSV数据,请勿提供任何解释。
Parseq有一个实验性功能,可以实时可视化您的相机移动。它受到@pharmapsychotic的AnimationPreview的启发。
目前,该功能有一些限制:
尽管如此,它对于了解运动参数的一般效果还是相当有用的:
https://github.com/rewbs/sd-parseq/assets/74455/03a18a78-e804-4e90-a061-1d9c1d063564
Parseq可以与 所有 Deforum动画模式(2D、3D、prompt插值、视频等)一起使用。您无需在Parseq中做任何特别设置即可在模式之间切换:只需调整您感兴趣的参数。
以下是Parseq可以控制的参数。您可以在“管理字段”部分选择哪些参数由您的文档控制。任何在A1111 Deforum界面中设置了值且在“管理字段”中选择的字段将被Parseq覆盖。而未选择的字段可以继续在Deforum界面中控制。因此,您可以将Parseq控制的值与Deforum控制的值“混合匹配”。
稳定扩散生成参数:
2D动画参数:
伪3D动画参数(在3D动画模式中忽略):
3D动画参数(在2D动画模式中全被忽略):
防模糊参数:
混合视频参数:
其他参数:
Parseq提供了另外8个可关键帧化参数(prompt_weight_1
到prompt_weight_8
),您可以在提示中引用,因此可以用作提示权重。您可以使用任何a1111识别的提示格式,记住${...}内的任何内容都会被当作Parseq表达式进行计算。
例如,以下是一个使用可组合扩散在面部之间插值的正面提示:
Jennifer Aniston, centered, high detail studio photo portrait :${prompt_weight_1} AND Brad Pitt, centered, high detail studio photo portrait :${prompt_weight_2} AND Ben Affleck, centered, high detail studio photo portrait :${prompt_weight_3} AND Gwyneth Paltrow, centered, high detail studio photo portrait :${prompt_weight_4} AND Zac Efron, centered, high detail :${prompt_weight_5} AND Clint Eastwood, centered, high detail studio photo portrait :${prompt_weight_6} AND Jennifer Lawrence, centered, high detail studio photo portrait :${prompt_weight_7} AND Jude Law, centered, high detail studio photo portrait :${prompt_weight_8}
以下是一个使用术语加权的示例:
(Jennifer Aniston:${prompt_weight_1}), (Brad Pitt:${prompt_weight_2}), (Ben Affleck:${prompt_weight_3}), (Gwyneth Paltrow:${prompt_weight_4}), (Zac Efron:${prompt_weight_5}), (Clint Eastwood:${prompt_weight_6}), (Jennifer Lawrence:${prompt_weight_7}), (Jude Law:${prompt_weight_8}), centered, high detail studio photo portrait
对应的参数流可能是这样的:
<img width="500" alt="image" src="https://yellow-cdn.veclightyear.com/35dd4d3f/51c56e96-2c1f-4a20-a407-09bf93e782e9.png">注意,任何Parseq表达式都可以使用,例如以下将在每次节拍时在猫和狗之间交替:
Detailed photo of a ${if (floor(b%2)==0) "cat" else "dog"}
一些重要提示:
所以之前的例子可能是这样的:
正面提示 | 负面提示 |
---|---|
Detailed photo of a ${if (floor(b%2)==0) "cat" else "dog"} | ${if (floor(b%2)==0) "dog" else "cat"} |
您可以添加附加提示并将每个提示分配给一个帧范围:
<img width='500' src="https://i.imgur.com/eY5FSOX.png" alt="Parseq%20-%20parameter%20sequencer%20for%20Stable%20Diffusion" />如果范围重叠,Parseq将使用可组合扩散 结合重叠的提示。您可以决定可组合扩散权重是固定的、线性滑入和滑出,还是由自定义Parseq表达式定义的。
注意,如果重叠的提示已经使用了可组合扩散(... AND ...
),这可能会导致意外结果,因为只有原始提示的最后一部分会与重叠提示加权。Parseq会警告您如果出现这种情况。
有关种子旅行的详细说明,请参见Yownas的脚本。简而言之,您可以通过设置第一个种子作为(主)种子,第二个种子作为子种子,并波动子种子强度,在两个种子生成的潜在噪声之间插值。子种子强度为0只会使用主种子,而1则只会使用子种子作为种子。介于两者之间的任何值都会使用球面线性插值(SLERP)在两种噪声模式之间插值。
Parseq目前没有显式暴露子种子和子种子强度参数。相反,它使用分数种子值来控制子种子和子种子强度值。例如,如果在给定帧上的种子值为 10.5
,Parseq将发送 10
作为种子,11
作为子种子和 0.5
作为子种子强度。
缺点是您只能在相邻种子之间插值。好处是种子旅行非常直观。如果您希望完全控制子种子和子种子强度,请随时提出功能请求!
请注意,种子旅行的效果在没有输入图像(插值动画模式)或强度非常低的情况下效果最佳。否则,输入的低变化可能会导致伪影/深度油炸。
否则最好在每帧上至少更改1个种子(您也可以尝试种子振荡,以减少变化)。
Parseq旨在让您为所有参数设置绝对值。 因此,如果您想在4帧内逐步旋转180度,您需要为每帧指定以下值:45、90、135、180。
然而,由于稳定扩散动画是通过将上一帧生成的图像馈送到当前生成步骤中,因此某些动画参数变得相对的,如果有足够的回环强度。因此,如果您想在4帧内旋转180度,动画引擎期望的值分别是:45、45、45、45。
这并不是所有参数的情况:例如,种子值和视野设置不依赖于之前的帧,因此动画引擎期望的是绝对值。
为了解决这个问题,Parseq为某些参数提供_增量值_给Deforum。默认情况下是启用的,但您可以在A111 Deforum扩展UI中将其关闭以查看不同。
对于大多数参数,给定字段的增量值只是该字段的当前值与上一帧值之间的差异。然而,某些参数如2D缩放(实际是一个比例因子)是乘法值,因此增量是前后值之比。
Parseq在处理大量帧时可能会变慢。如果您看到性能下降,请尝试以下操作: 在管理字段部分,只选择你想用Parseq控制的字段。 关闭你不使用的部分。例如,如果你不使用Sparklines或测试输出视图,使用部分标题旁边的^关闭它们。 通过在"显示/隐藏字段"选择框中取消选择不活跃使用的字段来隐藏它们(或通过点击它们的小波形图来切换它们)。 禁用自动渲染(并记得在每次更改后手动点击渲染按钮)。 注意,当显示超过1000帧时,图形将变得不可编辑,并且不会显示关键帧。要恢复编辑,请缩小到小于1000帧的部分。
Parseq目前是一个前端React应用。它正在从Javascript转换为Typescript的过程中。目前后端非常少:默认情况下,持久性完全在浏览器indexdb存储中通过Dexie.js实现。登录用户可以选择将数据上传到Firebase支持的数据存储。
在开始之前,你需要在系统上安装node
和npm
。
如果你想深入了解:
npm install
以拉取依赖项。npm start
以在本地以开发模式在3000端口运行Parseq UI。你现在可以在localhost:3000
上访问UI。代码更改应自动热重载。托管和部署使用Firebase。合并到master分支会自动部署到暂存通道。PR会自动部署到开发通道。目前没有自动的部署后验证或提升到生产环境。
假设你有正确的权限,你可以查看活动部署:
firebase hosting:channel:list
并从暂存环境提升到生产环境:
firebase hosting:clone sd-parseq:staging sd-parseq:live
该脚本包括来自许多其他脚本的想法和代码。特别感谢以下支持和灵感来源:
cv2.warpPerspective()
(https://github.com/eborboihuc/rotate_3d/blob/master/image_transformer.py)OpenAI Agents SDK,助力开发者便捷使用 OpenAI 相关功能。
openai-agents-python 是 OpenAI 推出的一款强大 Python SDK,它为开发者提供了与 OpenAI 模型交互的高效工具,支持工具调用、结果处理、追踪等功能,涵盖多种应用场景,如研究助手、财务研究等,能显著提升开发效率,让开发者更轻松地利用 OpenAI 的技术优势。
高分辨率纹理 3D 资产生成
Hunyuan3D-2 是腾讯开发的用于 3D 资产生成的强大工具,支持从文本描述、单张图片或多视角图片生成 3D 模型,具备快速形状生成能力,可生成带纹理的高质量 3D 模型,适用于多个领域,为 3D 创作提供了高效解决方案。
一个具备存储、管理和客户端操作等多种功能的分布式文件系统相关项目。
3FS 是一个功能强大的分布式文件系统项目,涵盖了存储引擎、元数据管理、客户端工具等多个模块。它支持多种文件操作,如创建文件和目录、设置布局等,同时具备高效的事件循环、节点选择和协程池管理等特性。适用于需要大规模数据存储和管理的场景,能够提高系统的性能和可靠性,是分布式存储领域的优质解决方案。
用于可扩展和多功能 3D 生成的结构化 3D 潜在表示
TRELLIS 是一个专注于 3D 生成的项目,它利用结构化 3D 潜在表示技术,实现了可扩展且多功能的 3D 生成。项目提供了多种 3D 生成的方法和工具,包括文本到 3D、图像到 3D 等,并且支持多种输出格式,如 3D 高斯、辐射场和网格等。通过 TRELLIS,用户可以根据文本描述或图像输入快速生成高质量的 3D 资产,适用于游戏开发、动画制作、虚拟现实等多个领域。
10 节课教你开启构建 AI 代理所需的一切知识
AI Agents for Beginners 是一个专为初学者打造的课程项目,提供 10 节课程,涵盖构建 AI 代理的必备知识,支持多种语言,包含规划设计、工具使用、多代理等丰富内容,助您快速入门 AI 代理领域。
AI Excel全自动制表工具
AEE 在线 AI 全自动 Excel 编辑器,提供智能录入、自动公式、数据整理、图表生成等功能,高效处理 Excel 任务,提升办公效率。支持自动高亮数据、批量计算、不规则数据录入,适用于企业、教育、金融等多场景。
基于 UI-TARS 视觉语言模型的桌面应用,可通过自然语言控制计算机进行多模态操作。
UI-TARS-desktop 是一款功能强大的桌面应用,基于 UI-TARS(视觉语言模型)构建。它具备自然语言控制、截图与视觉识别、精确的鼠标键盘控制等功能,支持跨平台使用(Windows/MacOS),能提供实时反馈和状态显示,且数据完全本地处理,保障隐私安全。该应用集成了多种大语言模型和搜索方式,还可进行文件系统操作。适用于需要智能交互和自动化任务的场景,如信息检索、文件管理等。其提供了详细的文档,包括快速启动、部署、贡献指南和 SDK 使用说明等,方便开发者使用和扩展。
开源且先进的大规模视频生成模型项目
Wan2.1 是一个开源且先进的大规模视频生成模型项目,支持文本到图像、文本到视频、图像到视频等多种生成任务。它具备丰富的配置选项,可调整分辨率、扩散步数等参数,还能对提示词进行增强。使用了多种先进技术和工具,在视频和图像生成领域具有广泛应用前景,适合研究人员和开发者使用。
全流程 AI 驱动的数据可视化工具,助力用户轻松创作高颜值图表
爱图表(aitubiao.com)就是AI图表,是由镝数科技推出的一款创新型智能数据可视化平台,专注于为用户提供便捷的图表生成、数据分析和报告撰写服务。爱图表是中国首个在图表场景接入DeepSeek的产品。通过接入前沿的DeepSeek系列AI模型,爱图表结合强大的数据处理能力与智能化功能,致力于帮助职场人士高效处理和表达数据,提升工作效率和报告质量。
一款强大的视觉语言模型,支持图像和视频输入
Qwen2.5-VL 是一款强大的视觉语言模型,支持图像和视频输入,可用于多种场景,如商品特点总结、图像文字识别等。项目提供了 OpenAI API 服务、Web UI 示例等部署方式,还包含了视觉处理工具,有助于开发者快速集成和使用,提升工作效率。
最新AI工具、AI资讯
独家AI资源、AI项目落地
微信扫一扫关注公众号