AI 數位人影片製作完整指南:HeyGen + ZapCap + Whisper 自動化工作流

載入中...


今天花了一個早上,把 HeyGen(AI 數位人)+ ZapCap(AI 字幕)+ Whisper(語音辨識)串起來,解決了幾個實際問題。這篇記錄完整的工作流程和踩過的坑。

最終成果展示

👆 這是用 HeyGen 生成 AI 數位人 + ZapCap 加上 Hormozi 風格字幕的成果。


目錄

  1. 為什麼需要這套流程?
  2. HeyGen:生成 AI 數位人影片
  3. ZapCap:自動加字幕
  4. 問題一:字幕位置擋到臉
  5. 問題二:人名辨識錯誤
  6. 終極解法:Whisper + ZapCap 組合技
  7. 完整自動化腳本
  8. 常見問題與解決方案

為什麼需要這套流程?

製作短影片內容時,我需要:

  1. AI 數位人:不用每次都拍攝,用 HeyGen 生成
  2. 自動字幕:短影片必備,手動加太慢
  3. 正確的中文辨識:特別是人名,AI 常常辨識錯誤
  4. 動態特效:Hormozi 風格的 highlight + emoji 字幕

單一工具都做不到完美,但組合起來就很強大。


HeyGen:生成 AI 數位人影片

API 基本用法

curl -X POST "https://api.heygen.com/v2/video/generate" \
  -H "X-Api-Key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "video_inputs": [{
      "character": {
        "type": "avatar",
        "avatar_id": "YOUR_AVATAR_ID",
        "avatar_style": "normal"
      },
      "voice": {
        "type": "text",
        "input_text": "你的講稿內容",
        "voice_id": "YOUR_VOICE_ID"
      }
    }],
    "dimension": {"width": 720, "height": 1280},
    "aspect_ratio": "9:16"
  }'

我的設定

用途Avatar IDVoice ID尺寸
直式(手機)JCKOV1JCKOV1720x1280 (9:16)
橫式(電腦)JC KoJC Ko1280x720 (16:9)

等待影片完成

# 取得 video_id 後,輪詢狀態
curl "https://api.heygen.com/v1/video_status.get?video_id=YOUR_VIDEO_ID" \
  -H "X-Api-Key: YOUR_API_KEY"

狀態會從 processingcompleted,完成後會有 video_url


ZapCap:自動加字幕

為什麼選 ZapCap?

  • ✅ Hormozi 風格字幕(animated + highlighted)
  • ✅ 自動加 emoji
  • ✅ 支援中文
  • ✅ API 完整

基本流程

# 1. 上傳影片
curl -X POST "https://api.zapcap.ai/videos" \
  -H "x-api-key: YOUR_API_KEY" \
  -F "file=@video.mp4"
# → 取得 videoId

# 2. 建立字幕任務
curl -X POST "https://api.zapcap.ai/videos/{videoId}/task" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d '{
    "templateId": "a51c5222-47a7-4c37-b052-7b9853d66bf6",
    "autoApprove": true,
    "language": "zh"
  }'
# → 取得 taskId

# 3. 等待完成,下載影片
curl "https://api.zapcap.ai/videos/{videoId}/task/{taskId}" \
  -H "x-api-key: YOUR_API_KEY"
# → 取得 downloadUrl

熱門模板

模板名稱Template ID風格
Hormozi 1a51c5222-47a7-4c37-b052-7b9853d66bf6animated + highlighted
Beast46d20d67-255c-4c6a-b971-31fddcfea7f0animated + highlighted

問題一:字幕位置擋到臉

直式影片用預設字幕位置,字幕剛好在嘴巴附近,很尷尬。

解決方案:調整 top 參數

{
  "templateId": "a51c5222-47a7-4c37-b052-7b9853d66bf6",
  "autoApprove": true,
  "language": "zh",
  "renderOptions": {
    "styleOptions": {
      "top": 75
    }
  }
}

top 是字幕 Y 軸位置的百分比(0-100),數值越大越往下。

數值位置適用場景
30-40上方人物在下半部
50中間預設
70-80下方直式影片推薦

問題二:人名辨識錯誤

ZapCap 把「葛如鈞」辨識成「葛如君」。這在中文很常見,同音字問題。

嘗試一:直接修改 transcript?

ZapCap API 文檔沒有提到編輯 transcript 的方法… 但實測發現有個隱藏 API

# PUT 更新 transcript(文檔沒寫!)
curl -X PUT "https://api.zapcap.ai/videos/{videoId}/task/{taskId}/transcript" \
  -H "x-api-key: YOUR_API_KEY" \
  -H "Content-Type: application/json" \
  -d @fixed_transcript.json

嘗試二:用 Whisper 先轉錄

Whisper 支援 --initial_prompt 參數,可以提示正確的詞彙:

whisper audio.m4a \
  --language zh \
  --initial_prompt "立法委員葛如鈞" \
  --output_format json \
  --word_timestamps True

結果:Whisper 正確辨識出「葛如鈞」!

問題:用 Whisper 取代 ZapCap 會失去 emoji

ZapCap 的 transcript 有 emojiimportant 欄位:

{
  "text": "AI",
  "emoji": "🤖",
  "important": true
}

如果直接用 Whisper 的結果,這些特效就不見了。


終極解法:Whisper + ZapCap 組合技

核心思路:保留 ZapCap 的 emoji 和特效,只修正錯字。

完整流程

# 1. 建立 ZapCap task(autoApprove: false)
curl -X POST "https://api.zapcap.ai/videos/{videoId}/task" \
  -H "x-api-key: $ZAPCAP_API_KEY" \
  -d '{
    "templateId": "a51c5222-47a7-4c37-b052-7b9853d66bf6",
    "autoApprove": false,
    "language": "zh",
    "renderOptions": {"styleOptions": {"top": 75}}
  }'

# 2. 等待 transcriptionCompleted,下載 transcript
# → 這個 transcript 有 emoji 和 important 標記

# 3. 只修正錯字(保留其他欄位)
cat transcript.json | sed 's/葛如君/葛如鈞/g' > fixed.json

# 4. PUT 更新 transcript
curl -X PUT "https://api.zapcap.ai/videos/{videoId}/task/{taskId}/transcript" \
  -H "x-api-key: $ZAPCAP_API_KEY" \
  -d @fixed.json

# 5. Approve 並等待 render
curl -X POST "https://api.zapcap.ai/videos/{videoId}/task/{taskId}/approve-transcript" \
  -H "x-api-key: $ZAPCAP_API_KEY"

結果

  • ✅ 正確的「葛如鈞」
  • ✅ 保留所有 emoji(🤖⏳🚀💡🏗️🧠🛡️🌐💪)
  • ✅ 保留 Hormozi 風格特效
  • ✅ 字幕位置在下方

完整自動化腳本

zapcap-with-fix.sh

#!/bin/bash
# 用法: ./zapcap-with-fix.sh input.mp4 "錯字" "正確"

VIDEO_FILE=$1
WRONG_TEXT=$2
CORRECT_TEXT=$3
ZAPCAP_API_KEY=${ZAPCAP_API_KEY:-"YOUR_KEY"}
TEMPLATE_ID="a51c5222-47a7-4c37-b052-7b9853d66bf6"

# 1. 上傳影片
echo "📤 上傳影片..."
VIDEO_ID=$(curl -s -X POST "https://api.zapcap.ai/videos" \
  -H "x-api-key: $ZAPCAP_API_KEY" \
  -F "file=@$VIDEO_FILE" | jq -r '.id')

# 2. 建立 task
echo "🎬 建立字幕任務..."
TASK_ID=$(curl -s -X POST "https://api.zapcap.ai/videos/$VIDEO_ID/task" \
  -H "x-api-key: $ZAPCAP_API_KEY" \
  -H "Content-Type: application/json" \
  -d "{
    \"templateId\": \"$TEMPLATE_ID\",
    \"autoApprove\": false,
    \"language\": \"zh\",
    \"renderOptions\": {\"styleOptions\": {\"top\": 75}}
  }" | jq -r '.taskId')

# 3. 等待 transcription 完成
echo "⏳ 等待轉錄..."
while true; do
  STATUS=$(curl -s "https://api.zapcap.ai/videos/$VIDEO_ID/task/$TASK_ID" \
    -H "x-api-key: $ZAPCAP_API_KEY" | jq -r '.status')
  echo "   Status: $STATUS"
  [ "$STATUS" = "transcriptionCompleted" ] && break
  sleep 3
done

# 4. 下載並修正 transcript
echo "📝 修正錯字: $WRONG_TEXT$CORRECT_TEXT"
TRANSCRIPT_URL=$(curl -s "https://api.zapcap.ai/videos/$VIDEO_ID/task/$TASK_ID" \
  -H "x-api-key: $ZAPCAP_API_KEY" | jq -r '.transcript')
curl -s -L "$TRANSCRIPT_URL" | sed "s/$WRONG_TEXT/$CORRECT_TEXT/g" > /tmp/fixed.json

# 5. 更新 transcript
curl -s -X PUT "https://api.zapcap.ai/videos/$VIDEO_ID/task/$TASK_ID/transcript" \
  -H "x-api-key: $ZAPCAP_API_KEY" \
  -H "Content-Type: application/json" \
  -d @/tmp/fixed.json > /dev/null

# 6. Approve
curl -s -X POST "https://api.zapcap.ai/videos/$VIDEO_ID/task/$TASK_ID/approve-transcript" \
  -H "x-api-key: $ZAPCAP_API_KEY"

# 7. 等待 render 完成
echo "🎨 渲染中..."
while true; do
  RESULT=$(curl -s "https://api.zapcap.ai/videos/$VIDEO_ID/task/$TASK_ID" \
    -H "x-api-key: $ZAPCAP_API_KEY")
  STATUS=$(echo "$RESULT" | jq -r '.status')
  echo "   Status: $STATUS"
  if [ "$STATUS" = "completed" ]; then
    DOWNLOAD_URL=$(echo "$RESULT" | jq -r '.downloadUrl')
    break
  fi
  sleep 4
done

# 8. 下載
OUTPUT="${VIDEO_FILE%.mp4}-subtitled.mp4"
echo "📥 下載到 $OUTPUT"
curl -s -L "$DOWNLOAD_URL" -o "$OUTPUT"

echo "✅ 完成!"

使用方式

./zapcap-with-fix.sh heygen-output.mp4 "葛如君" "葛如鈞"

常見問題與解決方案

Q1: HeyGen 影片有浮水印?

  • 免費帳號:一定有浮水印
  • 付費帳號(Creator+):API 生成應該沒有浮水印
  • 如果還是有:聯繫 HeyGen 客服確認 API 權限

Q2: ZapCap 轉錄品質不好?

可以用 Whisper 先轉錄一次正確的,再用 transcriptTaskId 重複使用:

{
  "templateId": "...",
  "transcriptTaskId": "之前正確的_task_id"
}

Q3: 字幕樣式想自訂?

ZapCap 支援完整的 renderOptions

{
  "renderOptions": {
    "subsOptions": {
      "emoji": true,
      "emojiAnimation": true,
      "emphasizeKeywords": true,
      "displayWords": 6
    },
    "styleOptions": {
      "top": 75,
      "fontUppercase": false,
      "fontSize": 46,
      "fontWeight": 900,
      "fontColor": "#ffffff",
      "stroke": "m",
      "strokeColor": "#000000"
    }
  }
}

Q4: LINE 發送影片失敗?

  • 確保影片是 MP4 格式
  • 用 ZapCap/HeyGen 的 CDN URL 直接發送(支援 Range requests)
  • 不要用本地 ngrok URL(SimpleHTTPServer 不支援 Range)

小結

這套流程解決了幾個痛點:

問題解決方案
AI 數位人HeyGen API
自動字幕ZapCap API
中文人名錯誤Whisper prompt 或 sed 修正
字幕擋臉top: 75
保留 emoji只 sed 修正錯字

下一步可以:

  • 串接 CI/CD 自動化
  • 加入 TTS(ElevenLabs)生成語音
  • 整合到 Clawdbot 做一鍵生成

有問題歡迎留言討論!