本篇文章记录一些可能比较偏门的东西。

视频处理

压制入门

如果你现在想入门视频压制,个人认为可以分为四种情况。

基础自用。
用一些简单的软件就好,例如小丸工具箱(网上有相当多的教程)。

超分视频。
如果稍微认英语的话就用chaiNNer,不想看英语的话就用SVFI。
在运算速度能接受的范围内,选自己喜欢的模型就好。
尽量使用更好的源进行超分。

Avisynth,也就是AVS。
如果你对压制完全不了解现在想入门,并且没有什么对AVS的强需求,那么请不要考虑入门AVS。

VapourSynth,也就是VS。
如果你想深入了解压制那么VS是当下的首选,前置条件是会英语(或者活用谷歌翻译)、会python(或者至少会一点)。
直接谷歌搜索"VapourSynth guide"就能找到不少相关介绍,大多文章都是英语且绝大多数都是碎片式的。
就绝大多数情况而言,最有效的入门方式就是进入一些压制组或者带压制的字幕组中偷师学艺,尽管这在某些角度来看非常奇怪。

播放器

在长期处理各种视频之后能得出的一个小结论:用MPC比用Pot好得多,或者说简单得多。
MPC几乎不需要进行太多设置就能非常准确地播放视频,但是Pot能遇到的问题真的比MPC的多太多了。

NVIDIA控制面板

视频=>调整视频颜色设置=>高级=>动态范围完全(0-255)。

Delay relative to video

这是视频文件的音频轨道可以有的一项属性,控制对应音频轨相对于视频的延迟。
此项属性是时常就会碰到的,但如果延迟本身比较低就不容易察觉(但也不排除有些视频的音频轨有几十秒的延迟,即便是现在的日本动画)。

Aegisub的官方版本简单来说是不会读取这项属性的,也就是在读取视频时可能会出现错误。
其它也有不少可能会不读取或者会读取错该属性的软件。

实际上,即便使用Mediainfo读取部分视频的音频轨延迟也可能出错。
比较保险的方式是用mkvinfo读取音频轨道的第一个I帧所在的时间码。

DVD 章节

在DVD的VTS_01_0.IFO文件中有章节信息,而如果用MakeMKV导出为mkv后章节的时间可能很奇怪。
解决办法是:计算时间在30000/1001帧率下的帧序号,向上取整后计算reverse 3:2 pulldown对应的帧序号,然后计算此帧对应24000/1001帧率的时间即可。

当然,这些事情并不重要。

字幕滤镜

VSFilter和libass实际效果可能有很大的出入,但绝大多数字幕组并不会在发布页说明使用的滤镜。
但请保证播放器会至少载入其中之一。

另外也有字幕组可能用到Mod滤镜,需要额外对播放器进行配置才能显示字幕中的特效。

在进行压制时也需要载入对应的字幕滤镜。

小丸工具箱

绝大部分情况下都只使用CRF,同码率下CRF得到的结果会比2PASS好得多。

编辑器

AVS和VS都有响应的编辑器,VS的编辑器是vsedit。
但如果要编写复杂脚本还得是用Visual Studio Code。

片源

大多数情况下,日版BD会好于其它地区贩售的BD。
对于里番BD而言,如果要使用北美无修BD最好也是用日版有修BD作为底子,因为北美版画质非常烂。
对于表番WEB而言,CR源基本是最优选,僧侣档泡面的最优选则为Animefesta,此外一些CR源有修的情况可以使用ADN源。

加噪

不要加静噪。

抗锯齿

在某些情况下upscaled_sraa会有异常优秀的效果,但代价是原生1080p素材会糊掉(例如文字)。
除了获取edge遮罩限定抗锯齿范围外,最好额外对原生高分辨率素材进行识别并限制/回退抗锯齿效果。

有些被压得非常差的WEB源用upscaled_sraa能将线条直接修得非常好,额外用遮罩进行限制或者对抗锯齿前后差异过大的帧进行回退都能得到足够好的结果。
但upscaled_sraa比其它常用的抗锯齿来说,太慢了。

降噪

用DPIR进行降噪可能会得到比用常规降噪算法好得多的结果。
并且DPIR还能一定程度去色带。

但降噪强度稍有些高之后破坏力就比较强了,最好只用低强度降噪。
所以为了比BM3D等传统降噪算法的结果稍好一些,就得接受DPIR超慢的速度。

nparray

在VS中其实可以将clip转换成nparray进行一些操作后再转换成VS中的videonode。
虽然绝大多数情况下用不到,但例如有一些图像操作在VS中实现太麻烦想直接转np的情况,也不失为一种方法。
毕竟用cv2的图像处理也不在少数。

以下是一个用cv2进行高斯模糊的简单代码:

def get_clip(n, f: vs.VideoFrame, npArray):
    vsFrame = f.copy()
    [np.copyto(np.asarray(vsFrame[0]), npArray)]
    return vsFrame
def vn2np2vn(n, f: vs.VideoNode):
    img_gray = np.asarray(f.get_frame(n)[0])
    image_array = cv2.GaussianBlur(img_gray, (5, 5), 0)
    clip_placeholder = core.std.BlankClip(
        width=image_array.shape[1],
        height=image_array.shape[0],
        format=vs.GRAY8,
        length=1,
    )
    new_clip = core.std.ModifyFrame(
        clip_placeholder,
        clip_placeholder,
        functools.partial(get_clip, npArray=image_array),
    )
    new_clip = core.std.ShufflePlanes([new_clip, f], [0, 1, 2], vs.YUV)
    return new_clip
clip = ...
res = core.std.FrameEval(clip, eval=partial(vn2np2vn, f=clip))

原生分辨率

现在里番的原生分辨率多数都是810p或者720p,只有少数是其它分辨率(如846p)。
LUNE是720p,粉菠萝大多数810p少数846p再少数可能其它的,A1C则是810p居多也有不少720p(但其实也有不少810p和720p混合的番)。

仅经验而言,粉菠萝是原生1080p素材最多的(且普遍原生分辨率偏高)。

字幕处理

特效编写入门

(写这一部分时我们还未发布字幕制作的全教程)

编写字幕特效主要是两方面:ASS标签、lua。

ASS标签。
查看官方文档就能知道所有标签的效果。
除了绘图标签\p之外的基本都好理解,如果不想编写复杂代码的话到这里基本也够用了,即便要用到绘图也可以随便用ASSDraw3画一画糊弄过去。

lua。
官方文档中有基础的介绍,但到这里基本就需要会lua了。
如果想要学写复杂效果主要就是两个途径,一个是跟压制类似进到一个要写字幕特效的字幕组中偷师学艺,一个是参考保留了特效代码的字幕。
当然,第二个途径其实并不轻松,有制作复杂特效的字幕组本身就少,即便做了也可能出于不想分享成果而删掉生成代码。
我个人就是开始时完全找不到参考,直到某次翻看游戏人生剧场版时发现了某个字幕组保留了生成代码的特效,现在想来那份字幕也算是我入门路上独一份的教材,时至今日我也没遇到过第二份来自字幕组的保留生成代码的复杂特效字幕(其实有专门制作歌词特效字幕的创作者,向他们请教也是一个方案)。
不过嘛,我们组是会保留所有生成代码的,但有些实在太过复杂了确实不适合入门吧。

Aegisub

尽量使用fork版本,官方版本潜在问题太多了。

Script Info

ASS字幕文件头部会有一段Script Info,存储字幕的配置信息。

其中一定要设置ScriptType: v4.00+,也最好注明YCbCr Matrix标签。
YCbCr Matrix是色域,除非有一些特殊需求,不然都最好设为TV.709。
(关于ScriptType,如果不设置的话最直接的一个问题就是字幕的层级会失效)

配置中还有字幕的分辨率配置,对应标签为PlayResX、PlayResY。
直到现在也还有不少组沿用以前的720p配置,但其实720p字幕配1080p视频会糊。
所以最好字幕分辨率跟着视频走。
不过因为此项配置会影响字幕中所有与坐标、像素宽度有关的信息,所以最好在一开始就配置好分辨率。

另外其实Script Info可以存储一些自定义的信息,然后在字幕中可以读取meta获取这些信息。

思源

思源字体的省略号在一些情况下沉底。

有人也为此专门制作/获取思源的改版,但其实字幕中直接为样式设置0.1的间距或者使用\fsp.1就可以避免。
原理是,思源为了符合西文标准在省略号有前后文时会沉底,设置了间距则固定没有前后文。

Unicode码点

在Aegisub中使用Unicode码点有时候会运行不了自动化。
例如代码中使用\u{3000}来表示空格在某些Aegisub版本中会出错,而使用UTF-8字节就不会出错。

这个知识点确实是非常没用。
但总之之前在代码中写过码点然后用Aeg-cli运行自动化出错了。

另外有些特殊字符也可能会导致出错,例如θ。

标签

有些标签确实是很难有用,比如\fe,但有些看似没用的标签在部分情况下有奇效却很少被使用。

\be
我以前也是因为觉得\be的柔化模糊和\blur高斯模糊用途完全重叠,也一直用的更高效的\blur
但其实\be能够让文字「融入环境」,值取0.5-1能获得非常柔和的文字,这是高斯模糊很难办到的。
也就是屏幕字可以稍微给一点柔化模糊,让效果不那么突兀。
相比于字幕,动画中出现的文字经常不是边界分明的,总会因为抗锯齿或者环境特效而变得柔和、模糊。

\org
如果喜欢手敲特效的话那\org标签真的是太方便了。
要在字幕中实现变速运动主要是三种方案,一是用一些工具捕捉视频中物件的运动生成(或人眼捕捉+手敲生成),二是用代码每帧生成一个字幕行并设置\pos来实现效果,三就是\org配合旋转标签和\t来实现。
最简洁的一种方案。

另外有些标签也还有基本用不到毫无存在感的特性,例如\b后面能够接字重(例如600、800)、\r后面能够接样式名。

旧特效标签

其实还有一些旧特效标签,它们甚至不被记录在官方文档中。
例如你可以新建一行然后在特效栏填入banner;1,观察有什么效果。

当然请不要真的使用这些标签,它们基本都能被新标签取代。

不透明背景

在样式的设置中有一项不透明背景,勾选上之后原本的边框会被背景底色取代。

这个设置其实是很奇怪的,它是唯一一项不能通过标签修改的效果,导致实际使用时非常麻烦。
但也有些利用其的特效,例如直接设置不透明背景然后生成多行文字,每行用\iclip来显示部分区域并与其它行错开时间来达成文字逐块显示的效果,这个效果如果要用普通方法实现还是比较麻烦的。

另外我个人有个很奇怪的利用方式,对一些我想清楚看清文字的样式我直接设置不透明背景,然后在特效代码中消除掉不透明背景再加上别的效果。
其实也就是想初期打字幕时方便一点然后拐了个大弯。

翻译

首先说明,我个人要站也是站明哲保身彻底保守派。

例如问题一:台词中出现了SNS、Twitter(X)、YouTube,要不要将其本地化为国内相关网络平台?
标准答案绝对是照搬,因为照搬不会有任何过错;
那么如果修改为国内网络平台呢?我个人比较印象深刻的是有过某字幕组如此做过,当时有不少人夸赞这样翻译才是“本土化”、觉得这样的翻译更好(打引号并无深意)。
而随后也难免有人觉得不妥,这样修改是否又是隐性宣传某个国内网络平台?是否考虑过会引起部分人不适?等等。
可以见得改译会引起相当的争议,那自然不能斩钉截铁说这样好或坏。

如果对这个问题抛开「隐性宣传」这一层面,那么问题其实更接近于:要不要将一个日本人熟悉的名词,改译为不同指代但性质类似且国内人熟悉的名词?
核心也就是指代不同、性质类似,由于后者性质相似没有一个精确的度量那么姑且将问题限定于“性质足够相似”的情况。
假如在日本有一种红色的水果非常常见,蔷薇科、红色表皮、球形、手掌大小,但是其在国内只有一个名字非常生僻的学名称呼,要不要将其改译为苹果呢?
——但这些问题还有一个不好掂量分量的前提条件:该名词不会影响对话本身,甚至,无关重要。

要说个人看法的话,原问题我就会很讨厌隐性宣传这一层面,无论其是有意无意。
如果抛开这一层面,那么要不要指鹿为马呢?我个人接受无关重要、即便指代不同但性质足够相似、有助于中文母语者理解的指鹿为马。
当然,仅个人看法。

问题二:如果角色用了低俗的词,要不要翻译为脏字?
在讨论这个问题之前,其实日语里面没有程度非常重的脏字、骂人非常词穷,中文里确实脏字的表达非常多也有非常重的。(另外日语里其实有非常丰富的性相关词汇,但中文里这类词汇更是凤毛麟角,翻译时只能被迫用生僻的学名还得打个注释)
另外日译中与英译中也会有不一样,英译中我相信难免会遇到角色把"Fucking"挂在嘴边的情况,反而全部都不翻成脏字会显得奇怪。
那么正式讨论这个问题,首先加上一个限定,假如该角色本身性格就是非常恶劣的,在足够气愤的情况下说出了一个程度足够重的脏字。
为了抛开度量问题,对于这个脏字A,我们假定中文里有程度绝对相等的脏字B可供翻译——或者对于某个中文里的脏字B,角色刚好说出了程度绝对相等的脏字A。
那么是选择翻译为足够表达气愤、足够体现角色性格恶劣但不是脏字的字眼C,还是选择翻译为脏字B?
这里我们先观察上面的一大串限定条件,其实实际情况很难能够抛除其中一些问题:例如对于字眼C,如果我们在中文表述里找不到一个足够表达气愤或者足够体现角色性格恶劣的词,而只有一个退而求其次的字眼C,此时要作何选择也是一种特殊情况。
那么如果真的满足这些限定条件,选择脏字B和字眼C其实更接近于:要不要将一个非常不好的词汇,改译为指代应该是不同且性质不好说有多类似的稍温和的词?
这样来看脏字的改译可能比上一个问题更加奇怪,脏字和温和词的性质在对比时很难说有多类似,因为脏字对我们确实是有一墙之隔。无论中文还是日文其实表达都是稍含蓄的,假设在足够正式的情景下(例如官媒发言)使用即便稍弱一点的脏字,我们也难免觉得像是有层窗户纸被捅破了。另一方面英语就全然不一样,脏字基本就是语气词,也不太会抗拒英译中的脏字。
那么既然脏字与常规字眼有着一墙之隔,改译不就有点指鹿为马了吗?
所以这个问题对比上一个问题更加奇怪,因为即便是指鹿为马,译文中少了一个脏字也是能让文字变得易于接受得多的。
也就是为了增加译文的亲和性,或者说是为了降低译文的攻击性,要不要“指鹿为马”?

要说个人看法的话,我会果断选择指鹿为马。
因为脏字确实攻击性太强,我自己也会不适应,想来我这辈子还没用键盘打出过脏字。
另外也确实有少部分人有高度的精神洁癖,会讨厌脏字,不巧我也是其中一人。
当然,仅个人看法。

问题三:由于语义膨胀,要不要将一些词换用程度更重的词?
这是一个我觉得很有意思的问题,我还没有见到过任何类似的讨论。
简单解释这个问题:由于网络传播,许多原本我们心里会归类为重程度的词可能会因为用“惯”了,而在我们心中转变成轻程度的词汇,此时要不要用一些对于当下的我们来说算得上程度重的词?
这也算是一个以前很难能有的问题,因为现如今互联网传播实在太过快速了,此前用“蠢”现在用“急”、今朝用“输”明日用“赢”,在不断的迭代中原本重程度的词在网民的印象中已经温和太多了。
例如“笨蛋”一词如果出现在一个校园恋爱番中,即便没有太过说明场景也难免让人想到一副撒娇的场景。
那么对于语义不再足够重的词,是否要换用重程度的词呢?
首先对于最激进的情况,换用并且使用重程度网络词,由于其涉及到另一个大问题“要不要用网络词”所以在下一个问题讨论。
所以这里只讨论稍温和的情况:要不要换用正式词中尚未被网络模因大幅污染的重程度的词。
而假如对于已被污染的词A,我们能找到与其在翻译中完全等价、未被污染的词B,由于词A与词B完全等价那么换不换用均无错误可言,影响我们判断的也就只是:有没有必要专门为了换掉被污染的词,去找一个未被污染的词?
而如果对于没有等价词B的词A,要不要退一步选用稍接近词A的词C?
但其实,我们并不能判断词B和词C会不会在将来的某天被污染。

个人看法,我会稍微思考有没有一个合适的未被污染的词然后进行替换。
找不到足够合适的就作罢。

问题四:要不要在字幕中使用网络词?
首先需要进行一些限定,有大量的网络词都是带有不好指向、富有攻击性的词汇,所以此问题的稍准确表述为:要不要在字幕中使用足够温和或者足够积极的网络模因词汇?
即便温和、积极,网络词也存在一个很大的问题,那就是理解门槛。
并不是所有人都高强度上网了解传播的新词,如果要用网络词表达原文还额外在屏幕上打一个注释就有点南辕北辙了。
我们换一个方向思考,要不要为了表达一个原本可以正常表达的词汇,选用一个等价的生僻词?
这个思路也就避免了“打注释”环节,因为词汇本身生僻并无错误,只是观众可能不认识需要查字典,换到网络模因中也就是观众需要查百科。
不过反过来说,一个生僻词可以换成等价的常用词,在翻译中都算是能够专门耗时间进行的优化了,所以对于换生僻词来说即便不说正确与否,也是没有必要的。
那么假如每个人都知道这一个网络模因,或者保守而言制作的字幕面向的观众都知道这一个网络模因,可不可以换用?
对于这个问题而言,标准答案就是可以了。
一个比较典型的例子是“给力”一词,其作为一个网络词足够积极、传播广、被官媒采用且生命力足够强,使用自是没问题。
不过能够走到这一步的网络词实在太少了,攻击性、生命力、传播面积,无一不能筛选掉极大量的词汇。
那么是否那些被筛选掉的词中就不存在可以使用的词了呢?
网络词还有一种使用起来算得上没有争议的情况,例如ACGN用词出现在有宅文化的动画当中,也就是满足前文“制作的字幕面向的观众都知道这一个网络模因”的情况(如果观众并不了解宅文化因此不了解相关的模因,此时情况更近似于观众在不了解理论物理学时观看一个讲述理论物理学的动画遇到了一个不了解的专业名词,此时观众想要了解这个词就需要查百科)。

“番剧”是网络词,如果翻译不能用网络词那番剧里面不能出现“番剧”。
不过确实富有攻击性的网络词会跟脏字类似,让人不适。许多网络词本身也是为了不用脏字的字眼达到近似脏字的效果而生造出来的。
另外则是生命力了,如果一个网络词的生命力是一年,那么你是否想让你制作的字幕的生命力是一年呢?
就如今而言,可能一时间看着网民们用着什么新的词汇,但过不了多久就会有新的词汇涌现,取代或者埋没先前如日中天的词。
我个人是希望,就算过了十多二十年,我所制作的字幕也能让那时的观众感到亲切、富有生命力。

杂项

做种

用比特彗星制种时比特彗星会添加padding并标示一长段文字。
虽然有些人认为这些文字无所谓,但也有不少人认为这些文字是惹人烦的广告,例如nyaa读取种子文件后会在种子页展示文件,此时就会有大篇大篇的比特彗星比特彗星……
总之出于明哲保身的角度不要用比特彗星制种(或者采取不写入padding的方式)。