La semana pasada se anunció la primera versión del procesador Azure Media Indexer, el cual nos va a permitir analizar nuestro contenido media, con el objetivo de poder realizar búsquedas y obtener el timestamp del momento en el cual se utilizaron las palabras claves que estamos buscando. Otra utilidad que podemos encontrar es la capacidad de generar subtítulos de forma automática. La forma de trabajar con este nuevo procesador es exactamente la misma que cuando realizamos transcodificaciones con Windows Azure Media Encoder:
using Microsoft.WindowsAzure.MediaServices.Client; using System; using System.IO; using System.Linq; using System.Threading; using System.Threading.Tasks; namespace Indexer { class Program { static void Main(string[] args) { //0. Constants const string AssetName = "brain-mp4-Source"; const string AccountName = "[YOUR_ACCOUNT_NAME]"; const string AccountKey = "[YOUR_KEY_NAME]"; //1. Install Nuget packages //1.1 Nuget: Install-Package windowsazure.mediaservices //2. Get AMS context var context = new CloudMediaContext(AccountName, AccountKey); //.3 Get the asset to index var asset = context.Assets.Where(a => a.Name == AssetName).FirstOrDefault(); //3. Get Indexer Processor var processor = context.MediaProcessors.GetLatestMediaProcessorByName("Azure Media Indexer"); //4. Create a job var job = context.Jobs.Create("Indexing job for " + AssetName); //5. Get the configuration var configuration = File.ReadAllText("IndexerConfigurationTask.xml"); //6. Create a task var task = job.Tasks.AddNew("Indexing task", processor, configuration, TaskOptions.None); task.InputAssets.Add(asset); task.OutputAssets.AddNew(string.Format("{0} Indexed", asset.Name), AssetCreationOptions.None); job.Submit(); // Check job execution and wait for job to finish. Task progressJobTask = job.GetExecutionProgressTask(CancellationToken.None); progressJobTask.Wait(); Console.WriteLine("Job finished. Final state: {0}", job.State); Console.ReadLine(); } } }
Para este tipo de tarea, utilizamos el siguiente tipo de configuración en formato XML, donde utilizamos metadata con el fin de mejorar la interpretación de las palabras pronunciadas. En este caso, he utilizado un vídeo bastante famoso de Ted Talks de Helen Fisher.
<?xml version="1.0" encoding="utf-8"?> <configuration version="2.0"> <input> <metadata key="title" value="Helen Fisher: The brain in love " /> <metadata key="description" value="Why do we crave love so much, even to the point that we would die for it? To learn more about our very real, very physical need for romantic love, Helen Fisher and her research team took MRIs of people in love and people who had just been dumped." /> </input> <settings> </settings> </configuration>
Una vez que el proceso termina, podemos ver que se han generado los siguientes archivos:
- JobResult.txt: Se trata del log de la tarea.
- brain.mp4.aib: Audio indexing blob file utilizado por SQL Server utilizando el Add-on Indexer SQL
- brain.mp4.kw.xml: XML con las palabras claves encontradas durante el proceso.
- brain.mp4.smi: Archivo para Microsoft Synchronized Accessible Media Interchange (SAMI), usados por Windows Media Player.
- brain.mp4.ttml: Timed Text Markup Language
En este post, para comprobar el resultado, he descargado el archivo con extensión ttml y he utilizado la etiqueta video de HTML 5 para ver los subtítulos generados.
<!DOCTYPE html> <html> <head> <title></title> </head> <body> <video controls autoplay> <source type="video/mp4" src="https://gismedia.blob.core.windows.net/asset-9e046f86-169b-4184-bab0-ab8973cea239/brain.mp4?sv=2012-02-12&sr=c&si=ccbce462-05aa-45e0-9ff9-5a11ad11257c&sig=1kRY5epwh0HiielC%2F5em8bixUQm3CtyRi7v%2BBgN2qf8%3D&st=2014-09-16T07%3A12%3A19Z&se=2016-09-15T07%3A12%3A19Z"> <track src="brain.mp4.ttml" label="English captions" kind="subtitles" srclang="en-us" default> </video> </body> </html>
Para poder comprobar el resultado es necesario utilizar un navegador que haya implementado TTML. En este caso, utilizamos Internet Explorer 11:
Por ahora sólo reconoce inglés.
Happy indexing!