HUAWEI ML Kitのテキスト認識を使用して請求書番号の自動入力機能を実装する方法

##概要
[以前の投稿](https://forums.developer.huawei.com/forumPortal/en/topicview?tid=0201256094474040234&fid=0101187876626530001)では、HUAWEI ML Kitのカード認識機能を使用して、カードの紐付け機能を実装する方法をご紹介しました。この機能では、ユーザーはカードの写真を提供するだけで、後はアプリが重要な情報をすべて自動的に認識します。これによって、とても簡単にカード情報を入力できますが、請求書や割引クーポンでも同じことができるでしょうか？もちろん、できます。この投稿では、HUAWEI ML Kitのテキスト認識機能を使用して、請求書番号と割引コードの自動入力を実装する方法をご紹介します。
##用途
テキスト認識は、非常に多くの状況で役に立ちます。例えば、以下の請求書をスキャンして、請求書サービス番号が「NO.DE SERVICIO」で始まることを示し、文字数を12文字に制限すると、テキスト認識を使用して簡単に請求書サービス番号「123456789123」を取得できます。
![101.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690066/9d69c630-ea85-51e7-3eaa-281e99893071.png)
同様に、下記の割引クーポンをスキャンして、割引コードが「FAVE-」で始まり、文字数を4文字に制限すると定義することにより、割引コード「8329」が得られ、支払いを完了できます。
![2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690066/d2a9c927-7c8e-036e-72aa-8577f8716aca.png)

とても便利でしょう？アプリに認識させる情報をカスタマイズすることもできます。
## テキスト認識の統合
では、請求書番号と割引コードの処理方法を見ていきましょう。
### 1. 準備
必要な準備に関する詳細は、[HUAWEI Developer](https://developer.huawei.com/consumer/en/doc/development/HMS-Guides/ml-process-4)をご覧ください。
ここでは、最も重要な手順だけお話します。
#### 1.1 Mavenリポジトリアドレスをプロジェクトレベルのbuild.gradleファイルに設定する
```javascript
buildscript {
    repositories {
     ...
        maven {url 'https://developer.huawei.com/repo/'}
    }
}
 dependencies {
   ...
        classpath 'com.huawei.agconnect:agcp:1.3.1.300'
    }
allprojects {
    repositories {
     ...
        maven {url 'https://developer.huawei.com/repo/'}
    }
}
```
#### 1.2 設定をファイルヘッダーに追加する
SDKを統合した後、以下の設定をファイルヘッダーに追加します。

```javascript
apply plugin: 'com.android.application'
apply plugin: 'com.huawei.agconnect'
```
#### 1.3 SDK依存関係をアプリレベルのbuild.gradleファイルに設定する
```javascript
dependencies {
    // Import the base SDK.
    implementation 'com.huawei.hms:ml-computer-vision-ocr:2.0.1.300'
    // Import the Latin character recognition model package.
    implementation 'com.huawei.hms:ml-computer-vision-ocr-latin-model:2.0.1.300'
    // Import the Japanese and Korean character recognition model package.
    implementation 'com.huawei.hms:ml-computer-vision-ocr-jk-model:2.0.1.300'
    // Import the Chinese and English character recognition model package.
    implementation 'com.huawei.hms:ml-computer-vision-ocr-cn-model:2.0.1.300'
}
```
#### 1.4 機械学習モデルが自動的に更新されるよう、以下のステートメントをAndroidManifest.xmlファイルに追加する
```javascript
<manifest>
 ...
    <meta-data
        android:name="com.huawei.hms.ml.DEPENDENCY"
        android:value="ocr" />
     ...
</manifest> 
```
#### 1.5 カメラ権限を適用する

```javascript
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.INTERNET" />

<uses-feature android:name="android.hardware.camera" />
<uses-feature android:name="android.hardware.camera.autofocus" />
```
### 2.コードの開発
#### 2.1 解析機能を作成する
```java
MLTextAnalyzer analyzer = new MLTextAnalyzer.Factory(context).setLanguage(type).create();
```
#### 2.2 認識結果プロセッサーを解析機能とバインドするよう設定する
```java
analyzer.setTransactor(new OcrDetectorProcessor());
```
#### 2.3 同期APIを呼び出す
SDKに含まれる**LensEngine**を使用して、オブジェクトの作成、解析機能の登録、カメラパラメータの初期化を行います。

```java
lensEngine = new LensEngine.Creator(context, analyzer)
  .setLensType(LensEngine.BACK_LENS)
  .applyDisplayDimension(width, height)
  .applyFps(30.0f)
  .enableAutomaticFocus(true)
  .create();
```
#### 2.4 runメソッドを呼び出してカメラを起動し、カメラストリームを読み込んで認識する
```java
try {
    lensEngine.run(holder);
} catch (IOException e) {
    // Exception handling logic.
    Log.e("TAG", "e=" + e.getMessage());
}
```
#### 2.5 必要に応じて認識結果を処理する
```java
public class OcrDetectorProcessor implements MLAnalyzer.MLTransactor<MLText.Block> {
    @Override
    public void transactResult(MLAnalyzer.Result<MLText.Block> results) {
        SparseArray<MLText.Block> items = results.getAnalyseList();
        // Process the recognition result as required. Only the detection results are processed.
        // Other detection-related APIs provided by ML Kit cannot be called.
        …
    }
    @Override
    public void destroy() {
        // Callback method used to release resources when the detection ends.
    }
}
```
#### 2.6 検出が終了したら解析機能を停止し、検出リソースを解放する
```java
if (analyzer != null) {
    try {
        analyzer.stop();
    } catch (IOException e) {
        // Exception handling.
    }
}
if (lensEngine != null) {
    lensEngine.release();
}
```
## デモ
以上で終わりです。必要に応じてこの機能を拡張できる点を覚えておいてください。では、旅行の請求書のスキャン結果を見てみましょう。
![20200908-102216(eSpace).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690066/3bff15e8-6afe-7707-61d3-f340f42c81d1.gif)
次に、割引コードをスキャンして、オンライン割引を簡単に入手し、支払いを完了してみましょう。
![20200908-102229(eSpace).gif](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/690066/f33b9fa6-8eec-3f7b-4302-b7f772514f9d.gif)
##Githubソースコード
https://github.com/HMS-Core/hms-ml-demo/tree/master/Receipt-Text-Recognition
詳しくは、当社の公式ウェブサイトをご覧ください。[HUAWEI ML Kit - About the Service](https://developer.huawei.com/consumer/en/hms/huawei-mlkit)