載入中...
今天花了一個早上,把 HeyGen(AI 數位人)+ ZapCap(AI 字幕)+ Whisper(語音辨識)串起來,解決了幾個實際問題。這篇記錄完整的工作流程和踩過的坑。
最終成果展示
👆 這是用 HeyGen 生成 AI 數位人 + ZapCap 加上 Hormozi 風格字幕的成果。
目錄
- 為什麼需要這套流程?
- HeyGen:生成 AI 數位人影片
- ZapCap:自動加字幕
- 問題一:字幕位置擋到臉
- 問題二:人名辨識錯誤
- 終極解法:Whisper + ZapCap 組合技
- 完整自動化腳本
- 常見問題與解決方案
為什麼需要這套流程?
製作短影片內容時,我需要:
- AI 數位人:不用每次都拍攝,用 HeyGen 生成
- 自動字幕:短影片必備,手動加太慢
- 正確的中文辨識:特別是人名,AI 常常辨識錯誤
- 動態特效: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 ID | Voice ID | 尺寸 |
|---|---|---|---|
| 直式(手機) | JCKOV1 | JCKOV1 | 720x1280 (9:16) |
| 橫式(電腦) | JC Ko | JC Ko | 1280x720 (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"
狀態會從 processing → completed,完成後會有 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 1 | a51c5222-47a7-4c37-b052-7b9853d66bf6 | animated + highlighted |
| Beast | 46d20d67-255c-4c6a-b971-31fddcfea7f0 | animated + 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 有 emoji 和 important 欄位:
{
"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 做一鍵生成
有問題歡迎留言討論!