【情人节特辑】:虚拟女友教你如何正确“回答”
该项目旨在通过技术手段将“直男话术”转化为高情商表达,以增进情侣感情。其核心是让虚拟女友纠正不当话语,具体步骤如下:首先,输入直男语句(如“多喝热水”)转换为对应编号的高情商表达;接着用Pixel2Pixel模型将卡通照片真人化;再将真人化照片输入PaddleBoBo生成女友动画;最后让虚拟女友纠正话语。项目需32GB以上显卡环境,依赖相关模型和工具实现。

虚拟女友纠正话语器
情侣之间相处少不了摩擦,但是据发现很多不必要的吵架,往往是词不达意造成的。比如关心她的身体健康,要注意身体,往往就只说了句“多喝热水”。如果换成另外一种表达,会让对方更容易接受,也更容易接收你给的爱意。因此“会说话”就变得十分重要了。这个项目就给大家一个初步的示范,怎么样的高情商的回答会让这段感情升温。
免费影视、动漫、音乐、游戏、小说资源长期稳定更新! 👉 点此立即查看 👈
主要内容借鉴了我之前的项目:打造一个专属自己的卡通真人化主播
例如输入这张照片以及直男话术,你觉得会呈现出什么效果的视频呢?(doge)

直男语句:多喝热水。
效果展示
整体实现:
1.输入直男话语切换成高情商语句
2.利用Pixel2Pixel模型实现卡通照片真人化
3.把真人化输出的照片输入进PaddleBoBo生成女友动画
4.让虚拟女友纠正你的话语
PS:执行此项目请使用32GB显卡以上环境(看PaddleBoBo作者项目有提到,用16GB会爆内存导致跑不通,且本次项目也是在32GB显卡环境上制作的)
第一步、输入直男话语切换成高情商语句
请记住生成的编号等等用得着
In [ ]huashu_dict={'多喝热水':'a', '你怎么又生气了':'b', '你又怎么了':'c', '你要这样想我也没办法':'d', '随便你!你定吧':'e', '哦':'f'}#请输入上面指定语句(粗糙版,请大家多多包涵)a = input('请输入直男语句:'+'\n')if a in huashu_dict: print('已生成合适的话术'+'\n'+'请记住生成编号'+':'+huashu_dict.get(a))else: print('不好意思,这句话我还没学会呢。')登录后复制请输入直男语句:已生成合适的话术请记住生成编号:a登录后复制
第二步、利用Pixel2Pixel模型实现卡通照片真人化
主要是修改 image_name='01503.webp',改成自己心仪的动漫照片(最好使用逆向思维:卡通照片真人化项目里面数据集的照片文件,其他动漫照片生成效果不好看,我不负责的哈)
In [ ]import paddleimport paddle.nn as nnfrom paddle.io import Dataset, DataLoaderimport osimport cv2import numpy as npfrom tqdm import tqdmimport matplotlib.pyplot as pltimport PIL.Image as Image%matplotlib inlineclass UnetGenerator(nn.Layer): def __init__(self, input_nc=3, output_nc=3, ngf=64): super(UnetGenerator, self).__init__() self.down1 = nn.Conv2D(input_nc, ngf, kernel_size=4, stride=2, padding=1) self.down2 = Downsample(ngf, ngf*2) self.down3 = Downsample(ngf*2, ngf*4) self.down4 = Downsample(ngf*4, ngf*8) self.down5 = Downsample(ngf*8, ngf*8) self.down6 = Downsample(ngf*8, ngf*8) self.down7 = Downsample(ngf*8, ngf*8) self.center = Downsample(ngf*8, ngf*8) self.up7 = Upsample(ngf*8, ngf*8, use_dropout=True) self.up6 = Upsample(ngf*8*2, ngf*8, use_dropout=True) self.up5 = Upsample(ngf*8*2, ngf*8, use_dropout=True) self.up4 = Upsample(ngf*8*2, ngf*8) self.up3 = Upsample(ngf*8*2, ngf*4) self.up2 = Upsample(ngf*4*2, ngf*2) self.up1 = Upsample(ngf*2*2, ngf) self.output_block = nn.Sequential( nn.ReLU(), nn.Conv2DTranspose(ngf*2, output_nc, kernel_size=4, stride=2, padding=1), nn.Tanh() ) def forward(self, x): d1 = self.down1(x) d2 = self.down2(d1) d3 = self.down3(d2) d4 = self.down4(d3) d5 = self.down5(d4) d6 = self.down6(d5) d7 = self.down7(d6) c = self.center(d7) x = self.up7(c, d7) x = self.up6(x, d6) x = self.up5(x, d5) x = self.up4(x, d4) x = self.up3(x, d3) x = self.up2(x, d2) x = self.up1(x, d1) x = self.output_block(x) return xclass Downsample(nn.Layer): # LeakyReLU => conv => batch norm def __init__(self, in_dim, out_dim, kernel_size=4, stride=2, padding=1): super(Downsample, self).__init__() self.layers = nn.Sequential( nn.LeakyReLU(0.2), nn.Conv2D(in_dim, out_dim, kernel_size, stride, padding, bias_attr=False), nn.BatchNorm2D(out_dim) ) def forward(self, x): x = self.layers(x) return xclass Upsample(nn.Layer): # ReLU => deconv => batch norm => dropout def __init__(self, in_dim, out_dim, kernel_size=4, stride=2, padding=1, use_dropout=False): super(Upsample, self).__init__() sequence = [ nn.ReLU(), nn.Conv2DTranspose(in_dim, out_dim, kernel_size, stride, padding, bias_attr=False), nn.BatchNorm2D(out_dim) ] if use_dropout: sequence.append(nn.Dropout(p=0.5)) self.layers = nn.Sequential(*sequence) def forward(self, x, skip): x = self.layers(x) x = paddle.concat([x, skip], axis=1) return x#实例化生成器generator = UnetGenerator()#加载权重last_weights_path = 'data/data148534/epoch100.pdparams'print('加载权重:', last_weights_path)model_state_dict = paddle.load(last_weights_path)generator.load_dict(model_state_dict)generator.eval()#读取数据image_name='01503.webp'img_A2B = cv2.imread('work/'+image_name)img_A = img_A2B[:, 256:] # 卡通图(即输入)img_B = img_A2B[:, :256] # 真人图(即预测结果)g_input = img_A.astype('float32') / 127.5 - 1 # 归一化g_input = g_input[np.newaxis, ...].transpose(0, 3, 1, 2) # NHWC -> NCHWg_input = paddle.to_tensor(g_input) # numpy -> tensorg_output = generator(g_input)g_output = g_output.detach().numpy() # tensor -> numpyg_output = g_output.transpose(0, 2, 3, 1)[0] # NCHW -> NHWCg_output = g_output * 127.5 + 127.5 # 反归一化g_output = g_output.astype(np.uint8)#只保存生成真人图像img = np.asarray(g_output).copy()img = Image.fromarray(cv2.cvtColor(img,cv2.COLOR_BGR2RGB))# cv2 to Imageimg.save('work/'+'output_'+image_name)img_show = np.hstack([img_A, g_output])[:,:,::-1]plt.figure(figsize=(8, 8))plt.imshow(img_show)plt.show()登录后复制/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/__init__.py:107: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working from collections import MutableMapping/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/rcsetup.py:20: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working from collections import Iterable, Mapping/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/colors.py:53: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working from collections import SizedW0728 22:24:44.614435 192 gpu_resources.cc:61] Please NOTE: device: 0, GPU Compute Capability: 7.0, Driver API Version: 11.2, Runtime API Version: 10.1W0728 22:24:44.619457 192 gpu_resources.cc:91] device: 0, cuDNN Version: 7.6.登录后复制
加载权重: data/data148534/epoch100.pdparams登录后复制
/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/cbook/__init__.py:2349: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working if isinstance(obj, collections.Iterator):/opt/conda/envs/python35-paddle120-env/lib/python3.7/site-packages/matplotlib/cbook/__init__.py:2366: DeprecationWarning: Using or importing the ABCs from 'collections' instead of from 'collections.abc' is deprecated, and in 3.8 it will stop working return list(data) if isinstance(data, collections.MappingView) else data登录后复制
登录后复制
效果展示

变身!!!

第三步、把真人化输出的照片输入进paddlebobo生成虚拟女友动画
3.1解压压缩包
In [11]!tar xzvf bobo.tar.gz PaddleBoBo data nltk_data work登录后复制
3.2安装PaddleGAN和PaddleSpeech依赖
In [ ]#这一步执行时间会比较久!pip install ppgan paddlespeech登录后复制
3.3动漫真人化图像生成虚拟女友动画
这一步用到了default.yaml的配置文件,如果你只是尝试的话使用默认配置即可,如果你需要生成另一个人像,请修改default.yaml配置。主要是修改输入照片的位置:PaddleBoBo/default.yaml 里面的FOM_INPUT_IMAGE: '/home/aistudio/work/output_01503.webp'
In [ ]%cd PaddleBoBo!python create_virtual_human.py --config default.yaml登录后复制
第四步、让虚拟女友纠正你的话语
--text 请输入之前生成的编号
In [ ]!python general_demo.py --human ./file/input/test.mp4 --output ../output.mp4 --text a登录后复制
效果展示
相关攻略
常见报错解析:“Access Not Configured”故障排除指南 许多开发者和团队成员在使用OpenClaw集成飞书时,都曾遭遇过一个典型的中断提示:“access not configured”(访问未配置)。该提示会明确显示您的飞书账户ID及一组唯一的配对验证码,并指出需要联系机器人所有
OpenClaw 常用指令大全与使用详解 openclaw status:此命令是查看OpenClaw系统整体健康状态的核心指令,执行后即获取服务运行状况的全面报告,是日常运维的首要诊断工具。 openclaw gateway restart:在修改网关配置后,必须运行此指令以重启网关服务,使配置文
如何通过 OpenClaw 实现 Chrome 浏览器自动化操控 在软件开发与自动化测试领域,持续学习是常态。本文旨在详细介绍如何利用 OpenClaw 连接并控制一个已开启的 Chrome 浏览器实例,实现点击、文本输入、文件上传、页面滚动、屏幕截图以及执行 JavaScript 等自动化操作。整
项目概述 你是否希望将强大的 AI 助手带入日常聊天?本教程将指导你完成搭建流程,让你能在 QQ 上直接调用 OpenClaw 智能助手,实现无门槛的 AI 对话体验。 架构说明 ┌─────────────┐ ┌──────────────┐ ┌─────────────┐ │ QQ 用户 │ ─
一 下载并安装Node js,全程保持默认设置 首先,请前往Node js官方网站的下载中心:https: nodejs org zh-cn download。根据您的操作系统(Windows Mac Linux)下载对应的安装程序。运行安装向导时,整个过程非常简单,您只需连续点击“下一步”按钮
热门专题
热门推荐
《逸剑风云决》叶飞支线任务全攻略:触发条件与莲心湖位置详解 不少《逸剑风云决》玩家在推进支线任务时,常会困惑于叶飞角色的触发条件。尤其是在到达莲心湖地图后,许多玩家反复探索却无法找到叶飞,“莲心湖找不到叶飞”已成为常见问题。实际上,这并非游戏BUG,而是一系列精密的剧情前置要求未被满足。本指南将系统
《永恒树之歌:创世》世界种子攻略:获取方法、选址布局与高效家园建设指南 初次来到《永恒树之歌:创世》的阿莱瑞亚大陆,面对这片等待复苏的丰饶世界,你需要掌握的第一个核心机制就是“世界种子”。这款以自然共生与家园重建为主题的治愈系模拟经营游戏中,世界种子不仅是开启建设的钥匙,更是决定未来发展潜力的基石。
《纪念碑谷3》全章节图文攻略:从灯塔解密到莲花祭坛的完整流程解析 备受期待的视觉解谜游戏《纪念碑谷3》延续了系列标志性的极简美学与沉浸式空间叙事。游戏关卡设计由浅入深,即便是新手也能快速掌握核心机制,逐步建立对空间变换与机关互动的直觉。近期,“纪念碑谷3怎么通关”、“第三章攻略”、“莲花机关怎么过”
速览 你是否正在寻找《红色沙漠》中最强装备升级的关键材料——动力核心?本指南将为你精准揭秘动力核心的唯一高效获取途径:击败强大的阿比斯生命体。我们将详解如何根据不同核心定位特定目标怪物,传授运用法则之力的实战击杀技巧,并分享一个关键的核心掉落「S L小技巧」,助你系统性地提升收集效率,快速武装你的角
速览 在《红色沙漠》中,影子森林遗迹以其复杂的内部结构,成为许多玩家挑战的难点区域。解谜的关键路径其实并不复杂:首先我们需要前往阿方索领地,在此区域仔细探索,找到并触发一个被称为“可疑气息”的交互点,这即是通往遗迹内部的入口。进入遗迹后,最引人注目的便是那个被大量古老树藤严密包裹的核心机关。此时,玩





