728x90
반응형
코드 파헤치기 🔥
- make_spect.py : Generate spectrogram data from the wav files npy 형태로 melspectrogram이 생성됨
- make_metadata.py : Generate speaker embeddings and metadata for training 위에서 만든
./spmel 폴더에 train.pkl 생성metadata.pkl 생성 - main.py : Run the main training script & Converges when the reconstruction loss is around 0.0001
- conversion.ipynb : Download pre-trained AUTOVC model and run it autovc.ckpt 로드하고, metadata.pkl 역시 불러서 result.pkl을 만든다.
- vocoder.ipynb : Download pre-trained WaveNet Vocoder model and run it
시행착오 🔥
💡 Please note the training metadata and testing metadata have different formats 💡
- 기존의 result.pkl은 pretrained autovc.ckpt & metadata.pkl을 conversion.ipynb 통해 result.pkl 만든 결과다.
- 기존의 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 불러오고 변환
- conversion
- etc
- wavs folder
- p225 / p226 / p227 / p228 각 화자당 10개 발화 존재
- metadata.pkl
- 상기 각 화자당 발화 하나씩 붙어있는 metadata 존재 (make_metadata.py 결과 아님)
- results.pkl
- 상기 파일들로 구성한 Conversion 결과 저장된 파일
- wavs folder
- 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
- p228_Speaker
- p270 → p228
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
하나. 스펙트로그램 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개의 음성 파일 합성됨
- sample 음성으로 직접 conversion하고, result.pkl 만들어서 합성해보자.
- 왜 갑자기.. 되니… 진짜 Resampling 덕인가,,
- p225 → p225
- p225 → p226
- p226 → p225
- p226 → p226
Finally Train Complete 🔥
- VCTK Dataset 16,000 sampling rate 만들고, 화자 4명으로 학습시켜보자
- 학습중
- (16h24m44s)
- 학습 완료 (220629 오전) → Vocoder 돌려놓음
- 드디어 AUTOVC 직접 학습시킨 모델에서 사람의 음성이 들리기 시작 🔥
- 다만, Linguistic Feature를 잘 따지는 못하여 중복되는 음성 들림
- 아마 정교한 BottleNeck Control 해야 결과가 좋다는 것이 이런 말인듯
- 원본
- Conversion
⭐️ How to make progress in the task
- 정교한 BottleNeck 조절로부터 벗어나자
- Speaker Embedding 방식에 대한 고민
- Contents Encoder가 과연 Contents Encoder인가
- Metric에 대한 고민
728x90
반응형
'대외활동 > 포스텍 인공지능연구원 연구인턴 & 연장' 카테고리의 다른 글
[ 포스텍 인공지능연구원 연구인턴 ] HiFi-GAN Reproducing 코드 구현 (0) | 2022.07.26 |
---|---|
[ 포스텍 인공지능연구원 연구인턴 ] HiFi-GAN 논문 리뷰 / Vocoder 개념 설명 및 정리 (0) | 2022.07.22 |
[ 포스텍 인공지능연구원 연구인턴 ]Variational Auto-Encoder & Maximum Likelihood Estimation (0) | 2022.07.01 |
[ 포스텍 인공지능연구원 연구인턴 ]AUTOVC 개념 정리 및 논문 리뷰 (0) | 2022.06.07 |
[ 포스텍 인공지능연구원 연구인턴 ]Voice Conversion 개념 및 MaskCycleGAN-VC 논문 리뷰 (0) | 2022.06.06 |