AI字幕生成 subgen – 搭配Jellyfin或Plex 使用

内容目录

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. 成功触发后,半小时的视频差不多10分钟可以生成好一个字幕,文件带有subgen后缀


8 thoughts on “AI字幕生成 subgen – 搭配Jellyfin或Plex 使用

  1. 请问大佬,我是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的空闲。网上查了半天也没找到合理的解决方案。还有啥建议么?

    1. 看你的错误信息是缺少 subgen.env 这个配置文件,在 subgen.py 目录创建
      WHISPER_MODEL=medium
      WEBHOOKPORT=9000
      TRANSCRIBE_DEVICE=cpu
      DEBUG=True
      CLEAR_VRAM_ON_COMPLETE=False
      APPEND=False

      1. Content-Type application/json添加以后就。。。
        INFO: 172.18.0.1:42322 – “POST /jellyfin HTTP/1.1” 500 Internal Server Error
        ERROR: Exception in ASGI application

        1. INFO: 172.18.0.1:58352 – “POST /jellyfin HTTP/1.1” 200 OK
          好了。。。参照其他教程多勾选了个选项。

  2. 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
    这是不是运行成功了,但是啥事没干的意思。。。

回复 je 取消回复

您的邮箱地址不会被公开。 必填项已用 * 标注