{"id":50767003,"url":"https://github.com/vincentchiou/tts-voiceover-app","last_synced_at":"2026-06-11T14:32:15.469Z","repository":{"id":359023681,"uuid":"1236295624","full_name":"vincentchiou/tts-voiceover-app","owner":"vincentchiou","description":"本機運行的中文 TTS 配音工具，主題/PDF/YouTube → 口語腳本 → CosyVoice2 語音合成","archived":false,"fork":false,"pushed_at":"2026-05-20T06:31:38.000Z","size":1001,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2026-05-20T06:41:04.753Z","etag":null,"topics":["chinese-tts","cosyvoice","fastapi","ollama","podcast","taiwan","text-to-speech","tts","voice-cloning","whisper"],"latest_commit_sha":null,"homepage":"https://github.com/vincentchiou/tts-voiceover-app","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/vincentchiou.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2026-05-12T05:56:14.000Z","updated_at":"2026-05-20T06:31:42.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/vincentchiou/tts-voiceover-app","commit_stats":null,"previous_names":["vincentchiou/tts-voiceover-app"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/vincentchiou/tts-voiceover-app","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vincentchiou%2Ftts-voiceover-app","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vincentchiou%2Ftts-voiceover-app/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vincentchiou%2Ftts-voiceover-app/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vincentchiou%2Ftts-voiceover-app/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/vincentchiou","download_url":"https://codeload.github.com/vincentchiou/tts-voiceover-app/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/vincentchiou%2Ftts-voiceover-app/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":34204179,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-05-26T15:22:16.424Z","status":"online","status_checked_at":"2026-06-11T02:00:06.485Z","response_time":57,"last_error":null,"robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":true,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["chinese-tts","cosyvoice","fastapi","ollama","podcast","taiwan","text-to-speech","tts","voice-cloning","whisper"],"created_at":"2026-06-11T14:32:14.875Z","updated_at":"2026-06-11T14:32:15.463Z","avatar_url":"https://github.com/vincentchiou.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# 文生語音 APP（TTS 配音）\n\n一個本機運行的「主題 → 口語腳本 → 中文 TTS 語音」一條龍應用，專為台灣老師、教學者、Podcast 創作者設計。\n\n支援單人解說、雙人 Podcast 對話、PDF 教材轉口播、YouTube 影片重新配音，以及上傳參考音檔做**音色複製**。\n\n---\n\n## 主要功能\n\n- **多模式輸出**：單人解說 / 雙人 Podcast（小艾＋大維）/ 短影音\n- **多種輸入來源**：直接給主題 / PDF 檔案 / YouTube 連結 / SRT 字幕\n- **多家 LLM 支援**：\n  - 本地：Ollama、LMStudio（OpenAI 相容）\n  - 雲端：OpenAI、Anthropic、**Google Gemini 2.5**（flash / flash-lite / pro）\n- **PDF 智慧解析**：雙欄偵測、頁首頁尾清理、Tesseract OCR fallback、品質報告\n- **PDF 預覽編輯**：解析後可在前端編輯確認再生成（避免 LLM 亂講）\n- **Gemini 直讀 PDF**：可選擇讓 Gemini 直接讀 PDF（多模態），429 配額用完自動降級到本地解析 + 本地 LLM\n- **TTS 引擎**：**GPT-SoVITS v4**（48kHz 高品質中文 TTS + zero-shot 聲音複製）\n- **6 種預設音色**：台灣女聲、台灣男聲、活潑女聲、沉穩男聲、溫暖男聲、元氣女聲\n- **音色複製**：上傳一段參考音檔（5~10 秒）即可即時複製出自訂音色\n- **YouTube 轉錄**：用 Faster-Whisper 自動把影片內容轉為文字\n\n---\n\n## 系統需求\n\n- **作業系統**：Windows 10/11（PowerShell 5.1 以上）\n- **Python**：自動由 uv 安裝（不需要您預先裝）\n- **GPU**（強烈推薦）：NVIDIA + **≥ 6 GB VRAM**（v4 推論需求）\n- **磁碟**：約 **15 GB**（含 5.3 GB GPT-SoVITS 權重 + 其他模型）\n- **記憶體**：建議 ≥ 16 GB\n\n---\n\n## 安裝與啟動\n\n### 第一步：安裝 GPT-SoVITS（一次性）\n\nGPT-SoVITS 程式碼與權重不入 git，請執行專用安裝腳本：\n\n```powershell\n# 在專案根目錄\n.\\setup_gptsovits.ps1\n```\n\n這個腳本會：\n1. `git clone` GPT-SoVITS 原始碼\n2. 下載 **pretrained_models.zip（5.3 GB）** + **G2PWModel.zip（1 GB）**\n3. 解壓到 `GPT-SoVITS/GPT_SoVITS/pretrained_models/`\n4. 建立獨立 venv `runtime/gptsovits_venv/`，安裝 PyTorch 2.5.1（NVIDIA 自動裝 cu121）+ GPT-SoVITS 依賴\n5. 起 api_v2.py smoke test，確認 9880 可連線\n\n腳本可重複執行，已完成步驟自動跳過。\n\n### 第二步：啟動主應用\n\n```powershell\n.\\start.bat\n```\n\n第一次執行會自動：\n1. 下載 uv（Python 套件管理器）\n2. 安裝 Python 3.10 與主後端套件\n3. 啟動後端 FastAPI 服務（port 8765）\n4. 自動開啟瀏覽器到 `http://localhost:8765`\n\n第一次合成時，主後端會自動拉起 GPT-SoVITS api_v2.py（port 9880）。\n\n### 第三步：準備預設音色音檔（可選）\n\nGPT-SoVITS 是 zero-shot 引擎，每個音色需要一段 ref 音檔 + 對應逐字稿。\n\n`manifests/models.json` 已定義 6 個預設音色，對應檔案放在：\n\n```\nmanifests/preset_voices/\n├── taiwan_female_warm.wav\n├── taiwan_male_clear.wav\n├── taiwan_female_lively.wav\n├── taiwan_male_steady.wav\n├── taiwan_male_warm.wav\n└── taiwan_female_energetic.wav\n```\n\n**目前尚未附上**，建議方式：\n- 自己錄 6 段 5~10 秒、台灣腔的清晰語音，照上面檔名放好\n- 或在介面上傳一段做「音色複製」，建立的 cloned voice 即可使用\n- 或從 HF Common Voice / 公開語料抓台灣腔片段（每段 5~10 秒、單一說話者）\n\n若預設音色檔不存在，後端會自動 fallback 使用第一個已 clone 的音色。\n\n---\n\n## 專案結構\n\n```\n專案-TTS配音/\n├── start.bat / start.ps1     # Windows 主應用入口\n├── setup_gptsovits.ps1       # GPT-SoVITS 安裝腳本\n├── GPT-SoVITS/               # （由 setup 腳本 clone，不入 git）\n├── backend/                  # FastAPI 後端\n│   ├── app.py                # REST API 主程式\n│   ├── audio.py              # TTS 合成流程（呼叫 gptsovits_service）\n│   ├── gptsovits_service.py  # GPT-SoVITS 子行程管理 + HTTP 客戶端\n│   ├── content.py            # LLM 腳本生成（含各家 provider）\n│   ├── jobs.py               # 工作排程、腳本解析\n│   ├── system_probe.py       # 硬體偵測（GPU/RAM/Ollama）\n│   ├── runtime_manager.py    # 主後端環境安裝管理\n│   ├── pdf_handler.py        # PDF 文字擷取\n│   ├── video_handler.py      # YouTube / SRT 處理\n│   └── requirements.txt\n├── frontend/                 # 純靜態前端（HTML + JS）\n└── manifests/\n    ├── models.json           # 預設音色設定（ref_audio + prompt_text）\n    ├── runtime.windows.json  # 主後端安裝清單\n    └── preset_voices/        # 預設音色 ref 音檔（請自行準備）\n```\n\n執行階段才會建立的目錄（已加入 `.gitignore`）：\n```\n%LOCALAPPDATA%\\TTS配音APP\\\n├── runtime/\n│   ├── venv/                # 主後端 venv\n│   └── gptsovits_venv/      # GPT-SoVITS 獨立 venv\n├── models/                  # Faster-Whisper 模型\n├── jobs/                    # 工作產出\n├── uploads/                 # 使用者上傳檔\n└── voices/                  # 複製音色\n```\n\n---\n\n## API 端點概覽\n\n| Method | Path | 用途 |\n|--------|------|------|\n| GET    | `/health` | 健康檢查 |\n| GET    | `/system/check` | 硬體 + 已安裝元件偵測 |\n| GET    | `/settings/llm` | 取得 LLM 設定 |\n| POST   | `/settings/llm` | 更新 LLM 設定 |\n| GET    | `/settings/llm/lmstudio/models` | 列出 LMStudio 已載入的模型 |\n| POST   | `/settings/llm/test` | 測試 LLM 連線 |\n| GET    | `/voices` | 列出所有可用音色 |\n| POST   | `/voices/clone` | 上傳參考音檔，建立複製音色 |\n| POST   | `/jobs` | 建立配音工作 |\n| GET    | `/jobs/{id}` | 查詢工作狀態 |\n| GET    | `/jobs/{id}/events` | SSE 進度串流 |\n| PUT    | `/jobs/{id}/script` | 修改腳本後重新合成 |\n| POST   | `/jobs/{id}/approve` | 確認腳本，開始 TTS |\n| GET    | `/jobs/{id}/download` | 下載 MP3 |\n| POST   | `/upload` | 上傳 PDF / SRT / TXT |\n| POST   | `/extract-pdf` | 解析 PDF 並回傳文字 + 品質報告（含 OCR fallback） |\n\nGPT-SoVITS（內部使用，主後端自動呼叫）：\n\n| Method | Path | 用途 |\n|--------|------|------|\n| POST   | `127.0.0.1:9880/tts` | 文字 + ref 音檔 → 語音 |\n| GET    | `127.0.0.1:9880/set_gpt_weights` | 切換 GPT 模型 |\n| GET    | `127.0.0.1:9880/set_sovits_weights` | 切換 SoVITS 模型 |\n\n---\n\n## 雙人 Podcast 角色設定\n\n| 角色 | 名稱 | 個性 |\n|------|------|------|\n| 主持 A | 小艾 | 好奇的學生視角，問出真正的疑惑 |\n| 主持 B | 大維 | 知識豐富的達人，用比喻和故事解釋 |\n\nLLM 會輪流輸出 `主持A：...` / `主持B：...`，後端解析後分別套用兩種音色合成。\n\n---\n\n## 已知限制\n\n- GPT-SoVITS 為 zero-shot，**最終音色取決於 ref 音檔**；若預設 ref 音檔品質普通，產生的語音也會普通\n- LLM 對「字數 = N 分鐘」的指令遵循度有限，實際長度可能與目標相差 2~3 倍（與所用模型強度有關）\n- YouTube 模式需網路連線下載音訊，耗時較長\n- v4 需 ≥ 6 GB VRAM；不足時請改用 v2（4 GB 即可，在 `GPT_SoVITS/configs/tts_infer.yaml` 切換）\n\n---\n\n## ⚠️ 套件版本相容性注意\n\n主後端與 GPT-SoVITS 各自 venv 隔離，互不干擾。已驗證組合：\n\n### 主後端 venv（runtime/venv）\n\n| 套件     | 版本     | 備註            |\n|----------|----------|-----------------|\n| fastapi  | latest   |                 |\n| uvicorn  | latest   | `[standard]` 變體 |\n| httpx    | latest   | 呼叫 GPT-SoVITS 用 |\n\n### GPT-SoVITS venv（runtime/gptsovits_venv）\n\n| 套件          | 版本         | 備註                              |\n|---------------|--------------|-----------------------------------|\n| torch         | 2.5.1+cu121  | NVIDIA：搭配 CUDA 12.1 wheel       |\n| torchaudio    | 2.5.1+cu121  | 必須與 torch 同版本                 |\n| 其餘 GPT-SoVITS 依賴 | 由其 `requirements.txt` 決定 | setup 腳本會自動安裝              |\n\n升級任何一個元件前，請先確認其餘元件仍能搭配。\n\n---\n\n## 變更紀錄\n\n- **v1.1.0（2026-05-20）**：\n  - **LLM 防幻覺**：新增 strict mode（溫度 0.4、可做/不可做清單、關閉自動補寫），PDF 內容上限由 6000 → 30000 字\n  - **PDF 智慧解析**：blocks + 雙欄偵測、頁首頁尾自動清理、Tesseract OCR fallback（掃描檔）、解析品質報告\n  - **PDF 預覽編輯**：前端可在生成前看到解析結果並編輯，避免錯誤被一路帶下去\n  - **Google Gemini 2.5 整合**：支援 flash / flash-lite / pro，可直讀 PDF（多模態），429 配額用完自動降級\n  - **YouTube 自動安裝**：yt-dlp、faster-whisper 加入 `requirements.txt` 與 `system_probe` 偵測\n- **2026-05-13**：TTS 引擎由 CosyVoice2-0.5B 換為 **GPT-SoVITS v4**（48 kHz、品質更好、原生 zero-shot）。新增 `setup_gptsovits.ps1` 一鍵安裝腳本。\n\n---\n\n## 授權\n\n本專案為個人作品，原始碼以 MIT 授權釋出。\n\n依賴元件各自的授權請參見：\n- [GPT-SoVITS](https://github.com/RVC-Boss/GPT-SoVITS) — MIT\n- [Faster-Whisper](https://github.com/SYSTRAN/faster-whisper) — MIT\n- [FastAPI](https://github.com/fastapi/fastapi) — MIT\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvincentchiou%2Ftts-voiceover-app","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fvincentchiou%2Ftts-voiceover-app","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fvincentchiou%2Ftts-voiceover-app/lists"}