Make-A-Voice 논문에 관해 간단히 분석하는 포스팅이다.
해당 논문에 대한 몇몇 리뷰는 openreview.net 에서 확인 해 볼 수 있다.
해당 리뷰들을 참고하며 개인 의견 몇가지를 이야기하고자 한다.
1. 소개
음성합성은 인간의 음성을 생성하는 것을 목표로 하며, 특히 제로샷 성능을 향상시키기 위해서 수많은 데이터를 기반으로 인간의 음성 다양성을 캡처, 표현을 예측하는 방법이 많이 개발되었다. 하지만 이러한 방법들은 ‘음성 생성’ 이라는 공통 목표를 둠에도 불구하고 독립적으로 개발되었다. 때문에 각 애플리케이션에 대해 개발된 방법론은 여전히 ‘독립적’ 이며, 별도로 각 모델을 최적화해야 하기에 비 효율적이다.
이 논문은 뭔가 새로운 모델을 제시하지는 않는다.
결국 Make-A-Voice 라는 통합된 음성합성 프레임워크를 제안하는데 핵심 계념은 아래와 같다.
- 'coarse-to-fine' 기법을 사용한다. 해당 기법은 'coarse(거친, 굵은)' 값을 토대로, 더 의미있는 값(fine) 을 선택하는 최적화 방식의 일종이다. 좀 더 쉽게 설명하면, 우선 대분류를 고른뒤 → 소분류를 선택하는 방식이라고 보면 된다
이를 통해 아래와 같은 결과를 달성했다.
- 음성 및 노래 음성 합성을 위해 자기 지도 데이터를 활용하여 확장성을 향상시켰다
- 실험 결과는 Make-A-Voice가 스타일 유사성과 perceptual quality 측면에서 최첨단 결과를 달성했다는 것을 보여준다. Make-A-Voice는 discrete representations(이산 표현) 을 사용하여 데이터 확장성, 제어 가능성 및 조건 유연성에서 뛰어나다.
해당 논문의 저자들은 여러가지 광범위한 조사를 수행한듯 하다. 기본적인 Tacotron, FastSpeech 는 물론이고, GenerSpeech, YourSpeech 등 내가 잘 모르는 모델들도 논문 내에서 이야기한다.
더하여 결국 몇몇 구문들을 읽어보면 논문 저자들이 해당 모델로 최종적으로 하고 싶은것은 TTS(Text To Speech), VC(Voice Conversion), SVS(Singing Voice Synthesis) 등을 공유하는 한가지의 프레임워크를 제작하는 것임을 알 수 있고, 그것이 바로 Make-A-Voice 인 것이다.
2. 구조
Stage 를 보면 결국 크게 3가지로 구분된다.
- $S_1$ : Semantic Stage 로 Speech, Text(Label) 을 받아 Semantic Tokens 로 출력한다.
- $S_2$ : Acoustic Stage 로 Speaker Prompt 와 선택적으로 F0 Prompt 를 입력받아 Acoustic Tokens 로 출력한다.
- $S_3$ : Generation Stage 로 실질적으로 음성을 생성한다. F0 Excitation 은 선택적으로 입력받는다.
여기서 음성 합성 프레임워크를 discrete representations 와 공유함으로서 TTS의 경우 Text Input 이 자동회귀적(autoregressively) 으로 Semantic Tokens 로 변환된다. (이는 자동적으로 이전 단계의 결과를 기반으로, 다음 단계를 생성하거나 변환한다는 것을 의미한다.)
이후에 $S_2$에서 Speaker Prompt(음성 데이터가 아닌, 화자에 대한 추가적인 정보들.) 가 주어지면 이를 Acoustic Token 으로 변환된다. 이때, 하려는 작업이 VC인지, SVS 인지에 따라서 과정이 달라진다.
- VC일 경우 HuBERT 모델에 의해 Semantic Tokens 으로 토큰화 된 다음, Speaker Prompt 가 주어지면 Acousctic Tokens 로 변환된다.
- SVS 일 경우 Semantic Tokens 가 TTS로 자동회귀적(Transformer)으로 생성된 후, 화자와 F0 프롬프트가 주어지면 Acoustic 토큰이 생성된다.
2-1. Semantic Tokens
추가로 언어에 대한 콘텐츠 정보를 제공하는데 HuBERT 가 효과적인 것으로 확인하였다고 한다.(즉 HuBERT 로 Semantic tokens 을 제작) 라벨링되지 않은 음성에 대해 훈련된 HuBERT는 16kHz 로 샘플링된 음성을 20ms 마다 연속적인 표현으로 인코딩 하는 방식으로 작동된다.
2-2. Acoustic tokens
음향 코덱 모델은 일반적으로 audio encoder, residual vector-quantizer(RVQ), audio decoder 로 구성되며, 결국 아래와 같은 과정을 따른다.(위의 그림 2 를 참고하며 보면 좋다.)
- audio encoder $E$는 여러 convolution block 으로 구성되며, 16kHz 에서 20ms 보다 연속적인 표현을 생성한다.
- $RVQ$($Q$라고도 지칭) 는 $K_2$ 크기의 코드북을 사용해 이산 표현 $a_q$ 를 생성한다.
- audio decoder $D$는 압축된 잠재 표현인 $a_q$ 로부터 신호 $\hat{y}$ 를 재구성한다.
2-3. 구조 요약
외에도 논문에서는 $S_1, S_2, S_3$ 에 관해서 상세히 설명하고 있지만 요약하자면 아래와 같다.
- $S_1$ : 토큰화된 텍스트, 음성을 Semantic Tokens 로 매핑한다.
- $S_2$ : $S_1$ 에서 추출된 Sementic Tokens 를 Acoustic Tokens 로 매핑한다. 해당 부분에서 화자의 억양, 감정, 운율이나, 심지어 인구, 통계 등 각종 데이터를 이용해 zero-shot 의 견고성을 향상시킨다.
- $S_3$ : $S_2$ 에서 추출된 정보로 최종적인 음성을 합성한다.
이런 과정을 통해서 위에서 언급한 VC, TTS, SVS 3가지를 수행할 수 있다.
각 과정에 대한 요약은 아래와 같다.
- VC : speech sample 은 semantic tokens 로 토큰화 된 후, speaker prompt 가 주어딘 대상 스피커의 acoustic tokens 로 변환된다.
- TTS : 음소(phoneme) 시퀀스는 semantic tokens 로 변환되며 speaker prompt 정보를 토대로 acoustic tokens 로 변환된다.
- SVS : 음소(phoneme) 시퀀스는 semantic tokens 로 변환되며, F0 prompt(MIDI)와 speaker prompt 가 주어지면 acoustic tokens 로 변환된다.
3. 결론
결론적으로 저자들은 Make-A-Voice는 인간의 목소리를 모델링하기 위해 'coarse-to-fine' 기법을 사용하였다. 이는 모델이 음성 합성을 위해 의미론적 정보와 음향적 정보를 점진적으로 조합하고 활용하는 과정, 즉 위에서 말한 $S_1, S_2, S_3$ 과정을 의미한다고 추측한다.
데이터는 영어 기준 LibriLight 60,000 시간 데이터를 사용하였고, SVS 테스트 용으로 중국어 노래 OpenCPOP 에서 50시간 분량 데이터를 사용하였다고 한다.
최종적인 결과를 보면 '마냥' 우수하진 않지만, 전반적으로 이전 방법들 대비 근소하게 높은 결과를 확인할 수 있다.
참고로 MVoice 에 대한 성능은 해당 링크에서 체험해 볼 수 있다.
4. 느낀점
우선 해당 모델을 직접적으로 테스트해 본 것이 아니기에, 전체적인 느낌은 정보가 좀 부족하다는 느낌이 든다. 위에서 언급한 다른 리뷰어들의 반응을 살펴봐도 대충 비슷한 느낌으로 장점과 단점을 이야기 하고 있다.(3가지 통합한건 뭐... 좋네, 근데 이거 증명이 좀 빈약한것 같네... 라는 느낌)
해당 논문을 보고 개인적으로 연구중인 과제에 대해서 TTS 를 고려해 볼만한 필요성을 느꼇다.