如今,视频内容创作的门槛是越来越低了,DeepFake就是个典型例子。只需要参考人脸的数据和人物视频素材,DeepFake就可以方便地将视频中的人物的脸部换成参考人脸的脸部。随着恶搞视频的增加,DeepFake已经受到了人们的抵制,学术界也开发出越来越多的方法用于检测DeepFake视频。
但是,伪造视频还有另一种思路,不在脸上动手脚,而是在语音上动歪脑筋。在学术界中,人们开始关注另一项转换技术,就是将视频里的面部唇形校正以匹配给定音频。也就是说,输入一段视频和音频,就能让视频里的人物按照音频来说话,从而让两者融为一体,就像有一个傀儡师在背后操纵着视频中的人物说话一样。
当然,并不是说这项技术的开发是带着恶意的,只是这项技术难免会被恶意利用。但它才刚刚起步,我们就抱着好玩的心态来体验体验吧,先请看官打开以下这个视频。
是不是很魔性?但这个视频只是今天的主角Wav2Lip的鬼畜应用示例,而且这个视频不能完全展现Wav2Lip的全部优势。这里先列举一些相关研究。在《Obamanet: Photo-realistic lip-sync from text》中,研究者仅用几个小时就学会了从语音表示到唇形的转换,其中首先根据语音生成唇形关键点,再根据关键点生成逼真的唇形。《Text-based editing of talking-head video》则直接从语音表示中生成图像,并且生成质量很高。而《Towards Automatic Face-to-Face Translation》针对数千种身份和声音进行了训练,可以在任何声音中的任何身份的单个静态图像上生成准确的唇部运动。但是,如果要将语音植入用于诸如翻译演讲/电视连续剧之类的视频中,AI模型就需要对动态的、不受约束的脸部和嘴唇动作进行识别和转换,这就增加了转换的难度。实际上,适用于静态图像转换的模型无法准确地转换视频中的唇形,会导致不同步现象。对于观者而言,0.05-0.1秒的不同步就能被察觉出来,就像我们在看电视剧的时候,如果声音和人物唇形稍微对不上,就会极大影响观感。类似地,在体验VR应用时,如果动作和视觉内容无法匹配,人也会产生眩晕感。日常的视频中包含快速变化的姿势、比例和光照,并且生成的面部结果还必须无缝融合到原始目标视频中。因此,鉴于所允许的误差很小,这个问题非常有挑战性。何况,我们的目标是开发独立于说话者的方法。
1
Wav2Lip
在近期由ACM Multimedia 2020接收的论文《Wav2Lip: Accurately Lip-sync Videos to Any Speech》中,研究者开发出了能应对这个难题的AI模型,我们来看看效果:
视频的第一个片段是原始素材,第二个片段是音频源,第三个片段是将音频源与原始素材融合后的效果,可以看出,希特勒的唇形被修改的很自然。相对于之前的模型,Wav2Lip模型在动态的有声面部视频中产生了更加准确的唇形同步。通过检查现有的独立于说话者的语音到唇形生成方法,研究者发现,由于仅使用重建损失或较弱的唇形同步判别器,这些模型没有对错误的唇形进行适当的惩罚。于是,研究者采用了唇形同步判别器,以强制生成器持续产生准确而逼真的唇部运动。Wav2Lip可以将任意说话的面部视频与任意语音进行唇形同步,而且据研究者介绍,Wav2Lip是第一个独立于说话者的高质量模型。人工评估表明,与现有方法相比,Wav2Lip生成的视频在90%以上的时间中优于现有方法。此外,Wav2Lip还可以将英语在线讲座视频或者电影与其他语言的配音同步,使它们看起来更有趣。由于长年观看翻译视频,我们或许已经习惯了人物口型和字幕语言的不一致,但如果能将人物口型也校正过来,或许会有不一样的体验。 研究者表示,他们的模型几乎是万能的,适用于任何人脸、任何语音、任何语言,对任意视频都能达到很高的准确率,可以无缝地与原始视频融合,还可以用于转换动画人脸,并且导入合成语音也是可行的。至于真实效果如何,还请读者自行先去项目网页试试,或者直接上手开源代码。
模型方法
Wav2Lip通过向“已经训练有素的口型同步专家”学习来生成准确的口型同步,其模型架构如下图所示。与之前仅使用重建损失或在GAN设置中训练判别器的方法不同,在Wav2Lip中,研究者使用预先训练好的判别器,该判别器在检测口型同步错误上已经非常准确。此外,研究者还采用了视觉质量判别器来改善视觉质量和同步准确率。下图展示了Wav2Lip模型生成的面部示例(绿色框和黄色框),并与之前的最佳方法进行比较(红色框)。图中单词标记红色部分表示人物此时的发音。可以看到,Wav2Lip模型生成了准确自然的唇形。利用视觉质量判别器也显着改善了视觉质量。
项目已开源
目前,研究者在项目网页中提供了交互演示,用户可以自行上传视频体验Wav2Lip的效果,不过只允许上传最长20秒的视频和音频。如果使用开源代码,则可以尝试对更高分辨率或更长的视频进行唇形同步。项目地址:https://bhaasha.iiit.ac.in/lipsync/uploader提示:如果转换失败,很可能意味着面部检测器无法检测所有输入视频帧中的面部。对于动画电影剪辑,有时可能会发生这种情况。可能需要一些时间(通常不超过一分钟)才能生成结果!目前,所有结果均限于(最大)480p分辨率。20秒的视频时长可以最小化计算延迟。研究者提供的交互式站点仅是对Wav2Lip模型的最低功能演示。研究者表示,Wav2Lip模型具有广泛的适用性,适用于任何身份和任何语言,他们担心这项技术会被滥用。尽管如此,他们还是开源了代码。研究者强烈建议,使用Wav2Lip的代码和模型创建的任何内容都必须标明是合成的。AI科技评论的看法是:“你们的担心很有道理,但你们的建议估计没人会听。祝各位看官玩的愉快,但还是要注意,不要心太贼、胆太肥。”
道翰天琼CiGril认知智能机器人API用户需要按步骤获取基本信息:
请求地址:http://www.weilaitec.com/cigirlrobot.cgr
请求方式:post
请求参数:
参数 |
类型 |
默认值 |
描述 |
userid |
String |
无 |
平台注册账号 |
appid |
String |
无 |
平台创建的应用id |
key |
String |
无 |
平台应用生成的秘钥 |
msg |
String |
"" |
用户端消息内容 |
ip |
String |
"" |
客户端ip要求唯一性,无ip等可以用QQ账号,微信账号,手机MAC地址等代替。 |
接口连接示例:http://www.weilaitec.com/cigirlrobot.cgr?key=UTNJK34THXK010T566ZI39VES50BLRBE8R66H5R3FOAO84J3BV&msg=你好&ip=119.25.36.48&userid=jackli&appid=52454214552
注意事项:参数名称都要小写,五个参数不能遗漏,参数名称都要写对,且各个参数的值不能为空字符串。否则无法请求成功。userid,appid,key三个参数要到平台注册登录创建应用之后,然后查看应用详情就可以看到。userid就是平台注册账号。
示例代码JAVA:
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.net.HttpURLConnection;
import java.net.URL;
public class apitest {
/**
* Get请求,获得返回数据
* @param urlStr
* @return
*/
private static String opUrl(String urlStr)
{
URL url = null;
HttpURLConnection conn = null;
InputStream is = null;
ByteArrayOutputStream baos = null;
try
{
url = new URL(urlStr);
conn = (HttpURLConnection) url.openConnection();
conn.setReadTimeout(5 * 10000);
conn.setConnectTimeout(5 * 10000);
conn.setRequestMethod("POST");
if (conn.getResponseCode() == 200)
{
is = conn.getInputStream();
baos = new ByteArrayOutputStream();
int len = -1;
byte[] buf = new byte[128];
while ((len = is.read(buf)) != -1)
{
baos.write(buf, 0, len);
}
baos.flush();
String result = baos.toString();
return result;
} else
{
throw new Exception("服务器连接错误!");
}
} catch (Exception e)
{
e.printStackTrace();
} finally
{
try
{
if (is != null)
is.close();
} catch (IOException e)
{
e.printStackTrace();
}
try
{
if (baos != null)
baos.close();
} catch (IOException e)
{
e.printStackTrace();
}
conn.disconnect();
}
return "";
}
public static void main(String args []){
//msg参数就是传输过去的对话内容。
System.out.println(opUrl("http://www.weilaitec.com/cigirlrobot.cgr?key=UTNJK34THXK010T566ZI39VES50BLRBE8R66H5R3FOAO84J3BV&msg=你好&ip=119.25.36.48&userid=jackli&appid=52454214552"));
}
}