Friday, December 29, 2017

논문 요약 - Wavenet based low rate speech coding

Wavenet based low rate speech coding



아마도 ICASSP 2018 제출본같네요. 

1. Introduction

스피치 코딩 리뷰는 생략합니다.
웨이브넷WaveNet은 워낙 유명하죠. 1D dilated convolution (=causal convolution)을 오디오에 샘플단위로 적용하는 generative model입니다. 현재 구글 TTS에 들어가있습니다. 

이 논문은 두 가지를 제시합니다.
i) 파라미터를 디코딩하는 웨이브넷 디코더
ii) 파라미터와 파형을 인코딩-디코딩하는 웨이브넷 코더

2. Algorithm

2.1 Parametric WaveNet Coder

파라메트릭 코더는 말그대로 원본 오디오의 파라미터를 추정하고 (=인코딩), 이걸 전송하는 방식이죠. 디코더는 파라미터를 받아서 다시 파형을 생성하구요. 일단 웨이브넷으로 최적 파라미터를 압축하는것도 가능하겠지만 (예를 들어 오토인코더를 쓴다든지..) 이 논문에서는 그부분은 건드리지 않았습니다. 후속 연구가 충분히 가능한 부분이죠. 일반적으로 사용하는 파라미터는 {spectral envelope, pitch, voicing level}입니다. 물론 제안하는 방식은 어떤 파라미터 셋이라도 상관없이 작동합니다 (학습을 새로 해야하지만요). 이 논문에서는  오픈소스인 Codec 2를 이용합니다. Codec 2는 2.4kbps에서 Θ={spectral envelope, pitch, signal power, voicing level}을 이용하는군요. 각각 20ms마다 36/7/5/2비트를 쓰구요.

이제 이 파라미터로 파형을 복원하는 과정(=디코딩)에서 웨이브넷을 생성모델로 사용합니다. 웨이브넷은 원래 과거 N개의 오디오 샘플을 이용해 다음 샘플을 생성하는데, 여기에 추가적으로 이 파라미터 Θ가 입력값으로 들어갑니다. 즉, 웨이브넷은 p(y_t|y_t-1, y_t-2, .. , Θ)를 모델링합니다.

학습과정이나 사용한 웨이브넷 구조가 아주 명확하게 나오진 않은점이 아쉽네요. 웨이브넷은 오디오 샘플단위로 값을 생성하고, 여기에서 Θ의 시간 해상도는 10ms입니다. 웨이브넷 내부적으로는 모든 레이어마다 Θ를 입력으로 넣어준다고 합니다. 각종 도메인의 생성 모델에서 흔히 하는 방식이죠. 학습은 역시 전형적인 웨이브넷으로, μ-law를 따르는 8비트 양자화된 진폭 값 중 하나를 고릅니다. 다시말해 256개의 클래스중 하나로 분류작업을 수행하는거죠 (세부사항은 웨이브넷 논문 참조). 학습셋의 시간이나 특성이 자세히 안나왔네요. 일단 화자 여러명이 섞여있는 데이터를 사용했다는 정도입니다. 화자는 당연히 모델링하지 않구요.

2.2 Rate Analysis

뒤에 나오는 실험 섹션에서 Speech information rate을 구하는 방법을 소개합니다. 

식 (1)은 결과로 나온 출력 파형과 파라미터의 엔트로피 H(S, Θ) = H(S|Θ) + H(Θ) 라는 이야기입니다. 즉, 전체 정보량은 생성과정의 정보량과 파라미터의 정보량의 합입니다.

H(S|Θ)는 웨이브넷 생성과정의 정보량입니다. 웨이브넷은 θ_i와 s_{i-1}, s_{i-2},.. 를 이용해 s_i를 예측합니다. 여기서 i는 시간 인덱스입니다. 이렇게 예측한 확률변수를 q^i로 정의했군요. 더 엄밀하게는 q_{n}^{i}입니다. n은 총 256개의 진폭을 나타내는 인덱스구요. 그러면 이 확률변수의 분포로 i번째 인덱스에서 엔트로피를 구할 수 있습니다. 이게 식 (2)입니다. 실제로 이 값을 구하려면 별다른 구현 없이 그냥 웨이브넷으로 진폭을 예측하면 됩니다. 실제 진폭은 argmax_n(q)를 구해야하고, 엔트로피는 q로 구합니다. 

식(3)은 식 (2)를 충분히 긴 신호에서 구해서 평균을 낸다는 말입니다.

2.3 WaveNet Waveform Coder

이제 더 성능이 좋은 코더를 제시합니다. 파라미터와 파형을 같이 코딩하는거죠.

저자가 강조하는 점이 있네요. 2.1에서 소개한 파라메트릭 코더의 성능이 잘 나오지 않는 부분을 탐지할 수 있습니다. 인코더에서 2.1의 파라메트릭 웨이브넷 디코더를 써보고 원본과 복원신호의 유사성을 (log-likelihood로) 평가할 수 있으니까요. 그리고 성능이 안나오는 경우에 파형까지 같이 코딩하면 된다고 합니다. 다만 인코딩 딜레이가 t_e, 웨이브넷 디코딩 딜레이가 t_d라고 하면 이 방법을 쓰면 최소한 t_e += t_d 가 되겠죠.

웨이브넷 파형 코딩은 대략 30kbps 이하로 작동한다고 합니다. 그리고 여기서는 variable rate을 가정합니다. 왜냐면 제안하는 구조에 당연히 그게 맞습니다. 일단 구조를 보면,

   양자화 Q : R --> N,
   디코딩 Z : N --> R

이고 여기에서도 역시 Q는 μ-law를 따르는 8비트 양자화입니다. 

   n[i] = Q(x[i])
   x_hat[i] = Z(n[i])

로 수학기호대신 변수처럼 이름을 붙이겠습니다. 

인코더에서는 파형을 양자화한 뒤 이를 엔트로피 코딩으로 압축해서 2.1에서 쓴 파라미터 Θ랑 같이 보냅니다. 여기에서 모든 변수에 _i가 붙어있는걸 주목하세요. 각 샘플마다  여기에서도 2.1에서와 마찬가지로 웨이브넷은 p(y_t|y_t-1, y_t-2, .. , Θ)를 모델링합니다. 

그리고 학습된 동일한 웨이브넷이 인코더와 디코더에 존재합니다. 인코더에서는 q의 분포를 이용해 엔트로피 코딩을 하고, 디코더에서는 양자화된 파형으로 복원하는데 씁니다. 

전체 다이어그램이 없어서 좀 헷갈렸는데, 정리하면 다음과 같습니다.

인코더:
  입력: 파형 x∈R 가 들어옴.
  양자화: n[i] = Q(x[i])  # mu-law
  파라미터 추출: θ[i] = 파라미터 추출(x[i])  # 입력이 x[i]인지 n[i]인지 정확히 모르겠음
  확률분포 prob[i] = wavenet@encoder(θ[i], x_hat[i-513:i-1]) # 513은 임의의 숫자로 웨이브넷 전체의 입력신호 길이
  압축: n_zip[i] = zip(n[i], prob[i])  # 확률분포 prob[i]를 이용한 엔트로피 코딩

  출력: n[i], θ[i]

디코더:
  입력: n[i], θ[i]
  확률분포 prob[i] = wavenet@decoder(θ[i], x_hat[i-513:i-1]) # 513은 임의의 숫자로 웨이브넷 전체의 입력신호 길이
  압축해제: n[i] = unzip(n_zip[i], prob[i])
  출력 x_hat[i] = inverse_Q(n[i])  # 이 출력이 디코더의 웨이브넷으로 들어감.

* wavenet@encoder == wavenet@decoder입니다.
* 생략되었는데, 인코더의 웨이브넷에서도 x_hat[i]가 필요합니다. 따라서 인코딩과정은 디코딩 전체 과정을 포함합니다. 이것은 아마 closed-loop coder가 다 그런것같네요.
* 8비트를 차지하는 n[i]보다 n_zip[i]의 평균 길이가 짧게 나옴
* 인코더, 디코더의 웨이브넷은 prob[i]를 제공하여 최적화된 엔트로피 코딩을 가능하게 함
* 이렇게 추정한 확률분포가 완벽하다면 전체 비트율은 식 (4)와 같게 나옴.  실제로는 완벽할수 없으므로 그보다 조금 더 필요하며 그 값이 바로 KLD(원본 확률분포, 추정한 확률분포)가 됨.
* 이 논문에서는 perceptual weighting은 포함하지 않음.

3. Experiments

우선 2.2에서 소개한 방법으로 정보량을 분석한 결과가 그림 1입니다. 저자는 웨이브넷이 음고(=주기 정보, 주기성)는 잘 예측한다고 분석했는데 과거 샘플로 현재를 예측하는 ARMA 구조를 생각하면 충분히 그럴것 같습니다.

객관평가결과(표 1)는 좀 애매합니다. 그러나 객관평가 수치에는 큰 의미를 두지 않네요.

주관평가결과(그림 2) 
 - 파라메트릭 웨이브넷 코더는 2.4 kbps인데 동일한 비트율을 갖는 Codec 2, MELP, Spex를 압도합니다. 
 - 원본과 웨이브넷 파형 코더(42 kbps)가 거의 같고, 비교군 중 AMR-WB(23kbps)도 웨이브넷 파형 코더보다 살짝 낮습니다. 이렇게 보면 웨이브넷 파형 코더는 조금 아쉽죠. 

그 외에도 화자 구별하는 실험을 수행했습니다. 이건 비교는 안하고 파라메트릭 웨이브넷 코더를 쓴 결과만 했는데, 다소 미약한 결과입니다.

----------

웨이브넷이 TTS에서 보여준 성능을 생각하면 이쪽 방향으로 연구가 많이 진행될것 같습니다. 다만 42 kbps면 그렇게 낮은 비트율이 아니라 웨이브넷 파형 코더는 아직은 구조가 복잡한데비해 뚜렷한 장점을 보여주진 못한게 아쉽습니다. 반대로 생각하면, 파라메트릭 웨이브넷의 구조에서 이미 충분한 정보가 포함되고 있다는 의미기도 하구요.

코딩과 TTS의 차이는 명확합니다. TTS는 정답이 여러개가 될 수 있습니다. 예를 들어 원본이 x[n]일때 TTS는 -1 * x[n]을 생성해도 아무런 문제가 없죠. 필요한 정보는 남아있으니까요. 하지만 코딩은 정보가 아니라 신호를 그대로 복원해야하죠.  따라서 TTS보다 더 어려운 문제일 수 있는데, 저는 여기에 집착하는 것보다 '정보'를 정확히 압축/represent하는 연구가 더 재밌을것같네요. 

No comments:

Post a Comment