- 인쇄
- PDF
실시간 스트리밍 인식
- 인쇄
- PDF
Classic/VPC 환경에서 이용 가능합니다.
실시간으로 16kHZ, 1 Channel, 16 bits per sample의 PCM(헤더가 없는 WAV 파일) 형식의 음성 데이터를 인식하고 텍스트로 변환합니다. gRPC 방식을 통해서만 접근이 가능합니다.
요청
요청 형식을 설명합니다. 요청 형식은 다음과 같습니다.
Host | Port |
---|---|
clovaspeech-gw.ncloud.com | 50051 |
요청 순서
gRPC 방식을 통해 인식을 요청하는 방법은 다음과 같습니다.
Rocky Linux 환경을 기준으로 설명합니다.
1. Protoc Compiler 설치 및 준비
API를 사용하기 위한 사전 준비를 위해 gRPC 사이트를 참조하여 Protoc Compiler를 설치합니다. 설치 후 Python과 Java 중 원하는 언어를 선택한 다음 API의 인터페이스가 정의된 'nest.proto'
파일을 통해 Compiler를 호출합니다.
Protoc Compiler를 설치하고 gRPC 코드를 생성하는 방법은 다음과 같습니다.
Protoc Compiler를 설치할 서버에 원격 접속해 주십시오.
gRPC 사용을 위한 패키지와 플러그인을 설치해 주십시오.
Rocky Linux: Python
# 최신 상태 확인 sudo dnf update # Python 설치 : Linux 서버에 Python을 설치합니다. sudo dnf install python3 # pip 설치 및 업그레이드 : pip는 Python용 패키지 설치 프로그램입니다. sudo dnf install python3-pip pip3 install --upgrade pip # grpcio-tools 설치 : pip를 사용하여 'grpcio-tools'를 설치합니다. pip3 install grpcio-tools # nest.proto 파일 생성 touch nest.proto # protoc compiler로 nest.proto 파일 컴파일 python3 -m grpc_tools.protoc -I=. --python_out=. --grpc_python_out=. nest.proto
Rocky Linux: Java
# protoc-gen-grpc-java 플러그인 다운로드 (버전 번호는 확인 필요 https://github.com/grpc/grpc-java/releases) curl -OL https://repo1.maven.org/maven2/io/grpc/protoc-gen-grpc-java/1.66.0/protoc-gen-grpc-java-1.66.0-linux-x86_64.exe # PATH에 추가 mv protoc-gen-grpc-java-1.66.0-linux-x86_64.exe /usr/local/bin/protoc-gen-grpc-java # 실행 권한으로 바꾸기 chmod +x /usr/local/bin/protoc-gen-grpc-java # 설치 확인 protoc-gen-grpc-java --version # nest.proto 파일 생성 touch nest.proto # protoc compiler로 nest.proto 파일 컴파일 protoc --proto_path=. --java_out=output/directory --grpc-java_out=output/directory nest.proto
'nest.proto'
파일을 열어 다음 코드를 입력하고 gRPC 코드를 생성해 주십시오.syntax = "proto3"; option java_multiple_files = true; package com.nbp.cdncp.nest.grpc.proto.v1; enum RequestType { CONFIG = 0; DATA = 1; } message NestConfig { string config = 1; } message NestData { bytes chunk = 1; string extra_contents = 2; } message NestRequest { RequestType type = 1; oneof part { NestConfig config = 2; NestData data = 3; } } message NestResponse { string contents = 1; } service NestService { rpc recognize(stream NestRequest) returns (stream NestResponse){}; }
2. 인증(Authorization)
Protoc Compiler를 통해 gRPC 코드 생성을 완료한 후 인증을 진행합니다. 인증은 API 호출 시 Authorization
헤더에 Bearer 토큰을 포함하여 서버에 무결성을 인증하는 방식으로 진행합니다. 인증 진행 시 다음 내용을 주의해 주십시오.
- gRPC Channel을 설정하고,
nest_grpc_pb2
의 Client Side Proxy인stub
을 생성합니다. stub
생성 후recognize
메서드에 인증 키가 있는 Metadata(메타 데이터)를 포함시켜 원하는 함수를 실행합니다.- 실시간 스트리밍 인식 API는 Free 플랜에서는 지원하지 않으며, Basic 장문 인식 플랜에서만 지원합니다.
인증 헤더
인증 헤더는 다음과 같습니다.
헤더명 | 설명 |
---|---|
Authorization | Bearer ${secretKey} |
인증 순서
인증 방법은 다음과 같습니다.
Python
Rocky Linux 환경에서 Python을 사용하여 인증하는 방법은 다음과 같습니다.
- Python 파일을 생성해 주십시오. 여기에서는 파일 이름을
main.py
로 지정했습니다.touch main.py
main.py
에 다음 내용을 추가해 주십시오.import grpc import json import nest_pb2 import nest_pb2_grpc channel = grpc.secure_channel( 'clovaspeech-gw.ncloud.com:50051', grpc.ssl_channel_credentials() ) client = NestServiceStub(channel) metadata = (("authorization", f"Bearer {secretKey}"),) #소문자 authorization 필수 / secretkey는 장문인식 도메인에서 확인 call = client.YourMethod(YourRequest(), metadata=metadata)
Java
Rocky Linux 환경에서 Java를 사용하여 인증하는 방법은 다음과 같습니다.
- Java 파일을 생성해 주십시오. 여기에서는 파일 이름을
main.java
로 지정했습니다.touch main.java
main.java
에 다음 내용을 추가해 주십시오.ManagedChannel channel = NettyChannelBuilder .forTarget("clovaspeech-gw.ncloud.com:50051") .useTransportSecurity() .build(); NestServiceGrpc.NestServiceStub client = NestServiceGrpc.newStub(channel); Metadata metadata = new Metadata(); metadata.put(Metadata.Key.of("Authorization", Metadata.ASCII_STRING_MARSHALLER), "Bearer ${secretKey}"); client = MetadataUtils.attachHeaders(client, metadata);
3. Config JSON
Protoc에서 생성된 nest_pb2
의 NestRequest
객체를 통해 스트리밍 엔드포인트로 전달되는 Config JSON에 대해 설명합니다. Config JSON은 실시간 스트리밍 인식 API를 처음 호출 시 전송해야 합니다.
Config JSON에는 다음과 같은 필드를 제공하고 있습니다.
- transcription: 음성 인식 언어 설정
- keywordBoosting: 입력된 단어들에 대해 인식률을 높이는 설정
- forbidden: 금칙어 설정
- semanticEpd: 음성 인식 결과 생성 기준 설정
요청 바디
Config JSON의 요청 바디에 대한 설명은 다음과 같습니다.
Transcription
Transcription에 대한 설명은 다음과 같습니다.
필드 | 타입 | 필수 여부 | 설명 |
---|---|---|---|
language | String | Required | 음성 인식 대상 언어 코드
|
transcription은 필수 입력 필드는 아니지만 명확한 음성 인식을 위해 설정하는 것을 권장합니다.
Keyword Boosting
Keyword Boosting 필드에 대한 설명은 다음과 같습니다.
필드 | 타입 | 필수 여부 | 설명 |
---|---|---|---|
keywordBoosting | Object | Optional | 키워드 부스팅 정보
|
keywordBoosting.boostings | Array | Optional | 키워드 부스팅 단어 상세 정보 |
keywordBoosting.boostingIDs | Array<String> | Optional | 키워드 부스팅 아이디 |
boostings
keywordBoosting.boostings
에 대한 설명은 다음과 같습니다.
필드 | 타입 | 필수 여부 | 설명 |
---|---|---|---|
words | String | Optional | 키워드 부스팅 단어 목록
|
weight | Float | Optional | 키워드 부스팅 가중치
|
Forbidden
Forbidden 필드에 대한 설명은 다음과 같습니다.
필드 | 타입 | 필수 여부 | 설명 |
---|---|---|---|
forbidden | Object | Optional | 금칙어 정보
|
forbidden.forbiddens | String | Optional | 금칙어 목록
|
forbidden.forbiddenIDs | Array<String> | Optional | 금칙어 아이디 |
SemanticEpd
SemanticEpd 필드에 대한 설명은 다음과 같습니다.
필드 | 타입 | 필수 여부 | 설명 |
---|---|---|---|
semanticEpd | Object | Optional | 음성 인식 결과의 생성 기준 설정 정보 |
semanticEpd.skipEmptyText | Boolean | Optional | 인식 결과가 없는 결과 값의 전송 여부
|
semanticEpd.useWordEpd | Boolean | Optional | 단어(word)로 종료하는 인식 결과 생성 여부
|
semanticEpd.usePeriodEpd | Boolean | Optional | 구두점으로 종료하는 인식 결과 생성 여부
|
semanticEpd.gapThreshold | Integer | Optional | 인식 결과 생성 기준 묵음 발생 시간(ms)
|
semanticEpd.durationThreshold | Integer | Optional | 인식 결과 생성 기준 지속 시간 (ms)
|
semanticEpd.syllableThreshold | Integer | Optional | 인식 결과 생성 기준 음절의 개수
|
요청 예시
Config JSON의 요청 예시는 다음과 같습니다.
{
"keywordBoosting": {
"boostings": [
{
"words": "test,test1,test2",
"weight": 1
},
{
"words": "테스트,테스트1,테스트2",
"weight": 0.5
}
],
"boostingIDs": [
"test_boostingID_0",
"test_boostingID_1"
]
},
"forbidden": {
"forbiddens": "금칙어1,금칙어2",
"forbiddenIDs": [
"test_forbiddenID_0",
"test_forbiddenID_1"
]
}
}
응답 바디
Config JSON의 응답 바디에 대한 설명은 다음과 같습니다.
필드 | 타입 | 필수 여부 | 설명 |
---|---|---|---|
uid | String | - | UID |
responseType | Array<String> | - | 응답 유형
|
config | Object | - | Config JSON 정보 |
config.status | String | - | Config JSON 요청 상태
|
config.keywordBoosting | Object | - | 키워드 부스팅 정보 |
config.keywordBoosting.status | String | - | 키워드 부스팅 요청 상태
|
config.forbidden | Object | - | 민감 키워드 정보 |
config.forbidden.status | String | - | 민감 키워드 요청 상태
|
config.semanticEpd | Object | - | Semantic EPD 정보 |
config.semanticEpd.status | String | - | Semantic EPD 요청 상태
|
오류 메시지
요청 실패 시 나타나는 오류 메시지에 대한 설명은 다음과 같습니다.
오류 메시지 | 연관 필드 | 설명 |
---|---|---|
Unknown key: ${top_level_key}-${unknown_key} | 공통 | 서버 미지원 서브 레벨 키(Sub Level Key) 보유 |
Invalid type: ${top_level_key}-${invalid_type_key} | 공통 | 서버 미지원 서브 레벨 밸류 타입(Sub Level Value Type) 보유 |
Invalid language code: ${invalid_language_code} | transcription | language 가 사전 정의되지 않은 언어 코드 |
Not Authorized | transcription | language 가 허용되지 않은 언어 코드 |
Invalid boostingID | keywordBoosting | boostingID 만 존재, 결과 없음 |
Internal system error | keywordBoosting | 서버 내부 문제 발생 |
Invalid forbiddenID | Forbidden | forbiddenID 만 존재, 아이디 인식 결과 없음 |
Invalid request json format | - | 비정상적인 JSON 형식 |
Required key is not provided | - | 서버에 정의된 필수 키 값 미포함 |
No more slot | - | 현재 서버에 여유 자원이 없음 |
ConfigRequest did not complete | - | Config JSON 요청 처리 미완료 상태에서 서버에 인식 요청 |
Lifespan expired | - | gRPC 서비스 사용 시간 만료
|
Failed to received request msg | - | 서버가 요청 메시지를 정상 수신하지 못함 |
Model server is not working | - | 서버 내부 오류 |
Internal server error | - | 서버 내부 오류 |
응답 예시
Config JSON의 응답 예시는 다음과 같습니다.
성공
호출이 성공한 경우의 응답 예시는 다음과 같습니다.
{
"uid": "{uid}",
"responseType": [ "config" ],
"config": {
"status": "Success",
"keywordBoosting": {
"status": "Success"
},
"forbidden" : {
"status": "Success"
}
}
실패
요청에 hobidden
입력 시 호출이 실패한 경우의 응답 예시는 다음과 같습니다.
{
"uid": "{uid}",
"responseType": [ "config" ]
"config": {
"status": "Unknown key: hobidden"
}
}
요청에 boostingID
만 인식 결과 없이 존재하여 호출이 실패한 경우의 응답 예시는 다음과 같습니다.
{
"uid": "{uid}",
"responseType": [ "config" ]
"config": {
"status": "Failure",
"keywordBoosting": {
"status": "Success"
},
"forbidden" : {
"status": "Invalid boostingID"
}
}
}
4. 인식(Recognize)
Config JSON을 통해 원하는 설정을 진행한 후 recognize
를 통해 음성 인식 API를 호출하여 실시간으로 음성 데이터를 처리하여 인식합니다. Protoc에서 생성한 코드에 있는 NestRequest
와 인증 메타 데이터를 stub
의 메서드인 recognize
를 통해 음성 인식 API를 호출하게 됩니다.
요청 바디
Recognize의 요청 바디에 대한 설명은 다음과 같습니다.
필드 | 타입 | 필수 여부 | 설명 |
---|---|---|---|
epFlag | Boolean | Optional | 일시 정지 또는 마지막 인식 요청 시 버퍼 및 결과 반환 시점
|
seqId | Integer | Conditional | 인식 요청 아이디
|
응답 바디
Recognize의 응답 바디에 대한 설명은 다음과 같습니다.
필드 | 타입 | 필수 여부 | 설명 |
---|---|---|---|
uid | String | - | UID |
responseType | Array | - | 응답 유형
|
config | Object | - | Config JSON 필드 정보 |
config.text | String | - | 인식 결과 텍스트 |
config.position | Integer | - | 전체 텍스트에서 text 로 전달 받은 텍스트의 위치 |
config.periodPositions | Array<Integer> | - | 전체 텍스트에서 . (구두점)의 위치
|
config.periodAlignIndices | Array<Integer> | - | . 의 alignInfos 인덱스 정보
|
config.epFlag | Boolean | Optional | 요청에서 epFlag 를 true 로 설정하고 보낸 음원에 대한 인식 결과 포함 여부
|
config.seqId | Integer | - | 인식 결과의 마지막 요청 여부
|
config.epdType | String | - | 인식 결과 생성에 대한 EPD 기준
|
config.startTimestamp | Integer | - | 인식 결과 시작 시각(ms) |
config.endTimestamp | Integer | - | 인식 결과 종료 시각(ms) |
config.confidence | Float | - | 인식 결과 신뢰도
|
config.alignInfos | Array | - | 인식 결과 구성 음절의 Align 정보 |
recognize | Object | - | 인식(Recognize) 정보 |
recognize.status | String | - | 인식(Recognize) 상태
|
recognize.epFlag | Object | - | epFlag 정보 |
recognize.epFlag.status | String | - | epFlag 상태
|
recognize.seqId | Object | - | seqId 정보 |
recognize.seqId.status | String | - | seqId 상태
|
text
와 position
을 사용하여 full text를 구성하는 예시는 다음과 같습니다.
전달 받은 순서 | 인식 결과 | full text |
---|---|---|
1 | {text: "가나다", position: 0, ...} | "가나다" |
2 | {text: "라마바사", position: 3, ...} | "가나다라마바사" |
alignInfos
config.alignInfos
에 대한 설명은 다음과 같습니다.
필드 | 타입 | 필수 여부 | 설명 |
---|---|---|---|
word | String | - | 구성 음절 |
start | Integer | - | 구성 음절 시작 시각(ms) |
end | Integer | - | 구성 음절 종료 시각(ms) |
confidence | Float | - | 구성 음절 신뢰도
|
오류 메시지
Recognize 요청 실패 시 나타나는 오류 메시지에 대한 설명은 다음과 같습니다.
오류 메시지 | 연관 필드 | 설명 |
---|---|---|
Invalid Type | recognize.status | epFlag 또는 seqId 타입과 사전 정의된 타입 불일치 |
Required key is not provided | recognize.status | extraContents 의 epFlag 값 미전달 |
Invalid request json format | recognize.status | extraContents 가 JSON 형식이 아님 |
Unknown key | recognize.status | extraContents 에 프로토콜에 없는 key 작성 |
ConfigRequest is already called | recognize.status | 서버에 Config 요청 중복 |
Lifespan expired | recognize.status | gRPC 서비스 사용 시간 만료
|
Failed to received request msg | recognize.status | 서버가 요청 메시지를 정상 수신하지 못함 |
Model server is not working | recognize.status | 서버 내부 문제 발생 |
Internal server error | recognize.status | 서버 내부 문제 발생 |
Invalid format | recognize.status | 전송한 오디오 형식이 유효하지 않음 |
Not found | epFlag.status | epFlag 값 미입력 |
Invalid type | epFlag.status , seqId.status | 사전 정의된 타입 불일치 |
Invalid format | audio.status | audio 필드 사전 정의된 타입 불일치 |
응답 예시
응답 예시는 다음과 같습니다.
성공
호출이 성공한 경우의 응답 예시는 다음과 같습니다.
- 응답 성공 및
"responseType": [ "transcription" ]
일 때
{
"uid": "{uid}"
"responseType": [ "transcription" ]
"transcription": {
"text": "입니다.",
"position": 0,
"periodPositions": [3],
"periodAlignIndices": [3],
"epFlag": false,
"seqId": 0,
"epdType": "durationThreshold",
"startTimestamp": 190,
"endTimestamp": 840,
"confidence": 0.997389124199423,
"alignInfos": [
{"word":"입","start":190,"end":340,"confidence":0.9988637124943075},
{"word":"니","start":341,"end":447,"confidence":0.9990018488549978},
{"word":"다","start":448,"end":580,"confidence":0.9912501264550316},
{"word":".","start":581,"end":700,"confidence":0.9994397226648595},
{"word":" ","start":701,"end":840,"confidence":0.9984142043105126}
]
}
}
실패
호출이 실패한 경우의 응답 예시는 다음과 같습니다.
{
"uid": string, # required
"responseType": [ "recognize" ], # required
"recognize": { # required
"status": string, # required
"epFlag": { # optional
"status": string
},
"seqId": { # optional
"status": string
},
"audio": { # op
"status":
}
}
}