GPT-3(DALL・E)をJavaで呼び出し、画像生成を実施する方法

# DALL・Eとは？
ChatGPTで有名である、OPEN AI社が提供している、画像を生成するAIツールです。
ChatGPTと同じく、GPT-3というAIモデルを元に作られており、ChatGPTが自然言語特化とするのであれば、DALL・Eは画像特化のAIモデルと言えます。（多分）

https://openai.com/product/dall-e-2

# 1. 準備編（APIキーの取得）

OpenAIのアカウントを作成し、APIキーを取得します。
様々なサイトでアカウント作成方法は取り上げられているので、今回記載は割愛します。

下記を参考にさせて頂きました。

https://yakiimosan.com/openai-register/

アカウントを作成したら、画面右上から「View API Keys」を選択します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118127/4ba65292-d8d9-5360-0804-b572645572cd.png)

「Create new secret key」を押下して、APIキーを作成します。
APIキーを作成したら、どこかに控えておいて下さい。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118127/a68055d8-319a-8e10-38ba-a4c53b34f01c.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118127/9fc5d4d8-d4e6-ee63-342b-b6fa3b08807e.png)

:::note alert
**注意**
DALL・E、GPT-3は有料サービスです。通信料に応じて料金が発生します。

今現在(2023/3/3)では、OpenAIアカウント作成から3か月間無料期間があり、$18分のクレジットが与えられます。
そのため、最初の3カ月は$18分、無料で使用する事が出来ますが、
- **$18分を超過して使用した場合**
- **又は3カ月後も継続使用した場合**

については料金が発生します。

筆者は現在無料枠で使用していますが
**現在の無料枠や料金体系がどのようになっているか**
ご自身で調べてから利用する事をおすすめします。
:::
# 2. 準備編（Maven依存関係の追加）

Eclipseのタブから
FIle -> New -> Project -> MavenProjectを選択し、新規MavenProjectを作成します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118127/48d233d3-f62d-1e15-1378-459930ea781a.png)

作成後、pom.xmlに追記します。
```xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<groupId>dallETest</groupId>
	<artifactId>dallETest</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	
    <!-- ここから追記 -->
	<dependencies>
		<dependency>
			<groupId>com.theokanning.openai-gpt3-java</groupId>
			<artifactId>api</artifactId>
			<version>0.10.0</version>
		</dependency>
		<dependency>
			<groupId>com.theokanning.openai-gpt3-java</groupId>
			<artifactId>service</artifactId>
			<version>0.10.0</version>
		</dependency>
	</dependencies>
    <!-- ここまで -->
</project>
```

ここまで出来たら、準備OKです。

# 3. 実装編

あとは、APIを呼び出す実装をするのみです。

```Java
public static void main(String[] args) throws IOException {
    // APIキー設定
	OpenAiService service = new OpenAiService("1で取得したAPIキーを記載");

	// リクエストの作成
	CreateImageRequest req = CreateImageRequest.builder()
			.prompt("柴犬の画像") //生成する画像の説明
			.n(1) // 生成する画像の数。 1～10で選択
			.responseFormat("b64_json") // ローカルの画像を指定するため、b64_jsonを選択。　"URL"とすればURLでの画像の指定も可能
			.size("256x256") //生成する画像のサイズ、256x256, 512x512, 1024x1024から選択
			.build(); 

	// 画像生成の実施
	ImageResult imageResult = service.createImage(req);

	// 返ってきたデータをバイナリ化
	byte[] data = Base64.getDecoder().decode(imageResult.getData().get(0).getB64Json());

	try {
		// 返ってきたデータをpng形式で保存
		BufferedImage image = ImageIO.read(new ByteArrayInputStream(data));
		ImageIO.write(image, "png", new File("test.png"));

	} catch (IOException e) {
		System.out.println("画像出力に失敗しました。");
	}
}
```
リクエストパラメータの設定など、詳細はこちらに記載されています。
当然ですが、sizeなどを大きくすれば処理速度も低下します。

https://platform.openai.com/docs/api-reference/images/create

# 4. 実行結果
test.pngとしてこのような柴犬の画像が生成されました。（絵だけど・・・）
![test.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/3118127/d5bc3b48-b210-aa14-5b14-2ababa082020.png)


# 5. さいごに
Javaでの呼び出しを紹介しているページが少なかったので、書いてみました。
今回は画像生成の手順のみを紹介しましたが、DALL・Eでは画像の加工や、
画像の補填(画像の枠外にあたる、続きを予想して生成する) を行う事が出来ますので、
今度はそちらの使い方も紹介したいと思います。


### 参考にさせて頂いたページ
https://nowokay.hatenablog.com/entry/2023/01/31/200519