Azure Media Analytics を使用して、ビデオ ファイル内のテキスト コンテンツをデジタル テキストに変換するUse Azure Media Analytics to convert text content in video files into digital text

概要Overview

ビデオ ファイルからテキスト コンテンツを抽出し、編集かつ検索可能なデジタル テキストを生成する必要がある場合は、Azure Media Analytics OCR (光学式文字認識) を使用する必要があります。If you need to extract text content from your video files and generate an editable, searchable digital text, you should use Azure Media Analytics OCR (optical character recognition). この Azure メディア プロセッサは、ビデオ ファイル内のテキスト コンテンツを検出し、テキスト ファイルを生成して使用できるようにします。This Azure Media Processor detects text content in your video files and generates text files for your use. OCR を使用すると、メディアのビデオ信号から有意なメタデータを自動的に抽出できます。OCR enables you to automate the extraction of meaningful metadata from the video signal of your media.

検索エンジンと組み合わせれば、テキストを使って簡単にメディアにインデックスを作成できるため、コンテンツがさらに探しやすくなります。When used in conjunction with a search engine, you can easily index your media by text, and enhance the discoverability of your content. これは、ビデオ記録やスライドショー プレゼンテーションの画面キャプチなど、テキスト情報の多いビデオでは非常に便利です。This is extremely useful in highly textual video, like a video recording or screen-capture of a slideshow presentation. Azure OCR メディア プロセッサは、デジタル テキスト用に最適化されています。The Azure OCR Media Processor is optimized for digital text.

Azure Media OCR メディア プロセッサは現在プレビュー段階です。The Azure Media OCR media processor is currently in Preview.

このトピックでは、 Azure Media OCR の詳細と、Media Services SDK for .NET での使用方法について説明します。This topic gives details about Azure Media OCR and shows how to use it with Media Services SDK for .NET. 追加情報と例については、 こちらのブログをご覧ください。For additional information and examples, see this blog.

OCR 入力ファイルOCR input files

ビデオ ファイルです。Video files. 現在サポートされている形式は MP4、MOV、WMV です。Currently, the following formats are supported: MP4, MOV, and WMV.

タスクの構成Task configuration

タスクの構成 (プリセット) です。Task configuration (preset). Azure Media OCRでタスクを作成するときは、JSON または XML を使用して、構成プリセットを指定する必要があります。When creating a task with Azure Media OCR, you must specify a configuration preset using JSON or XML.

注意

OCR エンジンが有効な入力として処理できるのは、高さと幅の両方が最小 40 ピクセルから最大 32000 ピクセルまでのイメージ領域のみです。The OCR engine only takes an image region with minimum 40 pixels to maximum 32000 pixels as a valid input in both height/width.

属性の説明Attribute descriptions

属性名Attribute name 説明Description
AdvancedOutputAdvancedOutput AdvancedOutput を true に設定すると、JSON 出力には各単語ごとに (語句とリージョンに加えて) 位置指定データが含まれます。If you set AdvancedOutput to true, the JSON output will contain positional data for every single word (in addition to phrases and regions). これらの詳細を表示しないようにするには、フラグを false に設定します。If you do not want to see these details, set the flag to false. 既定値は false です。The default value is false. 詳細については、 このブログをご覧ください。For more information, see this blog.
言語Language (省略可能) 検索対象テキストの言語です。(optional) describes the language of text for which to look. 次のいずれかを指定します: AutoDetect (既定)、Arabic、ChineseSimplified、ChineseTraditional、Czech、Danish、Dutch、English、Finnish、French、German、Greek、Hungarian、Italian、Japanese、Korean、Norwegian、Polish、Portuguese、Romanian、Russian、SerbianCyrillic、SerbianLatin、Slovak、Spanish、Swedish、Turkish。One of the following: AutoDetect (default), Arabic, ChineseSimplified, ChineseTraditional, Czech Danish, Dutch, English, Finnish, French, German, Greek, Hungarian, Italian, Japanese, Korean, Norwegian, Polish, Portuguese, Romanian, Russian, SerbianCyrillic, SerbianLatin, Slovak, Spanish, Swedish, Turkish.
TextOrientationTextOrientation (省略可能) 検索対象テキストの向きです。(optional) describes the orientation of text for which to look. "Left" は、すべての文字の上部が左を指していることを意味します。"Left" means that the top of all letters are pointed towards the left. 既定のテキスト (書籍など) は "Up"、つまり上を指しています。Default text (like that which can be found in a book) can be called "Up" oriented. 次のいずれかを指定します: AutoDetect (既定)、Up、Right、Down、Left。One of the following: AutoDetect (default), Up, Right, Down, Left.
TimeIntervalTimeInterval (省略可能) サンプリング レートです。(optional) describes the sampling rate. 既定値は、毎 0.5 秒です。Default is every 1/2 second.
JSON 形式 – HH:mm:ss.SSS (既定値 00:00:00.500)JSON format – HH:mm:ss.SSS (default 00:00:00.500)
XML 形式 – W3C XSD プリミティブ期間 (既定値 PT0.5)XML format – W3C XSD duration primitive (default PT0.5)
DetectRegionsDetectRegions (省略可能)テキストを検出するビデオ フレーム内の領域を指定する DetectRegion オブジェクトの配列。(optional) An array of DetectRegion objects specifying regions within the video frame in which to detect text.
DetectRegion オブジェクトは、次の 4 つの整数値で構成されます。A DetectRegion object is made of the following four integer values:
Left: 左余白からのピクセルLeft – pixels from the left-margin
Top: 上余白からのピクセルTop – pixels from the top-margin
Width: 領域の幅 (ピクセル)Width – width of the region in pixels
Height: 領域の高さ (ピクセル)Height – height of the region in pixels

JSON プリセットの例JSON preset example

{
    "Version":1.0, 
    "Options": 
    {
        "AdvancedOutput":"true",
        "Language":"English", 
        "TimeInterval":"00:00:01.5",
        "TextOrientation":"Up",
        "DetectRegions": [
                {
                   "Left": 10,
                   "Top": 10,
                   "Width": 100,
                   "Height": 50
                }
         ]
    }
}

XML プリセットの例XML preset example

<?xml version=""1.0"" encoding=""utf-16""?>
<VideoOcrPreset xmlns:xsi=""http://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""http://www.w3.org/2001/XMLSchema"" Version=""1.0"" xmlns=""http://www.windowsazure.com/media/encoding/Preset/2014/03"">
  <Options>
     <AdvancedOutput>true</AdvancedOutput>
     <Language>English</Language>
     <TimeInterval>PT1.5S</TimeInterval>
     <DetectRegions>
         <DetectRegion>
               <Left>10</Left>
               <Top>10</Top>
               <Width>100</Width>
               <Height>50</Height>
        </DetectRegion>
   </DetectRegions>
   <TextOrientation>Up</TextOrientation>
  </Options>
</VideoOcrPreset>

OCR 出力ファイルOCR output files

OCR メディア プロセッサの出力は、JSON ファイルです。The output of the OCR media processor is a JSON file.

出力 JSON ファイルの要素Elements of the output JSON file

ビデオ OCR 出力は、ビデオで検出された文字のデータを、時間に基づいてセグメント化して提供します。The Video OCR output provides time-segmented data on the characters found in your video. 分析中、言語、向きなどの属性を使用することで、興味のある単語に正確に焦点を合わせることができます。You can use attributes such as language or orientation to hone-in on exactly the words that you are interested in analyzing.

出力には、次の属性が含まれています。The output contains the following attributes:

要素Element DescriptionDescription
タイムスケールTimescale ビデオの 1 秒あたりの "ティック数""ticks" per second of the video
OffsetOffset タイムスタンプの時間オフセット。time offset for timestamps. Video API のバージョン 1.0 では、これは常に 0 になります。In version 1.0 of Video APIs, this will always be 0.
FramerateFramerate ビデオの 1 秒あたりのフレーム数Frames per second of the video
widthwidth ビデオの幅 (ピクセル単位)width of the video in pixels
heightheight ビデオの高さ (ピクセル単位)height of the video in pixels
FragmentsFragments ビデオの時間ベースのチャンクの配列。メタデータはこのチャンク配列単位で分割されますarray of time-based chunks of video into which the metadata is chunked
startstart "ティック" 内のフラグメントの開始時刻start time of a fragment in "ticks"
durationduration "ティック" 内のフラグメントの長さlength of a fragment in "ticks"
intervalinterval 指定したフラグメント内の各イベントの間隔interval of each event within the given fragment
eventsevents リージョンを含む配列array containing regions
regionregion 検出された単語または語句を表すオブジェクトobject representing detected words or phrases
言語language リージョン内で検出されたテキストの言語language of the text detected within a region
orientationorientation リージョン内で検出されたテキストの向きorientation of the text detected within a region
lineslines リージョン内で検出されたラインの配列array of lines of text detected within a region
texttext 実際のテキストthe actual text

JSON 出力の例JSON output example

次の出力例には、一般的なビデオ情報とビデオ フラグメントがいくつか含まれています。The following output example contains the general video information and several video fragments. ビデオ フラグメントごとに、OCR MP によって検出されたすべてのリージョンと、言語およびそのテキストの向きが示されています。In every video fragment, it contains every region which is detected by OCR MP with the language and its text orientation. また、リージョンには、そのリージョン内のすべての単語ラインと、ラインのテキスト、ラインの位置、およびこのラインのすべての単語情報 (単語のコンテンツ、位置、信頼度) も含まれます。The region also contains every word line in this region with the line’s text, the line’s position, and every word information (word content, position and confidence) in this line. 例を次に示します。この例には、コメントをいくつかインラインで挿入してあります。The following is an example, and I put some comments inline.

{
    "version": 1, 
    "timescale": 90000, 
    "offset": 0, 
    "framerate": 30, 
    "width": 640, 
    "height": 480,  // general video information
    "fragments": [
        {
            "start": 0, 
            "duration": 180000, 
            "interval": 90000,  // the time information about this fragment
            "events": [
                [
                   { 
                        "region": { // the detected region array in this fragment 
                            "language": "English",  // region language
                            "orientation": "Up",  // text orientation
                            "lines": [  // line information array in this region, including the text and the position
                                {
                                    "text": "One Two", 
                                    "left": 10, 
                                    "top": 10, 
                                    "right": 210, 
                                    "bottom": 110, 
                                    "word": [  // word information array in this line
                                        {
                                            "text": "One", 
                                            "left": 10, 
                                            "top": 10, 
                                            "right": 110, 
                                            "bottom": 110, 
                                            "confidence": 900
                                        }, 
                                        {
                                            "text": "Two", 
                                            "left": 110, 
                                            "top": 10, 
                                            "right": 210, 
                                            "bottom": 110, 
                                            "confidence": 910
                                        }
                                    ]
                                }
                            ]
                        }
                    }
                ]
            ]
        }
    ]
}

.NET サンプル コード.NET sample code

このプログラムでは次の方法を示します。The following program shows how to:

  1. 資産を作成し、その資産にメディア ファイルをアップロードします。Create an asset and upload a media file into the asset.
  2. OCR 構成/プリセット ファイルを使用して、ジョブを作成します。Create a job with an OCR configuration/preset file.
  3. 出力 JSON ファイルをダウンロードします。Download the output JSON files.

Visual Studio プロジェクトの作成と構成Create and configure a Visual Studio project

.NET を使用した Media Services 開発」の説明に従って、開発環境をセットアップし、app.config ファイルに接続情報を指定します。Set up your development environment and populate the app.config file with connection information, as described in Media Services development with .NET.

Example

using System;
using System.Configuration;
using System.IO;
using System.Linq;
using Microsoft.WindowsAzure.MediaServices.Client;
using System.Threading;
using System.Threading.Tasks;

namespace OCR
{
    class Program
    {
        // Read values from the App.config file.
        private static readonly string _AADTenantDomain =
            ConfigurationManager.AppSettings["AADTenantDomain"];
        private static readonly string _RESTAPIEndpoint =
            ConfigurationManager.AppSettings["MediaServiceRESTAPIEndpoint"];

        // Field for service context.
        private static CloudMediaContext _context = null;

        static void Main(string[] args)
        {
            var tokenCredentials = new AzureAdTokenCredentials(_AADTenantDomain, AzureEnvironments.AzureCloudEnvironment);
            var tokenProvider = new AzureAdTokenProvider(tokenCredentials);

            _context = new CloudMediaContext(new Uri(_RESTAPIEndpoint), tokenProvider);

            // Run the OCR job.
            var asset = RunOCRJob(@"C:\supportFiles\OCR\presentation.mp4",
                                        @"C:\supportFiles\OCR\config.json");

            // Download the job output asset.
            DownloadAsset(asset, @"C:\supportFiles\OCR\Output");
        }

        static IAsset RunOCRJob(string inputMediaFilePath, string configurationFile)
        {
            // Create an asset and upload the input media file to storage.
            IAsset asset = CreateAssetAndUploadSingleFile(inputMediaFilePath,
                "My OCR Input Asset",
                AssetCreationOptions.None);

            // Declare a new job.
            IJob job = _context.Jobs.Create("My OCR Job");

            // Get a reference to Azure Media OCR.
            string MediaProcessorName = "Azure Media OCR";

            var processor = GetLatestMediaProcessorByName(MediaProcessorName);

            // Read configuration from the specified file.
            string configuration = File.ReadAllText(configurationFile);

            // Create a task with the encoding details, using a string preset.
            ITask task = job.Tasks.AddNew("My OCR Task",
                processor,
                configuration,
                TaskOptions.None);

            // Specify the input asset.
            task.InputAssets.Add(asset);

            // Add an output asset to contain the results of the job.
            task.OutputAssets.AddNew("My OCR Output Asset", AssetCreationOptions.None);

            // Use the following event handler to check job progress.  
            job.StateChanged += new EventHandler<JobStateChangedEventArgs>(StateChanged);

            // Launch the job.
            job.Submit();

            // Check job execution and wait for job to finish.
            Task progressJobTask = job.GetExecutionProgressTask(CancellationToken.None);

            progressJobTask.Wait();

            // If job state is Error, the event handling
            // method for job progress should log errors.  Here we check
            // for error state and exit if needed.
            if (job.State == JobState.Error)
            {
                ErrorDetail error = job.Tasks.First().ErrorDetails.First();
                Console.WriteLine(string.Format("Error: {0}. {1}",
                                                error.Code,
                                                error.Message));
                return null;
            }

            return job.OutputMediaAssets[0];
        }

        static IAsset CreateAssetAndUploadSingleFile(string filePath, string assetName, AssetCreationOptions options)
        {
            IAsset asset = _context.Assets.Create(assetName, options);

            var assetFile = asset.AssetFiles.Create(Path.GetFileName(filePath));
            assetFile.Upload(filePath);

            return asset;
        }

        static void DownloadAsset(IAsset asset, string outputDirectory)
        {
            foreach (IAssetFile file in asset.AssetFiles)
            {
                file.Download(Path.Combine(outputDirectory, file.Name));
            }
        }

        static IMediaProcessor GetLatestMediaProcessorByName(string mediaProcessorName)
        {
            var processor = _context.MediaProcessors
                .Where(p => p.Name == mediaProcessorName)
                .ToList()
                .OrderBy(p => new Version(p.Version))
                .LastOrDefault();

            if (processor == null)
                throw new ArgumentException(string.Format("Unknown media processor",
                                                           mediaProcessorName));

            return processor;
        }

        static private void StateChanged(object sender, JobStateChangedEventArgs e)
        {
            Console.WriteLine("Job state changed event:");
            Console.WriteLine("  Previous state: " + e.PreviousState);
            Console.WriteLine("  Current state: " + e.CurrentState);

            switch (e.CurrentState)
            {
                case JobState.Finished:
                    Console.WriteLine();
                    Console.WriteLine("Job is finished.");
                    Console.WriteLine();
                    break;
                case JobState.Canceling:
                case JobState.Queued:
                case JobState.Scheduled:
                case JobState.Processing:
                    Console.WriteLine("Please wait...\n");
                    break;
                case JobState.Canceled:
                case JobState.Error:
                    // Cast sender as a job.
                    IJob job = (IJob)sender;
                    // Display or log error details as needed.
                    // LogJobStop(job.Id);
                    break;
                default:
                    break;
            }
        }

    }
}

Media Services のラーニング パスMedia Services learning paths

Azure Media Services のラーニング パスについて読む。Read about the Azure Media Services learning paths:

フィードバックの提供Provide feedback

フィードバック フォーラムでは、Azure Media Services の改善方法について、フィードバックの提供や提案を行うことができます。Use the User Voice forum to provide feedback and make suggestions on how to improve Azure Media Services. また、次のカテゴリのいずれかをクリックすると、そのカテゴリのフォーラムに直接アクセスすることもできます。You also can go directly to one of the following categories:

Azure Media Services Analytics の概要Azure Media Services Analytics Overview