{"id":31580087,"url":"https://github.com/sheng1111/text2srt_tts","last_synced_at":"2025-10-05T21:06:39.490Z","repository":{"id":302463925,"uuid":"1012482627","full_name":"sheng1111/text2srt_tts","owner":"sheng1111","description":"Convert text to speech and auto-generate SRT subtitles. A CLI tool for creating synced audio and captions from plain text using multilingual TTS.","archived":false,"fork":false,"pushed_at":"2025-07-02T13:49:21.000Z","size":234,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-07-02T14:44:48.826Z","etag":null,"topics":["audiobook","batch-processing","caption","multilingual","speech-synthesis","srt","subtitle-generator","text-to-speech","tts","video-captioning"],"latest_commit_sha":null,"homepage":"","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/sheng1111.png","metadata":{"files":{"readme":"README-TW.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}},"created_at":"2025-07-02T11:58:40.000Z","updated_at":"2025-07-02T13:49:24.000Z","dependencies_parsed_at":"2025-07-02T14:44:50.627Z","dependency_job_id":"d9a58bd8-4147-40b6-a054-c28d2445f5b7","html_url":"https://github.com/sheng1111/text2srt_tts","commit_stats":null,"previous_names":["sheng1111/text2srt_tts"],"tags_count":1,"template":false,"template_full_name":null,"purl":"pkg:github/sheng1111/text2srt_tts","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sheng1111%2Ftext2srt_tts","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sheng1111%2Ftext2srt_tts/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sheng1111%2Ftext2srt_tts/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sheng1111%2Ftext2srt_tts/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sheng1111","download_url":"https://codeload.github.com/sheng1111/text2srt_tts/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sheng1111%2Ftext2srt_tts/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":278518900,"owners_count":26000177,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","status":"online","status_checked_at":"2025-10-05T02:00:06.059Z","response_time":54,"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":["audiobook","batch-processing","caption","multilingual","speech-synthesis","srt","subtitle-generator","text-to-speech","tts","video-captioning"],"created_at":"2025-10-05T21:06:38.183Z","updated_at":"2025-10-05T21:06:39.475Z","avatar_url":"https://github.com/sheng1111.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# text2srt_tts\n\n[![Version](https://img.shields.io/badge/Version-v1.1.3-blue.svg)](https://github.com/sheng1111/text2srt_tts)\n[![Python 3.9+](https://img.shields.io/badge/Python-3.9%2B-blue?style=flat-square\u0026logo=python)](https://www.python.org/)\n[![Streamlit](https://img.shields.io/badge/Streamlit-App-FF4B4B?style=flat-square\u0026logo=streamlit)](https://text2tts.streamlit.app)\n[![License: MIT](https://img.shields.io/badge/License-MIT-yellow.svg?style=flat-square)](https://opensource.org/licenses/MIT)\n[![Ask DeepWiki](https://deepwiki.com/badge.svg)](https://deepwiki.com/sheng1111/text2srt_tts)\n[![Docker](https://img.shields.io/badge/Docker-Supported-blue?style=flat-square\u0026logo=docker)](https://docker.com/)\n[![Open In Colab](https://colab.research.google.com/assets/colab-badge.svg)](https://colab.research.google.com/github/sheng1111/text2srt_tts/blob/main/colab_run.ipynb)\n\n一鍵將文字轉換為高品質語音（WAV \u0026 MP3）與精準字幕（SRT），並在現代化單頁式 Streamlit UI 中提供即時預覽和下載功能。具備智能文字分割、雙語言支援和側邊欄控制的增強使用者體驗。\n\n## 🆕 v1.1.3 新功能\n\n- **🎨 單頁式介面**：現代化側邊欄佈局，自動適應深色/淺色主題\n- **🧠 增強字幕生成**：先進的標點符號處理和智能文字分割\n- **🌐 雙語言支援**：繁體中文與英文間無縫切換\n- **📊 即時回饋**：即時字數統計、進度追蹤和狀態指示器\n- **🔧 改良 Docker**：優化容器化配置，包含健康檢查和持久化儲存\n- **💡 智能間距**：自動間距修正和標點符號保留選項\n- **🎛️ 側邊欄控制**：所有設定整理在可展開的側邊欄中，提供更好的工作流程\n\n## ✨ 核心功能\n\n### 🎤 文字轉語音 (TTS) 引擎\n\n- **預設引擎 (免費)**：`Edge TTS` - Microsoft Edge 內建語音合成，無需 API 金鑰\n- **高級引擎 (選用)**：`Azure Speech Service` - 專業級自然語音合成\n- **自動備援**：Azure 失敗時自動切換到 Edge TTS\n- **語音客製化**：可調整語速（-50% 到 +50%）、音調和音量參數\n- **詞邊界擷取**：精確的時間資訊，完美同步字幕\n\n### 📜 智能字幕生成\n\n- **智能文字分割**：考慮自然語言斷點和標點符號的進階演算法\n- **標點符號控制**：選擇是否在字幕中保留或移除標點符號\n- **間距優化**：自動修正標點符號和引號周圍的間距問題\n- **彈性行長度**：可配置的字幕行字數限制（20-80 字）\n- **自然斷點**：檢測句子結尾、轉折詞和語音停頓\n- **多語言支援**：針對中文和英文文字處理優化\n\n### 🖥️ 現代化單頁式介面\n\n- **側邊欄佈局**：所有設定整理在可展開的側邊欄中，提供清晰的工作流程\n- **主題自適應**：自動適應 Streamlit 的深色/淺色主題模式\n- **即時狀態**：即時字數統計、生成進度和狀態指示器\n- **雙語言介面**：在側邊欄中切換繁體中文和英文\n- **快速提示**：可展開的幫助區段，提供使用建議\n- **響應式設計**：針對各種螢幕尺寸和設備優化\n\n### 🚀 部署選項\n\n- **Streamlit 網頁應用**：具有側邊欄控制的互動式單頁介面\n- **增強 Docker**：優化的容器化配置，包含健康檢查和持久化卷\n- **Docker Compose**：完整的編排設定，包含網路和環境管理\n- **命令列介面**：自動化批次處理功能\n- **Google Colab**：無需本地設定的雲端執行\n\n## 📸 介面預覽\n\n### 單頁式佈局與側邊欄控制\n\n![現代化介面](docs/img/setting.png)\n\n### 生成結果與下載\n\n![結果介面](docs/img/result.png)\n\n## 🏗️ 專案架構\n\n```\ntext2srt_tts/\n├── app/\n│   ├── services/              # 核心業務邏輯\n│   │   ├── voice.py          # TTS 合成 (Azure \u0026 Edge)\n│   │   └── subtitle.py       # 增強字幕生成\n│   ├── ui/                   # 使用者介面元件\n│   │   └── gui.py           # 單頁式 Streamlit 應用\n│   ├── utils/               # 工具函式\n│   │   └── text_to_srt.py   # SRT 格式化工具\n│   └── cli/                 # 命令列介面\n│       └── __main__.py      # CLI 入口點\n├── locales/                 # 國際化\n│   ├── zh_TW.toml          # 繁體中文\n│   └── en.toml             # 英文\n├── docker/                  # Docker 配置\n├── docs/                    # 文件資源\n│   └── img/                # 截圖和圖片\n├── task/                    # 生成的輸出檔案\n│   └── {task_id}/          # 個別任務結果\n├── tests/                   # 單元測試\n├── Dockerfile              # 優化的 Docker 配置\n├── docker-compose.yml      # 完整編排設定\n├── .dockerignore           # Docker 建置優化\n├── config.example.toml      # 配置範本\n├── requirements.txt         # Python 依賴\n└── README.md               # 此檔案\n```\n\n## 🚀 快速開始\n\n### 1. 本地安裝\n\n```bash\n# 克隆儲存庫\ngit clone https://github.com/sheng1111/text2srt_tts.git\ncd text2srt_tts\n\n# 建立虛擬環境\npython3 -m venv .venv\nsource .venv/bin/activate  # Linux/macOS\n# .venv\\Scripts\\activate   # Windows\n\n# 安裝依賴\npip install -r requirements.txt\n\n# 啟動應用\nstreamlit run app/ui/gui.py\n```\n\n### 2. Docker 部署（推薦）\n\n#### 使用 Docker Compose 快速設定\n\n```bash\n# 克隆並進入專案目錄\ngit clone https://github.com/sheng1111/text2srt_tts.git\ncd text2srt_tts\n\n# 使用 Docker Compose 啟動\ndocker-compose up --build\n\n# 在 http://localhost:8501 存取應用\n```\n\n#### 手動 Docker 建置\n\n```bash\n# 建置映像\ndocker build -t text2srt_tts .\n\n# 執行容器\ndocker run -p 8501:8501 -v ./task:/app/task text2srt_tts\n\n# 使用環境變數\ndocker run -p 8501:8501 \\\n  -e AZURE_KEY=\"your-key\" \\\n  -e AZURE_REGION=\"your-region\" \\\n  -v ./task:/app/task \\\n  text2srt_tts\n```\n\n### 3. 配置（選用）\n\n```bash\n# 複製配置範本\ncp config.example.toml config.toml\n\n# 編輯配置檔案\n# - 添加 Azure 憑證以使用高級 TTS（選用）\n# - 配置語音選項和偏好設定\n# - 設定 FFmpeg 路徑（MP3 輸出需要）\n```\n\n## 🔧 配置選項\n\n### 語音設定\n\n在 `config.toml` 中配置可用語音：\n\n```toml\n[voices]\n\"中文女聲\" = { name = \"zh-CN-XiaoxiaoNeural\" }\n\"中文男聲\" = { name = \"zh-CN-YunxiNeural\" }\n\"英文女聲\" = { name = \"en-US-AriaNeural\" }\n\"英文男聲\" = { name = \"en-US-GuyNeural\" }\n\"日文女聲\" = { name = \"ja-JP-NanamiNeural\" }\n\"日文男聲\" = { name = \"ja-JP-KeitaNeural\" }\n```\n\n### Azure TTS 設定（選用）\n\n用於高級品質語音合成：\n\n```toml\nAZURE_KEY = \"your-azure-key\"\nAZURE_REGION = \"your-region\"\n```\n\n### Docker 環境變數\n\n在 `.env` 檔案中設定 Docker 部署變數：\n\n```bash\n# Azure TTS（選用）\nAZURE_KEY=your-azure-key\nAZURE_REGION=your-region\n\n# Streamlit 配置\nSTREAMLIT_SERVER_PORT=8501\nSTREAMLIT_SERVER_ADDRESS=0.0.0.0\n```\n\n## 💡 使用技巧\n\n### 單頁式介面\n\n- **側邊欄控制**：所有設定都整理在左側邊欄中\n- **主題適應**：介面自動適應您的 Streamlit 主題偏好\n- **語言切換**：使用側邊欄頂部的語言選擇器\n- **進度追蹤**：在主區域觀看生成過程的即時進度\n\n### 文字輸入最佳實務\n\n- 使用適當的標點符號來實現自然停頓\n- 保持句子清晰簡潔以獲得更好的分割\n- 避免過多特殊字符\n- 先用較短的文字測試以獲得最佳效果\n\n### 字幕優化\n\n- **標點符號保留**：在側邊欄切換是否保留或移除標點符號\n- **行長度**：根據內容類型調整（手機用 20-40，桌面用 40-80）\n- **自然斷點**：演算法自動檢測句子結尾和轉折詞\n- **間距控制**：自動修正標點符號和引號周圍的間距\n\n### 語音參數調整\n\n- **語速**：-50% 到 +50%（負值減慢，正值加快）\n- **音調**：-50% 到 +50%（負值降低，正值提高）\n- **音量**：-50% 到 +50%（負值降低，正值提高）\n\n## 🌐 多語言支援\n\n應用支援：\n\n- **介面語言**：繁體中文 (zh_TW)、英文 (en)\n- **文字處理**：針對中文和英文內容優化，包含適當的標點符號處理\n- **語音選項**：通過側邊欄選擇多種語言特定語音\n\n使用側邊欄的語言區段中的下拉選單切換語言。\n\n## 🐳 Docker 功能\n\n### 增強容器化\n\n- **多階段建置**：優化映像大小和更快的建置速度\n- **健康檢查**：應用健康狀態的自動監控\n- **非 root 使用者**：使用專用應用使用者增強安全性\n- **持久化儲存**：為生成檔案提供卷掛載\n- **環境管理**：通過環境變數完整配置\n\n### 生產就緒\n\n- **資源優化**：高效的記憶體和 CPU 使用\n- **自動重啟**：容器在失敗時自動重啟，除非手動停止\n- **網路隔離**：專用 Docker 網路提供安全性\n- **日誌管理**：結構化日誌用於監控和除錯\n\n## 📊 效能與限制\n\n### 效能特性\n\n- **處理速度**：每分鐘語音約 5-10 秒處理時間\n- **記憶體使用**：根據文字長度約 100-500MB\n- **儲存空間**：每分鐘生成內容約 1-5MB\n- **容器大小**：包含所有依賴的約 800MB Docker 映像\n\n### 目前限制\n\n- 最大文字長度：每次生成約 10,000 字\n- 支援的音訊格式：WAV（預設）、MP3（需要 FFmpeg）\n- 需要網路連線進行 TTS 合成\n- 側邊欄需要最小螢幕寬度以獲得最佳顯示\n\n## 🧪 測試\n\n執行測試套件：\n\n```bash\n# 啟動虛擬環境\nsource .venv/bin/activate\n\n# 執行所有測試\npytest\n\n# 執行特定測試模組\npytest tests/test_subtitle.py\npytest tests/test_voice.py\n\n# 執行覆蓋率測試\npytest --cov=app tests/\n```\n\n## 🤝 貢獻\n\n我們歡迎貢獻！請參閱貢獻指南：\n\n1. Fork 儲存庫\n2. 建立功能分支 (`git checkout -b feature/AmazingFeature`)\n3. 提交變更 (`git commit -m 'Add some AmazingFeature'`)\n4. 推送到分支 (`git push origin feature/AmazingFeature`)\n5. 開啟 Pull Request\n\n### 開發環境設定\n\n```bash\n# 安裝開發依賴\npip install -r requirements-dev.txt\n\n# 執行程式碼檢查\nflake8 app/\nblack app/\n\n# 執行類型檢查\nmypy app/\n\n# 本地測試 Docker 建置\ndocker build -t text2srt_tts:dev .\ndocker run -p 8501:8501 text2srt_tts:dev\n```\n\n## 📝 更新日誌\n\n### v1.1.3（目前版本）\n\n- 具有側邊欄控制的單頁式介面\n- 增強的 SRT 生成與標點符號處理\n- 主題自適應設計（深色/淺色模式支援）\n- 改良的 Docker 部署與健康檢查\n- 即時進度追蹤和狀態指示器\n- 更好的錯誤處理和使用者回饋\n- 優化的間距和文字處理演算法\n\n### v1.0.1\n\n- 初始版本，基本 TTS 和字幕生成\n- 分頁式 Streamlit 介面\n- Azure 和 Edge TTS 支援\n- 基本 Docker 部署\n\n## 📄 授權\n\n本專案採用 MIT 授權條款 - 詳情請參閱 [LICENSE](LICENSE) 檔案。\n\n## 🙏 致謝\n\n- **Microsoft Edge TTS**：免費語音合成服務\n- **Azure 認知服務**：高級 TTS 功能\n- **Streamlit**：現代化網頁應用框架\n- **Docker**：容器化平台\n- **Python 社群**：優秀的程式庫和工具\n\n## 📞 支援\n\n- **文件**：[GitHub Wiki](https://github.com/sheng1111/text2srt_tts/wiki)\n- **問題回報**：[GitHub Issues](https://github.com/sheng1111/text2srt_tts/issues)\n- **討論**：[GitHub Discussions](https://github.com/sheng1111/text2srt_tts/discussions)\n\n---\n\n**⭐ 為此專案加星** 如果它幫助您創建更好的字幕和語音內容！\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsheng1111%2Ftext2srt_tts","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsheng1111%2Ftext2srt_tts","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsheng1111%2Ftext2srt_tts/lists"}