17
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

Google翻訳APIをPythonで実行する

Last updated at Posted at 2020-07-24

#概要
論文を翻訳して読むのに、ブラウザ上でちまちまGoogle翻訳にコピペしていたのだが、いい加減面倒になった。そこでテキストファイルに書かれた英文を読みとり、翻訳結果を出力するPythonスクリプトを書いてみようと思った。

翻訳はGoogleAPIを使おうと思って事例を調べた所、Google翻訳APIを無料で作る方法という記事があったので、試してみた時のメモ

#元記事からのAPI変更点
元記事はGetでAPIを叩いていたが、大量の文章を投げる場合の文字列制限が気になったので、以下の通りPostでもアクセスできるようにした。

function doGet(e) {
  return doPost(e);
}

function doPost(e) {
    // リクエストパラメータを取得する
    var p = e.parameter;
    // LanguageAppクラスを用いて翻訳を実行
    var translatedText = LanguageApp.translate(p.text, p.source, p.target);
    // var translatedText = LanguageApp.translate("a", "en", "ja");
    // レスポンスボディの作成
    var body;
    if (translatedText) {
        body = {
          code: 200,
          text: translatedText
        };
    } else {
        body = {
          code: 400,
          text: "Bad Request"
        };
    }
    // レスポンスの作成
    var response = ContentService.createTextOutput();
    // Mime TypeをJSONに設定
    response.setMimeType(ContentService.MimeType.JSON);
    // JSONテキストをセットする
    response.setContent(JSON.stringify(body));

    return response;
}

#Pythonコード
api_urlには、上で作成したAPIのURLを指定してください。また、"Authorization"ヘッダーには、後述の「ハマったところ」で記載しているアクセストークンを指定してください。URLとアクセストークンのところは、念のため*で隠してます。

translate.py
import argparse
import requests
import pprint

def main():

    api_url = "https://script.google.com/macros/s/****************************************/exec"
    headers = {"Authorization": "Bearer ya29.***************************************************************************************************************"}

    parser = argparse.ArgumentParser()
    parser.add_argument("-input", type=str, required=True)
    args = parser.parse_args()

    input = ""
    with open(args.input, 'r',encoding="utf-8") as f:
        for line in f:
            print(line)
            line = line.strip()
            input += line

    params = {
        'text': "\"" + input + "\"",
        'source': 'en',
        'target': 'ja'
    }

    r_post = requests.post(api_url, headers=headers, data=params)
    print(r_post.text)


if __name__ == "__main__":
    main()

#使い方

1.テキストファイルに文章を入力

input.txt
hello

2.コマンド実行

$ python translate.py -input input.txt

3.コンソールに結果出力

以下のような形でコンソールに出力結果が得られる。

{"code":200,"text":"こんにちわ"}

#ハマったところ

認証エラーが発生

元記事の通りにやったところ、認証エラーが発生した。結論としては、[Google Apps Script]認証が必要なウェブアプリケーションを外部から実行するの通り、リクエストヘッダにアクセストークンを設定したところうまくいった。特定のユーザに限定して公開した訳ではなかったのだが。。。

追加したdoPost関数が認識されない

APIにdoGet関数を作成・公開し、その後にdoPost関数を追加しAPIを叩いたところ、スクリプト関数が見つかりません: doPostと怒られしばし悩んだ。結論としては、API公開時にAPIのバージョンを上げないと新しい関数が認識されないようだ。

おわりに

  • かなりの長文を食わせて見たが、途中までしか日本語が生成されていなかった。API側に文字制限があるのかもしれない。その場合は、センテンスが途中で途切れないよう注意しつつ、文章量を適当な長さに分割してAPIを複数回実行する等の対策が必要となる。
  • 次回はPDFからテキストを抽出するコマンドも作成してみる。最終的にはボタン一発でPDFから翻訳テキストを生成するGUIを作成したい。

#2020/7/25 追記(重要)
- 認証エラーについては、公開時に、「全ユーザ」ではなく、「Anyone Even Anonymouse」を指定すれば、アクセストークン等気にしなくてもよい。
(当然だわな)。しっかし、クソむずいぜ。AWSとかGoogleとか。

17
18
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
17
18

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?