紙に書いた言葉をツイートするシステムを作った
明けましておめでとうございます、かささぎです。
今年もだらだら書いていきます。
突然ですが、「紙製ツイッター」というものはご存知でしょうか。
通信障害が起きても、紙製なので、通常どおりTwitterを利用できるというものです。
まあ、虚構新聞ネタですがね。太陽フレアで通信障害が起きるんじゃね?みたいな心配がされていた時のネタです。
マジレスすると、書いたツイートが他人に共有されるわけではないので、ただのメモなのですが、このメモの内容を実際のTwitter上にツイートできればおもしろいんじゃないかと考えました。
つまり今回は、紙に書いた言葉をツイートするシステムを作成します。
※写真を撮ってツイートすればよくねという質問は受け付けません。
1. 開発環境
言語:Java
ライブラリ・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を用います。
またスキャンした画像を簡単にツイートできるよう、jarファイルをエクスポートして、フォルダにまとめました。
この際に、フォルダと同じ階層にtessdataフォルダを配置する必要があります。
ツイートする内容は以下のメモを用意しました。
拙い字ですみません。
jarファイルをダブクリして実行。
結果です。
ー
— かささぎ (@hrt9092) 2018年1月6日
蝿gー ′。 下w汁†沈
#byPaper
さすがに精度がゴミ過ぎたので、何かできないかと考えたのですが、tesseractの言語の設定を日本語にしたためではないかと考えました。
そこで日本語設定を解除し実行。
He, [0 wa’rfal"
— かささぎ (@hrt9092) 2018年1月6日
#byPaper
ちょっとはましになりました。
そもそもOCRで手書き文字も実用化できるレベルの精度にするには、機械学習などが必要でかなり大変です。今回は画像を読み取り範囲の指定しなかったり、輝度の補正なども行わなかったりと、画像処理すら全く行わなかったため、順当だと思われます。
tesseractは機械学習を行い精度の向上を図れるそうなので、試してみたいです。
まあ、コンピュータのフォントなら精度がいいはずなのでやってみます。
これでやってみると、
T〇EーCの勉豆菫
— かささぎ (@hrt9092) 2018年1月6日
全 〈 捗 ら なし ヽ
#byPaper
あるえ?MS明朝でもだめ?
やっぱり勉強させないとだめですね。
試しに、日本語手書きでもやってみました。
壽司縣たヽ
— かささぎ (@hrt9092) 2018年1月6日
#byPaper
何を言っているかわかったら30ポイントです。
OCRの認識精度が低く、実用性には乏しいものとなってしまいましたが、tesseractとtwitter4jの使用テストにはなったのでいいかなって思います。
tesseractの機械学習はなかなか難しそうなので、機会があればやってみたいと思います。
それでは。