diff --git a/funasr/runtime/onnxruntime/include/libfunasrapi.h b/funasr/runtime/onnxruntime/include/libfunasrapi.h new file mode 100644 index 000000000..6e81fa995 --- /dev/null +++ b/funasr/runtime/onnxruntime/include/libfunasrapi.h @@ -0,0 +1,77 @@ +#pragma once + +#ifdef WIN32 +#ifdef _FUNASR_API_EXPORT +#define _FUNASRAPI __declspec(dllexport) +#else +#define _FUNASRAPI __declspec(dllimport) +#endif +#else +#define _FUNASRAPI +#endif + +#ifndef _WIN32 +#define FUNASR_CALLBCK_PREFIX __attribute__((__stdcall__)) +#else +#define FUNASR_CALLBCK_PREFIX __stdcall +#endif + +#ifdef __cplusplus + +extern "C" { +#endif + +typedef void* FUNASR_HANDLE; +typedef void* FUNASR_RESULT; +typedef unsigned char FUNASR_BOOL; + +#define FUNASR_TRUE 1 +#define FUNASR_FALSE 0 +#define QM_DEFAULT_THREAD_NUM 4 + +typedef enum +{ + RASR_NONE=-1, + RASRM_CTC_GREEDY_SEARCH=0, + RASRM_CTC_RPEFIX_BEAM_SEARCH = 1, + RASRM_ATTENSION_RESCORING = 2, + +}FUNASR_MODE; + +typedef enum { + FUNASR_MODEL_PADDLE = 0, + FUNASR_MODEL_PADDLE_2 = 1, + FUNASR_MODEL_K2 = 2, + FUNASR_MODEL_PARAFORMER = 3, + +}FUNASR_MODEL_TYPE; + +typedef void (* QM_CALLBACK)(int nCurStep, int nTotal); // nTotal: total steps; nCurStep: Current Step. + +// APIs for qmasr +_FUNASRAPI FUNASR_HANDLE FunASRInit(const char* szModelDir, int nThread, bool quantize); + + +// if not give a fnCallback ,it should be NULL +_FUNASRAPI FUNASR_RESULT FunASRRecogBuffer(FUNASR_HANDLE handle, const char* szBuf, int nLen, FUNASR_MODE Mode, QM_CALLBACK fnCallback); + +_FUNASRAPI FUNASR_RESULT FunASRRecogPCMBuffer(FUNASR_HANDLE handle, const char* szBuf, int nLen, FUNASR_MODE Mode, QM_CALLBACK fnCallback); + +_FUNASRAPI FUNASR_RESULT FunASRRecogPCMFile(FUNASR_HANDLE handle, const char* szFileName, FUNASR_MODE Mode, QM_CALLBACK fnCallback); + +_FUNASRAPI FUNASR_RESULT FunASRRecogFile(FUNASR_HANDLE handle, const char* szWavfile, FUNASR_MODE Mode, QM_CALLBACK fnCallback); + +_FUNASRAPI const char* FunASRGetResult(FUNASR_RESULT Result,int nIndex); + +_FUNASRAPI const int FunASRGetRetNumber(FUNASR_RESULT Result); + +_FUNASRAPI void FunASRFreeResult(FUNASR_RESULT Result); + +_FUNASRAPI void FunASRUninit(FUNASR_HANDLE Handle); + +_FUNASRAPI const float FunASRGetRetSnippetTime(FUNASR_RESULT Result); + +#ifdef __cplusplus + +} +#endif diff --git a/funasr/runtime/onnxruntime/src/libfunasrapi.cpp b/funasr/runtime/onnxruntime/src/libfunasrapi.cpp new file mode 100644 index 000000000..0d77d20d7 --- /dev/null +++ b/funasr/runtime/onnxruntime/src/libfunasrapi.cpp @@ -0,0 +1,182 @@ +#include "precomp.h" +#ifdef __cplusplus + +extern "C" { +#endif + + // APIs for qmasr + _FUNASRAPI FUNASR_HANDLE FunASRInit(const char* szModelDir, int nThreadNum, bool quantize) + { + Model* mm = create_model(szModelDir, nThreadNum, quantize); + return mm; + } + + _FUNASRAPI FUNASR_RESULT FunASRRecogBuffer(FUNASR_HANDLE handle, const char* szBuf, int nLen, FUNASR_MODE Mode, QM_CALLBACK fnCallback) + { + Model* pRecogObj = (Model*)handle; + if (!pRecogObj) + return nullptr; + + Audio audio(1); + if (!audio.loadwav(szBuf, nLen)) + return nullptr; + //audio.split(); + + float* buff; + int len; + int flag=0; + FUNASR_RECOG_RESULT* pResult = new FUNASR_RECOG_RESULT; + pResult->snippet_time = audio.get_time_len(); + 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; + } + + _FUNASRAPI FUNASR_RESULT FunASRRecogPCMBuffer(FUNASR_HANDLE handle, const char* szBuf, int nLen, FUNASR_MODE Mode, QM_CALLBACK fnCallback) + { + Model* pRecogObj = (Model*)handle; + if (!pRecogObj) + return nullptr; + + Audio audio(1); + if (!audio.loadpcmwav(szBuf, nLen)) + return nullptr; + //audio.split(); + + float* buff; + int len; + int flag = 0; + FUNASR_RECOG_RESULT* pResult = new FUNASR_RECOG_RESULT; + pResult->snippet_time = audio.get_time_len(); + 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; + } + + _FUNASRAPI FUNASR_RESULT FunASRRecogPCMFile(FUNASR_HANDLE handle, const char* szFileName, FUNASR_MODE Mode, QM_CALLBACK fnCallback) + { + Model* pRecogObj = (Model*)handle; + if (!pRecogObj) + return nullptr; + + Audio audio(1); + if (!audio.loadpcmwav(szFileName)) + return nullptr; + //audio.split(); + + float* buff; + int len; + int flag = 0; + FUNASR_RECOG_RESULT* pResult = new FUNASR_RECOG_RESULT; + pResult->snippet_time = audio.get_time_len(); + 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; + } + + _FUNASRAPI FUNASR_RESULT FunASRRecogFile(FUNASR_HANDLE handle, const char* szWavfile, FUNASR_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(); + FUNASR_RECOG_RESULT* pResult = new FUNASR_RECOG_RESULT; + pResult->snippet_time = audio.get_time_len(); + 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; + } + + _FUNASRAPI const int FunASRGetRetNumber(FUNASR_RESULT Result) + { + if (!Result) + return 0; + + return 1; + } + + + _FUNASRAPI const float FunASRGetRetSnippetTime(FUNASR_RESULT Result) + { + if (!Result) + return 0.0f; + + return ((FUNASR_RECOG_RESULT*)Result)->snippet_time; + } + + _FUNASRAPI const char* FunASRGetResult(FUNASR_RESULT Result,int nIndex) + { + FUNASR_RECOG_RESULT * pResult = (FUNASR_RECOG_RESULT*)Result; + if(!pResult) + return nullptr; + + return pResult->msg.c_str(); + } + + _FUNASRAPI void FunASRFreeResult(FUNASR_RESULT Result) + { + if (Result) + { + delete (FUNASR_RECOG_RESULT*)Result; + } + } + + _FUNASRAPI void FunASRUninit(FUNASR_HANDLE handle) + { + Model* pRecogObj = (Model*)handle; + + if (!pRecogObj) + return; + + delete pRecogObj; + } + +#ifdef __cplusplus + +} +#endif + diff --git a/funasr/runtime/onnxruntime/tester/tester_rtf.cpp b/funasr/runtime/onnxruntime/tester/tester_rtf.cpp index ca17e50c2..dd79887f3 100644 --- a/funasr/runtime/onnxruntime/tester/tester_rtf.cpp +++ b/funasr/runtime/onnxruntime/tester/tester_rtf.cpp @@ -80,7 +80,7 @@ int main(int argc, char *argv[]) if(Result){ string msg = FunASRGetResult(Result, 0); - printf("Result: %s \n", msg); + printf("Result: %s \n", msg.c_str()); snippet_time = FunASRGetRetSnippetTime(Result); total_length += snippet_time;