SepFormerの改修を試みた動機
音源分離の分野でも機械学習が成果を上げているという情報を入手し、勉強を始めました。Libri2Mix データを作成し、最初は、Conv-TasNet を動かしてみました。学習ができ結果を再生してみると2話者の入力について、1人ずつの wav file を作ろうとしていることが確認できました。そこで、Transformer を使った音源分離プログラムに進みました。SepFormer と SepReformer を動くようにしました。学習結果は、SepFormer の Si-SNR loss が -13.59 で、SepReformer の Si-SNRi が13.68 でした。音源分離したファイルを再生してみると、若干ですが、SepReformer の方が、SepFormer より音質が良いように感じられました。そこで、SepFormer を改修してみようと考えました。
改修点
改修点は、損失関数に絞りました。SepFormer では、Si-SNR の値に -1 を乗じたものが損失関数に使われていました。SepReformer では、PIT_SI_SNR_mag と 4 stage の PIT_SI_SNR_time の平均が使われていました。PIT_SI_SNR_mag クラスと PIT_SI_SNR_time クラスを使わせていただくことにしました。そこで、SepFormer の masknet の中にある、masknet_numlayers を変更して self.dual_mdl を2層から 4層にして、層ごとに後処理をして、masknet の出力を4層としました。これらの出力から4層の est_source_layers を計算します。4層の est_source_layers の PIT_SI_SNR_time を計算して平均しました。また、est_source_layers[-1] から PIT_SI_SNR_mag を計算しました。両者の和を損失としました。
結果
model | Si-SNRi | SDR |
---|---|---|
元の SepFormer | -13.59 | |
SepReformer | 13.68 | 14.16 |
改修した SepFormer | 14.74 | 15.58 |
Libri2Mix 8k min sep-clean train-100のデータで batch_size = 1、epoch = 10 です。
改修の精度を測定したプログラムを github に置いておきます。