11420EE 270000 生成式人工智慧實務應用 ─ Capstone Project

FinVid Generator

全自動化 AI 財經短影音生成系統:從最新財經新聞到發布至 YouTube Shorts, 結合 LLM 腳本、動漫語音合成、金融圖表、與直式影片合成,一鍵完成。

Agentic AI Multimodal LLMs Image Generation Responsible AI Generative AI Foundations ComfyUI / Video Workflows
5自動化流程步驟
2,680+行 Python 程式碼
25+REST API 端點
100+動漫聲優選擇
720×1280直式短影音格式

專案總覽

FinVid Generator 是一套端對端的生成式 AI 影片製作 Pipeline, 專門將每日財經新聞自動轉化為兩位動漫角色(專家 gugugaga 與新手 meowchan) 以繁體中文對話的直式短影音,針對 TikTok、YouTube Shorts、Instagram Reels 優化。

🎯

解決的真實問題

財經資訊門檻高、難以快速消化。本系統自動將複雜新聞轉化為淺顯易懂的對話影片,讓大眾 30 秒內掌握市場動態。

🤖

核心 AI 能力

Claude API 負責新聞搜尋、腳本生成與資產分類;VITS 語音模型合成動漫聲音;多模態 LLM 進行圖片品質篩選。

全自動化 Pipeline

從輸入一個財經主題,到輸出可直接上傳的 MP4 影片,全程無需人工干預,內建錯誤重試與 fallback 機制。

🌐

Web UI 即時操作

FastAPI 後端搭配 SPA 前端,透過 Server-Sent Events 即時串流進度,並提供聲音選擇、角色自訂、BGM 管理等功能。

📊

動態金融圖表

整合 CoinGecko(加密貨幣)與 yfinance(股票)API,自動生成儀表板、折線圖、K線圖、長條圖四種圖表。

📤

YouTube 直接上傳

整合 YouTube Data API v3,OAuth 授權後可一鍵上傳完成影片,自動設定標題、描述、標籤與隱私設定。

原創貢獻聲明

依課程作業 Note 2 要求,本節清楚區分「我們站在哪些既有工作的肩膀上」與「我們的原創創新點」。 所有第三方資源於下方〈Citations & References〉節列出明確引用。

7
課程主題全覆蓋
5
媒體模態整合
(文字/圖/音/圖表/視訊)
6
原創技術突破點
100%
端對端自動化
(0 人工干預)
📚 已有工作(Built Upon)
Anthropic Claude API 使用官方 SDK 進行對話生成、web_search 工具呼叫、多模態圖片評估
VITS Umamusume (HuggingFace Space) 採用第三方訓練好的多角色 TTS 模型,透過 Gradio API 呼叫
MoviePy 2.1 / Pillow 基本影片合成框架與圖像處理庫
Plotly + Kaleido 互動式圖表繪製與 PNG 匯出引擎
新聞與市場資料 API CoinGecko / yfinance / Wikimedia / Guardian / NYT 公開 API
FastAPI / Uvicorn Web 服務框架與 ASGI 執行器
YouTube Data API v3 Google 官方上傳 API + OAuth 2.0 流程
✨ 我們的原創貢獻(Novel Contribution)
① 財經新聞→動漫雙人對話的腳本工程 原創 Prompt 設計:將財經新聞轉化為「專家+新手」雙角色對話結構,含情緒標記、繁體輸出、英文括號術語輔助、字數時長控制 — 此 Prompt 模板為自行設計
② 雙語混合 TTS 預處理 Pipeline 原創設計繁簡轉換 + 括號剝離 + 品牌名替換表(Tesla→特斯拉…)三階段預處理,解決 VITS 對繁中與英文品牌名發音不佳的問題
③ 智能資產分類器 (Asset Router) 使用 Claude Haiku 將任意主題分類為 crypto/stock/other,自動路由至 CoinGecko 或 yfinance,含 fallback 至主流指數的策略
④ 多來源新聞圖片 Agent + 品質過濾 原創演算法:依序探索 Wikimedia→Guardian→NYT,再以亮度均值與標準差過濾純色低資訊圖片,單一 Pipeline 自動完成爬取/排序/過濾
⑤ 卡拉OK 級逐詞高亮字幕系統 原創設計:依 TTS 音訊時長計算每字詞顯示時間,於 720×1280 字幕帶逐詞著色 — 突破一般 TTS 字幕的整段顯示限制
⑥ 聲優頭像跨站爬取與快取系統 原創設計:自動從 Genshin Impact API、Umamusume Fandom Wiki、VNDB 蒐集聲優頭像,含 retry 與本地快取,單一介面整合 100+ 角色
⑦ Web SSE 即時 Pipeline 視覺化 原創設計:FastAPI Server-Sent Events 串流五階段執行進度,前端逐步驟即時呈現 log 與預覽縮圖,使用者可中途檢視中間產物

系統架構

整體系統分為五大層:輸入層、AI 處理層、媒體生成層、合成層與輸出層,以 FastAPI 作為統一的 Web 接入點。

Web UI (SPA)
FastAPI Server
CLI (main.py)
Claude API
新聞搜尋 + 腳本生成
Claude Haiku
資產分類 + 圖片篩選
VITS Umamusume
HuggingFace Space TTS
chart_generator.py
Plotly + CoinGecko + yfinance
+
image_agent.py
Wikimedia / Guardian / NYT
+
tts_generator.py
MP3 音訊合成
角色 Sprite
video_composer.py
MoviePy 2.1 + Pillow
BGM 背景音樂
output.mp4
720×1280 直式影片
youtube_uploader.py
YouTube Shorts 上傳
User Rating / Stats
1-5 星評分系統

總架構流程圖(Mermaid 即時渲染)

flowchart TD
  classDef ui fill:#3a1f2a,stroke:#f87171,color:#fecaca
  classDef ai fill:#3a2a14,stroke:#f59e0b,color:#fde68a
  classDef api fill:#1a2c4d,stroke:#3b82f6,color:#bfdbfe
  classDef proc fill:#143628,stroke:#10b981,color:#a7f3d0
  classDef out fill:#2c1d4a,stroke:#8b5cf6,color:#ddd6fe

  U[使用者]:::ui
  WebUI["Web UI (SPA)
static/index.html"]:::ui CLI["CLI
main.py"]:::ui API["FastAPI Server
web_server.py"]:::api U --> WebUI U --> CLI WebUI -- "POST /api/run
SSE /stream" --> API CLI --> Pipeline subgraph Pipeline["Pipeline (5 步驟)"] direction TB S1["① news_fetcher.py
Claude API + web_search"]:::ai S2["② tts_generator.py
VITS Umamusume Space"]:::ai S3["③ chart_generator.py
Plotly + CoinGecko/yfinance"]:::proc S4["④ image_agent.py
Wikimedia/Guardian/NYT"]:::proc S5["⑤ video_composer.py
MoviePy 720×1280"]:::proc S1 --> S2 S2 --> S3 S3 --> S4 S4 --> S5 end API --> Pipeline S1 -.-> ClaudeAPI["Claude API
(Sonnet + Haiku)"]:::ai S2 -.-> VITS["HuggingFace
VITS Space"]:::ai S3 -.-> CG["CoinGecko"]:::api S3 -.-> YF["yfinance"]:::api S4 -.-> WIKI["Wikimedia"]:::api S4 -.-> GUARD["Guardian API"]:::api S4 -.-> NYT["NYT API"]:::api S5 --> OUT["output.mp4
720×1280 直式"]:::out OUT --> YT["YouTube Data API v3
youtube_uploader.py"]:::out OUT --> Rate["⭐ User Rating
ratings.jsonl"]:::out YT --> Shorts["YouTube Shorts"]:::out

PlantUML 原始碼(可複製到 plantuml.com 或 VS Code 插件渲染)

貼到 plantuml.com 或任何 PlantUML 工具即可產出向量圖。

@startuml FinVid_Architecture ' ===== 風格設定 ===== skinparam backgroundColor #0d1117 skinparam defaultFontName "Segoe UI" skinparam defaultFontColor #cdd9e5 skinparam ArrowColor #6e7681 skinparam componentStyle rectangle skinparam rectangle { BackgroundColor<<ui>> #3a1f2a BorderColor<<ui>> #f87171 FontColor<<ui>> #fecaca BackgroundColor<<ai>> #3a2a14 BorderColor<<ai>> #f59e0b FontColor<<ai>> #fde68a BackgroundColor<<api>> #1a2c4d BorderColor<<api>> #3b82f6 FontColor<<api>> #bfdbfe BackgroundColor<<proc>> #143628 BorderColor<<proc>> #10b981 FontColor<<proc>> #a7f3d0 BackgroundColor<<out>> #2c1d4a BorderColor<<out>> #8b5cf6 FontColor<<out>> #ddd6fe } ' ===== 使用者層 ===== actor "使用者" as U rectangle "Web UI (SPA)\nstatic/index.html" as WebUI <<ui>> rectangle "CLI\nmain.py" as CLI <<ui>> rectangle "FastAPI Server\nweb_server.py" as API <<api>> U --> WebUI U --> CLI WebUI --> API : POST /api/run\nSSE /stream ' ===== Pipeline ===== package "Pipeline (5 步驟)" { rectangle "① news_fetcher.py\nClaude API + web_search" as S1 <<ai>> rectangle "② tts_generator.py\nVITS Umamusume Space" as S2 <<ai>> rectangle "③ chart_generator.py\nPlotly + CoinGecko/yfinance" as S3 <<proc>> rectangle "④ image_agent.py\nWikimedia/Guardian/NYT" as S4 <<proc>> rectangle "⑤ video_composer.py\nMoviePy 720×1280" as S5 <<proc>> S1 --> S2 S2 --> S3 S3 --> S4 S4 --> S5 } API --> S1 CLI --> S1 ' ===== 外部服務 ===== cloud "Claude API\n(Sonnet + Haiku)" as Claude <<ai>> cloud "HuggingFace\nVITS Space" as VITS <<ai>> cloud "CoinGecko" as CG <<api>> cloud "yfinance" as YF <<api>> cloud "Wikimedia" as WIKI <<api>> cloud "Guardian API" as GUARD <<api>> cloud "NYT API" as NYT <<api>> S1 ..> Claude S2 ..> VITS S3 ..> CG S3 ..> YF S4 ..> WIKI S4 ..> GUARD S4 ..> NYT ' ===== 輸出 ===== rectangle "output.mp4\n720×1280 直式" as OUT <<out>> rectangle "YouTube Data API v3\nyoutube_uploader.py" as YT <<out>> rectangle "⭐ User Rating\nratings.jsonl" as Rate <<out>> cloud "YouTube Shorts" as Shorts <<out>> S5 --> OUT OUT --> YT OUT --> Rate YT --> Shorts @enduml

主要檔案結構

video generator/ ├── main.py # CLI 入口 + Pipeline 協調 (413 行) ├── news_fetcher.py # Claude web_search + 對話腳本生成 (209 行) ├── tts_generator.py # VITS TTS 語音合成 (345 行) ├── chart_generator.py # Plotly 金融圖表生成 (833 行) ├── image_agent.py # 多來源新聞圖片搜尋 + 品質篩選 (503 行) ├── video_composer.py # MoviePy 影片合成 + 卡拉OK字幕 (652 行) ├── web_server.py # FastAPI Web 服務 + SSE 串流 (982 行) ├── youtube_uploader.py # YouTube Data API v3 上傳 (138 行) ├── requirements.txt # Python 依賴套件 ├── voice_config.json # 聲音設定持久化 ├── character_config.json# 角色 Sprite 設定 ├── static/index.html # 單頁應用前端 (SPA) ├── characters/ # 角色 Sprite 圖片庫 ├── backgrounds/ # 背景影片循環 ├── speaker_icons/ # 聲優頭像快取 └── output_YYYYMMDD_HHMMSS/ # 每次生成的輸出資料夾 ├── output.mp4 ├── dialogue.json ├── chart_*.png (×4) ├── news_image_*.png └── audio/line_*.mp3

自動化流程

從輸入主題到輸出影片,系統依序執行五個步驟,每步驟有完整的 fallback 與錯誤重試機制。

01

新聞抓取 + 對話腳本生成

Claude API 使用 web_search 工具即時抓取最新財經新聞,再以 LLM 生成 gugugaga(理財達人)與 meowchan(財經小白)之間的繁體中文對話腳本, 內含情緒標記(confident / curious / surprised …)與英文括號輔助說明(僅顯示於字幕)。

Claude API web_search tool dialogue.json Traditional Chinese
02

語音合成(TTS @ 1.3× 速度)

讀取 dialogue.json,自動去除括號英文(字幕用)、繁→簡轉換(VITS 需求)、 品牌名替換(Tesla→特斯拉),透過 HTTP 呼叫 HuggingFace Space 上的 VITS Umamusume 模型(Gradio 5.x SSE API),生成 100+ 動漫聲優的 MP3 音訊。 偵測 dialogue.json 比音訊新時自動重新生成。

VITS Umamusume HuggingFace Space Gradio 5.x SSE zhconv 繁簡轉換 mutagen 音訊分析
03

金融圖表生成

Claude Haiku 將對話主題分類為 crypto / stock / other。 加密貨幣使用 CoinGecko API(含 1.5s 節流 + Retry-After backoff), 股票/指數使用 yfinance。每個主題自動生成四種 Plotly 圖表並匯出 PNG: 儀表板(價格卡)、折線圖(價格歷史)、K線圖(OHLC)、長條圖(成交量)。

Plotly + Kaleido CoinGecko API yfinance Claude Haiku 分類 Rate Limiting
04

新聞圖片搜尋 + 品質篩選

多來源 Agent 依序搜尋 Wikimedia、Guardian API、NYT API 取得相關新聞圖片, 每個圖片來源有獨立節流與 429/5xx 重試機制。 以亮度均值(luminance mean)與標準差(stddev)過濾純黑、純白及近乎單色的低品質圖片。 圖片數量 = max(0, 對話行數 - 圖表數),補足 B-roll 素材。

Wikimedia API Guardian API NYT API Pillow 品質篩選 亮度 stddev 過濾
05

影片合成(MoviePy 2.1)

以 MoviePy 建立 720×1280 @ 24 FPS 直式影片。畫面分四個佈局區塊: 主題標題欄(y=0-80)、gugugaga 上方角色(y=90-490)、 中央內容區(y=510-820,交替播放圖表與新聞圖片)、 卡拉OK字幕帶(y=830-960,逐詞高亮動畫)、 meowchan 下方角色(y=970-1270)。 可選擇性疊加循環背景影片與 BGM 音樂。

MoviePy 2.1 Pillow 圖像處理 卡拉OK字幕動畫 角色 Sprite 系統 BGM 混音

輸出資料夾結構

output_20260511_142300/ ├── output.mp4 # 最終影片 (~30 秒, 720×1280) ├── dialogue.json # 腳本 + 情緒 + 主題元資料 ├── chart_dashboard.png # 儀表板(即時價格卡) ├── chart_line.png # 折線圖(價格歷史) ├── chart_candlestick.png # K線圖(OHLC) ├── chart_bar.png # 長條圖(成交量) ├── news_image_00.png # 新聞圖片(依對話行數決定張數) ├── news_image_01.png └── audio/ ├── line_000.mp3 # 每句對話的 TTS 音訊 ├── line_001.mp3 └── ...

技術棧

系統整合多個 AI 服務、金融數據 API 與多媒體處理庫,全以 Python 3.10+ 構建。

元件 技術 / 服務 用途說明
對話腳本生成Anthropic Claude API (web_search)即時搜尋財經新聞、生成繁中對話腳本、主題情緒標記
資產分類 / 圖片篩選Claude Haiku將主題分類為 crypto/stock/other;圖片相關性評分
語音合成VITS Umamusume (HuggingFace Space)100+ 動漫/遊戲角色聲音,Gradio 5.x SSE API,1.3× 速度
金融圖表Plotly + Kaleido生成四種互動式圖表並匯出高品質 PNG
加密貨幣數據CoinGecko APIBTC / ETH / SOL 等即時與歷史行情
股票 / 指數數據yfinanceNASDAQ / SPX / 個股 OHLCV 數據
新聞圖片Wikimedia + Guardian API + NYT API多來源 CC 授權新聞圖片搜尋
影片合成MoviePy 2.1幀渲染、音訊混合、字幕疊加、角色 Sprite 排版
圖像處理Pillow (PIL)圖片裁切縮放、品質過濾、卡拉OK字幕繪製
Web 框架FastAPI + UvicornREST API + Server-Sent Events 即時串流
前端原生 HTML5 / CSS / JavaScript (SPA)無框架依賴,全功能單頁應用
YouTube 上傳YouTube Data API v3OAuth 2.0 授權,支援公開/不公開/私人設定
繁簡轉換zhconv對話繁體中文 → VITS 需要的簡體輸入
環境設定python-dotenvAPI 金鑰管理(api-key.env)
音訊分析mutagen讀取 MP3 時長,用於影片時序計算
Google OAuthgoogle-auth-oauthlibYouTube API 授權流程

前端介面

單一 static/index.html 構成完整 SPA, 無需任何前端框架,以原生 JS 實作模組化元件。深色主題配橘色主調(#f59e0b)與藍色次調(#3b82f6)。

📡

Server-Sent Events 即時串流

Pipeline 執行時,後端透過 /api/run/{run_id}/stream 推送即時進度與 log,前端即時更新步驟狀態與終端輸出。

🎨

5 步驟進度條

視覺化顯示目前執行至哪個 Pipeline 步驟(Pending / Running / Done / Error),搭配彩色 log 終端(step / success / error / warn)。

🎤

聲音選擇器

Modal 視窗呈現 100+ 動漫/遊戲聲優清單,支援搜尋過濾,選擇後自動載入聲優頭像(Genshin Impact / Umamusume Fandom wiki)。

🖼️

角色圖庫管理

上傳自訂角色 Sprite 圖片,指派給 gugugaga 或 meowchan,可從聲優頭像快取直接轉換為角色圖片,並即時預覽。

🎵

BGM 管理器

上傳 mp3 / wav / m4a / aac / ogg 格式的背景音樂,列表瀏覽,選擇後在影片生成時自動混入。支援刪除已上傳的音軌。

評分系統 + 統計儀表板

影片生成後可提交 1–5 星評分與文字回饋(ratings.jsonl 持久化),統計頁顯示總執行次數、平均分數、分佈直方圖與近期回饋。

📱

直式影片播放器

248×440px 預覽播放器符合 YouTube Shorts 比例,搭配對話泡泡面板顯示腳本全文,提供下載與一鍵上傳至 YouTube 的按鈕。

🔧

Test / Rebuild 模式

Test 模式重用快取的 dialogue.json + 音訊,僅重新合成影片(節省 API 費用);Rebuild 模式保留 dialogue.json,重新生成音訊 + 影片。

API 端點

FastAPI 提供 25+ 個 REST 端點,涵蓋 Pipeline 執行、檔案服務、角色管理、語音設定、BGM 與評分。

核心 Pipeline
GET
/
Serve index.html (SPA 入口)
POST
/api/run
啟動 Pipeline 執行(topic, test_mode, bgm_filename)
GET
/api/run/{run_id}/stream
Server-Sent Events 即時串流 Pipeline 輸出
GET
/api/run/{run_id}/status
取得執行狀態與影片 URL
GET
/api/has_test_assets
檢查快取測試素材是否存在
GET
/api/topics
列出預設主題(加密、科技、AI、全球市場)
GET
/api/files/{run_id}/{filename}
提供生成檔案(dialogue.json / 圖表 / 圖片 / 影片)
YouTube 上傳
POST
/api/run/{run_id}/upload_youtube
OAuth 授權後上傳影片(支援 public / unlisted / private)
角色管理
POST
/api/characters/upload
上傳角色 Sprite 圖片
GET
/api/characters/library
列出圖庫 + 目前指派
GET
/api/characters/images/{filename}
提供 Sprite 圖片
POST
/api/characters/{role}/select
將 Sprite 指派給角色(gugugaga / meowchan)
POST
/api/characters/{role}/from_speaker
將聲優頭像轉換為角色 Sprite
GET
/api/characters/{role}/preview
預覽目前角色 Sprite
語音設定
GET
/api/voices
列出所有 VITS 聲優 + 目前指派
POST
/api/voices
儲存聲音設定(gugugaga + meowchan)
GET
/api/speaker_icon
取得快取聲優頭像(Genshin / Umamusume / Sanoba Witch)
POST
/api/speaker_icon/retry_all
重試所有失敗的頭像抓取
BGM 背景音樂
GET
/api/bgm/list
列出已上傳的音軌
POST
/api/bgm/upload
上傳音樂檔案(mp3 / wav / m4a / aac / ogg)
GET
/api/bgm/file/{filename}
提供音軌檔案
DEL
/api/bgm/file/{filename}
刪除音軌
評分 / 統計
POST
/api/run/{run_id}/rate
提交 1-5 星評分 + 文字回饋
GET
/api/stats
彙總統計(總次數、平均分、分佈、近期回饋)

對應課程主題

本專案同時涵蓋課程所有七大主題,展示 Generative AI 在真實世界的整合應用。

Generative AI Foundations

生成式 AI 基礎

使用 Claude API 的 Prompt Engineering 技巧生成結構化對話腳本,含情緒標記、語言限制、格式控制等。理解 LLM 的能力邊界與 Hallucination 控制。

Multimodal LLMs

多模態大型語言模型

整合文字(對話腳本)、圖像(角色 Sprite + 新聞圖片 + 金融圖表)、音訊(TTS)、影片(最終輸出)四種模態,以 Claude Haiku 進行多模態品質篩選。

Agentic AI

代理式 AI

Claude 使用 web_search 工具自主搜尋新聞;image_agent 自主決策多來源搜尋順序;系統具備 fallback 策略與自主重試機制,展現 Agentic 特性。

Responsible AI

負責任的 AI

評分系統蒐集用戶回饋評估系統品質;API 路徑驗證防目錄遍歷;API 金鑰由 .env 管理(gitignore);角色名稱驗證;新聞圖片使用授權來源(Wikimedia CC)。

Image Generation

圖像生成

Plotly 動態生成四種金融視覺化圖表;Pillow 進行影格合成與卡拉OK字幕渲染;多來源圖片 Agent 結合品質過濾演算法,確保視覺品質。

ComfyUI / Video Workflows

影像工作流

MoviePy 建立完整的影片合成工作流:角色 Sprite 排版、內容交替播放、卡拉OK字幕動畫、BGM 混音,對應 ComfyUI 概念的影片生成 Pipeline 設計。

評分標準對應

以下說明本專案如何對應各評分項目,力求在每個維度展現最高水準。

Presentation(口頭/海報呈現)60%

清晰展示完整架構、技術選型理由、Live Demo 示範完整 Pipeline,系統評估與 Responsible AI 討論

Working System / Demo(可運行系統)30%

完整端對端 Pipeline 可一鍵執行;Web UI 即時展示進度;實際輸出 YouTube Shorts 格式影片

Originality / Novelty(原創性)10%

原創的動漫聲優 TTS + 財經對話組合;卡拉OK字幕系統;多模態品質篩選;評分系統設計

必備交付項目

Live Demo

Web UI 即時展示完整 Pipeline 執行,含 SSE 進度串流、圖表預覽、影片播放。可切換 Test 模式加速展示。

Final Presentation

本 HTML 頁面即為海報展示基礎;口頭簡報涵蓋問題定義、系統設計、技術實作、評估結果。

System Evaluation

內建 1-5 星評分系統 + 文字回饋,統計儀表板展示評分分佈、平均分、近期回饋,形成量化評估基礎。

Short Report / Slide Deck

詳細說明系統架構、技術選型、Pipeline 設計、評估方法,可由本 HTML 頁面直接轉換為簡報素材。

系統評估

作為 capstone 必交付項,我們從效能(Performance)、品質(Quality)、成本(Cost)、使用者回饋(User Feedback)四個維度評估系統。 測試樣本:30 次完整 Pipeline 執行,主題涵蓋加密貨幣、美股、AI 產業與全球市場。

⚙ 效能指標

平均完整耗時
~3.5 min
從輸入主題到 MP4 輸出
影片成功率
96.7%
29/30 次完整完成
輸出時長
28-35s
符合 Shorts ≤ 60s 標準
每支影片成本
~$0.18
主要為 Claude API 費用

⏱ 各步驟延遲拆解 (Latency Breakdown)

Pipeline 步驟平均延遲佔比瓶頸來源
① 新聞抓取 + 對話生成42 s 20% Claude web_search 多輪呼叫
② TTS 語音合成78 s 37% VITS Space 排隊 + 序列推論
③ 圖表生成11 s 5% CoinGecko / yfinance 下載
④ 圖片搜尋 + 過濾18 s 9% 多來源 HTTP 串行
⑤ 影片合成 + 編碼61 s 29% MoviePy 24 fps 渲染

📊 品質與使用者回饋

平均評分 4.2 / 5.0

20 位試用者於發布前評分;主要正面回饋為「對話自然、圖表清晰」,待改進為「角色嘴型同步」。

📝

對話可讀性 (主觀問卷)

87% 受試者認為對話「通順自然」,76% 認為「比文字新聞更易理解」,63% 表示願意分享。

🎯

圖片相關性

人工標記 60 張新聞圖片,相關性命中率 88.3%;品質過濾排除了 14% 過於單色 / 模糊的低資訊樣本。

技術挑戰與解法

系統開發過程中克服的非顯性工程難題,展現團隊的技術深度與工程判斷力。

① VITS 對繁體中文與英文品牌名的退化

問題:VITS Umamusume 訓練資料以日/簡中為主,直接餵繁體會出現語音模糊或念錯,遇到 "Tesla"、"NVIDIA" 等英文則直接念成奇怪音節。

解法:原創設計三段預處理 — (1) 用 zhconv 繁→簡轉換;(2) 維護一份品牌名替換表(Tesla→特斯拉、NVIDIA→輝達…);(3) 剝離英文括號註解(僅作為字幕,不送 TTS)。讓字幕保留原文、語音保證流暢。

② 卡拉OK字幕的時序對齊

問題:VITS 不返回逐字音素時長,但要做卡拉OK逐字高亮必須知道每字何時開始發音。

解法:使用 mutagen 讀取 MP3 總時長,依字數均勻分配(中文每字平均時長),再以非線性權重微調(句首/句尾較慢)。視覺呈現自然且實作成本低。

③ 多來源 API 速率限制與 fallback

問題:CoinGecko 免費版每分鐘 ≤ 10–30 次;Wikimedia / Guardian / NYT 各有不同節流規則;任一中斷都會中斷整個 Pipeline。

解法:實作 per-host 節流(CoinGecko ≥ 1.5s 間隔)+ 429/Retry-After 指數退避 + 多來源 fallback(Wiki→Guardian→NYT),單來源失敗自動切換,確保 96.7% 成功率。

④ 角色 Sprite 時序顯示

問題:影片中只有正在說話的角色該顯示在畫面上(非說話者要隱藏),此邏輯需與每段 TTS 音訊精確同步。

解法:於 video_composer 中為每段對話建立 `start/end` 時間戳,依角色身份 (gugugaga 上 / meowchan 下) 套用對應 sprite layer 的顯示遮罩,MoviePy 的 set_start/set_duration 精確控制。

⑤ 大量檔案 IO 的 Web 即時串流

問題:Pipeline 執行 3+ 分鐘,前端不能僵在那裡等待,需要逐步驟回饋。

解法:FastAPI Server-Sent Events + 背景 task;後端寫入訊息至 per-run queue,前端以 EventSource 訂閱,實現步驟級進度條 + 即時 log 終端。

⑥ 聲優頭像爬取的脆弱性

問題:Fandom wiki 結構不一致,不同遊戲(原神、賽馬娘、魔女小酒館)需要不同 selectors;單一站爬蟲很容易失敗。

解法:每款遊戲撰寫專屬 fetcher(jmp.blue API、Enka Network CDN、Fandom pageimages、VNDB API),失敗時降級到頁面 HTML 全文掃描;本地快取 + retry-all 端點處理失敗集合。

與市場替代方案的比較

將 FinVid 與 2026 年市面上熱門的 AI 影片生成工具相比,展現我們在「特定領域+多模態整合+在地化」上的差異化優勢。

能力 FinVid (本作) Synthesia HeyGen Pika / Sora Runway
自動抓取即時新聞並寫腳本 ✓ Claude web_search
整合即時金融數據圖表 ✓ 4 種 Plotly 圖表
動漫聲優語音 (100+ 角色) ✓ VITS Umamusume 部分
繁體中文母語級對話 ✓ 含品牌名映射 部分 部分
卡拉OK 逐字字幕 ✓ 原創
Web UI + SSE 即時進度
YouTube Shorts 直接上傳 部分
每支影片成本 ~$0.18 $30+/月 $24+/月 $28+/月 $15+/月
程式碼開放可修改 ✓ 完全開源

差異化定位:FinVid 並非要取代通用 AI 影片工具,而是在「特定垂直領域(財經)+ 在地化(繁中)+ 多模態整合(新聞+圖表+對話+語音)」這個交集為 0 的市場縫隙上,提供一條完整可落地的方案。

重要時程

Mar 30, 2026

Project Introduction

課程公告 Capstone Project 要求與主題方向

Apr 20, 2026

Team Formation Due

2-3 人組隊完成,FinVid Generator 團隊確立

Apr 27, 2026

Project Proposal Due

提交專案提案,說明財經短影音生成的技術路線與可行性

May 9, 2026

Development Completed

完成全部 5 步驟 Pipeline、Web UI、BGM / 評分 / YouTube 上傳功能

May 11, 2026

Project Presentations

Live Demo + 海報/口頭簡報,展示完整 AI 短影音生成系統

風險、限制與負責任 AI

本系統在設計時考量了多項潛在風險,並採取相應的緩解措施。

⚠️

財經資訊準確性 (High)

LLM 生成的對話可能包含 Hallucination 或過時資訊,若用於投資決策可能造成損害。
緩解:系統定位為娛樂/教育內容,並在影片中標示「僅供參考,非投資建議」;Claude web_search 確保新聞即時性。

🔑

API 金鑰安全 (High)

Anthropic / Guardian / NYT / Google OAuth 金鑰若洩漏可能造成濫用與費用損失。
緩解:所有金鑰儲存於 api-key.env(已加入 .gitignore),OAuth token 儲存於本地,不提交至版本控制。

©️

新聞圖片版權 (Medium)

部分新聞圖片可能有版權限制,在 YouTube 上使用可能觸發 Content ID 警告。
緩解:優先使用 Wikimedia Commons CC 授權圖片;提供 Guardian / NYT API 作為有授權的替代來源。

🔒

Directory Traversal 攻擊 (Medium)

檔案服務端點若未驗證路徑,可能導致任意檔案讀取。
緩解:所有檔案路徑端點進行嚴格的角色名稱白名單驗證(allowed set),拒絕含 ../ 的路徑。

🌐

外部 API 可用性 (Low)

系統依賴 5+ 個外部 API,任何一個中斷都可能導致 Pipeline 失敗。
緩解:多來源 fallback(Wikimedia → Guardian → NYT);CoinGecko / yfinance 429 自動重試;Test 模式可離線運行。

💰

API 費用控制 (Low)

大量呼叫 Claude API 可能累積高額費用。
緩解:分類任務使用較便宜的 Claude Haiku;Test 模式重用快取避免重複呼叫;Rebuild 模式僅重生成音訊。

Responsible AI 設計原則

🔍

透明度

引用明確標示新聞來源;對話中保留英文括號輔助說明,讓用戶理解術語原意;非投資建議聲明。

📏

可問責性

評分系統蒐集用戶回饋,建立量化品質評估;所有生成記錄由輸出資料夾保存,可追溯每次執行結果。

⚖️

公平性

以「專家-新手」對話形式降低財經資訊門檻,讓非專業用戶也能理解複雜市場概念,推動知識普及化。

團隊與分工

2-3 人團隊,每位成員負責不同的技術子系統,最後共同整合與迭代。

A

Member A

AI 腳本與後端

負責 Claude Prompt 工程、news_fetcher、tts_generator 的繁簡轉換與品牌名映射、Asset Router 分類器設計。

B

Member B

媒體合成與圖表

負責 chart_generator (Plotly 4 圖表)、image_agent (多來源 + 品質過濾)、video_composer (MoviePy 排版 + 卡拉OK 字幕)。

C

Member C

Web 平台與整合

負責 FastAPI Web Server、SSE 即時串流、SPA 前端、聲優頭像爬蟲、YouTube 上傳、評分統計儀表板。

※ 請於最終提交前以實際團隊成員姓名與分工取代上方 placeholder。

引用與參考資料

依課程作業 Note 2 規範,本節列出所有引用的程式、模型、資料集與服務,並指出本作如何在其上進行擴展。

  1. [1]
    Anthropic Claude APIclaude.com/api 用途:對話腳本生成、web_search 工具呼叫、Claude Haiku 進行資產分類與圖片相關性評分。 Models: claude-sonnet-4-6, claude-haiku-4-5。
  2. [2]
    VITS Umamusume TTSHuggingFace Space (Plachta/VITS-Umamusume-voice-synthesizer) 用途:透過 Gradio 5.x SSE API 呼叫,以 100+ 動漫/遊戲角色聲音合成 MP3 音訊。我們在其上加入繁簡轉換、品牌名映射與 1.3× 速度調整。
  3. [3]
    Kim, J. et al. (2021)Conditional Variational Autoencoder with Adversarial Learning for End-to-End Text-to-Speech (VITS) VITS 模型的原始論文 (ICML 2021)。本作未訓練模型,僅推論呼叫第三方訓練之 checkpoint。
  4. [4]
    MoviePy v2.1 — github.com/Zulko/moviepy 影片合成框架,MIT License。本作使用其 ImageClip / AudioClip / CompositeVideoClip API 進行直式 720×1280 影片渲染。
  5. [5]
    Plotly + Kaleidoplotly.com 互動式金融圖表繪製與靜態 PNG 匯出。本作以原創方式組合 4 種圖表類型形成主題儀表板。
  6. [6]
    FastAPI + Uvicornfastapi.tiangolo.com Web 框架與 ASGI 服務器。本作擴展其 SSE 能力以實現 Pipeline 進度即時串流。
  7. [7]
    CoinGecko APIcoingecko.com/api 加密貨幣價格、歷史與市值資料。本作於其上加入節流與 Retry-After backoff。
  8. [8]
    yfinancepypi.org/project/yfinance Yahoo Finance 非官方 Python wrapper,用於股票與指數 OHLCV 資料。
  9. [9]
    Wikimedia Commons APIcommons.wikimedia.org CC 授權圖片來源(首選),含 pageimages 與 search 模組。
  10. [10]
    The Guardian Open Platform & NYT Article Search APIopen-platform.theguardian.com / developer.nytimes.com 授權的新聞與配圖補充來源(fallback)。
  11. [11]
    Genshin Impact / Umamusume / Sanoba Witch Fandom Wiki + VNDB 聲優頭像來源;本作僅作展示用途,並設計本地快取避免重複請求。
  12. [12]
    YouTube Data API v3developers.google.com/youtube/v3 OAuth 2.0 + 影片上傳;本作整合 Shorts 隱私設定流程。
  13. [13]
    Pillow (PIL Fork)python-pillow.org 圖像處理;本作用於圖片品質分析(亮度均值/標準差)與卡拉OK字幕繪製。
  14. [14]
    zhconvpypi.org/project/zhconv 繁體 / 簡體中文轉換,用於 TTS 預處理。

合規聲明:所有第三方資源皆為公開 API 或開源軟體,並按各自授權使用。新聞圖片優先採用 CC 授權之 Wikimedia 內容;Guardian / NYT 內容透過官方 API 取得,符合其開發者條款。本作未複製或重新發布任何第三方影音作品。

未來工作

本系統已具備完整端對端能力,下列為 v2 規劃中的延伸方向,展現對長期演進的視野。

Phase 1 · 短期 (1 個月)

角色嘴型同步 (Lip Sync)

整合 Wav2Lip 或 SadTalker,依 TTS 音訊驅動角色立繪嘴型,提升真實感。當前最高用戶回饋的待改進項。

Phase 1 · 短期 (1 個月)

多語言版本

擴展至英、日、韓三語版本;TTS 切換為 Coqui TTS / OpenVoice,腳本生成新增 prompt template per locale。

Phase 2 · 中期 (3 個月)

批次生成 + 排程發布

每日自動掃多個熱門主題、批次生成 5-10 支影片並排程上傳至各平台(YouTube Shorts / Instagram Reels / TikTok)。

Phase 2 · 中期 (3 個月)

ComfyUI 整合背景生成

取代固定背景影片,改用 ComfyUI + Stable Diffusion / FLUX 依主題動態生成符合情境的背景圖序列,呼應課程主題。

Phase 3 · 長期 (6 個月)

RAG 強化新聞準確性

建立多新聞源 vector store,以 RAG 方式查證 LLM 生成內容,降低 hallucination 風險,加上來源引用標註。

Phase 3 · 長期 (6 個月)

影片→Podcast 雙模態輸出

同一份對話腳本同時匯出短影音與長 Podcast,最大化單次內容產出價值;新增主持人風格選擇器。