本プログラムは、音声ファイルを解析して音素を取得し、音声に合致した口パクを表示することを目的としている。
音声から音素を抽出する方法として、深層畳み込みニューラルネットワークを使用した。
ネットワークにスペクトログラムと対応する音素ラベルを与えて分類学習を行い、スペクトログラムから音素を予測するモデルを学習する。
推論時にはスペクトログラムから音素を予測する。音声を再生するとともに口パク画像を表示する事が可能。
実行確認環境
Windows10
Python 3.6
本コードはJVS corpusを用いて学習するため、以下のリンクからデータセットのダウンロードが必要
https://sites.google.com/site/shinnosuketakamichi/research-topics/jvs_corpus
その他のPythonパッケージとして、以下が必要
PyTorch
scipy
joblib
PyAudio
Pygame
matplotlib
squib (https://github.com/pstuvwx/squib)
JVS corpusをダウンロードし、以下のディレクトリ構造であることを前提とする
workdir/
|-Lip/
| |-dataset_jvs.py
| |-demonstrate.py
| | ...
|
|-jvs_ver1/
|-jvs001/
| |-falset10/
| | ...
|
|-jvs002/
| ...
|-jvs100/
trainer.py
を実行する。
python Lip/trainer.py jvs_ver1
引数は以下の通り。
必須。JVS corpusのディレクトリ
STFTの窓幅
STFTの移動幅
口形状クラス数
CNN中間層のチャネル数
CNNの中間ResBlock数
CNNの畳み込みカーネルサイズ
学習時に連続的に入力するフレーム数
データセットのスキップ量
CPUメモリ少ない場合、この値を大きくすることで、データセットの1/n_skipだけ利用する
学習係数
STFTの対数演算時のゼロ割防止用微小数
ミニバッチサイズ
学習エポック数
学習を実行するデバイス
出力先
demonstrate.py
を実行する。
python Lip/demonstrate.py jvs_ver1/jvs001/nonpara30/wav24kHz16bit/BASIC5000_0025.wav result/models/models_60.pth
引数は以下の通り。
音声ファイルのパス
学習済みモデルのパス
学習曲線を見て、val/loss
が最小のモデルを使用する
STFTの窓幅
学習時と一致させること
STFTの移動幅
学習時と一致させること
口形状クラス数
学習時と一致させること
CNN中間層のチャネル数
学習時と一致させること
CNNの中間ResBlock数
学習時と一致させること
CNNの畳み込みカーネルサイズ
学習時と一致させること
STFTの対数演算時のゼロ割防止用微小数
学習時と一致させること
推論を実行するデバイス
平滑化フィルタのカーネルサイズ
口パク画像が存在するディレクトリ
dataset_jvs.py
を適切に変更すること
phoneme2index
を編集し、音素と口形状の対応関係を記述する。指定した数値i
が口パク画像i.png
と対応して表示される- 音素ラベルがJuliusと異なる形式の場合、
load_lab
を編集し、波形のサンプル点ごとの音素ラベルを返す関数にすること