Inicio rápido: Reconocimiento de la entrada de lápiz digital con la API REST Ink Recognizer y C#

Nota

La API Ink Recognizer ha finalizado su versión preliminar el 26 de agosto de 2020. Si tiene recursos existentes de Ink Recognizer, puede seguir utilizándolos hasta que el servicio se retire completamente, el 31 de enero de 2021.

Use este inicio rápido para comenzar a enviar trazos de entrada de lápiz digital a la API Ink Recognizer. Esta aplicación de C# envía una solicitud de API que contiene datos del trazo de entrada de lápiz con formato JSON y muestra la respuesta.

Si bien esta aplicación está escrita en C#, la API es un servicio web RESTful compatible con la mayoría de los lenguajes de programación.

Normalmente se llamaría a la API desde una aplicación de entrada de lápiz digital. En este inicio rápido se envían los datos del trazo de entrada de lápiz digital para la siguiente muestra escrita a mano desde un archivo JSON.

imagen de un texto manuscrito

El código fuente de este inicio rápido está disponible en GitHub.

Prerrequisitos

  • Cualquier edición de Visual Studio 2017.

  • Newtonsoft.Json

    • Para instalar Newtonsoft.Json como un paquete NuGet en Visual Studio, siga estos pasos:
      1. Haga clic con el botón derecho en el Administrador de soluciones.
      2. Haga clic en Administrar paquetes de NuGet...
      3. Busque Newtonsoft.Json e instale el paquete.
  • Si usa Linux o MacOS, esta aplicación puede ejecutarse con Mono.

  • Los datos de trazo de entrada de lápiz para este inicio rápido se pueden encontrar en GitHub.

Creación de un recurso de Ink Recognizer

Nota

Los puntos de conexión de los recursos creados después del 1 de julio de 2019 usan el formato de subdominio personalizado que se muestra a continuación. Para más información y para obtener una lista completa de los puntos de conexión regionales, consulte Nombres de subdominios personalizados para Cognitive Services.

Los servicios de Azure Cognitive Services se representan por medio de recursos de Azure a los que se suscribe. Cree un recurso para Ink Recognizer mediante Azure Portal.

Después de crear un recurso, obtenga el punto de conexión y la clave; para ello, abra el recurso en Azure Portal y haga clic en Inicio rápido.

Cree dos variables de entorno:

  • INK_RECOGNITION_SUBSCRIPTION_KEY: la clave de suscripción para autenticar las solicitudes.

  • INK_RECOGNITION_ENDPOINT: el punto de conexión del recurso. Tendrá el siguiente aspecto:
    https://<your-custom-subdomain>.api.cognitive.microsoft.com

Creación de una aplicación

  1. En Visual Studio, cree una solución de consola y agregue los siguientes paquetes.

    using System;
    using System.IO;
    using System.Net;
    using System.Net.Http;
    using System.Net.Http.Headers;
    using System.Text;
    using System.Threading.Tasks;
    using Newtonsoft.Json;
    using Newtonsoft.Json.Linq;
    
  2. Cree variables para la clave de suscripción y el punto de conexión, y el archivo JSON de ejemplo. El punto de conexión se combinará más adelante con inkRecognitionUrl para acceder a la API.

    // Add your Ink Recognizer subscription key to your environment variables.
    static readonly string subscriptionKey = Environment.GetEnvironmentVariable("INK_RECOGNIZER_SUBSCRIPTION_KEY");
    
    // Add your Ink Recognizer endpoint to your environment variables.
    // For example: <your-custom-subdomain>.cognitiveservices.azure.com
    static readonly string endpoint = Environment.GetEnvironmentVariable("INK_RECOGNIZER_ENDPOINT");
    static readonly string inkRecognitionUrl = "/inkrecognizer/v1.0-preview/recognize";
    
    // Replace the dataPath string with a path to the JSON formatted ink stroke data.
    // Optionally, use the example-ink-strokes.json file of this sample. Add to your bin\Debug\netcoreapp3.0 project folder.
    static readonly string dataPath = @"PATH_TO_INK_STROKE_DATA";
    

Creación de una función para enviar solicitudes

  1. Cree una función asincrónica llamada Request que adopte las variables creadas anteriormente.

  2. Establezca el protocolo de seguridad del cliente y la información de encabezado con un objeto HttpClient. No olvide agregar la clave de suscripción al encabezado Ocp-Apim-Subscription-Key. A continuación, cree un objeto StringContent para la solicitud.

  3. Envíe la solicitud con PutAsync(). Si la solicitud es correcta, devuelva la respuesta.

    static async Task<string> Request(string apiAddress, string endpoint, string subscriptionKey, string requestData)
    {
    
        using (HttpClient client = new HttpClient { BaseAddress = new Uri(apiAddress) })
        {
            System.Net.ServicePointManager.SecurityProtocol = SecurityProtocolType.Tls12 | SecurityProtocolType.Tls11 | SecurityProtocolType.Tls;
            client.DefaultRequestHeaders.Accept.Add(new MediaTypeWithQualityHeaderValue("application/json"));
            client.DefaultRequestHeaders.Add("Ocp-Apim-Subscription-Key", subscriptionKey);
    
            var content = new StringContent(requestData, Encoding.UTF8, "application/json");
            var res = await client.PutAsync(endpoint, content);
            if (res.IsSuccessStatusCode)
            {
                return await res.Content.ReadAsStringAsync();
            }
            else
            {
                return $"ErrorCode: {res.StatusCode}";
            }
        }
    }
    

Envío de una solicitud de reconocimiento de entada de lápiz

  1. Cree una nueva función llamada recognizeInk(). Construya la solicitud y envíela mediante una llamada a la función Request() con el punto de conexión, la clave de suscripción, la dirección URL de la API y los datos de trazo de entrada de lápiz digital.

  2. Deserialice el objeto JSON y escríbalo en la consola.

    static void recognizeInk(string requestData)
    {
    
        //construct the request
        var result = Request(
            endpoint,
            inkRecognitionUrl,
            subscriptionKey,
            requestData).Result;
    
        dynamic jsonObj = Newtonsoft.Json.JsonConvert.DeserializeObject(result);
        System.Console.WriteLine(jsonObj);
    }
    

Carga de los datos de entrada de lápiz digital

Cree una función llamada LoadJson() para cargar el archivo JSON de datos de entrada de lápiz. Use StreamReader y JsonTextReader para crear un objeto JObject y devolverlo.

public static JObject LoadJson(string fileLocation)
{
    var jsonObj = new JObject();

    using (StreamReader file = File.OpenText(fileLocation))
    using (JsonTextReader reader = new JsonTextReader(file))
    {
        jsonObj = (JObject)JToken.ReadFrom(reader);
    }
    return jsonObj;
}

Envío de la solicitud de API

  1. En el método main de la aplicación, cargue los datos JSON con la función creada anteriormente.

  2. Llame a la función recognizeInk() creada anteriormente. Use System.Console.ReadKey() para mantener abierta la ventana de consola después de ejecutar la aplicación.

    static void Main(string[] args)
    {
    
        var requestData = LoadJson(dataPath);
        string requestString = requestData.ToString(Newtonsoft.Json.Formatting.None);
        recognizeInk(requestString);
        System.Console.WriteLine("\nPress any key to exit ");
        System.Console.ReadKey();
    }
    

Ejecución de la aplicación y visualización de la respuesta

Ejecute la aplicación. Se devuelve una respuesta correcta en formato JSON. También puede encontrar la respuesta JSON en GitHub.

Pasos siguientes

Para ver el funcionamiento de la API Ink Recognition en una aplicación de entrada de lápiz digital, eche un vistazo a las siguientes aplicaciones de ejemplo en GitHub: