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

Примечание

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

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

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

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

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

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

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

  • Любой выпуск Visual Studio 2017.

  • Newtonsoft.Json

    • Чтобы установить Newtonsoft.Json в качестве пакета NuGet в Visual Studio, сделайте следующее.
      1. Щелкните правой кнопкой мыши на Solution Manager.
      2. Щелкните Manage NuGet Packages...
      3. Выполните поиск пакета Newtonsoft.Json и установите его.
  • Если вы используете Linux или MacOS, это приложение можно запустить с помощью Mono.

  • Пример данных рукописного фрагмента для этого краткого руководства можно найти на портале 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. В Visual Studio создайте новое консольное решение и добавьте следующие пакеты.

    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. Создайте переменные для ключа подписки и конечной точки, а также пример файла JSON. Конечная точка позже будет совмещена с inkRecognitionUrl для доступа к 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";
    

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

  1. Создайте новую асинхронную функцию с именем Request, принимающую переменные, созданные выше.

  2. Установите протокол безопасности клиента и информацию заголовка с помощью объекта HttpClient. Не забудьте добавить ключ подписки в заголовок Ocp-Apim-Subscription-Key. Затем создайте объект StringContent для запроса.

  3. Отправьте запрос с помощью PutAsync(). Отправьте ответ при успешном выполнении запроса.

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

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

  1. Создайте новую функцию с именем recognizeInk(). Создайте запрос, в которой будет включена конечная точка, ключ подписки, URL-адрес API и данные мазка кисты рукописного ввода, а затем отправьте его. Чтобы это сделать используйте функцию Request().

  2. Десериализируйте объект JSON и выведите его в консоль.

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

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

Чтобы загрузить файл JSON с данных рукописного ввода создайте функцию LoadJson(). Используйте StreamReader и JsonTextReader чтобы создать JObject и вернуть его.

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

Отправка запроса API

  1. В методе main в приложении необходимо использовать созданную ранее функцию для загрузки данных JSON.

  2. Вызовите созданную ранее функцию recognizeInk(). Чтобы после выполнения приложения оставить консоль открытой, используйте System.Console.ReadKey().

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

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

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

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

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