请问如何使字幕主体居中,文字左对齐(BD内字幕样式)……
主要问题:想要通过ass实现如图一样式
应用场景:快速更改web或tv源中获取到的字幕的样式
图一
以下无法实现:
图二
\an2 不能直接实现文字左对齐
\an1+适当左边距 不能同时适应不同长度的句子
{\an1\pos($left,$bottom)} 将含\N的所有内容识别为同一行(图二)导致x位置错误
本帖最后由 DeXiao 于 2022-10-7 18:27 编辑
截至发本评,在看了大家的回复和昨天与 Lambholl 的讨论后,并没有发现一个理想的解决方案
我今天早上一睁眼猛然想起来昨天研究到“下行的宽度”这一点,于是我们直接使上行不被读取不就好?
想到的这个方法可能手动操作的地方比较多:
将 \N 批量替换为 } ,使用正则为每行的行首添加 { ,这样上行就不再被读取
使用{\an1\pos($left,$bottom)}
结果:{\an1\pos(763,1030)}{(名前)}これはセリフだ!
再批量将 }{ 部分替换为不可能出现在字幕里的东西
结果:{\an1\pos(763,1030)得翛得翛(名前)}これはセリフだ!
将 } 替换回 \N ,将 得翛得翛 替换为 } 。
虽然不能一次性搞定,但总归是一个简单的解决方法。
本帖最后由 Lambholl 于 2022-10-3 18:38 编辑
粗略先写了这几行:
Comment: 0,0:00:00.00,0:00:00.00,Default,,0,0,0,code once,a = {} i = 0
Comment: 0,0:00:00.00,0:00:00.00,Default,,0,0,0,code line,i2=0
Comment: 0,0:00:00.00,0:00:00.00,Default,,0,0,0,code once,function splitText(text0) i = i + 1 local textMatch = string.match(text0, '^(.+)\\N')local loopTime = textMatch==nil and 1 or 2 a={} a=loopTime a=textMatch if loopTime==2 then a=string.match(text0, '\\N(.+)$') end return '' end
Comment: 0,0:00:00.00,0:00:00.00,Default,,0,0,0,code once,function getText() if a==1 then result = line.text else i2=i2+1 result = a if i2 == 1 then result='{\\an1\\pos('..tostring(line.left)..','..tostring(line.top)..')}'..result end end return result end
Comment: 0,0:00:00.00,0:00:00.00,Default,,0,0,0,template line notext,!splitText(line.text)!!maxloop(a)!!getText()!现在的问题是 Aegisub 处理 lwidth,把两行当一行处理了,所以得单独计算一下下面那行的宽度
不知道 Aegisub 有没有函数可以计算文本的宽度
大概要用到 Yutils 吧,不过这玩意我没研究过
本帖最后由 tmdtmdtmdqq 于 2022-10-3 18:41 编辑
最近改字幕遇到一个跟你差不多需求的换行标题
利用karaoke模板处理了一下
原始字幕用 左右居中(如\an2),处理后的字幕用定位\pos后再左对齐(如\an4)
Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
Comment: 0,0:00:00.00,0:00:00.00,Default,,0,0,0,template line keeptags,{\pos(!$lleft+$lheight*2!,!$lmiddle-math.floor($lheight/2)!)\an4}
Comment: 0,0:00:00.00,0:00:05.00,Default,,0,0,0,karaoke,{\blur2}(名前)\N不知道你那说的是啥
Dialogue: 0,0:00:00.00,0:00:05.00,Default,,0,0,0,fx,{\pos(822,1022)\an4}{\blur2}(名前)\N不知道你那说的是啥
字体宽度不用$swidth来算,因为template line取不到$swidth的正确值,所以用$lheight来代替
只要你的字体是宽高比例相等的字体,用$lheight来当字体宽度一般都没问题的
本帖最后由 Lambholl 于 2022-10-3 18:49 编辑
tmdtmdtmdqq 发表于 2022-10-3 18:36
最近改字幕遇到一个跟你差不多需求的换行标题
利用karaoke模板处理了一下
原始字幕用 左右居中(如\an2),处 ...
但是你这个定位方式也是有问题的 通过这个\pos方式 并不能保证把字幕精准定位到中间
本帖最后由 Lambholl 于 2022-10-3 22:25 编辑
Lambholl 发表于 2022-10-3 18:32
粗略先写了这几行:
现在的问题是 Aegisub 处理 lwidth,把两行当一行处理了,所以得单独计算一下下面那行 ...
如果是用 code char,倒是可以通过 line.kara\.width 来获取每个字符的宽度(请无视反斜杠)
但是问题是,template 的执行顺序中,line 在 syl 前面执行,这样的话,就没法先用 code char 把每个字符的宽度存进数组,再在 template line 中调用了,目前想不出解决方案,不知道有没有大佬能想出来
本帖最后由 ts222222 于 2022-10-4 04:50 编辑
lua写法不熟悉,只说思路。
从an2的底部居中坐标开始。
先删除最后一个换行符及以前的部分,得到该行的left坐标作为pos的x。pos的y不用变。
然后an1,并且将之前删去的部分加上。
本帖最后由 zkq970413. 于 2022-10-4 07:14 编辑
{:12_856:}利用/N+大空格字符添加与下面字符等量的数量不就很快吗?就是这样的话每句都需要自己加上相应数量的大空格符号,比如:
(名前) /N这样不就又简单又快吗?
不过如()之类的用英文符号的话,可能需要加个小空格,用中文的()就比较容易对齐文本。 本帖最后由 tonyhsie 于 2022-10-5 01:45 编辑
這個算是振假名的一種吧,就是在特定文字上標注假名或說明的作法
基本上假名文字並不是左對齊這麼簡單而已
它是要針對關鍵詞 "居中",以你的圖片為例,就是 "(名前)" 根據 "これは" 的位置居中
假如今天關鍵詞不是在最前面,而是在句子任意位置呢?
當然更不是左對齊了,而是根據關鍵詞 "居中"
(台詞) 以 セリフ 的位置來居中
另一個常見的例子:一方通行=Accelerator
基本上除了在 Aegisub 手工調整以外,要處理大量振假名的話,應該都需要靠程式來調整吧
我是自己寫程式來處理這樣的case
根據實際的樣式設定、字型大小、alignment、關鍵字位置、程式可以精確地算出振假名的 \pos(x, y) 裡的 x, y 值
以前兩張圖來說
Style: yq,方正准圆_GBK,26,&H00FFFFFF,&HF0000000,&H00979620,&H00000000,-1,0,0,0,100,100,1,0,1,2,0,2,10,10,15,1
Dialogue: 0,0:00:35.95,0:00:41.58,yq,,0,0,0,,これはセリフだ!
Dialogue: 0,0:00:35.95,0:00:41.58,yq,,0,0,0,,{\pos(371.22,439)}(名前)
Dialogue: 0,0:00:35.95,0:00:41.58,yq,,0,0,0,,これはセリフだ!
Dialogue: 0,0:00:35.95,0:00:41.58,yq,,0,0,0,,{\pos(438.16,439)}(台詞)
不過我也很好奇,一般字幕組都是怎麼做的?
以前的一篇討論假名字幕的文章
https://bbs.acgrip.com/forum.php ... d=6780&fromuid=8179
今天在“生产环境”里应用了一下,下行长上行短的内容确实没有问题,但遇到上长下短时仍然是以下行为标准了。这样就只能分成两种分别处理,但如何快速分开又是一个问题。。。
页:
[1]
2