回到頂部
多模態 API 實戰 — 封面

多模態 API 實戰

用 Python 呼叫 GPT-5、Claude、Gemini 的多模態 API——圖片辨識、語音轉文字、文字轉語音的完整實作教學。

👁️ 什麼是多模態 API?

多模態 AI 能處理文字以外的資料——圖片、音訊、影片。而多模態 API 讓你在程式碼中使用這些能力。

💡 一句話理解 文字 API = AI 能「讀」和「寫」 多模態 API = AI 還能「看圖」、「聽聲音」、「說話」

2026 多模態能力一覽

能力OpenAIClaudeGemini
看圖理解✅ GPT-4o✅ Claude Sonnet 4.6✅ Gemini 3.1 Pro
語音轉文字✅ Whisper
文字轉語音✅ TTS-1
影片理解⚠️ 有限✅ 原生
圖片生成✅ DALL-E 3✅ Imagen 3

2026 年三巨頭多模態能力速查

2026 年主流 API 陣容已經穩定下來,三家各有擅長領域:

  • GPT-5.4(OpenAI):圖片理解 + 語音 + 文字轉語音全包,影片支援仍在預覽階段。單張圖片最高可處理 2048×2048,超過自動降採樣。
  • Claude Sonnet 4.6:圖片理解品質目前最強,尤其在圖表、手寫、複雜 UI 分析上領先。不支援語音和影片輸入,但支援 PDF 原生上傳(最多 100 頁,自動處理文字 + 圖片)。
  • Gemini 3.1 Pro:唯一原生支援長影片(最長 2 小時)和音訊輸入的模型,多模態統一處理,適合跨媒體工作流。

選型簡單原則:單純看圖選 Claude,要處理影片/音訊選 Gemini,需要語音輸出選 GPT。更完整的模型比較可以參考 模型大亂鬥


📸 Vision API:讓 AI 看圖

基本用法(OpenAI

import base64

def encode_image(image_path):
    """把圖片轉成 base64"""
    with open(image_path, "rb") as f:
        return base64.b64encode(f.read()).decode("utf-8")

# 方法 1:本地圖片
image_b64 = encode_image("receipt.jpg")

response = client.chat.completions.create(
    model="gpt-4o",
    messages=[{
        "role": "user",
        "content": [
            {"type": "text", "text": "這張收據的金額是多少?請列出每個項目和總金額。"},
            {
                "type": "image_url",
                "image_url": {
                    "url": f"data:image/jpeg;base64,{image_b64}",
                    "detail": "high"  # high / low / auto
                }
            }
        ]
    }],
    max_tokens=500
)

print(response.choices[0].message.content)
# "這張收據的項目如下:
#  1. 拿鐵咖啡 - NT$120
#  2. 可頌麵包 - NT$85
#  總計:NT$205"
# 方法 2:用 URL
response = client.chat.completions.create(
    model="gpt-4o",
    messages=[{
        "role": "user",
        "content": [
            {"type": "text", "text": "描述這張圖片的內容。"},
            {
                "type": "image_url",
                "image_url": {"url": "https://example.com/photo.jpg"}
            }
        ]
    }]
)

Claude Vision

response = claude_client.messages.create(
    model="claude-sonnet-4-20260514",
    max_tokens=500,
    messages=[{
        "role": "user",
        "content": [
            {
                "type": "image",
                "source": {
                    "type": "base64",
                    "media_type": "image/jpeg",
                    "data": image_b64,
                },
            },
            {"type": "text", "text": "這張收據的金額是多少?"}
        ],
    }]
)

多張圖片比較

response = client.chat.completions.create(
    model="gpt-4o",
    messages=[{
        "role": "user",
        "content": [
            {"type": "text", "text": "比較這兩張產品圖,列出差異。"},
            {"type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{img1_b64}"}},
            {"type": "image_url", "image_url": {"url": f"data:image/jpeg;base64,{img2_b64}"}},
        ]
    }]
)

Vision 實用場景

場景做法Prompt 範例
收據辨識上傳收據照片 → 擷取金額「列出每個項目和金額,用 JSON
UI 截圖分析上傳 UI → 找問題「這個介面有什麼 UX 問題?」
圖表理解上傳圖表 → 分析趨勢「描述這張圖表的趨勢和重點,用於數據分析
OCR 替代上傳文件照片 → 擷取文字「擷取這張圖片中所有的文字」
商品辨識上傳商品照 → 描述特徵「這是什麼產品?估計價格?」

🎤 語音轉文字(Speech-to-Text)

OpenAI Whisper API

# 音訊檔案 → 文字
with open("meeting.mp3", "rb") as audio_file:
    transcript = client.audio.transcriptions.create(
        model="whisper-1",
        file=audio_file,
        language="zh",          # 指定中文加速辨識
        response_format="verbose_json",  # 取得時間戳
    )

print(transcript.text)

# 含時間戳的輸出(verbose_json 格式)
for segment in transcript.segments:
    start = segment["start"]
    end = segment["end"]
    text = segment["text"]
    print(f"[{start:.1f}s - {end:.1f}s] {text}")

實戰:會議錄音自動摘要

結合 Whisper 和 AI 寫作能力,自動產生會議紀錄:

def summarize_meeting(audio_path):
    """錄音 → 逐字稿 → AI 摘要"""

    # Step 1: 語音轉文字
    with open(audio_path, "rb") as f:
        transcript = client.audio.transcriptions.create(
            model="whisper-1", file=f, language="zh"
        )

    # Step 2: AI 摘要
    summary = client.chat.completions.create(
        model="gpt-4o",
        messages=[{
            "role": "user",
            "content": f"""把以下會議逐字稿整理成結構化摘要:

逐字稿:
{transcript.text}

格式:
1. 會議主題
2. 重要決議(✅ 標記)
3. 待辦事項(標明負責人)
4. 下次會議議題"""
        }]
    ).choices[0].message.content

    return summary

🔊 文字轉語音(Text-to-Speech)

OpenAI TTS API

# 文字 → 語音檔案
response = client.audio.speech.create(
    model="tts-1",         # tts-1(快) 或 tts-1-hd(高品質)
    voice="nova",          # alloy, echo, fable, onyx, nova, shimmer
    input="大家好,歡迎收聽今天的 AI 技術分享。",
    speed=1.0              # 0.25 ~ 4.0
)

# 存為 MP3
response.stream_to_file("output.mp3")

Streaming TTS(即時播放)

# 串流模式 — 邊生成邊播放
with client.audio.speech.with_streaming_response.create(
    model="tts-1",
    voice="alloy",
    input="這是一段即時生成的語音。"
) as response:
    response.stream_to_file("stream_output.mp3")

語音選擇指南

語音特色適合
alloy中性、專業客服、旁白
echo沉穩男聲Podcast、教學
nova活潑女聲對話、助手
shimmer溫暖女聲有聲書、冥想
onyx低沉男聲新聞、權威感
fable故事風格兒童內容、有聲書

🎬 影片理解(Gemini)

Gemini 是目前影片理解能力最強的 API。若想了解更多 AI 影片工具,參考 AI 影片生成指南

import google.generativeai as genai

model = genai.GenerativeModel("gemini-2.5-pro")

# 上傳影片
video_file = genai.upload_file("product_demo.mp4")

# 等待處理完成
import time
while video_file.state.name == "PROCESSING":
    time.sleep(5)
    video_file = genai.get_file(video_file.name)

# 分析影片
response = model.generate_content([
    video_file,
    "請分析這段產品示範影片,列出:1) 展示了哪些功能 2) 每個功能出現在幾分幾秒 3) 整體建議"
])

print(response.text)

實戰:5 分鐘教學影片變搜尋得到的逐字稿

把一段產品教學影片丟給 Gemini,要求同時輸出逐字稿 + 章節時間戳 + 關鍵操作截圖時間點,一次抵三個工具。

prompt = """分析這段教學影片,輸出 JSON:
{
  "chapters": [{"start": "00:32", "title": "...", "summary": "..."}],
  "transcript": [{"time": "00:05", "text": "..."}],
  "key_screenshots": [{"time": "01:20", "reason": "第一次出現設定頁"}]
}"""

response = model.generate_content([video_file, prompt])

產出的 JSON 可以直接灌進站內搜尋、做 SEO 章節標記、或串 AI 寫作產生部落格版本。


🔗 組合技:多模態 Pipeline

把多個多模態能力串起來,打造完整的 AI 工作流

async def multimodal_customer_service(audio_message, photo=None):
    """多模態客服:聽語音 + 看照片 → 生成回覆 → 語音回覆"""

    # 1. 語音轉文字
    transcript = client.audio.transcriptions.create(
        model="whisper-1", file=audio_message, language="zh"
    )

    # 2. 組合文字和圖片(如果有)
    messages = [{"type": "text", "text": transcript.text}]
    if photo:
        photo_b64 = encode_image(photo)
        messages.append({
            "type": "image_url",
            "image_url": {"url": f"data:image/jpeg;base64,{photo_b64}"}
        })

    # 3. AI 生成回覆
    ai_response = client.chat.completions.create(
        model="gpt-4o",
        messages=[
            {"role": "system", "content": "你是客服助理,回覆要簡短友善。"},
            {"role": "user", "content": messages}
        ]
    ).choices[0].message.content

    # 4. 文字轉語音
    audio_reply = client.audio.speech.create(
        model="tts-1", voice="nova", input=ai_response
    )
    audio_reply.stream_to_file("reply.mp3")

    return {"text": ai_response, "audio": "reply.mp3"}

💰 成本比較與陷阱

多模態 API 的計費比純文字複雜得多,沒算清楚就會被帳單嚇到

2026 年主流多模態計費對照

項目GPT-5.4Claude Sonnet 4.6Gemini 3.1 Pro
圖片(1024×1024 high)約 $0.0025/張約 $0.0032/張約 $0.0019/張
音訊輸入$0.006/分鐘(Whisper)不支援$0.003/分鐘
TTS 文字轉語音$15/百萬字不支援$16/百萬字
影片輸入預覽版不支援約 $0.30/分鐘(含音軌)
PDF 原生按頁轉圖計費按內容 token 計費(便宜很多)按頁轉圖計費

三個最常見的成本陷阱

1. 圖片解析度沒壓縮就送 使用者上傳的手機照片動輒 4032×3024,如果直接用 detail: "high" 送進 GPT-5.4,一張會吃掉 1500+ tokens。實測:先在本地用 Pillow 壓到 1024 長邊,成本直接砍 60%,辨識率幾乎沒差

2. Whisper 音檔沒先做 VAD 會議錄音常有長時間靜音(午休、休息),Whisper 仍照分鐘計費。先用 webrtcvadsilero-vad 切掉靜音段,1 小時錄音可能只剩 35 分鐘實際語音。

3. 影片全程高解析度分析 Gemini 預設用 1 fps 取樣分析影片,若你只需要「找出商品出現的片段」這種粗略任務,可以明確指定 fps=0.25(每 4 秒 1 幀),成本降到 1/4。


🎯 3 個真實場景:多模態 API 怎麼解決實際問題

場景 1:收據辨識 + 自動記帳(每月省 3 小時手工輸入)

小型企業主每月要把 200+ 張收據手動輸入會計軟體。用 Claude Sonnet 4.6 搭配 結構化輸出

prompt = """分析這張收據,輸出 JSON:
{"date": "YYYY-MM-DD", "vendor": "店家", "items": [{"name":"","price":0}],
 "total": 0, "tax": 0, "category": "餐飲|交通|辦公|其他"}"""

實測:200 張收據從 3 小時手工變 8 分鐘自動化,API 成本 $0.64,辨識正確率 94%(剩 6% 自動丟進人工審核佇列)。關鍵是 Claude 對台灣發票格式辨識度比 GPT 高出約 10%。

場景 2:截圖 Bug Report 直接變修改建議

使用者在產品裡按「回報問題」時,自動截圖 + 錄 30 秒操作畫面,交給 GPT-5.4 產出工程師可讀的 bug report:

# 同時送截圖和錯誤日誌
content = [
    {"type": "text", "text": "使用者截圖 + 當下 console log,推斷什麼壞掉,給修改建議。"},
    {"type": "image_url", "image_url": {"url": f"data:image/png;base64,{screenshot_b64}"}},
    {"type": "text", "text": f"console logs:\n{console_text}"}
]

產出範例:「看起來是表單驗證元件在 mobile viewport 下的 z-index 低於 navbar,建議檢查 FormField.tsx 的 stacking context。」搭配 AI Coding 可以直接生出 diff

場景 3:教學影片批次變可搜尋知識庫

線上課程平台有 500+ 小時影片課程,用戶抱怨「找不到想看的段落」。用 Gemini 3.1 Pro 批次處理:

  1. 每支影片切 10 分鐘片段(避免單次請求超時)
  2. 產出逐字稿 + 章節標記 + 每段的關鍵字
  3. 灌入向量資料庫做 RAG 搜尋

實測成本:500 小時 × $0.30/分鐘 ≈ $9,000 一次性處理費,換來平均觀看完成率從 34% 升到 58%


🧰 生產環境踩坑清單

寫 Demo 和上線是兩回事。以下是實際部署多模態 API 時踩過的坑:

  • 圖片超過 20MB 直接被拒:OpenAI 和 Claude 都有硬限制,上傳前先檢查檔案大小並壓縮。
  • Base64 編碼放在 URL 會超過 payload 上限:大圖片改用 Files API 先上傳取得 file_id,再引用。
  • 多張圖片順序會影響答案:Claude 對圖片順序敏感,把「重要的圖放在 prompt 後面」通常效果較好。
  • Whisper 對會議室混音效果差:多人同時講話會漏字,建議用 Krisp 或 pyannote 先做 speaker diarization。
  • TTS 不認 Markdown:把 **粗體**[連結](url) 直接念出來很蠢,送進 TTS 前先做純文字化。
  • PDF 原生上傳(Claude)vs 轉圖(GPT):100 頁 PDF,Claude 原生版本便宜且快 3 倍,但對掃描檔(非可選取文字)Claude 辨識率反而不如 GPT 轉圖版。

❓ FAQ

Vision API 能辨認中文手寫嗎?

GPT-4o 和 Gemini 對印刷中文辨識率很高(> 95%)。手寫中文辨識率中等(70-85%),取決於字跡清晰度。建議加上 Prompt「請盡量辨識,不確定的用 [?] 標記」。

Whisper 支援台語/粵語嗎?

Whisper 支援 99 種語言,包含中文(zh)。台語(nan)和粵語(yue)有基本支援但精度較低。重度口音的場景建議先用 Whisper 再用 GPT 修潤。

多模態 API 的成本怎麼算?

Vision:圖片按解析度計 token,一張 1024×1024「high detail」約 765 tokens。Whisper:$0.006/分鐘。TTS:$15/百萬字(tts-1)。影片(Gemini):按影片長度和解析度計費。

可以用 Vision API 做即時影像分析嗎?

技術上可以(定期截圖 → 送 Vision API),但延遲 1-3 秒且成本高。適合非即時場景(每分鐘分析一次)。真正的即時影像分析建議用 edge AI 模型(YOLO、MediaPipe)。

GPT-5.4、Claude、Gemini 到底怎麼選?

簡單規則:純看圖任務選 Claude Sonnet 4.6(圖表、手寫、UI 分析最強);要處理影片或音訊選 Gemini 3.1 Pro(唯一原生支援 2 小時長影片);需要語音輸出或完整端到端客服選 GPT-5.4(TTS + Whisper + Vision 一條龍)。多數實務場景你會用到兩家以上。

圖片 detail: high 和 low 差多少?

low 固定消耗 85 tokens(約 $0.0003),只能辨識大致內容。high 依原圖尺寸切成多個 512×512 tile,每個 170 tokens,一張 1024×1024 約 765 tokens。若只是要判斷「這張圖有沒有人」用 low 就夠,要讀收據細項、圖表數字一定要 high。

PDF 怎麼處理最划算?

Claude Sonnet 4.6 的原生 PDF 上傳最省——直接上傳一個 50 頁的財報只要幾毛錢。GPT 和 Gemini 會把 PDF 轉成圖片(每頁一張),成本會是 Claude 的 5-10 倍。但若 PDF 是掃描檔或有複雜圖表,轉圖反而辨識率較高。建議:可選取文字的 PDF 交給 Claude,掃描檔交給 Gemini

📚 延伸閱讀