こんにちは、HolySheep AI 公式ブログです。今回は「画像を見て AI が解説し、その解説を音声で読み上げる」マルチモーダルパイプラインを、API を一度も触ったことがない完全初心者向けに、ゼロから構築する方法をご紹介します。本記事を読み終える頃には、自分の PC で動く画像解説ボイスボットが完成します。

私は普段、海外の AI モデルを日本から使うときに、地理的な制限や為替手数料、決済手段の選択肢の少なさで頭を悩ませてきました。HolySheep Relay を使い始めてから、開発体験とコストの両方が一変しました。本記事では、その具体的な手順と、私が本番運用で気づいた Tips も交えてお届けします。

このパイプラインで何ができるのか

今回のゴールは次の 3 ステップを自動でつなぐことです。

この 3 ステップを 1 本の Python スクリプトにまとめると、写真を渡せば自動で「音声解説」が返ってくる簡易 bot が完成します。

なぜ HolySheep Relay を使うのか

HolySheep Relay は、OpenAI 互換の API エンドポイントを提供するリレーサービスです。公式エンドポイントと完全互換のため、既存の SDK がほぼそのまま動きます。HolySheep AI の今すぐ登録ページからアカウントを作るだけで、GPT-5.5 や Claude、Gemini などの最新モデルを共通の base_url で呼び出せます。

HolySheep Relay の主な特長は次の通りです。

事前準備:5 分でできる環境づくり

Python 3.9 以上が動く PC (Windows / macOS / Linux いずれも可) と、ブラウザがあれば十分です。ターミナル (mac の「ターミナル」アプリ、Windows の「PowerShell」) を開き、以下のコマンドで必要なライブラリをインストールします。

# ターミナル / PowerShell で実行
pip install openai requests Pillow python-dotenv

[スクリーンショットヒント:ターミナルに 4 つのライブラリが順番にインストールされる進捗バーが表示されます。すべて「Successfully installed」と出れば準備完了です。]

ステップ 1:HolySheep の API キーを取得する

  1. HolySheep の登録ページにアクセスします。
  2. メアドとパスワードを入力 (WeChat Pay / Alipay でのサインアップ導線も用意されています)。
  3. ダッシュボードにログインし、左メニューの「API Keys」→「Create New Key」をクリック。
  4. 表示された hs_xxxxxxxx で始まるキーをメモ帳などにコピーします (再表示できないので必ず控えてください)。

[スクリーンショットヒント:ダッシュボードの「API Keys」ページに「Create New Key」という青いボタンが右上にあります。クリックするとキーがモーダルで 1 回だけ表示されます。]

ステップ 2:Vision で画像を GPT-5.5 に渡す

プロジェクト用のフォルダを作り、.env という名前のファイルを作成して API キーを保存します。

# .env ファイルの中身 (プロジェクトのルートに置く)
HOLYSHEEP_API_KEY=YOUR_HOLYSHEEP_API_KEY

次に同じフォルダに pipeline.py を作成し、以下のコードを貼り付けます。

# pipeline.py
import os
import base64
from openai import OpenAI
from dotenv import load_dotenv

.env から API キーを読み込む

load_dotenv() api_key = os.getenv("HOLYSHEEP_API_KEY")

HolySheep Relay のエンドポイントを指定する

client = OpenAI( api_key=api_key, base_url="https://api.holysheep.ai/v1" ) def encode_image(path: str) -> str: """画像ファイルを base64 文字列に変換する""" with open(path, "rb") as f: return base64.b64encode(f.read()).decode("utf-8") def describe_image(image_path: str) -> str: """GPT-5.5 Vision に画像を渡して解説文を得る""" image_b64 = encode_image(image_path) response = client.chat.completions.create( model="gpt-5.5", messages=[ { "role": "user", "content": [ {"type": "text", "text": "この画像を日本語で 200 字程度にまとめて説明してください。"}, { "type": "image_url", "image_url": { "url": f"data:image/jpeg;base64,{image_b64}" } } ] } ], max_tokens=400 ) return response.choices[0].message.content if __name__ == "__main__": result = describe_image("sample.jpg") print("=== モデルの解説 ===") print(result)

[スクリーンショットヒント:VS Code などのエディタで pipeline.py を開いた状態。左側にファイルツリー、右側にコードが表示されます。sample.jpg も必ず同じフォルダに置いてください。]

ステップ 3:TTS で解説を音声化する

次に、ステップ 2 で得た解説文を音声合成します。HolySheep Relay は TTS エンドポイントも公開しているので、同じ client 変数で切り替えられます。

# pipeline.py に追記する TTS 関数
def synthesize_voice(text: str, out_path: str = "output.mp3") -> None:
    """テキストを音声ファイル (MP3) に変換する"""
    response = client.audio.speech.create(
        model="gpt-5.5-tts",
        voice="nova",
        input=text
    )
    # バイナリをファイルに書き出す
    with open(out_path, "wb") as f:
        f.write(response.read())
    print(f"音声を {out_path} に保存しました。")

if __name__ == "__main__":
    explanation = describe_image("sample.jpg")
    synthesize_voice(explanation)

[スクリーンショットヒント:実行するとターミナルに「音声を output.mp3 に保存しました。」と表示されます。output.mp3 をダブルクリックすると音声が再生されます。]

ステップ 4:2 つを統合してパイプライン化する

上記 2 つの関数を main() でつなぎ、例外処理も入れた完成版が以下です。コピペしてそのまま動かせます。

# pipeline.py 完成版
import os
import base64
from openai import OpenAI
from dotenv import load_dotenv

load_dotenv()
client = OpenAI(
    api_key=os.getenv("HOLYSHEEP_API_KEY"),
    base_url="https://api.holysheep.ai/v1",
    timeout=120
)

def encode_image(path: str) -> str:
    with open(path, "rb") as f:
        return base64.b64encode(f.read()).decode("utf-8")

def describe_image(image_path: str) -> str:
    image_b64 = encode_image(image_path)
    response = client.chat.completions.create(
        model="gpt-5.5",
        messages=[{
            "role": "user",
            "content": [
                {"type": "text", "text": "この画像を日本語で 200 字程度にまとめて説明してください。"},
                {"type": "image_url",
                 "image_url": {"url": f"data:image/jpeg;base64,{image_b64}"}}
            ]
        }],
        max_tokens=400
    )
    return response.choices[0].message.content

def synthesize_voice(text: str, out_path: str = "output.mp3") -> None:
    response = client.audio.speech.create(
        model="gpt-5.5-tts",
        voice="nova",
        input=text
    )
    with open(out_path, "wb") as f:
        f.write(response.read())

def main(image_path: str) -> None:
    explanation = describe_image(image_path)
    print(f"解説文: {explanation}")
    synthesize_voice(explanation)
    print("完了しました。")

if __name__ == "__main__":
    main("sample.jpg")

ターミナルで python pipeline.py と打てば、画像 → 解説文 → MP3 まで一気通貫で動きます。私はこの完成版を GitHub のサンプルリポジトリに置いて社内