内容目录
subgen 介绍
subgen 使用了多语言语音识别模型 Whisper 模型的变种 faster-whisper 模型,比whisper要快4倍!而且内存占用更小,以至于目前家用平台即使没有独显,也能使用它通过cpu完美运行本地音频转录。
安装使用
docker 安装
若设备带有显卡,推荐使用mccloud/subgen
,若设备不带显卡则推荐mccloud/subgen:cpu
。
1. 需要修改的配置
WHISPER_MODEL
为运算大小, 条件允许的情况,推荐medium
WHISPER_THREADS
cpu/gpu并发线程数, 根据设备情况自调PLEXTOKEN
Plex 媒体服务器的访问令牌PLEXSERVER
Plex 媒体服务器的地址JELLYFINTOKEN
Jellyfin 媒体服务器的访问令牌JELLYFINSERVER
Jellyfin 媒体服务器的地址TRANSCRIBE_DEVICE
使用硬件,有独显可以换成 gpuHF_ENDPOINT
此项为自行添加的,不是作者自带,由于国内环境,需要设置此项,使用国内加速地址/share/soul/cinema/Downloads:/downloads
此项映射地址需要与 Jellyfin 内的映射地址一致subgen.py
为项目启动文件,若想放到外部自行修改,则需在外部先行建立空文件。内容自行填写(GitHub 中复制)或修改环境变量UPDATE=True
,进行更新
docker-compose 内容
version: '2' services: subgen: container_name: subgen tty: true image: mccloud/subgen:cpu environment: - "WHISPER_MODEL=small" # 运算大小,越大运算越慢,但是翻译越精准 medium / small - "WHISPER_THREADS=1" # cpu/gpu并发线程数 nas 只有 2 - "PROCADDEDMEDIA=True" # 是否在新增媒体时触发工作 - "PROCMEDIAONPLAY=true" # 是否在媒体播放时触发工作 - "NAMESUBLANG=chi" # 需要生成的字幕文件语言后缀 - "SKIPIFINTERNALSUBLANG=chi" # 是否跳过已有中文字幕的视频 - "SKIPIFEXTERNALSUB=true" # 是否跳过带内嵌字幕的视频 - "PLEXTOKEN=plextoken" # Plex 媒体服务器的访问令牌 - "PLEXSERVER=http://plexserver:32400" # Plex 媒体服务器的地址 - "JELLYFINTOKEN=JellyfinToken" # Jellyfin 媒体服务器的访问令牌 - "JELLYFINSERVER=http://172.29.36.2:8096" # Jellyfin 媒体服务器的地址 - "WEBHOOKPORT=9000" # 服务端口 - "CONCURRENT_TRANSCRIPTIONS=1" # 同时转录的视频数 - "WORD_LEVEL_HIGHLIGHT=False" # 高亮显示某单词如同ktv字幕效果 - "DEBUG=True" # 开启DEBUG日志 - "USE_PATH_MAPPING=False" # 开启路径重映射 - "PATH_MAPPING_FROM=/media" # 容器中的媒体库路径 - "PATH_MAPPING_TO=/share/media" # NAS中的媒体库路径 - "FORCE_DETECTED_LANGUAGE_TO=zh" # 强制指定转录语言 - "TRANSCRIBE_OR_TRANSLATE=transcribe" # 一定要设置为 transcribe,仅转录 - "TRANSCRIBE_DEVICE=cpu" # 使用硬件,有独显可以换成 gpu - "CLEAR_VRAM_ON_COMPLETE=True" # 无任务时清除显存 - "MODEL_PATH=/subgen/models" # 模型保存路径,对应下面的映射 - "UPDATE=False" # 是否自动从git库更新程序,一些最新更改可能未包含在镜像中 - "APPEND=False" # 是否在字幕结尾添加 Whisper 文案 - "USE_MODEL_PROMPT=true" # 强制使用自定义提示词标点符号 - "CUSTOM_MODEL_PROMPT=你好,欢迎来到我的讲座。" # 自定义提示词 - "LRC_FOR_AUDIO_FILES=True" # 是否为音频文件生成歌词(LRC 文件) - "CUSTOM_REGROUP=cm_sl=84_sl=42++++++1" # 优化字幕格式 - "SUBGEN_KWARGS={'vad': True,'prompt_reset_on_temperature': 0.35}" # 使用VAD避免幻听,提示前缀避免语言重置 - "DETECT_LANGUAGE_LENGTH=30" # 检测视频语言的时间长度(秒) - "MONITOR=True" # 是否启用文件夹监控 - "TRANSCRIBE_FOLDERS=/downloads" # 需要监控并生成字幕的文件夹路径 - "COMPUTE_TYPE=auto" # 自动选择使用 CPU 或 GPU - "RELOAD_SCRIPT_ON_CHANGE=false" # 是否在检测到脚本更改时自动重载 - "SKIP_LANG_CODES=" # 跳过指定语言的视频字幕生成(为空表示不跳过任何语言) - "HF_ENDPOINT=https://hf-mirror.com" #国内需要设置模型加速地址 volumes: - /share/soul/cinema/Downloads:/downloads #映射目录路径要保持一致(/media:/media),否则需要配置重映射 - /share/soul/subgen/models:/subgen/models #模型目录 - /share/soul/subgen/subgen.py:/subgen/subgen.py # 文件映射 需要在外部建立同名空文件,内容自填,或 使用UPDATE=True ports: - "9000:9000" # 映射服务端口
2. 通过Jellyfin插件目录安装自带的Webhook插件,重启Jellyfin
3. 添加一个Add Generic Destination(通用钩子),填写subgen服务的地址,并勾选Item Add(媒体添加)和Playback Start(媒体播放)两个事件
4. 最后再添加一个请求头: Content-Type application/json,保存即可
5. 然后我们随便播放一个Jellyfin中的视频,看subgen日志是否成功触发,看到带’/jellyfin’的日志记录说明成功,比如下面是因为内嵌字幕所以跳过的日志:
INFO:root:/downloads/movie/Rebel Moon - Part One A Child of Fire (2023)/Rebel Moon - Part One A Child of Fire (2023) WEBDL-2160p HDR.mkv already has an internal subtitle we want, skipping generation INFO:root:Metadata refresh queued successfully. INFO:root:Metadata for item 4573c2b5fa21675fbc7e2c490540ca72 refreshed successfully. INFO: 172.20.0.7:46548 - "POST /jellyfin HTTP/1.1" 200 OK
6. 成功触发后,半小时的视频差不多10分钟可以生成好一个字幕,文件带有subgen后缀
- 海报
- 打赏
- 分享
分享到...

请选择打赏方式



- 微信
- 支付宝