r2 - 21 Jan 2008 - 14:03:24 - Main.yfangYou are here: YWiki >  MyTech Web > Perl脚本实现rdf格式字幕转换成srt格式

Perl脚本实现rdf格式字幕转换成srt格式

说明

  • 修改时间 2008-1-21
  • 作者:yfang (yangfang at fudan.edu.cn)
  • 原创文章,欢迎转载,转载请注明出处及作者信息,谢谢

问题描述

  • 这两天温习老影片《毕业生》,废了半天劲终于down完了,是4个文件的版本。突然发现字幕文件不被支持(是rdf格式的)。

  • 旋即google了一把怎么支持这个格式,发现支持rdf的播放器少之又少,资料也不多,最扎眼的一个资料就是 能飞英语网关于自己如何使用rdf来学习英语,云云。下载下来最新的 3.2版,典型的试用版,只能浏览一半视频,总算成功看到了字幕,心里有底了。

现在要解决看电影问题有四个思路:

  • 第一个思路,不看字幕,废话!
  • 第二个思路,找个支持的字幕,比如srt格式的
    • 这个思路我还真努力了一把,有一个叫做 射手网的网站专们提供电影字幕搜索服务,我在上面很轻松的找到了四个文件版本的毕业生字幕。有两点让我有些失望,第一,字幕不是完全合拍,大概慢10几秒,这个问题可以用srt编辑软件搞定,不过我实在不想再多装软件,没有去尝试;第二,只有英文,看着有点累。于是,这个思路到此就停止了。
  • 第三个思路,篡改avi文件,让它看上去是原来的两倍长,这样我就可以完整看完我想看的了
    • 分析了一下avi的文件头,25:42秒的一个文件,没找到改的地方(UtralEdit? ),不太清楚avi存放文件长度是怎么存放的,是不是频率乘以帧数,不太清楚,最后这个Fail
    • avi格式有索引的,简单使用文本编辑器合并两个同样的文件,需要重新编译索引,这个我最后没有做,反正直接cat file1 file2 > file 肯定不能直接增长,Skip
    • 有一个合并avi的工具,叫做VirtualDubMod,很受欢迎,尝试合并两个一样的文件,基本上顺利了,很可惜,这需要比较大的一个空间,我的硬盘只剩2G了,到一半的时候Fail(注意,单个avi文件只有百兆左右哦),没有仔细考查这个合并过程中能不能压缩,没什么欲望研究这个。
  • 第四个思路:将rdf格式字幕转成通用性更强的srt格式文件
    • 这样做有很多好处,第一,可以复用;第二,符合程序员的习惯;第三,可以抛开对什么能飞软件的依赖。
    • 具体做法参见下面的描述。

分析格式

rdf格式

RDF ( Resource Description Framework), 一种用于描述 Web 资源的 标记语言
RDF是Resource Description Framework的缩写,即 资源描述框架

  RDF是一个处理元数据的XML应用,所谓元数据,就是“描述数据的数据”或者“描述信息的信息”。也许这样解释元数据有些令人难以理解,举个简单的例子,书的内容是书的数据,而作者的名字、出版社的地址或版权信息就是书的元数据。数据和元数据的划分不是绝对的,有些数据既可以作为数据处理,也可以作为元数据处理,例如可以将作者的名字作为数据而不是元数据处理。

  众所周知,对资源的描述是领域和应用相关的,比如对一本书的描述和对一个Web站点的描述是不一样的,即对不同资源的描述需要采取不同的词汇表。因此RDF规范并没有定义描述资源所用的词汇表,而是定义了一些规则,这些规则是各领域和应用定义用于描述资源的词汇表时必须遵循的。当然,RDF也提供了描述资源时具有基础性的词汇表。

  通过RDF,人们可以使用自己的词汇表描述任何资源,但人们更乐意将它用于描述Web站点和页面,由于使用的是结构化的XML数据,搜索引擎可以理解元数据的精确含义,使得搜索变得更为智能和准确,完全可以避免当前搜索引擎经常返回无关数据的情况。当然前提是RDF和标准化的RDF词汇表在Web上广泛使用,而且搜索引擎需要能够理解使用的词汇表。

  简单而言,一个RDF文件包含多个资源描述,而一个资源描述是由多个语句构成,一个语句是由资源、属性类型、属性值构成的三元体,表示资源具有的一个属性。资源描述中的语句可以对应于自然语言的语句,资源对应于自然语言中的主语,属性类型对应于谓语,属性值对应于宾语。由于自然语言的语句可以是被动句,因此前面的简单对应仅仅是一个概念上的类比。

资源描述框架(Resource Description Framework, 简称 RDF)是一个用于表达关于万维网(World Wide Web)上的资源的信息的语言. 它专门用于表达关于Web资源的元数据, 比如Web页面的标题、作者和修改时间,Web文档的版权和许可信息,某个被共享资源的可用计划表等。然而,将“Web资源(Web resource)”这一概念一般化后,RDF可被用于表达关于任何可在Web上被标识的事物的信息,即使有时它们不能被直接从Web上获取。比如关于一个在线购物机构的某项产品的信息(例如关于规格、价格和可用性信息),或者是关于一个Web用户在信息递送方面的偏好的描述。

  • 说白了就是一种xml,形如
 
<!--以下代码来自第一个rdf文件,使用xmlformat1.04工具实现自动格式化后的样子,源文件只有一行,可读性很差
关于xmlformat的更多信息,请访问http://www.kitebird.com/software/xmlformat/
-->
<resource xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="script.xsd">
 <description>
  <titles v="C:\Downloads\(经典大片)毕业生\毕业生(1)"/>
  <compiler/>
  <reviser/>
  <creator/>
  <abstract/>
 </description>
 <script>
  <sn>
   <s id="_1" b="8660" e="12220" v="Ladies and gentlemen, we're about to begin our descent into Los Angeles.">
    <t l="zh" v="各位乘客,飞机即将降落洛衫机"/>
    <n l="zh" v=""/>
    <ws/>
   </s>
   <s id="_2" b="12780" e="16060" v="The sound you just heard is the landing gear locking into place.">
    <t l="zh" v="大家刚才听到的是起落架的声音"/>
    <n l="zh" v=""/>
    <ws/>
   </s>
   <s id="_3" b="16420" e="19860" v="Los angeles weather is clear,the temperature is 72.">
    <t l="zh" v="洛衫机天气晴朗,温度是华氏72度"/>
    <n l="zh" v=""/>
    <ws/>
   </s>
   <s id="_4" b="20260" e="23780" v="We expect to make our 4-hour and 18-minute flight on schedule.">
    <t l="zh" v="飞机行程如预计的一样,历时4小时18分钟"/>
    <n l="zh" v=""/>
    <ws/>
   </s>
.....................
  </sn>
 </script>
</resource>

srt 格式

文本格式字幕:比较流行的文本字幕有srt、smi、ssa,因为是文本格式,所以就比较小了,一般大不过百来k。其中srt文本字幕最为流行,因为其制作规范简单,一句时间代码+一句字幕,使得制作修改就相当简单。配合上.style文件还能让srt自带一些字体上的特效等。几种文本字幕可以互相转换。文本字幕一般通过对图形字幕进行OCR或者手工制作生成,OCR英文字幕不难,毕竟英文识别难度小嘛,OCR中文难度就大一些,所用的软件个头也不小(SubOCR,30多MB)。

  • 这个格式人看上去更清楚一点,形如
# 以下代码来自我用程序处理过后的字幕文件

1
00:00:08,660 --> 00:00:12,220
各位乘客,飞机即将降落洛衫机

2
00:00:12,780 --> 00:00:16,060
大家刚才听到的是起落架的声音

3
00:00:16,420 --> 00:00:19,860
洛衫机天气晴朗,温度是华氏72度

代码实现

  • 下面的代码实现了把rdf格式字幕转换成两种语言的srt字幕文件,会在原来rdf文件目录生成同名srt字幕文件
  • 比如,rdf2srt.pl C:\yfang.rdf将会生成 C:\yfang.eng.srt和C:\yfang.chn.srt

#!/usr/bin/perl -w 

# rdf2srt.pl
# Author: yangfang 
# Mail: yangfang at fudan.edu.cn 
# Data: 2008-1-21 
# Discription: Covert rdb to srt format 

#!/usr/bin/perl -w

use XML::Simple; 
use Data::Dumper;
use File::Basename;

&main();

sub format_time{                              # 将毫秒时间化成hh:mm:ss,ms的格式
        my ($msec )= @_;
        my $hour = $msec  / 3600000;
        my $remain = $msec % 3600000;
        my $minute = $remain / 60000;
        $remain = $msec % 60000;
        my $second = $remain / 1000;
        my $result = sprintf("%02d:%02d:%02d,%03d", $hour,$minute,$second,$remain%1000);
        return $result;
}

sub main{
        my ($file_name) = @ARGV;
        my $xml = new XML::Simple;
        my $data = $xml->XMLin("$file_name");
        #print Dumper($data);
        
        my $basename = basename($file_name,'avi');
        my $dirname = dirname($file_name);
        open(ENG_FILE,">:encoding(iso-8859-7)", "$dirname/$basename.eng.srt"); 
        open(CHN_FILE,">:encoding(gbk)", "$dirname/$basename.chn.srt");      # 因为播放器用系统默认编码打开文件,这里写文件需要指定成系统默认编码GBK,否则会变成UTF8的中文,还会在执行程序时报宽字符集警告。
        foreach my $even(sort {substr($a, 1) <=> substr($b, 1)} keys %{$data->{script}->{sn}->{s}}) {
                my $begin_time = format_time($data->{script}->{sn}->{s}->{$even}->{b});
                my $end_time = format_time($data->{script}->{sn}->{s}->{$even}->{e});
                my $en_sub = $data->{script}->{sn}->{s}->{$even}->{v};
                my $ch_sub = $data->{script}->{sn}->{s}->{$even}->{t}->{v};
                
                my $index = substr($even,1);
                print ENG_FILE "$index\n$begin_time --> $end_time\n$en_sub\n\n";
                print CHN_FILE "$index\n$begin_time --> $end_time\n$ch_sub\n\n";
        }
        close(ENG_FILE);
        close(CHN_FILE);
}

一点废话

  • 鉴于四处找不到rdf格式字幕的资料,我估计rdf格式字幕是能飞网专门定制的字幕,网上流传的rdf字幕也多出自这个网站之手,目的不错,帮人学英语。因为我下的是经典,估计也是英语学习的重要篇目,所以才让我看到这个问题,不知道有多少人会遇到和我一样的问题,这个字幕就简单作为XML::Simple的例子吧。

-- Main.yfang - 21 Jan 2008

Topic attachments
I Attachment Action Size Date Who Comment
txttxt rdf2srt.pl.txt manage 1.9 K 21 Jan 2008 - 08:30 Main.yfang rdf格式字幕转srt格式
elserdf 毕业生(1).rdf manage 51.0 K 21 Jan 2008 - 08:31 Main.yfang 范例rdf文件
elsesrt 毕业生(1).rdf.chn.srt manage 20.6 K 21 Jan 2008 - 08:32 Main.yfang 程序生成的中文字幕srt文件
elsesrt 毕业生(1).rdf.eng.srt manage 26.4 K 21 Jan 2008 - 08:32 Main.yfang 程序生成的英文字幕srt文件
Edit | WYSIWYG | Attach | Printable | Raw View | Backlinks: Web, All Webs | History: r2 < r1 | More topic actions
 
Powered by YWiki
This site is powered by the TWiki collaboration platformCopyright © by the contributing authors. All material on this collaboration platform is the property of the contributing authors.
Ideas, requests, problems regarding YWiki? Send feedback