【コピペOK】AI画像生成LineBotの作り方!【ChatGPT】

ChatGPT

今回は、LINEからAI画像生成を手軽にできるツールを作成する方法を紹介します。コピペ用のソースコードを公開していますので、ぜひ試してみてください♪

AI画像生成LINE Botの全体像

LINE Botの全体像は以下のようになります。LINEから送られたメッセージをGASで受け取り、それをAPIリクエスト時にプロンプトとして投げます。DALL-Eから画像URLが返却されるので、それをLINEに返します。GASはLINEと画像生成AIの橋渡し的役割を果たします。

OpenAIでAPIキーを取得する

画像生成には、ChatGPTで有名なOpenAIの画像生成AIDALL-Eを使います。使用するにはAPIキーが必要ですので、OpenAIのマイページから取得してください。

詳しい手順は以下記事の「ChatGPT APIの使い方」にて解説しています。

APIの利用料金について

こちらの記事でも解説している通り、OpenAIのAPIは無料クレジット分が付与されており、よほどヘビーに使わない限り無料で使えます。

料金は、画像1枚あたり以下になります。参考までに、GPT-3.5は0.002/1トークンです。

画像サイズ料金
1024×1024$0.020
512×512$0.018
256×256$0.016

LINE Developersの設定

LINE上で画像生成AIを使うには、開発用のツール「LINE Developers」を使います。登録方法は以下記事にて解説しています。

Google Apps Scriptの設定

Google Apps Script(GAS)にソースコードを書いていきます。Google Apps Scriptを開いて、スクリプトエディタに以下コードを貼り付けてください。

サンプルコード

スクリプトエディタに以下ソースを貼り付けて、デプロイします。発行されたURLをLINE Developersの「Webhook URL」に貼り付けて、LINEから生成してほしい画像を文章で送信します。

詳しい手順は、こちらをご参照ください。

const GPT_TOKEN = 'OpenAIのAPIキーを貼り付けてください';
const GPT_ENDPOINT = 'https://api.openai.com/v1/images/generations';
const LINE_TOKEN = 'LINEのチャネルアクセストークンを貼り付けてください';
const LINE_ENDPOINT = 'https://api.line.me/v2/bot/message/reply';

// LINEからPOSTリクエストが渡されてきたときに実行される処理
function doPost(e) {

  // LINEからPOSTされるJSON形式のデータをGASで扱える形式(JSオブジェクト)に変換
  const json = JSON.parse(e.postData.contents);
  // LINEから送られてきたメッセージを取得
  const user_message = json.events[0].message.text;

  const headers = {
    'Authorization': 'Bearer ' + GPT_TOKEN,
    'Content-type': 'application/json',
  };
  // リクエストオプション
  const options = {
    'method': 'POST',
    'headers': headers,
    'payload': JSON.stringify({
      'prompt': user_message,
      'n': 1,
      'size': '1024x1024'
    })
  };
  // HTTPリクエストでChatGPTのAPIを呼び出す
  const res = JSON.parse(UrlFetchApp.fetch(GPT_ENDPOINT, options).getContentText());
  let image_url = res['data'][0]['url'];

  lineReply(json, image_url);
}

// LINEへの応答
function lineReply(json, image_url) {

  // 応答用のメッセージを作成
  const message = {
    'replyToken': json.events[0].replyToken,
    'messages': [{
      'type': 'image',
      'originalContentUrl' : image_url,
      'previewImageUrl' : image_url
    }] 
  };
  // LINE側へデータを返す際に必要となる情報
  options = {
    'method': 'post',
    'headers': {
      'Content-Type': 'application/json; charset=UTF-8',
      'Authorization': 'Bearer ' + LINE_TOKEN
    },
    'payload': JSON.stringify(message)
  };
  // LINEへ応答メッセージを返す
  UrlFetchApp.fetch(LINE_ENDPOINT, options);
}

ソースコードのうち、以下をご自身の環境に合わせて変更してください。

項目設定内容
GPT_TOKEN OpenAIのAPIキー
LINE_TOKEN Line Developers>Messaging API設定
チャネルアクセストークン(長期)
※画面一番下にあります

ソースコード説明

リクエストオプション(options)内で、画像生成AI「DALL-E」へのプロンプトを作成しています。

  const message = {
    'replyToken': json.events[0].replyToken,
    'messages': [{
      'type': 'image',
      'originalContentUrl' : image_url,
      'previewImageUrl' : image_url
    }] 
  };

参考:OpenAIのドキュメント

画像生成AIでは、一度に10個まで画像を生成することができますが、LINEでは1メッセージにつき1枚しか画像を返すことができません。そのため、nは固定で1を設定しています。

応答用のメッセージを作成(message)内で、LINEに返すデータを生成しています。

  const message = {
    'replyToken': json.events[0].replyToken,
    'messages': [{
      'type': 'image',
      'originalContentUrl' : image_url,
      'previewImageUrl' : image_url
    }] 
  };

参考:Line Developers>ドキュメント

LINEに画像を投稿する際は、画像URLを指定します。そのため、画像生成AIから返却されたURLをoriginalContentUrl、previewImageUrlにセットします。

一度に複数の画像を生成したい場合(Google Drive利用)

LINEでは、仕様上、画像を複数生成しても1件しか返すことができません。そこで、LINEを介さずに画像を複数作成するソースコードを以下に記載します。

const GPT_TOKEN = 'OpenAIのAPIキーを貼り付けてください';
const GPT_ENDPOINT = 'https://api.openai.com/v1/images/generations';
const FOLDER_ID = 'Google DriveのフォルダIDを貼り付けてください';

function myFunction() {
  createImage('かわいい犬');
}

function createImage(prompt) {
  const headers = {
    'Authorization': 'Bearer ' + GPT_TOKEN,
    'Content-type': 'application/json',
  };
  // リクエストオプション
  const options = {
    'method': 'POST',
    'headers': headers,
    'payload': JSON.stringify({
      "prompt": prompt,
      "n": 4, // 画像を生成する枚数を設定(1~10)
      "size": "1024x1024"
    })
  };
  // HTTPリクエストでChatGPTのAPIを呼び出す
  const res = JSON.parse(UrlFetchApp.fetch(GPT_ENDPOINT, options).getContentText());
  let image_url = '';

  for (i = 0; i < res['data'].length; i++) {

    image_url = res['data'][i]['url'];

    let blob = UrlFetchApp.fetch(image_url).getBlob();
    let fileBlob = blob.setName(prompt + '_' + i);

    let folder = DriveApp.getFolderById(FOLDER_ID)
    folder.createFile(fileBlob)
  }
}

上記ソースコードのうち、以下を変更してください。

項目設定内容
GPT_TOKEN OpenAIのAPIキー
FOLDER_ID Google Driveの任意のフォルダのID

Google DriveのフォルダID取得方法は、こちらの記事にて紹介しています。

Drive APIの有効化を忘れずに!

上記ソースコードは、画像生成AIが作成した画像を、Google Driveに保存します。GASでGoogle Driveに関する操作を行うには、サービスの追加が必要です。

GASのエディタの左側メニューから「サービス」を押し、

「Drive APIドキュメント」を追加します。

GASのエディタから「実行」を押すと、Google Driveに画像生成AIが作成した画像が保存されます。サンプルコードでは生成数を4枚に設定したので、フォルダに4枚「かわいい犬」の画像が保存されました。かわいい!

もし、LINE上で複数画像を生成したいという場合は、いったんGoogle Driveに保存し、LINEに画像メッセージを送るようにすると実現可能です。GASからLINEにプッシュメッセージを送る方法は、こちらの記事にて紹介しています。

画像生成AIに質問するときのコツ

画像生成AI「DALL-E」に画像を生成させる際のコツは以下になります。

日本語より英語で質問したほうが精度が高い

DALL-Eは、日本語でも画像を生成することができますが、ものによっては日本語だと正しく画像を生成してくれないことがあります。

以下は、「カラフルで美味しそうなケーキの絵」と質問したものです。同じ質問文を投げたのにもかかわらず、日本語での質問では質問文にそぐわない画像が生成されました。

画像生成AIは「Bing Image Creator」もおすすめ

DALL-Eが生成した画像がイマイチというときには、別の画像生成AIを試してみても良いかと思います。個人的には「Bing Image Creator」もおすすめです。APIではないのでLINE上で動かすなどはできませんが、一度に4枚画像を生成でき、クオリティもけっこう良い感じです。

注意点

画像生成AI「DALL-E」を使用する上での注意点を以下に記載します。

1分あたりに生成できる画像は50枚まで

DALL-EのAPIは、1分あたり50枚まで生成することができます。回数を超えるとエラーとなります。

画像生成には少し時間がかかる

画像の生成には、数秒~十数秒程度時間がかかります。

URLは1時間後に期限切れとなる

画像生成AIが生成した画像は、URLとして返却されます。このURLは1時間後に期限切れとなるので、URLを返す設計にしていると画像が期限切れで取得できなくなる恐れがあります。APIリクエスト後すぐに画像を取得・保存するようなコードにすると良いでしょう。

まとめ

今回は、画像生成AI「DALL-E」のAPIを利用して、画像生成LINE Botを作成する方法を紹介しました。画像生成をスマホでしようとすると、ブラウザから検索するか、アプリを落とす必要がありますが、LINEだけで使えるのは手軽で良いなと思いました。

ChatGPTのAPIと併用して、通常のプロンプトは文章で返し、画像生成のプロンプトが飛んで来たら画像を返すツールなどを作っても便利かと思います。スプレッドシートに生成した画像の内容を表形式で記載して読み取るようにするなど、活用の幅は色々とありそうです。

また何か試して良さそうなものがあったら、ブログにて共有します!

コメント

タイトルとURLをコピーしました