内容目录
subgen 介绍
subgen 使用了多语言语音识别模型 Whisper 模型的变种 faster-whisper 模型,比whisper要快4倍!而且内存占用更小,以至于目前家用平台即使没有独显,也能使用它通过cpu完美运行本地音频转录。
安装使用
docker 安装
若设备带有显卡,推荐使用<code>mccloud/subgen</code>,若设备不带显卡则推荐<code>mccloud/subgen:cpu</code>。
1. 需要修改的配置
- <code>WHISPER_MODEL</code> 为运算大小, 条件允许的情况,推荐<code>medium</code>
- <code>WHISPER_THREADS</code> cpu/gpu并发线程数, 根据设备情况自调
- <code>PLEXTOKEN</code> Plex 媒体服务器的访问令牌
- <code>PLEXSERVER</code> Plex 媒体服务器的地址
- <code>JELLYFINTOKEN</code> Jellyfin 媒体服务器的访问令牌
- <code>JELLYFINSERVER</code> Jellyfin 媒体服务器的地址
- <code>TRANSCRIBE_DEVICE</code> 使用硬件,有独显可以换成 gpu
- <code>HF_ENDPOINT</code> 此项为自行添加的,不是作者自带,由于国内环境,需要设置此项,使用国内加速地址
- <code>/share/soul/cinema/Downloads:/downloads</code> 此项映射地址需要与 Jellyfin 内的映射地址一致
- <code>subgen.py</code> 为项目启动文件,若想放到外部自行修改,则需在外部先行建立空文件。内容自行填写(GitHub 中复制)或修改环境变量<code>UPDATE=True</code>,进行更新
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核的I5-9400T的U,64G内存,Unraid系统,通过docker装好Subgen之后,发现给一个文件转到大约6~7分钟之后必会报错,然后重新开始,循环往复,无论用small还是medium,无论是几个线程,几个文件,报错那块的log信息如下:
Error running subgen.py: Command ‘[‘python3’, ‘-u’, ‘subgen.py’]’ died with .
subgen.env file not found. Consider running with –setup-bazarr or creating it manually.
subgen.py exists and UPDATE is set to False, skipping download.
Launching subgen.py
2026-01-27 23:09:55 INFO: Subgen v2026.01.22
2026-01-27 23:09:55 INFO: Threads: 3, Concurrent transcriptions: 2
2026-01-27 23:09:55 INFO: Transcribe device: cpu, Model: small
2026-01-27 23:09:55 INFO: Starting to search folders to see if we need to create subtitles.
2026-01-27 23:09:55 DEBUG: The folders are:
2026-01-27 23:09:55 DEBUG: /XXX
2026-01-27 23:09:55 DEBUG: ENV FORCE_DETECTED_LANGUAGE_TO is set: Forcing detected language to Chinese
然后就又重新开始。应该不是内存和硬盘空间不够吧?我看运行那会,CPU占用60~70%左右,内存还有10个多G的空闲。网上查了半天也没找到合理的解决方案。还有啥建议么?
看你的错误信息是缺少 subgen.env 这个配置文件,在 subgen.py 目录创建
WHISPER_MODEL=medium
WEBHOOKPORT=9000
TRANSCRIBE_DEVICE=cpu
DEBUG=True
CLEAR_VRAM_ON_COMPLETE=False
APPEND=False
INFO: 172.18.0.1:56362 – “POST /jellyfin HTTP/1.1” 422 Unprocessable Entity
jellyfin 的钩子需要增加请求头 : Content-Type application/json
Content-Type application/json添加以后就。。。
INFO: 172.18.0.1:42322 – “POST /jellyfin HTTP/1.1” 500 Internal Server Error
ERROR: Exception in ASGI application
INFO: 172.18.0.1:58352 – “POST /jellyfin HTTP/1.1” 200 OK
好了。。。参照其他教程多勾选了个选项。
INFO: 172.18.0.1:55340 – “POST /jellyfin HTTP/1.1” 200 OK
2026-03-03 04:53:35 DEBUG: Jellyfin event detected is: None
2026-03-03 04:53:35 DEBUG: itemid is: None
这是不是运行成功了,但是啥事没干的意思。。。
是的