WirelessWire News Technology to implement the future

by Category

Open Interpreterで開かれた未来像 RPAツールをAIで作る

2023.09.12

Updated by Ryo Shimizu on September 12, 2023, 11:25 am JST

OpenInterpreter(オープンインタープリター)が話題だ。
これはChatGPTの「Code Interpreter」をローカルで動かすというもの。
しかも、GPT-3/GPT-4のAPI以外にも、Llama2やFalconなどのローカル動作のLLMのエンジンにも容易に切り替えることができる。

筆者も早速試してみたが、これが非常に面白い。ChatGPT出現時くらいのインパクトがある。

筆者は最近、平日はほぼ毎日「教養としてのAI講座 / デイリーAIニュース」という有料番組を配信している。

この中で先週とりあげたのがOpen Interpreterだったのだが、この反響がすごい。
あくまでもクラウドの向こう側にある「ChatGPT+Code Interpreter」と、曲がりなりにも手元のコンピュータで動作する「Open Interpreter」には大きな隔たりがある。

たとえば、Macで使う場合、「毎日のニュース」を紹介するなかで「あ、この部分だれか読み上げてくれないかな」と思うことがよくある。
目で追うのは億劫だし、言葉に出すのはもっと億劫、というときがよくあるのだ。

ところが旧Twitter(現X)などはスクレイピングに厳しく、なかなか簡単にツイートの内容を読むことができない。
しかしローカル動作のコンピュータなら、できることはいろいろある。

そこで筆者は、OpenInterpreterとこのようなやりとりをしてRPAツールをAIによって開発することにした。
太字が筆者の指示、それ以外がOpenInterpreterの回答だ。エンジンはGPT-4を使用している

safariの画面をキャプチャし、日本語でOCRして読み上げろ

了解しました。以下の手順で進めていきます。

1 Safariの画面をキャプチャします。
2 キャプチャした画像をOCRでテキストに変換します。
3 変換したテキストを読み上げます。

まず、Safariの画面をキャプチャするために、AppleScriptを使用します。

tell application "Safari"
activate
end tell
delay 1
do shell script "screencapture -x ~/Desktop/screenshot.png"

Safariの画面のキャプチャが完了しました。次に、この画像をOCRでテキストに変換します。

OCRの処理にはPythonのライブラリであるpytesseractを使用します。まず、このライブラリ
がインストールされているか確認し、なければインストールします。また、pytesseractはTesse
tというOCRエンジンを使用しますので、これも必要です。Homebrewを使用してTesseract
をインストールします。

brew install tesseract && pip install pytesseract

するとまずAppleScriptという、macOSでしか動作しない言語でスクリーンキャプチャをとるまでを作ってくれた。
筆者はAppleScriptはほとんど使ったことがないため、そこを書いてくれるだけでも強力な援軍を得たようなものだ。

しかし画面全体のキャプチャをとっているので欲しいものはこれじゃない。

safariのウィンドウだけをキャプチャしろ

まず、Safariのウィンドウが開いているかどうかを確認し、そのウィンドウIDを取得する必要が
ます。これはAppleScriptを使用して行います。

Plan:

1 AppleScriptを使用して、開いているSafariのウィンドウのリストを取得します。
2 ウィンドウIDを取得します。
3 そのウィンドウIDを使用して、Safariのウィンドウをキャプチャします。

まず、開いているSafariのウィンドウのリストを取得しましょう。

tell application "Safari"
set windowList to every window
return windowList
end tell

window id 50944

SafariのウィンドウIDは50944です。

次に、このウィンドウIDを使用してSafariのウィンドウをキャプチャします。この操作はscreen
aptureコマンドを使用して行います。このコマンドはMac
OSに組み込まれているので、追加のインストールは必要ありません。

Plan:

1 screencaptureコマンドを使用して、ウィンドウID50944のスクリーンショットを取ります。
2 スクリーンショットが正常に保存されたことを確認します。

まず、screencaptureコマンドを使用してスクリーンショットを取ります。このコ
マンドはシェルスクリプトで実行します。

screencapture -l50944 safari_screenshot.png

screencaptureコマンドが正常に実行され、スクリーンショットが"safari_screenshot
.png"という名前のファイルに保存されました。

次に、ファイルが正常に保存されたことを確認します。これはlsコマンドを使用して行います。

Plan:

1 lsコマンドを使用して、"safari_screenshot.png"という名前のファイルが存在することを
確認します。

それでは、lsコマンドを実行してみましょう。

ls safari_screenshot.png

safari_screenshot.png

"safari_screenshot.png"という名前のファイルが正常に作成されました。こ
れはSafariのウィンドウのスクリーンショットです。

以上で、Safariのウィンドウのキャプチャが完了しました。他に何かお手伝いできること
がありましたらお知らせください。

これでSafariのウィンドウだけ拾わせることができた。
そして、文字認識(OCR)ライブラリを自動的にインストールしようと試みる。

  Tesseractとpytesseractのインストールが完了しました。次に、キャプチャした画像をO
CRでテキストに変換します。このとき、日本語のテキストを認識できるように、Tessera
ctの言語オプションを日本語('jpn')に設定します。

import pytesseract
from PIL import Image

# Load the image from file
image = Image.open('/Users/shi3z/Desktop/screenshot.png')

# Perform OCR on the image
text = pytesseract.image_to_string(image, lang='jpn')

# Save the OCR result to a text file
with open('/Users/shi3z/Desktop/ocr_result.txt', 'w', encoding='utf-8') as f:
f.write(text)

environment variable is set to your "tessdata" directory. Failed loading language
\'jpn\' Tesseract couldn\'t load any languages! Could not initialize tesseract.')

エラーメッセージから、Tesseractが日本語のデータファイルを開けないことがわかり
ます。これは、日本語の言語データがインストールされていない可能性があります。

Tesseractに日本語の言語データをインストールします。

ここでうまくいかなくて無限ループに入ってしまった。無限ループに入った場合、Ctrl+cで止めることができる。
brewコマンドなどで一発で入るものは簡単だが、ちょっと手間がかかるものはしくじる。
ここは人間の筆者が手助けをしてあげて、tesseractの日本語モジュールを別窓でインストールする。

申し訳ありませんが、OCRによるテキストの抽出がうまくいかなかったようです。画像の品質や
レイアウト、またはOCRエンジンの設定により、結果が得られないことがあります。

他に何かお手伝いできることがありましたらお知らせください。

もう俺が日本語対応させたからもう一度実行しろ

import pytesseract
from PIL import Image

# Open image file
img = Image.open('safari_screenshot.png')

# Use pytesseract to do OCR on the image
text = pytesseract.image_to_string(img, lang='jpn')

# Print the text
print(text)█

0Q の わ の は
ホー ム
話題 を 検索
通知
メッ セー ジ
リス ト
shi3z め
@shi3z
twittercom/home
フォ ロー 中 サブ スク ライ ブ 済 み
較 回 に ⑨ 6 B
Alvaro Cintas 仏 dr_cintas ・ 5 時 間
Open Interpreteris going viral。
Imagine running in your computer a free open-source implementation of
Code Interpreter
It's like having a conversation with your machine, understanding you
perfectly.
it's a genius idea if well implemented, and it has been DONE!
You can tell…. さら に 表示
Open Interpreter.
Talk to your computer
like ChatGPT
〇 12 了 人 26 〇 84 則 18 万 Ru
テッ ク 系 ベン チャ ー キ ャ ピタ リス ト ⑧maru56.56 分
RT _ ホント そう 思う 。 某 アイ ドル 事務 所 の 問題 と 似 て いる 。
〇 包 〇 ウィ 1
の Google Cloud Japan 多 googlecloud_jp
倍 2023 年 9 月 21 日 ( 木 ) 16 時 か ら
「DevOps ステ ー タ ス を 確認 し て みよ う !」
DevOps の 進捗 確認 に 用 いら れる 「DORA」 と は 何 か 、 そ の 必要 性 に つい て
ご 説
明 し ます 。 実際 に Quick Check の デモ ンス トレ ーション も ご 覧 いた だ け ま す
ぜひ この 機会 に ご 参加 くだ さい
#GoogleCloudinnovators
< ぐ ペ
き プ
GoogleCloud
1 弄 1
DevOps の ステ ー タ ス を

ちゃんとtwitterのウィンドウを認識しているようだ。
読み上げさせてみる。

読み上げろ

抽出したテキストを読み上げるためには、Mac OSの組み込みのsayコマンドを使用します。

Plan:

1 sayコマンドを使用して、抽出したテキストを読み上げます。

それでは、sayコマンドを使用してテキストを読み上げてみましょう。

say '0Q の わ の は ホー ム 話題 を 検索 通知 メッ セー ジ リス ト shi3z め @shi3z
twittercom/home フォ ロー 中 サブ スク ライ ブ 済 み 較 回 に ⑨ 6 B Alvaro Cintas 仏
dr_cintas ・ 5 時 間 Open Interpreteris going viral。 Imagine running in your compute…
a free open-source implementation of Code Interpreter Its like having a conversation
with your machine, understanding you perfectly. its a genius idea if well implemented,
and it has been DONE! You can tell…. さら に 表示 Open Interpreter. Talk to your
computer like ChatGPT 〇 12 了 人 26 〇 84 則 18 万 Ru テッ ク 系 ベン チャ ー キ ャ
ピタ リス ト ⑧maru56.56 分 RT _ ホント そう 思う 。 某 アイ ドル 事務 所 の 問題 と …
て いる 。 〇 包 〇 ウィ 1 の Google Cloud Japan 多 googlecloud_jp 倍 2023 年 9 月 21
日 ( 木 ) 16 時 か ら DevOps ステ ー タ ス を 確認 し て みよ う ! DevOps の 進捗 確 …
に 用 いら れる DORA と は 何 か 、 そ の 必要 性 に つい て ご 説 明 し ます 。 実際
に Quick Check の デモ ンス トレ ーショ ン も ご 覧 いた だ け ま す ぜひ この 機会 …
ご 参加 くだ さい #GoogleCloudinnovators < ぐ ペ き プ GoogleCloud 1 弄 1 DevOps の
ステ ー タ ス を DORA で 見 える 化す る 市 825 ud Q 検索 いま どう し て る ? Event
・ ラ イブ New York Fashion Week 2023 # ド ラク ェ ウ ォ ー ク 4 周年 あ DQIX イ ベン
ト 開 催 ! 4 周年 を 記念 し て RT キャ ン ペ ー ン 実施 中 ! ドラ ゴン クエ スト ウ …
ー ク 公式 / ド ラク ェ ウ ォ ー ク に 名 ょ る フロ モー ショ ン 日 レン ド 年 内
活動 休止 トレ ンド トピ ビック: 大野 引 退 、 中 居 く ん 千代 田 区 の トレ ンド
東京 最低 最悪 最高 9694 posts 科学 ・ ト レン ド 物理 専攻 さら に 表示'

よしよし。
ここから一連の手順をコードにしてもらう。

以上の手順を一つのpythonコードにしろ

以下に、画像からテキストを抽出し、そのテキストを読み上げる一つのPythonコードを示します

import pytesseract
from PIL import Image
import os

# Open image file
img = Image.open('safari_screenshot.png')

# Use pytesseract to do OCR on the image
text = pytesseract.image_to_string(img, lang='jpn')

# Use os.system to run the 'say' command to read the text
os.system(f"say {text}")

このコードは、画像からテキストを抽出し、そのテキストを読み上げます。ただし、このコード
ac OS上でのみ動作します。また、このコードを実行するには、pytesseractとPIL(Python
Imaging
Library)が必要です。これらのライブラリがインストールされていない場合は、pipを
使用してインストールすることができます。

applescriptの部分もpythonから呼び出せ

PythonからAppleScriptを呼び出すには、os.systemまたはsubprocessモジュール
を使用します。以下に、PythonからAppleScriptを呼び出す一つのPythonコードを示します。

import pytesseract
from PIL import Image
import subprocess

# Open image file
img = Image.open('safari_screenshot.png')

# Use pytesseract to do OCR on the image
text = pytesseract.image_to_string(img, lang='jpn')

# Use subprocess to run the 'say' command to read the text
subprocess.call(["osascript", "-e", f'say "{text}"'])

このコードは、画像からテキストを抽出し、そのテキストを読み上げます。ただし、このコード
ac OS上でのみ動作します。また、このコードを実行するには、pytesseractとPIL(Python
Imaging
Library)が必要です。これらのライブラリがインストールされていない場合は、pipを
使用してインストールすることができます。

applescriptでsafariのスクリーンショットを撮る処理も追加しろ

PythonからAppleScriptを呼び出してSafariのスクリーンショットを撮り、
その後でOCRと読み上げを行うコードは以下のようになります。

import pytesseract
from PIL import Image
import subprocess
import time

# Use subprocess to run AppleScript that takes a screenshot of Safari
subprocess.call(["osascript", "-e",
'''
tell application "Safari"
activate
end tell
delay 2
do shell script "screencapture -l$(osascript -e 'tell app \\"Safari\\" to id of
window 1') screenshot.png"
'''
])

# Wait for the screenshot to be saved
time.sleep(2)

# Open image file
img = Image.open('screenshot.png')

# Use pytesseract to do OCR on the image
text = pytesseract.image_to_string(img, lang='jpn')

# Use subprocess to run the 'say' command to read the text
subprocess.call(["osascript", "-e", f'say "{text}"'])

このコードは、Safariのスクリーンショットを撮り、その画像からテキストを抽出し、そのテ
キストを読み上げます。ただし、このコードはMac
OS上でのみ動作します。また、このコードを実行するには、pytesseractとPIL(Python Imaging
Library)が必要です。これらのライブラリがインストールされていない場合は、pipを
使用してインストールすることができます。

これで無事、safariのスクショを撮ってOCRして読み上げさせるPythonコードができた。
しかしニュースに使うにはこれだけではだめだ。

そこでGPT-4に要約させる処理や、システム的なゴミを読み取らないようにcropするなどの調整を行なったコードは最終的にこうなった。


import pytesseract
from PIL import Image
import subprocess
import time

import openai
openai.api_key = "***************" #自分のAPIキーを入れる
import os
os.environ["OPENAI_API_KEY"] = openai.api_key

def gpt(prompt):
response = openai.ChatCompletion.create(
model="gpt-4",
messages=[
{"role": "system", "content": "あなたは役に立つマーケティングアシスタントです。"},
{"role": "user", "content": prompt},
]
)
return response["choices"][0]["message"]["content"]

# Use subprocess to run AppleScript that takes a screenshot of Safari
subprocess.call(["osascript", "-e", '''
tell application "Safari"
activate
end tell
delay 2
do shell script "screencapture -l$(osascript -e 'tell app \\"Safari\\" to id of window 1') screenshot.png"
'''
])

# Wait for the screenshot to be saved
time.sleep(2)

# Open image file
img = Image.open('screenshot.png')
img = img.crop((400,350,img.width-400,img.height-350))
img.show()

# Use pytesseract to do OCR on the image
text = pytesseract.image_to_string(img, lang='jpn')
text = gpt("以下のテキストを日本語で30字程度で要約しなさい\n%s"%text)

# Use subprocess to run the 'say' command to read the text
subprocess.call(["osascript", "-e", f'say "{text}"'])

一昔前なら面倒すぎて業者に頼むか、少なくとも一級の学生インターンに半日仕事で頼んでいたようなことがものの30分くらいで解決してしまった。
この素早さは、たとえばインターン(または人間)の場合、「Safariのスクショをとるにはどうすればいいのかな」と調べるのに30分から1時間、実際にそれを試すのにやはり10分から30分、
次にOCRする方法を調べるのに同様の時間、読み上げに同様の時間、となって積み上がっていくが、LLMはほとんどのプログラミングの知識をあらかじめ「知っている」ため、その迷いがないので早い。
具体的な手順ではコケることがあるが、本質的な問題にはならないので平気、ということらしい。

この手のツールを作ると生産性爆上がりするのでこういう使い方はもっと増えそうだ。

WirelessWire Weekly

おすすめ記事と編集部のお知らせをお送りします。(毎週月曜日配信)

登録はこちら

清水 亮(しみず・りょう)

新潟県長岡市生まれ。1990年代よりプログラマーとしてゲーム業界、モバイル業界などで数社の立ち上げに関わる。現在も現役のプログラマーとして日夜AI開発に情熱を捧げている。

RELATED TAG