gitextract_7v46ty1z/ ├── .github/ │ ├── ISSUE_TEMPLATE/ │ │ ├── 01_bug.yaml │ │ ├── 02_request.yaml │ │ └── 03_question.yaml │ └── workflows/ │ ├── claude-code-review.yml │ ├── claude.yml │ └── deploy-docs.yml ├── .gitignore ├── CHANGELOG.md ├── LICENSE ├── README.md ├── app/ │ ├── __init__.py │ ├── common/ │ │ ├── config.py │ │ └── signal_bus.py │ ├── components/ │ │ ├── DonateDialog.py │ │ ├── EditComboBoxSettingCard.py │ │ ├── FasterWhisperSettingWidget.py │ │ ├── LanguageSettingDialog.py │ │ ├── LineEditSettingCard.py │ │ ├── MySettingCard.py │ │ ├── MyVideoWidget.py │ │ ├── SimpleSettingCard.py │ │ ├── SpinBoxSettingCard.py │ │ ├── SubtitleSettingDialog.py │ │ ├── TranscriptionOutputDialog.py │ │ ├── TranscriptionSettingDialog.py │ │ ├── WhisperAPISettingWidget.py │ │ ├── WhisperCppSettingWidget.py │ │ └── transcription_setting_card.py │ ├── config.py │ ├── core/ │ │ ├── asr/ │ │ │ ├── __init__.py │ │ │ ├── asr_data.py │ │ │ ├── base.py │ │ │ ├── bcut.py │ │ │ ├── chunk_merger.py │ │ │ ├── chunked_asr.py │ │ │ ├── faster_whisper.py │ │ │ ├── jianying.py │ │ │ ├── status.py │ │ │ ├── transcribe.py │ │ │ ├── whisper_api.py │ │ │ └── whisper_cpp.py │ │ ├── constant.py │ │ ├── entities.py │ │ ├── llm/ │ │ │ ├── __init__.py │ │ │ ├── check_llm.py │ │ │ ├── check_whisper.py │ │ │ ├── client.py │ │ │ ├── context.py │ │ │ └── request_logger.py │ │ ├── optimize/ │ │ │ └── optimize.py │ │ ├── prompts/ │ │ │ ├── __init__.py │ │ │ ├── analysis/ │ │ │ │ └── video.md │ │ │ ├── optimize/ │ │ │ │ └── subtitle.md │ │ │ ├── split/ │ │ │ │ ├── semantic.md │ │ │ │ └── sentence.md │ │ │ └── translate/ │ │ │ ├── reflect.md │ │ │ ├── single.md │ │ │ └── standard.md │ │ ├── split/ │ │ │ ├── alignment.py │ │ │ ├── split.py │ │ │ └── split_by_llm.py │ │ ├── subtitle/ │ │ │ ├── README.md │ │ │ ├── __init__.py │ │ │ ├── ass_renderer.py │ │ │ ├── ass_utils.py │ │ │ ├── font_utils.py │ │ │ ├── rounded_renderer.py │ │ │ ├── styles.py │ │ │ └── text_utils.py │ │ ├── task_factory.py │ │ ├── translate/ │ │ │ ├── __init__.py │ │ │ ├── base.py │ │ │ ├── bing_translator.py │ │ │ ├── deeplx_translator.py │ │ │ ├── factory.py │ │ │ ├── google_translator.py │ │ │ ├── llm_translator.py │ │ │ └── types.py │ │ ├── tts/ │ │ │ ├── __init__.py │ │ │ ├── base.py │ │ │ ├── openai_fm.py │ │ │ ├── openai_tts.py │ │ │ ├── siliconflow.py │ │ │ ├── status.py │ │ │ └── tts_data.py │ │ └── utils/ │ │ ├── __init__.py │ │ ├── cache.py │ │ ├── logger.py │ │ ├── platform_utils.py │ │ ├── subprocess_helper.py │ │ ├── text_utils.py │ │ └── video_utils.py │ ├── thread/ │ │ ├── batch_process_thread.py │ │ ├── file_download_thread.py │ │ ├── modelscope_download_thread.py │ │ ├── subtitle_pipeline_thread.py │ │ ├── subtitle_thread.py │ │ ├── transcript_thread.py │ │ ├── version_checker_thread.py │ │ ├── video_download_thread.py │ │ ├── video_info_thread.py │ │ └── video_synthesis_thread.py │ └── view/ │ ├── batch_process_interface.py │ ├── home_interface.py │ ├── llm_logs_interface.py │ ├── log_window.py │ ├── main_window.py │ ├── setting_interface.py │ ├── subtitle_interface.py │ ├── subtitle_style_interface.py │ ├── task_creation_interface.py │ ├── transcription_interface.py │ └── video_synthesis_interface.py ├── docs/ │ ├── .vitepress/ │ │ ├── config.mts │ │ └── theme/ │ │ ├── CustomHome.vue │ │ ├── custom.css │ │ └── index.ts │ ├── README.md │ ├── config/ │ │ ├── asr.md │ │ ├── cookies.md │ │ ├── llm.md │ │ └── translator.md │ ├── dev/ │ │ ├── api.md │ │ ├── architecture.md │ │ ├── asr-chunk-merger.md │ │ ├── asr-chunked-usage.md │ │ ├── contributing.md │ │ ├── translate-module.md │ │ └── view-structure.md │ ├── en/ │ │ ├── config/ │ │ │ ├── asr.md │ │ │ ├── cookies.md │ │ │ ├── llm.md │ │ │ └── translator.md │ │ ├── dev/ │ │ │ ├── api.md │ │ │ ├── architecture.md │ │ │ └── contributing.md │ │ ├── guide/ │ │ │ ├── batch-processing.md │ │ │ ├── configuration.md │ │ │ ├── faq.md │ │ │ ├── getting-started.md │ │ │ ├── manuscript.md │ │ │ ├── subtitle-style.md │ │ │ └── workflow.md │ │ └── index.md │ ├── guide/ │ │ ├── configuration.md │ │ ├── cookies-config.md │ │ ├── faq.md │ │ ├── getting-started.md │ │ ├── llm-config.md │ │ ├── quick-example.md │ │ └── workflow.md │ ├── index.md │ ├── package-lock.json │ ├── package.json │ └── public/ │ ├── BingSiteAuth.xml │ └── robots.txt ├── legacy-docs/ │ ├── README_EN.md │ ├── README_JA.md │ ├── README_TW.md │ ├── about_chunk_merge.md │ ├── get_cookies.md │ ├── llm_config.md │ └── test.md ├── main.py ├── pyproject.toml ├── resource/ │ ├── assets/ │ │ └── qss/ │ │ ├── dark/ │ │ │ └── demo.qss │ │ └── light/ │ │ └── demo.qss │ ├── subtitle_style/ │ │ ├── default.json │ │ ├── default.txt │ │ ├── 毕导科普风.txt │ │ ├── 番剧可爱风.txt │ │ └── 竖屏.txt │ └── translations/ │ ├── VideoCaptioner_en_US.qm │ ├── VideoCaptioner_en_US.ts │ ├── VideoCaptioner_zh_CN.qm │ ├── VideoCaptioner_zh_CN.ts │ ├── VideoCaptioner_zh_HK.qm │ └── VideoCaptioner_zh_HK.ts ├── scripts/ │ ├── lint.sh │ ├── run.bat │ ├── run.sh │ ├── trans-compile.sh │ ├── trans-extract.sh │ └── translate_llm.py └── tests/ ├── README.md ├── __init__.py ├── conftest.py ├── fixtures/ │ └── README.md ├── test_asr/ │ ├── README.md │ ├── __init__.py │ ├── conftest.py │ ├── test_asr_data.py │ ├── test_bcut_asr.py │ ├── test_chunk_merger.py │ ├── test_chunked_asr.py │ ├── test_chunking.py │ ├── test_jianying_asr.py │ └── test_whisper_api_asr.py ├── test_optimize/ │ └── test_optimize.py ├── test_split/ │ ├── __init__.py │ ├── test_alignment.py │ ├── test_split.py │ ├── test_split_by_llm.py │ ├── test_split_core.py │ └── test_split_realistic.py ├── test_subtitle/ │ ├── __init__.py │ ├── conftest.py │ └── test_subtitle_thread.py ├── test_thread/ │ ├── __init__.py │ ├── conftest.py │ ├── test_subtitle_pipeline_thread.py │ ├── test_transcript_thread.py │ ├── test_video_info_thread.py │ └── test_video_synthesis_thread.py ├── test_translate/ │ ├── __init__.py │ ├── test_bing_translator.py │ ├── test_cache_validation.py │ ├── test_deeplx_translator.py │ ├── test_google_translator.py │ └── test_llm_translator.py └── test_tts/ ├── __init__.py ├── test_tts_core.py └── test_tts_integration.py