LoginSignup
3
3

DiscordでDeepL-APIを使用した翻訳Botを作る

Posted at

作成のきっかけ

研究室の兼ね合いで英語を使う機会が増えそうなので気軽に使える翻訳アプリが欲しかった。
仕事柄Discordは常に開いているので、DiscordBotならいつでも使いやすいと思い作成しました。

環境

Windows11
Python 3.11.4
VisualStudioCode

使用ライブラリ
Discord.py
requests
langdetect

基本仕様

日本語は英語に、英語(や他外国語)は日本語に 自動で翻訳できる。
コマンド入力は不要で、チャンネルに送信されたメッセージはすべて翻訳してくれる。
「おやすみ」と打つことでシャットダウンできる。
image.png
(きちんと相互翻訳ができているようだ)

コードについて

Discord,DeepLAPIの有効化方法は探せば分かりやすい記事がたくさん出てくる。(参考に貼っておきます)
ただ、Discord.pyに関しては2.0のアップデートで大幅に書き方が変わったようです。

Intentsを定義した後に、下記のコードで引数をチャットメッセージとした関数ができる。
(参考:猿でもわかる!discord.pyのIntentsについて! )

@client.event
async def on_message(message)

DeeplAPIは無料版だと 50万字/月 まで利用可能。

補足 特定チャンネルでのみ動作させる場合

#関数の外
Discord_channnel_ID = チャンネルID

@client.event
async def on_message(message)
    if message.channel.id != Discord_channel_ID:
        return

上記のようにDiscordのチャンネルIDを指定することで特定のチャンネル以外のメッセージは反応しなくなる。
Bot用チャンネルを作っておくと、無駄にメッセージに反応しないので便利。

躓いたポイント

日<->英の双方向翻訳ができることを目的にした。
そのため
日→英
英→日
のフローを切り替えるために 入力された言語を認識するという過程が必要になる。
もちろん手動で指定すれば可能だが、いちいちコマンドを打つのは面倒くさいので避けたい。
こちらの記事(参考:Discord.pyで翻訳Botを作る)のようにGoogleTranslateを使用した場合、翻訳アプリ側が認識した言語を受け取って処理することが非常に簡単である。

しかし、DeepLを使用した場合に一発で受け取る方法が見つからなかったので、Pythonライブラリのlangdetectを使用した。
langdetect公式ドキュメント
今回はlangdetectで判定→条件分岐という方法を取った。

この方法では条件分岐によってDeepLに渡すparamsの値を変えている。

#言語判別関数を定義
def language(text):
    lang = detect(text)
    return lang

@client.event
async def on_message(message):
    #言語を自動判定する
    source_lang = language(message.content)

    if source_lang == "ja":
        target_lang = "EN"
    else:
        target_lang = "JA"

    params = {
        "auth_key" : DeepL_Token,
        "text" : message.content,
        "source_lang": source_lang,
        "target_lang": target_lang
    }

    response = requests.post(DeepL_API_URL, data=params)

    #HTTPリクエストが成功した場合
    if response.status_code == 200:
        response_json = response.json()
        #翻訳
        translated_text = response_json["translations"][0]["text"]
        await message.channel.send(translated_text)

    #エラーメッセージ
    else:
        await message.channel.send(response.status_code)
        await message.channel.send(response.text)

日本語なら英語に、それ以外なら日本語に変換することで英語以外の翻訳も理論上は可能になった。

コード全体はGitHubにあります。

DeepLのリクエスト用URL(コード内'DeepL_API_URL')は有料版と無料版で違うようです。
筆者は無料版を使っています。

参考にさせていただいた記事/動画

DeepL公式ドキュメント
Discord 公式ドキュメント:[日本語] [English]

Bot初回起動時に引っかかったエラーに関して:猿でもわかる!discord.pyのIntentsについて!

DeepL側のAPIセットアップ等:【Discord.py入門】翻訳機能の作り方を解説!(Deepl API)【Part6】【Python】

Botを停止させる方法:Discord.pyの備忘録その2(1.3.2対応版)

3
3
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
3
3