使い方

【コード不要】画面の文字で自動タップ!OCRテキスト検出入門

公開日: Read in English

「アプリのデザインが変わったせいで、せっかく作った自動タップが全部おかしくなった」——そんな経験はありませんか?

ボタンの色も形も位置も、アップデートのたびに変わります。ところが不思議なもので、そこに書かれている文字だけは変わりません。「受け取る」は何年経っても「受け取る」ですし、「スタミナ 30/60」のような状態表示も、書式まで作り直されることはめったにありません。

TapEzy 開発チームがシナリオを組むとき、いちばん長持ちするのは決まって文字を手がかりにしたものでした。座標でもスクリーンショットでもなく、「この文字が出たら、そこをタップして」と指定する。これが文字認識(OCR)を使った自動化で、TapEzy ではテキスト検出のステップにあたります。root 化もコードも不要です。

練習用フォームで、検出された「作業完了しました」の文字を TapEzy がタップしているところ

座標を叩くだけの自動タップの限界

一般的なオートクリッカーや連打アプリは、決まった位置を決まった間隔でタップします。そこに何が表示されているかは判断していません。だから「押したいボタン」と「ローディング表示」と「まったく別の画面」を区別できません。

その結果、こういう場面で外します。

  • 読み込みが普段より遅く、ボタンが出る前にタップしてしまう
  • バナーやダイアログが差し込まれ、画面全体が下にずれる
  • 別の端末で再生したら、画面サイズが違って座標がすべてずれる
  • 見た目のよく似た画面で、間違ったほうを押してしまう

待ち時間を長くしても、遅くなるだけで確実にはなりません。必要なのは待ち時間ではなく、条件です。

なぜ「文字」を検出するのが有効なのか

TapEzy が判断に使える手がかりは、画像検出・テキスト検出・画面要素検出・数値検出の 4 種類です。このうち文字が特に向いているのは、次のような場合です。

  • 見た目は変わるが文言は変わらない — ボタンは作り直されても、名前が変わることは多くありません
  • 似た見た目のものが並んでいる — 同じ形のカードが並ぶ画面は形で見分けられませんが、書かれた文字なら簡単に区別できます
  • 後から読み返して分かる — 「『受け取る』が出たら押す」という指定は、半年後の自分にも意味が伝わります。座標のメモはそうはいきません

逆に、アイコンや色つきのバッジのように文字を持たない目印なら、画像検出のほうが適しています。そちらの手順は【root不要】画像認識オートクリッカーで自動タップする方法で解説しています。

用意するもの

  • Android 端末(root 化は不要)
  • Google Play からインストールした TapEzy
Google Playで手に入れよう

コードを書く必要も、特別な機器を用意して PC につなぐ必要もありません。TapEzy は無料でも画像検出やテキスト検出が使えます。無料版では、同時に保持できるシナリオの数に上限がありますが、この記事の内容を試すには十分です。

なお、TapEzy には練習用の画面が用意されているので、練習するだけなら他のアプリもいりません。ここからは実際に練習用画面(設定 → 練習用画面を起動 → 画面要素検出)を使ってテキスト検出を行う手順を解説します。

手順:指定した文字が出たらタップする

細かい操作までは書きません。全体の流れと、それぞれのステップが何のためにあるのかをつかんでください。

1. 練習用のフォーム画面を開く

設定 → 練習用画面を起動 → 画面要素検出を選びます。作業完了しましたというラベルとチェックボックス、Good/Bad の評価、コメント入力欄、次に進むボタンが並んだフォームが開きます。画面の名前は「画面要素検出」ですが、画面上の文字を読んで押す題材としてそのまま使えます。

この手のフォームには、控えておく価値のある座標がありません。それぞれの部品を見分けているのは、そばに書かれている文字だからです。

2. シナリオを作り、検出したい文字を入力する

シナリオ一覧の + からシナリオの作成でシナリオ名を付け、ステップの追加でテキスト検出を選びます。テキスト検出の編集画面の検出するテキストに、探したい文字を入力します。練習用フォームなら 作業完了しました です。

「テキスト検出の編集」ダイアログ。「検出するテキスト」に「作業完了しました」を入力した状態

ここで押さえておきたい点が 2 つあります。

  • 複数行を入力すると、各行が別々の候補になります。「どれかが出たら押す」という指定は、行を分けて書くのがいちばん素直です
  • 文字列は短いほうが安定します。長い文言を丸ごと指定すると、句読点や改行の位置で一致しなくなることがあります。ほかと紛れない範囲で、特徴的な部分だけを短く指定してください

要素単位での一致に限定という設定もあります。認識された要素そのものが指定した文字と一致したときだけ成功とみなす設定で、単語やブロックの内部に埋もれた部分一致を弾けます。ただし、長い一文の中にあっても独立した要素として切り出された語であれば引き続き一致します。効き方は実際に試して確かめてください。

3. 検出範囲を絞る

検出範囲では、画面のどこを読み取るかを指定します。目印が出る場所が決まっているなら、必ず絞っておきましょう。読み取る面積が減って速くなるうえ、画面内の別の場所にある同じ文字を掴んでしまう事故も防げます。

この事故は、練習用フォームですぐ再現できます。次に進むを狙うと、画面上部の案内文(各項目を入力して次に進むをタップしよう)にも同じ文字列が含まれているため、どちらが先に当たるか分かりません。要素単位での一致に限定は候補を減らす補助にはなりますが、案内文の中の語も独立した要素として切り出されれば一致しえます。確実なのは、検出範囲をボタンの周りに絞ることです。

「検出する範囲をドラッグで選択」の画面。チェックボックスの行までを検出範囲にして、コメント欄と「次に進む」を範囲外にしているところ

なお次に進むは、作業完了しましたにチェックを入れて Good/Bad のどちらかを選ぶまで押せません。タップの動作確認は作業完了しましたで行い、次に進むは検出範囲の説明用の題材として読んでください。

4. 見つかったとき/見つからなかったときを決める

検出成功時のアクションには、ステップを追加した時点で検出テキストをタップが入っています。タップ先は文字が認識された場所そのものなので、対象が動いても追従します。練習用フォームでは作業完了しましたの文字がタップされ、隣のチェックが切り替わります。スワイプやドラッグ、長押しなど、単純なタップ以外をしたい場合は検出した場所でジェスチャーを使います。

そのうえで検出タイムアウト(諦めるまで探し続ける時間)を、想定されるいちばん遅い読み込みより少し長めに設定します。検出失敗時のアクションは空のままでかまいません。何も設定しなければ、そのステップは何もせず次のステップへ進むだけです。今回のシナリオはステップが 1 つきりなので進む先がなく、次に設定する繰り返しでシナリオの先頭に戻り、もう一度検出からやり直すことになります。文字が出るまで待ちたいだけなら、これで十分です。何度か外れたら再生を終了したい、「閉じる」を押して復帰したい、といった場面では、ここにアクションを追加します。

5. 繰り返し回数を設定して再生する

シナリオ設定の繰り返し(0で無限)に回数を入れて再生し、画面キャプチャの許可を与えるだけです。

練習用フォームで繰り返しを 0 にすると、チェックが付いたり外れたりを延々と繰り返します。検出とタップがきちんと効いていることを、目で確かめるのにいちばん手軽な方法です。

Google Playで手に入れよう

うまく検出できないときは

文字の認識精度は、フォント・文字サイズ・コントラスト・端末によって変わります。どんな画面でも必ず読める、というものではありません。

効くツボは 2 つで、どちらもここまでに出てきたものです。検出するテキストを短くすることと、検出範囲を絞ること。調整はまず練習用画面で、一度に 1 つずつ試しましょう。条件が一定なので、変更の効果を正しく判断できます。

症状別の詳しい対処は、公式ガイドの検出がうまくいかないときの調整にまとめています。要素単位での一致に限定の使い分けや、画面の向きが変わったときの扱いもこちらです。

手を動かしてみたい方へ:チュートリアルがあります

この記事は「なぜ座標では無理で、文字を読めばうまくいくのか」に絞って書きました。実際に自分の端末で一歩ずつ進めたい方には、公式チュートリアルの Lesson 6: テキスト検出 を用意しています。

こちらは題材が違います。使うのはテキスト検出という名前のほうの練習用画面で、#A・#B・#C のラベルが付いたカードが 4×3 のグリッドに並ぶパズルです。そしてこのカードはタップではなくドラッグに反応します。つまり検出テキストをタップでは何も起こりません。同じラベルのカードをドラッグして重ねると消える、という遊びです。

そのぶん、Lesson 6 ではタップ以外のアクションを扱います。#A を検出して検出したテキスト間でドラッグを使い、1 番目の検出結果から 2 番目の検出結果へドラッグさせる、という内容です。この記事でタップの考え方をつかんだあとに読むと、応用の幅が一気に広がります。

よくある質問

複数の文字を順番に探せますか?

できます。テキスト検出のステップを必要な数だけ並べれば、上から順に処理されます。1 つのステップに複数行を入力して「どれかが出たら」とすることもできますし、シナリオ制御のステップでジャンプや繰り返しを組むこともできます。組み方は公式ガイドの検出がうまくいかないときの調整でも紹介しています。

日本語の文字も読めますか?

読めます。検出するテキストに日本語が含まれていると、日本語向けの認識エンジンに自動で切り替わります。設定を切り替える必要はありません。ただし認識精度はフォント・文字サイズ・コントラストに左右されるので、装飾の強い書体や極端に小さい文字では取りこぼすことがあります。うまくいかないときは、まず検出するテキストを短くしてみてください。

root 化や PC への接続は必要ですか?

どちらも不要です。Google Play からインストールして、アクセシビリティの許可を与えれば動きます。

テキスト検出と画面要素検出、どちらを使えばいいですか?

まず、よくある誤解から。画面要素検出でも、文字で狙えます。画面要素検出のマッチ条件にはテキスト内容・内包テキスト・説明ラベルがあり、一致方法として完全一致・含む・前方一致・後方一致・数値条件を選べます。「文字が見えているからテキスト検出」という切り分けではありません。

本当の分かれ目は、その文字が部品として存在しているのか、それとも絵として描かれているのかです。ボタンや入力欄としてきちんと作られた部品なら、そこに書かれた文字を画面要素検出がそのまま読み取れます。一方、ゲームのように画面全体を絵として描いているアプリでは、ボタンに見えているものも中身は 1 枚の画像で、部品としての文字がありません。ここで効くのが、画面に映っている文字をそのまま読み取るテキスト検出(OCR)です。

目安としては、ゲームのように画面やボタンの文字を絵として描いているアプリならテキスト検出、それ以外の一般的なアプリならまず画面要素検出、と考えてください。画面要素検出には、画面キャプチャの許可が不要で予約再生でも動くという利点もあります。

迷ったときは、先に画面要素検出で狙った部品を拾えるか試してみてください。拾えなければ、そのステップをテキスト検出に切り替えればかまいません。

バッテリーはどのくらい消費しますか?

検出は画面を繰り返し読み取る処理なので、単純な連打よりは負荷がかかります。検出範囲を絞るのがいちばん効きます。再生中にサービスが止まってしまう場合は、端末のバッテリー最適化が原因のことがあります。端末の設定でバッテリー最適化の対象から TapEzy を外しておくと、途中で終了しにくくなります。

時間を指定して、自動で再生させられますか?

再生予約の機能はありますが、テキスト検出と画像検出を含むシナリオは予約再生では動きません。どちらも画面キャプチャを必要とし、予約再生ではキャプチャが使えないためです。時間指定で動かしたい場合は、キャプチャ不要の画面要素検出を検討してください。

タップの先へ

画面を読めるようになると、できることが一段広がります。数値検出は画面上の数値を読み取るので、「スタミナが 50 を超えたら動く」といった条件で動かせます。条件分岐を使えば、検出結果によってシナリオの進み方を変えられますし、細かく制御したい方向けには Lua スクリプトも用意されています。

上で作ったシナリオには、これらはまったく必要ありません。ステップ 1 つと設定 2 つ、アクション 1 つで完成します。それでも、必要になったときに追加費用なしで手が届く、というのは知っておいて損はありません。

まとめ

デザインの変更に強い自動化を作りたいなら、画面に書かれている文字を手がかりにするのがいちばんの近道です。

検出するテキストは短く。検出範囲は狙った場所に絞る。検出成功時のアクションに検出テキストをタップを置く。この 3 つで、座標タップが崩れていた場面のほとんどは越えられます。検出失敗時のアクションは空のままでも、今回のような 1 ステップのシナリオなら繰り返しの次の周回で再挑戦になります。必要になったときに足せば十分です。

まずは練習用フォームで 1 つ作ってみてください。手を動かすと、5 分で腹に落ちます。

関連リンク

TapEzyはGoogle Playで配信中の無料アプリです。インストールにより利用規約およびプライバシーポリシーに同意したものとみなされます。

本アプリは業務効率化、テスト、アクセシビリティ補助などの正当な用途を目的としています。ゲームのチートや他のアプリ・サービスの利用規約に違反する目的での使用は推奨していません。本アプリを使って自動化する対象アプリ・サービスの利用規約への遵守は、ユーザーご自身の責任となります。