初探 Azure Media Indexer

感謝北科大劉建昌同學翻譯微軟公司 Azure Media Services 主管  Adarsh Solanki 於 2014 年 9 月 10 日所發表的文章

https://azure.microsoft.com/blog/2014/09/10/introducing-azure-media-indexer/

Internet 視訊應用在目前的網路環境中快速增長,依據 Cisco VNI Forecast 的預測,網路視訊所產生的網路流量在 2014 年佔所有消費者網路流量的 70%,到了 2018 年則會增加到 79%。就現今網路環境而言,網路視訊已隨處可見,視訊應用快速增長也衍生出了一些問題。

Internet 網路的設計原是基於文字檔案之應用,也因此要在 Internet 上搜尋文字資料是相對較容易,技術也較為成熟,但是另一方面,視訊檔案則需要透過複雜的分類系統和大量人工標記資料 (manually-tagged) ,才能夠以文字來進行搜尋。

若是有一種方法可以自動擷取影片中有意義的語音資料,對影片搜尋而言將會相當便利。Azure Media Indexer 是為一個媒體處理器( Media processor ) 雲端服務,透過微軟研究院 ( Microsoft Research ) 的自然語言處理 ( natural language processing ) NLP 技術,將影片內容中有意義的語音,轉換成一個關鍵字檔 ( keyword file ) ( XML )、一組隱藏式字幕檔 ( SAMI/TTML ) 與一個二進位索引檔 (AIB)。

隨著多媒體內容在網路環境下的快速發展,使用者更加重視內容的可閱讀性,也因此許多影片都會用到字幕來作呈現,但是現階段所有影片都是透過人工的方式來建立字幕,這樣不僅費時且成本也相當的高。Azure Media Indexer 的語音識別引擎會自動建立一個附有時間標籤的字幕檔,裡面包含了輸入影片之英文口語單字,透過這種自動化轉換,我們可以將以往需要大量人工工時的工作轉變為全自動化的工作。同時也利用 SQL Server 或是 Apache Lucene/Solr 之類的索搜尋引擎來搜尋影片中某個重要片段,使用者可以相當簡單地透過搜尋文字的方式來找到影片中特定時間的內容。透過上述的方法,可以大幅減少搜尋影片內容的複雜度。

接下來透過一個簡單的範例,來介紹如何透過 Azure Media Indexer  來處理您的媒體文件。

在您的影片資產上建立索引

利用 Azure Media Indexer ,使用者可以在本地端或是網路上的文件資料中建立索引。而在本範例,我們將把本地端的媒體文件上傳到 Azure Media Service,再透過 Azure Media Indexer  來建立索引。

在此教學中,我們利用  Channel9 的影片來進行示範。將本影片儲存為  MP4檔,並且重新命名為  "Index.mp4" 從存放C:\Users\<<USERNAME>>\Videos\Index.mp4。

完整的程式碼範例可以在此連接下載

設定您的專案

在 Visual Studio 2013上建立一個C#主控台應用程式專案 (File > New > Project or Ctrl+Shift+N)

clip_image002

接下來,利用 NuGet 封包管理來安裝 "Azure Media Services .NET SDK"

( 在專案上點擊右鍵,選取 NutGet,並且在搜尋欄位上搜尋 "Azure Media Services .NET SDK" )

clip_image004

打開專案檔上的App.config檔,並且將下方程式碼加入至appSettings欄位上。

(要注意的是,要確保輸入的媒體服務名稱和金鑰是存在並且有效的)

clip_image006

建立一個資產 ( Asset )

資產是 Azure Media Services 用來儲存媒體檔案的容器 (container),一個資產內部除了包含了媒體檔案的本身之外,還包含了串流所需要用到的檔案。在本範例中,您將建立一個資產檔案,並且透過.NET SDK來儲存視訊。同時您也可以利用 Azure 管理網站來更新您資產內的檔案。

首先您需要將以下程式碼加入到主控台應用程式的 Program.cs。

clip_image008

您將需要宣告一個 CloudMediaContext  物件來建立與Azure Media Service 的連線。透過這個步驟,將允許您在Azure Media Service上建立一個新的資產(Asset),並且上傳本地端的文件作為資產檔案(Asset File)。

首先,在 Program.cs 裡增加以下程式碼,此程式碼將告訴主控台應用程式要在哪裡找到來源檔案,並且將檔案輸出在哪裡。

clip_image010

接下來您需要建立一個主控台動作 ( job ),並且加上以下程式碼 :

clip_image012

提交一個檢索工作 ( Indexing job )

透過以上程式碼,您已經在 Azure Media Service 上面建立一個資產 ( Asset ),並且上傳了一個本地端的檔案。下一個步驟,您將建立一個參考,這個參考可以讓Azure內容檢索處理器做為檢索的參考數值。在 Azure Media Service上的工作 ( jobs ) 一個或多個任務( Tasks ) 組成,專門用來指定特定處理動作 ( 編碼encoding、包裝 packaging 等.....) 的細節內容。

透過建立索引工作中的任務,在其中可以設定一些在進行索引工作時會用到的參考資訊,在本範例中,您將建立一個作為索引任務的設定檔 "default.config",裡面將包含了一些有用的資訊可供索引工作參考。

任務配置  (Task Configuration )

Azure Media Indexer 參考的任務設定檔為一個XML檔案,裡面包含了幾項關於檢索檔案的基本資訊或是關鍵字,利用他們可以來提高語音辨識的精準度。

在現有版本的 Azure Media Indexer 上,允許在配置檔中描述媒體文件的標題以及其內容大綱,透過這樣的任務配置,可以讓自然語言處理引擎 ( adaptive natural language processing engine ) 基於已知的主題來增加翻譯的詞彙,讓結果更加精準。

例如 :

如果您有一個關於 "Geico" 的影片,透過在任務配置檔上輸入此標題,就能夠減少在翻譯文章時會出現"guy co"這種錯誤發生。

或者在檢索影片時,當中提到 “aortic aneurism (主動脈動脈瘤)”,正常情況下有可能會被誤解為“A or tick canner is um" 這種不知所云的翻譯,此時若是加入任務配置,在標題或是大綱內容提供 “hypertension (高血壓)” 的資訊,這將會提高搜尋引擎的準確度。

在專案點擊右鍵,新增一個XML檔案作為任務配置檔,並且新增以下程式碼,取名為"default.config"。在本範例中,我們使用Channel9上關於範例影片的標題與大綱敘述作為配置檔的內容。

clip_image014

建立完任務配置檔後,返回 Program.cs 檔案,並且修改 ConfigurationFile 字串的位址。

建立工作 ( job )

在上個步驟中,我們已經建立了一個任務配置檔供檢索工作參考,現在我們將繼續建立未完成的工作。

透過下列程式碼,我們將建立一個工作,並且啟用這個工作裡的任務。

clip_image016

接下來,我們在主程式的最底部新增一個輔助方法,用來給定一個最新版的媒體索引器。

clip_image018

透過以上的程式碼,您已經提交了一個主控台工作,這個工作將會把您本地端的媒體文件上傳到 Azure Media Service上,並且透過 Azure Media Indexer 進行處理。

我們還可以透過以下的程式碼,讓您可以隨時追蹤主控台工作的進度。

clip_image020

clip_image022

clip_image024

輸出

輸出的檢索檔案一共有四個 :

1. SAMI格式的字幕檔

2. 附有時間標籤的  TTML檔

3. 關鍵字檔 (XML)

4. 音訊索引 blob (AIB)

其中 SAMI 和 TTML 文件包含了視訊的時間標籤,而 XML 檔裡面包含了索引時所使用的關鍵字。

透過本篇範例,您將會得到以上四個輸出的檔案,透過上述四個檔案,您可以與您的媒體文件做結合,即可輕鬆地得到媒體文件的內容。

關於

這篇範例並沒有包含所有 Azure Media Indexer 功能,例如支援多個文件的索引,或是在網路上利用 URL 取得索引檔。

Azure Media Indexer 並非針對即時翻譯需求而設計的,語音辨識所需時間約為影片長度的三倍,Azure Media Indexer 著重於辨識的精確度而非強調辨識速度的應用情境。

完整的範例您可以透過以下連接下載

最短的工作持續時間為五分鐘,小於此時間的工作持續時間將會被當成五分鐘,並且依照其計費標準計費。

這篇文章原始發佈於「Microsoft Azure 中文部落格」