walkingmask’s development log

IT系の情報などを適当に書いていきます

MENU

GASとLINE Messaging APIで「My『文字起こし君』」を作る!(AIじゃなくてOCRで!)

どうも、GAS芸人のますくです。

今日、彼女とLINEしているとこんなメッセージが飛んで来ました。

f:id:walkingmask:20180426003827p:plain

URLはこちら。

【天才】LINEに画像を送信すると文字起こしするプログラムを作った人が話題に|オタクニュース

んー、面白いアイディアですね!

ってことで、例のごとくGASとLINE Messaging APIで作ってみたいと思います。

f:id:walkingmask:20180426003958p:plain

GASやLINE Messaging APIの大枠については、ネット上に素晴らしい記事がゴロゴロ転がっているので、割愛しますが

簡単に紹介しておくと、

  • GAS: Google Apps Scriptの略で、Google アカウントを持って入れば簡単にWebサービスとかプログラムできちゃうすごいやつです
  • LINE Messaging API: LINEのトークラをプログラムから色々するためにLINEから提供されている機能です

どんなことができるか、過去の記事を見るとイメージが付きやすいかもしらません(宣伝)。

walkingmask.hatenablog.com walkingmask.hatenablog.com

どうやって実現するか?

いたってシンプルで、

  1. LINEのトークに投げられた画像をMessaging APIで取得する
  2. GoogleドキュメントのOCR機能で文字起こしする
  3. 元のトークに文字起こししたものを投げ返す

図にするとこんな感じです。

f:id:walkingmask:20180426005747p:plain

Google ドキュメントに画像を投げると、文字起こししてくれるのは有名だと思います。

togetter.com

ただし、これだと画像を撮って、パソコンに渡して、アップロードして...のように一手間かかります。

そこを、スマホで撮ってLINEに投げたらできちゃうと言うところが「文字起こし君」の素晴らしいところですね!

スクリプト(一部)

ここで重要なのは、

部分だと思います。そこは色々なサイトを参考にしながら、こんな感じで実装しました。

// Post処理するやつ
function doPost(e) {
  var json = JSON.parse(e.postData.contents);
  if (json.events[0].message.type = 'image') {
    var blob = get_line_content(json.events[0].message.id);
    // 全部画像として扱っちゃう
    var text = ocr(blob);
    reply(json, text);
  }
}

// 画像とか取得するやつ
function get_line_content(message_id) {
  var headers = {
    'Authorization': 'Bearer ' + getProp('CHANNEL_ACCESS_TOKEN')
  };
  var options = {
    'method'  : 'GET',
    'headers': headers
  };
  var url = 'https://api.line.me/v2/bot/message/' + message_id + '/content';
  var blob = UrlFetchApp.fetch(url, options).getBlob();
  return blob;
}

// OCRするやつ
function ocr(imgBlob) {
  var resource = {
    title: imgBlob.getName(),
    mimeType: imgBlob.getContentType()
  };
  var options = {
    ocr: true
  };
  try {
    var imgFile = Drive.Files.insert(resource, imgBlob, options);
    var doc = DocumentApp.openById(imgFile.id);
    var text = doc.getBody().getText().replace("\n", "");
    var res = Drive.Files.remove(imgFile.id);
  } catch(e) {
    spreadsheetLog('err in ocr::ocr: '+e);
    return 'err';
  }
  return text;
}

getPropはスクリプトプロパティを引っ張ってくるやつで、replyはトークに返信するやつです。

詳しくは過去の記事を参照してください。

My文字起こし君

f:id:walkingmask:20180426010508p:plain

って感じで作れました!

なんとなく作り始めたのに、精度が思ったよりもよくて、超・自分で使えそうだなと思いました(☝ ՞ਊ ՞)☝ウェーイ

言語切り替えの必要なく英語も読み取ってくれるたで、論文読むときに良さそうです。

実質1時間程度で作れたので、GASに慣れている人は上のコードを参考にしたらパパッと作れちゃうと思います。

また、この機会にGASやプログラミングを初めてみるのもおすすめです!

一人に一台「My文字起こし君」!

(ちなみに、このMy文字起こし君は、OCR(光学文字認識)を使っただけなので、AI(人工知能)は使ってないです。残念!)

2018/04/26 追記:

有料ですが、「文字起こし君」の作者が1から作り方を教えてくれている記事もあるようです。

note.mu

プログラミング初心者の方は、こちらを読むといいかもしれません(AIプログラミングではなさそうですが)。

参考URL