Python初心者がGoogle translate(グーグル翻訳)APIを使ってみます。
※エラーが表示され、問題が未解決されていません。(2020年5月5日)
せっかく12ヶ月の無料トライアルができるので、Google Cloud Platformを活用していきたいと思いますので、今回は、PythonでGoogle翻訳APIである「Cloud Translation API」を使っていきます。
なお、「Cloud Translation API」は本来は有料です。一部無料使用もあります。詳細については、「Cloud Translation | Google Cloud」の料金ページをご確認ください。
■Python
今回のPythonのバージョンは、「3.8.2」を使用しています。
■Cloud Translation APIの有効化
まず、持っているGoogleアカウントでGoogle Cloud Platform(https://console.cloud.google.com/home/dashboard)にログインします。
Google Cloud Platformのダッシュボード上部に、「リソースとサービスを検索します」という検索バーがありますので、こちらで「Cloud Translation API」と検索します。
検索すると候補に「Cloud Translation API」が表示されますので、こちらをクリックします。
クリックすると、「APIライブラリ」の「Cloud Translation API」が表示されますのでこちらで「有効にする」ボタンをクリックします。
クリックすると、「Cloud Translation API」が有効になり、左側のメニューから「認証情報」から「AIPキー」の「キー」の情報を取得しておきます。
■サービスアカウントを作成する
Cloud Translation APIのAIPキーを取得した後は、Cloud Translate APIを実行するサーバのためにサービスアカウントのキーが必要になりますので、アカウントの作成を行います。
Google Cloud Platformのダッシュボード(https://console.cloud.google.com/home/dashboard)から、左側のメニューから「APIとサービス」という文字をクリックします。
クリックしてさらに「認証情報」をクリックします。
クリックすると、認証情報のページが表示され、項目に「サービスアカウント」とありますので、その右側の「サービス アカウントを管理」をクリックします。
クリックすると、サービスアカウントのページになりますので、こちらから「サービスアカウントを作成」をクリックします。
クリックすると、サービスアカウントを作成ページになりますので、サービスアカウント名、サービスアカウントID、サービスアカウントの説明(任意)を入力します。入力後、「作成」ボタンをクリックします。
クリックすると、「サービス アカウントの権限(オプション)」になりますので、ロールを選択で、「Project」から「オーナー」を選択します。「オーナー」を選択し、「条件」はなしで、「続行」ボタンをクリックします。なお、今回は「オーナー」での作成となります。
クリックすると、「ユーザーにこのサービス アカウントへのアクセス権を付与(オプション)」になります。こちらで、サービスアカウントユーザーロールの入力はなし、サービスアカウント管理者ロールの入力はなしで、「キーの作成(オプション)」から「キーを作成」ボタンをクリックします。
クリックすると、右側に「キーの作成(オプション)」が表示されますので、キータイプは「JSON」で「作成」ボタンをクリックします。
クリックすると、「秘密鍵がパソコンに保存されました。jsonによってクラウドリソースへのアクセスが許可されるため、安全に保存してください。」といったポップアップが表示されますので、「閉じる」ボタンをクリックします。この時jsonファイルがローカル上に保存されます。
クリックすると、「キーID」が表示されますので、この情報を保存します。あとは「完了」ボタンをクリックします。
■サービスアカウントキーの適用をする
サービス アカウントを作成した際にローカル上に保存されたjsonファイルを適用します。
setx GOOGLE_APPLICATION_CREDENTIALS "jsonファイルの保存場所、jsonファイルを指定してください"
コマンドプロンプトから上記をコマンドしENTERキーを押す。
ENTERキーを押すと、「成功: 指定した値は保存されました。」と表示されます。
■コード
# coding: UTF-8 from google.cloud import translate # インスタンス生成 client = translate.Client() # I am a Architect を日本語に翻訳 result = client.translate( 'I am a Architect', target_language='ja') print(result['translatedText'])
サービスアカウントキーが適用されたと仮定し、こちらの記事を参考にコードを記述する。
このコードを「cloudtranslation-api-test.py」というファイルで保存し、テストを試みる。
■実行
コマンドプロンプトから、「cloudtranslation-api-test.py」というファイルを実行してみる。
ImportError: cannot import name 'translate' from 'google.cloud' (unknown location)
実行したが、ImportErrorというエラーが表示される。翻訳すると、「「google.cloud」から不明な場所に名前「translate」をインポートできません」となる。
エラーについて調べてみると、こちらのページが参考になる。google-cloud-translateがインストールされていないようだ。
pip install google-cloud-translate
コマンドプロンプトから、pipを経由してgoogle-cloud-translateをインストールしてみる。
インストールが完了後、再びコマンドプロンプトから「cloudtranslation-api-test.py」を実行してみる。
実行すると、ImportErrorというエラーは表示されなくなったが、別のエラーが表示される。
AttributeError: module 'google.cloud.translate' has no attribute 'Client'
このエラーはAttributeErrorで、翻訳してみると、「google.cloud.translate’に属性 ‘Client’がありません」とのこと。
エラーについて調べてみると、こちらの記事が参考になった。コードの”translate”を”translate_v2”に書き換えれば実行できるということなので、書き換えてみる。
■書き換えたコード
# coding: UTF-8 from google.cloud import translate_v2 # インスタンス生成 client = translate_v2.Client() # I am a Architect を日本語に翻訳 result = client.translate( 'I am a Architect', target_language='ja') print(result['translatedText'])
”translate”を”translate_v2”にコードを書き換えしてみました。
■実行
コードを書き換えて保存した「cloudtranslation-api-test.py」をコマンドプロンプトから実行してみる。
実行してみるが、下記のエラーが表示された。
Traceback (most recent call last): File "C:\Users\user\cloudtranslation-api-test.py", line 10, in <module> result = client.translate( 'I am a Architect', target_language='ja') File "C:\Users\user\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0\LocalCache\local-packages\Python38\site-packages\google\cloud\translate_v2\client.py", line 268, in translate response = self._connection.api_request(method="POST", path="", data=data) File "C:\Users\user\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0\LocalCache\local-packages\Python38\site-packages\google\cloud\_http.py", line 412, in api_request response = self._make_request( File "C:\Users\user\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0\LocalCache\local-packages\Python38\site-packages\google\cloud\_http.py", line 276, in _make_request return self._do_request( File "C:\Users\user\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0\LocalCache\local-packages\Python38\site-packages\google\cloud\_http.py", line 314, in _do_request return self.http.request( File "C:\Users\user\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0\LocalCache\local-packages\Python38\site-packages\google\auth\transport\requests.py", line 442, in request self.credentials.before_request(auth_request, method, url, request_headers) File "C:\Users\user\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0\LocalCache\local-packages\Python38\site-packages\google\auth\credentials.py", line 124, in before_request self.refresh(request) File "C:\Users\user\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0\LocalCache\local-packages\Python38\site-packages\google\oauth2\service_account.py", line 334, in refresh access_token, expiry, _ = _client.jwt_grant(request, self._token_uri, assertion) File "C:\Users\user\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0\LocalCache\local-packages\Python38\site-packages\google\oauth2\_client.py", line 153, in jwt_grant response_data = _token_endpoint_request(request, token_uri, body) File "C:\Users\user\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0\LocalCache\local-packages\Python38\site-packages\google\oauth2\_client.py", line 124, in _token_endpoint_request _handle_error_response(response_body) File "C:\Users\user\AppData\Local\Packages\PythonSoftwareFoundation.Python.3.8_qbz5n2kfra8p0\LocalCache\local-packages\Python38\site-packages\google\oauth2\_client.py", line 60, in _handle_error_response raise exceptions.RefreshError(error_details, response_body) google.auth.exceptions.RefreshError: ('invalid_grant: Invalid JWT Signature.', '{"error":"invalid_grant","error_description":"Invalid JWT Signature."}')
表示されたエラーについていろいろ調べてみたが、
・OAuth2
・アクセストークンの有効期限
・認証トークン
参考になったURL:
ここら辺が関係しているようだが、初心者がレベルが高すぎた。
解決できなかったので、レベルアップしたら、解決していきたい。
■疑問点
サービス アカウントを作成した際にローカル上に保存されたjsonファイルを適用する場合は、
setx GOOGLE_APPLICATION_CREDENTIALS "jsonファイルの保存場所、jsonファイルを指定してください"
では、
set GOOGLE_APPLICATION_CREDENTIALS=[PATH]
とコマンドプロンプトから入力しないといけないのか?実行してみるが何も起きなかった。
参考URL:https://cloud.google.com/translate/docs/basic/setup-basic
コメント