#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;						// ij���� ��
	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;						// ij���� ��
	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