HiAPI
ブログ

チュートリアル

AIで画像のスタイルを変換する方法:hiapi API による画像間スタイル変換ガイド

Sep 4, 2026
AIで画像のスタイルを変換する方法:hiapi API による画像間スタイル変換ガイド

AIで写真のスタイルを変換する——ありふれたスナップ写真をアニメの1コマ、スタジオ撮影の商品画像、あるいは水彩イラストに変える——それは特別な「スタイル変換」エンドポイントではありません。ごく普通の画像間(image-to-image)呼び出しです。ソース画像と、目標スタイルを指定するテキスト指示を送ると、モデルが新しい画像を返します。クリーンなスタイル変換になるか、半ば再生成のようになるかを本当に左右するのは、調整可能なパラメータではなく、この指示の書き方です。本ガイドでは、hiapi の統合 tasks API におけるリクエストの仕組み、スタイル変換が新しい画像へ脱線するのを防ぐプロンプトパターン、そして希望する創作の自由度に応じて2つの検証済み画像間モデルから選ぶ方法を紹介します。

用意するもの

  1. hiapi API キー——ダッシュボードから取得します。各リクエストの Authorization: Bearer sk-... ヘッダーに含めます。
  2. 公開アクセス可能なソース画像 URL。 hiapi のサーバーが画像を自ら取得するため、localhost のパスや署名 URL のないプライベートバケットは使用できません。事前署名済みの S3/R2/GCS URL は問題ありません。

以下の各モデル id とフィールドは公開前に実際の API に対して再検証済みで、現在の列挙値を確認するための強制的なエラープローブも含まれています。

スタイル変換に「保持条項」が必要な理由

本ガイドの2つのモデルはいずれも数値による強度・力度パラメータを提供していません——送信すると(strength: 0.5)はadditional properties 'strength' not allowedというエラーで即座に拒否されます。スタイルの強度は完全にプロンプトの文言で制御されます。つまり、"make this a Studio Ghibli anime frame"のような指示はモデルに何を加えるかだけを伝え、何を変えてはいけないかは伝えていません——被写体の同一性、ポーズ、構図はモデルによって自由に再解釈される可能性があります。

解決策は、プロンプトに常に2つの節を書くことです:

  1. 目標スタイルを具体的な視覚的参照(メディア、芸術ジャンル、特定の見た目——「anime cel-shading」「1970s film photography」「clean studio product shot on white」など)で述べます。「cooler」のような曖昧な形容詞ではいけません。
  2. 明示的な保持条項——変更してはいけないものを名指しします:「keep the same subject, pose, and composition」「keep the text and logo unchanged」「keep the camera angle」。

"Restyle this photo as a woodblock print. Keep the subject's pose, framing, and the position of every object in the scene."のようなプロンプトは、1つの指示の中でモデルに目標と制約の両方を与えます。これがスタイル変換を再生成ではなく実現するための最大のレバーです。

最小限の実用例:curl

この例ではseedream-5.0-pro/image-to-imageを使用します。スタイル変換が得意で、厳格で完全に検証済みのスキーマを持っています:

curl -s -X POST https://api.hiapi.ai/v1/tasks \
  -H "Authorization: Bearer sk-YOUR_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "model": "seedream-5.0-pro/image-to-image",
    "input": {
      "prompt": "Restyle this portrait as a watercolor painting with visible brush texture and soft bleeding edges. Keep the subject'\''s pose, expression, and framing exactly as in the source.",
      "image_urls": ["https://your-bucket.example.com/portrait.jpg"],
      "aspect_ratio": "3:4",
      "resolution": "2K"
    }
  }'

aspect_ratioは必須で、固定の列挙値から選びます——現在は1:1、4:3、3:4、16:9、9:16、2:3、3:2、21:9です。このエンドポイントには「ソース画像に合わせる」オプションはないため、ソース画像の実際の比率に最も近い値を選んでください(縦向きの写真 → 3:4または9:16、16:9ではなく)。そうしないと、モデルが合わせるために構図に余白を加えたりクロップしたりします。

作成に成功するとdata.taskIdにタスク id が返ります:

{ "data": { "taskId": "<your-task-id>" } }

終端状態になるまでポーリングします:

curl -s https://api.hiapi.ai/v1/tasks/YOUR_TASK_ID \
  -H "Authorization: Bearer sk-YOUR_KEY"

data.statusは最終的にsuccess(出力はdata.output[0].url)またはfail(詳細はdata.error)になります。

完全な Python スクリプト:作成、ポーリング、ダウンロード

標準ライブラリのみを使用します:

import json
import time
import urllib.request

API = "https://api.hiapi.ai/v1/tasks"
KEY = "sk-YOUR_KEY"


def call(url, payload=None):
    req = urllib.request.Request(
        url,
        data=json.dumps(payload).encode() if payload is not None else None,
        headers={
            "Authorization": f"Bearer {KEY}",
            "Content-Type": "application/json",
        },
        method="POST" if payload is not None else "GET",
    )
    with urllib.request.urlopen(req) as resp:
        return json.load(resp)


# 1. Create the restyle task
create = call(API, {
    "model": "seedream-5.0-pro/image-to-image",
    "input": {
        "prompt": (
            "Restyle this street photo as a 1980s film-grain photograph with warm, "
            "faded colors. Keep the same subject, pose, and every object in the "
            "same position in the frame."
        ),
        "image_urls": ["https://your-bucket.example.com/street.jpg"],
        "aspect_ratio": "16:9",
        "resolution": "2K",
    },
})
task_id = create["data"]["taskId"]
print("task created:", task_id)

# 2. Poll until terminal state
while True:
    task = call(f"{API}/{task_id}")["data"]
    if task["status"] == "success":
        break
    if task["status"] == "fail":
        err = task.get("error") or {}
        raise RuntimeError(f"task failed: {err.get('code')} {err.get('message')}")
    time.sleep(5)

# 3. Download immediately -- output URLs expire
image_url = task["output"][0]["url"]
urllib.request.urlretrieve(image_url, "restyled.png")
print("saved restyled.png")

希望する創作の自由度に応じてモデルを選ぶ

両モデルともオンラインで再検証済みで、strength パラメータを受け付けませんが、ソース画像の影響をどれだけ制御できるかが異なります:

seedream-5.0-pro/image-to-image grok-imagine-quality/image-to-image
参照画像 1〜10 個の公開 URL 1〜3 個の公開 URL
resolution 1K / 2K(大文字) 1k / 2k(小文字)——オプション
構図制御 固定の 8 値 aspect_ratio 列挙、自動マッチなし aspect_ratio: "auto" で入力画面に追従
最適な用途 正確な単一参照画像のスタイル変換で、目標比率が既にわかっている場合 素早いスタイル変換で、比率を自分で選ばずに出力がソース画像の正確な構図を継承してほしい場合

保持条項に「same framing」を含めていて、ソース画像のアスペクト比を手動で計算したくない場合は、grok-imagine-quality/image-to-imageを使用しaspect_ratio: "auto"を設定するのがより直接的な方法です——上のリクエストで置き換え、image_urlsは最大3個、resolutionは小文字の2kに設定します。

本番環境での注意事項

サーバーではポーリングよりもコールバックを優先してください。 リクエスト時にcallbackオブジェクトを追加すると、hiapi が終端状態で1回 POST するため、ポーリングする必要がありません:

{
  "model": "seedream-5.0-pro/image-to-image",
  "input": { "...": "..." },
  "callback": { "url": "https://your-server.example.com/hiapi-hook", "when": "final" }
}

コールバックのペイロードは真実の源ではなくシグナルとして扱ってください——そこからタスク id を取得し、行動する前に自分でGET /v1/tasks/<id>を再取得します。スクリプトや notebook では5秒ごとのポーリングで十分です。

リトライを冪等にしてください。 タスク作成時に、自分のソース画像 → taskIdのマッピングを保存します。プロセスがポーリング中にクラッシュした場合、再起動後は再送信するのではなく、保存したtaskIdを再関連付けしてください——再送信は2つ目の課金タスクになります。

実際に遭遇するエラー:

  • 401 permission_denied——キーの形式が誤っているか欠落しています。ヘッダーは厳密にAuthorization: Bearer sk-...である必要があります。
  • 400 INVALID_REQUEST——スキーマ違反、例えばaspect_ratio: value must be one of '1:1', '4:3', ...やadditional properties 'strength' not allowed。両モデルのスキーマは厳格です——モデル系列をまたいでパラメータを流用しないでください。
  • image_urls must be an array——参照画像が1枚だけでも、裸の文字列ではなくリストを渡したことになります。

関連記事

よくある質問

スタイル変換に強度や力度のスライダーはありますか? いいえ。本ガイドの2つのモデルはいずれもstrengthフィールドを受け付けません——送信すると未認識の属性として拒否されます。スタイルの強度は完全にプロンプトのスタイル記述の具体性と強さで制御されます。

モデルが被写体のポーズや同一性を変えるのを防ぐには? プロンプトに明示的な保持条項を追加し、変更してはいけないもの——ポーズ、表情、構図、物体の位置——を名指ししてください。制約が暗示ではなく明示的に書かれていると、モデルはスタイル変換をより保守的に行います。

ソース画像の正確なアスペクト比を自動で保持できますか? grok-imagine-quality/image-to-imageでは可能です——aspect_ratio: "auto"を設定します。seedream-5.0-pro/image-to-imageには自動オプションはありません。固定の列挙からソース画像の実際の比率に最も近い値を選んでください。

ソース画像は公開 URL でなければなりませんか? hiapi のサーバーが HTTPS 経由で取得できる必要があります。プライベートバケットの事前署名 URL は問題ありません。localhostや未認証で到達不能なパスは不可です。

1枚の写真から複数のスタイルバリエーションを並行して生成できますか? はい——各バリエーションは独立したタスクです。同じimage_urlsと異なるスタイル指示で複数のPOST /v1/tasks呼び出しを行い、それぞれのtaskIdをポーリングするかコールバックを使用します。

スタイル変換とインペイントやオブジェクト除去の違いは何ですか? スタイル変換は内容を変えずに画像全体の描画方法を変えます。インペイント/オブジェクト除去は描画スタイルを変えずに特定の領域を変えます。それらは同じ種類の画像間エンドポイント上の異なるプロンプトパターンです——実際に必要なのがインペイントとオブジェクト除去であれば、インペイントとオブジェクト除去ガイドを参照してください。

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

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

APIドキュメントを読む