システム連携ネタでよくブログを書いている日下です。

少し前に、画像から文字起こし(OCR)する LINE bot が話題になりました。
 LINEに画像を送ると、AIが3秒で文字起こし 「企業や役所の働き方変える」 長崎のベンチャーが開発

Google の API を使うことで画像からの文字起こしは容易に実現できますので、Questetra のフローに文字起こしの処理を組み込めるかを試してみました。
※単発の文字起こしなら LINE で十分ですが、そういった作業が多く発生するようであれば、ワークフロー化する価値はありそうです。

以下、詳細を説明します。

目次
Questetraから Google Cloud Vision API を呼び出す設定
 Google 側の設定
 Questetra 側の設定
まとめ

 

Questetraから Google Cloud Vision API を呼び出す設定

今回は Questetra から Google Cloud Platform(GCP)の API(Google Cloud API)をたたく形で実現します。具体的には Google Cloud Storage のバケットに画像をアップロードし、その画像を使って Vision API にリクエストを投げます。 処理の流れは Google Cloud Vision API のクイックスタートを参考にしたものとなります。

Google 側の設定

Google Cloud Vision API のクイックスタートに沿って、GCP Console でプロジェクトの作成と、Vision API を有効化をします。

その後、こちらの OAuth 認証のページを参考にして、認証情報を作成してクライアントID・クライアントシークレットを入手します。クライアントID・クライアントシークレットは Questetra 側の設定で必要になりますのでメモしておきます。

また、 Google Cloud Vision API のクイックスタートに沿って、Cloud Storage バケットを作成しておきます(後述のスクリプトのサンプルでは「questetra-visionapi-test」というバケット名の前提になっています)。

Questetra 側の設定

今回は画像をファイル型データにアップロードして、タスク実行したら文字起こし結果を返すだけの簡単なフローを準備しました。
サンプルのフローアーカイブはこちら(ダウンロードして zip を展開すると qar ファイルが入っています)。

OAuth 設定については、以下ページを参考に、先ほどメモしておいたクライアントID・クライアントシークレットを使って設定します (下のスクリプトのサンプルでは「GoogleVisionAPItest」という設定名の前提になっています。またこの設定はサンプルフローをインポートしても別途必要になります) 。
 Questetra から他サービスの REST API を呼び出す場合の設定(Questetra が OAuth2 クライアントになる場合)

スクリプトタスクは以下のようなロジックのものを準備します(これはサンプルフローに含まれています)。

var bucket = 'questetra-visionapi-test'; // bucket name
var file = 'p' + processInstance.getProcessInstanceId(); // file name
var token = httpClient.getOAuth2Token('GoogleVisionAPItest');
var response, code;

// Google Cloud Storage
response = httpClient.begin()
  .bearer(token)
  .queryParam('name', file)
  .queryParam('uploadType', 'media')
  .body(q_file.get(0))
  .post('https://www.googleapis.com/upload/storage/v1/b/' + bucket + '/o');

code = response.getStatusCode();
if (code !== 200) {
  throw "response is not 200: "+ code + " " + response.getResponseAsString();
}

// Google Cloud Vision
var visionReq = {
  "requests" : [{
    "features" : [{ "type": "DOCUMENT_TEXT_DETECTION"}],
    "image" : {"source" : { "gcsImageUri" : 'gs://' + bucket + '/' + file}}
  }]
};

response = httpClient.begin()
  .bearer(token)
  .body(JSON.stringify(visionReq), "application/json")
  .post('https://vision.googleapis.com/v1/images:annotate');

code = response.getStatusCode();
if (code !== 200) {
  throw "response is not 200: "+ code + " " + response.getResponseAsString();
}

engine.setDataByVarName('q_response', response.getResponseAsString());

スクリプトの主な処理の流れとしては、まず Cloud Storage にファイル型データ 「q_file」 を送付して、そのファイルの URI を引数に Cloud Vision API を呼び出し、結果を文字型データ 「q_response」 に保存しています。業務フロー側の設定とひもづいているのは「q_file」「q_response」といったプロセスデータ項目のフィールド名です。また Cloud Vision API に渡す features の type パラメータで API のどの機能を使うかを指定できます。詳しくは以下ページを参考にしてください。
 Google Cloud Vision API の Feature について
※同じ画像でも features が「DOCUMENT_TEXT_DETECTION」と「TEXT_DETECTION」では、結果が結構変わります。Word 等で作られたような書面であれば、前者の方がよさそうでした。その他の features では写真からランドマークを検知する等いろいろおもしろそうなものがありました。
※今回はスクリプトタスクで実現しましたが、同様の処理を「メッセージ送信中間イベント(HTTP)」2つで実現することも可能です。

※Cloud Vision API のクイックスタートに書いてある通り、Cloud Storage には 5 GB まで無料でデータを格納でき、1 か月に Cloud Vision API に機能リクエストを 1,000 回までであれば無料で行うことができます。それを超える場合には有料になりますのでご留意ください。

 

まとめ

このようにワークフローから Google Cloud API を呼び出すように組み込むことは容易に実現できます。

Cloud Vision API に限らず、Translation API でも同じような形で呼び出すことができました。それを翻訳系の業務フローに組み込んでもいいかもしれません(また別の記事で紹介できればと思っています)。

また、今回のフローを元にして、あるメールアドレスに画像を送ると文字起こしして返す、といったことも実現できます。「メッセージ開始イベント(メール)」を使ってメールの受信口を作って、結果の JSON からデータを抜き出して、「メッセージ送信中間イベント(メール)」で返信すればOKです(手元では作ってみました。API の利用量に制限があるので、そのアドレスの公開はできませんが)。

あと、以下の記事を参考に LINE bot にできなくはないです。ただ、この仕組みだと応答を返すまでに数十秒の時間がかかるので不向きではありますが・・・
 参考記事:LINE とワークフローを連携する方法

もし、ご質問等がありましたら、お問い合わせフォームからお気軽にご連絡ください。

%d人のブロガーが「いいね」をつけました。