.NET MAUIでMLKit Text recognition v2(ベータ版)を無理やり動かしてみた
Text recognition v2のNuGetパッケージが見つからなかったので、aarをC#ラッパーでラップするバインドライブラリを作成して使用してみました。
これでAndroidでも.NET MAUIで日本語OCRが可能になります。
バージョン
今回使用するツールやライブラリのバージョンは以下の通りです。
Visual Studioのバージョン:
Visual Studio 2022 17.5.3
Text recognition v2のバージョン:
com.google.mlkit:text-recognition-japanese:16.0.0-beta6
Text recognition v2の依存関係
MavenリポジトリからText recognition v2のCompile Dependenciesを確認します。
com.google.android.gms.play-services-base:18.1.0
com.google.android.gms.play-services-basement:18.1.0
com.google.android.gms.play-services-mlkit-text-recognition-common:18.0.0
com.google.mlkit.common:18.5.0
com.google.mlkit.text-recognition-bundled-common:16.0.0-beta6
Text recognition v2を動かすには上記5つを依存関係に含める必要があることがわかります。
5つのうち、com.google.mlkit.text-recognition-bundled-common以外はNuGetパッケージに公開されています。また、com.google.android.gms.play-services-mlkit-text-recognition-commonの依存関係には、com.google.android.gms.play-services-base、com.google.android.gms.play-services-basement、com.google.mlkit.commonが含まれています。
つまり、バインドライブラリ作成時に以下3点用意してあげればOKということになります。
text-recognition-japanese-16.0.0-beta6.aar
text-recognition-bundled-common-16.0.0-beta6.aar
Xamarin.GooglePlayServices.MLKit.Text.Recognition.Common 118.0.0.1
aarはMavenリポジトリからダウンロードできます。
プロジェクト作成
.NET MAUI アプリのソリューションに対し、Android Java ライブラリ バインド プロジェクトを追加します。
追加したプロジェクトに Jars フォルダーを作成し、フォルダーにaarを追加します。
追加したaarの プロパティ > ビルドアクション が Android Library であることを確認します。なっていなければ Android Library に変更します。
あとはNuGetパッケージの管理からXamarin.GooglePlayServices.MLKit.Text.Recognition.Common 118.0.0.1を探して追加します。
ここでビルドすると、以下のようなエラーが発生します。
CS0534 'Zbaa' は継承抽象メンバー 'Zbxz.ZbD()' を実装しません
CS0542 'Zbd': メンバー名をそれを囲む型の名前と同じにすることはできません
C#から呼び出せるようにaarを自動的にラップしてくれますが、そこでエラーになっているようです。
エラー部分のコードのパッケージ名から予測するにtext-recognition-bundled-commonのバインド部分でかなりおかしなことになっています。
text-recognition-japaneseで公開されている部分だけをC#から呼びたいだけなので、ここはラップされないように修正します。
プロジェクトのTransformsフォルダーにあるMetadata.xmlを以下のように変更します。
<metadata>
<remove-node path="/api/package[@name='com.google.android.gms.internal.mlkit_vision_text_bundled_common']" />
<remove-node path="/api/package[@name='com.google.android.libraries.vision.visionkit.pipeline.alt']/class[@name='zbd']/field[@name='zbd']" />
</metadata>
警告は残りますが、一旦エラーは消えます。
あとは、アプリプロジェクトから参照できるように、アプリプロジェクトの依存関係を右クリックして、プロジェクト参照の追加からさきほど作成したバインドライブラリを追加します。
参照を追加すると、ライブラリの作り方が悪いせいかAndroid以外にも参照が追加されてしまいます。
なのでアプリプロジェクトのcsprojファイルを修正してAndroidだけに依存関係が追加されるようにします。
<ItemGroup Condition="'$(TargetFramework)' == 'net7.0-android'">
<ProjectReference Include="..\AndroidBinding1\AndroidBinding1.csproj" />
</ItemGroup>
C#からText recognition v2を呼び出す
呼び出しはとてもシンプルです。
画像が必要なのでMediaPickerで画像を選択します。
あとはBitmapに変換し、Text recognition v2を呼び出してOCRします。
#if ANDROID
using Android.Graphics;
using Xamarin.Google.MLKit.Vision.Text;
using Xamarin.Google.MLKit.Vision.Common;
using Android.Gms.Extensions;
using Com.Google.Mlkit.Vision.Text.Japanese;
#endif
// 途中省略
FileResult photo = await MediaPicker.Default.PickPhotoAsync();
if(photo != null) {
#if ANDROID
Bitmap bitmap = BitmapFactory.DecodeFile(photo.FullPath);
var recognizer = TextRecognition.GetClient(new JapaneseTextRecognizerOptions.Builder().Build());
var image = InputImage.FromBitmap(bitmap, 0);
Text result = (Text)await recognizer.Process(image);
#endif
}
結果がこちら。
まとめ
Text recognition v2がベータ版から正式版になればNuGetパッケージに公開されると思うので、あまり使えない記事かもしれないです。
ただ、自作のaarライブラリとかを.NET MAUIで使いたい人はこの記事のやり方を参考にしてもらえればと思います。