実験記録 54314b33
StarGAN もどきによる声質変換。
モデル
graph TD
subgraph Input
input-spectrogram("«Input»<br/>Spectrogram<br/>1 x 256 x 256<br/>[0, 1]")
input-speaker("«Input»<br/>Speaker<br/>1421<br/>{0, 1}")
input-birth("«Input»<br/>BirthPlace<br/>53<br/>{0, 1}")
input-sex("«Input»<br/>Sex<br/>2<br/>{0, 1}")
concat0((concat))
end
subgraph Encode
conv1[Convolution<br/>ch: 32, ksize: 4, stride: 2, padding: 1<br/>BatchNormalization<br/>ReakyReLU]
conv2[Convolution<br/>ch: 64, ksize: 4, stride: 2, padding: 1<br/>BatchNormalization<br/>ReakyReLU]
conv3[Convolution<br/>ch: 128, ksize: 4, stride: 2, padding: 1<br/>BatchNormalization<br/>ReakyReLU]
conv4[Convolution<br/>ch: 256, ksize: 4, stride: 2, padding: 1<br/>BatchNormalization<br/>ReakyReLU]
end
conv4-out(256 x 16 x 16)
repeat((repeat<br/>16x16))
concat1((concat))
merge[Convolution<br/>ch: 256, ksize: 3, stride: 1, padding: 1<br/>BatchNormalization<br/> ReakyReLU]
subgraph ResBlocks
res1[ResBlock<br/>ch: 256, ksize: 3, stride: 1, padding: 1<br/>BatchNormalization<br/>ReakyReLU]
res2[ResBlock<br/>ch: 256, ksize: 3, stride: 1, padding: 1<br/>BatchNormalization<br/>ReakyReLU]
res3[ResBlock<br/>ch: 256, ksize: 3, stride: 1, padding: 1<br/>BatchNormalization<br/>ReakyReLU]
res4[ResBlock<br/>ch: 256, ksize: 3, stride: 1, padding: 1<br/>BatchNormalization<br/>ReakyReLU]
end
concat2((concat))
subgraph Decode
dconv1[Deonvolution<br/>ch:128, ksize: 4, stride: 2, padding: 1<br/>BatchNormalization<br/>ReakyReLU]
dconv2[Deonvolution<br/>ch:64, ksize: 4, stride: 2, padding: 1<br/>BatchNormalization<br/>ReakyReLU]
dconv3[Deonvolution<br/>ch:32, ksize: 4, stride: 2, padding: 1<br/>BatchNormalization<br/>ReakyReLU]
dconv4[Deonvolution<br/>ch:1, ksize: 4, stride: 2, padding: 1<br/>sigmoid]
end
output("«Output»<br/>Spectrogram<br/>1 x 256 x 256<br/>(0, 1)")
input-speaker --> concat0
input-birth --> concat0
input-sex --> concat0
concat0 --> |1476| repeat
input-spectrogram --> conv1
conv1 --> | 32 x 128 x 128 | conv2
conv2 --> | 64 x 64 x 64 | conv3
conv3 --> | 128 x 32 x 32 | conv4
conv4 --> conv4-out
conv4-out --> concat1
repeat --> | 1476 x 16 x 16 | concat1
concat1 --> |1732 x 16 x 16| merge
merge --> | 256 x 16 x 16 | res1
res1 --> | 256 x 16 x 16 | res2
res2 --> | 256 x 16 x 16 | res3
res3 --> | 256 x 16 x 16 | res4
res4 --> | 256 x 16 x 16 | concat2
conv4-out --> concat2
concat2 --> | 512 x 16 x 16 | dconv1
dconv1 --> | 128 x 32 x 32 | dconv2
dconv2 --> | 64 x 64 x 64 | dconv3
dconv3 --> | 32 x 128 x 128 | dconv4
dconv4 --> output
graph TD
input("«Input»<br/>Spectrogram<br/>1 x 256 x 256<br/>[0, 1]")
conv1[Convolution<br/>ch: 32, ksize: 4, stride: 2, padding: 1<br/>BatchNormalization<br/>ReakyReLU]
conv2[Convolution<br/>ch: 64, ksize: 4, stride: 2, padding: 1<br/>BatchNormalization<br/>ReakyReLU]
conv3[Convolution<br/>ch: 128, ksize: 4, stride: 2, padding: 1<br/>BatchNormalization<br/>ReakyReLU]
conv4[Convolution<br/>ch: 256, ksize: 4, stride: 2, padding: 1<br/>BatchNormalization<br/>ReakyReLU]
conv5[Convolution<br/>ch: 512, ksize: 4, stride: 2, padding: 1<br/>BatchNormalization<br/>ReakyReLU]
subgraph Output
h("«Output»<br/>Feature<br/>512 x 8 x 8")
clz_speaker[Convolution<br/>ch: 1421, ksize: 8, stride: 0, padding: 0<br/>softmax]
clz_birth[Convolution<br/>ch: 53, ksize: 8, stride: 0, padding: 0<br/>softmax]
clz_sex[Convolution<br/>ch: 2, ksize: 8, stride: 0, padding: 0<br/>softmax]
y_speaker("«Output»<br/>Speaker<br/>1421 x 1 x 1")
y_birth("«Output»<br/>BirthPlace<br/>53 x 1 x 1")
y_sex("«Output»<br/>Sex<br/>2 x 1 x 1")
end
input --> conv1
conv1 --> |32 x 128 x 128| conv2
conv2 --> |64 x 64 x 64| conv3
conv3 --> |128 x 32 x 32| conv4
conv4 --> |256 x 16 x 16| conv5
conv5 --> h
h --> clz_speaker
clz_speaker --> y_speaker
h --> clz_birth
clz_birth --> y_birth
h --> clz_sex
clz_sex --> y_sex
学習
Discriminator
(たぶん)普通のStarGAN。
CGAN + WGAN-gp みたいな感じ。
Generator
(たぶん)普通のStarGAN + feature matching loss + identity mapping loss。
identity mapping loss は、StarGANで明度が反転したような画像を生成するように学習してしまうケースが報告されていたため。
feature matcing loss はなんとなく。
パラメータ
optimizer: RMSprop
learning rate: 1e-5
minibatch size: 5
epoch: 1000
結果
学習曲線
感想
出力はなんとなく女性の話し声のように聞こえないこともないが、入力の言語情報が維持できていない。これは、Generator のモデルの大きさか、学習方法に問題があると推測できる。
Discriminator は、話者分類の精度がかなり低い。これは、Discriminator のモデルの大きさに問題があると推測できる。
以上から、次回以降の目標を次のように定める。
-
話者を分類できるだけの空間をもった Discriminator を作る
通常の分類器として学習させ、そのモデルが要件を満たすことを確かめる。
-
言語情報を維持できる Generator を作る
AutoEncoder として学習させ、そのモデルが要件を満たすことを確かめる。