随着人工智能技术的不断迭代发展,数字人类的开发和应用需求也与日俱增,随着大型语言模型的发展,数字人类也更加智能。 虚拟客服:数字人可以通过语音或文字与用户互动,提供客服等支持,从而取代传统的人工客服。 虚拟购物助手:数字人可以通过语音或文字与用户互动,为用户提供购物建议和推荐,从而改善用户的购物体验。 虚拟教师:数字人可以通过语音或文本与学生互动,为学生提供个性化的教育服务。 虚拟医生:数字人可以通过语音或文字与患者互动,为患者提供医疗咨询和诊断服务。
本开发教程将使用 Ernie Bot SDK 作为语言交互的基础,结合 Stable Diffusion、Paddlegan、Edge TTS 等技术,实现数字诗人的实时交互,提升诗歌的表现力。 本教程分为 4 个部分:自定义语音、自定义建模、生成数字人和数字人语音聊天。
自定义数字人声
生成诗歌:Ernie Bot SDK
安装 ERNie Bot SDK,根据用户输入的描述符或主题生成七字诗。
!pip install --upgrade erniebot
import erniebotdef wx_api(prompt):
# list supported models
models = erniebot.model.list()
print(models)
erniebot.api_type = "aistudio"
erniebot.access_token = "请输入您自己的令牌"令牌**,如下所示。
ernie-bot-turbo 更快。
response = erniebot.chatcompletion.create(model="ernie-bot-turbo", messages=["}])
answer = response.result
return answer
诗歌。 def poetry(prompt):
answer = wx_api( f"你是一位伟大的诗人,请写一首七字的绝句来描述以下场景:")
print("{} 诗歌反馈:{}".format(prompt, answer))
return answer
poetry("**天津***世博会。 ")
生成声音:Edge TTS
将 Ernie Bot SDK 生成的诗歌转换为声音。
!pip install edge_tts -ipip install librosa==0.8.1
import librosa自定义数字人像数字人的静态图像可以上传**,也可以通过稳定扩散直接生成。import os
boot_path = '/home/aistudio/gradio_packages/'
sound_path = os.path.join(boot_path,'file/sound.w**')
text = "机场博览会 *** 排成一排,像人群一样飞翔。 爸爸惬意地坐在他的肩膀上,风雷鸣般的特技尽收眼底。蓝天绽放着四台璀璨的机器,陆军航空芭蕾舞团在云层中翩翩起舞。 盛会震撼四面八方,有幸见证了中国复苏的巅峰。 "
tts_cmd = 'edge-tts --voice zh-cn-xiaoxiaoneural --text "' + text + '" --write-media ' +sound_path
os.system(tts_cmd)
Bunsheng图:稳定扩散稳定扩散是一种潜在扩散模型,属于生成类模型,通过迭代去噪和逐步采样随机噪声来获得感兴趣的图像,从而取得了惊人的效果。 与 Disco Diffusion 相比,Stable Diffusion 通过迭代低维潜在空间而不是原始像素空间,大大降低了内存和计算需求,并且可以在 v100 上在一分钟内渲染出所需的图像。
参数说明: prompts:描述待生成图片内容的输入语句。
!pip install paddlenlp==2.6.0rc0pip install ppdiffusers 使用 paddlepaddle develop 的项目框架重启内核
安装后,导入ppdiffusers可能会失败,点击顶部重启内核,如果没有,重复pip+重启内核几次,总会成功使用 Stable Diffusion 时,可以使用 Ernie Bot SDK 中的翻译和扩展功能处理提示。import os
import paddle
from ppdiffusers import stablediffusionpipeline
from ppdiffusers import dpmsolvermultistepscheduler
fdir_path = '/home/aistudio/gradio_packages/file/'
diffu_img_path = os.path.join(fdir_path,'diffu_img.jpg')
face_img_path = os.path.join(fdir_path,'face_img.jpg')
temp_img_path = os.path.join(fdir_path,'temp.jpg')
型。 pretrained_model_name_or_path = "runwayml/stable-diffusion-v1-5"
#unet_model_path = "./dream_booth_lora_outputs"
加载原始模型。
pipe = stablediffusionpipeline.from_pretrained(pretrained_model_name_or_path, safety_checker=none)
pipe.scheduler = dpmsolvermultistepscheduler.from_config(pipe.scheduler.config)
将适配器层添加到 UNET 模型中。
#pipe.unet.load_attn_procs(unet_model_path, from_hf_hub=false)
def diffu_result0(prompt):
if prompt == '':
prompt = 'face'
negative_prompt = "lowres, error_face, bad_face, bad_anatomy, error_body, error_hair, error_arm, (error_hands, bad_hands, error_fingers, bad_fingers, missing_fingers) error_legs, bad_legs, multiple_legs, missing_legs, error_lighting, error_shadow, error_reflection, text, error, extra_digit, fewer_digits, cropped, worst_quality, low_quality, normal_quality, jpeg_artifacts, signature, watermark, username, blurry"
guidance_scale = 8
num_inference_steps = 50
height = 512
width = 512
img = pipe(prompt, negative_prompt=negative_prompt, guidance_scale=guidance_scale, height=height, width=width, num_inference_steps=num_inference_steps).images[0]
img.s**e(diffu_img_path)
img.s**e(temp img path) 备份。
def magic_prompt(query: str):环境准备:Paddleganpaddlegan 生成对抗网络开发套件为开发者提供经典前沿的生成对抗网络高性能实现,支持开发者快速构建、训练、部署面向学术、娱乐、工业等应用的生成对抗网络。magic_template = """
你是提示词扩展的高手,你需要根据我的输入重写单词,直接输出英文。
提示词需要遵循以下规则:
按照示例提示词的结构,即首先描述绘画的主题,然后描述场景,然后添加笔触、情绪、绘画风格、灯光、镜头等,然后是最佳质量、杰作、8k 等词,所有这些都用逗号分隔。
请不要换行,请用英文表达。
示例:输入:一个穿着鲜艳连衣裙的小女孩。
a portrait of a cute girl wearing a luminous, vibrant and colorful dress standing in front of an abstract dreamy background with subtle pastel colors, inspired by the works of ulyana aster, digital art made using adobe photoshop and corel painter, surrealistic elements like glitters, stars and clouds to create a magical atmosphere, raw photo,hyper-realistic, close-up, product view, artstation trends, cgsociety, super high quality, digital art, exquisite ultra-detailed, 4k, soft lighting, fantasy, fashion, unreal engine rendering,8k uhd, hdr, high quality,untra detailed,film grain
输入:铺有瓷砖的白色浴室。
a nature look and chic bathroom with white wall, beige ceramic tile, natural stone flooring, modern fixtures and appliances in silver chrome, contemporary vanity sink and mirror in black marble countertop, spa-like atmosphere with a luxurious freestanding bathtub in the center of the room.在虚幻引擎 4 中渲染逼真的光照效果和纹理, 原始照片,超逼真,原始照片,超逼真,, 产品视图, ArtStation 趋势, CGSorvice, 超高质量, 数字艺术, 精致超细节, 4K, 柔和的照明, 梦幻, 时尚, 虚幻引擎渲染模型: Midjourney Style, CFG 比例: 7, 8K, UHD, HDR, 高质量,Untra detailed,胶片颗粒,8K UHD, HDR,高质量,untra详细,胶片颗粒输入:""
answer = wx_api(magic_template)
这里存在LangChain部署失败的问题,因此对方案进行了调整,放弃了使用。
return answer
def translate_prompt(query: str):
translate_template = """
您是翻译大师,需要根据我的输入将中文翻译成英文。
环境准备 - 如果主ipynb 运行如下 **,需要添加 maingradio packages 文件夹中的 ipynb。
已针对此项目修改了 paddlegan 文件夹的内容,因此您无需再在此处运行它以避免覆盖。#!git clone
#%cd /home/aistudio/paddlegan/
#!python ./setup.py develop
!pip install dlibpip install scikit-image
pip install imageio-ffmpeg
pip install munch
pip install natsort
pip install numpy==1.22 重新启动内核。
面部融合:styleganv2fitting、styleganv2mixing将两个****图像的面孔组合在一起,生成一个新图像。
styleganv2fitting 的基础知识
styleganv2mixing
1. Stylegan 是一个随机生成的向量,它是根据向量生成的。 2、拟合模块基于已有的图像倒排样式向量,解耦程度高。 获取的样式向量可用于人脸融合、人脸属性编辑等任务。 3、混合模块利用其风格向量,实现两张生成图像不同层次、不同比例的混合。 主要步骤
实现人脸融合有三个步骤:1、拟合模块提取两张人脸的向量,StyleGan V2根据向量生成Stylegan世界中的人脸2.混合模块融合了两个面的向量3. StyleGan v2 根据融合向量生成新人脸。
import osfrom paddlegan.ppgan.apps.styleganv2fitting_predictor import styleganv2fittingpredictor
fdir_path = '/home/aistudio/gradio_packages/file/'
fit_path = '/home/aistudio/gradio_packages/file/fit1'
diffu_img_path = os.path.join(fdir_path,'diffu_img.jpg')
print(diffu_img_path)
img2fit = styleganv2fittingpredictor(output_path=fit_path,model_type='ffhq-config-f',seed=none,size=1024,style_dim=512,n_mlp=8,channel_multiplier=2)
img2fit.run(diffu_img_path,need_align=true)
import osfrom paddlegan.ppgan.apps.styleganv2fitting_predictor import styleganv2fittingpredictor
fdir_path = '/home/aistudio/gradio_packages/file/'
fit_path = '/home/aistudio/gradio_packages/file/fit2'
input_face_path = os.path.join(fdir_path,'input_face.jpg')
print(diffu_img_path)
img2fit = styleganv2fittingpredictor(output_path=fit_path,model_type='ffhq-config-f',seed=none,size=1024,style_dim=512,n_mlp=8,channel_multiplier=2)
img2fit.run(input_face_path,need_align=true)
import osfrom paddlegan.ppgan.apps import styleganv2mixingpredictor
from pil import image
fdir_path = '/home/aistudio/gradio_packages/file/'
fit1_path = os.path.join(fdir_path,'fit1/dst.fitting.npy')
print(fit1_path)
fit2_path = os.path.join(fdir_path,'fit2/dst.fitting.npy')
mix_path = os.path.join(fdir_path,'dst.mixing.png')
face_img_path = os.path.join(fdir_path,'face_img.jpg')
predictor = styleganv2mixingpredictor(output_path=fdir_path,model_type='ffhq-config-f',seed=none,size=512,style_dim=512,n_mlp=8,channel_multiplier=2)
predictor.run(fit1_path, fit2_path)
img = image.open(mix_path)
img.resize((512, 512), image.lanczos).s**e(face_img_path)
print(face_img_path)
老化和**化:pixel2style2pixel、styleganv2您可以尝试更多数字人类头像。
老化基础知识 pixel2style2pixel
styleganv2
1.潜伏因子:潜因子,每张图片对应一个潜因子(一个高维向量),Stylegan可以使用这个向量来生成图像。
2.属性编辑:由于潜在因子包含许多维度,无法确定维度的对应方向和编辑带来的变化,因此使用大量的潜在因子和对应属性(如年龄或性别)来训练线性分类器,分类器的权重可以作为潜在因子和相应属性的方向。 3. Stylegan:基于向量生成**。 老化原理步骤
1.获取**的潜码,用于后续的属性编辑和人脸生成,使用pixel2style2pixel提取潜码。 temp img path:原始图像的路径,即需要提取隐藏特征的路径。 Age Dir:原始图像隐藏特征的存储路径,需要在后期的属性编辑生成模块中使用。 2.按照特定方向编辑潜伏码,可以编辑对应的人脸属性,如年龄、性别、头发、眼睛等。 3. Stylegan v2 根据第二步编辑的 Latent Code 向量生成目标人脸。 Age Pix Path:步骤2提取的原始图像的潜在代码(步骤2中的输出路径路径)。 年龄路径:保存新面孔的路径(年龄更改后)。 应用程序使用说明
老化或**:老化值不为0时,会产生效果;当老化值为0时,可以撤消上一步的老化或**操作,只能撤消一个步骤。
import os生成数字人类将静态图像转换为动态图像,并与声音进行口型匹配以生成数字人**。 表情符号转移:一阶运动模型将静态样式转换为动态样式。from paddlegan.ppgan.apps.pixel2style2pixel_predictor import pixel2style2pixelpredictor
from paddlegan.ppgan.apps.styleganv2editing_predictor import styleganv2editingpredictor
from paddlegan.ppgan.apps.photo2cartoon_predictor import photo2cartoonpredictor
def resize_image1(in_path, out_path, w, h):
img = image.open(in_path)
img.resize((w, h), image.lanczos).s**e(out_path)
fdir_path = '/home/aistudio/gradio_packages/file'
diffu_img_path = os.path.join(fdir_path,'diffu_img.jpg')
face_img_path = os.path.join(fdir_path,'face_img.jpg')
temp_img_path = os.path.join(fdir_path,'temp.jpg')
age_dir = os.path.join(fdir_path,'age/')
age_pix_path = os.path.join(fdir_path,'age/dst.npy')
age_path = os.path.join(fdir_path,'age/dst.editing.png')
cartoon_dir = os.path.join(fdir_path,'cartoon/')
cartoon_path = os.path.join(fdir_path,'cartoon/p2c_cartoon.png')
age_pixel_predictor = pixel2style2pixelpredictor(output_path = age_dir, model_type = 'ffhq-inversion', size = 512)
age_predictor = styleganv2editingpredictor(output_path = age_dir, model_type = 'ffhq-config-f', size = 512)
cartoon_predictor = photo2cartoonpredictor(output_path = cartoon_dir)
转换年龄以提取像素。
def age_pixel():
age_pixel_predictor.run(temp_img_path)
更改年龄。
def age(num):
age_predictor.run(age_pix_path, 'age', num/5)
resize_image1(age_path, diffu_img_path, 512, 512)
转换图像。
def cartoon():
cartoon_predictor.run(temp_img_path)
resize_image1(cartoon_path, diffu_img_path, 512, 512)
age_pixel()
age(5)
#cartoon()
一阶运动模型的任务是图像动画,给定一个源,给定一个驱动,生成一个片段,其中主角是源,动作是驱动中的动作,源图像通常包含一个主体,驱动包含一系列动作。 以人脸表情迁移为例,给定一个源字符和一个驱动,可以生成一个源字符,其中主体是源字符,源字符中源字符的表情由驱动中的表情决定。 通常,我们需要训练源字符的模型来标记人脸的关键点并进行表情迁移。 参数说明:
Face Driving Path: Driver**,其中角色的面部表情被用作要迁移的对象。 Face Img Path: Primitive**,原版中角色的表情会迁移到原版**中的字符上。 relative:表示程序中是否使用**和**中字符关键点的相对坐标或绝对坐标,建议使用相对坐标,如果使用绝对坐标,则会导致迁移后字符变形。 适应比例:根据关键点的凸包适应运动比例。
import os唇形搭配:w**2lip动态塑造和与声音的口型匹配,以生成数字人**。 W**2Lip模型是一种基于GAN的唇形动作迁移算法,实现了生成的**字符口型与输入语音的同步。 w**2lip不仅可以基于静态图像输出与目标语音匹配的唇声同步,还可以直接将动态唇声转换为与输入语音匹配的输出。 w**2lip 在与语音精确口型同步方面取得突破的关键在于,它使用口型同步鉴别器来强制发生器连续产生准确而逼真的唇部动作。 此外,该研究通过在鉴别器中使用多个连续帧而不是单个帧来改善视觉质量,并使用视觉质量损失(不仅仅是对比度损失)来解释时间相关性。 w**2lip模型几乎是无所不能的,适用于任何人脸、任何声音、任何语言,可以达到任何**的高准确率,可以与原作无缝集成**,也可以用于转换动画人脸,合成语音的导入也是可行的。 参数说明:from paddlegan.ppgan.apps.first_order_predictor import firstorderpredictor
fdir_path = '/home/aistudio/gradio_packages/file'
face_img_path = os.path.join(fdir_path,'face_img.jpg')
face_driving_path = os.path.join(fdir_path,'face_dri.mp4')
face_path = os.path.join(fdir_path,'face.mp4')
fom_predictor = firstorderpredictor(output = fdir_path,
filename = 'face.mp4',
face_enhancement = false,
ratio = 0.4,relative = true,image_size = 512,adapt_scale = true)
def fom():
fom_predictor.run(face_img_path, face_driving_path)
return face_path
fom()
脸部路径:动态建模**,其中角色的唇形是根据音频合成的。 声音路径:驱动唇形合成音频。 result path:指定生成文件的保存路径和文件名。
import os数字人语音聊天通过语音识别技术和文心一言能力,实现数字人聊天。 语音识别:智能云API调用智能云语音识别API-短语音识别标准版。from paddlegan.ppgan.apps.w**2lip_predictor import w**2lippredictor
fdir_path = '/home/aistudio/gradio_packages/file'
face_path = os.path.join(fdir_path,'face.mp4')
sound_path = os.path.join(fdir_path,'sound.w**')
result_path = os.path.join(fdir_path,'result.mp4')
w**2lip_predictor = w**2lippredictor(face_det_batch_size = 2,w**2lip_batch_size = 16,face_enhancement = true)
def w**2lip(input_video,input_audio,output):
w**2lip_predictor.run(input_video, input_audio, output)
return output
w**2lip(face_path, sound_path, result_path)
import os数字人聊天:Ernie Bot SDK使用文心一言能力生成对话内容。import base64
import urllib
import requests
import json
fdir_path = '/home/aistudio/gradio_packages/file/'
sound_path = os.path.join(fdir_path,'chat_in.w**')
def get_access_token():
api_key = "???"有关详细信息,请参阅本项目文档末尾—--创建智能云语音识别 API 的步骤。
secret_key = "???"
使用 AK 和 SK 生成访问令牌
返回:访问令牌,如果错误,则返回无
url = ""
params =
print(params)
return str(requests.post(url, params=params).json().get("access_token"))
def get_file_content_as_base64(path, urlencoded=false):
获取文件的 base64 编码。
param path:文件的路径。
param urlencoded: 是否对结果进行urlen编码
返回值:base64 编码信息。
with open(path, "rb") as f:
content = base64.b64encode(f.read())decode("utf8")
if urlencoded:
content = urllib.parse.quote_plus(content)
return content
url = ""
print(sound_path)
speech = get_file_content_as_base64(sound_path,false)
print(speech)
payload = json.dumps(
response = requests.request("post", url, headers=head
from api import wx_api作者的故事chat_in = "你是谁"
prompt = f"""
角色设计:你的名字是“琪琪”。 是一个知识渊博、善解人意、幽默风趣的聊天家伙,能够与用户进行幽默而有见地的对话。
对话示例:用户:“嗨,琪琪!今天的天气很好,可以散步。 你觉得怎么样?”
琪琪:“是的,今天是散步的好日子。 你喜欢散步吗?是公园还是河流?”
用户:“我通常喜欢去公园散步。 花草树木很漂亮,可以听到鸟儿的鸣叫。 ”
琪琪:“听起来很愉快!在自然环境中行走可以缓解压力,也有助于健康。 你还有其他喜欢的户外活动吗?”
输出要求:根据用户输入生成有趣、相关且有见地的响应。
在对话中保持自然、流畅的风格,与用户互动。
根据对话的上下文,它可以主动引导对话进行深化和扩展。
保持你的答案简短。
回答用户的最新问题:
answer = wx_api(prompt)
print("{} 聊天最终反馈:{}".format(chat_in, answer)
星系:请简单介绍一下您自己。 司金龙:大家好,我叫司金龙,现在是神州数码的高级RPA工程师,原来从事行业分析和咨询,三年前学了习 Python,成功转行RPA行业。 星系:你是如何加入PaddlePaddle Galaxy社区的?司金龙:与PaddlePaddle Galaxy社区的关系是一年前,一开始我学习了Paddle Galaxy社区的习课程,从深入学习习理论到大规模模型应用开发等一系列课程。 星系:你能告诉我们更多关于这个项目的信息吗?司金龙:这个应用程序是为黑客马拉松第五届比赛准备的。 在设置数字人角色时,我使用了我孩子的昵称琪琪和思思。 他们也喜欢测试自己的作品,而茜茜最喜欢测试数字人生成、衰老等功能。 琪琪喜欢测试与数字人交谈的能力,他们发现了很多错误,玩得很开心。 我的妻子高磊不仅提出了很多想法,更重要的是给了我很多鼓励,让我有了继续前进的动力。 本教程项目**征集Paddle Galaxy社区五周年开发的优质教程,更多教程或提交需求请登录Paddle Galaxy社区查看。