の自由帳

実験記録 54314b33

StarGAN もどきによる声質変換。

モデル

graph TD

subgraph Input
    input-spectrogram("&laquo;Input&raquo;<br/>Spectrogram<br/>1 x 256 x 256<br/>[0, 1]")
    input-speaker("&laquo;Input&raquo;<br/>Speaker<br/>1421<br/>{0, 1}")
    input-birth("&laquo;Input&raquo;<br/>BirthPlace<br/>53<br/>{0, 1}")
    input-sex("&laquo;Input&raquo;<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("&laquo;Output&raquo;<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("&laquo;Input&raquo;<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("&laquo;Output&raquo;<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("&laquo;Output&raquo;<br/>Speaker<br/>1421 x 1 x 1")
    y_birth("&laquo;Output&raquo;<br/>BirthPlace<br/>53 x 1 x 1")
    y_sex("&laquo;Output&raquo;<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

結果

1000epoch 時点での出力

学習曲線

感想

出力はなんとなく女性の話し声のように聞こえないこともないが、入力の言語情報が維持できていない。これは、Generator のモデルの大きさか、学習方法に問題があると推測できる。

Discriminator は、話者分類の精度がかなり低い。これは、Discriminator のモデルの大きさに問題があると推測できる。

以上から、次回以降の目標を次のように定める。

  1. 話者を分類できるだけの空間をもった Discriminator を作る

    通常の分類器として学習させ、そのモデルが要件を満たすことを確かめる。

  2. 言語情報を維持できる Generator を作る

    AutoEncoder として学習させ、そのモデルが要件を満たすことを確かめる。