로컬 파일 인식

Prev Next

Classic/VPC 환경에서 이용 가능합니다.

로컬에 저장되어 있는 오디오/비디오 파일을 인식하고 텍스트로 변환합니다.

요청

요청 형식은 다음과 같습니다.

메서드 URI
POST /recognizer/upload

요청 헤더

CLOVA Speech API에서 공통으로 사용하는 헤더에 대한 정보는 CLOVA Speech 요청 헤더를 참조해 주십시오.

요청 바디

요청 바디에 대한 설명은 다음과 같습니다.

필드 타입 필수 여부 설명
media File Required 로컬 오디오/비디오 파일
  • 지원 파일 형식
    • 오디오: MP3, AAC, AC3, OGG, FLAC, WAV, M4A
    • 비디오: AVI, MP4, MOV, WMV, FLV, MKV
params Object Required 파라미터 세부 정보
params.language String Required 텍스트 인식 언어
  • ko-KR (기본값) | en-US | enko | ja | zh-cn | zh-tw
    • ko-kR: 한국어
    • en-US: 영어
    • enko: 한/영 동시 인식
    • ja: 일본어
    • zh-cn: 중국어(간체)
    • zh-tw: 중국어(번체)
params.completion String Optional 인식 요청 후 응답 방식
  • sync | async (기본값)
    • sync(동기): 결과를 JSON 형식으로 반환
    • async(비동기): Callback URL 또는 resultToObs (ObjectStorage) 형식으로 반환
params.callback String Conditional Callback URL
  • completion이 async일 때 callback 또는 resultToObs 중 하나 필수 입력
params.wordAlignment Boolean Optional 인식 결과의 음성과 텍스트 정렬 출력 여부
  • true (기본값) | false
    • true: 출력
    • false: 미출력
params.fullText Boolean Optional 전체 인식 결과 텍스트 출력 여부
  • true (기본값) | false
    • true: 출력
    • false: 미출력
params.resultToObs Boolean Conditional Object Storage 내 결과 저장 여부
  • completion이 async일 때만 동작
  • true | false (기본값)
    • true: 결과 저장
    • false: 결과 미저장
params.noiseFiltering Boolean Optional 노이즈 필터링 여부
  • true (기본값) | false
    • true: 필터링 동작
    • false: 필터링 미동작
params.boostings Array Optional 키워드 부스팅 세부 정보: boostings
  • 음성 인식률을 높일 키워드 목록
  • 다중 입력 시 콤마(,)로 연결
    • <예시> "words": "test,test1,test2"
  • useDomainBoostings와 동시 사용 불가
  • 최대 1,000개까지 입력 가능
    • 500개 이하 권장
      • 키워드가 많을수록 인식 처리 시간 증가
      • 유사한 키워드 간 혼동으로 의도하지 않은 키워드로 인식될 가능성 증가
  • 한글, 영어만 지원
    • 영어: 기본적으로 소문자 변환, 대문자 키워드 부스팅 요청 시 대문자로 치환
  • 발음과 다른 표기로 출력할 키워드는 출력 표기|발음 형식으로 입력
    • 발음으로 인식된 단어를 출력 표기로 치환하여 반환
    • <예시> 신라|실라: 실라로 발음해도 신라로 출력
  • 1음절의 단어는 오인식의 위험이 있어 부스팅 미지원
    • <예시> 네, 응, no
    • 2음절 이상의 짧은 단어도 다른 단어의 인식에 영향을 줄 수 있으므로, 다른 단어를 키워드로 잘못 인식하는 경우 제외 권장
  • 띄어쓰기 여부와 관계 없이 부스팅 처리
    • <예시> "클로바스피치"와 "클로바 스피치" 중 한 개의 키워드만 부스팅 요청
  • 키워드 길이의 제약은 없으나, 부스팅할 대상이 여러 단어들이 조합된 구문일 경우 해당 구문이 아니면 부스팅의 영향을 받기 어려움
    • <예시> "클로바 스피치"라고 키워드를 부스팅하는 경우, "클로바 스피치"가 포함된 모든 문장은 부스팅의 영향을 받음
    • <예시> "클로바 스피치의 미디어 음성인식 기술" 이라는 조합된 긴 길이의 키워드를 부스팅하는 경우, "클로바 스피치"만 들어간 문장은 부스팅의 영향을 받기 어려움
  • 키워드 뒤에 조사가 붙은 발화에도 부스팅 적용
    • 키워드 전체가 인식된 경우에만 적용
    • <예시> 홍길동을 입력한 경우 홍길동님, 홍길동이에는 적용, 길동님에는 미적용
  • 같은 키워드를 여러 번 입력한 경우 마지막에 입력한 가중치 적용
params.useDomainBoostings Boolean Optional 도메인 부스팅 사용 여부
  • true | false(기본값)
    • true: 부스팅 사용
    • false: 부스팅 미사용
  • boostings와 동시 사용 불가
params.forbiddens String Optional 민감 키워드
  • 음성 인식률을 낮출 키워드 목록(인식 결과에 표시하고 싶지 않은 경우)
  • 키워드 개수 및 길이 제한 없음
  • 띄어쓰기, 영문 대소문자 모두 완전 일치 필요
params.diarization Object Optional 화자 인식 세부 정보
params.diarization.enable Boolean Optional 화자 인식 여부
  • true (기본값) | false
    • true: 화자 인식
    • false: 화자 미인식
sed Object Optional 이벤트 탐지 결과 세부 정보
sed.enable Boolean Optional 이벤트 탐지 여부
  • true | false (기본값)
    • true: 이벤트 탐지
    • false: 이벤트 미탐지
format String Optional 응답 결과 반환 형식
  • JSON (기본값) | SRT | SMI

boostings

boostings에 대한 설명은 다음과 같습니다.

필드 타입 필수 여부 설명
words String Optional 키워드 부스팅할 단어 목록
weight Float Optional 키워드 부스팅 가중치
  • 1~5 사이 값 입력. 소수 입력 가능
  • words에 입력한 키워드에 같은 가중치 적용
  • 키워드마다 다른 가중치를 주려면 boostings 항목을 나누어 입력
참고

completion(요청 후 응답 방식)을 async로 요청 시, 입력한 Callback URL 주소 유무 또는 resultToObs(ObjectStorage) 여부에 따라 인식 결과를 다음과 같이 반환합니다.

Callback URL resultToObs(ObjectStorage) 결과
URL 주소 있음 True Callback URL과 Object Storage 모두 결과 반환
URL 주소 있음 False Callback URL에만 결과 반환
URL 주소 없음 True Object Storage에만 결과 반환
URL 주소 없음 False 오류 반환

요청 예시

요청 예시는 다음과 같습니다.

curl --location --request POST '{Invoke URL}/recognizer/upload' \
--header 'Content-Type: multipart/form-data' \
--header 'X-CLOVASPEECH-API-KEY: {앱 등록 시 발급받은 Secret Key}' \
--form 'media=@"{media}"' \
--form 'params="{\"language\":\"ko-KR\",\"completion\":\"sync\", \"callback\":\"\", \"fullText\":true,\"\"}"' \
--form 'type="application/json"'
  • {Invoke URL}: 도메인의 빌더 > 설정 > [연동 정보] 탭 메뉴의 CLOVA Speech Invoke URL

응답

응답 형식을 설명합니다.

응답 바디

응답 바디에 대한 설명은 다음과 같습니다.

필드 타입 필수 여부 설명
result String - 응답 코드
message String - 응답 메시지
token String - 결과 토큰
version String - 엔진 버전
params Object - 파라미터 세부 정보
params.service String - 서비스 코드
params.domain String - 도메인 유형
  • 엔진 호출 시 사용
  • general
params.lang String - 인식 언어
  • ko | en | enko | ja | zh-cn | zh-tw
    • ko: 한국어
    • en: 영어
    • enko: 한/영 동시 번역
    • ja: 일본어
    • zh-cn: 중국어(간체)
    • zh-tw: 중국어(번체)
params.completion String - 인식 요청 후 응답 방식
  • sync(동기): 결과를 JSON 형식으로 반환
  • async(비동기): Callback URL 또는 Object Storage(resultToObs)로 반환
params.callback String - Callback URL
params.diarization Object - 화자 인식(분리) 세부 정보
params.diarization.enable Boolean - 화자 인식(분리) 여부
  • true | false
    • true: 화자 인식
    • false: 화자 미인식
params.diarization.speakerCountMin Integer - 최소 화자 수
params.diarization.speakerCountMax Integer - 최대 화자 수
params.sed Object - 이벤트 탐지 결과
params.sed.enable Boolean - 이벤트 탐지 여부
  • true | false (기본값)
    • true: 이벤트 탐지
    • false: 이벤트 미탐지
params.boostings Array - 키워드 부스팅 세부 정보: boostings
params.forbiddens String - 민감 키워드
params.wordAlignment Boolean - 인식 결과의 음성과 텍스트 정렬 출력 여부
  • true (기본값) | false
    • true: 출력
    • false: 미출력
params.fullText Boolean - 전체 인식 결과 텍스트 출력 여부
  • true (기본값) | false
    • true: 출력
    • false: 미출력
params.noiseFiltering Boolean - 노이즈 필터링 여부
  • true (기본값) | false
    • true: 필터링 동작
    • false: 필터링 미동작
params.resultToObs Boolean - Object Storage 내 결과 저장 여부
  • completion이 async일 때만 동작
  • true | false (기본값)
    • true: 결과 저장
    • false: 결과 미저장
params.priority Integer - 우선 순위
  • 0~4
  • 낮을수록 우선순위가 높음
params.userdata Object - 사용자 데이터 세부 정보
params.userdata._ncp_DomainCode String - 도메인 코드
  • long-speech | short-speech
    • long-speech: 장문 인식
    • short-speech: 단문 인식
params.userdata._ncp_DomainId Integer - 도메인 아이디
params.userdata._ncp_TaskId Integer - 태스크 아이디
  • 구체적인 인식 태스크 추적 시 사용
params.userdata._ncp_TraceId String - 트레이스 아이디
  • 로그 추적 시 사용
progress Integer - 인식 진행률
keywords Object - 키워드 부스팅된 단어 목록
segments Array - segments 세부 정보: segments
text String - 전체 텍스트
confidence Double - 전체 정확도
speakers Array - 전체 화자 세부 정보: speakers
events Array - 이벤트 세부 정보: events
eventTypes Array - 인식된 모든 이벤트 세부 정보: eventTypes

boostings

boostings에 대한 설명은 다음과 같습니다.

필드 타입 필수 여부 설명
words String - 키워드 부스팅 단어 목록
weight Float - 키워드 부스팅 가중치

segments

segments에 대한 설명은 다음과 같습니다.

필드 타입 필수 여부 설명
start Long - 분석 시작 시각(ms)
end Long - 분석 종료 시각(ms)
text String - 분석 텍스트
confidence Double - 분석 정확도
  • 0.0~1.0
diarization Object - 인식된 화자 세부 정보
diarization.label String - 인식된 화자의 번호
speaker Object - 변경된 화자 세부 정보
speaker.label String - 변경된 화자의 번호
speaker.name String - 변경된 화자의 이름
speaker.edited Boolean - 화자 변경 여부
  • true | false (기본값)
    • true: 화자 변경
    • false: 화자 동일
words Array<Long, Long, String> - 인식된 단어 목록
words.[0] Long - 세그먼트 시작 시각(ms)
words.[1] Long - 세그먼트 종료 시각(ms)
words.[2] String - 세그먼트 텍스트
textEdited String - 수정 내용

speakers

speakers에 대한 설명은 다음과 같습니다.

필드 타입 필수 여부 설명
label String - 전체 화자 번호
name String - 전체 화자의 이름
edited Boolean - 화자 변경 여부
  • true | false (기본값)
    • true: 화자 변경
    • false: 화자 동일

events

events에 대한 설명은 다음과 같습니다.

필드 타입 필수 여부 설명
type String - 이벤트 타입
label String - 이벤트 이름
labelEdited String - 이벤트 변경 이름
start Long - 이벤트 시작 시각
end Long - 이벤트 종료 시각

eventTypes

eventTypes에 대한 설명은 다음과 같습니다.

필드 타입 필수 여부 설명
label String - 인식된 이벤트

응답 상태 코드

CLOVA Speech API에서 공통으로 사용하는 응답 상태 코드에 대한 정보는 CLOVA Speech 응답 상태 코드를 참조해 주십시오.

응답 예시

응답 예시는 다음과 같습니다.

async로 요청하여 json으로 반환

async로 요청하여 json 형식으로 반환하는 응답 예시는 다음과 같습니다.

{
    "token": "*****f6a1015466bae2c926177f26310",
    "result": "SUCCEEDED",
    "message": "Succeeded"
}

sync로 요청하여 json으로 반환

sync로 요청하여 json 형식으로 반환하는 응답 예시는 다음과 같습니다.

{
    "result": "COMPLETED",
    "message": "Succeeded",
    "token": "*****166039e486abbb90e4a84c3b3a5",
    "version": "ncp_v2_v2.3.0-aa6cd8d-20231205_231211-3cf30bfc_v0.0.0_",
    "params": {
        "service": "ncp",
        "domain": "general",
        "lang": "enko",
        "completion": "sync",
        "callback": "",
        "diarization": {
            "enable": true,
            "speakerCountMin": -1,
            "speakerCountMax": -1
        },
        "sed": {
            "enable": true
        },
        "boostings": [
            {
                "words": "안녕하세요, 테스트",
                "weight": 1
            }
        ],
        "forbiddens": "",
        "wordAlignment": true,
        "fullText": true,
        "noiseFiltering": true,
        "resultToObs": false,
        "priority": 0,
        "userdata": {
            "_ncp_DomainCode": "NEST",
            "_ncp_DomainId": 1,
            "_ncp_TaskId": **442,
            "_ncp_TraceId": "*****ce98ec342d8a8c8fe9191cec343",
            "id": 1
        }
    },
    "progress": 100,
    "keywords": {},
    "segments": [
        {
            "start": 5870,
            "end": 8160,
            "text": "서울 수영장입니다.",
            "confidence": 0.9626975,
            "diarization": {
                "label": "2"
            },
            "speaker": {
                "label": "2",
                "name": "B",
                "edited": false
            },
            "words": [
                [
                    5871,
                    6730,
                    "서울"
                ],
                [
                    6860,
                    7530,
                    "수영장입니다."
                ]
            ],
            "textEdited": "서울 수영장입니다."
        },
        {
            "start": 8160,
            "end": 12950,
            "text": "입장료가 얼마예요? 5천 원이에요. 감사합니다.",
            "confidence": 0.8835926,
            "diarization": {
                "label": "1"
            },
            "speaker": {
                "label": "1",
                "name": "A",
                "edited": false
            },
            "words": [
                [
                    8161,
                    9220,
                    "입장료가"
                ],
                [
                    9390,
                    10020,
                    "얼마예요?"
                ],
                [
                    10410,
                    10640,
                    "5천"
                ],
                [
                    10710,
                    11140,
                    "원이에요."
                ],
                [
                    11910,
                    12500,
                    "감사합니다."
                ]
            ],
            "textEdited": "입장료가 얼마예요? 5천 원이에요. 감사합니다."
        }
    ],
    "text": "서울 수영장입니다. 입장료가 얼마예요? 5천 원이에요. 감사합니다.",
    "confidence": 0.9071357,
    "speakers": [
        {
            "label": "1",
            "name": "A",
            "edited": false
        },
        {
            "label": "2",
            "name": "B",
            "edited": false
        }
    ],
    "events": [
        {
            "type": "music",
            "label": "music",
            "labelEdited": "music",
            "start": 1400,
            "end": 5000
        }
    ],
    "eventTypes": [
        "music"
    ]
}

sync로 요청하여 srt로 반환

sync로 요청하여 srt 형식으로 반환하는 응답 예시는 다음과 같습니다.

1
00:00:00,000 --> 00:00:01,425
A: 저 얼마 전에

2
00:00:02,533 --> 00:00:11,550
A: 옥수수를 먹었거든요. 정말 달고 맛있던데요 그런데 나는 그게 동네 이름인 줄 알았어.

3
00:00:11,550 --> 00:00:19,025
A: 초사이어있을 때 그 초자에다가 달다는 당이었어 몰랐어요. 몰랐어. 나는 초당이 초당두부 이런 건 줄 알았어.

4
00:00:19,025 --> 00:00:26,317
C: 사카린 생각했죠. 조금. 작가님 초당으로 드셨는데.

5
00:00:26,317 --> 00:00:28,240
A: 옥수수에요?

6
00:00:28,240 --> 00:00:35,318
B: 아니 지금 두부 단 맛나는 두부가 어디 있어. 지금 이 도는 이해를 못 해. 상도면 초당 지역 아니야?

7
00:00:35,318 --> 00:00:42,800
A: 아니. 초당 옥수수는 슈퍼 스위트란 뜻이었어. 초 달다고 아무도 이해 못했어요. 지금.

sync로 요청하여 smi로 반환

sync로 요청하여 smi 형식으로 반환하는 응답 예시는 다음과 같습니다.

<SAMI>
<Body>
  <SYNC Start=0>
    <P>A: 저 얼마 전에
  <SYNC Start=2533>
    <P>A: 옥수수를 먹었거든요. 정말 달고 맛있던데요 그런데 나는 그게 동네 이름인 줄 알았어.
  <SYNC Start=11550>
    <P>A: 초사이어있을 때 그 초자에다가 달다는 당이었어 몰랐어요. 몰랐어. 나는 초당이 초당두부 이런 건 줄 알았어.
  <SYNC Start=19025>
    <P>C: 사카린 생각했죠. 조금. 작가님 초당으로 드셨는데.
  <SYNC Start=26317>
    <P>A: 옥수수에요?
  <SYNC Start=28240>
    <P>B: 아니 지금 두부 단 맛나는 두부가 어디 있어. 지금 이 도는 이해를 못 해. 상도면 초당 지역 아니야?
  <SYNC Start=35318>
    <P>A: 아니. 초당 옥수수는 슈퍼 스위트란 뜻이었어. 초 달다고 아무도 이해 못했어요. 지금.
</Body>
</SAMI>