1
1

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

Ctrl+Cを押したときにクリップボードの内容を翻訳し、表示するシンプルなツールを作成しました。Local LLMを用いて翻訳することで、機密文書などをネットワークを介してやり取りするのは「ちょっと」という方にとって、このツールは非常に有用です。

背景

最近、Ollamaさんのおかげで Local LLM がとても使いやすくなり、レスポンスも許容範囲内に収まってきました。そこで、この能力を無駄に翻訳に活用したいと思いました。

コンセプト

  • Ctrl+Cを押した時にクリップボードの内容を翻訳し表示させること
  • ローカルで完結させること

使用技術

  • Python
  • pyperclip:クリップボードの操作
  • pynput:Ctrl+C の検出
  • ollama:ollamaの操作
  • tkinter:UIの表示

ツールの概要

このツールは、以下の手順で動作します。

  1. Ctrl+Cが押されたときにクリップボードの内容を取得
  2. 取得した内容を翻訳
  3. 翻訳結果をウィンドウで表示

コードの実装

詳細なコードはGitHubに公開しています。ぜひご覧ください。

以下に主要な部分のコードを示します。

1. Ctrl+Cの検出とクリップボードの操作

キーボードで押されたキーを監視し、Ctrl+Cが押されるのを待つ。

from pynput import keyboard, mouse
import pyperclip

def ctrl(letter):
    return chr(ord(letter.upper())-64)

def on_release(key):
    try:
        if key.char == ctrl("c"):
            clipboard_text = pyperclip.paste()
            ## ここに、翻訳と表示のアクションを記述 ##
    except AttributeError:
        pass
        
def start_keyboard_listener():
    with keyboard.Listener(on_release=on_release) as listener:
        listener.join()

# キーボードリスナーを別のスレッドで実行
listener_thread = threading.Thread(target=start_keyboard_listener)
listener_thread.daemon = True
listener_thread.start()

2. ollamaを使用して翻訳

ollamaライブラリを使用して、クリップボードの内容を翻訳します。
日本語と英語の両方が使えるため、翻訳もできるだろうという思い込みで、モデルは「gemma2」を使いました。

response = ollama.generate(
    model="gemma2",
    prompt=f"Please translate '{clipboard_text}' into Japanese. Output only the translated Japanese text."
)
label.config(text=response['response'])

3. tkinterを使用して翻訳結果を表示

tkinterライブラリを使用して、翻訳結果をポップアップウィンドウで表示します。これにより、ユーザーはすぐに翻訳結果を確認できます。
今回は、マウスの位置に表示しましたが、本当は選択した文章と併記したいと思っています。
事前にウィンドウを作成しておき、root.withdraw()で隠しておく。

import tkinter

root = tkinter.Tk()
root.overrideredirect(True)
root.configure(bg="lightblue")

# ウィンドウを最前面に設定
root.attributes("-topmost", True)

root.withdraw()

label = tkinter.Label(root, text="Hello, tkinter!")
label.pack()

ウィンドウの表示位置を決め、root.deiconify()で再表示させる。

root.geometry(f"+{x}+{y}")
root.deiconify()

まとめ

このツールは、簡単にクリップボードの内容を翻訳し表示することができます。ブラウザでの翻訳は一般的になっていますが、PDFや他のアプリケーションでの翻訳には依然としてツールにコピペしてるため、このツールを使うことで翻訳作業が楽になります。また、選択した文章と併記して見ることが出来れば、英語の勉強にも役立つかと思います。

今後も使いやすさを追求して改良を続けていきます。皆さんもぜひ試してみてください!

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

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?