NAS最佳实践——Jellyfin/Emby最强字幕插件组合
本文最后更新于 152 天前,其中的信息可能已经有所发展或是发生改变。

前言:我们通过BT下载的影视资源经常会遇到不带字幕的情况,Jellyfin自带只有一个Open Subtitles的字幕插件,对中文影视和字幕匹配率很低,这次就几个非常强大字幕插件,完成99.9%的影视字幕自动下载和生成!(Jellyfin和Emby都可以使用哦)

在安装插件前,推荐先将官方的插件库(Jellyfin Stable)地址更换为更快的官方镜像地址,可以在官方镜像列表网站找到:https://repo.jellyfin.org/files/plugin/manifest-stable.json?mirrorlist

MeiamSubtitles

热门影视字幕下载

项目地址

https://github.com/91270/MeiamSubtitles

介绍

MeiamSubtitles是一款github高达1.4k收藏的中文字幕插件,这款插件能够自动从迅雷影音和射手网两大渠道匹配字幕,自动下载,亲测能覆盖绝大多数国内外热门的影视剧。

安装使用

这里介绍jellyfin的安装方式,其它方式参考项目文档,下同

  1. 在Jellyfin控制台打开插件-存储库,点击加号

  2. 填写存储库的URLhttps://github.com/91270/MeiamSubtitles.Release/raw/main/Plugin/manifest-stable.json,再随便起个名字

  3. 返回插件-目录,需要加载一会,就可以在里面找到MeiamSubtitles

  4. 第一个是迅雷影视搜索,第二个是射手网,点击安装即可

  5. 回到媒体库设置,选择你需要自动匹配的媒体库进行设置

  6. 确认字幕下载语言选择Chinese(繁体和香港会被自动勾选),然后在下面勾选MeiamSub的两个下载器,在下面的字幕下载规则选只下载完美匹配的字幕跳过带内嵌字幕的视频避免下载多余字幕

  7. 之后插件会按照计划任务中的下载缺少的字幕的时间配置运行自动下载

  8. 后续也可以在媒体库中手动通过此插件执行搜索下载


Danmu

动漫剧集弹幕下载

项目地址

Jellyfin: https://github.com/cxfksword/jellyfin-plugin-danmu
Emby: https://github.com/fengymi/emby-plugin-danmu

介绍

你绝对想不到,私有化部署的媒体中心居然也能看弹幕?!众所周知,看番没有弹幕总感觉少点什么,这下舒服了。

安装使用

  1. 和刚才一样,在插件存储库中添加此插件的地址,在目录中安装

    国内加速:https://mirror.ghproxy.com/https://github.com/cxfksword/jellyfin-plugin-danmu/releases/download/manifest/manifest_cn.json
    国外访问:https://github.com/cxfksword/jellyfin-plugin-danmu/releases/download/manifest/manifest.json

  2. 在插件设置中勾选想要的弹幕来源网站,同时勾选最下方的同时生成ASS格式弹幕


  3. 因为默认生成的是xml格式弹幕文件,只有特定播放器才支持,强烈推荐国内大佬开发的Switchfin,而同时生成ASS格式可以让Jellyfin等播放器也支持,但缺点是ass弹幕和字幕观看时只能二选一

  4. 【可选】之后我们可以配置自动扫描匹配弹幕的任务,默认是关闭的(因为自动匹配率低)

  5. 由于弹幕是从各大视频网站匹配番剧名称的,而不是themvdb-id,因此匹配不是很精准,一般在番剧导入后手动搜索选择弹幕


MetaTube

不可描述电影刮削插件

项目地址

https://metatube-community.github.io/wiki/plugin-installation/

介绍

Jellyfin等一众媒体库默认使用TMDb、TvDb来匹配刮削影视信息,这两个库里是没有不可描述影视信息的,那么除非我们下载的资源就带有做种者刮削好的信息,否则媒体库会很难看。
而这个插件正是通过一些专门的信息库完美解决了这一问题,虽然它并没有匹配字幕的功能,但是他可以自动为有字幕的电影封面加上字幕icon的功能,甚至还有人脸识别,因此也在此处介绍

安装使用

  1. 通过docker安装metatube服务端,推荐与jellyfin在同一个docker网络中(替换${xx}内容为你的)

    metatube:
    image: metatube/metatube-server:latest
    container_name: metatube
    restart: unless-stopped
    ports:
      - ${对外的端口}:8080
    depends_on:
      - postgres
    environment:
      - TZ=Asia/Shanghai
    volumes:
      - ${配置存放路径}/metatube/run:/var/run
    command: -dsn "postgres://metatube:metatube@/metatube?host=/var/run/postgresql" -port 8080 -token "${定义一个你的token}" -db-auto-migrate -db-prepared-stmt
    
    postgres:
    image: postgres:15-alpine
    container_name: metatube-postgres
    restart: unless-stopped
    environment:
      - TZ=Asia/Shanghai
      - POSTGRES_USER=metatube
      - POSTGRES_PASSWORD=metatube
      - POSTGRES_DB=metatube
    volumes:
      - ${配置存放路径}/metatube/db:/var/lib/postgresql/data
      - ${配置存放路径}/metatube/run:/var/run
  2. 启动服务端后在Jellyfin插件库中添加存储库并在目录中安装

    国内加速:https://cdn.jsdelivr.net/gh/metatube-community/jellyfin-plugin-metatube@dist/manifest.json
    国外使用:https://raw.githubusercontent.com/metatube-community/jellyfin-plugin-metatube/dist/manifest.json

  3. 插件配置中填写刚才部署的服务端地址和token,注意在手动搜索匹配时展示图片会使用metatube的地址,所以一定要填写metatube的外部访问地址,至少是内网地址,https的公网地址最好

  4. 由于这类电影基本都是外语,我们还可以给插件设置内容简介翻译功能,支持Baidu/Google/OpenAi

    百度个人每月有50万字的免费额度,可以自行申请:https://api.fanyi.baidu.com/api/trans/product/desktop?req=detail , 其它则需要有科学上网的能力

  5. 最后也是在计划任务中配置好定时运行即可


Subgen (终极大杀器)

本地AI翻译字幕

项目地址

https://github.com/McCloudS/subgen

介绍

上面介绍的插件虽然能匹配大部分热门的影视字幕,但是前提是依赖的字幕网站中有别人制作上传过的字幕,像一些冷门的影视全网都搜不到字幕这时候怎么办呢,那就轮到高科技大炮“AI”上场了!
我们熟悉的OpenAI虽然不干人事,对国内越来越不友好,但是OpenAI在此之前开源了一个非常牛逼的项目Whisper,是一个多语言语音识别模型,尤其对英语的识别准确率极高,之后又有大佬使用更高效的CTranslate2对其重新实现,生成了faster-whisper模型,比whisper要快4倍!而且内存占用更小,以至于目前家用平台即使没有独显,也能使用它通过cpu完美运行本地音频转录。
然后现在要介绍的这位国外McCloudS大佬为了自己看视频方便,随手搓了这个项目,将faster-whisper与jellyfin等媒体应用集成,自动完成字幕生成(subtitle generate)

安装使用

  1. 还是docker-compose部署

    subgen:
    container_name: subgen
    tty: true
    image: mccloud/subgen
    environment:
      - "DEBUG=True"
      - "TRANSCRIBE_DEVICE=cpu"
      - "WHISPER_MODEL=medium" #实测cpu使用medium即可,如果性能不够可以试试small
      - "MODEL_PATH=./models" #模型路径,映射到外部路径避免重建丢失
      - "CONCURRENT_TRANSCRIPTIONS=1" #同时转录的视频数
      - "WHISPER_THREADS=6" #并发线程数
      - "TRANSCRIBE_OR_TRANSLATE=transcribe" #不可修改
      - "WORD_LEVEL_HIGHLIGHT=False"
      - "PROCESS_ADDED_MEDIA=True" #允许新增媒体触发
      - "PROCESS_MEDIA_ON_PLAY=False" #允许播放事件触发
      - "JELLYFIN_TOKEN=***"
      - "JELLYFIN_SERVER=http://jellyfin:8096"
      - "WEBHOOKPORT=9000"
      - "USE_PATH_MAPPING=False" #如果容器内外媒体路径不一致则需要添加映射
      - "PATH_MAPPING_FROM=/media/serial"
      - "PATH_MAPPING_TO=/media/serial"
      - "MONITOR=True" #开启文件夹监听,新视频自动触发,用于无需jellyfin事件的场景
      - "TRANSCRIBE_FOLDERS=/media/自媒体" #监听文件夹目录
      - "LRC_FOR_AUDIO_FILES=True" #自动转录歌词
      - "FORCE_DETECTED_LANGUAGE_TO=chi"  #强制指定所有视频语言,用于转录为中文并跳过中文字幕,必须设置,以下跳过判断按先后顺序执行
      - "SKIP_UNKNOWN_LANGUAGE=False" #跳过无语言信息,强制指定语言后无效
      - "SKIP_IF_TARGET_SUBTITLES_EXIST=True" #跳过中文内置或外置字幕,默认true
      - "SKIP_IF_INTERNAL_SUBTITLES_LANGUAGE=" #跳过其他内置字幕语言
      - "SKIP_IF_NO_LANGUAGE_BUT_SUBTITLES_EXIST=True" #跳过存在无语言信息的内置字幕,仅SKIP_IF_INTERNAL_SUBTITLES_LANGUAGE为空时有效
      - "SKIP_ONLY_SUBGEN_SUBTITLES=False" #仅跳过外置字幕语言
      - "SKIP_IF_EXTERNAL_SUBTITLES_EXIST=False" #跳过由SUBTITLE_LANGUAGE_NAME指定的外置字幕语言,默认false
      - "SUBTITLE_LANGUAGE_NAME=" #除外置字幕判断外,用于强制指定生成的字幕文件名语言部分
      - "SKIP_SUBTITLE_LANGUAGES=" #跳过其他内置字幕语言
      - "LIMIT_TO_PREFERRED_AUDIO_LANGUAGE=False" #限制可执行的音频语言,由PREFERRED_AUDIO_LANGUAGES指定
      - "PREFERRED_AUDIO_LANGUAGES=jpn|kor|eng" #优先选取的音频语言,强制指定语言后无效
      - "SKIP_IF_AUDIO_LANGUAGES=chi" #跳过指定的音频语言列表
      - "SHOULD_WHISPER_DETECT_AUDIO_LANGUAGE=False" #是否AI检测音频语言,强制指定语言后无效
      - "SUBGEN_KWARGS={'vad': True,'prompt_reset_on_temperature': 0.5,'condition_on_previous_text': True}" #调优参数
    volumes:
      - ${你的媒体库所在目录}:/media #映射目录路径要保持一致(/media:/media),否则需要配置重映射
      - ${配置保存目录}/subgen/models:/subgen/models #模型目录
      #- ${CONFIG_PATH}/subgen/subgen.py:/subgen/subgen.py #如果你要修改程序则指定路径
    ports:
       - 40221:9000
  2. 通过Jellyfin插件目录安装自带的Webhook插件,重启Jellyfin

  3. 添加一个通用钩子,填写subgen服务的地址,并勾选Item Add(媒体添加)和Playback Start(媒体播放)两个事件

  4. 再勾选Movies Episodes Season Series等你要生成字幕的媒体类型,实测电视剧集类型也是Movies,建议都勾上吧

  5. 最后再添加一个请求头: Content-Type application/json,保存即可

  6. 然后我们随便播放一个Jellyfin中的视频,看subgen日志是否成功触发,看到带’/jellyfin’的日志记录说明成功,比如下面是因为内嵌字幕所以跳过的日志:

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

  8. 由于whisper并没有官方支持英语翻译为别的语种,模型训练语料基本三分之二都是英语,所以会出现有些片段变回英文的情况,大家可以自行研究下模型参数调优,或者删除重新生成(挖个坑,我正在开发通过其他翻译接口来翻译英文转录字幕的方式,如果测试效果会开源出来)

总结

总之,通过上面介绍的几个插件,Jellyfin几乎可以胜任任何类型的适配字幕匹配了,这才是科技该有的样子啊,Fucking closed-source!
欢迎关注我的小红书账号,持续分享更多NAS最佳实践:
4384174891 赛博蓝猫

评论

  1. Yan
    2 年前
    2024-8-18 23:23:45

    感谢分享,很棒的博客, 有空出篇博客的搭建教程啊

    • 博主
      Yan
      2 年前
      2024-8-19 10:34:52

      哈哈谢谢你的肯定,之后会出的

  2. juway
    2 年前
    2024-8-21 14:29:10

    2024/08/21 14:23:25 stdout INFO:root:Error processing or transcribing /video/硬链接/电视剧/西部世界 (2016)/Season 1/西部世界 – S01E01 – 起源.mp4: Unable to open file ‘model.bin’ in model ‘/subgen/models/models–Systran–faster-whisper-medium/snapshots/08e178d48790749d25932bbc082711ddcfdfbc4f’
    2024/08/21 14:23:25 stdout WARNING:faster_whisper:Trying to load the model directly from the local cache, if it exists.
    2024/08/21 14:23:25 stdout (MaxRetryError(“HTTPSConnectionPool(host=’huggingface.co’, port=443): Max retries exceeded with url: /api/models/Systran/faster-whisper-medium/revision/main (Caused by SSLError(SSLError(1, ‘[SSL] unknown error (_ssl.c:1007)’)))”), ‘(Request ID: 9031bba8-7107-48c1-be4d-fabfef0fbdcb)’)
    2024/08/21 14:23:25 stdout WARNING:faster_whisper:An error occured while synchronizing the model Systran/faster-whisper-medium from the Hugging Face Hub:
    2024/08/21 14:23:24 stdout [32mINFO[0m: 172.24.0.1:34628 – “[1mPOST /jellyfin HTTP/1.1[0m” [32m200 OK[0m
    2024/08/21 14:23:24 stdout INFO:root:Metadata for item c4d027239c1455c851347f0c35d00f2f refreshed successfully.
    2024/08/21 14:23:24 stdout INFO:root:Metadata refresh queued successfully.
    2024/08/21 14:23:24 stdout INFO:root:Transcribing file: 西部世界 – S01E01 – 起源.mp4
    2024/08/21 14:23:24 stdout INFO:root:Added 西部世界 – S01E01 – 起源.mp4 for transcription.
    2024/08/21 14:23:15 stdout [32mINFO[0m: Uvicorn running on [1mhttp://0.0.0.0:9000[0m (Press CTRL+C to quit)
    ai字幕的,提示这个怎么办?

    • 阿良
      juway
      2 年前
      2024-8-21 15:08:45

      模型下载失败,开代理

      • juway
        阿良
        2 年前
        2024-8-21 23:02:03

        已经有代理了,还是失败

      • juway
        阿良
        2 年前
        2024-8-21 23:10:53

        有没有模型可以直接下载到本地的方法 ?而不是用它下载?

      • juway
        阿良
        2 年前
        2024-8-21 23:20:03

        问题出在这里,应该是

        • “MODEL_PATH=./models” # 模型保存路径,对应下面的映射

        而不是

        • “MODEL_PATH=/subgen/models” #模型保存路径,对应下面的映射
        • 阿良
          juway
          2 年前
          2024-8-22 10:02:30

          和你映射给容器的模型目录一样就行,保存到容器外避免每次重建需要重新下载模型

          • juway
            阿良
            2 年前
            2024-8-22 14:24:29

            就是需要设置成

            • “MODEL_PATH=./models” # 模型保存路径,对应下面的映射
            • ${配置保存目录}/subgen/models:/subgen/models #模型目录

            这样子,才能正确下载,我是看原作者的compose才发现,你的这个写法,反正我测试是一直下不了模型,按照我上面的设置就可以正常下载了

          • 阿良
            juway
            2 年前
            2024-8-22 14:35:31

            无非就是基于subgen.py所在路径的绝对路径和相对路径,你是不是把subgen.py的路径也改了

  3. juway
    2 年前
    2024-8-21 23:42:33

    好了,现在可以生成字幕了,但是没有中文

    • juway
      juway
      2 年前
      2024-8-22 0:02:15

      好了。重构一次容器,又变成中文了,感谢UP分享

    • juway
      juway
      2 年前
      2024-8-22 0:09:39

      有些电影他还是英文,有些是中文,暂时不明白具体什么原因

      • 阿良
        juway
        2 年前
        2024-8-22 10:04:43

        有时候出现太多英文人名之类的会使下个片段提示上文变英文

  4. Jioani
    2 年前
    2024-8-30 14:34:40

    我配置好了,但是models里面没有模型文件,挂了代理,是怎么回事

  5. RHFOTO
    2 年前
    2024-8-31 15:23:50

    File subgen.env not found. Environment variables not set.
    大佬 日志提示这个怎么办?

  6. zZZ
    已编辑
    1 年前
    2024-11-01 17:34:12

    DEBUG: Model was purged, need to re-create,这个怎么处理

  7. WWW
    1 年前
    2024-11-23 2:29:50

    使用这个一键启动,楼主的脚本有问题,不有天坑
    docker run -d
    –name subgen
    -p 40221:9000
    -v /mnt/smb:/mnt/smb
    -v /home/docker_config/subgen/models:/subgen/models
    -e JELLYFINTOKEN=5802f0abe99847a286c341f7c147cccxx1
    -e JELLYFINSERVER=http://192.168.2.7:8096/
    -e WHISPER_MODEL=medium
    -e WHISPER_THREADS=3
    -e PROCADDEDMEDIA=True
    -e PROCMEDIAONPLAY=True
    -e NAMESUBLANG=chi
    -e SKIPIFINTERNALSUBLANG=chi
    -e SKIPIFEXTERNALSUB=True
    -e WEBHOOKPORT=9000
    -e CONCURRENT_TRANSCRIPTIONS=2
    -e WORD_LEVEL_HIGHLIGHT=False
    -e DEBUG=True
    -e USE_PATH_MAPPING=False
    -e FORCE_DETECTED_LANGUAGE_TO=zh
    -e TRANSCRIBE_OR_TRANSLATE=transcribe
    -e TRANSCRIBE_DEVICE=cpu
    -e CLEAR_VRAM_ON_COMPLETE=True
    -e MODEL_PATH=./models
    -e UPDATE=True
    -e APPEND=False
    -e USE_MODEL_PROMPT=True
    -e CUSTOM_MODEL_PROMPT=”你好,欢迎来到我的讲座。”
    -e LRC_FOR_AUDIO_FILES=True
    -e CUSTOM_REGROUP=”cm_sl=84_sl=42++++++1″
    -e SUBGEN_KWARGS=”{‘vad’: True, ‘prefix’: ‘对,没错,继续。以下是对话内容:’, ‘beam_size’: 5, ‘temperature’: 0.3, ‘compression_ratio_threshold’: 2.4, ‘logprob_threshold’: -1.0, ‘no_speech_threshold’: 0.4, ‘task’: ‘transcribe’}”
    mccloud/subgen:latest

发送评论 编辑评论


				
|´・ω・)ノ
ヾ(≧∇≦*)ゝ
(☆ω☆)
(╯‵□′)╯︵┴─┴
 ̄﹃ ̄
(/ω\)
∠( ᐛ 」∠)_
(๑•̀ㅁ•́ฅ)
→_→
୧(๑•̀⌄•́๑)૭
٩(ˊᗜˋ*)و
(ノ°ο°)ノ
(´இ皿இ`)
⌇●﹏●⌇
(ฅ´ω`ฅ)
(╯°A°)╯︵○○○
φ( ̄∇ ̄o)
ヾ(´・ ・`。)ノ"
( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
(ó﹏ò。)
Σ(っ °Д °;)っ
( ,,´・ω・)ノ"(´っω・`。)
╮(╯▽╰)╭
o(*////▽////*)q
>﹏<
( ๑´•ω•) "(ㆆᴗㆆ)
😂
😀
😅
😊
🙂
🙃
😌
😍
😘
😜
😝
😏
😒
🙄
😳
😡
😔
😫
😱
😭
💩
👻
🙌
🖕
👍
👫
👬
👭
🌚
🌝
🙈
💊
😶
🙏
🍦
🍉
😣
Source: github.com/k4yt3x/flowerhd
颜文字
Emoji
小恐龙
花!
上一篇
下一篇