#ifndef LVCSR_API_H
#define LVCSR_API_H

#ifdef WIN32
#define LVCSR_LIBRARY_API __declspec(dllexport)
#define snprintf		sprintf_s
#else
#define LVCSR_LIBRARY_API 
#endif

#define MAX_CHANNEL									5000
#define MAX_NAME_SIZE								128

/** module */
#define	MODULE_USE_ENGINE_GENERAL					0X0001			// 1
#define	MODULE_USE_ENGINE_SPACING					0X0002			// 2

#define MODULE_USE_PLUGIN_KWD 						0x0010			// 16
#define MODULE_USE_PLUGIN_ADDR						0x0020			// 32
#define MODULE_USE_PLUGIN_PHONICS					0x0030			// 48
#define MODULE_USE_PLUGIN_ITN						0x0040			// 64

#define	MODULE_USE_ENGINE_GENERAL_PLUGIN_NONE		0X0001			// 1
#define	MODULE_USE_ENGINE_GENERAL_PLUGIN_KWD		0X0011			// 17
#define	MODULE_USE_ENGINE_GENERAL_PLUGIN_ADDR		0X0021			// 33
#define	MODULE_USE_ENGINE_GENERAL_PLUGIN_PHONICS	0X0031			// 49
#define	MODULE_USE_ENGINE_GENERAL_PLUGIN_ITN		0X0041			// 65

#define	MODULE_USE_ENGINE_SPACING_PLUGIN_NONE		0X0002			// 2
#define	MODULE_USE_ENGINE_SPACING_PLUGIN_KWD		0X0012			// 18
#define	MODULE_USE_ENGINE_SPACING_PLUGIN_ADDR		0X0022			// 34
#define	MODULE_USE_ENGINE_SPACING_PLUGIN_PHONICS	0X0032			// 50
#define	MODULE_USE_ENGINE_SPACING_PLUGIN_ITN		0X0042			// 66


typedef enum _LVCSR_RESULT
{
	LVCSR_SUCCESS = 0,												// 성공
	LVCSR_FAIL = -1,												// 실패
	LVCSR_TIMEOUT = -2,												// 시간초과
} LVCSR_RESULT;

typedef enum _LVCSR_EPD_INFO
{
	RECEIV_OK = 0,													// 전송 성공 - 보내준 압축음성을 받고 계속 보내라는 메시지
	RECEIV_OK_SPEECH = 1,											// Start Point Detect - 보내준 압축음성을 받고 계속 보내라는 메시지 이며 "음성이라고 판단된 시점부터 나온다.
	EPD_FOUND = 2,													// 음성의 끝 검출 - 음성인식 서버에서 음성 끝점을 검출하여 녹음 종료하라는 메시지
	START_TIME_OVER = 3,											// 첫음 검출 실패 - 정해진 시간동안 음성이 없어 첫음 검출 실패에 대한 메시지
	DURATION_TIME_OVER = 4,											// 끝점 검출 실패 - 정해진 시간동안 끝점 검출 실패에 대한 메시지
	SECTION_FOUND = 5,												// 구간 음성검출 완료(엔진 EPD 활성화시 리턴). 계속 데이터 전송 요청.
	EPD_ERROR = 9,													// EPD 오류 발생
} LVCSR_EPD_INFO;

typedef enum _LVCSR_TYPE_CODEC
{
	CODEC_RAW_8K = 0,												// 8KHz 오디오 포맷(미압축)
	CODEC_RAW_16K = 1,												// 16KHz 오디오 포맷(미압축) - 16K 엔진인 경우 사용 가능
	CODEC_ULAW_8K = 2,												// G.711 코덱을 이용한 압축 방법으로 유럽에서 표준 채택 사용
	CODEC_ALAW_8K = 3,												// G.711 코덱을 이용한 압축 방법으로 북아메리카 및 일본 등에서 표준 채택 사용
	CODEC_SPEEX_16K = 4,											// 음성을 위해 개발된 무특허 오디오 압축 포맷
} LVCSR_TYPE_CODEC;

typedef enum _LVCSR_SET_CHAR
{
	CHAR_SET_EUCKR = 0,												// EUC-KR
	CHAR_SET_UTF8 = 1,												// UTF-8
} LVCSR_SET_CHARSET;

typedef enum _LVCSR_USED_EPD
{
	EPD_USED_OFF = 0,												// EPD 모듈 미사용
	SERVER_EPD_USED_ON = 1,											// SERVER EPD ON(LVCSR_RECOG_MID_RESULT 상세결과 미 제공)
	ENGINE_EPD_USED_WITH_DETECTOR_MID_RESULT = 2,					// ENGINE EPD ON(LVCSR_RECOG_MID_RESULT 상세결과 제공 - ENGINE EPD 검출)
	ENGINE_EPD_USED_WITH_CONTINUE_MID_RESULT = 3,					// ENGINE EPD ON(LVCSR_RECOG_MID_RESULT 상세결과 제공 - ENGINE EPD 무관<계속>)

} LVCSR_USED_EPD;

typedef enum _LVCSR_USED_SCORE
{
	SCORE_USED_OFF = 0,												// 점수 미사용
	SCORE_USED_ON = 1,												// 점수 사용
} LVCSR_USED_SCORE;

typedef enum _LVCSR_USED_WORD
{
	WORD_USED_OFF = 0,												// 음절 인식률 사용(단어 인식률 미사용)
	WORD_USED_ON = 1,												// 단어 인식률 사용
} LVCSR_USED_WORD;

typedef enum _LVCSR_TYPE_ADDR
{
	TYPE_NONE = 0,													// 값 없음
	JIBUN_ADDR = 1,													// 지번주소(법정동/행정동 주소체계이며 지번 없는 경우 또는 POI)
	JIBUN_ADDR_KEY = 2,												// 지번주소(법정동/행정동 주소체계이며 지번이 있는 경우)
	ROAD_ADDR = 3,													// 도로명주소(건물번호가 없는 경우 또는 POI)
	ROAD_ADDR_KEY = 4,												// 도로명주소(건물번호가 있는 경우)
} LVCSR_TYPE_ADDR;

typedef enum _LVCSR_TYPE_CHANNEL
{
	ASR_STAT_IDLE = 0,												// 유휴상태
	ASR_STAT_WAIT = 1,												// 대기상태
	ASR_STAT_WORK = 2,												// 인식상태
	ASR_STAT_FAIL = 3,												// 오류상태
} LVCSR_TYPE_CHANNEL;

typedef enum _LVCSR_USED_SSL {
	SSL_USED_OFF = 0,												// SSL 미사용
	SSL_USED_ON = 1,												// SSL 사용
} LVCSR_USED_SSL;

typedef enum _LVCSR_SSL_RESULT {
	SSL_SUCCESS = 1,												// SSL 성공
	SSL_FAIL = -1,													// SSL 실패
	SSL_NOT_FOUND_CRT = -2,											// 인증서 실패
} LVCSR_SSL_RESULT;

typedef enum _LVCSR_USED_CRT_CHECK {
	CRT_CHECK_OFF = 0,												// 인증서 미체크
	CRT_CHECK_ON = 1,												// 인증서 체크
} LVCSR_USED_CRT_CHECK;

typedef enum _LVCSR_RESULT_CODE
{
	STT_WARNING = -1,												// STT 모듈 경고
	STT_FAILED = 0,													// STT 모듈 실패
	STT_SUCCESS = 1,												// STT 모듈 성공
} LVCSR_RESULT_CODE;

typedef enum _LVCSR_RESULT_TYPE
{
	STT_TYPE = 0,													// STT 모듈 STT 타입
	PHONICS_TYPE = 1,												// STT 모듈 PHONICS 타입
} LVCSR_RESULT_TYPE;

typedef struct _LVCSR_DATA_PHONEME
{
	long long						nPhTokenLen;					// 음소 인식 결과 길이
	char*							pPhToken;						// 음소 인식 결과
	long long						nDuration;						// 재생 시작 정보( ms )
	double 							dScore;							// 음소 점수
} LVCSR_DATA_PHONEME;

typedef struct _LVCSR_DATA_RESULT
{
	long long						nTokenLen; 						// 단어 결과 길이
	char* 							pTokenStr; 						// 단어 결과
	long long						nStart;							// 구간 시작 정보( ms )
	long long						nEnd;							// 구간 종료 정보( ms )
	double 							dScore;							// 단어 점수
	long long						nResultPhCnt;					// 음소 정보 구조체 개수
	LVCSR_DATA_PHONEME*				pResultPhoneme;					// 음소 정보 구조체
} LVCSR_DATA_RESULT;

typedef struct _LVCSR_DATA_EPD
{
	long long						nStart;							// EPD 시작 정보( ms )
	long long						nEnd;							// EPD 종료 정보( ms )
} LVCSR_DATA_EPD;

typedef struct _LVCSR_DATA_CHAR_TIME
{
	long long						nCharSec;						// 발성 구분 시간( Sec )
} LVCSR_DATA_CHAR_TIME;

typedef struct _LVCSR_DATA_WAVE_FORM 
{
	long long						nWaveFormSize; 					// 파형 크기 정보
} LVCSR_DATA_WAVE_FORM;

typedef struct _LVCSR_DATA_CHAR_INFO
{
	long long						nCharacterSecSum;				// 초당 인식 결과 글자 개수
	double 							dCharacterPerSec;				// 초당 단어 발성 속도
} LVCSR_DATA_CHAR_INFO;

typedef struct _LVCSR_RECOG_ADD_INFO
{
	long long						nCharacterSum;					// 인식 결과 글자 개수
	long long						nEpsTime;						// 묵음 총 시간
	long long						nNoiseTime;						// 발성 총 시간
	long long						nTotalTime;						// 전체 시간
	double 							dCharacterTotPerSec;			// 초당 발성 속도
	long long						nCount;							// 파형 구조체 개수
	LVCSR_DATA_WAVE_FORM*			pDataWaveForm;					// 파형 상세내용 구조체
	long long						nCharCount;						// 초당 발성 속도 구조체 개수
	LVCSR_DATA_CHAR_INFO*			pDataCharInfo;					// 초당 발성 속도 상세내용 구조체
} LVCSR_RECOG_ADD_INFO;

typedef struct _LVCSR_DATA_NBEST_RESULT
{
	long long         				nResultLen;						// 인식결과 길이
	char*							pResult;						// 인식 결과
	double							dConfidScore;					// 인식 확률값
	long long         				nCount;							// 인식결과 상세내용 구조체 개수
	LVCSR_DATA_RESULT* 				pDataResult;					// 인식결과 상세내용 구조체
} LVCSR_DATA_NBEST_RESULT;

typedef struct _LVCSR_RECOG_NBEST_RESULT
{
	long long         				nCount;							// 인식결과 NBEST 구조체 개수
	LVCSR_DATA_NBEST_RESULT*		pDataNbestResult;				// 인식결과 NBEST 구조체	
	LVCSR_DATA_EPD* 				pResultEPD;						// EPD 구조체
} LVCSR_RECOG_NBEST_RESULT;


// PHONICS 추가
typedef struct _LVCSR_DATA_PHONICS
{
	long long						nPhonicsLen;					// Phonics 텍스트 길이
	char*							pPhonicsStr;					// Phonics 텍스트
} LVCSR_DATA_PHONICS;

typedef struct _LVCSR_RECOG_PHONICS_RESULT
{
	long long         				nResultLen;						// 인식결과 길이
	char*							pResult;						// 인식 결과
	long long						nJsonLen;						// Json 길이
	char*							pJson;							// Json 결과	
	double							dConfidScore;					// 인식 확률값
	long long         				nDataCnt;						// 인식결과 상세내용 구조체 개수
	LVCSR_DATA_RESULT* 				pDataResult;					// 인식결과 상세내용 구조체
	LVCSR_DATA_EPD* 				pResultEPD;						// EPD 구조체
} LVCSR_RECOG_PHONICS_RESULT;

typedef struct _LVCSR_DATA_SEP_ADDR
{
	long long						nSidoLen; 						// 시/도 길이
	char* 							pSidoStr; 						// 시/도
	long long						nSigunguMainLen; 				// 시/군/구 main 길이
	char* 							pSigunguMainStr; 				// 시/군/구 main
	long long						nSigunguSubLen; 				// 시/군/구 sub 길이
	char* 							pSigunguSubStr; 				// 시/군/구 sub
	long long						nDongLen; 						// 읍/면/동 길이
	char* 							pDongStr; 						// 읍/면/동
	long long						nLiLen; 						// 리 길이
	char* 							pLiStr; 						// 리
	long long						nJibunLen; 						// 지번 길이
	char* 							pJibunStr; 						// 지번
	long long						nRoadNameLen; 					// 도로명 길이
	char* 							pRoadNameStr; 					// 도로명
	long long						nBldgNoLen; 					// 건물번호 길이
	char* 							pBldgNoStr; 					// 건물번호
	long long						nPoiNameLen; 					// POI명 길이
	char* 							pPoiNameStr; 					// POI명
} LVCSR_DATA_SEP_ADDR;

typedef struct _LVCSR_DATA_ADDR
{
	LVCSR_TYPE_ADDR					nCorrectType;					// 보정 유형
	long long						nZipcodeLen; 					// 우편번호 길이
	char* 							pZipcodeStr; 					// 우편번호
	long long						nMainAddressLen; 				// 기본주소 길이
	char* 							pMainAddressStr; 				// 기본주소
	long long						nAuxAddressLen; 				// 상세주소 길이
	char* 							pAuxAddressStr; 				// 상세주소
	long long						nAdditionalSpeechLen; 			// 미정제주소 길이(추가발성주소)
	char* 							pAdditionalSpeechStr; 			// 미정제주소
	LVCSR_DATA_SEP_ADDR				pSepAddr;						// 분리된 결과 주소 구조체
} LVCSR_DATA_ADDR;

typedef struct _LVCSR_DATA_KWD
{
	long long						nTokenLen; 						// 단어 결과 길이
	char* 							pTokenStr; 						// 단어 결과
	long long						nSymbolLen; 					// 심볼 결과 길이
	char* 							pSymbolStr; 					// 심볼 결과
	long long						nStart; 						// 구간 시작 정보( ms )
	long long						nEnd; 							// 구간 종료 정보( ms )
	double 							dScore;							// 단어 점수
} LVCSR_DATA_KWD;

typedef struct _LVCSR_DATA_SMI
{
	long long						nSmiLen; 						// 자막 결과 길이
	char* 							pSmiStr; 						// 자막 결과
} LVCSR_DATA_SMI;

typedef struct _LVCSR_RECOG_RESULT
{
	long long         				nResultLen;						// 인식결과 길이
	char*							pResult;						// 인식 결과
	double							dConfidScore;					// 인식 확률값
	long long         				nCount;							// 인식결과 상세내용 구조체 개수
	LVCSR_DATA_RESULT* 				pDataResult;					// 인식결과 상세내용 구조체
	long long         				nSentCount;						// 문장결과 상세내용 구조체 개수
	LVCSR_DATA_RESULT* 				pDataSentResult;				// 문장결과 상세내용 구조체
	LVCSR_DATA_EPD* 				pResultEPD;						// EPD 구조체
	long long         				nAddrUsed;						// ADDR Used
	LVCSR_DATA_ADDR*				pResultADDR;					// ADDR 구조체
	long long         				nKWDCount;						// KWD 구조체 개수
	LVCSR_DATA_KWD* 				pResultKWD;						// KWD 구조체
	long long         				nSMIUsed;						// SMI 사용여부
	LVCSR_DATA_SMI* 				pResultSMI;						// SMI 구조체
} LVCSR_RECOG_RESULT;

typedef struct _LVCSR_RECOG_MID_RESULT
{
	long long						nResultLen;						// 중간 인식결과 길이
	char*							pResult; 						// 중간 인식결과
	int								bEngineDetectionFlag;			// Engine EPD Flag
	long long         				nCount;							// 인식결과 상세내용 구조체 개수
	LVCSR_DATA_RESULT* 				pDataResult;					// 인식결과 상세내용 구조체
} LVCSR_RECOG_MID_RESULT;

typedef struct _LVCSR_DATA_TIMEOUT
{
	long long						nStartTimeout;					// 설정된 시간 동안 음성이 입력되지 않을 경우 발생
	long long						nDurationTimeout;				// 설정된 시간을 넘겨 음성이 계속 들어올 경우 발생
} LVCSR_DATA_TIMEOUT;

typedef struct _LVCSR_DATA_MARGIN
{
	float							fEpdMargin;						// 끝점 검출 최대 시간	
} LVCSR_DATA_MARGIN;

typedef struct _LVCSR_DATA_TRANSACTION
{
	long long						nTransactionIdLen;				// TransactionId 길이
	char*							pTransactionId;					// TransactionId 정보
} LVCSR_DATA_TRANSACTION;

typedef struct _LVCSR_DATA_SERVERTIMEOUT
{
	long long						nASRTimeOut;					// 서비스 TimeOut 정보
	long long						nMGRTimeOut;					// 모니터링 TimeOut 정보
} LVCSR_DATA_SERVERTIMEOUT;

typedef struct _LVCSR_DATA_AUTHENTICATION
{
	long long						nAuthenticationLen;				// 인증정보 길이
	char*							pAuthentication;				// 인증정보
} LVCSR_DATA_AUTHENTICATION;

typedef struct _LVCSR_DATA_READTIMEOUT
{
	long long						nReadTimeOut;					// ReadTimeOut 정보
} LVCSR_DATA_READTIMEOUT;

typedef struct _LVCSR_DATA_INFO
{
	long long						nModelId;						// 모델 ID
	long long						nKwdId;							// KWD모델 ID
	LVCSR_TYPE_CODEC				nCodecType;						// CODEC 타입
	LVCSR_SET_CHARSET				nCharSet;						// 캐릭터 셋
	LVCSR_USED_EPD					bEpdUsed;						// EPD 사용여부
	LVCSR_USED_SCORE				bScoreUsed;						// SCORE 사용 여부
} LVCSR_DATA_INFO;

typedef struct _LVCSR_DATA_RESOURCE
{
	double							dNetworkUsage;					// Network 사용량
	int								nCPUUsage;						// CPU 사용율
	int								nGPUUsage;						// GPU 사용율
	int								nMemUsage;						// MEM 사용율
	int								nDiskUsage;						// DISK 사용율
} LVCSR_DATA_RESOURCE;

typedef struct _LVCSR_CHANNEL_LIST
{
	long long						nChannelID;						// 채널 ID
	LVCSR_TYPE_CHANNEL				nChannelStat;					// 채널 상태
} LVCSR_CHANNEL_LIST;

typedef struct _LVCSR_DATA_CHANNEL
{
	long long						nChannelCnt;					// 전체 채널 수
	long long						nUsedCnt;						// 사용 채널 수
	LVCSR_CHANNEL_LIST*				pChannelInfo;					// 채널 상태 정보
} LVCSR_DATA_CHANNEL;

typedef struct _LVCSR_KWD_LIST
{
	long long						nKwdID; 						// KWD모델 ID
	long long						nKwdNameLen; 					// KWD모델 이름 길이
	char* 							pKwdName; 						// KWD모델 이름
} LVCSR_KWD_LIST;

typedef struct _LVCSR_MODEL_LIST
{
	long long						nModelID;						// 인식모델 ID
	long long						nModelNameLen; 					// 인식모델 이름 길이
	char* 							pModelName; 					// 인식모델 이름
	long long						nModelType;						// 인식모델 타입(지원 기능)
	long long						nSamplingRate;					// 인식모델 SampleRate
	float							fAcousticScale;					// 음향가중치 정보
	long long						nKwdCnt;						// KWD 모델 개수
	LVCSR_KWD_LIST*					pKwdInfo;						// KWD 모델 정보
} LVCSR_MODEL_LIST;

typedef struct _LVCSR_DATA_MODEL
{
	long long						nModelCnt;						// 모델 수
	LVCSR_MODEL_LIST*				pModelInfo;						// 모델 정보
} LVCSR_DATA_MODEL;

typedef struct _LVCSR_DATA_DATETERM
{
	long long						nStartDate;						// 시작일자
	long long						nEndDate;						// 종료일자
} LVCSR_DATA_DATETERM;

typedef struct _LVCSR_STATDATE_LIST
{
	long long						nStatTime;						// 기록 시각
	unsigned int					nTotalSuccess;					// 총 성공 건수
	unsigned int					nTotalFail;						// 총 실패 건수
	unsigned int					nMaxClientFail;					// 총 실패 건수(max client error)
	unsigned int					nEtcFail;						// 총 실패 건수(max client error를 제외한 에러)
	unsigned long					nTotalBytes;					// 총 음성 크기 (Bytes) 
	float							fTotalElapsedTime;				// 총 인식결과 소요시간
	float							fMaxElapsedTime;				// 최대 인식결과 소요 시간
	unsigned int					nMaxElapsedBytes;				// 최대 인식결과 소요 시간 당시 음성 크기 (Bytes)
	unsigned int					nMaxBytesSize;					// 최대 음성 크기 (Bytes)
	float							fMaxBytesElapsed;				// 최대 음성 크기 당시 인식결과 소요 시간
} LVCSR_STATDATE_LIST;

typedef struct _LVCSR_DATA_STATDATE
{
	long long						nStatDateCnt;					// 통계 수
	LVCSR_STATDATE_LIST*			pStatDateInfo;					// 통계 정보
} LVCSR_DATA_STATDATE;

typedef struct _LVCSR_DATA_KWD_RESULT
{
	char 							szToken[MAX_NAME_SIZE];			// 단어 인식결과
	char 							szSymbol[MAX_NAME_SIZE];		// 심볼 인식결과
} LVCSR_DATA_KWD_RESULT;

typedef struct _LVCSR_DATA_WORD
{
	long long						nModelId;						// 인식모델 ID
	long long						nKWDNameLen;					// KWD모델 이름 길이
	char* 							pKWDName;						// KWD모델 이름
	long long						nKWDResultCnt;					// KWD 구조체 개수
	LVCSR_DATA_KWD_RESULT*			pKWDResult;						// KWD 구조체
} LVCSR_DATA_WORD;

typedef struct _LVCSR_DATA_WORD_KWD
{
	long long						nModelId;						// 인식모델 ID
	long long						nKWDNameLen;					// KWD모델 이름 길이
	char* 							pKWDName;						// KWD모델 이름
} LVCSR_DATA_WORD_KWD;

typedef struct _LVCSR_DATA_LSTM
{
	long long						nRefLen; 						// 정답 결과 길이
	char* 							pRefStr; 						// 정답 결과
	long long						nHypLen; 						// 인식 결과 길이
	char* 							pHypStr; 						// 인식 결과
	LVCSR_SET_CHARSET				nCharSet;						// 캐릭터 셋
	LVCSR_USED_WORD					bWordUsed;						// 단어 인식률 사용 여부
} LVCSR_DATA_LSTM;

typedef struct _LVCSR_LSTM_SUMMARY
{
	long long						nTotal;							// 전체 개수	
	long long						nInsert;    					// 삽입 개수
	long long						nDelete;    					// 삭제 개수
	long long						nSubstitute;    				// 대치 개수
	long long						nMatch;							// 일치 개수
	double							dErrorRate;						// 오류률
	double							dRecgRate;						// 인식률
	long long						nDistance;						// 오류 개수
} LVCSR_LSTM_SUMMARY;

typedef struct _LVCSR_DATA_ALIGN
{
	char							pTokenStr;    					// Align 결과
} LVCSR_DATA_ALIGN;

typedef struct _LVCSR_DATA_VECTOR
{
	long long						nTokenLen;						// 단어 결과 길이
	char*							pTokenStr;						// 단어 결과
} LVCSR_DATA_VECTOR;

typedef struct _LVCSR_LSTM_MATCH
{
	long long						pMatchCnt;						// 구조체 개수
	long long						nAlignLen;						// Align 문자열길이
	char*							pAlignStr;						// Align 문자열
	LVCSR_DATA_ALIGN*				pDataAlign;						// Align 구조체
	long long						nRefLen;						// Ref 문자열 길이
	char*							pRefStr;						// Ref 문자열	
	LVCSR_DATA_VECTOR*				pRefResult;						// Ref 구조체
	long long						nHypLen;						// Hyp 문자열 길이
	char*							pHypStr;						// Hyp 문자열	
	LVCSR_DATA_VECTOR*				pHypResult;						// Hyp 구조체
} LVCSR_LSTM_MATCH;

typedef struct _LVCSR_LSTM_RESULT
{
	LVCSR_LSTM_SUMMARY				pLstmSummary;					// Levenshtein 요약 정보	
	LVCSR_LSTM_MATCH				pLstmMatch;						// Levenshtein 정렬 정보
} LVCSR_LSTM_RESULT;

typedef struct _CASR_HEAD_PACK
{
	char							CHID[6];
	char							RVD1;
	char							TYPE;
	char							RVD2;
	char							LENG[10];
	char							RVD3;
} CASR_HEAD_PACK;

typedef struct _CRES_HEAD_PACK
{
	char							CHID[6];						//socket
	char							RVD1;							//공백
	char							TYPE;							//S
	char							RVD2;							//공백
	char							KIND;							//종류
	char							RVD3;							//공백
	char							USED[2];						//성공여부
	char							RVD4;							//공백
	char							LENG[10];						//문자
	char							RVD5;
} CRES_HEAD_PACK;

typedef struct ssl_st SSL;
typedef struct ssl_ctx_st SSL_CTX;

typedef struct _LVCSR_SOCK_TIMEOUT
{
	long long						nConnTIMEOUT;					// Connection TimeOut(Sec)
	long long						nReadTIMEOUT;					// Read TimeOut(Sec)	
} LVCSR_SOCK_TIMEOUT;

typedef struct _LVCSR_SOCK_HEAD
{
	long							uSock;      					// 소켓 ID                   
	SSL*							pSSL;	    					// SSL 정보          // SSL 미사용시 NULL값
	SSL_CTX*						pContext;   					// SSL Context 정보  // SSL 미사용시 NULL값
	LVCSR_USED_SSL					nFlag;      					// SSL 사용 유무     
	LVCSR_USED_CRT_CHECK			nCheck;     					// 인증서 체크 유무
	LVCSR_SOCK_TIMEOUT				pTimeOut;						// 소켓 타임아웃
	long							nError;	    					// SSL 에러 정보     // SSL 미사용시 0값
} LVCSR_SOCK_HEAD;

#ifdef __cplusplus
extern "C" {
#endif

	LVCSR_RESULT LVCSR_LIBRARY_API ASR_VERSION();
	LVCSR_RESULT LVCSR_LIBRARY_API ASR_SVC_SSL(char* pCRT, char* pKEY, char* pCA, char* pPASS, LVCSR_SOCK_HEAD* pHEAD);

	LVCSR_RESULT LVCSR_LIBRARY_API ASR_SVC_OPEN(char* cHOST, long nPORT, long nConnTIMEOUT, long nReadTIMEOUT, LVCSR_SOCK_HEAD* pHEAD);
	LVCSR_RESULT LVCSR_LIBRARY_API ASR_SVC_CLOS(LVCSR_SOCK_HEAD* pHEAD);

	LVCSR_RESULT LVCSR_LIBRARY_API ASR_SVC_RECG_OPEN(LVCSR_SOCK_HEAD* pHEAD);
	LVCSR_RESULT LVCSR_LIBRARY_API ASR_SVC_RECG_CLOS(LVCSR_SOCK_HEAD* pHEAD);

	LVCSR_RESULT LVCSR_LIBRARY_API ASR_SVC_RECG_DATA(LVCSR_SOCK_HEAD* pHEAD, char* cBUFF, long nLENG, long bEND, LVCSR_EPD_INFO* pEpdInfo);
	LVCSR_RESULT LVCSR_LIBRARY_API ASR_SVC_RECG_PROC(LVCSR_SOCK_HEAD* pHEAD, LVCSR_RECOG_RESULT* pRecgResult);
	LVCSR_RESULT LVCSR_LIBRARY_API ASR_SVC_RECG_STR_PROC(LVCSR_SOCK_HEAD* pHEAD, LVCSR_RECOG_RESULT* pRecgResult);
	LVCSR_RESULT LVCSR_LIBRARY_API ASR_SVC_RECG_WORD_PROC(LVCSR_SOCK_HEAD* pHEAD, LVCSR_RECOG_RESULT* pRecgResult);
	LVCSR_RESULT LVCSR_LIBRARY_API ASR_SVC_RECG_SENT_PROC(LVCSR_SOCK_HEAD* pHEAD, LVCSR_RECOG_RESULT* pRecgResult);
	LVCSR_RESULT LVCSR_LIBRARY_API ASR_SVC_RECG_ADDR_PROC(LVCSR_SOCK_HEAD* pHEAD, LVCSR_RECOG_RESULT* pRecgResult);
	LVCSR_RESULT LVCSR_LIBRARY_API ASR_SVC_RECG_KWD_PROC(LVCSR_SOCK_HEAD* pHEAD, LVCSR_RECOG_RESULT* pRecgResult);
	LVCSR_RESULT LVCSR_LIBRARY_API ASR_SVC_RECG_SMI_PROC(LVCSR_SOCK_HEAD* pHEAD, LVCSR_RECOG_RESULT* pRecgResult);

	LVCSR_RESULT LVCSR_LIBRARY_API ASR_SVC_RECG_ADD_INFO(LVCSR_SOCK_HEAD* pHEAD, LVCSR_DATA_CHAR_TIME* pCharTime, LVCSR_RECOG_ADD_INFO* pRecgAddInfo);
	LVCSR_RESULT LVCSR_LIBRARY_API ASR_SVC_RECG_ADD_INFO_FREE(LVCSR_DATA_CHAR_TIME* pCharTime, LVCSR_RECOG_ADD_INFO* pRecgAddInfo);

	LVCSR_RESULT LVCSR_LIBRARY_API ASR_SVC_RECG_SET_PHONICS_PROC(LVCSR_SOCK_HEAD* pHEAD, LVCSR_DATA_PHONICS* pDataPhonics, LVCSR_RECOG_MID_RESULT* pRecgMidResult);
	LVCSR_RESULT LVCSR_LIBRARY_API ASR_SVC_RECG_SET_PHONICS_PROC_FREE(LVCSR_DATA_PHONICS* pDataPhonics, LVCSR_RECOG_MID_RESULT* pRecgMidResult);

	LVCSR_RESULT LVCSR_LIBRARY_API ASR_SVC_RECG_NBEST_PROC(LVCSR_SOCK_HEAD* pHEAD, LVCSR_RECOG_NBEST_RESULT* pRecgNbestResult);
	LVCSR_RESULT LVCSR_LIBRARY_API ASR_SVC_RECG_PHONICS_PROC(LVCSR_SOCK_HEAD* pHEAD, LVCSR_RECOG_PHONICS_RESULT* pRecgPhonicsResult);

	LVCSR_RESULT LVCSR_LIBRARY_API ASR_SVC_RECG_LIST_VIEW(LVCSR_SOCK_HEAD* pHEAD, LVCSR_DATA_MODEL* pDataModel);
	LVCSR_RESULT LVCSR_LIBRARY_API ASR_SVC_RECG_MID_PROC(LVCSR_SOCK_HEAD* pHEAD, LVCSR_RECOG_MID_RESULT* pRecgMidResult);
	
	LVCSR_RESULT LVCSR_LIBRARY_API ASR_SVC_RECG_MID_PHONICS_PROC(LVCSR_SOCK_HEAD* pHEAD, LVCSR_RECOG_MID_RESULT* pRecgMidResult);
	LVCSR_RESULT LVCSR_LIBRARY_API ASR_SVC_RECG_DET_PHONICS_PROC(LVCSR_SOCK_HEAD* pHEAD, LVCSR_RECOG_PHONICS_RESULT* pRecgPhonicsResult);

	LVCSR_RESULT LVCSR_LIBRARY_API ASR_SVC_SET_AUTH(LVCSR_SOCK_HEAD* pHEAD, LVCSR_DATA_AUTHENTICATION* pDataAuthentication);
	LVCSR_RESULT LVCSR_LIBRARY_API ASR_SVC_SET_READTIME(LVCSR_SOCK_HEAD* pHEAD, LVCSR_DATA_READTIMEOUT* pDataReadtimeout);
	LVCSR_RESULT LVCSR_LIBRARY_API ASR_SVC_SET_TRANS(LVCSR_SOCK_HEAD* pHEAD, LVCSR_DATA_TRANSACTION* pDataTransaction);
	LVCSR_RESULT LVCSR_LIBRARY_API ASR_SVC_RECG_SET_LIST(LVCSR_SOCK_HEAD* pHEAD, LVCSR_DATA_INFO* pDataInfo);
	LVCSR_RESULT LVCSR_LIBRARY_API ASR_SVC_RECG_SET_EPD_TIMEOUT(LVCSR_SOCK_HEAD* pHEAD, LVCSR_DATA_TIMEOUT* pDataTimeOut);
	LVCSR_RESULT LVCSR_LIBRARY_API ASR_SVC_RECG_SET_EPD_MARGIN(LVCSR_SOCK_HEAD* pHEAD, LVCSR_DATA_MARGIN* pDataMargin);

	LVCSR_RESULT LVCSR_LIBRARY_API ASR_SVC_RECG_SET_PHONICS(LVCSR_SOCK_HEAD* pHEAD, LVCSR_DATA_PHONICS* pDataPhonics);

	LVCSR_RESULT LVCSR_LIBRARY_API ASR_SVC_RESOURCE(LVCSR_SOCK_HEAD* pHEAD, LVCSR_DATA_RESOURCE* pDataResource);
	LVCSR_RESULT LVCSR_LIBRARY_API ASR_SVC_CHANNEL(LVCSR_SOCK_HEAD* pHEAD, LVCSR_DATA_CHANNEL* pDataChannel);
	LVCSR_RESULT LVCSR_LIBRARY_API ASR_SVC_MODEL(LVCSR_SOCK_HEAD* pHEAD, LVCSR_DATA_MODEL* pDataModel);
	LVCSR_RESULT LVCSR_LIBRARY_API ASR_SVC_TIMEOUT(LVCSR_SOCK_HEAD* pHEAD, LVCSR_DATA_SERVERTIMEOUT* pDataServertimeout);
	LVCSR_RESULT LVCSR_LIBRARY_API ASR_SVC_STAT(LVCSR_SOCK_HEAD* pHEAD, LVCSR_DATA_DATETERM* pDataTerm, LVCSR_DATA_STATDATE* pDataStatDate);

	LVCSR_RESULT LVCSR_LIBRARY_API ASR_SVC_CREATE_WORD(LVCSR_SOCK_HEAD* pHEAD, LVCSR_DATA_WORD* pDataWord);
	LVCSR_RESULT LVCSR_LIBRARY_API ASR_SVC_DELETE_WORD(LVCSR_SOCK_HEAD* pHEAD, LVCSR_DATA_WORD_KWD* pDataWordKwd);

	LVCSR_RESULT LVCSR_LIBRARY_API ASR_SVC_CHANNEL_FREE(LVCSR_DATA_CHANNEL* pDataChannel);
	LVCSR_RESULT LVCSR_LIBRARY_API ASR_SVC_MODEL_FREE(LVCSR_DATA_MODEL* pDataModel);
	LVCSR_RESULT LVCSR_LIBRARY_API ASR_SVC_STAT_FREE(LVCSR_DATA_DATETERM* pDataTerm, LVCSR_DATA_STATDATE* pDataStatDate);
	LVCSR_RESULT LVCSR_LIBRARY_API ASR_SVC_RECG_LIST_VIEW_FREE(LVCSR_DATA_MODEL* pDataModel);
	LVCSR_RESULT LVCSR_LIBRARY_API ASR_SVC_RECG_MID_PROC_FREE(LVCSR_RECOG_MID_RESULT* pRecgMidResult);
	LVCSR_RESULT LVCSR_LIBRARY_API ASR_SVC_RECG_PROC_FREE(LVCSR_RECOG_RESULT* pRecgResult);	
	LVCSR_RESULT LVCSR_LIBRARY_API ASR_SVC_RECG_NBEST_PROC_FREE(LVCSR_RECOG_NBEST_RESULT* pRecgNbestResult);
	LVCSR_RESULT LVCSR_LIBRARY_API ASR_SVC_RECG_PHONICS_PROC_FREE(LVCSR_RECOG_PHONICS_RESULT* pRecgPhonicsResult);

	LVCSR_RESULT LVCSR_LIBRARY_API ASR_SVC_LSTM(LVCSR_DATA_LSTM* pDataLstm, LVCSR_LSTM_RESULT* pDataLstmResult);
	LVCSR_RESULT LVCSR_LIBRARY_API ASR_SVC_LSTM_FREE(LVCSR_DATA_LSTM* pDataLstm, LVCSR_LSTM_RESULT* pDataLstmResult);

#ifdef __cplusplus
};
#endif

#endif
