Azure OpenAI Service の Sora で image to video したい

Azure OpenAI Service には動画生成モデルである Sora が提供されています。

テキストで指示すると動画を生成してくれます。APIの作り的には動画生成の指示やオプションをジョブ(Job)という形で作成してあげるとAzure側で動画生成が行われます。利用者はジョブを定期的にチェックして生成が完了したらジョブ内にGenerationsという成果物の情報が含まれるようになります。この成果物のIDを使って動画の情報やサムネイル、動画ファイル本体を取得することができます。

REST APIはこちらになります。

さて動画生成モデルの最近のアップデートで、テキストによる指示だけじゃなく、画像や動画をアップロードして参照させることもできるようになりました。

通常の生成の場合は application/json でPostしてジョブの作成を行いますが、i2vやv2vのときは multipart/form-data でPostします。

というのはまぁいいんですが、現状REST APIの上記ドキュメントが不親切すぎてfilesの中身とinpaint_itemsに何を指定していいのかわかりません。

よくわからんので聞いてみたらクイックスタートのPythonコードでPostしてるところ参考にして!と言われたのでみたら確かにコードが書かれてる。。。

ドキュメントが不備すぎる、、
なかなかトリッキーな感じの指定の仕方ですね。簡単にいうと files に画像本体のバイナリ付けて、inpaint_items にアップロードする画像に関する情報(ファイル名、参照させる範囲(crop_bounds)など)を JSON文字列で 指定します。

それぞれ配列なので複数画像指定できます。( frame_index は連番を指定する感じかな)

C# ならざっくり以下のような感じでPostの本文を作成すればいい感じです。

	byte[] image; // source image's byte array

	var multipart = new MultipartFormDataContent
	{
	    { new StringContent("sora"), "model" }, // deploy model name
	    { new StringContent("change to cat from dog"), "prompt" },
	    { new StringContent("4"), "n_seconds" },
	    { new StringContent("1"), "n_variants" },
	    { new StringContent("1920"), "width" },
		{ new StringContent("1080"), "height" },
		{ new StringContent(
			System.Text.Json.JsonSerializer.Serialize(
				new object[] {
					new {
                        frame_index = 0,
                        type = "image",
                        file_name = "test.png",
                        crop_bounds = new
                        {
                            left_fraction = 0.0,
                            top_fraction = 0.0,
                            right_fraction = 1.0,
                            bottom_fraction = 1.0
						}
					}
				}
			)
			), "inpaint_items" }, // <- inpaintの情報をJSON文字列にしたものを渡す
	};

	var imageContent = new ByteArrayContent(image);
	imageContent.Headers.ContentType = new MediaTypeHeaderValue("image/png");
	multipart.Add(imageContent, "files", "test.png");

できあがったmultipartをPostすればOKです。ちなみに動画を参考にさせる場合は type を video にして同じようなことをすればOK、みたいなドキュメントの書き方されてますが、Q&Aをみるに全然ドキュメントにない “video” にパブリックアクセス可能な動画へのURLを指定する必要があるぽいです(なんじゃそりゃ)

video to video についてはそのうち直るかもしれませんが、、、

という感じでした。

コメントを残す