ailia-models icon indicating copy to clipboard operation
ailia-models copied to clipboard

ADD tensorflow asr

Open kyakuno opened this issue 4 years ago • 6 comments

https://github.com/TensorSpeech/TensorFlowASR

kyakuno avatar Sep 13 '21 03:09 kyakuno

学習済みモデルが公開されているが、まともに動作しない https://drive.google.com/drive/folders/1VAihgSB5vGXwIVTl3hkUk95joxY1YbfW

examples/conformer/test.py ではモデルのロードでshapeがミスマッチになる。

python examples/conformer/test.py --config ./Conformer/LibriSpeech/subword-conformer/config.yml --saved ./Conformer/LibriSpeech/subword-conformer/latest.h5

ValueError: Shape mismatch in layer #1 (named conformer_prediction) for weight conformer/conformer_prediction/conformer_prediction_embedding/embeddings:0. Weight expects shape (29, 320). Received saved weight with shape (1031, 320)

examples/demonstration/conformer.py ではモデルのロード時にwarningがでて、推論結果もおかしい。

python examples/demonstration/conformer.py --config ./Conformer/LibriSpeech/subword-conformer/config.yml --saved ./Conformer/LibriSpeech/subword-conformer/latest.h5 examples/demonstration/wavs/1089-134691-0000.flac

WARNING:tensorflow:Skipping loading weights for layer #1 (named conformer_prediction) due to mismatch in shape for weight conformer/conformer_prediction/conformer_prediction_embedding/embeddings:0. Weight expects shape (29, 320). Received saved weight with shape (1031, 320)
WARNING:tensorflow:Skipping loading weights for layer #2 (named conformer_joint) due to mismatch in shape for weight conformer/conformer_joint/conformer_joint_vocab/kernel:0. Weight expects shape (320, 29). Received saved weight with shape (320, 1031)
WARNING:tensorflow:Skipping loading weights for layer #2 (named conformer_joint) due to mismatch in shape for weight conformer/conformer_joint/conformer_joint_vocab/bias:0. Weight expects shape (29,). Received saved weight with shape (1031,)

INFO:tensorflow:Transcript: nzhdvvvvn dvuzzk  dvvvzkzdvvvvvvvvvvvvvvvvvvtiiiiiiii

ooe1123 avatar Jan 10 '22 12:01 ooe1123

examples/demonstration/conformer.py による別のモデル subsampling-conformer を指定した場合、コードエラーになる。

python examples/demonstration/conformer.py --config ./Conformer/LibriSpeech/subsampling-conformer/config.yml --saved ./Conformer/LibriSpeech/subsampling-conformer/latest.h5 examples/demonstration/wavs/1089-134691-0000.flac

TypeError: __init__() missing 1 required positional argument: 'encoder_subsampling'

ooe1123 avatar Jan 10 '22 12:01 ooe1123

tfliteファイルも公開されていて、examples/demonstration/tflite_conformer.py で実行した場合、それらしい推論結果が得られた。

python examples/demonstration/tflite_conformer.py --tflite ./conformer-tflite/subword-conformer.latest.tflite examples/demonstration/wavs/1089-134691-0000.flac

he could wait no longer               # <--- 正しい推論結果

しかし、tfliteファイルからのエクスポートがうまくいかない。

python -m tf2onnx.convert --opset 11 --tflite work/conformer-tflite/subword-conformer.latest.tflite --output model.onnx

ValueError: make_sure failure: Cannot find node with output 'conformer_greedy/conformer_encoder/conformer_encoder/conformer_encoder_block_9/conformer_encoder_block_9_mhsa_module/conformer_encoder_block_9_mhsa_module_ln/Const_31' in graph 'conformer_greedy/while_body'

ooe1123 avatar Jan 10 '22 12:01 ooe1123

○ onnxエクスポート

tensorflow_asr/models/layers/multihead_attention.py のeinsum を以下のように書き換える

query = tf.einsum("...NI,HIO->...NHO", query, self.query_kernel)
↓
query = tf.einsum("XNI,HIO->XNHO", query, self.query_kernel)

examples/demonstration/conformer.py に以下のコードを差し込み、opset=13 でエクスポートすることができた。

import tf2onnx
model_proto, external_tensor_storage = tf2onnx.convert.from_keras(conformer, opset=13, output_path="xxx.onnx")

tf.einsum() が元のままの場合、以下のエラーが発生する

ValueError: Equation '...nho,...mho->...hnm' must only contain lower or upper letters but '.' is not.

opset=12を指定した場合、以下のエラーが発生する

RuntimeError: Opset (12) must be >= 13 for operator 'batch_dot'.

ooe1123 avatar Jan 10 '22 12:01 ooe1123

https://drive.google.com/drive/folders/1VAihgSB5vGXwIVTl3hkUk95joxY1YbfW?usp=sharing の pretrained-subword-conformer.zip を展開したリソースで、以下のように実行してそれらしい推論結果を得ることができた。

python examples/demonstration/conformer.py --config ./config.yml --saved ./latest.h5 --subwords ./conformer.subwords examples/demonstration/wavs/1089-134691-0000.flac

ooe1123 avatar Jan 15 '22 13:01 ooe1123

examples/demonstration/conformer.py の処理は、モデルを通常通りに呼び出しているわけではなく、エクスポートしたモデルと処理フローが異なる。そのため、エクスポートしたモデルではdemoと同じ結果が得られない。

ooe1123 avatar Jan 19 '22 13:01 ooe1123