Compartir vía


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

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 empezar a usar la API Ink Recognizer en trazos de entrada de lápiz digital. Esta aplicación de Java envía una solicitud de API que contiene los datos del trazo de entrada de lápiz con formato JSON y obtiene la respuesta.

Si bien esta aplicación está escrita en Java, 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

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. Cree un proyecto de Java en su IDE o editor favorito e importe las bibliotecas siguientes.

    import org.apache.http.HttpEntity;
    import org.apache.http.client.methods.CloseableHttpResponse;
    import org.apache.http.client.methods.HttpPut;
    import org.apache.http.entity.StringEntity;
    import org.apache.http.impl.client.CloseableHttpClient;
    import org.apache.http.impl.client.HttpClients;
    import org.apache.http.util.EntityUtils;
    import com.fasterxml.jackson.core.JsonParseException;
    import com.fasterxml.jackson.databind.JsonMappingException;
    import com.fasterxml.jackson.databind.ObjectMapper;
    import java.io.IOException;
    import java.nio.file.Files;
    import java.nio.file.Paths;
    import java.util.HashMap;
    import java.util.Map;
    
  2. Cree variables para la clave de suscripción y el punto de conexión, y el archivo JSON. El punto de conexión se anexará más adelante al identificador URI de Ink Recognizer.

    // Add your Azure Ink Recognition subscription key to your environment variables.
    private static final String subscriptionKey = System.getenv("INK_RECOGNITION_SUBSCRIPTION_KEY");
    
    // Add your Azure Ink Recognition endpoint to your environment variables.
    public static final String rootUrl = System.getenv("INK_RECOGNITION_ENDPOINT");
    public static final String inkRecognitionUrl = "/inkrecognizer/v1.0-preview/recognize";
    // Replace the dataPath string with a path to the JSON formatted ink stroke data file.
    private static final String dataPath = "PATH_TO_INK_STROKE_DATA";
    

Creación de una función para enviar solicitudes

  1. Cree una función llamada sendRequest() que adopte las variables creadas anteriormente. Después, lleve a cabo los siguiente pasos.

  2. Cree un objeto CloseableHttpClient que pueda enviar solicitudes a la API. Envíe la solicitud a un objeto de solicitud HttpPut mediante la combinación del punto de conexión y la dirección URL de Ink Recognizer.

  3. Use la función setHeader() de la solicitud para establecer el encabezado Content-Type en application/json y agregue su clave de suscripción al encabezado Ocp-Apim-Subscription-Key.

  4. Use la función setEntity() de la solicitud para los datos que se van a enviar.

  5. Use la función execute() del cliente para enviar la solicitud y guárdela en un objeto CloseableHttpResponse.

  6. Cree un objeto HttpEntity para almacenar el contenido de respuesta. Obtenga el contenido con getEntity(). Si la respuesta no está vacía, se devuelve.

    static String sendRequest(String endpoint, String apiAddress, String subscriptionKey, String requestData) {
        try (CloseableHttpClient client = HttpClients.createDefault()) {
            HttpPut request = new HttpPut(endpoint + apiAddress);
            // Request headers.
            request.setHeader("Content-Type", "application/json");
            request.setHeader("Ocp-Apim-Subscription-Key", subscriptionKey);
            request.setEntity(new StringEntity(requestData));
            try (CloseableHttpResponse response = client.execute(request)) {
                HttpEntity respEntity = response.getEntity();
                if (respEntity != null) {
                    return EntityUtils.toString(respEntity, "utf-8");
                }
            } catch (Exception respEx) {
                respEx.printStackTrace();
            }
        } catch (IOException ex) {
            System.err.println("Exception on Anomaly Detector: " + ex.getMessage());
            ex.printStackTrace();
        }
        return null;
    }
    

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

Cree un método llamado recognizeInk() para reconocer los datos de trazo de la entrada de lápiz. Llame al método sendRequest() creado anteriormente con el punto de conexión, dirección URL, la clave de suscripción y datos JSON. Obtenga el resultado e imprímalo en la consola.

static void recognizeInk(String requestData) {
    System.out.println("Sending an Ink recognition request.");

    String result = sendRequest(rootUrl, inkRecognitionUrl, subscriptionKey, requestData);
    
    // Pretty-print the JSON result
    try {
        ObjectMapper objectMapper = new ObjectMapper();
        Map<String, Object> response = objectMapper.readValue(result, HashMap.class);
        System.out.println(objectMapper.writerWithDefaultPrettyPrinter().writeValueAsString(response));
    } catch (JsonParseException e) {
        e.printStackTrace();
    } catch (JsonMappingException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }  
}

Carga de los datos de entrada de lápiz digital y envío de la solicitud

  1. En el método main de la aplicación, lea el archivo JSON que contiene los datos que se agregarán a las solicitudes de lectura.

  2. Llame a la función de reconocimiento de la entrada de lápiz que creó anteriormente.

    public static void main(String[] args) throws Exception {
    
        String requestData = new String(Files.readAllBytes(Paths.get(dataPath)), "utf-8");
        recognizeInk(requestData);
    }
    

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: