chatGPTでコマンドラインから画像を作成（いまさら）

# chatGPT 有料会員のメリットを探す

chatGPT で有料会員になって久しいものの
ブラウザで画面操作するより command prompt から問合せする機会が多く
まだwish list に登録されていないため、GPT-4 が使えない点が悲しみ。

そうだ。openAIの他機能も利用してみよう。今はやりのAIの自動画像ｗ

## python 環境を準備すること

流行最先端といえば Stable Diffusion？みたいな感じではありますが
なにせ私は端末が非力なのでインストールなどできません。

そうすると選択肢はpythonでコマンドラインのみですw

必要なライブラリをインポート。

```python
pip install requests
```

OPENAI_API_KEY はセキュリティの観点から環境変数に設定してください。
ソースはこちら（いきなり全量ｗ

```python
# Import necessary packages/libraries.
import datetime
import json
import os
import requests
import sys
import time
import urllib.parse


def create_image(prompt, model, api_key, save_dir):
    """
    Function that generates images using OpenAI API and saves them in the specified directory.
    """

    # The endpoint to which the request will be made.
    url = 'https://api.openai.com/v1/images/generations'

    # Request headers.
    headers = {
        'Content-Type': 'application/json',
        'Authorization': f'Bearer {api_key}'
    }

    # The data to be sent in the request.
    data = {
        'model': model,
        'prompt': urllib.parse.quote(prompt),
        'num_images': 1,
        'size': '512x512',
        'response_format': 'url'
    }

    # Send the request.
    response = requests.post(url, headers=headers, data=json.dumps(data))
    response.raise_for_status()

    # Get the URL of the generated image.
    image_url = response.json()['data'][0]['url']

    # Set the name and path for saving the image.
    image_name = f"{datetime.datetime.now():%Y%m%d%H%M%S}.png"
    save_path = os.path.join(save_dir, image_name)

    # Download the image and save it in the specified directory.
    response = requests.get(image_url)
    response.raise_for_status()

    with open(save_path, "wb") as f:
        f.write(response.content)

    with open('imageprompt.log', 'a') as log:
        log.write(f"prompt: {prompt}\nfile: {save_path}\ntimestamp: {datetime.datetime.now():%Y/%m/%d %H:%M:%S}\n\n")
        
    print(f"File saved at {save_path}")


def main():
    """
    Function that prompts the user to enter a message for generating an image and saves the generated image.
    """

    # Initialize.
    #api_key = "Set your API key here"
    api_key = os.environ.get('OPENAI_API_KEY')
    if not api_key:
        print(f"OPENAI_API_KEY environment variable doesn't exist, please restart again.")
        sys.exit(1)

    model = "image-alpha-001"
    save_dir = "./images/"

    if not os.path.exists(save_dir):
        os.makedirs(save_dir)

    while True:
        prompt = input('Enter a message: ')

        create_image(prompt, model, api_key, save_dir)

        yn = input('Do you want to try again? (y/n): ')

        if yn.lower() == 'n':
            break


if __name__ == '__main__':
    main()
```

openAI のAPIを利用しています。
https://platform.openai.com/docs/api-reference/images/create

## 画像を作成してみる

```python
% python image.py
Enter a message: A digital Illustration of the Babel tower, 4k, detailed, trending in artstation, fantasy vivid colors, 8k
File saved at ./images/20230419091258.png
Do you want to try again? (y/n): y
Enter a message: A young girl with bright blue hair stands in a bustling futuristic metropolis. She is surrounded by sky-scraping buildings of various shapes and sizes, all illuminated in a brilliant orange light. The streets are lined with neon signs. Indistinct shapes whiz by in the sky, and the girl looks up in amazement. In the background there are people walking and cars zooming, and the sky is a mix of blues, pinks, and purples. Art style: animation.
File saved at ./images/20230419091416.png
Do you want to try again? (y/n): n
```

こんな感じでメッセージをいれると images 配下にファイルが生成されます。

2. かわいいパンダさん。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3136487/95171384-25b1-2db0-6ed2-9d2852508b00.png)

1. 成果物
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3136487/a27937b6-9679-aa5b-0e4d-86ba91c00a62.png)
結構いい感じ。

1. あらいぐま
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3136487/a7a57767-45a3-5ad0-9095-169e191706db.png)

何故。プロンプトに利用する文章は英語にしないと駄目ぽいです。
URLEncode間違いかしら。

## 一応 Windows exe を作成しておく

python環境がないあなたのためにexeを作成しておきます

```python 
pyinstaller --onefile image.py
```

するとdist/ 配下に image.exe が生成されるので
コマンドプロンプトから実行
※コンソールから質問されるのでダブルクリックは嫌。

```shell
C:\tools\dist>image.exe
Enter a message: chatgpt fruite cute apple green
File saved at ./images/20230420074654.png
Do you want to try again? (y/n): n
```

chatGPT かわいい緑のフルーツ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3136487/fbc42ed0-ae38-3dbf-eaa7-89e9789097e0.png)
なんか周りの銀紙っぽいのがchatGPTなのかしらw

一応ダブルクリックしても小窓が出てきて入力できました。
今日は念願のAWSサミット当日。AWSで12冠した記念品を。
```python
prompt: 2023 AWS ALL Certifications Engineers keepsake in high quality. A product that the members who receive it will be pleased with.
※2023 AWS ALL Certifications Engineersの記念品を高品質で。受領したメンバが喜ぶ商品を。
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3136487/1e7fa416-7b1f-e7d9-be31-059c7c65d008.png)
かなり違うし違和感しかないｗ

## これからの進め方

ともあれ日本語で入力した内容をchatGPTで英語に変換すればそのまま使えるし
プロンプトはgoogle先生から取得したものをそのまま転用すればいけそうかも。

何より非力なPCでも画像 1個作成するのに数秒って素敵。
こういうのが欲しかったのよね。

是非お仲間募集中です。

## openAI による別API（Create image variation）

先日落選した 2023 AWS Top Engineers にもし合格していたらと思い
記念品を作成してみました。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3136487/71d17cd1-697a-e1b0-16aa-c26f105761e1.png)
恐怖しかない。

元画像を入力として他のを作成することができるみたい。
ひとまず手打ちでcurlで頑張る。ヘイ、Mr. カール。
```python
curl https://api.openai.com/v1/images/variations \
  -H "Authorization: Bearer $OPENAI_API_KEY" \
  -F image="@aws_top_engineers.png" \
  -F n=4 \
  -F size="256x256"
```

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3136487/28f3e20d-66f0-65d4-be31-4786bc434993.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3136487/777f2c7a-645f-4d4e-834f-a87f6e456b00.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3136487/09060944-d79f-1279-ce89-d281d200f249.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3136487/0cd54363-cb4c-b2ca-6222-7bf7d4323b00.png)

もう悪夢。

## GUIアプリケーションにしてみました。

ダブルクリックするとWindowsアプリケーションが立ち上がり
メッセージを入力して実行すると画像が表示されます（誰得ｗ

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3136487/c9084e5f-d31d-db9e-edb2-d5c9a2b7c352.png)