DYY-Studio / AddSubFontMKV_py

将您的字幕和字体通过mkvmerge/ffmpeg快速批量封装到Matroska容器,适用于Windows系统,仅py3.7+
Apache License 2.0
32 stars 1 forks source link

有部分字体无法检测到,以及请求子集化字幕能增加导出为mks格式 #42

Closed paulxjz closed 1 month ago

paulxjz commented 1 month ago
1

DFPHannotate-W5、YEFONTRuanMengOuBaoTi 標準、子清有晴 这三个字体分别对应字体包的DFHannotate-W5 & DFPHannotate-W5 & DFGHannotate-W5.ttc、也字工厂软萌欧包体.ttf、子清有晴.ttf,这三个字体无法检测。

我请求增加导出成mks格式,我的需求是每个视频有对应的简体和繁体字幕,我想把它子集化成一个mks格式,我不将它和视频合成一个mkv是,是因为我有做种的需求,不想改变原本mkv文件的数据。

字幕及字体包https://wwqg.lanzoub.com/i5x0B2aiw4da

DYY-Studio commented 1 month ago

DFPHannotate-W5

已经修复

也字工厂软萌欧包体 / 子清有晴

已改进支持

MKS支持

日后才能解决,今晚没空了

所以我说别用小厂字体……

DYY-Studio commented 1 month ago

顺带一提,对于封装MKS的需求,其实可以暂时用ASS内嵌字体功能代替。

该功能遵循ASS/SSA标准,将子集化的字体包放入ASS/SSA文件中作为附件。 本质上与MKS保存无异,兼容性上可能略差…?空间需求会稍大一些。

如果不使用XySubFilter,基本都是可以正常渲染的。

当然既然提了,MKS我之后也会做的。

paulxjz commented 1 month ago

顺带一提,对于封装MKS的需求,其实可以暂时用ASS内嵌字体功能代替。

该功能遵循ASS/SSA标准,将子集化的字体包放入ASS/SSA文件中作为附件。 本质上与MKS保存无异,兼容性上可能略差…?空间需求会稍大一些。

如果不使用XySubFilter,基本都是可以正常渲染的。

当然既然提了,MKS我之后也会做的。

感谢回复,我尝试下

paulxjz commented 1 month ago

使用ASFMKV_pre24a.py,也是上面的字幕和字体包,用ASS内嵌字体报错了,在弄到第二集的时候报错了,报错信息如下

"[VCB-Studio] Kage no Jitsuryokusha ni Naritakute! S2 [02][Ma10p_1080p][x265_flac].sc.ass" - UTF-8-SIG
字幕所需字体
"方正宋黑_GBK": 字符数[197]
"华文仿宋": 字符数[4]
"微软雅黑": 字符数[3]
"思源黑体 CN": 字符数[752]
"DFPHannotate-W5": 字符数[110]
"华康手札体W5-A": 字符数[153]
字体输出路径: "D:\杂项\新建文件夹\sub-2\Fonts\[VCB-Studio] Kage no Jitsuryokusha ni Naritakute! S2 [02][Ma10p_1080p][x265_flac].sc"
[1/6] 正在子集化……
[WARNING] 已忽略不在字体中的字符
[6/6] 正在子集化…… ERROR: NameRecord sorting failed to encode: 'gbk' codec can't encode character '\u436f' in position 0: illegal multibyte sequence
ERROR: NameRecord sorting failed to encode: 'gbk' codec can't encode character '\u436f' in position 0: illegal multibyte sequence
ERROR: NameRecord sorting failed to encode: 'gbk' codec can't encode character '\u436f' in position 0: illegal multibyte sequence
ERROR: NameRecord sorting failed to encode: 'gbk' codec can't encode character '\u436f' in position 0: illegal multibyte sequence
ERROR: NameRecord sorting failed to encode: 'gbk' codec can't encode character '\u436f' in position 0: illegal multibyte sequence
ERROR: NameRecord sorting failed to encode: 'gbk' codec can't encode character '\u436f' in position 0: illegal multibyte sequence

Traceback (most recent call last):
  File "D:\ruanjian\zimu\字集化字幕\AddSubFontMKV_py\ASFMKV_pre24a.py", line 4333, in <module>
    loadMain()
  File "D:\ruanjian\zimu\字集化字幕\AddSubFontMKV_py\ASFMKV_pre24a.py", line 4220, in loadMain
    cFontSubset(font_info)
  File "D:\ruanjian\zimu\字集化字幕\AddSubFontMKV_py\ASFMKV_pre24a.py", line 3864, in cFontSubset
    newasspaths, newfont_name, mkvr = main(font_info2, [subp[1]],
                                      ^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "D:\ruanjian\zimu\字集化字幕\AddSubFontMKV_py\ASFMKV_pre24a.py", line 2918, in main
    newfont_name = assFontSubset(assfont, fo, FFmuxer==2)
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "D:\ruanjian\zimu\字集化字幕\AddSubFontMKV_py\ASFMKV_pre24a.py", line 2021, in assFontSubset
    newf.save(crcnewf, False)
  File "D:\ruanjian\WingetUI-data\Scoop\apps\python\current\Lib\site-packages\fontTools\ttLib\ttFont.py", line 216, in save
    writer_reordersTables = self._save(tmp)
                            ^^^^^^^^^^^^^^^
  File "D:\ruanjian\WingetUI-data\Scoop\apps\python\current\Lib\site-packages\fontTools\ttLib\ttFont.py", line 263, in _save
    self._writeTable(tag, writer, done, tableCache)
  File "D:\ruanjian\WingetUI-data\Scoop\apps\python\current\Lib\site-packages\fontTools\ttLib\ttFont.py", line 713, in _writeTable
    tabledata = self.getTableData(tag)
                ^^^^^^^^^^^^^^^^^^^^^^
  File "D:\ruanjian\WingetUI-data\Scoop\apps\python\current\Lib\site-packages\fontTools\ttLib\ttFont.py", line 735, in getTableData
    return self.tables[tag].compile(self)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "D:\ruanjian\WingetUI-data\Scoop\apps\python\current\Lib\site-packages\fontTools\ttLib\tables\_n_a_m_e.py", line 85, in compile
    string = name.toBytes()
             ^^^^^^^^^^^^^^
  File "D:\ruanjian\WingetUI-data\Scoop\apps\python\current\Lib\site-packages\fontTools\ttLib\tables\_n_a_m_e.py", line 589, in toBytes
    return tobytes(self.string, encoding=self.getEncoding(), errors=errors)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "D:\ruanjian\WingetUI-data\Scoop\apps\python\current\Lib\site-packages\fontTools\misc\textTools.py", line 130, in tobytes
    return s.encode(encoding, errors)
           ^^^^^^^^^^^^^^^^^^^^^^^^^^
UnicodeEncodeError: 'gbk' codec can't encode character '\u436f' in position 0: illegal multibyte sequence
encoding with 'gbk' codec failed

您要重新启动本程序吗? [Y,N]?
DYY-Studio commented 1 month ago

是我玩坏了,不魔改就好了,已经修复,一会推送

DYY-Studio commented 1 month ago

image 这次是真的字体问题了,fontTools不兼容的我也没办法,只能用FontCreator重新保存

azuki_font_fix.zip 给你修好了,请用这个azuki_font

paulxjz commented 1 month ago

image 这次是真的字体问题了,fontTools不兼容的我也没办法,只能用FontCreator重新保存

azuki_font_fix.zip 给你修好了,请用这个azuki_font

我使用你给的修复字体也是报错,报错的内容和上面一样有更新了,更新就好了 我还想请教下如何修字体,是用FontCreator打开错误字体,然后在是 文件→生成字体→选择TrueType格式→保存 是这个流程吗? 还有如何看那个是错误字体,我用ASFMKV_pre24a好像没提示

DYY-Studio commented 1 month ago

我们的汉化可能不太一样)大概就是那个流程 输出输出为都可以,只要让FontCreator重新保存一次就好了。 有些老字体文件里的信息和fontTools相容性是比较差的(或者说fontTools对这方面要求比较严格),必须要用FontCreator重新整理、生成这些数据 image

paulxjz commented 1 month ago

我在使用最新的ASFMKV_pre24导出mks的时候,在为为字幕轨道添加语言信息的时候,像双语字幕的chs_jpn、cht_jpn或加了字幕组名字的像[Haruhana]cht、Haruhana.cht、Haruhana-cht,之类的无法自动识别成中文,好像只有sc、tc、chs、cht之类的才可以识别,还有就是语言无论是简体还是繁体都是zh,还是希望能区分成zh-Hans、zh-Hant或者zh-CN、zh-TW加以区分,这样从成品的mks或mkv中提取特定语言的字幕会方便一点。

DYY-Studio commented 1 month ago

可以开启暴力匹配(只要文件名里含有对应规则,即认为匹配,未开启时需要完全匹配),默认是关闭的。

匹配规则现在内置在py文件里,编辑器打开可以看到。 之后会给出对应的外置ini的。

至于区分简繁的问题,见 #41。 考虑到目前播放器、分离器对LanguageBCP47标签并没有良好的支持,目前暂时没有对此进行支持的计划。

paulxjz commented 1 month ago

可以开启暴力匹配(只要文件名里含有对应规则,即认为匹配,未开启时需要完全匹配),默认是关闭的。

匹配规则现在内置在py文件里,编辑器打开可以看到。 之后会给出对应的外置ini的。

至于区分简繁的问题,见 #41。

好的,我尝试下。还有个问题就是选择mkvmerge,想导出mks的时候没有视频文件,就会是ASS/SSA内嵌而不是导出mks文件,这个有点怪,就是一定要有视频才能导出mks,但其实导出mks不需要视频文件吧

DYY-Studio commented 1 month ago

也算是旧逻辑没改过来吧…虽然我也没什么头绪 本身设计的时候就是通过视频文件判断到底哪些字幕是属于同一个视频的。

我必须要知道你的字幕文件名到底到哪部分是视频文件名,这样我才知道剩下部分是啥。 举个例子,如果是字幕组A.I.R.nessSub,那我应该怎么判断哪个.是开始标记呢? 所以这方面选了比较严格的方式。

封mks的话,你甚至用txt改后缀名伪装一个都行) 视频文件输入部分已经干掉了,检查都不检查的。

在没有视频文件的情况下,ASS/SSA内嵌可以针对每个字幕进行处理,也保存为各个字幕文件。不需要把同一个视频对应的多个字幕的字体统一子集化。

目前的流程是这样的,MKS的话…简中繁中字幕分开两个MKS也可以吗) 这是接下来要优化输入方式的事情了。

paulxjz commented 1 month ago

也算是旧逻辑没改过来吧…虽然我也没什么头绪 本身设计的时候就是通过视频文件判断到底哪些字幕是属于同一个视频的。

我必须要知道你的字幕文件名到底到哪部分是视频文件名,这样我才知道剩下部分是啥。 举个例子,如果是字幕组A.I.R.nessSub,那我应该怎么判断哪个.是开始标记呢? 所以这方面选了比较严格的方式。

封mks的话,你甚至用txt改后缀名伪装一个都行) 视频文件输入部分已经干掉了,检查都不检查的。

在没有视频文件的情况下,ASS/SSA内嵌可以针对每个字幕进行处理,也保存为各个字幕文件。不需要把同一个视频对应的多个字幕的字体统一子集化。

目前的流程是这样的,MKS的话…简中繁中字幕分开两个MKS也可以吗) 这是接下来要优化输入方式的事情了。

mks的话我倾向于所有字幕弄到一个文件,不过我也同意你的说法,有时候视频名千奇百怪,有时确实不好判断,那些字幕是同一个视频的,通过视频名来判断,视频的字幕文件,确实是比较稳的方法。如果没视频的话,目前,我就把字幕文件后缀名改成mp4,导出的mks。

paulxjz commented 1 month ago

也算是旧逻辑没改过来吧…虽然我也没什么头绪 本身设计的时候就是通过视频文件判断到底哪些字幕是属于同一个视频的。

我必须要知道你的字幕文件名到底到哪部分是视频文件名,这样我才知道剩下部分是啥。 举个例子,如果是字幕组A.I.R.nessSub,那我应该怎么判断哪个.是开始标记呢? 所以这方面选了比较严格的方式。

封mks的话,你甚至用txt改后缀名伪装一个都行) 视频文件输入部分已经干掉了,检查都不检查的。

在没有视频文件的情况下,ASS/SSA内嵌可以针对每个字幕进行处理,也保存为各个字幕文件。不需要把同一个视频对应的多个字幕的字体统一子集化。

目前的流程是这样的,MKS的话…简中繁中字幕分开两个MKS也可以吗) 这是接下来要优化输入方式的事情了。

或者如果没有视频文件的话,如果要导出mks,可以人工输入一次,某一集的文件名,或者把视频的文件名中的集数改成*,来辅助识别。 例如

[VCB-Studio] Kage no Jitsuryokusha ni Naritakute! S2 [01][Ma10p_1080p][x265_flac]

或者

[VCB-Studio] Kage no Jitsuryokusha ni Naritakute! S2 [*][Ma10p_1080p][x265_flac]
DYY-Studio commented 1 month ago

哎,这法子以前写别的功能用过来着。

可以的,之后做进去吧。