#グラブル短歌 の画像から文字を取り出そう、という画像処理の話

# この記事は？
- スマホ向けゲーム「グランブルーファンタジー」では、#グラブル短歌 のハッシュタグでゲーム内からTwitterに投稿するとゲーム内でお得なことがあるキャンペーンを実施中だ。
- しかし、日を追うごとに内容は短歌から遠ざかってしまっている現実があり、まともな短歌が投稿されていない気がする。
- 画像処理で投稿内容を文字化し、実際に確認してみよう。

# 監視の設定方法
## 環境情報
| 項目 | 情報 |
|:-:|:-:|
|CentOS|CentOS Linux release 7.2.1511|
|PHP|PHP 5.5.31 (cli)|

## 実際の投稿
一例だが、ゲーム内投稿はこのように
「#グラブル短歌」のハッシュタグとともに画像形式で投稿される。
https://twitter.com/Hiroki_lzh/status/760487763296661505


## まずは画像を取得しよう
TwitterAPIでアクセスし、対象のハッシュタグを含むツイートを抽出した。
なお、TwitterAPI活用にはtwitteroauthを使用、
twitteroauthの導入やトークンの取得方法については別記事を参照とする。
今回は[search API](https://dev.twitter.com/rest/reference/get/search/tweets)を利用している。

```php:get-search-hash.php
#!/usr/bin/php
<?php
require_once("twitteroauth/twitteroauth.php");
$consumerKey = 'XXXXX';
$consumerSecret = 'XXXXX';
$accessToken = 'XXXXX';
$accessTokenSecret = 'XXXXX';

$twObj = new TwitterOAuth($consumerKey,$consumerSecret,$accessToken,$accessTokenSecret);
$query = array(
                'q'     =>      '#グラブル短歌 https:// -RT',
                'count' =>      '100',
                'include_entities'      =>      'true'
        );

$req = $twObj->OAuthRequest('https://api.twitter.com/1.1/search/tweets.json','GET',$query);
$tweets = json_decode($req);

if (isset($tweets) && empty($tweets->errors)) {
    foreach ($tweets->statuses as $val) {
        echo date('Y-m-d H:i:s', strtotime($val->created_at)) . ' --> ';
        echo $val->text . ' ==> ';
        foreach ($val->entities->media as $media) {
                echo $media->media_url;
        }
        print "\n";
    }
} else {
    echo 'つぶやきはありません。';
}

?>

```
ポイントとしては下記の点。
- クエリ(q)では、リツイートを除外するために-RTオプションを、かつ対象の投稿ではない紛い物や悪質なユーザの投稿内容を避けるために「ハッシュタグ＋URL」で検索とした。
- 'include_entities'クエリがtrueになっていないと画像のURLが取得できないので注意。
- 今回のグラブル短歌についてはゲーム側からの投稿でロケーション設定と言語設定を行っていないようなので、localeとlangは設定してはいけない。

なお、出力結果は「ツイート時間(created_at)」「つぶやいた内容(text)」「画像のURL(media_url)」とした。


```実行結果例
$ ./get-search-hash.php
2016-08-30 16:06:49 --> #グラブル短歌 https://t.co/Fyq2CHcvdg ==> http://pbs.twimg.com/media/CrFuJO5UAAAkFbb.jpg
2016-08-30 16:06:46 --> #グラブル短歌 https://t.co/UmtZ9sgXtX ==> http://pbs.twimg.com/media/CrFuIeGVUAAd7m_.jpg
2016-08-30 16:06:46 --> #グラブル短歌 https://t.co/vuiOa540eW ==> http://pbs.twimg.com/media/CrFuIdtUsAA9Xcq.jpg
2016-08-30 16:06:45 --> #グラブル短歌 https://t.co/Pd8WNUuEga ==> http://pbs.twimg.com/media/CrFuIUgVIAAtCWa.jpg
2016-08-30 16:06:45 --> #グラブル短歌 https://t.co/ZKLuKw3OxF ==> http://pbs.twimg.com/media/CrFuIMgUsAAl7hG.jpg
2016-08-30 16:06:43 --> #グラブル短歌 https://t.co/e0o9vpadfm ==> http://pbs.twimg.com/media/CrFuHvwUIAAiRdP.jpg
2016-08-30 16:06:43 --> #グラブル短歌 https://t.co/5oBFVwfH6a ==> http://pbs.twimg.com/media/CrFuHtkVIAAk6b3.jpg
2016-08-30 16:06:41 --> #グラブル短歌 https://t.co/m3bNgsxSBV ==> http://pbs.twimg.com/media/CrFuHQyVYAEDjMb.jpg
2016-08-30 16:06:39 --> #グラブル短歌 https://t.co/wyDdFh9Oow ==> http://pbs.twimg.com/media/CrFuGo3UkAI18sg.jpg
2016-08-30 16:06:36 --> #グラブル短歌 https://t.co/0jmCBn287I ==> http://pbs.twimg.com/media/CrFuGDzVMAAS0jv.jpg
2016-08-30 16:06:34 --> #グラブル短歌 https://t.co/pAW7r5PPkh ==> http://pbs.twimg.com/media/CrFuFivVIAAXoKH.jpg
```

時間データとともに取得できるので、DBに格納し定期的に取得すればもっと良質なデータ計測となるのであろうが、ここでは実施しない。
心穏やかにwgetして画像を取得することにした。

```bash:コマンド実行
$ php get-search-hash.php |wget `awk '{print $7}'`
```

## 画像から文字を抽出しよう

LinuxでOCR（Optical Character Recognition、光学文字認識）でやってみる。

まずは導入

```bash
# yum install tesseract
# yum install tesseract-langpack-jpn
$ tesseract --version
tesseract 3.04.00
 leptonica-1.72
  libgif 4.1.6(?) : libjpeg 6b (libjpeg-turbo 1.2.90) : libpng 1.5.13 : libtiff 4.0.3 : zlib 1.2.7 : libwebp 0.3.0
```

使い方
第一引数：画像ファイル名
第二引数：出力ファイル名　※txtファイル名になるので拡張子は不要
-l オプションで言語を指定、ここでは日本語としてjpn
-psm でモード指定、通常横書きとして読み取るが-psm 5とすると縦書きとして読み取る

```bash
 $ tesseract imagename outputbase [-l lang] [-psm pagesegmode] [configfile...]
```



## で、その結果例
結果として言えば、短歌ともいえないものばかりだった。

サンプル1:これはOK
![CrFrisrVUAAFv4V.jpg](https://qiita-image-store.s3.amazonaws.com/0/129674/279dbb9f-8cae-3b39-54fc-de6cee590d48.jpeg)

  ↓

```
[鮒「

ふたりきりそつとだれかをかくすきみ
ぽ〈はしせんをかくしぐらぷる

」剛一

```

サンプル2:日本語でOK
![CrFr-EHUIAAganj.jpg](https://qiita-image-store.s3.amazonaws.com/0/129674/d33b599d-3d58-3b3e-6f4c-5b0784009c26.jpeg)

  ↓

```
門丿 } 「
ほぇほぇほぇほぇほぇほぇ
ほぇほぇほぇほぇほぇほぇほぇほ
ぇほぇへぉへぉぇほぇへぉぇほぇへ

帖脚

```

サンプル3:あっ（察し）
![CrFr0itVMAEEjO0.jpg](https://qiita-image-store.s3.amazonaws.com/0/129674/40fec9c7-7e37-bfb9-bfc9-4a2349fa3dad.jpeg)

  ↓

```
剛「
ぞいちゃんはごよういできませんでしたまろ

」剛一

```

## おわりに
- 予想以上に短歌の体裁を為していないものが多すぎて笑ってしまった。
- 投稿画像からテキストにコンバートするのは今回の画像だと粗が目立って厳しかった。
- とはいえ、もし僕が運営側の人間だったらTwitterにPOSTする際にDBか何かに同じテキストを登録しておいて後で参照できるようにする、きっと運営さんだって先のことを考えて作っているはずだ。
- だから運営さんはおかしなツイートに惑わされず、正しく適切に短歌を選んでユーザプレゼントを送ってほしい。

* * *
以上