Kasasagi’s memorandum

JavaとかProcessingとか。最近はAtcoderとか。

紙に書いた言葉をツイートするシステムを作った

明けましておめでとうございます、かささぎです。

今年もだらだら書いていきます。

 

突然ですが、「紙製ツイッター」というものはご存知でしょうか。

通信障害が起きても、紙製なので、通常どおりTwitterを利用できるというものです。

kyoko-np.net

まあ、虚構新聞ネタですがね。太陽フレアで通信障害が起きるんじゃね?みたいな心配がされていた時のネタです。

マジレスすると、書いたツイートが他人に共有されるわけではないので、ただのメモなのですが、このメモの内容を実際のTwitter上にツイートできればおもしろいんじゃないかと考えました。

つまり今回は、紙に書いた言葉をツイートするシステムを作成します。

※写真を撮ってツイートすればよくねという質問は受け付けません。

 

 

1. 開発環境

言語:Java

IDEIntellij IDEA

ライブラリ・API:tess4j、twitter4j

 

2. tess4j

 tess4jは、OCR(光学的文字認識)を行うライブラリです。平たく言うと書いてある文字が何かを判別してくれるものです。tesseractというC++のライブラリのJava版という感じだそうです。OCRライブラリにはいろいろあるのですが、無料版で精度もそこそこ、また学習機能もあるそうなので、採用しました。今回は学習させていませんが。

このライブラリ利用に至っては以下のHPを参考にさせていただきました。というよりほぼ全部コピペったんですが。環境変数をいじること以外に注意することはないと思います。

【Java】 画像から文字列を取得する [2] 〜 Tesseract-OCR / Tess4J 編 〜 ( プログラム ) - プログラム の個人的なメモ - Yahoo!ブログ

 

3.Twitter4j

 Twitter4jはプログラムからTwitterにアクセスをし、情報を取得したりツイートしたりできるAPIです。

Twitter4J - A Java library for the Twitter API

 TwitterDevelopersに登録して、Oauth認証を行うなどがありますが、そんなに難しくありません。認証で発行されるkeyやtokenは以下のような内容で、twitter4j.propertiesファイルに記す必要があります。

debug=true
oauth.consumerKey=XXXXXXXXXXXXXXXXXXXXXXXXX
oauth.consumerSecret=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
oauth.accessToken=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX
oauth.accessTokenSecret=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX

このtwitter4j.propertiesファイルはsrc内の利用するクラスと同じ階層に入れる必要があります。はじめはプロジェクト直下に入れていたせいで動きませんでした。

 

4. プログラムコード

ダイナミック ソースコードは以下の通りです。

gista94291627d6513da4b4b9168b306bc08

解説します。

今回はフォルダに画像ファイルを入れ、その画像をツイートするという構成にしました。folderPathにはそのフォルダのパスを格納します。

fileListにはreadFiles関数で読み取ったファイル名を返して格納されます。

そのfileListの長さ分、readAndTweet関数で読み取ってツイートされます。

readAndTweet関数内の説明をします。setLanguage("jpn")で日本語を読み取れるように設定しました。日本語を利用するためには、jpn.traineddataファイルというのが必要ですが、こちらは以下のHPからダウンロードします。

https://github.com/tesseract-ocr/tessdata

読み取られた結果はresultに入るため、このresultに#byPaperというハッシュタグを印加しツイートするようにしました。

読み取った後は、deleteFile関数で画像ファイルを削除するようにしました。

 

5. 実行方法・結果

実行には一家に一台はある(ない)ScanSnapを用います。

f:id:yh9092:20180106164434j:plain

またスキャンした画像を簡単にツイートできるよう、jarファイルをエクスポートして、フォルダにまとめました。

この際に、フォルダと同じ階層にtessdataフォルダを配置する必要があります。

f:id:yh9092:20180106164720p:plain

ツイートする内容は以下のメモを用意しました。

f:id:yh9092:20180106164807p:plain

拙い字ですみません。

jarファイルをダブクリして実行。

結果です。

さすがに精度がゴミ過ぎたので、何かできないかと考えたのですが、tesseractの言語の設定を日本語にしたためではないかと考えました。

そこで日本語設定を解除し実行。

ちょっとはましになりました。

そもそもOCRで手書き文字も実用化できるレベルの精度にするには、機械学習などが必要でかなり大変です。今回は画像を読み取り範囲の指定しなかったり、輝度の補正なども行わなかったりと、画像処理すら全く行わなかったため、順当だと思われます。

tesseractは機械学習を行い精度の向上を図れるそうなので、試してみたいです。

まあ、コンピュータのフォントなら精度がいいはずなのでやってみます。

f:id:yh9092:20180106170147p:plain

これでやってみると、

あるえ?MS明朝でもだめ?

やっぱり勉強させないとだめですね。

試しに、日本語手書きでもやってみました。

何を言っているかわかったら30ポイントです。

 

OCRの認識精度が低く、実用性には乏しいものとなってしまいましたが、tesseractとtwitter4jの使用テストにはなったのでいいかなって思います。

tesseractの機械学習はなかなか難しそうなので、機会があればやってみたいと思います。

それでは。