ADD tensorflow asr
https://github.com/TensorSpeech/TensorFlowASR
学習済みモデルが公開されているが、まともに動作しない 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
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'
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'
○ 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'.
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
examples/demonstration/conformer.py の処理は、モデルを通常通りに呼び出しているわけではなく、エクスポートしたモデルと処理フローが異なる。そのため、エクスポートしたモデルではdemoと同じ結果が得られない。