はじめに
先日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 BusinessのURL からファイルをアップロードアクションで、
非常に簡単に実現できたので、今回はその紹介をいたします。
前回の復習と同時に見ていきましょう。
前回のフローのおさらい
- Azure OpenAIのAPIを実行、画像生成用のURLを取得
- URLに対し、Get Requestを送信、生成が完了するまでLoop
- 画像生成が完了次第、画像参照先のURLが発行される
上記のようなフローになります。
このフローで生成された画像参照先のURLが、
OneDrive for BusinessのURL からファイルをアップロードアクションに使用する
パラメーターになります。
OneDrive for BusinessのURL からファイルをアップロードアクション
公式 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を送り、ファイルを作成する」
という遠回りをしてしまいました・・・。
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」です。
前回との差分
JSON の解析
アクションを追加しています。
やはりちゃんとやった方が良いですね💦
まずはDALL
のAPIを起動するアクションから、ヘッダーの値を取得しています。
ヘッダーであることが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-location
にGET
Requestを送信します。
画像が生成されるまで、スキーマの形は厳密には異なるのですが、下記のスキーマで問題なく進めることができます。
{
"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
であるdata
はarrayです・・・。
インデックスで一つだけ取得する方法もありますが、
素直にApply to each
を採用しましょう。
ファイル名(正しくは ファイルのパス)が重複した場合に、
エラーもしくは設定に基づき上書きされる可能性があるので、一意の名前になるように
気を付けましょう。
Output
可愛いワンちゃんの写真がOne Drive for Business
に保管されました。
改めてとても簡単ですね。 本物かと疑ってしまいます・・・💦
フローを見返す
改めて、とてもフローが長くなっていることがわかります。
長いコードはメンテナンスが大変になります。
処理のまとまりがある場合、
- RPAではサブフロー
- プログラミングであれば関数
上記のような解決ができます。
Power Automate上で実施する方法は子フローの活用です。
今回の記事は長くなってしまいましたので、次回の記事て
ソリューションと子フローについて、見ていきたいと思います。
有益な記事にするつもりですので、楽しみにしていてください。
追伸
先日、GPT(gpt-35-turbo 0613) とPaLM 2(chat-bison-32k)でしりとりをするという実験をしました。
非常に不毛な実験ですね。懺悔です。