VASA-1: Lifelike Audio-Driven Talking Faces Generated in Real Time
VASA-1 논문 리뷰
Jul 23, 2024
읽은 이유
real time talking head generation
요약
한장의 얼굴 이미지와 speech에 기반해서 talking head를 생성한다. facial dynamics와 head movement를 특히 잘 처리한다. 외형을 제외한 facial motion에 관련된 face latent space를 구축한다음 이 안에서 DiT로 sequential하게 생성한다음 decoder를 통해서 연속된 프레임의 동영상으로 만든다. lip sync만을 강조하는 논문도 꽤 많은 걸로 알고있는데, lip에 특화된 method를 따로 적용하지 않았음에도 잘하는게 신기하다(혹은 내가 몰라서 속고있거나)
구현 방법과 참고한 이전 연구들을 자세하게 소개해줘서 실질적으로 도움이 되는 논문.
Abstract
VASA is 한장의 이미지와 speech clip에 기반해서 고퀄리티의 talking face + 자연스러운 모션을 생성해내는 프레임워크다.
VASA는 오디오와 일치하는 lip motion 뿐만 아니라 현실감과 생동감을 불어넣은 얼굴 표정, 머리 움직임도 잘한다.
핵심적인 사항은 diffusion 베이스의 전체적인 얼굴 묘사와 face latent space에서 만드는 head movement 생성 모델이다. 비디오를 사용해서 expressive and disentangled face latent space를 개발했다.
새로운 metric과 다른 여러 실험에서, 우리의 방법이 가장 좋은 성능을 보였다.
고퀄리티, realistic face, head dynamics, 약간의 시작 latency와 40FPS의 512*512 video.
Introduction
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252F6886ba6d-9c8b-4735-8263-f5137e1473ea%252F867a589b-782b-4b3d-863b-977f6c2c53dc%252FScreenshot_2024-07-22_at_10.44.04_PM.png%3Ftable%3Dblock%26id%3Dfd62af78-7223-44e8-b6c5-b2284888e354%26cache%3Dv2&w=3840&q=75)
인간의 얼굴은 단순히 모양뿐 아니라 대화에서 미묘한 차이를 전달해내는 섬세한 부분이다.
speech 기반 video generation 연구는 최근에 많이 일어났지만 현실의 퀄리티와는 거리가 멀었다. 현재의 리서치는 주로 lip sync에 초점을 뒀다. 얼굴 표정과 머리 움직임은 어려운 상태였다. 그럼 이상한 영상이 된다.
또 중요한건 live communication에서 중요한 생성의 속도이다.
본 연구는 효율적이면서 강력한 audio-conditioned 모델, latent space of head and facial movements안에서 동작하는, 을 개발했다.
이전 연구와 다르게 우리는 holistic facial dynamics(머리 움직임도 포함하여)의 latent space안에서 DiT를 학습했다.
우리는 모든 facial dynamic을 하나의 latent variable에서 만들어내고 한번에 그 latent의 확률 분포까지 모델링한다. 기존의 연구들은 각각을 별개의 메소드로 사용한다(lip, eye blink, head 등등).
그리고 보는 방향(g), 거리(d), 감정(e) 같은 추가적인 conditioning signal까지 사용해서 학습도 한다.
이걸 위해서 holistic facial dynamics latent space를 구축해야하고, 학습을 위한 데이터도 필요했다. 본 연구에서는 많은 얼굴 비디오를 사용해서 적절한 latent space를 빌딩하려고 했다.
우리의 목적은 face latent space가 다양할 뿐만 아니라 disentagle되어있기를 원했다. 그걸위해 우린 3D 목적의 representation 연구를 참고했다 with carefully-designed loss functions.
Face video로 SSL or weakly-supervised로 학습했고 encoder는 잘 disentangled factor를 생성하고, decoder는 그걸로 얼굴을 복원.
바로 video frame을 생성하는 대신에, 전체적인 audio와 추가적인 컨디션에 기반해 facial dynamic과 head motion을 latent space에서 우선 뽑아낸다. 그리고 이걸 기반으로 face decoder를 사용해 프레임을 뽑는다. - 이때 원본 이미지에서 뽑은 identity, appearance도 사용함
Expressive and Disentangled Face Latent Space Construction
기존 연구들도 있지만 두가지 다 만족하는건 없었음
우리는 3D-aid face reenactment framework를 참고했다. 사람 얼굴은 3D로 고려하는데 2D feature map보다 좋다. 움직임을 이해하는데도.
facial image를 canonical 3D apperance volume , identity code , 3D head pose , facial dynamics code 으로 디컴포즈한다.
V를 제외한 나머지는 각각 독립적인 인코더로 추출된다. V는 MegaPortrait에서 사용된 방식으로 구축된다.
V를 추출하는 방법
- 현재의 pose를 가진 3D volume을 추출한다.
- 추출된 3d 볼륨을 rigid warping을 통해 위치와 방향이 표준 상태인 canonical volume으로 맞추고, non-rigid warping을 통해 세부적인 것들을 마저 맞춘다.
- 이렇게 변형된 결과물이 표준 3D appearance volume이 된다.
disentangle을 위해서. 핵심 아이디어는 이미지 recon loss를 다른 데이터의 latent variable과 swap해서 만드는 것이다. 위의 MegaPortrait 논문의 loss를 가져오려고 했는데 facial dynamic과 head pose간에 disentanglement가 너무 별로였다. 그래서 몇가지 변형을 추가했다.
- head pose와 facial dynamics를 디스인탱글하기
같은 비디오의 다른 두 프레임 i, j가 있다고 치자. 그리고 i의 head pose를 j처럼 만들고, j의 facial motion을 i처럼 만든다.
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252F6886ba6d-9c8b-4735-8263-f5137e1473ea%252Ffc6faebf-a690-4e62-9ff6-fa895a592a6e%252FScreenshot_2024-07-22_at_11.04.29_PM.png%3Ftable%3Dblock%26id%3D1e5f90a0-e9c4-49e9-873f-a1aded5f6874%26cache%3Dv2&w=3840&q=75)
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252F6886ba6d-9c8b-4735-8263-f5137e1473ea%252Fd57e875c-e482-4e1f-8b9e-4e681f1b8947%252FScreenshot_2024-07-22_at_11.04.38_PM.png%3Ftable%3Dblock%26id%3Dcc56383f-9275-4282-aa8d-85957e439198%26cache%3Dv2&w=3840&q=75)
그리구 둘 사이의 차이를 최소하도록 loss를 만든다.
→ 이러면 왜 disentangle될까? 직관적으로, 두 이미지는 비슷해야한다(같은건 아닐거고). 어떻게보면 특정 부분만 바꿔서, augmented pair set을 만들어낸 느낌. 이러면 head pose latent가 어떤 역할을 해야하는지, facial dynamics latent가 어떤 역할을 해야하는지 배운다고 생각
- identity와 motion을 disentangle하기
서로 다른 비디오에서 각각 프레임을 뽑는다. s, d
그리고 한쪽의 motion latent로 다른 한쪽의 모습을 만들도록 한다.
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252F6886ba6d-9c8b-4735-8263-f5137e1473ea%252F170c0e7e-4019-4de7-8995-409243a6d0ab%252FScreenshot_2024-07-22_at_11.11.31_PM.png%3Ftable%3Dblock%26id%3D8dfb2dce-418e-4725-b5f6-6b77ffd17a3d%26cache%3Dv2&w=3840&q=75)
원본 s와 생성된 s_d의 identity feature를 뽑은 다음(by fixed model) 둘의 cosine sim이 가까워지도록 loss를 준다.
이렇게 해서 face latent space를 만듦!
Holistic Facial Dynamics Generation with Diffusion Transformer
위에서 구축한 face latent space와 trained encoder를 사용해서 비디오에서 facial dynamics, head movements를 추출해낼 수 있다.
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252F6886ba6d-9c8b-4735-8263-f5137e1473ea%252F4e3b3585-9780-4e38-b56c-d1eff262edf8%252FScreenshot_2024-07-22_at_11.13.45_PM.png%3Ftable%3Dblock%26id%3D2193a8bf-533e-419d-84e9-ba03ca6d8bc3%26cache%3Dv2&w=3840&q=75)
motion sequence extracted from a video clip X = {[ ]}, i = 1, …, W. audio는 Wav2Vec2로 feature 뽑는다.(whisper가 더 좋은거 아닌가..)
기본적인 diffusion 식이다.
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252F6886ba6d-9c8b-4735-8263-f5137e1473ea%252F2cf2fa01-0339-4023-a59a-74a47ffb102e%252FScreenshot_2024-07-22_at_11.19.28_PM.png%3Ftable%3Dblock%26id%3D084ccb0e-a22b-418c-8acb-9303abcf1afb%26cache%3Dv2&w=3840&q=75)
다시 말하지만 X0는 원래 LDM에서 처럼 사람의 이미지의 latent가 아니라, facial latent다. C는 추가적인 condition인데 아래에서 설명.
Condition signal
기본적으로는 audio feature다. 그리고 몇가지 시그널도 추가로 사용해서 modeling을 더 tractable하고 사용하기 좋게 만들었다.
앞서 말한 3가지 추가 condition(시선, 떨어진 거리, emotion offset)을 pre-trained or algorithmic method로 뽑고, 현재 프레임의 audio와 이전 프레임의 오디오, motion을 총 컨디션으로 사용했다.
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252F6886ba6d-9c8b-4735-8263-f5137e1473ea%252Fbfc75f42-4213-46e1-91f5-b9e47a402eb7%252FScreenshot_2024-07-22_at_11.26.48_PM.png%3Ftable%3Dblock%26id%3D9fed4e63-015f-4196-8c3f-2382a508616b%26cache%3Dv2&w=3840&q=75)
CFG training하는데, g, d, e는 0.1 drop하고 Xpre, Apre는 0.5로 drop해서 첫 시작(앞선 프레임과 오디오가 없는)도 잘 할 수 있게 했다.
inference는 identity image를 사용해서 V와 z를 우선 뽑음
그리고 audio를 window 길이로 나눈다음 거기에 기반해 zpose, zdyn을 sliding-window manner로 sampling. 그리고 4가지를 다 사용해서 decoding → frames 얻는다,
experiment와 evaluation에서 구현 디테일과 사용한 데이터셋들을 자세히 적어줬고(일부는 직접 모은 데이터셋이라고 하고 공개 안하긴 했음), 퀄리티에 자신감을 보였다.
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252F6886ba6d-9c8b-4735-8263-f5137e1473ea%252Ff6d03cae-c99e-4975-8cbd-a9463c89b616%252FScreenshot_2024-07-22_at_11.40.56_PM.png%3Ftable%3Dblock%26id%3D92ab6214-1ff4-4248-b006-586d387f5093%26cache%3Dv2&w=3840&q=75)
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252F6886ba6d-9c8b-4735-8263-f5137e1473ea%252F72245573-8544-4d1b-a693-ea15cc975481%252FScreenshot_2024-07-22_at_11.40.49_PM.png%3Ftable%3Dblock%26id%3Df8f54ff6-d5a6-4855-808e-6ca2e20133cd%26cache%3Dv2&w=3840&q=75)
잘 disentagle되었기 때문에 최종적인 값이 sampling한 latent를 decoding한 것임에도 불구하고, motion이 바뀌어도 identity는 잘 유지되고 있다.
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252F6886ba6d-9c8b-4735-8263-f5137e1473ea%252F0069c5d4-83a7-4454-b8dc-53b334f9c871%252FScreenshot_2024-07-22_at_11.42.18_PM.png%3Ftable%3Dblock%26id%3D09006a55-2cc3-498a-8977-714def158bf8%26cache%3Dv2&w=3840&q=75)
![notion image](https://inblog.ai/_next/image?url=https%3A%2F%2Fwww.notion.so%2Fimage%2Fhttps%253A%252F%252Fprod-files-secure.s3.us-west-2.amazonaws.com%252F6886ba6d-9c8b-4735-8263-f5137e1473ea%252F13e07826-4b05-410e-8a16-f92ae0579fa4%252FScreenshot_2024-07-22_at_11.43.14_PM.png%3Ftable%3Dblock%26id%3D6be38e0e-d621-41a4-8ab8-2663c9a004fd%26cache%3Dv2&w=3840&q=75)
비교한 다른 모델에 대한 지식이 없어 완전히 믿진 않지만, lip에 특별한 집중을 하도록 loss를 주지 않았음에도 불구하고 metric이 훨씬 좋게 나왔다(SC, SD)
- CAPP : head-pose와 audio의 alignment
향후 연구에서는 머리카락과 옷을 포함한 상체 전체를 포함해서 다루겠다고 함.
이걸 위해서는 video data로 얻은 좋은 prior가 필요하다.
완벽하게 이해하기 위해 DiT와 MegaPortrait를 추가로 읽어야할듯 하다.
Share article
Subscribe to our newsletter