2010年7月24日 星期六

影片字幕的處理

射手網 收集了許影片的字幕,用來搭配影片檔案,造福了廣大人民。

有些熱門的片子,字幕就很齊全,簡繁英俱全,
有的影片卻只找得到簡體字版,
雖然簡體字看起來實在不習慣,不過多懂一些還是有益處,
所以會嘗試去接受這類的字幕,如果真的受不了(簡體字有點醜)
可以使用下列指令轉換成順眼悅目的正體字:

iconv -f gb2312 -t big5 gb.srt | iconv -f big5 -t utf-8 > utf8.srt

(* 人生不是所有事情都是完美的 *)

有時候,中文字幕是標準的正體沒錯,但顯示的時間就是不對,
答非所問,荒腔走板,空有字幕檔也沒有用,仰天長嘆,莫可奈何。
沒辦法還是要正向思考,提昇一下層次,學習看英文字幕好了(還是那句話:"多懂一些還是有益處"的 )
問題是,有的影片雅俗共賞,講得也都是"人"話,不會天馬行空,那就勉強可以看下去。
但,天不從人願,有的影片的編劇擺明就是火星來的,生字一堆,講得又快,不是看不懂,就是看得不夠快。

今天碰到的狀況是這個樣子,英文字幕OK,有中文字幕,但時間不對。
想辦法將兩個字幕合併,保留英文字幕的時間,再用中文字幕的文字來取代英文。

步驟有三:
(1) 讀取中文字幕,去除時間,保留中文字 ,寫入YAML檔。
(2) 目視比對中英文字幕,調整差異處。
(3) 讀取英文字幕,去除英文,代入中文。

* 中文字幕
24
00:02:47,444 --> 00:02:50,572
我們在讀《雙城記》,還不錯吧?

25
00:02:50,814 --> 00:02:53,009
那不是狄更斯的代表作
學校裡比較流行

26
00:02:53,216 --> 00:02:57,880
我認為《大衛·科波維爾》
和《遠大前程》內容更好

* 轉成YAML格式檔
- - 21
  - 我們在讀《雙城記》,還不錯吧?
- - 22
  - 那不是狄更斯的代表作
  - 學校裡比較流行
- - 23
  - 我認為《大衛·科波維爾》
  - 和《遠大前程》內容更好

* 轉換YAML程式
use strict;

use Encode qw/decode/;
use YAML qw/DumpFile/;

open SRT, '<', 'big.srt';

my @srt;
my @srtline;
my $index;

while (<SRT>) {

    chomp;
    s/\r//;

    my $line = decode('utf-8', $_);

    if ($line =~ /^\d+\b/) {
        next
    }
    elsif ($line =~ /^\s*$/) {
        $index++;
        push @srt, [$index, @srtline];
        @srtline = ();
    }
    else {
        push @srtline, $line;
    } 
}

DumpFile('big.yml', \@srt);


* 合併程式
  
use strict;

use utf8;

use Encode qw/decode/;
use YAML qw/LoadFile/;

open SRT, '<', 'eng.srt';
binmode STDOUT, ":utf8";

my @srt = @{LoadFile('big.yml')};
while (<SRT>) {

    my $line = decode('utf-8', $_);

    if ($line =~ /^\d+\b/) {
        print;
    }
    elsif ($line =~ /^\s*$/) {
        my @line = @{ shift @srt };
        shift @line;
        print "$_\n" for @line;
        print "\n";
    }
    else {
        * just ignore them
    } 
}

一點小小的加工,得到合理的結果,太完美了 :-) 。

ps. 影片名稱:《The Squid and the Whale》

沒有留言:

張貼留言