墨香戏韵,重塑经典|基于AIGC对戏剧创新
京剧作为中国传统戏曲之一,源远流长,承载了丰富的文化内涵和艺术特色。水墨画则是中国传统绘画的瑰宝,以其独特的墨色表达和极简的形式赢得了广泛的赞誉。我们的项目将这两种艺术形式巧妙地结合,通过技术手段将京剧人物与水墨画风格融合在一起,创造出令人惊艳的视觉效果,并以视频表演的形式展现出来,呈现独特的视觉和艺术效果,通过创新的技术手段和文化表达方式,弘扬传统文化、提高对京剧和水墨的认识,并增强大家对传统文化的自信心。
大家可以看一下我做的调查问卷结果(这也正说明了戏曲创新的必要性):
In [ ]
- #安装paddlehub及其模型
- !pip install paddlehub
- # 下载模型
- %%capture
- !hub install stylepro_artistic==1.0.1
In [4]
- import paddlehub as hub
- from PIL import Image
- import numpy as np
- import matplotlib.pyplot as plt
-
- # 设置中文字体和编码
- #plt.rcParams['font.sans-serif']=['Microsoft YaHei']
-
-
- #输入源图片与风格图片
- picture = '/home/aistudio/work/image_source.jpg'
- style_image = '/home/aistudio/work/style.png'
-
- #选择
-
- stylepro_artistic = hub.Module(name="stylepro_artistic")
-
-
- #使用Pillow库的convert方法将图像转换为RGB模式,以确保通道数始终为3,不然会报错因为输入图像和风格图像的通道数不匹配引起的。
- #根据提示的错误信息,输入图像的通道数为4,而风格图像的通道数为3。风格迁移模型要求输入的图像通道数与风格图像的通道数一致。
- content_image = Image.open(picture).convert('RGB')
- style_image = Image.open(style_image).convert('RGB')
-
- #因为风格迁移模型要求传递的是图像的数组。
- # 将图像转换为NumPy数组
- content_image = np.array(content_image)
- style_image = np.array(style_image)
-
- # 进行风格迁移
- images = [
- {
- 'content': content_image, # 内容图像
- 'styles': [style_image], # 风格图像
- 'weights': [0.3] # 风格图像的权重
- }
- ]
-
- result = stylepro_artistic.style_transfer(
- images=images,
- visualization=True
- )
-
- #result = stylepro_artistic.style_transfer(images=[{'content': content_image, 'styles': [style_image]}], visualization=True)
- !mv ./transfer_result/* ./transfer_result.jpg
- !rm -rf ./transfer_result
- !mv ./transfer_result.jpg ./output/transfer_result.jpg
-
- fig, axes = plt.subplots(1, 3, figsize=(12, 4))
-
- # 图像文件路径
- image_paths = [
- '/home/aistudio/work/image_source.jpg',
- '/home/aistudio/work/style.png',
- './output/transfer_result.jpg'
- ]
-
- # 标题 (该处我尝试了给中文标题但是显示不出来,大家感兴趣可以自己研究研究#plt.rcParams['font.sans-serif']=['Microsoft YaHei'])
- titles = [
- 'Original Image',
- 'Style Reference Image',
- 'Output Result'
- ]
-
- for i, ax in enumerate(axes):
- ax.set_title(titles[i])
- ax.axis('off')
- ax.imshow(plt.imread(image_paths[i]))
-
- print("图片保存路径为/home/aistudio/output/transfer_result.jpg")
- # plt.tight_layout()
- # plt.show()
- # plt.savefig('output/output.jpg')
[2024-06-09 19:23:07,856] [ WARNING] - The _initialize method in HubModule will soon be deprecated, you can use the __init__() to handle the initialization of the object
Notice: an image has been proccessed and saved in path "/home/aistudio/transfer_result/ndarray_1717932199.3267796.jpg". 图片保存路径为/home/aistudio/output/transfer_result.jpg
First Order Motion model的任务是image animation,给定一张源图片,给定一个驱动视频,生成一段视频,其中主角是源图片,动作是驱动视频中的动作,源图像通常包含一个主体,驱动视频包含一系列动作。
In [ ]
- # 从github上克隆PaddleGAN代码
- # 从github上克隆PaddleGAN代码(如下载速度过慢,可用gitee源)
- !git clone https://gitee.com/paddlepaddle/PaddleGAN
- #!git clone https://github.com/PaddlePaddle/PaddleGAN
-
- # 安装所需安装包
- %cd PaddleGAN/
- !pip install -r requirements.txt
- !pip install imageio-ffmpeg
- !pip install ppgan
In [ ]
- # 生成的结果保存的路径如下 ---> /home/aistudio/PaddleGAN/applications/output/result.mp4
- %cd /home/aistudio/PaddleGAN/applications/
- !mkdir output
- !export PYTHONPATH=$PYTHONPATH:/home/aistudio/PaddleGAN && python -u tools/first-order-demo.py --driving_video ~/work/京剧.MP4 --source_image ~/work/京剧.png --relative --adapt_scale
- print("生成的视频路径/home/aistudio/PaddleGAN/applications/output/result.mp4")
In [ ]
- #使用moviepy为生成的视频加上音乐
- !pip install moviepy
In [ ]
- #为生成的视频加上音乐 保存的路径为 ----> /home/aistudio/PaddleGAN/applications/output/京剧result.mp4
- from moviepy.editor import *
-
- # videoclip_1放入想要加入的音频视频文件后续会提取音频。
- videoclip_1 = VideoFileClip("/home/aistudio/work/京剧.MP4")
- # videoclip_2 放入上述生成的无声视频。
- videoclip_2 = VideoFileClip("./output/result.mp4")
-
- audio_1 = videoclip_1.audio
-
- videoclip_3 = videoclip_2.set_audio(audio_1)
-
- videoclip_3.write_videofile("./output/京剧result.mp4", audio_codec="aac")
-
-
- print("添加音频后的视频路径为/home/aistudio/PaddleGAN/applications/output/京剧result.mp4")
Wav2lip模型原理
Wav2Lip的实现过程可以分为以下几个步骤:
声音特征提取:首先,Wav2Lip使用语音识别模型(如DeepSpeech)从输入的声音中提取出声音特征。这些特征描述声音的频谱和时域信息。
嘴部动作提取:接下来,Wav2Lip使用面部关键点检测器(如FaceMesh)从一段视频中提取嘴部动作的关键点位置。这些关键点描述了嘴唇的形状和运动。
嘴部动作对齐:为了将声音和嘴部动作进行关联,Wav2Lip使用一种嘴部动作对齐算法,在时间上对齐声音特征和嘴部动作。这样就能够确保声音和嘴部动作在时间上是同步的。
人脸图像生成:最后,Wav2Lip使用对抗生成网络(GAN)来生成与声音相匹配的人脸图像。GAN包括生成器和鉴别器两个部分。生成器接受声音特征和嘴部动作,并生成与之相匹配的人脸图像。鉴别器则尝试判断生成的人脸图像是否真实。通过生成器和鉴别器之间的博弈,Wav2Lip可以生成逼真的人脸图像。
总的来说,Wav2Lip利用语音和嘴部动作之间的联系,将声音特征与嘴部动作对齐,并使用生成对抗网络生成与声音相匹配的人脸图像。这种模型在实现语音合成和嘴唇同步方面具有较好的效果。
In [ ]
- #face: 原始视频,视频中的人物的唇形将根据音频进行唇形合成--通俗来说,是你想让那个照片动起来。
- #audio:驱动唇形合成的音频,视频中的人物将根据此音频进行唇形合成--通俗来说,想让这个人怎么说。
-
- %cd /home/aistudio/PaddleGAN/applications/
- !python tools/wav2lip.py \
- --face /home/aistudio/43.jpeg \
- --audio /home/aistudio/京剧.m4a\
- --outfile /home/aistudio/output/pp_put.mp4 \
- --face_enhancement
-
- print("保存的路径为/home/aistudio/output/pp_put.mp4")