\u200E
今年七夕,给大家介绍一下我的专属AI女友
发布日期:2022-08-09T03:17:40.000+0000 浏览量:314次


如果你突然打了个喷嚏,那一定是我在想你~

一年一度的情人节——七夕又来了。每到这一天,都有很多程序员整活,用代码给女朋友表白。而对于更多的开发者来说,七夕可能只是写代码的平凡一天,下班回到家躺在床上开始思考同一个问题,我的女朋友在哪里呢?我的女朋友长什么样子呢?

飞桨开发者技术专家(PPDE)杨登辉就给单身汪带来了福音,用AI生成理想型女友,并让她开口说话、唱歌。

 扫码生成你心动的TA 
这个七夕, 文心AI你
快来看看你的理想型长什么样子吧!(向左滑动查看更多图片~

觉得这些都不适合你?还想让AI女友和你聊天?给你唱歌?那就跟着开发者一起,用飞桨生成专属于你的理想型AI女友吧~

生成AI女友共需要四步:

1.人像生成 调用文心ERNIE-ViLG生成人像图片;
2.暖心问答 :文心ERNIE 3.0 Zeus Prompt完成文本生成;

3.开口说话:使用飞桨语音模型库PaddleSpeech完成文本转语音;

4.合成视频 :使用飞桨预训练模型应用工具PaddleHub,结合图片和音频合成唇形视频。


调用文心ERNIE-ViLG生成图片

使用API Key与SK获取Token

文心ERNIE-ViLG参数规模达到100亿,是全球大规模的中文跨模态生成模型之一,在文本生成图像、图像描述等跨模态生成任务上效果突出。文心ERNIE-ViLG可以根据用户输入的文本,自动创作图像。你可以在文本框中输入一段文本描述,并选择生成风格,模型就会根据输入的内容自动创作出符合要求的图像。
友情提示:文生图整体效果不错,但生成人像图片,还有很多挑战,请理性看待效果,多次尝试嗷~

文心大模型将任务封装为API供我们使用,而调用API需要我们获取API Key(AK)和Secret Key(SK),因此我们需要获取Token。

当然,这里AK和SK肯定和你们的不一样,如果有需要,可以自行前往申请,点击下方链接,即可获取!

https://wenxin.baidu.com/younger/apiDetail?id=20008

import requests  
import json  

# 执行代码前填入你的AK和SK  
# 'client_id':'xxxxxxxxxxxxxx'  
# 'client_secret':'xxxxxxxxxxx'  

# 获取token  
token = requests.request('POST',  
                    'https://wenxin.baidu.com/younger/portal/api/oauth/token',  
                data={  
                    'grant_type':'client_credentials',  
                    'client_id':'your ak',  
                    'client_secret':'your sk'},  
                    timeout=3)  
token = json.loads(token.text)['data']  

token  
# 如果代码没有问题,下面的输出应该是这样的  
# 'xx.xxxxxxxxxxxxxxxxxxxxxxx.xxxxxxxxxx.xxxxxxxxxxxxxx.xxxxxxxxxxxxxxxxxxxxxxxxxxxxx-xxxxx'  

调用文心ERNIE-ViLG API

本项目使用的描述文本是:desp = '美丽温柔可爱的小仙女'

大家可以根据自己的需要进行多次尝试,尽量使用比较简洁明了的文本即可。比如:美丽 可爱 漂亮 大方 仙女 女朋友。

除此之外,还有参数style,style=['油画','水彩画','中国画']

目前,文心ERNIE-ViLG API支持的油画、水彩画、中国画三种风格,这三种风格文字不能进行更改,但你可以选择使用其中一种风格生成图片,更改对应的[x]即可。

油画: 'style': style[0]
水彩画: 'style': style[1]
中国画: 'style': style[2]
url = "https://wenxin.baidu.com/younger/portal/api/rest/1.0/ernievilg/v1/txt2img"  
style = ['油画','水彩画','中国画']  
headers = {  
    "User-Agent""Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/103.0.0.0 Safari/537.36",  
    "Content-Type""application/x-www-form-urlencoded"  
}  

# 你想要的女朋友是什么样的呢?  
# 我的是这样的!  
# 不超过16个字  
desp = '漂亮,美丽,小仙女,女朋友'  

# access_token 前面生成的token  
# text 你需要生成的图像的文本  
# style 哪一种风格    
payload={  
    'access_token': token,  
    'text': desp[:16],  
    'style': style[2],  
    }  

response = requests.request("POST", url, data=payload, headers = headers,timeout = 30)  

out = json.loads(response.text)  

print(out)  

task_id = out["data"]["taskId"]  

print(task_id)  

最终获取到Task id,拿到Task id才可以执行下一个代码块获取得到的图像文件。

获取返回的图片

这里要记得等待几分钟,再执行代码,毕竟一张图的生成是需要时间的!

from PIL import Image  
import matplotlib.pyplot as plt  
%matplotlib inline  
import requests  

url = "https://wenxin.baidu.com/younger/portal/api/rest/1.0/ernievilg/v1/getImg"  

payload={  
    'access_token': token,  
    'taskId': task_id  
    }  

response = requests.request("POST", url, data=payload)  

# 获取图片的路径  
img = json.loads(response.text)["data"]["imgUrls"]  

# 默认是生成十张图片  
if (len(img)!=10):  
    print("图片正在生成中,请耐心等待,稍后重新运行代码......")  

# 存图片的目录  
init_mkdir()  

# 展示十张生成的图片并保存  
for i in img:  
    i = i["image"]  
    #使用requests直接get 下载图片使用  
    r = requests.get(i)  
    ii = i.split('/')[-1]+'.png'  
    out_ii = 'output-img/' + ii  
    with open(out_ii, 'wb'as f:  
        f.write(r.content)  
    f.close()  
    img_ = Image.open(out_ii)  
    plt.show()  
    plt.imshow(img_) 

第二步
暖心问答


文心ERNIE 3.0 Zeus 文本生成

文心ERNIE 3.0 Zeus是全新发布的融合任务相关知识的千亿大模型,该模型大幅刷新各类NLP任务最好效果,在各类公开数据集及真实场景上,零样本与小样本能力均取得显著提升,当前API为开发者提供大模型的探索和体验。

在文本框中输入一句或者一段话,模型就会根据输入的内容进行后文续写。这里的文本你可以随意输入,比如:que = ”你喜欢我吗?

   
     
import requests  

url =  "https://wenxin.baidu.com/younger/portal/api/rest/1.0/ernie/3.0/zeus"  

que =  '你喜欢我吗?'  

text =  '问题:' + que +  '?' +  ' ' +  '回答:'  
payload={  
     'text': text,  
     'seq_len'256,  
     'task_prompt''',  
     'dataset_prompt''',  
     'access_token': token,  
     'topk'10,  
     'stop_token'''  
    }  

response = requests.request( "POST", url, data=payload)  

print(response.text)  
answer = json.loads(response.text)[ "data"][ "result"]  
print(answer)

第三步
开口说话


使用飞桨语音模型库PaddleSpeech完成文本转语音

使用PaddleSpeech文本转语音,将文心ERNIE 3.0 Zeus生成的文本转换成语音格式。

# 安装库,大概需要1-2分钟  
!pip install pytest-runner  
!pip install paddlespeech  

# 下载nltk数据包,如果项目中有就不用下载了  
%cd /home/aistudio  
!wget -P data https://paddlespeech.bj.bcebos.com/Parakeet/tools/nltk_data.tar.gz  
!tar zxvf data/nltk_data.tar.gz  
# 一定是GPU版本才可以运行起来  
# 在文本中加上前缀我,后缀你  
if ('我' not in answer):  
    answer = '我好好好' + answer  
if ('你' not in answer):  
    answer =  answer + '你'  

# 黏人一点,dddd  
text = '臭宝,'+ answer + '呀,我要一直和你在一起,超幸福的'  

from paddlespeech.cli.tts.infer import TTSExecutor  

audio_path = "/home/aistudio/output.wav"  
tts = TTSExecutor()  
tts(text=textoutput="/home/aistudio/output.wav"

效果预览:

当然。还可以让她唱歌给你听~

小编这里采用了王心凌的《爱你》这首歌,截取了歌曲的一个片段。

# 用来剪切音频和转换mp3为wav  
!pip install pydub  
!pip install moviepy  
# 音频片段剪切  
from moviepy.editor import *  
from pydub import AudioSegment  


filepath = 'aini.mp3'  
music = AudioSegment.from_mp3(file=filepath)  
sound_time = music.duration_seconds  

# 使用切片截取, 单位毫秒, 1s -> 1000ms  
out_music = music[37500: 88000]  
out_mp3_path = "aini_sub.mp3"  
# 导出  
out_music.export(out_f=out_mp3_path, format='mp3')   # 可以指定bitrate为64k比特率 None为源文件  

sound = AudioSegment.from_mp3(out_mp3_path)  
out_song_path = 'aini_sub.wav'  
sound.export(out_song_path, format="wav")

第四步
合成视频


使用飞桨预训练模型应用工具PaddleHub,结合图片和音频合成唇形视频。

调用PaddleHub中封装好的wav2lip模型,简单方便。

# 报错就多运行几次  
!pip install -U pip --user  
# 升级paddlehub防止版本出错  
!pip install -U paddlehub  

# 运行时长由你的语音的长度决定  
import paddlehub as hub  

module = hub.Module(name="wav2lip")  
# 你想要作为女朋友的照片  
face_input_path = "demo.png"  
# 上面生成的音频的路径  
audio_input_path = audio_path  
module.wav2lip_transfer(  
    face=face_input_path,  
    audio=audio_input_path,  
    output_dir='./transfer_result/',  
    use_gpu=True)

点击下方链接,来看一下最终效果吧

h ttps://www.bilibili.com/video/BV1yY4y1A7Qn

项目总结


这个项目借助文心大模型生成人物图片并实现问答,同时还可以结合PaddleSpeech进行文本转语音,将语音与上文实现的人像唇形相结合,最终生成一个可以唱歌的AI女友。当然,目前唇形的实现还略微粗糙,但图一乐足够了~

祝大家七夕节快乐~
感兴趣的小伙伴可扫码关注AI Studio项目
一起学习讨论:




关注【飞桨PaddlePaddle】公众号

获取更多技术内容~