飞桨,请给我来个表情

  • 项目背景

在互联网飞速发展的时代,我们的交流方式不断地创新与迭代,这是不可逆转的趋势。我们正是这时代中的一员,以年轻的心,张扬个性。在平时生活中,线上聊天也必不可少。如何成为群里最靓的仔呢?可以试试飞桨,定制自己的专属表情!话不多说,先上效果图。

图1为原图,图2为生成图

项目地址:

https://aistudio.baidu.com/aistudio/projectdetail/1517247

  • 项目算法简介

此项目使用了三个模型,分别为FastSpeech、Wav2Lip和HumanSeg。接下来,我们一起了解一下这些模型。

第一个模型:FastSpeech(文字转语音),它是一种高保真文字转语音的模型。本文中使用的是飞桨语音合成套件Parakeet中的FastSpeech,该模型中的声码器用的是百度研究提出的WaveFlow。相较于其它模型,WaveFlow更轻量、质量更高。

  • FastSpeech模型解析图

FastSpeech论文链接:

https://arxiv.org/abs/1905.09263
WaveFlow算法介绍链接:

https://arxiv.org/abs/1912.01219
Parakeet项目地址:

https://github.com/PaddlePaddle/Parakeet/tree/release/v0.1

第二个模型:Wav2Lip(唇形合成)。这是基于PaddleGAN(生成对抗网络)的一个模型,可以根据音频生成与音频同步的人物唇形,使得生成的视频人物唇形与输入音频同步。

Wav2Lip模型解析图

PaddleGAN项目地址:

https://github.com/PaddlePaddle/PaddleGAN

第三个模型:HumanSeg(人像分割),全称为Human Segmentation。这是基于飞桨PaddlePaddle开发的模型,有三种模型可选。因为我们需要高精度分割人像,所以我们就选择了HumanSeg-server,这种高精度模型,适用于服务端GPU且背景复杂的人像场景。

HumanSeg模型解析图

PaddleSeg项目地址:

https://github.com/PaddlePaddle/PaddleSeg

HumanSeg-server在PaddleHub库的地址:

https://www.paddlepaddle.org.cn/hubdetail?name=humanseg_server&en_category=ImageSegmentation

项目的实现过程

流程图

通过流程图可以发现,我们的目的是将一张图片变成一张动图,而且越简便越好。我们可以使用Wav2Lip,将图片变成动图,又因为Wav2Lip需要一段音频来进行唇形迁移,所以我选用了FastSpeech来提供这段音频,只需要一段文字就OK了,提高实用性和易操作性。

因为FastSpeech是Parakeet的一个模型,用户需安装Parakeet后使用该模型。不过,安装Parakeet前,先要安装libsndfile1。需要注意的是,AI Studio已经自带libsndfile1了,所以在AI Studio上运行时,用户直接安装Parakeet就OK了!另外,release/v0.1中才有FastSpeech,release/v0.2中则没有FastSpeech。主要参数解析如下:

--use_gpu

选择是否选择GPU进行运行

--output

输出地址

--text_input

文本的地址

%run synthesis.py \--use_gpu=1 \--alpha=1.0 \--checkpoint='./fastspeech_ljspeech_ckpt_1.0/step-162000' \--config='./fastspeech_ljspeech_ckpt_1.0/ljspeech.yaml' \--output='./synthesis' \--vocoder='waveflow' \--config_vocoder='./waveflow_res128_ljspeech_ckpt_1.0/waveflow_ljspeech.yaml' \--checkpoint_vocoder='./waveflow_res128_ljspeech_ckpt_1.0/step-2000000' \--text_input='/home/aistudio/article.txt'

我在写这段代码的时候,非常轻松,因为Parakeet的GitHub上已经附有详细的说明,只需要微调一下即可。

为了提高项目的实用性,我将Parakeet进行改写,把原有只能合成一段话,改为可以将一个文本文档内所有文字转为音频。

--text_input='/home/aistudio/article.txt'

更改前的代码[synthesis.py]:

text = np.asarray(text_to_sequence(text_input))
text = np.expand_dims(text, axis=0)
pos_text = np.arange(1, text.shape[1] + 1)
pos_text = np.expand_dims(pos_text, axis=0)

更改后的代码[synthesis.py]:

for i,line in enumerate(open(args.text_input)): text_input = linetext = np.asarray(text_to_sequence(text_input))text = np.expand_dims(text, axis=0)pos_text = np.arange(1, text.shape[1] + 1)pos_text = np.expand_dims(pos_text, axis=0)

因为文本文档不单有一行文字,所以我们需要将每一行文字分开合成音频,而后用FFMpeg将所有音频合成一段音频。这样的方式提高了对文本的操作性,也方便后续使用。通过“!ffmpeg -f concat -i waveflow_article3.txt -c copy ‘waveflow_article3.wav’”,我们就完成了第一步,生成了一段朗读文本的音频。

在进行第二步时,要对文件进行处理。音频在上文已经生成好了,接下来就是要生成一段视频。这段视频直接用一张图片生成。因篇幅有限,就不具体介绍将图片合成视频的操作了,相关信息可以查看项目combine_image_to_video函数。

注意:Wav2Lip模型支持单张静态图片和动态视频两种输入,用户可以根据需要自行选择。

文件处理结束后,视频和音频都有了,接下来使用Wav2Lip进行迁移就OK了。

使用Wav2Lip的语句解析:

!export PYTHONPATH=$PYTHONPATH:/home/aistudio/PaddleGAN && python /home/aistudio/PaddleGAN/applications/tools/wav2lip.py --face <视频地址> --audio <音频地址> --outfile <输出地址>

这里我们没有特殊场景,直接使用预训练模型能让我们更快地得出结果,GitHub的介绍文件中有详细的使用说明。

完成第二步后,我们已经得到了一个“嘴巴会动”的视频。为了使成品更加完美,我们要将视频的背景去除掉。因为HumanSeg已经被飞桨团队封装成PaddleHub的一个模型,因此,模型使用起来非常方便。与此同时,在不用训练的情况下,节省了开发成本和开发时间,还可以直接将视频每帧的人物与背景分割,且将每帧画面还原成一个mp4文件。所以,我在本项目中直接选用了PaddleHub上的代码。

human_seg = hub.Module(name='humanseg_server')
cap_video = cv2.VideoCapture('/home/aistudio/work/img2video/video2.mp4')
fps = cap_video.get(cv2.CAP_PROP_FPS)
save_path = '/home/aistudio/work/img2video/video3.mp4'
width = int(cap_video.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap_video.get(cv2.CAP_PROP_FRAME_HEIGHT))
cap_out = cv2.VideoWriter(save_path, cv2.VideoWriter_fourcc('M', 'J', 'P', 'G'), fps, (width, height))
prev_gray = None
prev_cfd = Nonewhile cap_video.isOpened():ret, frame_org = cap_video.read()if ret:[img_matting, prev_gray, prev_cfd] = human_seg.video_stream_segment(frame_org=frame_org, frame_id=cap_video.get(1), prev_gray=prev_gray, prev_cfd=prev_cfd)img_matting = np.repeat(img_matting[:, :, np.newaxis], 3, axis=2)bg_im = np.ones_like(img_matting) * 255comb = (img_matting * frame_org + (1 - img_matting) * bg_im).astype(np.uint8)cap_out.write(comb)else:breakcap_video.release()
cap_out.release()

经过三个模型的处理,我们与最终的成品只剩一步之遥。在最后一步中,我们需要将视频(.mp4)文件转为动图(.gif)文件。

import moviepy.editor as mpy
content = mpy.VideoFileClip("/home/aistudio/work/img2video/video3.mp4")
content.write_gif("/home/aistudio/work/img2video/final.gif")

最终,我们得到了一张动图,可以在相关社交媒体中直接作为表情使用。

除了生成表情,飞桨还能做啥?

用户可以通过PaddleSeg-Fast-SCNN(快速语义分割网络)进行实时分割环境

用户也可以用PaddleGAN修复旧视频
项目地址:
https://aistudio.baidu.com/aistudio/projectdetail/1499994

飞桨还有许多有趣的功能,小伙伴们可以自行探索~

总结

此项目融合了多种模型——Fastspeech、Wav2Lip、HumanSeg,分别展示了飞桨框架中音频、生成对抗网络、图像分割的强大实力,也解决了宅友们想自制表情的烦恼。飞桨的预训练模型,降低了AI学习的门槛,让初学者更好地感受到飞桨的魅力,也让AI不断地造福我们的生活。

在这个项目中,我采用def函数的方式,将模型进行封装,提高代码的模块性,也让像我一样初出茅庐的小伙伴更好地读懂代码。

如在使用过程中有问题,可加入官方QQ群进行交流:778260830。

如果您想详细了解更多飞桨的相关内容,请参阅以下文档。

·飞桨官网地址·
https://www.paddlepaddle.org.cn/

·飞桨开源框架项目地址·
GitHub: https://github.com/PaddlePaddle/Paddle
Gitee: https://gitee.com/paddlepaddle/Paddle

图片

飞桨,请给我来个表情相关推荐

  1. 七夕礼物没送对?飞桨PaddlePaddle帮你读懂女朋友的小心思

    本文作者:飞桨工程师 量子位 转载 | 公众号 QbitAI 七夕节,广大的钢铁直男们,你们给女朋友的礼物买对了么? "女孩儿的心思男孩你别猜,你猜来猜去也猜不明白.不知道她为什么掉眼泪,也 ...

  2. 百度BML飞桨训练营(十)面部表情迁移PaddleGAN--蒙娜丽莎在微笑

    百度BML&飞桨训练营(十)面部表情迁移PaddleGAN–蒙娜丽莎在微笑 (1).蒙娜丽莎动态表情迁移 第一步:配置Notebook 1.创建Notebook任务,点击配置 开发语言:Pyt ...

  3. 【飞桨PaddlePaddle】四天搞懂生成对抗网络(一)——通俗理解经典GAN

    ​​​​ 序言 做图像分类.检测任务时,为了提高模型精度,在数据处理方面,我尝试了很多数据增强tricks(包括了简单的裁切.变形.明暗.颜色调整,也包括了MixUp图像融合以及SMOTE这样的解决类 ...

  4. 从00后小学生到童心工程师:让我们荡起“飞桨”,共度快乐六一

    本文已在飞桨公众号发布,查看请戳链接: 从00后小学生到童心工程师:让我们荡起"飞桨",共度快乐六一 当AI技术以各种形态进入大众视野,早已不再停留在概念层面,它不断展现着令人愈发 ...

  5. 书画家点赞!基于飞桨绘制中国水墨山水画

    项目简介 水墨画是中国画的一个分支,水墨山水就是纯用水墨不设颜色的山水画体.其相传始于唐,成于宋,盛于元,明清两代有所发展.作画讲究立意隽永,气韵生动,形成了整套以水墨为主体的表现技法.其笔法糸以勾斫 ...

  6. 5大典型模型测试单机训练速度超对标框架,飞桨如何做到?

    导读:飞桨(PaddlePaddle)致力于让深度学习技术的创新与应用更简单.在单机训练速度方面,通过高并行.低开销的异步执行策略和高效率的核心算子,优化静态图训练性能,在Paddle Fluid v ...

  7. 揭晓飞桨平台提速秘诀:INT8量化加速实现“事半功倍”

    为帮助广大企业和开发者更加便捷和快速地创建深度学习应用,百度飞桨正不断地提升平台的训练和推理能力,并与英特尔紧密合作,在至强® 平台集成的AI加速能力的支持下,以 INT8 量化方案,在不影响预测准确 ...

  8. 精度45.9%,推理速度72.9FPS,百度飞桨推出工业级目标检测模型 PP-YOLO

    允中 发自 凹非寺 量子位 编辑 | 公众号 QbitAI 工业视觉.自动驾驶.安防.新零售等我们身边熟知的各行各业都需要目标检测技术,由于其很好的平衡了标注成本.检测精度和速度等,成为当前智能制造产 ...

  9. 飞桨深度学习开源框架2.0抢先看:成熟完备的动态图开发模式

    百度飞桨于近期宣布,深度学习开源框架2.0抢先版本正式发布,进入2.0时代.其中一项重大升级,就是推出更加成熟完备的命令式编程模式,即通常说的动态图模式.同时在该版本中将默认的开发模式定为动态图模式, ...

最新文章

  1. [JAVAEE] Thymeleaf 基本语法: form相关标签
  2. 【云周刊】第146期:史上最大规模人机协同的双11,12位技术大V揭秘背后黑科技...
  3. Linux学习笔记8——VIM编辑器的使用
  4. matlab输入数组出曲线,用鼠标画出曲线,并将曲线所经过的点保存到数组中
  5. mysql5.7.19 创建用户_mysql5.7.19用户的创建和权限的操作
  6. 三只松鼠:阿里云数据中台基座上的多渠道、多业态生长
  7. 计算机发展趋势是规格化,2016年春季计算机应用基础月考卷(4月).doc
  8. SPOJ QTREE
  9. Spring基础系列-AOP源码分析
  10. 深入浅出mysql_深入浅出MySQL读书笔记(一)
  11. 用elasticsearch和nuxtjs搭建bt搜索引擎
  12. 程序员买啥游戏机,自己动手做一个体感小游戏
  13. 24个希腊字母 大小写 读音
  14. 社科院与杜兰大学金融管理硕士项目——有规划的人生值得期待,你当下的规划是什么呢
  15. **matlab中hold on 和hold off用法**
  16. Python 伪开发者对于搜狐云景的测评
  17. 四个模型与指标体系的建立
  18. Spring IOC系列学习笔记五:context:component-scan 节点解析
  19. python遗传算法(应用篇1)--求解一元函数极值
  20. Win10怎样设置日历事件提醒

热门文章

  1. ubuntu开机出现started gnome Display manager等错误的方法
  2. 如何找到那些网红赚钱的密码?
  3. [ZOJ3983]2017CCPC秦皇岛站C - Crusaders Quest(克鲁赛德战记)
  4. 1311 - 【入门】分跳绳
  5. 网络程序之TCP、UDP篇(其一)
  6. 苹果App Store申请和管理
  7. centOS7+Samba服务器配置
  8. Visual Studio手动升级旧版本程序
  9. Python最重要的知识:字符串教程
  10. 浪潮通软2012年社招二期用人目录