見出し画像

Pythonで作るGUI付き翻訳支援アプリの作成 Part7:deepl.pyとconfig.pyの作成

config.pyの作成

DeepL API Freeの利用登録が完了しました。API認証キーは、config.iniという設定ファイルに保存するようにしましょう。Pythonで設定ファイルを管理するconfigparserというモジュールを使って、config.iniファイルから必要な設定を読み書きするようにします。また、PySimple GUIで作成したDeepL設定画面からAPI認証キーの登録と変更が出来るようにもしていきます(次回以降となります)。

まずは、main.pyと同じディレクトリにconfig.iniを作成して下さい。ディレクトリ構成は以下の通りです。

DeepLTranslator
├── main.py
├── static
│   ├── font_.py
│   ├── gear.png
│   ├── deepL_logo.png
│   └── deepL_btn.png
├── config.ini
├── deepl.py
└── gui.py

config.iniは以下の通りです。[deepL]セクションを1行目で設定しています。2行目は、API認証キーを設定しますのでauth_key = ご自身のAPI認証キー とします。3行目のtranslate_epは、DeepL API Free翻訳のエンドポイントになります。このままコピーペーストで問題ありません。4行目のusage_epは、DeepL API Free使用量のエンドポイントになります。こちらもコピー&ペーストで問題ありません。config.iniで変更を加える部分は、ご自身のAPI認証キーの部分だけとなります。APIキーは、deepl.comにアクセスしていただき確認をお願いいたします(図.API認証キーを参照)

[deepL]
auth_key = ご自身のAPI認証キー
translate_ep = https://api-free.deepl.com/v2/translate
usage_ep = https://api-free.deepl.com/v2/usage
図1.API認証キー

deepl.pyの作成

deepl.pyでは、DeepL APIを叩いて結果を受け取る処理をコーディングしていきます。翻訳だけではなく、使用量についても取得しますのでそれぞれを関数としてtranslate()関数とchar_count()関数として作成します。それでは、main.pyと同じ階層にdeepl.pyを作成して下さい。また、翻訳元言語と翻訳先言語を返すlang_set()関数と、翻訳元が日本語かどうかを判定するis_japanese()関数を作成します。今回のdeepl.pyでは以上の4つの関数を定義していきます。

最終的なdeep.pyのコードは以下の通りです。まずは全体を示して、次に詳細を説明していきます。

import json
from urllib.parse import urlencode
from urllib.request import Request
from urllib.request import urlopen
from urllib.error import HTTPError
import re


def translate(text, s_lang, t_lang, config):
    headers = {
        'Content-Type': 'application/x-www-form-urlencoded; utf-8'
    }

    params = {
        'auth_key': config['Auth_key'],
        'text': text,
        'souce_lang': s_lang,
        'target_lang': t_lang        
    }

    req = Request(
        config['Translate_EP'],
        method='POST',
        data=urlencode(params).encode('utf-8'),
        headers=headers
    )

    try:
        with urlopen(req) as res:
            trans_result = json.loads(res.read().decode('utf-8'))            
            return trans_result['translations'][0]['text']            
    except HTTPError as e:
        print(e)


def char_cnt(config):
    headers = {
        'Content-Type': 'application/x-www-form-urlencoded; utf-8'
    }

    params = {
        'auth_key': config['Auth_key'],
    }

    req = Request(
        config['Usage_EP'],
        method='POST',
        data=urlencode(params).encode('utf-8'),
        headers=headers
    )
    try:
        with urlopen(req) as res:
            cnt_result = json.loads(res.read().decode('utf-8'))
            return cnt_result

    except HTTPError as e:
        print(e)


def lang_set(text):
    # default setting
    lang = {'target': "EN", 'source': "JA"}
    if is_japanese(text) is not True:
        lang['target'] = "JA"
        lang['source'] = "EN"
    return lang


def is_japanese(text):
    return True if re.search(r'[ぁ-んァ-ン]', text) else False

必要ライブラリのインポート

今回必要となるライブラリをインポートしていきます。1行目では、jsonをインポートしています。これは、deepl APIからはjson形式で値が返ってきますので、そのjson形式ファイルを扱うために必要となります。

2行目〜5行目では、urllibモジュールから必要な4つのパッケージをインポートしています。今回は、WebAPIを使用していますのでURLを扱う必要があります。今回は、3つのモジュールを使用します。以下は、簡単な説明です。

最後のreはPython で正規表現を行うモジュールです。日本語かどうかを判断するためにひらがなもしくはカタカナが文字列に含まれているかで判断します。これは正規表現で簡単に表すことが出来ます。

import json
from urllib.parse import urlencode
from urllib.request import Request
from urllib.request import urlopen
from urllib.error import HTTPError
import re

translate()関数の作成

translate()関数は、4つの仮引数を取ることとします。一つ目は翻訳したい文字列:text、翻訳元の言語コード:s_lang、翻訳先の言語コード:t_lang、DeepLの設定情報:configとします。

def translate(text, s_lang, t_lang, config):

DeepL API を使って翻訳結果を受け取るためのHTTP Requestは公式ページの技術資料に以下のようにサンプルがありました。

図2. HTTP Requestのサンプル

これを参考にコーディングしていきます。最終的なコードは、以下の通りです。

def translate(text, s_lang, t_lang, config):
    headers = {
        'Content-Type': 'application/x-www-form-urlencoded; utf-8'
    }

    params = {
        'auth_key': config['Auth_key'],
        'text': text,
        'souce_lang': s_lang,
        'target_lang': t_lang        
    }

    req = Request(
        config['Translate_EP'],
        method='POST',
        data=urlencode(params).encode('utf-8'),
        headers=headers
    )

    try:
        with urlopen(req) as res:
            trans_result = json.loads(res.read().decode('utf-8'))            
            return trans_result['translations'][0]['text']            
    except HTTPError as e:
        print(e)

まずは、ヘッダーを指定します。ヘッダーには、Content-Tyepを指定します。またエンコードにはutf-8を指定されていましたので、以下の通りとなります。

headers = {
        'Content-Type': 'application/x-www-form-urlencoded; utf-8'
    }

次は、パラメータです。パラメータには、以下の情報が必要でした。

  • auth_key:API認証キー

  • text:翻訳したい文字列

  • target_lang:翻訳先の言語コード

  • source_lang:翻訳元の言語コード

source_languはdeeplが自動的に判定してくれますが、今回はあえて指定するようにします。また、API認証キーのauth_keyは、仮引数config['Auth_key']として渡します。s_langとt_langは仮引数です。

    params = {
        'auth_key': config['Auth_key'],
        'text': text,
        'souce_lang': s_lang,
        'target_lang': t_lang        
    }

Requestは、DeepL翻訳のエンドポイントを仮引数config['Translate_EP']で指定し、ポストメソッドで必要なパラメータをdata、ヘッダーをheadersとします。

    req = Request(
        config['Translate_EP'],
        method='POST',
        data=urlencode(params).encode('utf-8'),
        headers=headers
    )

最後にurlopenでリクエストをしていきます。翻訳された結果をjsonで受け取って変数trans_resultに格納します。そして、そのtrans_result内の翻訳されたテキストのみを戻り値としてreturnで返します。また、HTTPerrorが発生した場合は、ターミナルにエラーメッセージを書き出します。

    try:
        with urlopen(req) as res:
            trans_result = json.loads(res.read().decode('utf-8'))            
            return trans_result['translations'][0]['text']            
    except HTTPError as e:
        print(e)

char_cnt()関数の作成

char_cnt()関数は、DeepLの設定情報:configのみを仮引数と取ります。translate()関数とほとんど共通ですが、仮引数が少ないのでよりシンプルになっています。最終的なコードは以下の通りです。

def char_cnt(config):
    headers = {
        'Content-Type': 'application/x-www-form-urlencoded; utf-8'
    }

    params = {
        'auth_key': config['Auth_key'],
    }

    req = Request(
        config['Usage_EP'],
        method='POST',
        data=urlencode(params).encode('utf-8'),
        headers=headers
    )
    try:
        with urlopen(req) as res:
            cnt_result = json.loads(res.read().decode('utf-8'))
            return cnt_result

    except HTTPError as e:
        print(e)

translate()関数との違いは、パラメータが少ないこと、そしてRequest内のエンドポイントがconfig['Usage_EP']となっていることです。現在の使用量をjsonで受け取って変数cnt_resultに格納します。そして、そのcnt_resultを戻り値としてreturnで返します。

lang_set()関数の作成

lang_text()関数では、仮引数:textを受け取ります。デフォルトでは、辞書型で変数langを{'target': "EN", 'source': "JA"}として設定します。もしも、is_japanese()関数でデフォルトと異なる場合は、デフォルトと逆の言語設定とします。これは、今回逆翻訳機能を追加するために設定しています。もしも逆翻訳機能を設定しなければ、is_japanese()もlang_set()も必要ありません。コードは以下の通りです。

def lang_set(text):
    # default setting
    lang = {'target': "EN", 'source': "JA"}
    if is_japanese(text) is not True:
        lang['target'] = "JA"
        lang['source'] = "EN"
    return lang

is_japanese()関数の作成

is_janpanese()関数では、正規表現を使って翻訳したい文字列にひらがなもしくはカタカタが含まれているかを判断し、日本語であればTrueを返します。コードは以下の通りです。

def is_japanese(text):
    return True if re.search(r'[ぁ-んァ-ン]', text) else False


以上でdeepl.pyとconfig.iniの作成は完了です。

今回は、少し難しい部分もあったかもしれませんがコピー&ペーストでも構いませんので実装してみて下さい。

明日は、main.pyに戻りdeepl.pyで定義した関数とGUIイベントを紐づけていきます。

記事が参考になりましたら、❤️を押していただけると励みになります😊



この記事が気に入ったらサポートをしてみませんか?