HiAPI
ブログ

チュートリアル

バーチャルステージング API:空の部屋の写真をAIで家具付き物件写真に変える

実際のビフォーアフター画像、正確なプロンプト、バッチスクリプト、検証済みの価格を含む、再現可能な画像から画像へのワークフロー

Sep 23, 2026
バーチャルステージング API:空の部屋の写真をAIで家具付き物件写真に変える

空室の物件写真は、家具付きの写真ほど購入者に情報を伝えられません。物理的なステージングはこの問題を解決しますが、各ユニットに実際の費用がかかり、予約スケジュールには数日を要します。画像から画像への API なら、空の部屋の写真1枚だけで同じ作業を完了できます。実際の部屋——壁、床、窓、カメラアングル——を保持したまま、その周囲に家具を追加します。

本ガイドでは、正規のモデル ID gpt-image-2/image-to-image を使用してこのワークフローを完全に実行し、POST https://api.hiapi.ai/v1/tasks で呼び出します。本ガイド用に生成した2組の実際のビフォーアフター画像(リビングとベッドルーム)、それらの正確なプロンプト、再利用可能なバッチスクリプト、検証済みの価格を含みます。

画像から画像へのステージングが部屋をリアルに保つ仕組み

テキストから画像への生成では、説明に基づいて部屋をゼロから作り出します。これはステージングには適していません。出力は購入者が実際に足を踏み入れるユニットと一致しなければならないからです。画像から画像への生成では、空の部屋の写真を参照として編集するため、部屋の実際の幾何学的構造が保持されます。

リクエストは2つの部分で構成されます。変更すべき内容のみを記述した prompt(追加する家具と装飾)と、参照写真を含む input_urls 配列——公開 URL でホストされた空の部屋の写真です。モデルは参照画像を読み取り、カメラアングル、壁、床、窓を変更せずに、その部屋に実際に置かれているかのように家具をシーンにレンダリングします。

POST https://api.hiapi.ai/v1/tasks
{
  "model": "gpt-image-2/image-to-image",
  "input": {
    "prompt": "<furniture and decor to add, plus an instruction to keep the room unchanged>",
    "input_urls": ["<public URL of the empty-room photo>"],
    "aspect_ratio": "16:9",
    "resolution": "1K"
  }
}

この単一の設計上の選択——参照を入力し、編集を出力する——こそが、バーチャルステージングと汎用的な部屋生成の違いです。以下の2つの例は、実際の未装飾の空のリビングの写真と、空のベッドルームの写真でこれを示しています。

ビフォーアフター:リビング

A professionally lit real estate photograph of a completely empty living room in
a modern apartment: light oak hardwood floors, plain white walls, one large
window with soft daylight, closed white door on the right wall, ceiling with a
single flush-mount light fixture, no furniture, no people, no text or
watermarks, wide-angle real estate listing photography style, sharp focus,
natural color grading.

最初の画像は参照写真で、gpt-image-2/text-to-image を使用して生成し、実際の空室ユニットの物件写真の代わりにしています(アスペクト比 16:9、解像度 1K、記録コスト $0.03、2026-09-23 生成)。本番ワークフローでは、これは実際にエージェントがアップロードした写真になります——空の部屋の写真がどこから来たとしても、以下のステージング手順は同じように機能します。

Using the empty room in the reference photo, keep the exact room geometry,
floor, walls, window, and door unchanged, and add tasteful modern furniture to
stage it as a livable listing photo: a light gray fabric sofa with two throw
pillows, a round wooden coffee table, a neutral area rug, a floor lamp in the
corner, and a piece of abstract wall art above the sofa. Keep the camera angle
and lighting identical to the reference photo. No people, no text or
watermarks, real estate listing photography style.

証拠:モデル gpt-image-2/image-to-image、input_urls は上記の空の部屋の写真、aspect_ratio: 16:9、resolution: 1K、記録コスト $0.03、2026-09-23 生成。窓の位置、右側の壁のドア、床と壁の色調はすべて参照写真から引き継がれています——新たに追加されたのは家具だけです。

ビフォーアフター:ベッドルーム

A professionally lit real estate photograph of a completely empty bedroom in a
modern apartment: light oak hardwood floors, plain white walls, one window with
sheer curtains letting in soft daylight, a closet with sliding white doors on
one wall, ceiling with a single flush-mount light fixture, no furniture, no
people, no text or watermarks, wide-angle real estate listing photography
style, sharp focus, natural color grading.

Using the empty room in the reference photo, keep the exact room geometry,
floor, walls, window, and closet doors unchanged, and add tasteful modern
furniture to stage it as a livable listing photo: a queen-size bed with a light
gray upholstered headboard and neutral bedding, two matching nightstands with
small lamps, a folded throw blanket at the foot of the bed, and a framed piece
of wall art above the headboard. Keep the camera angle and lighting identical to
the reference photo. No people, no text or watermarks, real estate listing
photography style.

証拠:モデル gpt-image-2/image-to-image、input_urls は上記の空のベッドルームの写真、aspect_ratio: 16:9、resolution: 1K、記録コスト $0.03、2026-09-23 生成。引き戸のクローゼットのドアと窓の位置は変更されていません。ベッド、ナイトスタンド、壁掛けアートのみが追加されています。

どちらのステージング出力も、毎回3部構成のプロンプト構造から生まれています:参照部屋を保持する指示、具体的な家具リスト、写真スタイルのタグです。保持指示を省略することが、この種のタスクで最もよくある失敗パターンです——それがないと、モデルは参照画像をより緩く扱い、カメラアングルや部屋の比率を変えてしまう可能性があります。

タスク API でステージングタスクを一括実行する

1つの物件では通常、複数の部屋をステージングする必要があり、不動産会社は多くの物件を扱います。以下のスクリプトは、空の部屋の写真 URL の辞書を受け取り、各 URL のステージングタスクを送信し、すべての出力が準備できるまでポーリングします。

import os
import time
import requests

API_URL = "https://api.hiapi.ai/v1/tasks"
HEADERS = {
    "Authorization": f"Bearer {os.environ['HIAPI_TOKEN']}",
    "Content-Type": "application/json",
}

STAGING_BRIEF = (
    "keep the exact room geometry, floor, walls, and window unchanged, and add "
    "tasteful modern furniture to stage it as a livable listing photo, real "
    "estate listing photography style, no people, no text or watermarks"
)

# name -> public URL of the empty-room photo
ROOMS = {
    "unit-204-living-room": "https://your-storage.example.com/unit-204-living-room.jpg",
    "unit-204-bedroom": "https://your-storage.example.com/unit-204-bedroom.jpg",
}


def submit_staging_job(empty_room_url, aspect_ratio="16:9", resolution="1K"):
    response = requests.post(
        API_URL,
        headers=HEADERS,
        json={
            "model": "gpt-image-2/image-to-image",
            "input": {
                "prompt": STAGING_BRIEF,
                "input_urls": [empty_room_url],
                "aspect_ratio": aspect_ratio,
                "resolution": resolution,
            },
        },
        timeout=60,
    )
    response.raise_for_status()
    return response.json()["data"]["taskId"]


def wait_for_output(task_id, timeout_s=300, poll_interval=5):
    deadline = time.time() + timeout_s
    while time.time() < deadline:
        r = requests.get(f"{API_URL}/{task_id}", headers=HEADERS, timeout=30)
        r.raise_for_status()
        task = r.json()["data"]
        if task["status"] == "success":
            return task["output"][0]["url"]  # expires — download immediately
        if task["status"] == "fail":
            raise RuntimeError(task["error"])
        time.sleep(poll_interval)
    raise TimeoutError(f"task {task_id} did not finish in {timeout_s}s")


task_ids = {name: submit_staging_job(url) for name, url in ROOMS.items()}
staged_urls = {name: wait_for_output(tid) for name, tid in task_ids.items()}
print(staged_urls)

実際のバッチ処理では、2つの詳細が重要です。第一に、input_urls はタスクごとに1枚の参照写真を受け取ります——複数の部屋を1つのリクエストにまとめようとせず、呼び出しごとに1部屋をステージングしてください。第二に、レスポンスの各 output[0].url は期限付きリンクです:タスク成功後すぐにバイトをダウンロードして自分のストレージバケットに保存してください。本ガイドも同様に、出力を即座に永続ストレージへアップロードしています。

ステージングタスクのバッチ価格

gpt-image-2/image-to-image は出力解像度に基づいて価格設定されており、2026-09-23 に HiAPI のリアルタイム価格エンドポイントに対して検証済みです:

解像度 ステージング画像1枚あたりの価格
1K $0.03
2K $0.04
4K $0.06

計画の計算式は次のとおりです:

batch cost = units × rooms staged per unit × price per image

表の1K価格を使用した場合:

物件バッチ ユニットあたりの部屋数 ステージング画像数 バッチコスト
1ユニット 3 3 $0.09
10ユニット 3 30 $0.90
50ユニット 4 200 $6.00
200ユニット 4 800 $24.00

価格は変動するため、大量発注を約束する前にリアルタイム価格ページを確認し、自身のレビュー通過状況に応じて再生成の余裕を加えてください——本ガイドの2つの例は、一般的な初回通過率を表すものではありません。

バーチャルステージングにできないこと

画像から画像へのステージングは、実際のユニットではなくピクセルを編集します。物件ワークフローに導入する前に、3つの制限を覚えておいてください:

  • 部屋を修復することはできません。 参照写真の損傷、カビ、構造上の問題を編集で消すべきではなく、ステージング後の写真はユニットの実際の状態を決して歪めてはなりません。
  • ピクセル単位で完璧な幾何学的構造を保証するものではありません。 プロンプトはモデルに部屋を保持するよう求め、上記の2つの例はどちらもレイアウトを保持していますが、物件情報に公開する前に、各ステージング写真を元の写真と人間が比較する必要があります。
  • 開示規制は依然として適用されます。 多くの MLS システムや地域の不動産法規では、どの写真がバーチャルステージングされたかの開示が求められます——公開前にあなたの市場に適用される規則を確認してください。

よくある質問

AIバーチャルステージングにはどのモデルを使うべきですか?

gpt-image-2/image-to-image を使用し、POST /v1/tasks を呼び出して、input_urls に空の部屋の写真の公開 URL を渡し、プロンプトで追加する家具を指定します。完全な入力スキーマについてはモデルドキュメントを参照してください。

ステージング後の写真は実際の部屋と本当に一致しますか?

一致するはずですが、確認が必要です。本ガイドのプロンプト構造——まず参照画像を保持し、次に追加する家具のみを列挙する——は、ここでの2つの例で窓、ドア、床、壁の色調の一貫性を保ちました。ただし、生成品質は部屋や光の条件によって異なる可能性があるため、公開前に出力を元の写真と1枚ずつ照合して審査する必要があります。

物件全体をステージングするのにいくらかかりますか?

1K価格の画像1枚あたり $0.03 で計算すると、1ユニットの3部屋をステージングするのに $0.09 かかります。ユニットあたりの部屋数とバッチのユニット数を掛け合わせて大規模なタスクを計画し、解像度や将来の価格変動が総コストに影響するため、事前に現在の価格を確認してください。

写真がバーチャルステージングであることを開示する必要がありますか?

あなたの市場の規則を確認してください。多くの MLS システムや地域の法規では、バーチャルステージングされた写真に開示ラベルを付けることが求められており、これは物件画像に関する一般的な正確性要件とは別のものです。

この画像から画像への手法はステージング以外にも使えますか?

はい——記述された要素を変更しながら参照画像を保持するのは汎用的なパターンです。GPT Image 2 Eコマースワークフローでは、同じ基盤となるタスク API を使用して製品写真のバッチ処理を行っており、プロンプトと価格構造も同様です。

まずGPT Image 2 画像から画像へのモデルページから空室ユニットの写真をアップロードし、ステージング後の部屋が実際のユニットと一致することを確認してから、同じ input_urls 呼び出しを上記のバッチスクリプトに移して物件の残りを処理してください。

永続的なAIアーティファクトで開発を始める

APIキーを取得して、タスクベースの1つのAPIで画像・動画・音声モデルを呼び出せます。

APIドキュメントを読む