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

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

  • TA的每日心情
    慵懒
    2024-8-3 15:34
  • 签到天数: 31 天

    [LV.5]常住居民I

    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位置错误


    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

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

    使用道具 举报

  • TA的每日心情
    慵懒
    2024-8-3 15:34
  • 签到天数: 31 天

    [LV.5]常住居民I

    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
    一切光明暗淡之际,于黑暗下憧憬光明
    回复

    使用道具 举报

  • TA的每日心情
    无聊
    2023-3-18 18:33
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    23

    主题

    309

    回帖

    1056

    VC币

    星辰大海

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

    积分
    406058
    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 有没有函数可以计算文本的宽度



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

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    x
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    9 小时前
  • 签到天数: 1065 天

    [LV.10]以坛为家III

    21

    主题

    424

    回帖

    1万

    VC币

    星辰大海

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

    积分
    1357823
    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不知道你那说的是啥
    复制代码





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


    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    x

    点评

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

    使用道具 举报

  • TA的每日心情
    无聊
    2023-3-18 18:33
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    23

    主题

    309

    回帖

    1056

    VC币

    星辰大海

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

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

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


    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    x
    回复

    使用道具 举报

  • TA的每日心情
    无聊
    2023-3-18 18:33
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    23

    主题

    309

    回帖

    1056

    VC币

    星辰大海

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

    积分
    406058
    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 中调用了,目前想不出解决方案,不知道有没有大佬能想出来
    回复

    使用道具 举报

  • TA的每日心情
    开心
    2022-5-9 10:29
  • 签到天数: 4 天

    [LV.2]偶尔看看I

    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,并且将之前删去的部分加上。
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    昨天 01:07
  • 签到天数: 878 天

    [LV.10]以坛为家III

    0

    主题

    110

    回帖

    55

    VC币

    荣誉会员

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

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

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

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

    使用道具 举报

  • TA的每日心情
    郁闷
    2016-12-31 01:33
  • 签到天数: 6 天

    [LV.2]偶尔看看I

    69

    主题

    1377

    回帖

    1万

    VC币

    星辰大海

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

    积分
    2969808

    卓越贡献

    tonyhsie 发表于 2022-10-4 07:39:40 | 显示全部楼层
    本帖最后由 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

    本帖子中包含更多资源

    您需要 登录 才可以下载或查看,没有账号?立即注册

    x
    回复

    使用道具 举报

  • TA的每日心情
    慵懒
    2024-8-3 15:34
  • 签到天数: 31 天

    [LV.5]常住居民I

    2

    主题

    10

    回帖

    0

    VC币

    中级会员

    霜庭云花Sub

    Rank: 3Rank: 3

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

    使用道具 举报

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

    本版积分规则

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