[Google + DeepL + Twitter]中国野球協会の画像アナウンスを翻訳してツイートするまで
データ分析基盤を作り上げたMLBと並行して、実は中国の野球もカバーしようとしています。Zennで野球トークを書くのもよろしくないので、詳しくは省きますが、実は着々と力を付けている国で、依然国内ではマイナースポーツ扱いですが、それでもプレーヤー人口は4000万人と言われる程、巨大なベースを誇る、ロマンの大きなトピックです。
しかし、情報を収集する上で、ちょっとだけ中国語が分かる(とりあえず、中国語検定3級はゲットしました)ものの、サクサクと文を読めるレベルでは全く無い身なので、やはり言語のハードルに悩みます。
特にメインソースにしている中国野球協会のオフィシャルサイトは、公式アナウンスを全てPDFのキャプチャでリリースするので、サクッと翻訳して、文意を汲むフローが行えず、中文弱者としてはちょっとばかり辛い点でした。
私の中国語スキルを上げていくことは並行して行うとして、とは言えハマっているうちにネタ収集もたくさんしたいしなー、ともなったので、この画像ファイルをインプットに
- OCR
- 翻訳
- ツイート形式で共有
を行ってくれる仕組みを作って、少しばかり中国野球ネタの収集をコスパ良くしよう!となりました。
全体図
今回もベースはGoogleパワーに依存して、翻訳エンジンだけDeepLを回す形にしました。
- 翻訳したい(ツイートしたい)アナウンス画像と、ツイート文をインプットにしてGoogle Colab上で書いたNotebookを実行
- OCRはGoogle DriveでサポートのOCR機能を利用
- Python側でも
EasyOCR
もテストしたものの、Google Driveの方が精度は良さそうだったので、、
- Python側でも
- OCRで抜き出したテキストをDeepLで日本語に変換
- インプットのアナウンス画像と翻訳済テキストを画像化した物をツイート
プライベートのこぢんまりしたアプリケーションにあんまりお金を払うモチベーションは無かったのですが、無事0円で作り上げられました!Googleパワーは偉大ですな、、
構成詳細
OCRと翻訳については、コードも交えて書きます。文字列の画像化やツイートは、PIL
や twitter
ライブラリのドキュメントに沿って行っただけな上、あんまり主題でも無いので、ここでは割愛します。
OCR
PythonのGoogle SDKやGASでOCRのサポートは無いのですが、Google DriveでOCRをサポートしてくれています。リンクでも書かれていますが、スクリプト無しでも
- Google DriveにOCRをしたい画像を置く
- その画像を「Googleドキュメント」としてオープン
するだけで、OCRをしてくれます。
プライベートなのでちゃんとした検証では無いですが、OCRの方式はPythonライブラリで行うパターン等、いくつかテストをしてみた限りは、Google Driveの機能で済ますパターンが一番抜け漏れ無く文字を読んでくれたイメージです。OCRサポートのSaaSを叩くノリで扱えるコスパの良さも光り、今回はGoogle DriveでOCRを行うことにしました。
Pythonスクリプトで回す上では、Google Driveへ新規にMIMEタイプを application/vnd.google-apps.document
として対象画像をアップロードしてしまう、でOKです。
from googleapiclient.discovery import build
from googleapiclient.http import MediaFileUpload
# 定数
MIME_TYPE = "application/vnd.google-apps.document"
# Driveサービスのビルド
# Cloud Endpoints APIにつなぐ場合は、こんな具合でつなぐインターフェースがある
driveservice = build("drive", "v3")
req_body = {
"name": "XXXX_OCR.jpeg",
"mimeType": MIME_TYPE,
}
# アップロードメディア情報を作成
media_body = MediaFileUpload("xxxx.jpeg", mimetype=MIME_TYPE, resumable=True)
# Google Driveへファイル作成
drive_resp = driveservice.files().create(
body=req_body,
media_body=media_body
).execute()
これで、OCRは完了です。アップロードされたファイルの中身を読めば、OCRしてどんな文言が抜けたかを見ることが出来ます。
また、drive_resp
は、アップロードされたファイル名やファイルID等の情報を保持しているため、翻訳処理はここで得られたメタ情報をインプットに進めます。
翻訳
Google TranslateのAPIはPythonにライブラリ、GASでもfunctionコールが出来ることを確認しましたが、文としてちゃんと通る具合にはならず、そのままツイートまで行うには若干ファジーな出来でした。そこで、文脈が通らない箇所はスルーする等のネックは伝えられつつも、翻訳文としてはスムースに読める形に仕上げてくれるDeepLのAPIを叩くことにしました。
開発者用のDeepL Free APIに登録して、APIキーを取得しておきましょう。
import requests
# Google Docsのサービス
docservice = build("docs", "v1")
# OCR結果を読み取り
doc = docservice.documents().get(documentId=drive_resp["id"]).execute()
contents = []
for inx, c in enumerate(doc.get("body").get("content")):
# コンテンツが読まれるのは3行目からなので、それ以前はパス
if inx <= 1:
continue
contents.append(c["paragraph"]["elements"][0]["textRun"]["content"])
replaced = "".join(contents).replace("\n", "")
# DeepLで翻訳。今回はソースは中国語、アウトプットに日本後を指定
url = f"https://api-free.deepl.com/v2/translate?auth_key=あなたのAPIキーを書いてね&text={replaced}&target_lang=ja&source_lang=zh"
deepl_resp = requests.get(url)
translated = json.loads(deepl_resp.text)["translations"][0]["text"]
まとめ
ツイートまで完了したので、一旦は完成かなー、とのイメージです。
またしても、Googleのパワーに下支えされた、手抜きながらも効果がある仕組みが出来ました。もう、Google無しには生きられません。
ありがとう、Google。大好きだよ、Google。
日本酒たくさん飲みながら書いたブログなので、こんな具合でクロージングとさせて頂きます。
Discussion