비동기 HTTP 인터페이스
비동기 HTTP 인터페이스는 장시간의 음성을 텍스트로 변환하기 위한 논블로킹 HTTP API입니다.
이 API를 사용하려면 다음 단계로 실행합니다.
- 음성 인식 작업 생성하기
- 폴링하여 음성 인식 작업 상태를 확인하고 결과 가져오기
새 버전에 대해
기존보다 음성 인식 처리 속도를 크게 향상시킨 새 버전의 비동기 HTTP 인터페이스(이하 "v2")를 2025년 7월 15일에 출시했습니다. 음성 인식의 정확도는 기존 비동기 HTTP 인터페이스(v1)와 차이가 없습니다. v1을 사용해야 하는 특별한 이유가 없다면 v2 사용을 권장합니다.
- 기존 버전인 v1은 향후 2026년 7월 31일을 기준으로 중단될 예정입니다. 현재 사용 중인 경우 v2로 마이그레 이션해 주시기 바랍니다. (종료 시기는 변경될 수 있습니다)
- v2에서는 현재 감정 분석 기능을 사용할 수 없습니다. 감정 분석을 사용해야 하는 경우 v1을 사용해 주십시오.
특징
v2의 주요 특징은 다음과 같습니다. 기존에는 음성 전체를 순차 처리했기 때문에 처리 시간이 음성 길이에 비례했습니다. v2에서는 음성을 발화 구간의 경계부분을 고려하면서 일정 길이로 분할하여 병렬 처리함으로써 기존보다 빠르게 음성 인식 처리를 완료합니다.
| 항목 | 기존 버전 (v1) | 새 버전 (v2) |
|---|---|---|
| 처리 방식 | 음성 전체를 직렬 처리 | 일정 길이로 분할(발화 구간 경계부분을 고려)하여 병렬 처리 |
| 예상 처리 시간 | 음성 길이에 비례(약 0.3-1배 정도) | 90분 정도까지의 음성 데이터는 거의 일정한 시간 (예: 90분 음성 ⇒ 약 5~6분) |
| 화자 다이어라이제이션 | 음성 길이에 비례(약 5%) | 음성 길이에 비례(약 5%) |
- 화자 다이어라이제이션을 수행할 경우 음성 인식 처리에 추가로 화자 다이어라이제이션 처리 시간이 기존과 동일하게 소요됩니다.
- 음성 인식 처리 시간은 현재 음성 데이터 길이가 90분 정도까지는 거의 일정한 시간에 완료되며, 그 이상 길이의 데이터는 처리 시간이 점차 늘어납니다. 단, 서버 혼잡 상황 등으로 인해 처리 시간이 길어질 수 있습니다.
- 짧은 음성 데이터의 처리 시간은 향상되지 않거나, 경우에 따라 약간 느려질 수 있습니다.
사용 방법
엔드포인트가 변경되는 것 외에는 v1과 동일합니다.
(v1)https://acp-api-async.amivoice.com/v1/recognitions
(v2)https://acp-api-async.amivoice.com/v2/recognitions
기존 버전과의 차이점
v2에서는 다음과 같은 요청에 대한 응답이 변경되었습니다.
- a. 전송한 음성 데이터에 발화 구간이 존재하지 않는 경우 v1에서는 작업 등록에 성공하고 처리 후 결과가 없다는 내용을 반환했지만, v2에서는 작업 등록 시 실패했다는 내용을 반환하도록 변경되었습니다.
- b. 지원하지 않는 음성 파일을 요청한 경우 및 화자 다이어라이제이션에 잘못된 매개변수를 설정한 경우의 오류 응답에 "text"와 "utteranceid"도 함께 반환하도록 변경되었습니다.
b에 해당하는 예: v1
{
"results": [{ "tokens": [], "tags": [], "rulename": "", "text": "" }],
"code": "+",
"message": "received unsupported audio format"
}
v2
{
"text": "",
"utteranceid":"test_data",
"results": [{"tokens": [], "tags": [], "rulename": "", "text": ""}],
"code": "+",
"message": "received unsupported audio format",
}
사용 방법
1. 음성 인식 작업 생성하기
작업 생성 API 요청은 동기 HTTP 인터페이스와 동일하게 요청 파라미터를 설정하고, 비동기 HTTP 인터페이스의 엔드포인트로 요청을 전송합니다.
v2(새 버전)의 경우
POST https://acp-api-async.amivoice.com/v2/recognitions
v1(기존 버전)의 경우
POST https://acp-api-async.amivoice.com/v1/recognitions
이하, 기본적으로 v2의 경우에 대해 설명합니다. v1을 사용하는 경우, 적절히 엔드포인트를 바꿔 읽어주시기 바랍니다. 예를 들어, curl 명령으로 로그 저장 없이 test.wav 파일의 음성 인식 요청을 보내려면 다음과 같이 합니다.
curl https://acp-api-async.amivoice.com/v2/recognitions \
-F u={APP_KEY} \
-F d="grammarFileNames=-a-general loggingOptOut=True" \
-F a=@test.wav
동기 HTTP 인터페이스와는 엔드포인트가 다르지만, 요청 파라미터의 설정 방법은 동일합니다.
감정 분석 등 일부 파라미터는 비동기 HTTP 인터페이스에서만 지원됩니다.
동기 HTTP 인터페이스와 달리 로그 저장 여부는 엔드포인트가 아닌 요청 파라미터로 지정합니다.
기본적으로 로그 저장이 활성화되어 있습니다. 로그 저장을 비활성화하려면 d 파라미터에 loggingOptOut=True를 지정하십시오.
성공한 경우
성공 시 응답에는 sessionid가 포함됩니다. 이는 사용자의 음성 인식 요청에 대한 작업 ID로, 작업 상태를 확인하거나 결과를 얻는 데 사용됩니다.
text는 항상 "..."를 반환합니다.
예
{"sessionid":"017ac8786c5b0a0504399999","text":"..."}
실패한 경우
실패 시 응답에는 sessionid가 포함되지 않습니다. code와 message로 실패 원인을 판단할 수 있습니다.
응답 코드와 메시지를 참조하십시오.
예
{
"results": [{ "tokens": [], "tags": [], "rulename": "", "text": "" }],
"text": "",
"code": "-",
"message": "received illegal service authorization"
}
2. 음성 인식 작업 상태 확인 및 결과 가져오기
음성 인식 결과 요청이 성공하면 작업 상태를 확인하고 status가 completed 또는 error가 될 때까지 폴링하십시오.
작업 상태 가져오기
작업은 서버 측에서 순차적으로 실행됩니다. 작업 상태를 확인하거나 결과를 가져오려면 결과 조회용 엔드포인트 GET /v2/recognitions/{session_id}에 요청합니다.
sessionid에는 작업 생성 시 얻은 작업 ID를 설정합니다. 요청 파라미터의 인증 정보(authorization)는 Authorization 헤더에 지정하십시오.
curl로 실행하는 경우 다음과 같습니다. 여기서는 sessionid가 017c25ec12c00a304474a999라고 가정합니다.
curl -H "Authorization: Bearer {APPKEY}" \
https://acp-api-async.amivoice.com/v2/recognitions/017c25ec12c00a304474a999
queued 상태
요청을 보낸 직후에는 status가 queued 상태가 됩니다.
{"service_id":"{YOUR_SERVICE_ID}","session_id":"017c25ec12c00a304474a999","status":"queued"}
started 상태
큐에서 작업이 꺼내지면 status는 started 상태가 됩니다.
queued에서 started 상태가 되기까지는 서버 혼잡 상황 등에 따라 수십 초에서 수 분 정도 소요됩니다.
{"service_id":"{YOUR_SERVICE_ID}","session_id":"017c25ec12c00a304474a999","status":"started"}
processing 상태
실제로 음성 인식 처리가 시작되면 status는 processing 상태가 됩니다. 아래 샘플을 참조하십시오. 여기서는 가독성을 위해 결과를 줄바꿈 처리합니다.
API가 수신한 음성 크기(audio_size)나 MD5 체크섬(audio_md5)을 사용하여 음성이 올바르게 전송되었는지 확인할 수 있습니다.
processing에서 다음 completed 상태가 되기까지 소요되는 시간은 음성 길이에 따라 다르지만, v2의 경우 음성 데이터를 일정 길이의 청크로 분할하여 처리하므로 대체로 분할된 음성 길이의 0.5~1.5배 정도의 시간이 소요됩니다. 분할 수와 분할된 청크의 길이는 음성 데이터의 길이와 포함된 발화 시간 길이에 따라 다릅니다. 발화 시간 길이가 어느 정도 짧은 경우 대략 1분 정도 길이로 분할됩니다.
또한 화자 다이어라이제이션이나 감정 분석도 수행하는 경우, 해당 처리 시간이 추가로 소요되므로 위 시간보다 길어집니다.
{
"audio_md5":"40f59fe5fc7745c33b33af44be43f6ad",
"audio_size":306980,
"service_id":"{YOUR_SERVICE_ID}",
"session_id":"017c25ec12c00a304474a999",
"status":"processing"
}
completed 상태
음성 인식이 완료되면 status는 completed 상태가 됩니다. 이때 응답의 results와 segments에서 음성 인식 결과를 얻을 수 있습니다. 결과는 음성 인식 서버의 처리가 완료된 후 일정 기간 서버에 저장됩니다. 저장 기간은 비동기 HTTP 인터페이스의 제한의 "음성 인식 결과 보존 기간"을 참조하십시오.
인식 결과를 포함한 응답의 자세한 내용은 음성 인식 결과를 참조하십시오.
일정 기간이 지나 삭제된 결과에 접근하면 404 NOT FOUND 오류가 발생합니다. 오류에 대해서는 레퍼런스의 오류 응답 목록을 참조하십시오.
error 상태
어떤 이유로 음성 인식에 실패한 경우 status가 error 상태가 됩니다. 이때 error_message에는 오류의 원인이 설정됩니다.
예:
{
"status": "error",
"audio_md5":"40f59fe5fc7745c33b33af44be43f6ad",
"audio_size":306980,
"service_id":"{YOUR_SERVICE_ID}",
"session_id":"017c25ec12c00a304474a999",
"error_message": "ERROR: Failed to transcribe in recognition process - amineth_result=0, amineth_code='o', amineth_message='recognition result is rejected because confidence is below the threshold'"
}
error_message에는 amineth_code='{응답 코드}'와 amineth_message='{오류 메시지}'가 포함될 수 있습니다. 자세한 내용은 응답 코드와 메시지 세부 사항의 표를 참조하십시오.
특히 오류 메시지에 amineth_code='o'가 포함된 경우, 클라이언트의 요청 방법이나 음성 파일에 문제가 있으므로 재시도해도 같은 결과가 됩니다. 자세한 내용은 "리젝트 (응답 코드=o)"를 참조하십시오. o 이외의 오류인 경우 AmiVoice API 기반의 문제일 가능성이 높으므로 잠시 기다렸다가 재시도하십시오.
콘텐츠 ID
요청 시 d 파라미터의 contentId에는 자유롭게 문자열을 설정할 수 있습니다. 예를 들어, 애플리케이션이 발행한 ID나 파일 이름, 사용자 등의 정보를 설정해 두면 인식 결과의 일부로 나중에 해당 정보를 얻을 수 있습니다.
예를 들어, curl 명령으로 contentId에 파일 이름을 설정하여 요청을 보내려면 다음과 같이 합니다.
curl https://acp-api-async.amivoice.com/v2/recognitions \
-F u={APP_KEY} \
-F d="grammarFileNames=-a-general loggingOptOut=True contentId=test.wav" \
-F a=@test.wav