SlideViewer というアプリをリリースしています。
そこでは、Speaker Deck のスライドを表示できているのですが、テキストをコピーしたりはできません。
そこで、 https://github.com/noboru-i/SlideViewer/pull/44/files の変更を加えて、OCR機能を追加しました。
tess-twoを導入する
Tesseract というOCRのライブラリを利用することにしました。
rmtheis/tess-two というTesseractのラッパーライブラリが、Androidへの導入には簡単そうでした。
READMEに書いてあるとおり、compile 'com.rmtheis:tess-two:6.2.0'
を追加します。
また、NDKが必要とのことだったので、 プロジェクトへの C / C++ コードの追加 | Android Studio を参考にインストールしました。
現在だと、 [LLDB]、[CMake]、[NDK] の3つをSDK Managerからインストールするだけで大丈夫でした。
言語ファイルのダウンロード
Pre-requisitesに記載の通り、.traineddata
といったファイルが必要です。
OcrUtil.download
として実装してみました。
ディレクトリ名にも規則があるらしく、こんな感じでディレクトリを生成しました。
OkHttp
でダウンロードして、FileOutputStream
で書き込みました。
解析する
https://github.com/noboru-i/SlideViewer/pull/44/files#diff-58c7b26f0bf059f14d726dd10196893bR426
GlideのasBitmapを利用して、Bitmapを取得します。
OcrUtil.recognizeText
で実際の解析処理を行っています。
画像がBitmap.Config.ARGB_8888
形式じゃない場合もあり、それだとエラーが発生してしまうので、揃えるように変換します。
結果
こんな感じで、テキストを解析できています。
ただ、背景の画像が複雑な場合や、文字が細かい場合などは上手く認識できない場合が多そうです。
また、日本語の辞書をダウンロード出来る機能も付けていますが、そちらを利用しても、日本語の認識は精度が低そうです。
また、2つの言語を同時にしていしたりもできず、日本語と英語が混じったテキストの認識はプログラム側でなにかしてやらないと意味ないかもしれないです。