星期三, 11月 09, 2011

可憐的暴龍

這篇其實是針對我之前抱怨現在很多人翻譯別人的圖片或其他創作時,有些人刻意忽略標註來源的基本禮貌。

老美蠻常開暴龍 (T-Rex) 的短前肢的玩笑。下面這個胸章就是其中一例。


以下圖片引用自 9gag.com,最原始來源雖然做過搜尋,但發現難以查證。


以下是我翻譯後的圖片:


使用軟體:GIMP

繼續閱讀全文

星期四, 11月 03, 2011

翻譯或引用時應該註明來源出處

網路上有很多資訊是可以免費取得的,有些沒有註明授權方式,有些則註明使用 Creative Commons 授權。不過不管哪一種,引用別人的創作時,不論是直接引用或是間接的翻譯內容時,註明原始內容的來源出處在我看來是常識性的應有禮貌,但是似乎對其他人來說,似乎不是這麼回事?


前一陣子,PTT 電子佈告欄上開始出現了翻譯國外網路漫畫或圖片的風潮,霎時間突然出現超過一位以上的翻譯者,其中還有因為翻譯相同漫畫而發生磨擦的狀況。不過老實說,在我看來,不管是哪位翻譯者,幾乎都發生沒有註明出處的問題。有的翻譯者翻譯的圖片是經由某些收集有趣圖片的網站而來的,而該網站已經在圖片上加註他們網站的網址浮水印(不過還是沒有圖片原始來源的網址),因此『勉強』算是標上了來源,馬馬虎虎算是可以接受。不過最糟糕的是那些直接翻譯自原始來源網站的圖片,但又不標上來源網址的。有些圖片經過不斷被轉錄之後,要追查來源確實是幾乎不可能,但是會造成這種現象的主因,根本也是在於轉錄時沒有標明來源所造成的結果!

引用或翻譯時註明來源不但是一種基本禮貌,同時也是一種避免翻譯失真的補救辦法。翻譯並不難,但是要『翻得對』有時候不是那麼容易,要『翻得好』很多時候更是難上加難。註明來源出處,除了是一種基本禮貌,也是給予原始創作人應得的讚賞之外,更是給予讀者一個得知創作品原意的補救途徑。畢竟很少有人可以拍胸脯說,自己可以原汁原味的表現出原文的原意,不是嗎?

繼續閱讀全文

星期二, 11月 01, 2011

ABC 的 Once Upon A Time

今年底,ABC 和 NBC 不約而同的推出以迪士尼童話故事以及格林童話為背景的影集。ABC 的是 Once Upon A Time,NBC 則是 Grimm。ABC 的 Once Upon A Time 是以白雪公主的故事為背景來展開劇情,目前已經播出兩集了。


Once Upon A Time 雖然是以白雪公主為主軸,但是其實還參雜了許多其他故事裡的角色,像是睡美人等等,故事劇情其實在一開始就跟童話故事有些不同。

女主角之一是由在 House 中飾演 Dr. Cameron 的 Jennifer Morrison 擔任。自從 Jennifer Morrison 在上一季中退出 House 的演員陣容之後,已經一段時間蠻看到人了,主要是她有出現的幾個影集我都沒在看。到第二集為止,雖然 Jennifer Morrison 出現過幾個蠻不錯的造型,可是總覺得怪怪的,而且看起來比飾演他『理論上』的媽媽的 Ginnifer Goodwin 看起來要老氣(不過演員的實際年齡來說,確實 Ginnifer Goodwin 比 Jennifer Morrison 大一歲,但畫面上看起來的感覺則有點相反)。

男性反派角色之一則有帥氣的蘇格蘭演員 Robert Carlyle 某反派角色。Robert Carlyle 演過的電視電影其實我看過的不只一部,但是讓我對這個演員有印象的,反而是 Stargate 系列中唯一被腰斬的 Stargate Universe。Stargate Universe 中,他演的角色也是個不是完全正派的科學家,但是他的角色是我認為在編劇頭殼壞掉的 Stargate Universe 中,最『正常』最『合乎邏輯』的角色,也是我在那系列中最喜歡的角色。相對於其他角色的反反覆覆,他演的角色其實最終的動機相當單純,是純粹的對終極知識的渴望,雖然很多時候因為這種渴望而做出不合人情的判斷,但是至少是從一而終的角色。

至於其他演員,大都不是我熟悉的演員,雖然有一些以前看過,不過比起 Jennifer Morrison 和 Robert Carlyle 來說,都算是不熟悉的演員,不過幾個主要演員其實都還表現得不錯。像是飾演反派女主角的 Lana Parrilla 雖然『童話造型』其實不好看,但是時裝造型和表現其實相當搶眼。

整體來說,Once Upon A Time 目前看起來似乎蠻有希望可以撐過至少一季,應該不會像另一個 ABC 的影集,新版的 Charlie's Angels 那樣,第1季播出4集就宣佈確定腰斬(不過其實比起來,還是 NBC 砍影集砍的比較狠)。

繼續閱讀全文

星期日, 10月 30, 2011

ann2srt v0.3

出乎意料之外的,ann2srt v0.2 的英文發布網誌得到了不少使用者回應。反觀中文版的對應發布文章反而靜悄悄...

言歸正傳,感謝在英文網誌上回應並協助測試的讀者 L,ann2srt script 修正了在某些英文註解中會遇到的特殊狀況(例如註解中有換行字元和半形逗號),以及在 Cygwin 環境下因為混用 DOS 與 UNIX 格式的換行字元造成程式執行錯誤的問題,因此釋放出 0.3 版。雖然這些修正其實在上週就完成了,且在上週末經過測試確認可以在 Linux 和 Cygwin 下執行無誤,不過實在是太懶惰了,所以一直沒有正式釋放出來...


廢話不多說,因為也想不出有啥廢話可以繼續扯下去,所以以下就是 v0.3 的原始碼:


#!/bin/bash
#
# Convert the youtube annotation into SRT subtitle
#
# By Shang-Feng Yang
# Version: 0.3
# License: GPL v3
#
# Changelog:
# * v0.3 (Oct/19/2011):
# - Fix the parsing errors caused by comma and newline characters in
# some English annotations
# - Adding transparent dos2unix conversion for compatibility under Cygwin
# * v0.2 (Jan/19/2011):
# - Sort the annotations using the "begin" time as key
# - Minor bugs fixing
# * v0.1 (Dec/7/2010):
# - Initial release


ANN=$1
SRT=$(basename ${ANN} .xml).srt
IFS=$'\n'
I=0

function usage() {
echo -e "Usage:\n"
echo -e "\t$(basename $0) ANNOTATION_FILE\n"
}

function parseXML() {
cat ${ANN} | tr -d '\r' |tr '\n' ' ' | xmlstarlet sel -t -m 'document/annotations/annotation' -v 'TEXT' -o '|' -m 'segment/movingRegion/rectRegion' -v '@t' -o '|' -b -n | tr -d '\r'
}

function reformatTime() {
local H=$(echo $1 |cut -d ':' -f 1)
local M=$(echo $1 |cut -d ':' -f 2)
local S=$(echo $1 |cut -d ':' -f 3)
printf '%02d:%02d:%06.3f' ${H} ${M} ${S} |tr '.' ','
}

function time2sod() {
# Convert time in HH:MM:SS.SSS format into second-of-the-day value
local SOD=$(echo $1 | awk -F ":" '{printf("%f\n", $1*3600+$2*60+$3);}')

echo ${SOD}
}

[ "x${ANN}" = "x" ] && { usage; exit 1; }
[ -f ${ANN} ] || { usage; exit 1; }
[ -f ${SRT} ] && rm ${SRT}
[ -f ${SRT}.tmp ] && rm ${SRT}.tmp

for LINE in $(parseXML); do
C=$(echo ${LINE} |cut -d '|' -f 1)
B=$(echo ${LINE} |cut -d '|' -f 2)
E=$(echo ${LINE} |cut -d '|' -f 3)
echo "$(time2sod ${B})#${B}#${E}#${C}" >> ${SRT}.tmp
done

grep "###" ${SRT}.tmp && {
echo "\"${ANN}\" has no valid annotation!" >&2
rm ${SRT}.tmp
exit 1
}

for LINE in $(cat ${SRT}.tmp|sort -n -t '#'); do
(( I++ ))
C=$(echo ${LINE} |cut -d '#' -f 4)
B=$(reformatTime $(echo ${LINE} |cut -d '#' -f 2))
E=$(reformatTime $(echo ${LINE} |cut -d '#' -f 3))
echo -e "${I}\n${B} --> ${E}\n${C}\n" >> ${SRT}
done

rm ${SRT}.tmp


為了避免因為複製貼上造成的錯誤,所以以上程式也可以從這邊下載:
http://dl.dropbox.com/u/1382119/tmp/ann2srt

基本上 v0.3 和 v0.2 比起來,並沒有太多的改變,只有為了避開註解中出現半形逗號的狀況,所以把本來當作中介格式的 CSV 格式的分隔符號,由逗號改成了 "|" 符號,並且使用 tr 移除沒必要的換行字元和把 DOS 的換行字元轉換成 UNIX 格式。由於 DOS 轉 UNIX 格式實際上只是摻除 carrier return 字元 ("\r" 字元),所以這樣的修改並不會影響在 Linux 下的執行。

繼續閱讀全文

星期四, 1月 20, 2011

ann2srt v0.2

前幾天偶然間在某個電子佈告欄上,看到有人引用了我之前寫的『下載並轉換 Youtube 的 annotation 至 SRT 格式』的 bash script 以及些許文章內容,不過因為該篇文 blog 中發表的 0.1 版是相當簡略的版本,沒有處理時間排序、字幕顏色與位置等問題,並且有一點小小的錯誤,所以昨天花了點時間加上排序的功能,並修正了些錯誤。


這次的修正讓 ann2srt 多用了 awk 以及 sort 做排序的處理。sort 是 GNU coreutils 的一部分,awk/gawk 通常大部分的系統也都預設會安裝,所以應該不會有問題。除此之外,用到的外部程式與 v0.1 一樣。排序的部分,排序的依據是使用該註解的『開始』時間,將所有註解的『開始』時間轉換為以秒為單位後進行排序。

以下是 v0.2 的程式碼:

#!/bin/bash
#
# Convert the youtube annotation into SRT subtitle
#
# By Shang-Feng Yang <storm_DOT_sfyang_AT_gmail_DOT_com>
# Version: 0.2
# License: GPL v3
#
# Changelog:
# * v0.2 (Jan/19/2011):
# - Sort the annotations using the "begin" time as key
# - Minor bugs fixing

function usage() {
echo -e "Usage:\n"
echo -e "\t$(basename $0) ANNOTATION_FILE\n"
}

function parseXML() {
cat ${ANN} |xmlstarlet sel -t -m 'document/annotations/annotation' -v 'TEXT' -o ',' -m 'segment/movingRegion/rectRegion' -v '@t' -o ',' -b -n
}

function reformatTime() {
local H=$(echo $1 |cut -d ':' -f 1)
local M=$(echo $1 |cut -d ':' -f 2)
local S=$(echo $1 |cut -d ':' -f 3)
printf '%02d:%02d:%06.3f' ${H} ${M} ${S} |tr '.' ','
}

function time2sod() {
# Convert time in HH:MM:SS.SSS format into second-of-the-day value
local SOD=$(echo $1 | awk -F ":" '{printf("%f\n", $1*3600+$2*60+$3);}')

echo ${SOD}
}

ANN=$1
SRT=$(basename ${ANN} .xml).srt
IFS=$'\n'
I=0

[ "x${ANN}" = "x" ] && { usage; exit 1; }
[ -f ${ANN} ] || { usage; exit 1; }
[ -f ${SRT} ] && rm ${SRT}
[ -f ${SRT}.tmp ] && rm ${SRT}.tmp

for LINE in $(parseXML); do
C=$(echo ${LINE} |cut -d ',' -f 1)
B=$(echo ${LINE} |cut -d ',' -f 2)
E=$(echo ${LINE} |cut -d ',' -f 3)
echo "$(time2sod ${B})#${B}#${E}#${C}" >> ${SRT}.tmp
done

grep "###" ${SRT}.tmp && {
echo "\"${ANN}\" has no valid annotation!"
rm ${SRT}.tmp
exit 1
}

for LINE in $(cat ${SRT}.tmp|sort -n -t '#'); do
(( I++ ))
C=$(echo ${LINE} |cut -d '#' -f 4)
B=$(reformatTime $(echo ${LINE} |cut -d '#' -f 2))
E=$(reformatTime $(echo ${LINE} |cut -d '#' -f 3))
echo -e "${I}\n${B} --> ${E}\n${C}\n" >> ${SRT}
done

rm ${SRT}.tmp


使用方法與注意事項依然與 v0.1 相同。

繼續閱讀全文