#概要
論文を翻訳して読むのに、ブラウザ上でちまちま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とアクセストークンのところは、念のため*で隠してます。
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.テキストファイルに文章を入力
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とか。