빠른 시작: Ink Recognizer REST API와 Java로 디지털 잉크 인식
참고
2020년 8월 26일에 Ink Recognizer API의 미리 보기가 종료되었습니다. 기존 Ink Recognizer 리소스가 있는 경우 2021년 1월 31일에 서비스가 완전히 사용 중지될 때까지 계속 사용할 수 있습니다.
이 빠른 시작을 사용하여 디지털 잉크 스트로크에 Ink Recognizer API를 사용하기 시작합니다. 이 Java 애플리케이션은 JSON 형식의 잉크 스트로크 데이터가 포함된 API 요청을 보내고 응답을 받습니다.
이 애플리케이션은 Java로 작성되었지만, API는 대부분의 프로그래밍 언어와 호환되는 RESTful 웹 서비스입니다.
일반적으로 API는 디지털 잉크 입력 앱에서 호출합니다. 이 빠른 시작은 JSON 파일에서 다음 필기 샘플에 대한 잉크 스트로크 데이터를 보냅니다.
이 빠른 시작의 소스 코드는 GitHub에서 확인할 수 있습니다.
사전 요구 사항
Maven 리포지토리에서 다음과 같은 라이브러리 가져오기
- JSON(Java 패키지)
- Apache HttpClient 패키지
이 빠른 시작의 잉크 스트로크 데이터 예제는 GitHub에서 찾을 수 있습니다.
Ink Recognizer 리소스 만들기
참고
2019년 7월 1일 이후에 생성된 리소스의 엔드포인트는 아래에 표시된 사용자 지정 하위 도메인 형식을 사용합니다. 자세한 내용 및 지역별 엔드포인트의 전체 목록은 Cognitive Services에 대한 사용자 지정 하위 도메인 이름을 참조하세요.
Azure Cognitive Services는 구독하는 Azure 리소스로 표시됩니다. Azure Portal을 사용하여 잉크 인식기에 대한 리소스를 만듭니다.
리소스를 만든 후 Azure Portal에서 리소스를 열고 빠른 시작을 클릭하여 엔드포인트와 키를 가져옵니다.
두 개의 환경 변수를 만듭니다.
INK_RECOGNITION_SUBSCRIPTION_KEY
- 요청을 인증하기 위한 구독 키입니다.INK_RECOGNITION_ENDPOINT
- 리소스에 대한 엔드포인트입니다. 다음과 같이 표시됩니다.
https://<your-custom-subdomain>.api.cognitive.microsoft.com
새 애플리케이션 만들기
즐겨 찾는 IDE 또는 편집기에서 새 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;
구독 키, 엔드포인트 및 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";
요청을 보내는 함수 만들기
위에서 만든 변수를 사용하는
sendRequest()
라는 새 함수를 만듭니다. 그런 후에 다음 단계를 수행합니다.API에 요청을 보낼 수 있는
CloseableHttpClient
개체를 만듭니다. 엔드포인트와 Ink Recognizer URL을 결합하여HttpPut
요청 개체에 요청을 보냅니다.요청의
setHeader()
함수를 사용하여Content-Type
헤더를application/json
으로 설정하고 구독 키를Ocp-Apim-Subscription-Key
헤더에 추가합니다.요청의
setEntity()
함수를 전송할 데이터에 사용합니다.클라이언트의
execute()
함수를 사용하여 요청을 보내고CloseableHttpResponse
개체에 저장합니다.응답 콘텐츠를 저장할
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()
라는 메서드를 만듭니다. 위에서 만든 sendRequest()
메서드를 엔드포인트, URL, 구독 키 및 JSON 데이터로 호출합니다. 결과를 받아서 콘솔에 출력합니다.
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();
}
}
디지털 잉크 데이터를 로드하고 요청 보내기
애플리케이션의 main 메서드에서 요청에 추가할 데이터가 포함된 JSON 파일을 읽습니다.
위에서 만든 잉크 인식 함수를 호출합니다.
public static void main(String[] args) throws Exception { String requestData = new String(Files.readAllBytes(Paths.get(dataPath)), "utf-8"); recognizeInk(requestData); }
애플리케이션 실행 및 응답 보기
애플리케이션을 실행합니다. 성공 응답이 JSON 형식으로 반환됩니다. 또한 GitHub에서 JSON 응답을 찾을 수 있습니다.
다음 단계
Ink Recognizer API가 디지털 잉크 입력 앱에서 어떻게 작동하는지 알아보려면 GitHub에서 다음 샘플 애플리케이션을 살펴보세요.