前言:我们通过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的安装方式,其它方式参考项目文档,下同
-
在Jellyfin控制台打开插件-存储库,点击加号
-
填写存储库的URL
https://github.com/91270/MeiamSubtitles.Release/raw/main/Plugin/manifest-stable.json,再随便起个名字 -
返回插件-目录,需要加载一会,就可以在里面找到MeiamSubtitles
-
第一个是迅雷影视搜索,第二个是射手网,点击安装即可
-
回到媒体库设置,选择你需要自动匹配的媒体库进行设置
-
确认字幕下载语言选择Chinese(繁体和香港会被自动勾选),然后在下面勾选MeiamSub的两个下载器,在下面的字幕下载规则选
只下载完美匹配的字幕,跳过带内嵌字幕的视频避免下载多余字幕
-
之后插件会按照计划任务中的
下载缺少的字幕的时间配置运行自动下载 -
后续也可以在媒体库中手动通过此插件执行搜索下载
Danmu
动漫剧集弹幕下载
项目地址
Jellyfin: https://github.com/cxfksword/jellyfin-plugin-danmu
Emby: https://github.com/fengymi/emby-plugin-danmu
介绍
你绝对想不到,私有化部署的媒体中心居然也能看弹幕?!众所周知,看番没有弹幕总感觉少点什么,这下舒服了。
安装使用
-
和刚才一样,在插件存储库中添加此插件的地址,在目录中安装
国内加速: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 -
在插件设置中勾选想要的弹幕来源网站,同时勾选最下方的同时生成ASS格式弹幕
-
因为默认生成的是xml格式弹幕文件,只有特定播放器才支持,强烈推荐国内大佬开发的Switchfin,而同时生成ASS格式可以让Jellyfin等播放器也支持,但缺点是ass弹幕和字幕观看时只能二选一
-
【可选】之后我们可以配置自动扫描匹配弹幕的任务,默认是关闭的(因为自动匹配率低)
-
由于弹幕是从各大视频网站匹配番剧名称的,而不是themvdb-id,因此匹配不是很精准,一般在番剧导入后手动搜索选择弹幕
MetaTube
不可描述电影刮削插件
项目地址
https://metatube-community.github.io/wiki/plugin-installation/
介绍
Jellyfin等一众媒体库默认使用TMDb、TvDb来匹配刮削影视信息,这两个库里是没有不可描述影视信息的,那么除非我们下载的资源就带有做种者刮削好的信息,否则媒体库会很难看。
而这个插件正是通过一些专门的信息库完美解决了这一问题,虽然它并没有匹配字幕的功能,但是他可以自动为有字幕的电影封面加上字幕icon的功能,甚至还有人脸识别,因此也在此处介绍
安装使用
-
通过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 -
启动服务端后在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 -
插件配置中填写刚才部署的服务端地址和token,注意在手动搜索匹配时展示图片会使用metatube的地址,所以一定要填写metatube的外部访问地址,至少是内网地址,https的公网地址最好
-
由于这类电影基本都是外语,我们还可以给插件设置内容简介翻译功能,支持Baidu/Google/OpenAi
百度个人每月有50万字的免费额度,可以自行申请:https://api.fanyi.baidu.com/api/trans/product/desktop?req=detail , 其它则需要有科学上网的能力
-
最后也是在计划任务中配置好定时运行即可
Subgen (终极大杀器)
本地AI翻译字幕
项目地址
https://github.com/McCloudS/subgen
介绍
上面介绍的插件虽然能匹配大部分热门的影视字幕,但是前提是依赖的字幕网站中有别人制作上传过的字幕,像一些冷门的影视全网都搜不到字幕这时候怎么办呢,那就轮到高科技大炮“AI”上场了!
我们熟悉的OpenAI虽然不干人事,对国内越来越不友好,但是OpenAI在此之前开源了一个非常牛逼的项目Whisper,是一个多语言语音识别模型,尤其对英语的识别准确率极高,之后又有大佬使用更高效的CTranslate2对其重新实现,生成了faster-whisper模型,比whisper要快4倍!而且内存占用更小,以至于目前家用平台即使没有独显,也能使用它通过cpu完美运行本地音频转录。
然后现在要介绍的这位国外McCloudS大佬为了自己看视频方便,随手搓了这个项目,将faster-whisper与jellyfin等媒体应用集成,自动完成字幕生成(subtitle generate)
安装使用
-
还是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 -
通过Jellyfin插件目录安装自带的Webhook插件,重启Jellyfin
-
添加一个通用钩子,填写subgen服务的地址,并勾选
Item Add(媒体添加)和Playback Start(媒体播放)两个事件
-
再勾选
MoviesEpisodesSeasonSeries等你要生成字幕的媒体类型,实测电视剧集类型也是Movies,建议都勾上吧
-
最后再添加一个请求头:
Content-Typeapplication/json,保存即可
-
然后我们随便播放一个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 -
成功触发后,半小时的视频差不多10分钟可以生成好一个字幕,文件带有subgen后缀
-
由于whisper并没有官方支持英语翻译为别的语种,模型训练语料基本三分之二都是英语,所以会出现有些片段变回英文的情况,大家可以自行研究下模型参数调优,或者删除重新生成(挖个坑,我正在开发通过其他翻译接口来翻译英文转录字幕的方式,如果测试效果会开源出来)
总结
总之,通过上面介绍的几个插件,Jellyfin几乎可以胜任任何类型的适配字幕匹配了,这才是科技该有的样子啊,Fucking closed-source!
欢迎关注我的小红书账号,持续分享更多NAS最佳实践:
4384174891 赛博蓝猫




















感谢分享,很棒的博客, 有空出篇博客的搭建教程啊
哈哈谢谢你的肯定,之后会出的
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字幕的,提示这个怎么办?
模型下载失败,开代理
已经有代理了,还是失败
有没有模型可以直接下载到本地的方法 ?而不是用它下载?
问题出在这里,应该是
而不是
和你映射给容器的模型目录一样就行,保存到容器外避免每次重建需要重新下载模型
就是需要设置成
这样子,才能正确下载,我是看原作者的compose才发现,你的这个写法,反正我测试是一直下不了模型,按照我上面的设置就可以正常下载了
无非就是基于subgen.py所在路径的绝对路径和相对路径,你是不是把subgen.py的路径也改了
好了,现在可以生成字幕了,但是没有中文
好了。重构一次容器,又变成中文了,感谢UP分享
有些电影他还是英文,有些是中文,暂时不明白具体什么原因
有时候出现太多英文人名之类的会使下个片段提示上文变英文
我配置好了,但是models里面没有模型文件,挂了代理,是怎么回事
File subgen.env not found. Environment variables not set.
大佬 日志提示这个怎么办?
DEBUG: Model was purged, need to re-create,这个怎么处理
使用这个一键启动,楼主的脚本有问题,不有天坑
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