FILEMAKER

精算レシートを簡単に読み取る方法:GetLiveText 関数を活用しよう!

2023 年 5 月 23 日に日本でリリースされた Claris FileMaker Pro 2023 では、iOS/iPadOS や macOS のテキスト認識表示を利用できる GetLiveText 関数のサポート言語が追加されました。これまで英語をはじめとする 10 言語に対応していましたが、待望の日本語がサポートされたほか、韓国語、ウクライナ語にも対応しました。「なぜこの 3 つの言語?」と思う方もいらっしゃると思いますが、iOS/iPadOS 16 でテキスト認識表示に追加されたのがこの 3 つの言語なのです。

他の対応している言語はこちらをご覧ください。

テキスト認識表示とは?

テキスト認識表示とは、対応している macOS、iOS、iPadOS 上で画像やカメラに写っている物に含まれるテキストを認識し、コピーや翻訳することができる画期的な機能です。

iPhone ユーザガイド「iPhoneでテキスト認識表示を使って写真またはビデオに含まれる情報を利用する

最先端の技術もローコードで活用できる FileMaker を使うことで、難しいコードを書くことなく簡単に利用できます。また、「認識した文字に間違いがあったときは、事前に想定した範囲や計算によってエラーか否かを判定しユーザにわかりやすく伝える」というような、自由度の高い仕様の作り込みも可能です。

実際に試してみましょう!

今回は店舗でのレジ締め時に POS レジから出力される精算レシートをサンプルとして使用してみます。

多くの POS レジでは、インターネットで売上データを本部へ送信できます。ただし、一部では売上や現金残高などが印字された精算レシートをもとに報告書に手書き記入されている場合もあります。そんなとき、レシートの写真を撮るだけで数値を自動入力できれば、販売管理作業の大きな効率化につながるかもしれません。

ここで 1 つポイントがあります。それは、精算レシートの場合はレジスターが変わらない限りレシートの構成や体裁が変わらない、ということです。後の方で出てきますが、値を読み取って FileMaker に保存する際、これは大変重要なポイント(要件)となります。

事前準備

用意するもの

  • テキスト認識表示に対応している下記デバイスが最低 1 つ
    • macOS 13 以降を搭載した Mac
    • iOS 16 以降の iPhone
    • iPad 16 以降の iPad
  • Claris FileMaker Pro 2023
  • 対象を撮影した写真を複数枚

実装 1

早速、事前に撮影した写真を使ってどのように文字認識ができるのか試してみましょう。

FileMaker Pro 2023 から新規ファイルを作成します。「写真」という名前のオブジェクトフィールドと「認識結果」という名前の計算フィールドを追加します。「認識結果」の計算式は GetLiveText 関数で日本語の読み取りを設定するためこのように書きます。

GetLiveText ( 写真 ; "ja-JP" )

計算結果を「テキスト」で返すことも忘れず設定しましょう。

GetLiveText 関数を利用した計算式

「写真」「認識結果」フィールドを並べたら、テスト開始です。「写真」フィールドに写真データを入れるとすぐに結果がわかります。(Windows ご利用の場合には iPhone、iPad の FileMaker Go 2023 にカスタム App をコピーするか、ピアツーピア共有することで実行結果が確認ができます)

※ピアツーピア共有はテスト目的のみで本番での利用は推奨されません

GetLiveText 関数の認識結果

GetLiveText 関数を使って認識した文字は改行区切りで返ってきます。なんと…これだけで画像からテキスト認識ができました。思った以上に簡単だったのではないでしょうか?

注意すべき点もあります。テキスト認識表示では、認識する範囲の指定ができないため、撮影時に不要なものが写らないよう工夫が必要です。また、OCR のような技術全般に言えることですが、「得られた結果は 100% 正しいと限らない」ということを前提に、思わぬ誤認識をアプリ側でどのように補正できるかや、最終的には人の目による確認が必要ということも意識しておきましょう。

さて、読み取った内容を分割するためにはここから先が重要となります。認識結果が「どこで改行されるのか?」ということはコントロールできないため、「何行目に何の値が来るはず」と想定して値を取り出すスクリプトを作成していく必要があります。

実装 2

ここからは実際に精算レシートのテキスト認識結果を分割して保存するための手順を見ていきます。

「認識結果」フィールドに入ったテキストを行番号が表示されるテキストエディタや表計算ソフトにコピー & ペーストします。こうすることで「何が何行目にあるのか?」ということがすぐにわかります。

左は精算レシート現物、右はテキスト認識結果をテキストエディタで表示

今回のサンプルの場合、認識結果は「Claris カフェ」からスタートして左側の文字列が並び、「銀行入金額」の後は「釣銭準備金の値」から右側の列の金額が並び、「積算日時」を一行として認識していました。

さらに同じレシートを別の机の上や照明の当たり方などを変え、何パターンか撮影して試します。撮影状況により区切り位置が変わったり行数が変わったりしてしまう場合はそれに対応した処理も検討する必要があります。ある程度傾向が把握できたら計算式とスクリプトを組み合わせてテキストを分解していきます。前半で書いた「レシートの体裁が変わらないこと」が重要なのはこのためなんですね。

実装 3

計算式で登場する関数は主にこの 3 つです。

  • GetValue・・・・改行区切りテキストから指定した行のテキストを返す
  • Substitute・・・・テキストから指定した検索テキストを置換テキストで置き換える
  • GetAsNumber・・・・指定したテキスト内の数字を数字フィールドタイプとして返す

ここからの説明は GetLiveText 関数の値をセットした変数「$結果」に入った値が元になります。

〈考え方〉

  • スクリプトは同じ種類のデータごとに考える 例:金額、紙幣と硬貨の枚数、項目名
  • 今回必要なのは金額、枚数であり項目名は基本的に必要ない
  • 「¥」「,」といった記号は必要ない

〈金額〉
今回のレシートには日本の通貨を表す「¥」記号が入っています(アメリカであれば「$」、韓国であれば「₩」といった通貨記号があります)。しかし、計算で使うための数値には通貨記号は必要ありませんのでこれを省きます。
手っ取り早い方法が GetAsNumber 関数を使うことです。数字フィールドタイプで利用できる形に変換してくれるので余分な記号やスペースを取り除いてくれます。

「釣銭準備金の値」の場合
 1. 23 行目の値 “¥50,000” を取得する
 GetValue ( $結果 ; 23 )

 2. 数値に変換する
 GetAsNumber ( GetValue ( $結果 ; 23 ))

〈紙幣と硬貨の枚数〉
「認識結果」の 9 行目から 17 行目に 1 万円札から 1 円硬貨までの枚数が入っています。ここで欲しいのは「×」より後ろの値です。また、行によって「×」の前後にスペースが入る場合、入らない場合とブレがありますのでこれも考慮します。それでは段階を踏んで考えます。

「1 万円札の枚数」の場合
 1. 9 行目の値を取る
 GetValue ( $結果 ; 9 )

 2. 9 行目の値から「x」を「¶(改行)」に置き換えて 2 行にする。よく見ると「×(かける)」ではなく「x(エックス)」で認識されています。また他の似た文字のことがあるので状況に応じて検索・置換の計算を増やす必要があります。
 Substitute ( GetValue ( $結果 ; 9 ) ; "x" ; "¶" )
 Substitute ( GetValue ( $結果 ; 9 ) ; [ "x" ; "¶" ] ; [ "○" ; "¶" ] )

 3. 2. の値から 2 行目だけを取る
 GetValue ( Substitute ( GetValue ( $結果 ; 9 ) ; "x" ; "¶" ) ; 2 )

 4. 3. の値を数値だけにする
 GetAsNumber ( GetValue ( Substitute ( GetValue ( $結果 ; 9 ) ; "x" ; "¶" ) ; 2 ) )

一見ややこしそうな計算式ですが順番に見ると式の意味がわかってきます。

「¶(改行)」に置き換えるという方法はとても汎用性がありますので覚えておくと便利に利用できます。例えばメールアドレスのドメイン名だけ取りたいという時にも「@」を「¶(改行)」に置き換えて 2 行目を取得するだけで文字数や「.(ピリオド)」を計算式に考慮する必要もありません。

GetValue ( Substitute ( 連絡先::メールアドレス ; "@" ; "¶" ) ; 2 )

誤認識への対応

GetLiveText 関数の結果が事前に想定した結果と同じかどうかを判定することで、誤認識があるか知ることができます。完全に想定外の場合は再度写真を撮り直すように促し、軽度なものであれば手入力で補正するというように臨機応変に対応することで使いやすいカスタム App を構築できます。

  • 行数が想定と同じか確認する

今回のサンプルレシートは値が入った行は全部で 42 行です。これが 41 行や 43 行で取れてしまうと GetValue 関数を使っているのでどこかの行からズレが発生します。これは完全に想定外と言えますが、何度かテストした結果がもし五分五分の場合には行数に応じた分岐で回避することもできます。

  • つじつまが合うか計算する

1 万円札の行を例に考えてみましょう。
¥10,000 × 3   ¥30,000
今回作成したスクリプトでは枚数「3」と金額「¥30,000」を取得します。9 行目の結果は 1 万円札だということが前提にあるので「 10000 × 枚数」と「 金額」を比較して一致しなければどちらかに誤りがあることがわかります。条件付き書式を使って強調表示させることで、すぐに見分けをつけることができます。
他の値についても、計算した結果と取得した値が一致するかを何か所か調べることで精度を上げることができます。

認識結果を分割してフィールドに保存する処理は少し面倒に感じられるかもしれません。ただ、テキスト認識表示の機能をこれほど簡単に活用できるのであれば、さまざまなシーンでの応用を検討する価値があるのではないでしょうか? ぜひ皆様の業務の中での便利なユースケースを探してみてください。

今回のサンプルファイルはこちらからダウンロードできます。

「GetLiveText 関数を使ってテキスト認識表示」はいかがでしたでしょうか? Apple の最新技術も FileMaker を使うことでローコードで利用できます。まずは FileMaker Pro 2023 をお試しください。45 日間の無料体験版はこちらからダウンロードできます。