TensorFlow 2.10.0 RNN - LSTM による、Speech Recognition #2
TensorFlow 2.10.0 RNN - LSTM による、Speech Recognition の続きです。
Introduction to speech recognition with TensorFlow が、性能が良かったので
今回は、これをベースに、日本語で試してみます。
日本語の為のデータの準備は、下記を参考にさせて貰いました。
TensorFlow の transformer を使った音声認識(ASR)のプログラムを改修して日本語学習させてみました。
環境:
Windows11
Python 3.10.6
tensorflow-gpu 2.10.0
GTX-1070
cuda toolkit 11.2
cuDNN SDK 8.1.0
1. 日本語音声データの準備。
1) download Mozilla Common Voice Japanese 11 dataset
(cv-corpus-11.0-2022-09-21-ja.tar.gz)
2) unzip cv-corpus-11.0-2022-09-21-ja.tar.gz
xxx/commonvoice/cv-corpus-11.0-2022-09-21/ja
> mkdir xxx/commonvoice/cv-corpus-11.0-2022-09-21/ja/wavs
3) mp3 から、wav ファアイルへの変換と、metadata.csv を作成します。
data_proc.py
試しに、13000 レコード作成しました。
4) configs.py の修正。
2. 学習。
train_jp.py
vocab size: 2081
model の、最後の一つ前の層が、256 なので、どうなるか?
# Dense layer
x = layers.Dense(256)(x)
x = activation_layer(x, activation="leaky_relu")
x = layers.Dropout(dropout)(x)
オリジナルの儘だと、loss,val_loss が、40 程度なので、ここは、増やしてみます。
# Dense layer
#x = layers.Dense(256)(x)
x = layers.Dense(1024)(x) # changed by nishi 20223.8.14
x = activation_layer(x, activation="leaky_relu")
x = layers.Dropout(dropout)(x)
これで、19 epoch で、loss=22.43、 val_loss=28.61
もう少し、下げたいのですが、取り敢えず、
inferencModel.py を日本語対応に改造して、inferencModel_jp.py で、チェックしてみます。
やっぱりもう少しか、
loss=10、val_loss=20 程度に、なればもっとよくるかも?
2.1 学習データセットの、spectrogram が、後ろ詰になっているのが発覚。
短いspectrogram データが、前詰めでなく、後ろ詰めになっているみたい。
mltu/transformer.py Class SpectrogramPadding にバグがあるみたい。
急遽、前詰め になる様に、Class SpectrogramPadding を修正して、再度学習させます。
25 epoch: loss=9.633 val_loss=25.26
val_loss が、もう少し良ければ、....
これで、再度、inferencModel_jp.py を実行じゃ。
2.2 さらに、spectrogram を、mel spectrogram にしてみます。
mel spectrogram にすると、
train_model の imput_dim=[-,1474,193] が [-,1474,118] に小さくなるので、
train_model の CNN部分の kernel_size を小さくした方が良いかも。
kernel_size=[11, 41], strides=[2, 2] -> kernel_size=[11, 21], strides=[2, 2]
kernel_size=[11, 21], strides=[1, 2] -> kernel_size=[11, 11], strides=[1, 2]
更なる改善は、
1) 学習データの中に、文章と一致しない音声が結構あるので、1件ずつ音をだして、文章と突き合わせて、
学習データとして使える音だけ、使うようにしないといけない。
音の質もノイズ交じりなどがあるので、手作業でトリムしないと使えない。
今回、Python GUI TKinter で、選別ツールを作ってみました。
Windows 上で、validated.tsv のレコードの文章の表示と、録音を、スピーカから確認して内容をチェックすると同時に、
音にトリムが必要であれば、wavesurfer.exe を起動して、トリムできるようにしました。
文章の読み間違い、漢字の読み間違い、不明瞭、あ余りの早口は、モデルの学習に悪影響を及ぼすので、使わない様にします。
結構多いので、オリジナルの儘では、学習に不向きです。
それでも、30,000 件 となると大変です。
これは、github に公開しました。
voice_checker
この後は、マイクから自分の声を取り込んで、試してみたいぞね。
3. 余談。
mltu.tensorflow.dataProvider の DataProvider を使うと、データをメモリーに全て読み込まなくても便利です。
このデータセットの出力形式は、'tuple' 形式になっています。
これを、dict 形式に変えたい場合は、
mltu.tensorflow.dataProvider の DataProvider クラスを継承して、__getitem__() をオーバーライドして、
dict 出力にすれば、OK でした。
4. github
lstm_sound_to_text_jp
Mozilla Common Voice Japanese 11 dataset 日本語スピーチ 加工、修正ツール
voice_checker