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

内容目录

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 使用硬件,有独显可以换成 gpu
  • HF_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后缀


  • 海报
  • 打赏
  • 分享
海报图正在生成中...
分享到...
请选择打赏方式
  • 微信
  • 支付宝

发表回复

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