Ctrl+Cを押したときにクリップボードの内容を翻訳し、表示するシンプルなツールを作成しました。Local LLMを用いて翻訳することで、機密文書などをネットワークを介してやり取りするのは「ちょっと」という方にとって、このツールは非常に有用です。
背景
最近、Ollamaさんのおかげで Local LLM がとても使いやすくなり、レスポンスも許容範囲内に収まってきました。そこで、この能力を無駄に翻訳に活用したいと思いました。
コンセプト
- Ctrl+Cを押した時にクリップボードの内容を翻訳し表示させること
- ローカルで完結させること
使用技術
- Python
-
pyperclip
:クリップボードの操作 -
pynput
:Ctrl+C の検出 -
ollama
:ollamaの操作 -
tkinter
:UIの表示
ツールの概要
このツールは、以下の手順で動作します。
- Ctrl+Cが押されたときにクリップボードの内容を取得
- 取得した内容を翻訳
- 翻訳結果をウィンドウで表示
コードの実装
詳細なコードは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や他のアプリケーションでの翻訳には依然としてツールにコピペしてるため、このツールを使うことで翻訳作業が楽になります。また、選択した文章と併記して見ることが出来れば、英語の勉強にも役立つかと思います。
今後も使いやすさを追求して改良を続けていきます。皆さんもぜひ試してみてください!