Краткое руководство. Распознавание рукописного ввода с помощью REST API Распознавателя рукописного текста и Java

Примечание

Действие предварительной версии API Распознавателя рукописного ввода закончилось 26 августа 2020 г. Если у вас есть ресурсы Распознавателя рукописного текста, вы можете и дальше использовать их до полного прекращения работы службы 31 января 2021 г.

Используйте это краткое руководство, чтобы начать использовать API Распознавателя рукописного текста для рукописных фрагментов. Это приложение Java отправляет запрос API, содержащий данные росчерка пера в формате JSON, и возвращает ответ.

Хотя это приложение создано на языке Java, API представляет собой веб-службу RESTful, совместимую с большинством языков программирования.

Обычно вы вызываете API из приложения для рукописного ввода. Этот краткое руководство отправляет данные рукописного фрагмента для следующего рукописного образца из JSON-файла.

изображение рукописного текста

Исходный код для этого краткого руководства можно найти на портале GitHub.

Предварительные требования

Создание ресурса Распознавателя рукописного текста

Примечание

Конечные точки для ресурсов, созданных после 1 июля 2019 г., поддерживают пользовательский формат поддомена, показанный ниже. Дополнительные сведения и полный список региональных конечных точек см. в статье Custom subdomain names for Cognitive Services (Пользовательские имена поддоменов для Cognitive Services).

Ресурсами Azure, на которые вы подписаны, будет представлено семейство служб Azure Cognitive Services. Создайте ресурс для Распознавателя рукописного текста на портале Azure.

После создания ресурса вы можете получить конечную точку и ключ, открыв ресурс на портале Azure и щелкнув Быстрый запуск.

Создайте две переменные среды:

  • INK_RECOGNITION_SUBSCRIPTION_KEY — ключ подписки для аутентификации запросов.

  • INK_RECOGNITION_ENDPOINT — конечная точка для вашего ресурса. Она должна выглядеть так:
    https://<your-custom-subdomain>.api.cognitive.microsoft.com

Создание приложения

  1. Создайте проект Java в любой интегрированной среде разработки или редакторе, а затем импортируйте в него следующие библиотеки.

    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. Создайте переменные для вашего ключа подписки, конечную точку и файл JSON. Конечная точка затем будет добавлена в конец URI Распознавателя рукописного текста.

    // 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";
    

Создание функции для отправки запросов

  1. Создайте функцию с именем sendRequest(), которая принимает ранее созданные переменные. Затем выполните следующие действия.

  2. Создайте объект CloseableHttpClient, который может отправлять запросы в API. Отправьте запрос объекту запроса HttpPut, объединив конечную точку и URL-адрес Распознавателя рукописного текста.

  3. Используйте функцию запроса setHeader(), чтобы установить заголовок Content-Type в application/json, и добавьте ключ подписки к заголовку Ocp-Apim-Subscription-Key.

  4. Используйте функцию запроса setEntity() для данных, которые необходимо отправить.

  5. Используйте клиентскую функцию execute(), чтобы отправить запрос, и сохраните его в объекте CloseableHttpResponse.

  6. Создайте объект HttpEntity, в котором будет храниться содержимое ответа. Получите содержимое с getEntity(). Если ответ не пустой, верните его.

    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;
    }
    

Отправка запроса на распознавание рукописного текста

Создайте метод с именем recognizeInk() для распознавания данных росчерка пера. С помощью конечной точки, URL-адреса, ключа подписки и данных JSON вызовите созданный метод sendRequest(). Получите результат и выведите его в консоль.

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();
    }  
}

Загрузка данных рукописного ввода и отправка запроса

  1. В основном методе вашего приложения считайте JSON-файл, содержащий данные, которые будут добавлены к запросам.

  2. Вызовите функцию распознавания рукописного ввода, созданную ранее.

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

Запуск приложения и просмотр ответа

Запустите приложение. Успешный ответ возвращается в формате JSON. Ответ JSON также можно найти на портале GitHub.

Дальнейшие действия

Чтобы увидеть, как API Распознавателя рукописного текста работает в приложении для рукописного ввода, взгляните на следующие примеры приложений на GitHub.