MIT의 Speech2Face는 음성신호로부터 화자의 얼굴을 생성해내는 연구입니다. 다만 하나의 모델로 speech to face transform을 수행하는 것이 아니며, 다른 목적의 기존 연구 결과들을 잘 조합하여 인상적인 결과를 만들어냅니다. (제1 저자는 현재 포항공대에 계시는 오태현 교수님입니다)
첫 번째는 이미지로부터 facial vector를 추출하는 기존 연구로서, ImageNet 등 이미지 분류를 위해 지속적으로 연구되었던 VGG를 facial image에 대해 특화되도록 학습한 VGGFace입니다. 보통 VGGFace의 fc7 layer(4096d)를 feature vector로 사용하며, 이를 이용하여 얼굴 분류, 나이 인식, 얼굴 검색 등 다른 용도로 사용할 수 있습니다. Speech2Face에서는 음성 신호를 complex spectrogram으로 변환하고 (598x257x2) 이를 VGG-like한 구조를 가진 7-layer CNN을 이용해서 4096d 벡터로 변환합니다. 학습의 목적은, speech-face pair에 대해서 speech를 이 모델에 넣었을 때 face를 VGGFace로 구해 놓은 4096d 벡터가 나오도록 하는 것입니다. 즉, Speech2Face는 spectrogram to VGGFace라고 볼 수 있습니다.
두 번째는 VGGFace의 feature vector를 입력으로 facial image를 생성하는 단계인데, 이 연구는 Google과 MIT의 협력으로 만들어진 별도의 기술이며, Speech2Face에서는 이 기술을 활용했습니다. 이 기술 또한 GAN과 같은 end-to-end 직접 생성 모델은 아니며, facial vector로부터 facial landmark와 facial texture의 두 가지 구분된 특징을 만들어낸 후, warping을 통해 “합성”해 냅니다. 이렇게 하는 이유는 두 특징을 구분하여 학습하는 것이 더 효율적이었기도 하지만 이 기술의 원래 목적이 아무데나 보고 있고 표정 짓는 사람의 이미지를 주면 정면의 무표정 얼굴로 변환하는 것이었기 때문입니다. 이를 위해 Input Image to facial vector, Facial vector to output image로 구분된 두 가지 모듈을 가지고 있고, Speech2Face는 이 중 두 번째 모듈을 사용합니다. 참고로 facial vector to landmark는 MLP, facial vector to texture는 CNN을 사용합니다.
논문을 읽으면서 느꼈던 점 중 하나는, AI의 기본 단위 기술 블럭들을 재활용하여 조합함으로써 새로운 가치를 만들어내는 방식이 향후 주된 흐름 중 하나가 될 수 있을 것 같다는 점입니다. (개발로 따지면 Fast Prototyping, Micro-Service Architecture) 마치 위의 논문이 speech to facial vector와 facial vector to facial image를 조합한 것 처럼요. 향후 여기에 speech to emotion까지 조합하면, 음성신호로부터 사람의 얼굴 및 표정을 만들어낼 수 있을거라는 생각이 듭니다.
현재는 AI의 API들이 쉬운 서비스 적용을 위해 High-Level로 디자인되는 경향이 있지만 (예: 음성인식 – speech to text) 오히려 모델(혹은 개념) 단위 Low-Level API (예: speech to vector)를 다수 디자인하고, 그 위 layer에서 mesh-up 함으로써 더 효율적으로 복수의 서비스를 빠르게 만들어낼 수 있지 않을까 합니다.
Speech2Face의 온전한 소스코드는 공개되어 있지 않습니다. 다만 구성 모듈 중 speech to facial vector는 아래 (1)에서 구현하고 있으며 facial vector to face image는 3D라서 좀 다르긴 하지만 아래 (2)를 참고할 수 있을 것 같습니다.
- Speech2Face의 speech to facial vector module
- Facial vector to face image (3D) module (같지는 않음, 참고용)
관련 링크 첨부합니다.