需要用到的网上公开项目链接:
生成纸片人立绘(需要神秘的上网工具):https://waifulabs.com
将立绘转换为live2d的项目代码:https://github.com/pkhungurn/talking-head-anime-demo
以下为详细操作步骤:
想要安装项目运行的环境,你的电脑需要有一些基本前提条件。
项目的运行需要dlib库,而dlib库需要先安装cmake,如果你使用的是windows系统,那么你必须在电脑上安装visual studio之后才能满足cmake的前置条件。
下载visual studio:https://visualstudio.microsoft.com
反正这软件可以白嫖
安装完之后手动在cmd里面安装cmake
pip install cmake
项目要求必须使用GPU来运行pytorch,因此你必须安装了相关的环境之后才能使用,关于这方面有很多的文章可以参考。
比如这位大佬的教程:
win10下pytorch-gpu安装以及CUDA详细安装过程
在完成了以上两个步骤之后,就可以愉快地开始安装大佬在项目中用到的库了,具体的安装方式大佬在git上也都写得很明白了。
https://github.com/pkhungurn/talking-head-anime-demo
其中的Dependencies提供了单独安装各个库的列表,Recreating Python Environment with Anaconda则提到了使用conda一键安装环境的方法。
在完成了talking-head-anime-demo这个项目的下载,并且按照git上的说明完成了导入模型与配置环境之后,就可以试着运行了。
项目作者提供了两个启动命令。
python app/manual_poser.py
manual_poser.py用于启动一个可以根据拉条改变动作的手控模型。
python app/puppeteer.py
puppeteer.py用于启动一个实时面部捕捉的窗口,实现类似于facerig的同步表情,最后启动的窗口中会有三个窗口:静态原图片、摄像头真实影像、根据表情同步变化的live2d模型。
(PS:虽然本人在这一步并没有遇到障碍,但是有一个朋友在这一步摄像头无法正常工作,将puppeteer.py中第199行的
video_capture = cv2.VideoCapture(0)
修改为
video_capture = cv2.VideoCapture(1,cv2.CAP_DSHOW)
之后,摄像头得以正常运行。)
对windows系统来说,可以通过写一个bat脚本的方法来双击启动程序,而不用每次都在cmd打指令,因此可以在talking-head-anime-demo-master文件夹中新建一个任意名字且后缀名为.bat的脚本文件。
在文件中写入:
start cmd /k "python app/puppeteer.py"
双击文件即等效于在cmd中输入对应的命令。
项目作者已经在talking-head-anime-demo-master\data\illust中提供了几张用于测试的样例图片,因此可以直接测试动态模型是否正常工作。
不过原作者给出的界面并不是很适合直接用于直播,因此还需要进行一些小小的改动。
以下改动可以在puppeteer.py的原文件上进行,也可以在app文件夹中新建一个名字不同的py文件然后复制一份puppeteer.py的代码进去,别忘了把自己启动脚本中对应的文件名也改了。
在这三个窗口中,中间的真实摄像头画面恐怕是很多人最不希望看到出现在直播中的镜头了觉得自己萌萌哒的请无视这部分内容并体谅一下丑逼的自卑,虽然可以剪切掉,不过看见自己出现在窗口中就很不爽。
因此,在puppeteer.py或者你复制的文件的代码中做出以下改动:
将第56行改为:
if False:
删除或者注释掉124-126行:
#self.video_capture_label.configure(image=photo_image, text="")
#self.video_capture_label.image = photo_image
#self.video_capture_label.pack()
大功告成,再也不用在窗口中央看见自己丑逼的脸了!
既然是直播,那么自然方块形的背景就很碍眼了,而项目作者并没有设置窗口的背景颜色,因此需要对背景颜色进行一些改动。
经过几次实验之后,找到了正确修改动态模型背景颜色的方法。
在第160行更新图片的原代码中添加背景颜色:
self.posed_image_label.configure(image=photo_image, text="",bg="green")
当然,取决于立绘具体颜色也可以把背景设置为蓝色、红色等等……
终于完成了对项目代码的改动,接下来使用著名的OBS软件进行直播的配置,这个软件是免费开源的。
OBS软件下载地址:https://obsproject.com/download
关于如何使用,网上也有很多教程,新建场景,然后点击下面的加号新建窗口捕获,在窗口捕获中选择python.exe的窗口,此时已经可以看到全貌了。
确认之后,右键窗口捕获的内容,点击滤镜,按新窗口中的加号为其添加滤镜,首先添加一个裁剪滤镜,只要留下绿色的输出部分在画面中就可以。裁剪之后,再添加一个色度键的滤镜,过滤绿色。
于是,大功告成,只要再配置好相应直播网站的推流信息,你就可以使用美少女纸片人的形象直播啦~
截止至上述步骤,使用的都是项目作者给的项目文件中的测试用图,于是接下来就是要搞一张独属于自己的立绘。
仔细阅读项目说明,项目作者给出了输入图片的格式要求:
1、图片必须为PNG格式。
2、图片的长宽大小必须为256 x 256。
3、人物头部必须包含在中间的128 x 128像素中。
4、图片必须有4个通道(RGBA),即RGB三颜色图层加上alpha透明度图层。
5、不属于角色身体的像素必须设定为(0,0,0,0)。
原始图片的生成给出了推荐使用的网站https://waifulabs.com,一个被称之为老婆生成器的网站。不幸的是,这个网站处于墙外,因此想要使用这个网站会需要一些大家都懂的神秘工具。
整个网页的操作非常直观明了,看一眼就知道怎么用了。
不幸的是,当你捏完了自己的美少女立绘并且保存到本地之后,却发现这个图片是400x400的,而且各种意义上都和你需要的输入图片格式完全不符。
因此,这张图片还需要一些后期加工才能真正派上用场,于是开始写一个python脚本来将网站生成的图片自动调整到与测试用图相似的形态你甚至连手动抠一下图都不想干吗。
新建一个adjust_png.py的文件,并写入代码:
import numpy as np
import cv2
from scipy.spatial.distance import cdist
# ------------------------- start config -------------------------
# 配置RGB三色和小于多少的点被设置为不透明
# 根据具体图片自行调配
threshold = 750
# 配置左侧增加多少空白
L_add = 60
# 配置右侧增加多少空白
R_add = 60
# 配置上方增加多少空白
U_add = 140
# -------------------------- end config --------------------------
# 获取输入文件名
input_path = input("请输入你的输入文件名(不包括后缀名):") + ".png"
# 读取图片
img = cv2.imread(input_path,1)
while (img == None).all():
print("图片名错误,请重新输入")
input_path = input("请输入你的输入文件名(不包括后缀名):") + ".png"
img = cv2.imread(input_path,-1)
# 获取输出文件名
output_path = input("请输入你的输出文件名(不包括后缀名):") + ".png"
# 将图片扩大到与测试样图类似的形态
# 左侧扩展
L_expand = np.ones([img.shape[0],L_add,3], dtype="uint8")*255
img = np.hstack([L_expand,img])
# 右侧扩展
R_expand = np.ones([img.shape[0],R_add,3], dtype="uint8")*255
img = np.hstack([img, R_expand])
# 上方扩展
U_expand = np.ones([U_add,img.shape[1],3], dtype="uint8")*255
img = np.vstack([U_expand, img])
# 修改为256x256
img = cv2.resize(img,(256,256))
# 新建alpha图层
A = np.zeros(img.shape[:2], dtype="uint8")
for i in range(img.shape[0]):
for j in range(img.shape[1]):
# 对三色值之和小于阈值的点,设置为不透明
if img[i][j].sum() < threshold:
A[i][j] = 255
# 对透明的点,将三颜色都设置为0
else:
img[i][j][0] = 0
img[i][j][1] = 0
img[i][j][2] = 0
# 生成带有透明图层的四通道输出图片
(B, G, R) = cv2.split(img)
img = cv2.merge([B, G, R, A])
# 输出图片
cv2.imwrite(output_path,img)
放入这个大佬的项目里面,然后生成可动模型,想必效果一定很……
Nice!
PS:之前的图片修改代码中出现了一个bug(忘了把全透明区域的三颜色通道也改为0),导致最终效果直逼鬼片,现在已经修复。