TensorFlow 2.10.0 RNN - LSTM による、Speech Recognition #2

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

このブログ記事について

このページは、おんちゃんが2023年8月13日 13:19に書いたブログ記事です。

ひとつ前のブログ記事は「Keras ASR with CTC を試す。」です。

次のブログ記事は「高知県土佐市の防災、緊急放送の迷惑さ。」です。

最近のコンテンツはインデックスページで見られます。過去に書かれたものはアーカイブのページで見られます。

カテゴリ

ウェブページ

サイトナビ