2023年11月6日、OpenAIは画像の認識や分析が可能なマルチモーダルAI「GPT-4 Vision」のAPIを公開した。
本記事では、Google Apps ScriptとMessaging APIを使って、画像解析LINE Botを作る。
完成イメージ

LINEアカウントに画像を送信すると、その説明を返す。
処理の流れ
全体の流れは以下の通りだ。
- WebhookでLINEアカウントに対して送信されたメッセージを取得
- メッセージタイプを判定し、画像であれば処理続行。そうでなければエラーメッセージを返信
- messageIdから画像を取得
- 画像をbase64エンコードする
- GPT-4 Vision APIにエンコードした画像とプロンプトを投げる
- 応答をLINEに返信する
設定方法など
事前準備や設定方法は以前の記事の内容と全く一緒なので割愛。
コード全文
Google Apps Scriptのエディタに以下のコードを貼り付ける。APIキーやLINEアクセストークンは、取得した文字列に書き換える必要あり。
const OPENAI_APIKEY = "sk-xxxxxxxxxx"; // 自身のAPIキーに書き換える
const LINE_ACCESS_TOKEN = "xxxxxxxxx"; // 自身のアクセストークンに書き換える
const PROMPT = "300文字以内でこの画像を説明してください" // 与えたいプロンプトを入力する
function doPost(e) {
let fromLineData = e.postData.contents; // LINEから受信したデータ
let receiveData = JSON.parse(fromLineData);
let replyToken = receiveData.events[0].replyToken; // replyToken
let messageType = receiveData.events[0].message.type; // messageType
let messageId = receiveData.events[0].message.id; // messageid
let botAnswer; // 返信メッセージ用変数
// メッセージタイプの判定
if (messageType == 'image') {
// 画像が送られた時
let Url = "https://api-data.line.me/v2/bot/message/" + messageId + "/content"; //messageIdから画像取得用URLの作成
// 送信された画像取得
let image = UrlFetchApp.fetch(Url, {
"headers": {
"Content-Type": "application/json; charset=UTF-8",
"Authorization": "Bearer " + LINE_ACCESS_TOKEN,
},
"method": "get"
});
let imageData = image.getContent();
let base64Image = Utilities.base64Encode(imageData); // 取得した画像をBase64エンコード
botAnswer = callOpenAiApi(base64Image); // OpenAI APIを呼ぶ関数(エンコード済み画像を渡す)
} else {
// 画像以外が送られた時
botAnswer = "画像以外には応答できません。";
}
// 返信用関数を呼ぶ
reply(replyToken, botAnswer);
}
// LINEへの返信
function reply(replyToken, replyMessage) {
let replyUrl = "https://api.line.me/v2/bot/message/reply";
let contents = {
replyToken: replyToken,
messages: [{ type: 'text', text: replyMessage }],
};
let options = {
method: 'post',
contentType: 'application/json',
headers: {
Authorization: 'Bearer ' + LINE_ACCESS_TOKEN
},
payload: JSON.stringify(contents)
};
UrlFetchApp.fetch(replyUrl, options);
}
// GPT-4V APIを呼び出す関数
function callOpenAiApi(base64Image) {
let url = 'https://api.openai.com/v1/chat/completions';
let options = {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'Authorization': 'Bearer ' + OPENAI_APIKEY,
},
payload: JSON.stringify({
'model': 'gpt-4-vision-preview',
'messages': [
{
'role': 'user',
'content': [
{
'type': 'text',
'text': PROMPT
},
{
'type': 'image_url',
'image_url': {
'url': "data:image/jpeg;base64," + base64Image
}
}
]
}
],
'max_tokens': 500 // 返信の最大トークン数
})
};
let response = UrlFetchApp.fetch(url, options);
let responseMessage = JSON.parse(response).choices[0].message.content
return responseMessage;
}
PROMPTやmax_tokens(返信の最大トークン数)は適宜変更すると良い。ただし、トークン単位での課金となるため、使い過ぎに要注意だ。
アイデア次第で可能性無限大
使ってみた感想としては、かなり正確に画像を認識してくれるという印象。
アイデア次第で面白いモノがたくさん作れそうだ。
猫語翻訳機できた https://t.co/5HgJSKKYUj pic.twitter.com/TTmgzep0ox
— PC人間 (@pcningen) November 9, 2023
皆様もぜひお試しあれ。
コメント