LoopWave
前言
这篇实践生成一个渐变的图片动画效果。它使用Loopback Wave这个脚本。
配置脚本
先下载它:
➜ wget https://files.catbox.moe/0hx51x.py -O ~/workspace/stable-diffusion-webui/scripts/loopback-wave.py
然后在「Settings」Tab里面点击「Reload UI」重启Web,就可以在img2img
模式里面看到这个脚本了。
使用我维护的版本Loopback Wave V1.4.2
V1.4.1
这个版本看起来挺长时间并没有维护了,可能之后stable-diffusion-webui做了什么调整,其实现在的生成视频功能是失败的,会报错:
Could find no file with path 'outputs/img2img-images/loopback-wave/2174073990/%d.png' and index in the range 0-4 outputs/img2img-images/loopback-wave/2174073990/%d.png: No such file or directory
所以我修改了下代码,可以用我的项目 stable-diffusion-files里面的loopback-wave.py。
创建图片/视频
接着我们上传一张图(或者用txt2img
生成一张图后Send进来)。我这里列出来的例子是通过txt2img
模式生成的一张使用blindbox人物的Lora模型生成的:
接着我们选择这个脚本,它的名字是Loopback Wave V1.4.1
,具体参数设置如下:
主要参数的意义如下:
- Frames。帧数,也就是一共生成多少张图片。
- Frames Per Wave。每次Wave(一轮变化)多少帧、
- Max additional denoise。最大额外噪音,通常选择0。
- Prompt Changes。这个很重要,决定了你希望图片朝着什么方向发展。它是一个文本框,里面按行输入你希望这些帧在什么位置开始某种变化,所以要通过其他提示词来指定,每行代码一次设置,
10::SOME PROMTS
的意思是从10帧开始(2个冒号隔开),加上headphones耳机,然后从30帧开始额外使用红头发(原来是黑色),再从70帧开始换成黄头发。 - Save results as video。勾选它会直接把这些图片生成视频,当然也可以生成图后先人工筛选,把不好的图去掉,再用ffmepg、AE、剪映等工具自行生成。
- Video Name。虽然它的意思是视频名字,但实际生成的是视频目录的前缀,意义不大。
- Frames per second。每秒的帧数,越多那么最终效果变化越多越快,否则画面静止的感受越长,我一般用默认的4。
- Video encoding。脚本官网里面提到,选择的编码方案需要在编译ffmpeg时指定才可用,我一般选择
H.264
格式。
另外重绘幅度(Denoising strength)用了0.25(不希望太发散),我们通过改变图片的头发颜色产生渐变的效果,下面是生成的视频结果(在outputs/img2img-images/loopback-wave
目录下):
是不是还挺惊艳的?
要不要使用stable-diffusion-webui自带的视频合成功能?
我的意见是不用。其实用图片生成视频是一件非常容易的事情,stable-diffusion-webui其实也就是用了ffmpeg加了一些参数罢了,虽然提供了一些参数值的选择,但是它的问题是程序设置死了,不灵活,例如:
- 不支持Mac自带的QuickTime Player播放器播放。因为需要额外使用参数
- 不支持视频尺寸的修改
总之,无法满足更多需要,如果你会写代码可以自己维护一个loopback-wave或者手动命令行,如果不懂技术可以使用AE等工具生成。
这里推荐一下上面视频我用的命令:
ffmpeg -framerate 10 -start_number 0 -i /Users/weiming.dong/workspace/stable-diffusion-webui/outputs/img2img-images/loopback-wave/485312189.0/2023-05-03/%d.png -c:v libx264 -b:v 0 -crf 40 -vf scale=2048:2048 -preset slow -pix_fmt yuv420p output.mp4
提示词改变的简化
在一些主模型和Lora里面,Prompt Changes
里面的提示词只加入需要额外扩展或者替换的部分即可,例如上例可以这么写:
10::headphones
40::headphones,red hair,
A70::headphones,yellow hair,
这样简单轻便,不需要全部提示词写进去,但是要注意不是所有模型都可以这样,可能会出现奇怪的效果,我的习惯是直接把原始的提示词都写进去。
TODO: 这一块逻辑未来可以读读它的代码确认一下。