《PITCHNET —— UNSUPERVISED SINGING VOICE CONVERSION WITH PITCH ADVERSARIAL NETWORK》

0906组会分享

0906组会分享:歌唱转换 singing voice conversion

image-20200905170750870

  • 论文的 baseline 对象:image-20200905171528462

  • BaseLine 的贡献和缺点

贡献:

  1. 利用 AE 模式下的无监督方式,解决了 平行语料的问题
  2. 组成模块:WaveNetlike Encoder && WaveNet autoregressive Decoder && Speaker-Embedding Table(leanable)

缺点:

  1. 和StarGan-VC之类的 单纯说话VC 任务不同,歌唱转换的效果重点是:说话人相似性 && 音调合理性
  2. BaseLine 在音调处理上差强人意,总而言之,“语音和音调的联合表示”是难点

  • 解决的问题

  1. 走调(音高 Pitch 失控现象)问题的缓解
    1. 在 Baseline 的 AE无监督 模式下,附带一个额外的音调回归网络(GAN)可以将音调信息从潜在空间中分离出来
    2. 目的是:让原本的Encoder在单纯学习 说话人无关的语言信息 基础上,再额外剥离掉 音高信息not only singer-invariant but also pitch-invariant representation
  2. 至于音高信息,当成一个独立问题来解决:设立独立模块来提取 source音高信息,以此配合 Decoder ,来操控 生成语音音高
    1. (根据作者相关 Git 项目下的 issue 讨论,这部分工作借用 Kaldi 来完成)
    2. 【实现 音高可控性

模型

image-20200905223845590

image-20200905223857883

  • Singer Classification Network Pitch Regression Network 是为了使得 Encoder 能够在抽取特征向量 z 时,把 说话人信息 && 音调信息 都剥离掉

Training Loss:三个Loss

  1. singer classification loss
  2. pitch regression loss
  3. reconstruction loss

几个公式的清晰理解:

image-20200906141103220

  1. 说明了AE网络的Decoder产生结果 所需要的输入元素(Encoder结果+Kaldi抽取的音高+Embedding信息)
  2. 介绍重构损失:在Decoder时配合source的embedding,和source语音做Loss

image-20200906141138234

  1. 一个 说话人分类器,同理为 StarGan-VC 的Domain-Classification,分类对象,是Encoder结果&&Embedding
  2. 另一个音高分类器,Pitch信息由 Kaldi 提取
  3. 总的Loss结构:因为重构损失⬇️越好,另一方面,对于两个分类器,我们希望我们的 Encoder提取出来的隐变量 能彻底剥离 说话人信息 && Pitch信息,所以这两个的误差,对于结果来说,应该越大越好。(所以这两个部分是配合 负号)
  4. 上述两个 C分类器的损失,对于EncoderClassifier来说,是完全相反的,【就是典型的GAN对抗思路】,所以他们的训练,采取“你一次我一次的过程”
    • 训练中,缩小 $$L_{total}$$ 时,促进的是 Encoder 将两个元素剥离
    • 缩小 $L_{ad}$ 时,促进的是 Classifier 具有更强的分类能力,能看透隐变量 z 的实质和归属

Ps.整体思路比较清晰,就是自回归那个部分不知道是怎么具体实现的


Quantitative and Qualitative Experiments**【定量 和 定性 实验】


Tencent :LPCNet,

1
2
python convert_tfrecord_to_lmdb.py --dataset=celeba --tfr_path=/data/hsj/NVAE/DATA_DIR/celeba/celeba-tfr --lmdb_path=/data/hsj/NVAE/DATA_DIR/celeba/celeba-lmdb --split=train
python convert_tfrecord_to_lmdb.py --dataset=celeba --tfr_path=/data/hsj/NVAE/DATA_DIR/celeba/celeba-tfr --lmdb_path=/data/hsj/NVAE/DATA_DIR/celeba/celeba-lmdb --split=validation
1
2
3
4
5
6
7
8
9
10
11
export EXPR_ID=/data/hsj/NVAE/EXPR_ID
export DATA_DIR=/data/hsj/NVAE/DATA_DIR/celeba/celeba-lmdb
export CHECKPOINT_DIR=/data/hsj/NVAE/CHECKPOINT_DIR
export CODE_DIR=/data/hsj/NVAE
cd /data/hsj/NVAE
CUDA_VISIBLE_DEVICES=1
python train.py --data /data/hsj/NVAE/DATA_DIR/celeba/celeba-lmdb --root /data/hsj/NVAE/CHECKPOINT_DIR --save /data/hsj/NVAE/EXPR_ID --dataset celeba_64 \
--num_channels_enc 64 --num_channels_dec 64 --epochs 90 --num_postprocess_cells 2 --num_preprocess_cells 2 \
--num_latent_scales 3 --num_latent_per_group 20 --num_cell_per_cond_enc 2 --num_cell_per_cond_dec 2 \
--num_preprocess_blocks 1 --num_postprocess_blocks 1 --weight_decay_norm 1e-1 --num_groups_per_scale 20 \
--batch_size 16 --num_nf 1 --ada_groups --num_process_per_node 8 --use_se --res_dist --fast_adamax
1
2
3
4
5
6
CelebA64 数据预处理

cd $CODE_DIR/scripts
python create_celeba64_lmdb.py --split train --img_path ./DATA_DIR/celeba_org/celeba --lmdb_path ./DATA_DIR/celeba64_lmdb
python create_celeba64_lmdb.py --split valid --img_path ./DATA_DIR/celeba_org/celeba --lmdb_path ./DATA_DIR/celeba64_lmdb
python create_celeba64_lmdb.py --split test --img_path ./DATA_DIR/celeba_org/celeba --lmdb_path ./DATA_DIR/celeba64_lmdb
1
python create_celeba64_lmdb.py --split train --img_path ../DATA_DIR/celeba_org/celeba --lmdb_path ../DATA_DIR/celeba64_lmdb
1
python convert_tfrecord_to_lmdb.py --dataset=celeba --split=validation
1
2
3
4
5
python train.py --data $DATA_DIR/celeba64_lmdb --root $CHECKPOINT_DIR --save $EXPR_ID --dataset celeba_64 \
--num_channels_enc 64 --num_channels_dec 64 --epochs 90 --num_postprocess_cells 2 --num_preprocess_cells 2 \
--num_latent_scales 3 --num_latent_per_group 20 --num_cell_per_cond_enc 2 --num_cell_per_cond_dec 2 \
--num_preprocess_blocks 1 --num_postprocess_blocks 1 --weight_decay_norm 1e-1 --num_groups_per_scale 20 \
--batch_size 16 --num_nf 1 --ada_groups --num_process_per_node 8 --use_se --res_dist --fast_adamax

/Users/huangshengjie/Desktop/NVAE/scripts/data1/datasets/imagenet-oord