Azure medya analizi, metin içerikli videoları dijital metne dönüştürmek için kullanınUse Azure Media Analytics to convert text content in video files into digital text

Genel BakışOverview

Video dosyanızdan metin içeriği ayıklama ve düzenlenebilir, aranabilir bir dijital metin oluşturmak ihtiyacınız varsa, Azure medya analizi OCR (optik karakter tanıma) kullanmanız gerekir.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). Bu Azure medya işlemci video dosyalarınızı metin içeriğini algılar ve kullanmanız için metin dosyaları oluşturur.This Azure Media Processor detects text content in your video files and generates text files for your use. OCR, anlamlı meta verileri ayıklama, medya video sinyalinden otomatik hale getirmenizi sağlar.OCR enables you to automate the extraction of meaningful metadata from the video signal of your media.

Bir arama motoru ile birlikte kullanıldığında, kolayca medyanızı metin dizin ve içeriğinizin bulunabilirliği geliştirin.When used in conjunction with a search engine, you can easily index your media by text, and enhance the discoverability of your content. Bu yüksek oranda metinsel videoda, bir video kaydı veya ekran yakalama slayt gösterisi sunu gibi son derece kullanışlıdır.This is extremely useful in highly textual video, like a video recording or screen-capture of a slideshow presentation. Azure OCR medya işleyicisini dijital metin için optimize edilmiştir.The Azure OCR Media Processor is optimized for digital text.

Azure medya OCR medya işlemci şu anda Önizleme aşamasındadır.The Azure Media OCR media processor is currently in Preview.

Bu makalede, ilgili ayrıntıları verir. Azure medya OCR ve .NET için Media Services SDK ile kullanma işlemi gösterilmektedir.This article gives details about Azure Media OCR and shows how to use it with Media Services SDK for .NET. Daha fazla bilgi ve örnekler için bkz. bu blog.For more information and examples, see this blog.

OCR giriş dosyalarıOCR input files

Video dosyaları.Video files. Şu anda aşağıdaki biçimleri desteklenir: MP4 MOV ve WMV.Currently, the following formats are supported: MP4, MOV, and WMV.

Görev yapılandırmasıTask configuration

Görev yapılandırması (hazır).Task configuration (preset). Bir görev oluştururken Azure medya OCR, JSON veya XML kullanarak hazır bir yapılandırma belirtmeniz gerekir.When creating a task with Azure Media OCR, you must specify a configuration preset using JSON or XML.

Not

OCR altyapısına maksimum 32000 piksele bir görüntü bölgesi en düşük 40 piksel ile hem yükseklik/genişlik içinde geçerli bir giriş olarak yalnızca kullanır.The OCR engine only takes an image region with minimum 40 pixels to maximum 32000 pixels as a valid input in both height/width.

Öznitelik açıklamalarıAttribute descriptions

Öznitelik adıAttribute name AçıklamaDescription
AdvancedOutputAdvancedOutput JSON çıkışını AdvancedOutput true olarak ayarlarsanız, her tek bir sözcük (ek olarak ifadeleri ve bölgeler gibi) için konumsal veri içerir.If you set AdvancedOutput to true, the JSON output will contain positional data for every single word (in addition to phrases and regions). Bu ayrıntıları görmesini istemiyorsanız bayrağı false olarak ayarlayın.If you do not want to see these details, set the flag to false. Varsayılan değer false'tur.The default value is false. Daha fazla bilgi için bu bloga bakın.For more information, see this blog.
DilLanguage Aranacak metin dili (isteğe bağlı) açıklar.(optional) describes the language of text for which to look. Aşağıdakilerden biri: Otomatik Algıla (varsayılan), Arapça, ChineseSimplified, ChineseTraditional, Çekçe Danca, Felemenkçe, İngilizce, Fince, Fransızca, Almanca, Yunanca, Macarca, İtalyanca, Japonca, Korece, Norveççe, Lehçe, Portekizce, Rumence, Rusça, SerbianCyrillic, SerbianLatin , Slovakya, İspanyolca, İsveççe, Türkçe.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 (isteğe bağlı) aranacak metnin yönünü açıklar.(optional) describes the orientation of text for which to look. "Sol" üst tüm harfleri gösterilen sola doğru anlamına gelir."Left" means that the top of all letters are pointed towards the left. Varsayılan metni (örneğin, bir kitap bulunabilir) "Yukarı" yönlendirilmiş çağrılabilir.Default text (like that which can be found in a book) can be called "Up" oriented. Aşağıdakilerden biri: Otomatik Algıla (varsayılan), en fazla, doğru aşağı, sola.One of the following: AutoDetect (default), Up, Right, Down, Left.
TimeIntervalTimeInterval (isteğe bağlı) örnekleme hızını açıklar.(optional) describes the sampling rate. 1/2 saniyede varsayılandır.Default is every 1/2 second.
JSON biçimi – SS. SSS (varsayılan 00:00:00.500)JSON format – HH:mm:ss.SSS (default 00:00:00.500)
XML biçimi – W3C XSD süresi temel (varsayılan PT0.5)XML format – W3C XSD duration primitive (default PT0.5)
DetectRegionsDetectRegions (isteğe bağlı) Metin algılamak üzere video çerçevesinde bölgeleri belirterek DetectRegion nesnelerin dizisi.(optional) An array of DetectRegion objects specifying regions within the video frame in which to detect text.
Aşağıdaki dört tamsayı değerlerini DetectRegion nesne yapılır:A DetectRegion object is made of the following four integer values:
Sol – sol kenar boşluğunu pikselLeft – pixels from the left-margin
Üst – üst kenar boşluğu pikselTop – pixels from the top-margin
Genişlik: bölge piksel cinsinden genişliğiWidth – width of the region in pixels
Yükseklik – bölge piksel cinsinden yüksekliğiHeight – height of the region in pixels

Örnek JSON hazırJSON 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
                    }
             ]
        }
    }

Önceden oluşturulmuş XML örneğiXML preset example

    <?xml version=""1.0"" encoding=""utf-16""?>
    <VideoOcrPreset xmlns:xsi=""https://www.w3.org/2001/XMLSchema-instance"" xmlns:xsd=""https://www.w3.org/2001/XMLSchema"" Version=""1.0"" xmlns=""https://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 çıktı dosyalarıOCR output files

Çıkış OCR medya işlemcisi bir JSON dosyasıdır.The output of the OCR media processor is a JSON file.

Çıkış JSON dosyasının öğeleriElements of the output JSON file

Video OCR çıkış videonuza bulunan karakterleri zaman bölümlenmiş verileri sağlar.The Video OCR output provides time-segmented data on the characters found in your video. Dil veya yönü gibi öznitelikleri hone çözümlenmesinde ilgilenen sözcükler için kullanabilirsiniz.You can use attributes such as language or orientation to hone-in on exactly the words that you are interested in analyzing.

Çıktı aşağıdaki öznitelikleri içerir:The output contains the following attributes:

ÖğeElement AçıklamaDescription
TimescaleTimescale Videoyu saniye başına "ticks""ticks" per second of the video
OffsetOffset zaman damgaları için uzaklık.time offset for timestamps. Video API'leri 1.0 sürümünde, bu her zaman 0 olacaktır.In version 1.0 of Video APIs, this will always be 0.
FramerateFramerate Saniyedeki kare video sayısıFrames per second of the video
Genişlikwidth videonun piksel cinsinden genişliğiwidth of the video in pixels
Yükseklikheight piksel cinsinden görüntü yüksekliğiheight of the video in pixels
FragmentsFragments içine meta veriler öbekli video öbekleri zamana bağlı bir diziarray of time-based chunks of video into which the metadata is chunked
startstart Başlangıç saati "ticks" parçasındastart time of a fragment in "ticks"
Süresiduration "ticks" parçasında uzunluğulength of a fragment in "ticks"
intervalinterval verilen parça içindeki her bir olay zaman aralığıinterval of each event within the given fragment
etkinliklerevents bölgeleri içeren bir diziarray containing regions
bölgeregion sözcük ve tümcecikleri temsil eden nesne algılandıobject representing detected words or phrases
languagelanguage bir bölge içinde algılanan metnin dilinilanguage of the text detected within a region
Yönlendirmeorientation bir bölge içinde algılanan metnin yönünüorientation of the text detected within a region
satırlarılines bir bölge içinde algılanan metin satırlarını dizisiarray of lines of text detected within a region
metintext Gerçek metninizthe actual text

JSON çıkış örneğiJSON output example

Aşağıdaki örnek çıktı, video genel bilgiler ve çeşitli video parçalarını içerir.The following output example contains the general video information and several video fragments. Her video parçasında, dil ve onun metin hizalamasını ile OCR MP tarafından algılanan her bölge içerir.In every video fragment, it contains every region, which is detected by OCR MP with the language and its text orientation. Bölge, her sözcük satırı satırın metin, satırın konumunu ve bu satırdaki her bir sözcük bilgi (word içerik, konumunu ve güvenle) ile bu bölgede de içerir.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. Bir örnek verilmiştir ve ben bazı açıklamalar satır içi yerleştirin.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 örnek kodu.NET sample code

Aşağıdaki program gösterir nasıl yapılır:The following program shows how to:

  1. Bir varlık oluşturun ve varlığa bir medya dosyası yükleyin.Create an asset and upload a media file into the asset.
  2. Bir iş, bir OCR yapılandırma/hazır dosyası oluşturun.Create a job with an OCR configuration/preset file.
  3. Çıkış JSON dosyalarını indirin.Download the output JSON files.

Visual Studio projesi oluşturup yapılandırmaCreate and configure a Visual Studio project

Geliştirme ortamınızı kurun ve app.config dosyanızı .NET ile Media Services geliştirme bölümünde açıklandığı gibi bağlantı bilgileriyle doldurun.Set up your development environment and populate the app.config file with connection information, as described in Media Services development with .NET.

ÖrnekExample

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["AMSAADTenantDomain"];
        private static readonly string _RESTAPIEndpoint =
            ConfigurationManager.AppSettings["AMSRESTAPIEndpoint"];
        private static readonly string _AMSClientId =
            ConfigurationManager.AppSettings["AMSClientId"];
        private static readonly string _AMSClientSecret =
            ConfigurationManager.AppSettings["AMSClientSecret"];

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

        static void Main(string[] args)
        {
            AzureAdTokenCredentials tokenCredentials =
                new AzureAdTokenCredentials(_AADTenantDomain,
                    new AzureAdClientSymmetricKey(_AMSClientId, _AMSClientSecret),
                    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’i öğrenme yollarıMedia Services learning paths

Media Services v3 (son sürüm)Media Services v3 (latest)

Azure Media Services'ın en son sürümü kontrol edin!Check out the latest version of Azure Media Services!

Media Services v2 (eski)Media Services v2 (legacy)

Geri bildirimde bulunmaProvide feedback

Geri bildirim sağlamak ve Azure Media Services’ı geliştirme hakkında önerilerde bulunmak için User Voice forumunu kullanın.Use the User Voice forum to provide feedback and make suggestions on how to improve Azure Media Services. Doğrudan aşağıdaki kategorilerden birine de gidebilirsiniz:You also can go directly to one of the following categories:

Azure Media Services Analizi'ne genel bakışAzure Media Services Analytics Overview