テキスト認識とは文字画像(イメージ型)を文字列(String型)に変換する技術です。
たとえば、次の写真があるとします。
上記の写真をテキスト認識で変換すると、次の結果が得られます。
AndroidアプリにHMSのテキスト認識を導入する方法
AppGallery Connectの作業
- AppGallery Connectに入って、[My projects]を選びます。
- リストから対象アプリに切り替えます。
- [Project settings] -> [Manage APIs]に入って、ML Kitを有効にします。(デフォルトではすでに有効になっているはずです)
こちらもご参照ください。
HMS SDKの導入
- agconnect-services.jsonをプロジェクト内に配置します。
- プロジェクトのbuild.gradleにSDKを追加します。
- モジュールのbuild.gradleにSDKを追加します。
テキスト認識のライブラリはこちらです。
build.gradle
implementation 'com.huawei.hms:ml-computer-vision-ocr:2.0.5.301'
implementation 'com.huawei.hms:ml-computer-vision-ocr-latin-model:2.0.5.301'
implementation 'com.huawei.hms:ml-computer-vision-ocr-jk-model:2.0.5.301'
implementation 'com.huawei.hms:ml-computer-vision-ocr-cn-model:2.0.5.301'
こちらもご参照ください。
AndroidManifest.xml
HMS ML Kitのテキスト認識の定義をAndroidManifest.xmlに追加します。
AndroidManifest.xml
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="xxx">
...
<meta-data
android:name="com.huawei.hms.ml.DEPENDENCY"
android:value= "ocr"/>
...
</manifest>
テキスト認識の流れ
1.MLTextAnalyzerを生成します。
val textAnalyzer = MLTextAnalyzer.Factory(context)
.setLocalOCRMode(MLLocalTextSetting.OCR_DETECT_MODE)
.setLanguage("ja")
.create()
}
動画の場合
2-1.setTransactor()でMLTextAnalyzerに認識結果のコールバックを設定します。
textAnalyzer?.setTransactor((object : MLAnalyzer.MLTransactor<MLText.Block> {
override fun transactResult(results: MLAnalyzer.Result<MLText.Block>?) {
binding.overlayView.setResults(results)
}
override fun destroy() {
}
}))
2-2.カメラを設定します。
val lensEngine = LensEngine.Creator(applicationContext, textAnalyzer)
.setLensType(LensEngine.BACK_LENS)
.applyDisplayDimension(1440, 1080)
.applyFps(30.0f)
.enableAutomaticFocus(true)
.create()
try {
lensEngine.run({SurfaceViewのオブジェクト}.holder)
} catch (e: IOException) {
}
静止画の場合
2-1.静止画をMLTextAnalyzerに渡し、認識結果をコールバックで受け取ります。
val frame = MLFrame.fromBitmap(bitmap)
val task = textAnalyzer.asyncAnalyseFrame(frame)
task.addOnSuccessListener {
}.addOnFailureListener {
}
3.リソースを解放します。
textAnalyzer?.let {
try {
it.stop()
} catch (ioException: IOException) {
ioException.printStackTrace()
}
textAnalyzer = null
}
lensEngine?.let {
it.release()
lensEngine = null
}
テキスト認識結果オブジェクトについて
認識結果はMLAnalyzer.Result型のanalyseListにあります。
val mlList: SparseArray<MLText.Block> = {MLAnalyzer.Result<MLText.Block>のオブジェクト}.analyseList
mlList.forEach { key, value ->
value.contents.forEach { content ->
// content.border : 判断対象の範囲
// content.stringValue : 判断したテキスト
// content.possibility : 判断の正確さ
// content.languageList : 判断した言語
}
}
実装は以上になります。
GitHub
参考
- HMS:https://developer.huawei.com/consumer/jp/
- HMS ML Kitの紹介:https://developer.huawei.com/consumer/jp/hms/huawei-mlkit
- HMS ML Kitのドキュメント:https://developer.huawei.com/consumer/jp/doc/development/HMSCore-Guides/service-introduction-0000001050040017
- HMS ML Kitのテキスト認識の概要:https://developer.huawei.com/consumer/jp/doc/development/hiai-Guides/text-recognition-0000001050040053
- Huawei Developers:https://forums.developer.huawei.com/forumPortal/en/home
- Facebook Huawei Developersグループ:https://www.facebook.com/Huaweidevs/