• 沒有找到結果。

五、 系統設計與實作

5.2 改編協調伺服器之設計與實作

5.2.2 協調引擎設計製作

協調引擎(Negotiation engine)會將剛剛從描述檔剖析器(Script parser) 解析的多媒體文件內容資訊,以及根據參數的輸入,進行改編協調。整個過程會 經由四個步驟來完成:分析(Analysis)、暫時轉譯(Temporal translation)、

推薦選擇(Recommended choice)、媒體轉換(Media Conversion)。

z 分析(Analysis)

這裡分析的主要目的是能夠區分原來的多媒體內容是什麼樣式的呈現,並將 原來的內容作切割的動作,然後再進行相對應的行動裝置模擬呈現。由於英文的 試題版型固定分成“stimulus”、“question”及“answer”三個段落,我們可以以 這三部份作為段落區分(Paragraph),再依據字數、字形大小、圖片大小、螢幕 大小,進行頁數分配(pages)。我們將欲轉換輸出的模擬版型規劃成如下圖 17 之右邊四種Case 的可能。

圖 17: 英文試題版型分配可能

„ 段落區分的演算法:

由於單純從文件資訊並沒有直接辦法來決定哪一個多媒體物件是屬於

“stimulus”、 “question” 或 “answer”段落,唯一可以決定的便是用座標來 判定。

圖 18: 英文試題段落分配範例

以上面圖片的例子來說的話,演算法會先搜尋三個關鍵字[Stimulus]、

[Question]、[Answer],也就是本試題將會有三個段落,接下來會將其他的多 媒體物件安排至這三個段落裡,安排方式依照位置的比較,虛擬碼如下:

Foreach Mediaobj in Story {

If Mediaobj.x < Question.x && Mediaobj.x < Answer.x Î Mediaobj belongs to [Stimulus]

If Mediaobj.x >= Question.x && Mediaobj.y < Answer.y Î Mediaobj belongs to [Question]

If Mediaobj.x>=Answer.x && Mediaobj.y > Answer.y Î Mediaobj belongs to [Answer]

}

„ 頁數分配演算法:

對於頁數分配的話,以英文試題來解釋的話,我們要先界定四種轉換出去的 case。

◆ Case 1: 是“stimulus”、“question” 及“answer”這三個段 落裡頭縮放後的內容可以在相對應的行動裝置一個頁面容納得 下。

◆ Case 2 : 是將原本的多媒體內容以兩頁方式來呈現。也就是

“stimulus”及“question”這兩個段落裡縮放後的內容可以在 相對應的行動裝置一個頁面容納得下,但“answer”這段落裡的 內容無法在剩餘的空間容納,於是便將他獨立成一頁。

◆ Case 3: 是將原本的多媒體內容以兩頁方式來呈現。也就是

“question”及“answer”這兩個段落裡縮放後的內容可以在相 對應的行動裝置一個頁面容納得下,但”stimulus”這段落裡的 內容無法在剩餘的空間容納,於是便將他獨立成一頁。

◆ Case 4: 這裡的情況必須將“stimulus”、 “question” 及

“answer”各分成三頁來呈現,原因可能是“question”段落內 容太多必須用一個頁面來呈現,或者另外一個情況是

“stimulus” 和“question”或“question” 和“answer”兩個段 落內容加起來會超過一個頁面。

以簡單的判斷式來描述上面這四種情況,如下圖19:

圖 19: 頁數分配演算法

我們以一個簡單的例子來詳細說明整個頁數分配過程,下圖20 是三個段落的字 數加總結果小於PDA 最大可容納的字數,所以我們可以選定 case1 的情況,也 就是以一個頁面來呈現即可,我們以一般PDA 常見的螢幕大小 240x320 像素,

以及字形大小10px,這樣的螢幕大小大約可以容納 400 個英文字,皆下來必 須算出原來的每個段落大約的英文字數,在下面的例子來說“Stimulus”為包含 一張圖片段落,對於包含圖片的內容,必須將他等比例縮小到相對的size 然後 再以10px 的英文字大小來估測可以容納多少英文字。

圖 20: 頁數分配演算法範例

z 暫時轉譯(Temporal translation)

上一步驟的分析結果,我們可以得到欲轉換輸出的結果應該要分成多少頁數 才能呈現;在這個步驟裡,我們必須暫時的轉換已經選定case 裡的所有可能版 型。當然每種版型必須搭配不同的文字斷行(Line breaking),還有圖片縮放 (Image scaling),不過到目前只知道每個版型的樣式,並不知道每個樣式裡的 區分大小,因此在這之前必須要先進行版型比例分配。暫時轉譯(Temporal translation)的整體運作過程可以如下圖 21 所示:

圖 21: Temporal translation 整體運作過程

皆下來會一一介紹版型比例分配演算法、文字斷行演算法以及圖片縮放演算法。

„ 版型比例分配演算法

圖 22: 版型分配比例估計演算法

以上圖22 的例子來說的話,我們選定 case1 的其中ㄧ版型來轉換,而他 們個各段落的長寬分配比例我們會以他們的段落所佔的字數開跟號之比值來計 算。這只是粗略的估計方式,並不能保證完全符合每個段落所需的大小。

分配完段落每個區塊的比例之後,接下來會進行所屬多媒體物件安排至相對 的段落區塊裡,每個安排的動作很簡單,除了多媒體位置的設定外,如果是文字 多媒體物件的話,會進行重新斷行的動作,如果是影像多媒體物件的話,會進行 重新縮放(scaling)的動作。

„ 文字斷行演算法

精準的文字斷行必須考慮到每個英文字的長寬,在我們的系統裡會儲存著多 種文字大小的英文字表[font table],藉由字表的查詢來計算每個英文單字的長 度。為了加數計算,字表以hash 方式來儲存。下面圖 23 是以計算英文字

“Stimulus”為例子。

圖 23: 計算英文字長度範例

而字表[font table]的製作方式,我們利用 Microsoft visual c++6.0 的 開發工具來創建9~12pt 的字表,下面是 vc++的虛擬碼:

CFont cfont;

cfont.CreatePointFont(90,"Arial"); // 9 point 的 arial 字形 dc.SelectObject(&cfont);

for(int i=33 ; i <=126; i++) { // ascii code 33~126 c = (char)i;

GetTextExtentPoint(dc.m_hDC,c ,1,&csize);

//取得一英文字的大小

// csize.x 即是一英文字的寬 // csize.y 即是一英文字的長 }

要進行斷行的話,在填入段落區塊的過程中,必須一直比對區塊的寬度,只 要下一個要填入的英文單字超過可用剩餘空間的寬度的話,資料結構裡會記錄斷 行的記號。整體斷行機制的運行過程如下圖24:

圖 24: 英文句子斷行演算法流程圖

„ 圖片縮放演算法

上面是處理文字多媒體物件的規劃,而遇到影像多媒體物件的,即要重新計 算他的長寬,依據分配到的空間進行比例縮放。以下例子可以闡述影像縮放演算 法:

圖 25: 圖片縮放比例演算法範例說明

圖25 左邊是原來的多媒體試題,原來“Stimulus”段落區塊長寬是 h1,w1,

原圖片長寬是h2,w2,經過分配比例得到的新區塊長寬是 h3,w3。新圖片長寬 h4,w4 是我們要計算的。以右邊的比例公式可以很簡單的算出 h4,w4 結果。

z 推薦選擇(Recommended choice)

從上面的步驟下來,我們已經選定四種 case 之一種,並暫時的轉換到此 case 裡的所有版型。在這步驟中,我們要分析這些版型的好壞,以決定哪一個 可以得到推薦的最佳轉換結果。選定的演算法會從三個分析項目去考量-斷行 數、影像縮放比、重疊覆蓋與否:

1、刪除重疊或覆蓋的-希望所有內容能清楚及ㄧ覽無遺。

2、刪除斷行數多的-斷行數多的文句對於閱讀者會顯得吃力。

3、選擇圖縮放長寬比最接近 1.0。

這裡要闡述的影像縮放長寬比是以原來影像長寬比和新的影像長寬比,兩個 相除的比值,而其原因是為了達到影像最不失原影像所傳達的意涵,我們以下圖 26 說明影像縮放長寬比:

圖 26:不同圖縮放長寬比例差別

我們可以看到圖26 右邊為原始在 PC 上呈現的圖片,左邊兩小圖片其縮放長寬 比分別為1.1975 及 0.3234,很明顯的可以看出兩張小圖片的好壞,也就是其 縮放長寬比最近1.0 的為 1.1975,其圖片內容的比例最接近原始圖片內容的比 率。

再來我們將以下圖27、28 的例子來說明整個推薦選定過程:

圖 27:推薦選擇版型演算法例子

圖 28: 圖 27 例子的數據分析

以上面這例子來說的話,我們會先運行演算法的第一個步驟,也就是先將有覆蓋 到的版型刪除(圖 27 的 2 、3),再來刪除斷行數多的(圖 27 的 6),如果有相 同的斷行數版型(圖 27 的 1、 4 、5),再選取圖縮放長寬比的比值最接近 1 的 (圖 27 的 4),所以我們得到可以推薦的第四版型給使用者。

z 媒體轉換(Media Conversion)

我們除了文字外會以開放函式庫(open library)或現有的函示庫來組織我們這 裡的多媒體物件轉換,主要的多媒體物件轉換包括了下列:

„ 圖片轉換:

函式庫: DevIL on unix version

轉換內容: 圖檔格式轉換(png、bmp、jpg、gif)、縮放轉換(scaling) 方法:

1. 下載 DevIL 並安裝 bmp 轉 jpg 300x200

C language like syntax:

ilInit();

iluInit();

ilLoadImage(“temp.bmp”);

iluScale(300, 200, 1);

ilSaveImage(“temp.jpg”);

„ 聲音轉換:

函式庫: Lame Mp3 encoder, Microsoft media Encoder8.0 on win32 轉換內容: 聲音格式轉換(wav、mp3)

方法:

1.下載 lame library windows version 運用 command line 完成 Wav 轉 mp3 : /lame.exe temp.wav temp.mp3

2.下載 media encoder 運用 command line 完成 Wav 轉 mp3 : cscript.exe wmcmd.vbs –input temp.wav –output temp.mp3 –option value

„ 影片轉換:

函式庫: Microsoft media Encoder8.0

轉換內容: 影片格式轉換(mpg、wmv)、縮放轉換 方法:

1.下載 media encoder 運用 command line 完成 mpg 轉 wmv : cscript.exe wmcmd.vbs –input

temp.mpg –output temp.wmv -v_height height -v_width width

這個指令會將原本temp.mpg 影片檔轉成另一種格式 temp.wmv 並 且能夠將Dimension 縮放。

相關文件