대외활동/포스텍 인공지능연구원 연구인턴 & 연장

[ 포스텍 인공지능연구원 연구인턴 ]AUTOVC 코드 리뷰 및 Reproducing

hae-koos 2022. 7. 6. 21:02
728x90
반응형

코드 파헤치기 🔥

  1. make_spect.py : Generate spectrogram data from the wav files npy 형태로 melspectrogram이 생성됨
  2. make_metadata.py : Generate speaker embeddings and metadata for training 위에서 만든
    ./spmel 폴더에 train.pkl 생성 metadata.pkl 생성
  3. main.py : Run the main training script & Converges when the reconstruction loss is around 0.0001

 

  1. conversion.ipynb : Download pre-trained AUTOVC model and run it autovc.ckpt 로드하고, metadata.pkl 역시 불러서 result.pkl을 만든다.
  2. vocoder.ipynb : Download pre-trained WaveNet Vocoder model and run it

시행착오 🔥

💡 Please note the training metadata and testing metadata have different formats 💡

  1. 기존의 result.pkl은 pretrained autovc.ckpt & metadata.pkl을 conversion.ipynb 통해 result.pkl 만든 결과다.
  2. 기존의 metadata.pkl의 경우, p225 / (256, ) / (90, 80) 형태로 저장되어 있는데 make_spect.py로 만든 npy를 np.load로 불러준 train.pkl은 너무 다름. 


More Details 🔥

git clone https://github.com/auspicious3000/autovc.git → .py & .ipynb

  • data_loader train.pkl에서 데이터 불러오기, Random Crop, 10명 단위로 학습 병렬 처리
  • hparams sample_rate, num_mels, fft_size, hop_size 등 모든 parameter 값 저장한 Dictionary
  • main 흔한 main.py
  • make_metadata
    • Pretrained Speaker Embedding Vector 통과시켜 Speaker 정보 추출
    • 디렉토리 내 mel-spectrogram 파일로부터 화자 / speaker_embedding (256) / utterances.npy 리스트 형태로 메타데이터 생성
  • make_spect
    • wav → Mel-spectrogram
    • 5th-order butterworth filter로 Noise 제거
    • log scaling 형태로 mel-spectrogram 생성 → 시각화 시 주의
  • model_bl
    • speaker encoder 구조 설계와 forward 함수 정의
  • model_vc
    • Encoder & Decoder & PostNet 까지 전반적인 Voice Conversion Network 구조
    • Encoder : Conv & BiLSTM & BottleNeck 구조 확인
    • self.freq = 3으로 설정되어 있고, 그 간격으로 downsampling
    • Decoder : dim_neck*2 + dim_emb 사이즈 Input
    • Dilation 주고 Convolution
    • Postnet 태우기 전과 후 Recon Loss 따로 계산해서 모델 안정화 (최종 return 체크)
  • solver_encoder
    • 학습 돌리는 코드
    • Loss check
  • systhesis
    • WaveNet Vocoder 관련
  • .ipynb
    • conversion
      • autovc pretrained model & metadata 불러오고, postnet까지 태운 친구 결과로 사용
      • Input : Source Utterance / Source Speaker Vector / Target Speaker Vector
      • 여기서 metadata는 make_metadata.py의 결과와 다르다는 점에 주의 → 화자 / Speaker_embedding (256) / 음성 파일 하나 형태
      • result.pkl 형태로 결과를 저장하며, 화자 / 음성 형태
    • vocoder
      • result.pkl & pretrained wavenet 불러오고 변환
  • etc
    • wavs folder
      • p225 / p226 / p227 / p228 각 화자당 10개 발화 존재
    • metadata.pkl
      • 상기 각 화자당 발화 하나씩 붙어있는 metadata 존재 (make_metadata.py 결과 아님)
    • results.pkl
      • 상기  파일들로 구성한 Conversion 결과 저장된 파일
  • additional pretrained model
    • 3000000-BL.ckpt (Speaker Encoder Weights)
    • autovc.ckpt (Conversion Network Weights)
    • checkpoint_step001000000_ema.pth (WaveNet Weights)

Pretrained Ver FIRST 🔥

불친절한 Github : sample wav 파일 화자와 vocoder로 pkl 파일 합성해서 나오는 결과 화자 다르게 둠 🤬

sample : p225 (여) / p226 (남) / p227 (남) / p228 (여) pkl : p225 (여) / p228 (여) / p256 (남) / p270 (남)

Conversion by Pretrained Model
p225 (여) / p228 (여) / p256 (남) / p270 (남)

⚠️ Cherry Picking 주의

  • p270_Content

p270_001_mic1.wav
0.22MB

  • p228_Speaker

p228_008.wav
0.22MB

  • p270 → p228

p270xp228.wav
0.05MB

 


Finally Train Complete 🔥

  • wav file load 할 때, range 문제 ?
    • 소수점 끝 차이인데 mel-spectrogram 형태를 못알아볼 정도로 바뀔까?

  • wavegen vocoder 활용해서 librosa & make_spect.py 결과 각각 음성으로 바꿔 들어보자.
    • librosa.feature.melspectrogram(y=y, n_mels=80, n_fft=1024, hop_length=256, sr = 16000)

  • make_spect.py

author_make_spect.wav
0.18MB


하나. 스펙트로그램 Visualize 방식이 안맞아서 그렇지, 아래 그림 Vocoder 작동됨
둘. 오히려 wavegen vocoder 쓰면 위 그림에서 음성 합성 이상하게 됨
→ … 근데 왜 conversion 직접 시키면 음성 합성 안되냐고… 한 번만 더 해보자
  • 저자가 준 코드를 그대로 활용해보자. 계속 안됐지만 마지막으로 한 번만 더 (샘플 음성 024 기준)
    • sample 음성으로 직접 conversion하고, result.pkl 만들어서 합성해보자.
      • 일단 [ 음성 → 스펙트로그램 ] 만든 결과에서 make_metadata.py 돌려야 speaker embedding 결과 같이 붙어.
      • make_metadata.py는 훈련용이라 npy 이름이 들어가므로 이를 np.load로 스펙트로그램 값 받고 기존 metadata.pkl과 동일한 형태로 편집 → conversion.py 돌리기
      • 그렇게 만들어진 result.pkl vocoder 돌리면 화자 두 명 기준 4개의 음성 파일 합성됨
  • 왜 갑자기.. 되니… 진짜 Resampling 덕인가,,
    • p225 → p225

p225xp225.wav
0.18MB

  • p225 → p226

p225xp226.wav
0.18MB

  • p226 → p225

p226xp225.wav
0.19MB

  • p226 → p226

p226xp226.wav
0.19MB


Finally Train Complete 🔥

  • VCTK Dataset 16,000 sampling rate 만들고, 화자 4명으로 학습시켜보자
    • 학습중
    • (16h24m44s)
  • 학습 완료 (220629 오전) → Vocoder 돌려놓음
  • 드디어 AUTOVC 직접 학습시킨 모델에서 사람의 음성이 들리기 시작 🔥
    • 다만, Linguistic Feature를 잘 따지는 못하여 중복되는 음성 들림
    • 아마 정교한 BottleNeck Control 해야 결과가 좋다는 것이 이런 말인듯
  • 원본

p230_005_mic1.wav
0.24MB

 

p231_005_mic1.wav
0.15MB
p232_005_mic1.wav
0.20MB

  • Conversion

p230xp231.wav
0.24MB
p230xp232.wav
0.24MB


⭐️ How to make progress in the task

- 정교한 BottleNeck 조절로부터 벗어나자

- Speaker Embedding 방식에 대한 고민

- Contents Encoder가 과연 Contents Encoder인가

- Metric에 대한 고민

  1.  
728x90
반응형