[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖
本帖最后由 523066680 于 2018-1-30 10:06 编辑

字幕?

Perl

2018-01-30 更新

      use File::Slurp;
      use File::Basename;
      use Term::ReadKey;
      STDOUT->autoflush(1);

      chdir '.\TEDTXTUNICODE' or
      chdir 'C:\Users\CH6\Desktop\TEDTXTUNICODE' or quit( $! );
      my $path_eng = '.\eng1246';
      my $path_chs = '.\chs1203';
      my $path_merge = '.\merge';

      mkdir $path_merge unless -e $path_merge;

      my ($en, $cn, $merge);
      for my $cn ( glob "$path_chs\\*.txt" )
      {
          $en = "$path_eng\\". basename($cn);
          $merge = "$path_merge\\". basename($cn);
          merge( $en, $cn, $merge ) if ( -e $en );
      }
      quit("Done");

      sub merge
      {
          my ( $en, $cn, $merge ) = @_;
          my @arr = read_file( $en );
          my @brr = read_file( $cn );
          my @mix;
          grep
          {
              $arr[$_] =~s/\r?\n//;
              $arr[$_] .= " ". $brr[$_]
          }
          ( 0 .. $#arr );

          @mix = grep { ( /^\d+\s+\d+$/ or /\d+:\d+:\d+/ or /^\s+$/ ) ? 0 : 1 } @arr;
          write_file( $merge, @mix );
          print "$merge\n";
      }

      sub quit
      {
          print $_[0];
          ReadKey -1;
          exit;
      }

TOP

本帖最后由 523066680 于 2018-1-30 09:01 编辑

回复 4# allenyzq147


    你需要把

my $path_eng = '.\TEDTXTUNICODE\eng1246';
my $path_chs = '.\TEDTXTUNICODE\chs1203';
my $path_merge = '.\TEDTXTUNICODE\merge';

这三行的路径改成你自己的,以及按你更新后的需求,最好是打包几个eng和chn的文件样本发上来,或者完整的打包发到网盘。
不然别人帮你解决问题,还得自己模拟文件环境,自己测试自己校验,最后发现需求改了?

TOP

更新:

1. chdir 路径 or 题主路径,这样不改代码就可以在我的目录和题主的环境上运行
  1. chdir '.\TEDTXTUNICODE' or
  2. chdir 'C:\Users\CH6\Desktop\TEDTXTUNICODE' or quit( $! );
复制代码
2. 增加时间轴匹配,时间对应才合并,如果没有匹配到时间会提示 missing $time at $filename

      =info
          523066680@163.com
          匹配时间轴,改善输出提示
      =cut

      use Encode;
      use File::Basename;
      use Term::ReadKey;
      STDOUT->autoflush(1);

      chdir '.\TEDTXTUNICODE' or
      chdir 'C:\Users\CH6\Desktop\TEDTXTUNICODE' or quit( $! );
      my $path_eng = '.\eng1246';
      my $path_chs = '.\chs1203';
      my $path_merge = '.\merge';

      mkdir $path_merge unless -e $path_merge;

      my ($en, $cn, $merge);
      for my $cn ( glob "$path_chs\\*.txt" )
      {
          $en = "$path_eng\\". basename($cn);
          $merge = "$path_merge\\". basename($cn);
          merge( $en, $cn, $merge ) if ( -e $en );
      }
      quit("Done");

      sub merge
      {
          my ( $en, $cn, $merge ) = @_;
          my ( %ha, %hb, $mix );
          print "Processing $merge\n";

          load( \%ha, $en );
          load( \%hb, $cn );
          $mix = "";
         
          for my $time ( sort keys %ha )
          {
              unless ( exists $hb{$time} )
              {
                  print "  missing $time at $cn\n";
                  next;
              }
              $mix .= $ha{$time} ." ". $hb{$time} ."\r\n";
          }

          open $fh, ">:raw", $merge;
          print $fh "\xff\xfe". encode('utf16-le', $mix);
          close $fh;
      }

      sub load
      {
          my ( $href, $file ) = @_;
          open my $fh, "<:encoding(utf16-le)", $file;
          my @arr = <$fh>;
          close $fh;
          for my $id ( 0 .. $#arr )
          {
              if ( $arr[$id] =~/(\d+:\d+:\d+).*\d+:\d+:\d+/ )
              {
                  $href->{$1} = $arr[$id+1];
                  $href->{$1} =~s/\r?\n//;
              }
          }
      }

      sub quit
      {
          print $_[0];
          ReadKey -1;
          exit;
      }


测试《雷神》字幕(手动去掉了一个时间轴)
Processing .\merge\Thor.txt
  missing 00:00:54 at .\chs1203\Thor.txt


.\merge\Thor.txt
Now, I know what you're thinking. 我知道你在想什么
"Oh, no! Thor's in a cage. How did this happen?" 不  托尔被关在笼子里了  怎么回事
Well, sometimes you have to get captured 有时  你得先被抓住
just to get a straight answer out of somebody. 才能从某人那里问出个所以然来
It's a long story, but basically, I'm a bit of a hero. 说来话长  但其实  我算是个英雄


分享个雷神字幕的示例包裹,含目录结构

TOP

回复 11# allenyzq147

    哦,原来是 utf16-le 的编码。代码更新在附件,附输出结果(发现Adam Grosser的一些时间段是没有中文翻译的,如果按行合并,就会错乱。)
  1. Processing .\merge\A TED speakers worst nightmare.txt
  2. Processing .\merge\Adam Grosser - A mobile fridge for vaccines.txt
  3.   missing 00:00:28 at .\chs1203\Adam Grosser - A mobile fridge for vaccines.txt
  4.   missing 00:00:29 at .\chs1203\Adam Grosser - A mobile fridge for vaccines.txt
  5.   missing 00:00:31 at .\chs1203\Adam Grosser - A mobile fridge for vaccines.txt
  6.   missing 00:00:33 at .\chs1203\Adam Grosser - A mobile fridge for vaccines.txt
  7.   missing 00:00:37 at .\chs1203\Adam Grosser - A mobile fridge for vaccines.txt
  8.   ...
  9. Processing .\merge\Ahn Trio - A modern take on piano violin cello.txt
  10. Done
复制代码
我现在的处理方式是按时间段匹配,如果没有对应翻译就不输出。

TOP

本帖最后由 523066680 于 2018-1-30 17:39 编辑

回复 16# allenyzq147

    上一段代码只对 utf8 gbk 之类(这类编码和 ASCII 码兼容)的编码起作用。现在的代码只对  utf16-le 编码起作用。
旧代码的问题以及原因:utf16-le 对 ASCII 范围的编码补0,扩充到两个字节,这样换行\r\n就不是 0d 0a, 而是 0d 00 0a 00,匹配换行的时候就会有差异。

TOP

返回列表