找回密码
 立即注册
查看: 5457|回复: 14

请问如何使字幕主体居中,文字左对齐(BD内字幕样式)……

2

主题

10

回帖

0

VC币

中级会员

霜庭云花Sub

Rank: 3Rank: 3

积分
4284
DeXiao 发表于 2022-10-3 17:54:49 | 显示全部楼层 |阅读模式

主要问题:想要通过ass实现如图一样式
应用场景:快速更改web或tv源中获取到的字幕的样式

图一

图一
图一

以下无法实现:

图二

图二
图二

\an2 不能直接实现文字左对齐
\an1+适当左边距 不能同时适应不同长度的句子
{\an1\pos($left,$bottom)} 将含\N的所有内容识别为同一行(图二)导致x位置错误


一切光明暗淡之际,于黑暗下憧憬光明
回复

使用道具 举报

2

主题

10

回帖

0

VC币

中级会员

霜庭云花Sub

Rank: 3Rank: 3

积分
4284
DeXiao  楼主| 发表于 2022-10-4 09:34:05 | 显示全部楼层
本帖最后由 DeXiao 于 2022-10-7 18:27 编辑

截至发本评,在看了大家的回复和昨天与 Lambholl 的讨论后,并没有发现一个理想的解决方案

我今天早上一睁眼猛然想起来昨天研究到“下行的宽度”这一点,于是我们直接使上行不被读取不就好?
想到的这个方法可能手动操作的地方比较多:

\N 批量替换为 } ,使用正则为每行的行首添加 { ,这样上行就不再被读取

使用{\an1\pos($left,$bottom)}
结果:{\an1\pos(763,1030)}{(名前)}これはセリフだ!


再批量将 }{ 部分替换为不可能出现在字幕里的东西
结果:{\an1\pos(763,1030)得翛得翛(名前)}これはセリフだ!

} 替换回 \N ,将 得翛得翛 替换为 }


虽然不能一次性搞定,但总归是一个简单的解决方法。

点评

或者结束后把 {{ 换成 { ,0.0 发表于 刚刚(我在说什么东西……呜哇!这句作废  发表于 2022-10-4 20:57
或者结束后把 {{ 换成 { ,0.0  发表于 2022-10-4 20:07
没有换行的行前面会多出来一个{,所以用选择多行功能选出含\N的行再操作  发表于 2022-10-4 10:29
一切光明暗淡之际,于黑暗下憧憬光明
回复

使用道具 举报

25

主题

324

回帖

1056

VC币

星辰大海

Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20

积分
407461
Lambholl 发表于 2022-10-3 18:32:50 | 显示全部楼层
本帖最后由 Lambholl 于 2022-10-3 18:38 编辑

粗略先写了这几行:

  1. Comment: 0,0:00:00.00,0:00:00.00,Default,,0,0,0,code once,a = {} i = 0
  2. Comment: 0,0:00:00.00,0:00:00.00,Default,,0,0,0,code line,i2=0
  3. 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[i]={} a[i][0]=loopTime a[i][1]=textMatch if loopTime==2 then a[i][2]=string.match(text0, '\\N(.+)$') end return '' end
  4. Comment: 0,0:00:00.00,0:00:00.00,Default,,0,0,0,code once,function getText() if a[i][0]==1 then result = line.text else i2=i2+1 result = a[i][i2] if i2 == 1 then result='{\\an1\\pos('..tostring(line.left)..','..tostring(line.top)..')}'..result end end return result end
  5. Comment: 0,0:00:00.00,0:00:00.00,Default,,0,0,0,template line notext,!splitText(line.text)!!maxloop(a[i][0])!!getText()!
复制代码
现在的问题是 Aegisub 处理 lwidth,把两行当一行处理了,所以得单独计算一下下面那行的宽度
不知道 Aegisub 有没有函数可以计算文本的宽度
114514.png


大概要用到 Yutils 吧,不过这玩意我没研究过
回复

使用道具 举报

49

主题

531

回帖

1万

VC币

星辰大海

Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20

积分
2209108
tmdtmdtmdqq 发表于 2022-10-3 18:36:09 | 显示全部楼层
本帖最后由 tmdtmdtmdqq 于 2022-10-3 18:41 编辑

最近改字幕遇到一个跟你差不多需求的换行标题
利用karaoke模板处理了一下
原始字幕用 左右居中(如\an2),处理后的字幕用定位\pos后再左对齐(如\an4)


  1. [Events]
  2. Format: Layer, Start, End, Style, Name, MarginL, MarginR, MarginV, Effect, Text
  3. 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}
  4. Comment: 0,0:00:00.00,0:00:05.00,Default,,0,0,0,karaoke,{\blur2}(名前)\N不知道你那说的是啥
  5. Dialogue: 0,0:00:00.00,0:00:05.00,Default,,0,0,0,fx,{\pos(822,1022)\an4}{\blur2}(名前)\N不知道你那说的是啥
复制代码

QQ截图20221003183729.png
sample.rar (881 Bytes, 下载次数: 76)


字体宽度不用$swidth来算,因为template line取不到$swidth的正确值,所以用$lheight来代替
只要你的字体是宽高比例相等的字体,用$lheight来当字体宽度一般都没问题的


点评

草 是我sb了  发表于 2022-10-3 18:40
欢迎报错继续向上改进我改进过的字幕。
请勿将无实质性修改、劣化精简本人改进过的字幕重新发布到此论坛:如仅改名、仅打包、修改总错字数≤5、删除特效等。       ——20230204
本人改进过的字幕,禁止以任何形式进行商用。若要附带在视频、种子中发布,请先咨询。      ——20231203
一些字幕搜寻、制作的方法和经验汇总  →  >>>帖子<<<
禁止DBD-Raws及其相关人士使用本人所有制作或修正改进过的字幕(包括过往的)      ——20240730
回复

使用道具 举报

25

主题

324

回帖

1056

VC币

星辰大海

Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20

积分
407461
Lambholl 发表于 2022-10-3 18:44:08 | 显示全部楼层
本帖最后由 Lambholl 于 2022-10-3 18:49 编辑
tmdtmdtmdqq 发表于 2022-10-3 18:36
最近改字幕遇到一个跟你差不多需求的换行标题
利用karaoke模板处理了一下
原始字幕用 左右居中(如\an2),处 ...

但是你这个定位方式也是有问题的 通过这个\pos方式 并不能保证把字幕精准定位到中间

aaa.png
回复

使用道具 举报

25

主题

324

回帖

1056

VC币

星辰大海

Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20

积分
407461
Lambholl 发表于 2022-10-3 19:56:49 | 显示全部楼层
本帖最后由 Lambholl 于 2022-10-3 22:25 编辑
Lambholl 发表于 2022-10-3 18:32
粗略先写了这几行:

现在的问题是 Aegisub 处理 lwidth,把两行当一行处理了,所以得单独计算一下下面那行 ...

如果是用 code char,倒是可以通过 line.kara\[i\].width 来获取每个字符的宽度(请无视反斜杠)


但是问题是,template 的执行顺序中,line 在 syl 前面执行,这样的话,就没法先用 code char 把每个字符的宽度存进数组,再在 template line 中调用了,目前想不出解决方案,不知道有没有大佬能想出来
回复

使用道具 举报

0

主题

19

回帖

7

VC币

荣誉会员

Rank: 14Rank: 14Rank: 14Rank: 14

积分
80880
ts222222 发表于 2022-10-4 04:47:28 | 显示全部楼层
本帖最后由 ts222222 于 2022-10-4 04:50 编辑

lua写法不熟悉,只说思路。
从an2的底部居中坐标开始。
先删除最后一个换行符及以前的部分,得到该行的left坐标作为pos的x。pos的y不用变。
然后an1,并且将之前删去的部分加上。
回复

使用道具 举报

1

主题

124

回帖

55

VC币

荣誉会员

Rank: 14Rank: 14Rank: 14Rank: 14

积分
107650

崭露头角活跃达人

zkq970413. 发表于 2022-10-4 07:10:26 | 显示全部楼层
本帖最后由 zkq970413. 于 2022-10-4 07:14 编辑

利用/N+大空格字符添加与下面字符等量的数量不就很快吗?就是这样的话每句都需要自己加上相应数量的大空格符号,比如:
  1. (名前)           /N这样不就又简单又快吗?
复制代码

不过如()之类的用英文符号的话,可能需要加个小空格,用中文的()就比较容易对齐文本。
回复

使用道具 举报

69

主题

1438

回帖

1万

VC币

星辰大海

Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20

积分
3161197

卓越贡献

tonyhsie 发表于 2022-10-4 07:39:40 | 显示全部楼层
本帖最后由 tonyhsie 于 2022-10-5 01:45 编辑

這個算是振假名的一種吧,就是在特定文字上標注假名或說明的作法


基本上假名文字並不是左對齊這麼簡單而已
它是要針對關鍵詞 "居中",以你的圖片為例,就是 "(名前)" 根據 "これは" 的位置居中

圖片 2022-10-04 07-14-28.png

假如今天關鍵詞不是在最前面,而是在句子任意位置呢?
當然更不是左對齊了,而是根據關鍵詞 "居中"

圖片 2022-10-04 07-14-42.png
(台詞) 以 セリフ 的位置來居中

另一個常見的例子:一方通行=Accelerator

圖片 2022-10-04 07-21-30.png

基本上除了在 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

[ASF].rar

1.11 KB, 下载次数: 89

範例ass

回复

使用道具 举报

2

主题

10

回帖

0

VC币

中级会员

霜庭云花Sub

Rank: 3Rank: 3

积分
4284
DeXiao  楼主| 发表于 2022-10-14 14:12:10 | 显示全部楼层
今天在“生产环境”里应用了一下,下行长上行短的内容确实没有问题,但遇到上长下短时仍然是以下行为标准了。这样就只能分成两种分别处理,但如何快速分开又是一个问题。。。
一切光明暗淡之际,于黑暗下憧憬光明
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

快速回复 返回顶部 返回列表