feat: 新增智慧簡報旁白生成系統 (Smart Slide Voiceover System)

- 新增 Excel 輸入模組:解析 .xlsx 格式講稿檔案
- 新增 TTS 引擎模組:整合 edge-tts 調用 Azure Neural Voice
- 新增 PyQt6 圖形介面:檔案選擇、語音選擇、進度監控
- 新增執行緒模型:QThread + Asyncio 確保 UI 響應性
- 支援 10 種 Neural Voice (中文/越南/英文)
- 支援中英混雜、越英混雜發音

🤖 Generated with [Claude Code](https://claude.com/claude-code)

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
This commit is contained in:
beabigegg
2025-12-27 15:42:11 +08:00
commit 33ea22f259
25 changed files with 1943 additions and 0 deletions

View File

@@ -0,0 +1,42 @@
## ADDED Requirements
### Requirement: Excel File Loading
系統 SHALL 支援載入 .xlsx 格式的 Excel 檔案作為講稿輸入來源。
#### Scenario: Valid Excel file selected
- **WHEN** 使用者選擇有效的 .xlsx 檔案
- **THEN** 系統解析檔案內容並準備處理
#### Scenario: Invalid file format rejected
- **WHEN** 使用者選擇非 .xlsx 格式檔案
- **THEN** 系統顯示格式錯誤警告,不進行處理
### Requirement: Column Parsing
系統 SHALL 解析 Excel 檔案的標準欄位結構,包含 Filename、Text、Lang 三個欄位。
#### Scenario: Required columns present
- **WHEN** Excel 檔案包含 Filename 與 Text 欄位
- **THEN** 系統成功解析所有資料列
#### Scenario: Missing required column
- **WHEN** Excel 檔案缺少 Filename 或 Text 欄位
- **THEN** 系統顯示欄位缺失錯誤,停止處理
#### Scenario: Optional Lang column handling
- **WHEN** Lang 欄位為空或不存在
- **THEN** 系統預設使用 "zh" 作為語言設定
### Requirement: Data Validation
系統 SHALL 驗證每一列資料的有效性,確保必要欄位非空。
#### Scenario: Empty text field
- **WHEN** 某列的 Text 欄位為空
- **THEN** 系統記錄警告並跳過該列
#### Scenario: Empty filename field
- **WHEN** 某列的 Filename 欄位為空
- **THEN** 系統記錄警告並跳過該列
#### Scenario: Valid row processing
- **WHEN** Filename 與 Text 欄位皆有值
- **THEN** 系統將該列加入處理佇列

View File

@@ -0,0 +1,101 @@
## ADDED Requirements
### Requirement: File Selection
系統 SHALL 提供檔案選擇器讓使用者選取 Excel 講稿檔案。
#### Scenario: Open file dialog
- **WHEN** 使用者點擊檔案選擇按鈕
- **THEN** 系統開啟檔案對話框,篩選顯示 .xlsx 檔案
#### Scenario: File path display
- **WHEN** 使用者選取檔案後
- **THEN** 系統在介面顯示已選檔案路徑
### Requirement: Voice Selection
系統 SHALL 提供語音選擇下拉選單,讓使用者選擇 TTS 語音,並標註各語音的雙語支援能力。
#### Scenario: Voice dropdown display
- **WHEN** 介面載入完成
- **THEN** 系統顯示語音下拉選單,按語言分組 (中文/越南/英文)
#### Scenario: Voice option format
- **WHEN** 使用者展開下拉選單
- **THEN** 每個選項顯示「語音名稱 (性別) - 雙語支援說明」格式
#### Scenario: Default voice selection
- **WHEN** 使用者未手動選擇語音
- **THEN** 系統使用預設語音 (中文: HsiaoChenNeural, 越南: HoaiMyNeural, 英文: JennyNeural)
#### Scenario: Voice selection persistence
- **WHEN** 使用者選擇語音後開始處理
- **THEN** 所有講稿使用選定的語音進行合成
### Requirement: Start Control
系統 SHALL 提供「開始」按鈕啟動批次生成流程。
#### Scenario: Start without file
- **WHEN** 使用者未選擇檔案即點擊「開始」
- **THEN** 系統顯示警告訊息,不執行任何動作
#### Scenario: Start with valid file
- **WHEN** 使用者已選擇有效檔案並點擊「開始」
- **THEN** 系統開始處理並禁用「開始」按鈕
### Requirement: Stop Control
系統 SHALL 提供「停止」按鈕讓使用者中斷處理流程。
#### Scenario: Stop during processing
- **WHEN** 使用者在處理過程中點擊「停止」
- **THEN** 系統完成當前檔案後停止,不處理後續檔案
#### Scenario: Stop button state
- **WHEN** 系統未在處理中
- **THEN**「停止」按鈕呈現禁用狀態
### Requirement: Progress Display
系統 SHALL 顯示進度條反映批次處理進度。
#### Scenario: Progress update
- **WHEN** 每完成一個檔案的生成
- **THEN** 進度條百分比更新為 (已完成數 / 總數) * 100
#### Scenario: Progress reset
- **WHEN** 開始新的批次處理
- **THEN** 進度條重設為 0%
### Requirement: Log Display
系統 SHALL 提供日誌視窗即時顯示處理狀態。
#### Scenario: Processing log
- **WHEN** 開始處理某個檔案
- **THEN** 日誌顯示「正在處理: [Filename]」
#### Scenario: Success log
- **WHEN** 檔案生成成功
- **THEN** 日誌顯示「完成: [Filename]」
#### Scenario: Error log
- **WHEN** 檔案生成失敗
- **THEN** 日誌顯示「錯誤: [Filename] - [錯誤訊息]」
### Requirement: UI Responsiveness
系統 SHALL 確保長時間處理過程中 UI 保持響應。
#### Scenario: Window interaction during processing
- **WHEN** 批次處理進行中
- **THEN** 使用者可拖曳、縮放、最小化視窗,無凍結現象
#### Scenario: No UI blocking
- **WHEN** TTS 引擎進行網路請求
- **THEN** 主視窗事件迴圈持續運作,不顯示「未回應」
### Requirement: Completion Notification
系統 SHALL 在批次處理完成後通知使用者。
#### Scenario: Batch complete
- **WHEN** 所有檔案處理完畢
- **THEN** 系統顯示完成對話框,包含成功/失敗統計
#### Scenario: Partial completion
- **WHEN** 批次處理被使用者中斷
- **THEN** 系統顯示中斷通知,包含已完成數量

View File

@@ -0,0 +1,68 @@
## ADDED Requirements
### Requirement: Voice Synthesis
系統 SHALL 使用 edge-tts 引擎將文字轉換為語音檔案 (MP3 格式)。
#### Scenario: Successful voice generation
- **WHEN** 提供有效的文字內容與語言設定
- **THEN** 系統生成對應的 MP3 音檔
#### Scenario: Network error handling
- **WHEN** 網路連線中斷或逾時
- **THEN** 系統重試一次,若仍失敗則記錄錯誤並跳過
### Requirement: Voice Selection Support
系統 SHALL 支援使用者從 GUI 選擇的語音進行合成,並提供基於 Lang 欄位的預設映射。
#### Scenario: User selected voice
- **WHEN** 使用者從 GUI 選擇特定語音
- **THEN** 系統使用該語音合成所有講稿
#### Scenario: Default voice by Lang column
- **WHEN** 使用者未選擇語音且 Excel Lang 欄位為 "zh" 或 "zh-tw"
- **THEN** 系統使用 zh-TW-HsiaoChenNeural 語音
#### Scenario: Vietnamese default voice
- **WHEN** 使用者未選擇語音且 Excel Lang 欄位為 "vi"
- **THEN** 系統使用 vi-VN-HoaiMyNeural 語音
#### Scenario: English default voice
- **WHEN** 使用者未選擇語音且 Excel Lang 欄位為 "en"
- **THEN** 系統使用 en-US-JennyNeural 語音
#### Scenario: Unknown language fallback
- **WHEN** 使用者未選擇語音且 Lang 欄位為未知值或空白
- **THEN** 系統預設使用 zh-TW-HsiaoChenNeural 語音
### Requirement: Rate Limit Protection
系統 SHALL 在每次 TTS 請求之間加入延遲,防止 IP 被封鎖。
#### Scenario: Request throttling
- **WHEN** 連續發送多筆 TTS 請求
- **THEN** 系統在每筆請求間等待至少 0.5 秒
### Requirement: Batch Processing
系統 SHALL 支援批次處理多筆講稿,單筆失敗不中斷整體流程。
#### Scenario: Batch with failures
- **WHEN** 批次中有部分檔案生成失敗
- **THEN** 系統記錄失敗項目並繼續處理剩餘檔案
#### Scenario: All files successful
- **WHEN** 批次中所有檔案皆生成成功
- **THEN** 系統顯示完成通知並統計成功數量
### Requirement: Output File Management
系統 SHALL 將生成的音檔儲存至指定輸出路徑。
#### Scenario: Output directory creation
- **WHEN** 輸出路徑不存在
- **THEN** 系統自動建立該目錄
#### Scenario: File naming
- **WHEN** 生成音檔時
- **THEN** 檔名使用 Excel 中 Filename 欄位值加上 .mp3 副檔名
#### Scenario: File overwrite
- **WHEN** 輸出路徑已存在同名檔案
- **THEN** 系統覆蓋既有檔案