#include "precomp.h"
|
#ifdef __cplusplus
|
|
|
|
// void __attribute__ ((visibility ("default"))) fun();
|
extern "C" {
|
#endif
|
|
|
// APIs for qmasr
|
_RAPIDASRAPI RPASR_HANDLE RapidAsrInit(const char* szModelDir, int nThreadNum)
|
{
|
|
#ifdef NDEBUG
|
QMLIC_BOOL bMatched = QmLicCheckValid(QLFM_ASR);
|
if (!bMatched) {
|
return nullptr;
|
}
|
#endif
|
|
Model* mm = create_model(szModelDir, nThreadNum);
|
|
return mm;
|
}
|
|
|
_RAPIDASRAPI RPASR_RESULT RapidAsrRecogBuffer(RPASR_HANDLE handle, const char* szBuf, int nLen, RPASR_MODE Mode, QM_CALLBACK fnCallback)
|
{
|
|
|
Model* pRecogObj = (Model*)handle;
|
|
if (!pRecogObj)
|
return nullptr;
|
|
Audio audio(1);
|
audio.loadwav(szBuf,nLen);
|
audio.split();
|
|
float* buff;
|
int len;
|
int flag=0;
|
RPASR_RECOG_RESULT* pResult = new RPASR_RECOG_RESULT;
|
int nStep = 0;
|
int nTotal = audio.get_queue_size();
|
while (audio.fetch(buff, len, flag) > 0) {
|
pRecogObj->reset();
|
string msg = pRecogObj->forward(buff, len, flag);
|
pResult->msg += msg;
|
nStep++;
|
if (fnCallback)
|
fnCallback(nStep, nTotal);
|
}
|
|
|
return pResult;
|
}
|
|
_RAPIDASRAPI RPASR_RESULT RapidAsrRecogPCMBuffer(RPASR_HANDLE handle, const char* szBuf, int nLen, RPASR_MODE Mode, QM_CALLBACK fnCallback)
|
{
|
|
Model* pRecogObj = (Model*)handle;
|
|
if (!pRecogObj)
|
return nullptr;
|
|
Audio audio(1);
|
audio.loadpcmwav(szBuf, nLen);
|
audio.split();
|
|
float* buff;
|
int len;
|
int flag = 0;
|
RPASR_RECOG_RESULT* pResult = new RPASR_RECOG_RESULT;
|
int nStep = 0;
|
int nTotal = audio.get_queue_size();
|
while (audio.fetch(buff, len, flag) > 0) {
|
pRecogObj->reset();
|
string msg = pRecogObj->forward(buff, len, flag);
|
pResult->msg += msg;
|
nStep++;
|
if (fnCallback)
|
fnCallback(nStep, nTotal);
|
}
|
|
|
return pResult;
|
|
}
|
|
_RAPIDASRAPI RPASR_RESULT RapidAsrRecogPCMFile(RPASR_HANDLE handle, const char* szFileName, RPASR_MODE Mode, QM_CALLBACK fnCallback)
|
{
|
|
Model* pRecogObj = (Model*)handle;
|
|
if (!pRecogObj)
|
return nullptr;
|
|
Audio audio(1);
|
audio.loadpcmwav(szFileName);
|
audio.split();
|
|
float* buff;
|
int len;
|
int flag = 0;
|
RPASR_RECOG_RESULT* pResult = new RPASR_RECOG_RESULT;
|
int nStep = 0;
|
int nTotal = audio.get_queue_size();
|
while (audio.fetch(buff, len, flag) > 0) {
|
pRecogObj->reset();
|
string msg = pRecogObj->forward(buff, len, flag);
|
pResult->msg += msg;
|
nStep++;
|
if (fnCallback)
|
fnCallback(nStep, nTotal);
|
}
|
|
|
return pResult;
|
|
}
|
|
_RAPIDASRAPI RPASR_RESULT RapidAsrRecogFile(RPASR_HANDLE handle, const char* szWavfile, RPASR_MODE Mode, QM_CALLBACK fnCallback)
|
{
|
Model* pRecogObj = (Model*)handle;
|
|
if (!pRecogObj)
|
return nullptr;
|
|
Audio audio(1);
|
if(!audio.loadwav(szWavfile))
|
return nullptr;
|
audio.split();
|
|
float* buff;
|
int len;
|
int flag = 0;
|
int nStep = 0;
|
int nTotal = audio.get_queue_size();
|
RPASR_RECOG_RESULT* pResult = new RPASR_RECOG_RESULT;
|
while (audio.fetch(buff, len, flag) > 0) {
|
pRecogObj->reset();
|
string msg = pRecogObj->forward(buff, len, flag);
|
pResult->msg+= msg;
|
nStep++;
|
if (fnCallback)
|
fnCallback(nStep, nTotal);
|
}
|
|
|
|
|
return pResult;
|
}
|
|
_RAPIDASRAPI const int RapidAsrGetRetNumber(RPASR_RESULT Result)
|
{
|
if (!Result)
|
return 0;
|
|
return 1;
|
|
}
|
_RAPIDASRAPI const char* RapidAsrGetResult(RPASR_RESULT Result,int nIndex)
|
{
|
RPASR_RECOG_RESULT * pResult = (RPASR_RECOG_RESULT*)Result;
|
if(!pResult)
|
return nullptr;
|
|
return pResult->msg.c_str();
|
|
}
|
|
_RAPIDASRAPI void RapidAsrFreeResult(RPASR_RESULT Result)
|
{
|
|
if (Result)
|
{
|
delete (RPASR_RECOG_RESULT*)Result;
|
|
}
|
}
|
|
_RAPIDASRAPI void RapidAsrUninit(RPASR_HANDLE handle)
|
{
|
|
Model* pRecogObj = (Model*)handle;
|
|
|
if (!pRecogObj)
|
return;
|
|
delete pRecogObj;
|
|
}
|
|
|
|
#ifdef __cplusplus
|
|
}
|
#endif
|