From 7ca2a4c76eb052dcefde4cac4ce68f98f295c6fb Mon Sep 17 00:00:00 2001 From: John Howe <89397553+timerring@users.noreply.github.com> Date: Thu, 3 Apr 2025 18:41:35 +0800 Subject: [PATCH] chore: add logs --- README.md | 26 +++++++++++--------------- src/config.py | 4 +++- src/subtitle/subtitle_generator.py | 2 ++ 3 files changed, 16 insertions(+), 16 deletions(-) diff --git a/README.md b/README.md index 2d40192..dff1c7a 100644 --- a/README.md +++ b/README.md @@ -34,7 +34,7 @@ - **检测片段并合并**:对于网络问题或者直播连线导致的视频流分段,能够自动检测合并成为完整视频。 - **自动渲染弹幕**:自动转换xml为ass弹幕文件,该转换工具库已经开源 [DanmakuConvert](https://github.com/timerring/DanmakuConvert) 并且渲染到视频中形成**有弹幕版视频**并自动上传。 - **硬件要求极低**:无需GPU,只需最基础的单核CPU搭配最低的运存即可完成录制,弹幕渲染,上传等等全部过程,无最低配置要求,10年前的电脑或服务器依然可以使用! -- **( :tada: NEW)自动渲染字幕**(如需使用本功能,则需保证有 Nvidia 显卡):采用 OpenAI 的开源模型 [`whisper`](https://github.com/openai/whisper),自动识别视频内语音并转换为字幕渲染至视频中。 +- **( :tada: NEW)自动渲染字幕**:采用 OpenAI 的开源模型 `whisper`,自动识别视频内语音并转换为字幕渲染至视频中。 - **( :tada: NEW)自动切片上传**:根据弹幕密度计算寻找高能片段并切片,该自动切片工具库已开源 [auto-slice-video](https://github.com/timerring/auto-slice-video),结合多模态视频理解大模型自动生成有意思的切片标题及内容,并且自动上传,目前已经支持的模型有: - `GLM-4V-PLUS` - `Gemini-2.0-flash` @@ -100,16 +100,14 @@ graph TD > [!IMPORTANT] > 凡是用到 GPU 均需保证 GPU 显存大于运行程序所需 VRAM,具体计算 VRAM 方法可以参考[该部分](https://timerring.github.io/bilive/models.html#计算-vram-需求)。 -### Installation(有 GPU 版本) - -> 是否有 GPU 以 `nvidia-smi` 显示 nvidia GPU 驱动以及 `nvcc -V` 显示 `CUDA` 版本号为准。如果未配置显卡驱动或未安装 `CUDA`,即使有 GPU 也无法使用,而会使用 CPU 推理(不推荐,可根据自身硬件条件判断是否尝试 CPU 推理)。 +### Installation > [!TIP] > 如果你是 windows 用户,请使用 WSL 运行本项目。 #### 0. clone 项目 -由于项目引入了我写的两个 submodule [DanmakuConvert](https://github.com/timerring/DanmakuConvert) 和 [auto-slice-video](https://github.com/timerring/auto-slice-video),因此推荐 clone 项目时就更新 submodules。 +由于项目引入了我写的 submodule [DanmakuConvert](https://github.com/timerring/DanmakuConvert),[bilitool](https://github.com/timerring/bilitool) 和 [auto-slice-video](https://github.com/timerring/auto-slice-video),因此推荐 clone 项目时就更新 submodules。 ```bash git clone --recurse-submodules https://github.com/timerring/bilive.git @@ -121,7 +119,7 @@ git clone --recurse-submodules https://github.com/timerring/bilive.git git submodule update --init --recursive ``` -#### 1. 安装依赖(推荐先 `conda` 创建虚拟环境) +#### 1. 安装依赖(推荐创建虚拟环境) ``` cd bilive @@ -148,14 +146,15 @@ pip install -r requirements.txt 将 `src/config.py` 文件中的 `ASR_METHOD` 参数设置为 `api`,然后填写 `WHISPER_API_KEY` 参数为你的 [API Key](https://console.groq.com/keys)。本项目采用 groq 提供 free tier 的 `whisper-large-v3-turbo` 模型,上传限制为 40 MB(约半小时),因此如需采用 api 识别的方式,请将视频录制分段调整为 30 分钟。此外,free tier 请求限制为 7200秒/20次/小时,28800秒/2000次/天。如果有更多需求,也欢迎升级到 dev tier,更多信息见[groq 官网](https://console.groq.com/docs/rate-limits)。 -##### 3.1.2 采用本地部署方式 +##### 3.1.2 采用本地部署方式(需保证有 NVIDIA 显卡) 将 `src/config.py` 文件中的 `ASR_METHOD` 参数设置为 `deploy`,然后下载所需模型文件,并放置在 `src/subtitle/models` 文件夹中。 项目默认采用 [`small`](https://openaipublic.azureedge.net/main/whisper/models/9ecf779972d90ba49c06d968637d720dd632c55bbf19d441fb42bf17a411e794/small.pt) 模型,请点击下载所需文件,并放置在 `src/subtitle/models` 文件夹中。 > [!TIP] -> 使用该参数模型至少需要保证有显存大于 2.7GB 的 GPU,否则请使用其他参数量的模型。 +> + 请保证 NVIDIA 显卡驱动安装正确 `nvidia-smi` `nvcc -V`,并能够调用 CUDA 核心 `print(torch.cuda.is_available())` 返回 `True`。如果未配置显卡驱动或未安装 `CUDA`,即使有 GPU 也无法使用,而会使用 CPU 推理,非常消耗 CPU 计算资源,不推荐,如果 CPU 硬件条件好可以尝试。 +> + 使用该参数模型至少需要保证有显存大于 2.7GB 的 GPU,否则请使用其他参数量的模型。 > + 更多模型请参考 [whisper 参数模型](https://timerring.github.io/bilive/models.html) 部分。 > + 更换模型方法请参考 [更换模型方法](https://timerring.github.io/bilive/models.html#更换模型方法) 部分。 @@ -246,18 +245,15 @@ logs # 日志文件夹 └── runtime # 每次执行的日志 └── ... ``` - -### Installation(无 GPU 版本) -无 GPU 版本过程基本同上,可以跳过步骤 3 配置 whisper 的部分,需要注意在执行步骤 5 **之前**完成以下设置将确保完全用 CPU 渲染视频弹幕。 - -1. 请将 `src/config.py` 文件中的 `GPU_EXIST` 参数设置为 `False`。(若置为 `True` 但又没有 GPU 或者 Nvidia 驱动找不到,则会使用 CPU 推理,非常消耗 CPU 计算资源,不推荐,可自行根据硬件条件进行尝试。) -2. 将 `MODEL_TYPE` 调整为 `merge` 或者 `append`。 +#### 8. 配置上传参数 > [!TIP] > 上传默认参数如下,[]中内容全部自动替换。可以在 `src/config.py` 中自定义相关配置,映射关键词为 `{artist}`、`{date}`、`{title}`、`{source_link}`,可自行组合删减定制模板: > + 标题模板是`{artist}直播回放-{date}-{title}`,效果为"【弹幕+字幕】[XXX]直播回放-[日期]-[直播间标题]",可自行修改。 > + 简介模板是`{artist}直播,直播间地址:{source_link} 内容仅供娱乐,直播中主播的言论、观点和行为均由主播本人负责,不代表录播员的观点或立场。`,效果为"【弹幕+字幕】[XXX]直播,直播间地址:[https://live.bilibili.com/XXX] 内容仅供娱乐,直播中主播的言论、观点和行为均由主播本人负责,不代表录播员的观点或立场。",可自行修改。 -> + 默认标签是根据主播名字自动在 b 站搜索推荐中抓取的[热搜词],详见[bilibili-API-collect](https://github.com/SocialSisterYi/bilibili-API-collect/blob/master/docs/search/suggest.md)。 +> + 默认标签是根据主播名字自动在 b 站搜索推荐中抓取的热搜词。 +> + `GIFT_PRICE_FILTER = 1` 表示过滤价格低于 1 元的礼物。 +> + `RESERVE_FOR_FIXING = False` 表示如果视频出现错误,重试失败后不保留视频用于修复,推荐硬盘空间有限的用户设置 False。 ### Docker 运行 diff --git a/src/config.py b/src/config.py index 7180e93..cffad33 100644 --- a/src/config.py +++ b/src/config.py @@ -15,8 +15,10 @@ MODEL_TYPE = "append" # WARNING!: If you choose "deploy" local inference: # 1. Please check the VRAM requirements twice! # 2. Please make sure you have installed the Nvidia GPU driver and can check the cuda via `nvcc -V`! +# WARNING!: If you choose "api": +# due to the limitation of free tier, you should keep every video less than 30 minutes(around) +# which means your MODEL_TYPE should not be "merge". ASR_METHOD = "none" # can be "deploy" or "api" or "none" -# If you choose "api", due to the limitation of free tier, you should keep every video less than 30 minutes(around) # Apply for your own API key at https://console.groq.com/keys WHISPER_API_KEY = "" # If you choose "deploy", you should download the model from https://huggingface.co/openai/whisper-large-v3-turbo diff --git a/src/subtitle/subtitle_generator.py b/src/subtitle/subtitle_generator.py index 1b09758..e5c8bf5 100644 --- a/src/subtitle/subtitle_generator.py +++ b/src/subtitle/subtitle_generator.py @@ -18,6 +18,7 @@ def subtitle_generator(asr_method): def wrapper(video_path): if asr_method == "api": from .api.whisper_sdk import generate_srt + scan_log.info(f"Generate subtitles via whisper api") return generate_srt(video_path) elif asr_method == "deploy": try: @@ -25,6 +26,7 @@ def subtitle_generator(asr_method): ['python', os.path.join(SRC_DIR, 'subtitle', 'generate.py'), video_path], stdout=subprocess.DEVNULL ) + scan_log.info(f"Generate subtitles via whisper deploy") return video_path[:-4] + ".srt" except subprocess.CalledProcessError as e: scan_log.error(f"Generate subtitles failed: {e.stderr}")