本技能將 PDF 幻燈片 + 演講稿轉換為帶同步字幕的完整演講影片。所有處理均在本地執行(Qwen3-TTS)或使用免費線上服務(edge-tts),無需付費 API。
TTS 引擎(二選一,優先 Qwen3-TTS):
核心流水線:演講稿處理 → 語音合成(可選聲音克隆) → 影片生成 → 最終合併
當用戶明確要求使用 Remotion 生成影片時,啟用此模式。
禁止使用 PPT/PDF 截圖作為影片內容。必須用 Remotion 原生 TSX 元件重新設計每一頁的視覺內容。
動畫觸發幀必須與 timing_data.json 中對應句子的時間戳對齊。禁止使用固定幀數或固定迴圈觸發動畫。
原因:截圖解析度低、有白邊、無法動畫、無法響應字幕節奏;原生元件全向量、動畫精確可控、體積更小。
| 步驟 | 傳統模式(FFmpeg) | Remotion 模式 |
|---|---|---|
| 步驟 0-3 | 相同(演講稿處理 + TTS 合成) | 相同 |
| 步驟 4 | PDF → 截圖 → FFmpeg 合成 | TSX 元件設計每頁 + Remotion 渲染 |
| 字幕 | ASS/SRT 燒錄 | Remotion 原生字幕元件(精確逐句同步) |
| 音訊 | FFmpeg 混流 | <Audio> 元件(每頁獨立音訊) |
完整的設計規範、佈局模板、hooks 使用規則、字幕同步機制見:
開始前,請確認以下工具和模型已安裝。
首次使用前,執行環境檢查指令碼確認所有依賴已就緒:
python {SKILL_DIR}/scripts/check_environment.py
該指令碼會檢查:
如果檢測到缺失依賴,指令碼會給出具體的安裝命令。
brew install ffmpeg-full(macOS,完整版)或系統包管理器pip install numpy PyMuPDF
# 方式一(推薦):Qwen3-TTS — 本地高質量語音合成
pip install -U qwen-tts
# 方式二:edge-tts — 微軟線上 TTS,無需 GPU
pip install edge-tts
pip install openai-whisper):語音轉文字(步驟1篩選參考片段時需要)pip install demucs):人聲分離(僅需從影片中提取人聲時使用)# 核心依賴
pip install numpy PyMuPDF
# 推薦 TTS 引擎
pip install -U qwen-tts
# 可選:完整功能
pip install edge-tts openai-whisper demucs
重要:使用者提供的演講稿可能是各種格式(Word 匯出、筆記軟體匯出、手動編寫等),在呼叫 step2_process_speech.py 之前,必須先使用 LLM 將演講稿整理成標準格式。
演講稿必須符合以下 Markdown 結構:
## 第 1 頁 幻燈片標題
第 1 頁的演講內容第一段。
第 1 頁的演講內容第二段。
---
## 第 2 頁 另一頁標題
第 2 頁的演講內容。
當用戶提供了演講稿但格式不符合標準時,執行以下步驟:
1. 呼叫 LLM 整理格式:
你是一個專業的演講稿整理助手。請將使用者輸入的演講稿整理成標準格式。
## 輸出格式要求
1. 使用 ## 第 X 頁 標題 的格式來標識每一頁幻燈片的開始
2. 每頁內容放在標題下方,使用連續的自然段落
3. 刪除所有與演講內容無關的元資訊(如備註、作者、時間戳、郵箱等)
4. 保留演講的核心文字內容和標點符號
5. 清理特殊格式字元,但保留標點
6. 如果原稿件沒有明確的頁碼劃分,請根據內容邏輯合理分頁(每頁建議200-400字)
7. 保持原文語義不變,不要新增或刪減實質內容
8. 使用 --- 作為頁面之間的分隔符
## 示例
### 示例輸入(混亂格式):
各位朋友大家好
Page 1
歡迎致辭
今天非常高興...
### 示例輸出:
## 第 1 頁 歡迎致辭
各位朋友大家好,今天非常高興。
---
## 第 2 頁 主題介紹
...
2. 將 LLM 返回的標準格式內容寫入檔案(如 output/step0_manuscript_formatted.md)
3. 後續步驟使用整理後的檔案,而非原始檔案
| 輸入 | 必需 | 說明 | 示例 |
|---|---|---|---|
| 演講稿 | ✅ 必需 | 按頁劃分的 Markdown 演講稿 | slides-speech.md |
| PDF 幻燈片 | ✅ 必需 | 簡報 PDF 檔案 | slides.pdf |
| 參考音訊 | ❌ 可選 | 用於 Qwen3-TTS 聲音克隆的參考音訊 | reference_voice.wav |
執行流水線前,可使用校驗指令碼檢查輸入檔案格式:
python {SKILL_DIR}/scripts/validate_inputs.py \
--speech_md <演講稿.md> \
--slides_pdf <幻燈片.pdf> \
--reference_voice <參考音訊.wav> # 可選
該指令碼會檢查:
## 第 X 頁 格式)如果發現問題,指令碼會給出具體的修復建議。
使用 Qwen3-TTS + 聲音克隆(推薦,需提供參考音訊)
python {SKILL_DIR}/scripts/run_pipeline.py \
--speech_md <演講稿.md> \
--slides_pdf <幻燈片.pdf> \
--output_dir <輸出目錄> \
--tts_engine qwen3 \
--reference_voice <參考音訊.wav>
使用 Qwen3-TTS + 預設音色(無參考音訊時)
python {SKILL_DIR}/scripts/run_pipeline.py \
--speech_md <演講稿.md> \
--slides_pdf <幻燈片.pdf> \
--output_dir <輸出目錄> \
--tts_engine qwen3 \
--speaker "Vivian"
指定使用 edge-tts
python {SKILL_DIR}/scripts/run_pipeline.py \
--speech_md <演講稿.md> \
--slides_pdf <幻燈片.pdf> \
--output_dir <輸出目錄> \
--tts_engine edge \
--edge_voice "zh-CN-XiaoxiaoNeural"
將 {SKILL_DIR} 替換為本技能目錄的絕對路徑。
常用選項:
| 選項 | 預設值 | 說明 |
|---|---|---|
--tts_engine |
auto |
TTS 引擎:auto(自動選擇)/ qwen3 / edge |
--reference_voice |
無 | 參考音訊路徑(Qwen3-TTS 聲音克隆用,提供即克隆) |
--speaker |
Vivian |
Qwen3-TTS 預設音色(無參考音訊時使用) |
--edge_voice |
zh-CN-XiaoxiaoNeural |
edge-tts 語音名稱 |
--resolution |
1920x1080 |
影片解析度 |
--sentence_pause |
0.4 |
句子間停頓(秒) |
--slide_pause |
1.0 |
頁面間停頓(秒) |
--subtitle_mode |
burn |
burn(燒錄)/soft(軟字幕)/both(兩者) |
--font_name |
PingFang SC |
字幕字型 |
--font_size |
38 |
字幕字號 |
--skip_steps |
無 | 跳過的步驟(如 1 跳過聲音提取) |
--dpi |
200 |
PDF 渲染質量 |
| 音色名稱 | 描述 | 母語 |
|---|---|---|
| Vivian | 明亮的年輕女聲 | 中文 |
| Serena | 溫暖、溫柔的年輕女聲 | 中文 |
| Uncle_Fu | 成熟的男性聲音,醇厚音色 | 中文 |
| Dylan | 年輕的北京男聲 | 中文(北京) |
| Eric | 活潑的成都男聲 | 中文(四川) |
| Ryan | 富有節奏感的男聲 | 英文 |
| Aiden | 陽光的美國男聲 | 英文 |
| 語音名稱 | 描述 |
|---|---|
zh-CN-XiaoxiaoNeural |
曉曉(女,溫暖自然) |
zh-CN-XiaoyiNeural |
曉伊(女,親切活潑) |
zh-CN-YunjianNeural |
雲健(男,沉穩大氣) |
zh-CN-YunxiNeural |
雲希(男,年輕陽光) |
zh-CN-YunyangNeural |
雲揚(男,新聞播報) |
如需更精細控制,可逐步執行:
(步驟 0 在上方"步驟 0(必需)"中說明,推薦在所有步驟之前執行)
從參考影片/音訊中提取純淨人聲,自動篩選最佳參考片段(5~10秒)。
處理流程:
python {SKILL_DIR}/scripts/step1_extract_voice.py \
--input <影片或音訊路徑> \
--output_dir <輸出目錄>/step1_voice
指令碼位置:scripts/step1_extract_voice.py
篩選評分維度:
輸出:
reference_voice.wav — 最佳參考音訊片段(5~10秒)reference_text.txt — 對應的轉錄文字reference_info.json — 片段詳細資訊(時間、文字、評分等)解析並清洗 Markdown 演講稿,生成結構化 TTS 資料。
python {SKILL_DIR}/scripts/step2_process_speech.py \
--input <演講稿.md> \
--output <輸出目錄>/step2_speech_data.json
指令碼位置:scripts/step2_process_speech.py
處理流程:
## 第 X 頁 標題解析頁面邊界**粗體**、*斜體*、時間標註、引用tts_sentences),包括:
config/pronunciation_map.json 載入)目錄路徑讀音規則:
字幕(sentences)保持原始書面寫法不變,TTS 文本(tts_sentences)按以下規則轉換:
| 書面寫法 | TTS 讀音 | 規則 |
|---|---|---|
~/.codebuddy/skills/ |
家目錄下 codebuddy skills 目錄 | ~/ → "家目錄下",末尾 / → "目錄" |
.codebuddy/skills/ |
codebuddy skills 目錄 | 隱藏目錄去掉前導 .,末尾 / → "目錄" |
./config/ |
當前目錄下 config 目錄 | ./ → "當前目錄下" |
references/api.md |
references api點md | 副檔名用"點"連線 |
💡 智慧去重:如果路徑後面已有"目錄"或"下"等字樣,不會重複追加"目錄"。例如
scripts/ 目錄下→ "scripts 目錄下"。
輸出:包含每頁句子的結構化 JSON
使用 Qwen3-TTS(支援聲音克隆)或 edge-tts(預設音色)生成演講音訊。
# Qwen3-TTS + 聲音克隆
python {SKILL_DIR}/scripts/step3_clone_voice.py \
--speech_json <演講資料.json> \
--output_dir <輸出目錄>/step3_tts \
--tts_engine qwen3 \
--reference_voice <參考音訊.wav>
# Qwen3-TTS + 預設音色
python {SKILL_DIR}/scripts/step3_clone_voice.py \
--speech_json <演講資料.json> \
--output_dir <輸出目錄>/step3_tts \
--tts_engine qwen3 \
--speaker "Vivian"
# edge-tts(預設音色)
python {SKILL_DIR}/scripts/step3_clone_voice.py \
--speech_json <演講資料.json> \
--output_dir <輸出目錄>/step3_tts \
--tts_engine edge \
--edge_voice "zh-CN-XiaoxiaoNeural"
指令碼位置:scripts/step3_clone_voice.py
處理流程:
輸出:
full_speech.wav — 完整演講音訊timing_data.json — 精確時間資料(含 tts_engine 欄位標記引擎)sentences/ — 逐句音訊檔案slides/ — 逐頁音訊檔案將 PDF 幻燈片轉換為與音訊時長匹配的影片。
python {SKILL_DIR}/scripts/step4_generate_video.py \
--pdf <幻燈片.pdf> \
--timing_json <時間資料.json> \
--output_dir <輸出目錄>/step4_video
指令碼位置:scripts/step4_generate_video.py
輸出:slides_video.mp4 — 無聲幻燈片影片
將所有元件合併為最終演講影片。
python {SKILL_DIR}/scripts/step5_merge_all.py \
--video <幻燈片影片.mp4> \
--audio <完整音訊.wav> \
--timing_json <時間資料.json> \
--output <最終輸出.mp4>
指令碼位置:scripts/step5_merge_all.py
字幕樣式:白色文字,PingFang SC 字型,黑色描邊,半透明陰影,底部居中。
輸出:final_presentation.mp4 — 帶字幕的完整演講影片
如果對某一句的 TTS 效果不滿意,可以使用 --regenerate 引數只重新生成指定的句子,其餘句子複用已有音訊,然後自動重新拼接併合成最終影片。
檢視當前所有句子:
# 檢視 timing_data.json 中的句子列表
cat <輸出目錄>/step3_tts/timing_data.json | python3 -c "
import json,sys
data=json.load(sys.stdin)
for s in data['slides']:
for sent in s['sentences']:
print(f\"slide{s['slide_number']}_sent{sent['index']:03d}: {sent['text'][:60]}\")
"
重新生成指定句子(支援多種格式):
# 格式1: slide<頁碼>_sent<句號>
python {SKILL_DIR}/scripts/run_pipeline.py \
--speech_md <演講稿.md> \
--slides_pdf <幻燈片.pdf> \
--output_dir <輸出目錄> \
--reference_voice <參考音訊.wav> \
--regenerate slide1_sent000 slide3_sent002
# 格式2: <頁碼>:<句號>(更簡潔)
python {SKILL_DIR}/scripts/run_pipeline.py \
--speech_md <演講稿.md> \
--slides_pdf <幻燈片.pdf> \
--output_dir <輸出目錄> \
--regenerate 1:0 3:2
# 格式3: 整頁重新生成
python {SKILL_DIR}/scripts/run_pipeline.py \
--speech_md <演講稿.md> \
--slides_pdf <幻燈片.pdf> \
--output_dir <輸出目錄> \
--regenerate slide2
注意事項:
--regenerate 時,步驟 1(聲音提取)和步驟 2(演講稿處理)會自動跳過timing_data.json 會自動更新--temperature 0.5 使用--regenerate演講稿應遵循標準 Markdown 結構(詳見上方"步驟 0")。step2_process_speech.py 會自動清洗以下格式:
自動清洗處理:
**文字** → 文字**(約 1 分鐘)** → 移除> 文字 → 文字`程式碼` → 程式碼—— → ,(符合自然語流)流水線內建了三重防護機制,避免併發衝突和重複工作:
run_pipeline.py 和 step3_clone_voice.py 均使用 fcntl.flock() 檔案鎖。同一輸出目錄下只允許一個流水線例項執行,重複啟動會立即報錯退出,不會產生多個程序競爭寫入的問題。qwen3 切換到 edge),會自動清除舊引擎生成的音訊並重新生成,避免混用不同引擎的音訊導致音色不一致。pip install -U qwen-tts,需要較大記憶體(建議 8GB+)pip install -U qwen-tts 或 pip install edge-ttspip install PyMuPDF)作為主後端pip install pdf2image + 安裝 popplerfc-list | grep "PingFang"小蔥技能站7w4.net每天更新,海量AI技能等你發現。
Noto Sans CJK SC 替代 PingFang SCMicrosoft YaHei 替代timing_data.json 時間資料一致references/pipeline_guide.md — 詳細技術架構與設計scripts/ — 所有可執行的流水線指令碼這個 Skill 功能豐富,能把幻燈片和演講稿自動生成帶配音和字幕的影片,支援克隆真實人聲,整體質量不錯。文件寫得很詳細,環境檢查指令碼也很實用。但使用前最好檢查一下,某些參考資料檔案可能缺失,可能導致部分功能無法正常工作。總體來說是一個實用性較強的工具,但建議等待作者完善後再使用。