0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

simple translation UI using Gradio and deep-translator

Last updated at Posted at 2025-10-25

シンプルなコードでWebUIが作成できるGradioと、Pythonコードから直接操作できるdeep-translatorを組み合わせてローカルで使える翻訳ツールを作ってみました。

必要なライブラリのインストール

Python環境に2つのライブラリが必要
・gradio: UI構築用
・deep-translator: 翻訳処理用

pip install gradio deep-translator

Gradioの特徴

・gr.Interface() や gr.Blocks() を使って、数行のPythonコードでWeb UIを構築可能
・多様なUIコンポーネントが用意されている
・ローカルでもクラウドでも動作する

# example
import gradio as gr

def greet(name):
    return f"こんにちは、{name}さん!"

demo = gr.Interface(fn=greet, inputs="text", outputs="text")

demo.launch()

実行すると http://127.0.0.1:7860 でUIが生成される

この短いコードで Submitボタン・Clearボタン・Textbox・出力欄 が自動生成されるのは、Gradioの Interface クラスが 関数の入出力に応じたUIを自動構築する仕組みを持っているからです。

fn=greet で渡された関数の 引数name と 戻り値str を見て、入力欄Textbox、出力欄Textboxを自動的に作成する

# 実際には Gradio が内部でこういう構造を作っている
gr.Interface(
    fn=greet,
    inputs=gr.Textbox(label="name"),
    outputs=gr.Textbox(label="output"),
    live=False  # submitボタンで関数を呼び出す
)

demo.launch() を呼ぶと、Gradioが FastAPIベースのローカルWebサーバー を立ち上げ、自動生成されたUIをブラウザで表示する
・Submit/Clearボタンは Interface が 標準で提供するUI機能として付属している
・現行バージョンではFlagもデフォルトで表示される
・「Flag」はユーザーがフィードバックを送るための仕組みで、これをクリックすると.gradio/flagged/*.csvとして保存される

deep-translatorの特徴

・シンプルなインターフェースで複数の翻訳エンジンを扱えるPythonライブラリ
 (翻訳エンジンによっては課金が必要)
・Pythonのみで完結するため、Web APIの知識が不要
・MITライセンスで自由に利用可能(商用利用もOK)

Google Translate以外にDeepL、LibreTranslate、Microsoft Translator、MyMemoryなど複数のAPIが使えます。

deep-translator経由でGoogle Translateを使う利点

・シンプルな構文で使いやすい
・Pythonコードから直接操作できる
・APIキー不要で使える(ただし非公式APIを使っているので安定性は少し低い)
・無料で使える(直接Google TranslateをAPIで使うと有料)

# example
from deep_translator import GoogleTranslator
translated = GoogleTranslator(source='en', target='ja').translate("Good morning")
print(translated)

Python code sample for translation UI

import gradio as gr
from deep_translator import GoogleTranslator

# 翻訳処理:選択された方向に応じて翻訳を実行
def run_translation(input_text, selected_direction):
    source_lang, target_lang = ('ja', 'en') if selected_direction == "日本語 → 英語" else ('en', 'ja')
    return GoogleTranslator(source=source_lang, target=target_lang).translate(input_text)

# クリア処理:入力欄、翻訳方向、出力欄を初期状態に戻す
def reset_fields():
    return "", "日本語 → 英語", ""

# UI構築
with gr.Blocks() as translator_ui:
    # タイトルと説明
    gr.Markdown("## 英語↔日本語 翻訳アプリ")
    gr.Markdown("Google翻訳APIを使ったシンプルな翻訳ツール")

    # 入力欄と翻訳方向の選択
    with gr.Row():
        with gr.Column(scale=2):
            input_box = gr.Textbox(
                label="翻訳するテキスト",
                lines=5,
                placeholder="ここに翻訳したい文章を入力してください"
            )
        with gr.Column(scale=1):
            direction_selector = gr.Radio(
                ["日本語 → 英語", "英語 → 日本語"],
                label="翻訳方向",
                value="日本語 → 英語"
            )

    # 翻訳結果の表示欄
    output_box = gr.Textbox(
        label="翻訳結果",
        lines=5,
        interactive=False,
        show_copy_button=True
    )
    output_box.elem_id = "translated_output"  # JSで参照するためのID

    # ボタン群(翻訳・コピー・クリア)
    with gr.Row():
        translate_button = gr.Button("📖 翻訳する")
        copy_button = gr.Button("📋 コピー")
        clear_button = gr.Button("🗑️ クリア")

    # ボタンの動作定義
    translate_button.click(
        fn=run_translation,
        inputs=[input_box, direction_selector],
        outputs=output_box
    )

    # JSで出力欄の内容をクリップボードにコピー
    copy_button.click(
        None,
        js="""
        () => {
            const textarea = document.querySelector('#translated_output textarea');
            if (textarea) {
                navigator.clipboard.writeText(textarea.value);
            }
            return "";
        }
        """,
        outputs=[]
    )

    # 入力・方向・出力をすべて初期化
    clear_button.click(
        fn=reset_fields,
        outputs=[input_box, direction_selector, output_box]
    )

# アプリ起動
translator_ui.launch()

(実行例)

Gradio + deep-translator の翻訳処理フロー

① ユーザー入力(Gradio UI)
ユーザーはGradioのWebインターフェース上で翻訳したいテキストを入力する。
翻訳方向は direction_selector(gr.Radio)で「日本語 → 英語」または「英語 → 日本語」から選択する。
入力と選択が完了したら、translate_button(gr.Button)をクリックして翻訳処理を開始する。

② Python関数 run_translation() の呼び出し
Gradioは、UIイベント(ボタン押下)に応じて run_translation(input_text, selected_direction) を呼び出す。この関数は、入力テキストと翻訳方向(例:英→日)などのパラメータを受け取る。

③ deep-translator ライブラリによる翻訳処理
関数内で GoogleTranslator(source=..., target=...) を使って翻訳を実行する。deep-translator は Google Translate の非公式APIをスクレイピング的に利用している。

④ 外部アクセス:translate.google.com
deep-translator は裏で translate.google.com にアクセスして翻訳結果を取得する。正式なAPIではなく、Web版のGoogle翻訳を模倣しているため、安定性や利用制限(レート制限・仕様変更など)に注意が必要。

⑤ 結果の返却とUIへの表示
翻訳結果が run_translation() 関数から返され、Gradio UIに表示される
output_box(gr.Textbox) に表示される。
この出力欄の value に翻訳結果が自動的に反映され、ユーザーに提示される。 また、show_copy_button=True により、ユーザーは翻訳結果をワンクリックでコピーできる。

GradioはFlaskやReactなどの複雑なWebフレームワークは一切不要で、簡単にWebアプリ化できるのは非常に魅力です。Google Colabでも動作します。また多機能なので、他にも色々な機能連携を使ってカスタマイズすると、面白いものができると思います。

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?