1
2

More than 1 year has passed since last update.

個人開発エンジニア応援 - 個人開発の成果や知見を共有しよう!-

Azure OpenAI 「DALL-E」APIで作成した画像をOneDrive for Businessに保存する方法

Last updated at Posted at 2023-09-20

はじめに

先日Qiitaで、Azure OpenAIで画像生成AI「DALL-E」のAPIを利用して、Power Appsで画像生成を楽しむ方法をご紹介しました。

この方法で取得できるデータは、画像の参照先URLになります。

一時的に画像が保存されているURLであり、永続的な保管場所ではありません。

筆者が試したところ、数日も保管されていないURLではないかと

参考までに先日生成した画像URLはアクセスできない状態です
https://dalleproduse.blob.core.windows.net/private/images/77b3aa08-d447-4dd8-945d-c1493fb3a920/generated_00.png?se=2023-09-19T14%3A32%3A22Z&sig=ekgMUUKw9JNWB1yIHID3pqlJJahMIkAd4VQcZeZv07g%3D&ske=2023-09-25T09%3A13%3A59Z&skoid=09ba021e-c417-441c-b203-c81e5dcd7b7f&sks=b&skt=2023-09-18T09%3A13%3A59Z&sktid=33e01921-4d64-4f8c-a055-5bdaffd5e33d&skv=2020-10-02&sp=r&spr=https&sr=b&sv=2020-10-02

せっかく作成したデータなので、画像データを保存したい。
そんなニーズもあると思います。

やり方を模索していましたが、Power Automateで活用できる
OneDrive for BusinessURL からファイルをアップロードアクションで、
非常に簡単に実現できたので、今回はその紹介をいたします。

前回の復習と同時に見ていきましょう。

前回のフローのおさらい

  • 全体像
    image.png

  • Do untilの中身
    image.png

  1. Azure OpenAIのAPIを実行、画像生成用のURLを取得
  2. URLに対し、Get Requestを送信、生成が完了するまでLoop
  3. 画像生成が完了次第、画像参照先のURLが発行される

上記のようなフローになります。

このフローで生成された画像参照先のURLが、
OneDrive for BusinessURL からファイルをアップロードアクションに使用する
パラメーターになります。

image.png

OneDrive for BusinessURL からファイルをアップロードアクション

公式 Referenceを見ていきましょう。

URL からファイルをアップロード アクションは、実際の結果に関係なく、常に 20 秒後に成功を報告します。 ファイルサイズやソースのダウンロード速度によっては、アップロード プロセスに時間がかかる場合があります。 実際の結果を確認するには、アップロードされたファイルデータを操作する前に、常にフローにロジックを作成して、ファイルの存在やタイムアウトを確認する必要があります。

公式より

大雑把な表現になりますが、ソースURLから上手い具合にデータを取得してくれる
便利なアクションです。

このアクションのポイント

パラメーターを公式より引用します。

Name キー 必須 説明
ソース URL source True string ソースファイルへのURL。
宛先ファイル パス destination True string ターゲット ファイル名を含む、宛先ファイル パス。
上書き overwrite boolean [true] に設定されている場合、宛先ファイルを上書きします。
  • ソース URLは、DALL-EのAPIで取得した画像参照先です
  • 宛先ファイル パスは、直入力でファイル名も含めて、指定します。
    • Exploreでフォルダの場所を設定できないため、書き方に注意が必要です。
    • ex) /Download/filename.png

非常に便利なアクションです。
ファイル名も動的な変数に設定することで、複数のファイルを保存することができます。

このアクションを活用できていなかったときの私の場合

方法がわからなかった私は、「PythonでRequestを送り、ファイルを作成する」
という遠回りをしてしまいました・・・。

sample.py
import requests
import os

# get requestを送り、ファイルを書き出す方法
def save_image_from_url(url, save_path):
    response = requests.get(url, stream=True)
    response.raise_for_status()
    with open(save_path, 'wb') as file:
        for chunk in response.iter_content(chunk_size=8192):
            file.write(chunk)

filename = "FileName.png"
save_path = os.path.join("FolderName", filename)
save_image_from_url(`DALL-Eで取得したソース URL`, save_path)
print(f"Image saved to {save_path}")

ChatGPT先生に教えていただいた方法です。
コード解決は簡単ですが、Power Automateに既に機能があるのであれば、
そちらを活用するほうがベターでしょう。

全体像を見てみる

さて、「インスタント クラウド フロー」で一回試してみます。
Promptは、「A dog of photo」です。

  • フロー全体
    image.png

  • Do until
    image.png

  • Apply to each
    image.png

前回との差分

JSON の解析アクションを追加しています。
やはりちゃんとやった方が良いですね💦

まずはDALLのAPIを起動するアクションから、ヘッダーの値を取得しています。
image.png

ヘッダーであることがPoint !! 本文ではありません!

スキーマ
{
    "type": "object",
    "properties": {
        "operation-location": {
            "type": "string"
        },
        "x-ms-request-id": {
            "type": "string"
        },
        "x-envoy-upstream-service-time": {
            "type": "string"
        },
        "OpenAI-Processing-Ms": {
            "type": "string"
        },
        "x-ms-client-request-id": {
            "type": "string"
        },
        "apim-request-id": {
            "type": "string"
        },
        "Strict-Transport-Security": {
            "type": "string"
        },
        "X-Content-Type-Options": {
            "type": "string"
        },
        "x-ms-region": {
            "type": "string"
        },
        "Date": {
            "type": "string"
        },
        "Content-Length": {
            "type": "string"
        },
        "Content-Type": {
            "type": "string"
        }
    }
}

そして取得したoperation-locationGET Requestを送信します。
画像が生成されるまで、スキーマの形は厳密には異なるのですが、下記のスキーマで問題なく進めることができます。

image.png

スキーマ
{
    "type": "object",
    "properties": {
        "created": {
            "type": "integer"
        },
        "expires": {
            "type": "integer"
        },
        "id": {
            "type": "string"
        },
        "result": {
            "type": "object",
            "properties": {
                "created": {
                    "type": "integer"
                },
                "data": {
                    "type": "array",
                    "items": {
                        "type": "object",
                        "properties": {
                            "url": {
                                "type": "string"
                            }
                        },
                        "required": [
                            "url"
                        ]
                    }
                }
            }
        },
        "status": {
            "type": "string"
        }
    }
}

このAPIは複数の画像生成が出来る関係もあるのか、
画像参照先 URLであるdataarrayです・・・。

インデックスで一つだけ取得する方法もありますが、
素直にApply to eachを採用しましょう。

image.png

ファイル名(正しくは ファイルのパス)が重複した場合に、
エラーもしくは設定に基づき上書きされる可能性があるので、一意の名前になるように
気を付けましょう。

Output

image.png

可愛いワンちゃんの写真がOne Drive for Businessに保管されました。
改めてとても簡単ですね。 本物かと疑ってしまいます・・・💦

image.png

フローを見返す

改めて、とてもフローが長くなっていることがわかります。
長いコードはメンテナンスが大変になります。

処理のまとまりがある場合、

  • RPAではサブフロー
  • プログラミングであれば関数
    上記のような解決ができます。

Power Automate上で実施する方法は子フローの活用です。

今回の記事は長くなってしまいましたので、次回の記事て
ソリューションと子フローについて、見ていきたいと思います。

有益な記事にするつもりですので、楽しみにしていてください。

追伸

先日、GPT(gpt-35-turbo 0613) とPaLM 2(chat-bison-32k)でしりとりをするという実験をしました。

非常に不毛な実験ですね。懺悔です。

Reference

1
2
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
2