From 39529df088e74988257dd4dac9adc818080cb49f Mon Sep 17 00:00:00 2001
From: mayong <mayong@qianxin.com>
Date: 星期二, 07 三月 2023 12:15:07 +0800
Subject: [PATCH] update files.

---
 funasr/runtime/onnxruntime/src/CMakeLists.txt       |    2 
 funasr/runtime/onnxruntime/src/librapidasrapi.cpp   |  204 ++++++++++++++++++
 funasr/runtime/onnxruntime/tester/CMakeLists.txt    |    2 
 funasr/runtime/onnxruntime/CMakeSettings.json       |   22 +
 funasr/runtime/onnxruntime/include/librapidasrapi.h |   95 ++++++++
 funasr/runtime/onnxruntime/src/Audio.cpp            |  211 +++++++++++++++++-
 funasr/runtime/onnxruntime/src/precomp.h            |    3 
 funasr/runtime/onnxruntime/tester/tester.cpp        |   50 ++--
 funasr/runtime/onnxruntime/src/commonfunc.h         |   11 +
 funasr/runtime/onnxruntime/include/Audio.h          |    7 
 10 files changed, 554 insertions(+), 53 deletions(-)

diff --git a/funasr/runtime/onnxruntime/CMakeSettings.json b/funasr/runtime/onnxruntime/CMakeSettings.json
index f515d1f..2eb6c5a 100644
--- a/funasr/runtime/onnxruntime/CMakeSettings.json
+++ b/funasr/runtime/onnxruntime/CMakeSettings.json
@@ -19,8 +19,26 @@
       "cmakeCommandArgs": "",
       "buildCommandArgs": "",
       "ctestCommandArgs": "",
-      "inheritEnvironments": [ "msvc_x64_x64" ],
-      "variables": []
+      "inheritEnvironments": [ "msvc_x64_x64" ]
+    },
+    {
+      "name": "Linux-GCC-Debug",
+      "generator": "Unix Makefiles",
+      "configurationType": "Debug",
+      "cmakeExecutable": "cmake",
+      "remoteCopySourcesExclusionList": [ ".vs", ".git", "out" ],
+      "cmakeCommandArgs": "-DONNXRUNTIME_DIR=/data/linux/thirdpart/onnxruntime-linux-x64-1.14.1",
+      "buildCommandArgs": "",
+      "ctestCommandArgs": "",
+      "inheritEnvironments": [ "linux_x64" ],
+      "remoteMachineName": "${defaultRemoteMachineName}",
+      "remoteCMakeListsRoot": "$HOME/.vs/${projectDirName}/${workspaceHash}/src",
+      "remoteBuildRoot": "$HOME/.vs/${projectDirName}/${workspaceHash}/out/build/${name}",
+      "remoteInstallRoot": "$HOME/.vs/${projectDirName}/${workspaceHash}/out/install/${name}",
+      "remoteCopySources": true,
+      "rsyncCommandArgs": "-t --delete",
+      "remoteCopyBuildOutput": false,
+      "remoteCopySourcesMethod": "rsync"
     }
   ]
 }
\ No newline at end of file
diff --git a/funasr/runtime/onnxruntime/include/Audio.h b/funasr/runtime/onnxruntime/include/Audio.h
index af8d2a9..8b40c4d 100644
--- a/funasr/runtime/onnxruntime/include/Audio.h
+++ b/funasr/runtime/onnxruntime/include/Audio.h
@@ -43,11 +43,16 @@
     Audio(int data_type, int size);
     ~Audio();
     void disp();
-    bool loadwav(const char *filename);
+    bool loadwav(const char* filename);
+    bool loadwav(const char* buf, int nLen);
+    bool loadpcmwav(const char* buf, int nFileLen);
+    bool loadpcmwav(const char* filename);
     int fetch_chunck(float *&dout, int len);
     int fetch(float *&dout, int &len, int &flag);
     void padding();
     void split();
+
+    int get_queue_size() { return (int)frame_queue.size(); }
 };
 
 #endif
diff --git a/funasr/runtime/onnxruntime/include/librapidasrapi.h b/funasr/runtime/onnxruntime/include/librapidasrapi.h
new file mode 100644
index 0000000..e9ab87a
--- /dev/null
+++ b/funasr/runtime/onnxruntime/include/librapidasrapi.h
@@ -0,0 +1,95 @@
+#pragma once
+
+
+#ifdef WIN32
+
+
+#ifdef _RPASR_API_EXPORT
+
+#define  _RAPIDASRAPI __declspec(dllexport)
+#else
+#define  _RAPIDASRAPI __declspec(dllimport)
+#endif
+	
+
+#else
+#define _RAPIDASRAPI  
+#endif
+
+
+
+
+
+#ifndef _WIN32
+
+#define RPASR_CALLBCK_PREFIX __attribute__((__stdcall__))
+
+#else
+#define RPASR_CALLBCK_PREFIX __stdcall
+#endif
+	
+
+#ifdef __cplusplus 
+
+extern "C" {
+#endif
+
+typedef void* RPASR_HANDLE;
+
+typedef void* RPASR_RESULT;
+
+typedef unsigned char RPASR_BOOL;
+
+#define RPASR_TRUE 1
+#define RPASR_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,
+ 
+}RPASR_MODE;
+
+typedef enum {
+
+	RPASR_MODEL_PADDLE = 0,
+	RPASR_MODEL_PADDLE_2 = 1,
+	RPASR_MODEL_K2 = 2,
+	RPASR_MODEL_PARAFORMER = 3,
+
+}RPASR_MODEL_TYPE;
+
+
+typedef void (* QM_CALLBACK)(int nCurStep, int nTotal); // nTotal: total steps; nCurStep: Current Step.
+	
+	// APIs for qmasr
+
+_RAPIDASRAPI RPASR_HANDLE  RapidAsrInit(const char* szModelDir, int nThread);
+
+
+
+// if not give a fnCallback ,it should be NULL 
+_RAPIDASRAPI RPASR_RESULT	RapidAsrRecogBuffer(RPASR_HANDLE handle, const char* szBuf, int nLen, RPASR_MODE Mode, QM_CALLBACK fnCallback);
+_RAPIDASRAPI RPASR_RESULT	RapidAsrRecogPCMBuffer(RPASR_HANDLE handle, const char* szBuf, int nLen, RPASR_MODE Mode, QM_CALLBACK fnCallback);
+
+_RAPIDASRAPI RPASR_RESULT	RapidAsrRecogPCMFile(RPASR_HANDLE handle, const char* szFileName, RPASR_MODE Mode, QM_CALLBACK fnCallback);
+
+_RAPIDASRAPI RPASR_RESULT	RapidAsrRecogFile(RPASR_HANDLE handle, const char* szWavfile, RPASR_MODE Mode, QM_CALLBACK fnCallback);
+
+_RAPIDASRAPI const char*	RapidAsrGetResult(RPASR_RESULT Result,int nIndex);
+
+_RAPIDASRAPI const int		RapidAsrGetRetNumber(RPASR_RESULT Result);
+_RAPIDASRAPI void			RapidAsrFreeResult(RPASR_RESULT Result);
+
+
+_RAPIDASRAPI void			RapidAsrUninit(RPASR_HANDLE Handle);
+
+
+#ifdef __cplusplus 
+
+}
+#endif
\ No newline at end of file
diff --git a/funasr/runtime/onnxruntime/src/Audio.cpp b/funasr/runtime/onnxruntime/src/Audio.cpp
index f515a6d..d5d0746 100644
--- a/funasr/runtime/onnxruntime/src/Audio.cpp
+++ b/funasr/runtime/onnxruntime/src/Audio.cpp
@@ -25,8 +25,7 @@
         out_idx = 1;
         sum = 0;
     };
-    ~AudioWindow()
-    {
+    ~AudioWindow(){
         free(window);
     };
     int put(int val)
@@ -102,6 +101,11 @@
 {
     if (speech_buff != NULL) {
         free(speech_buff);
+        
+    }
+
+    if (speech_data != NULL) {
+        
         free(speech_data);
     }
 }
@@ -115,9 +119,11 @@
 bool Audio::loadwav(const char *filename)
 {
 
+    if (speech_data != NULL) {
+        free(speech_data);
+    }
     if (speech_buff != NULL) {
         free(speech_buff);
-        free(speech_data);
     }
 
     offset = 0;
@@ -133,27 +139,190 @@
     speech_len = (nFileLen - 44) / 2;
     speech_align_len = (int)(ceil((float)speech_len / align_size) * align_size);
     speech_buff = (int16_t *)malloc(sizeof(int16_t) * speech_align_len);
-    memset(speech_buff, 0, sizeof(int16_t) * speech_align_len);
-    int ret = fread(speech_buff, sizeof(int16_t), speech_len, fp);
-    fclose(fp);
 
-    speech_data = (float *)malloc(sizeof(float) * speech_align_len);
-    memset(speech_data, 0, sizeof(float) * speech_align_len);
-    int i;
-    float scale = 1;
+    if (speech_buff)
+    {
+        memset(speech_buff, 0, sizeof(int16_t) * speech_align_len);
+        int ret = fread(speech_buff, sizeof(int16_t), speech_len, fp);
+        fclose(fp);
 
-    if (data_type == 1) {
-        scale = 32768;
+        speech_data = (float*)malloc(sizeof(float) * speech_align_len);
+        memset(speech_data, 0, sizeof(float) * speech_align_len);
+        int i;
+        float scale = 1;
+
+        if (data_type == 1) {
+            scale = 32768;
+        }
+
+        for (i = 0; i < speech_len; i++) {
+            speech_data[i] = (float)speech_buff[i] / scale;
+        }
+
+        AudioFrame* frame = new AudioFrame(speech_len);
+        frame_queue.push(frame);
+
+
+        return true;
     }
-
-    for (i = 0; i < speech_len; i++) {
-        speech_data[i] = (float)speech_buff[i] / scale;
-    }
-
-    AudioFrame *frame = new AudioFrame(speech_len);
-    frame_queue.push(frame);
-    return true;
+    else
+        return false;
 }
+
+
+bool Audio::loadwav(const char* buf, int nFileLen)
+{
+
+    
+
+    if (speech_data != NULL) {
+        free(speech_data);
+    }
+    if (speech_buff != NULL) {
+        free(speech_buff);
+    }
+
+    offset = 0;
+
+    size_t nOffset = 0;
+
+#define WAV_HEADER_SIZE 44
+
+    speech_len = (nFileLen - WAV_HEADER_SIZE) / 2;
+    speech_align_len = (int)(ceil((float)speech_len / align_size) * align_size);
+    speech_buff = (int16_t*)malloc(sizeof(int16_t) * speech_align_len);
+    if (speech_buff)
+    {
+        memset(speech_buff, 0, sizeof(int16_t) * speech_align_len);
+        memcpy((void*)speech_buff, (const void*)(buf + WAV_HEADER_SIZE), speech_len * sizeof(int16_t));
+
+
+        speech_data = (float*)malloc(sizeof(float) * speech_align_len);
+        memset(speech_data, 0, sizeof(float) * speech_align_len);
+        int i;
+        float scale = 1;
+
+        if (data_type == 1) {
+            scale = 32768;
+        }
+
+        for (i = 0; i < speech_len; i++) {
+            speech_data[i] = (float)speech_buff[i] / scale;
+        }
+
+
+        return true;
+    }
+    else
+        return false;
+
+}
+
+
+bool Audio::loadpcmwav(const char* buf, int nBufLen)
+{
+    if (speech_data != NULL) {
+        free(speech_data);
+    }
+    if (speech_buff != NULL) {
+        free(speech_buff);
+    }
+    offset = 0;
+
+    size_t nOffset = 0;
+
+#define WAV_HEADER_SIZE 44
+
+    speech_len = nBufLen / 2;
+    speech_align_len = (int)(ceil((float)speech_len / align_size) * align_size);
+    speech_buff = (int16_t*)malloc(sizeof(int16_t) * speech_align_len);
+    if (speech_buff)
+    {
+        memset(speech_buff, 0, sizeof(int16_t) * speech_align_len);
+        memcpy((void*)speech_buff, (const void*)buf, speech_len * sizeof(int16_t));
+
+
+        speech_data = (float*)malloc(sizeof(float) * speech_align_len);
+        memset(speech_data, 0, sizeof(float) * speech_align_len);
+
+     
+        int i;
+        float scale = 1;
+
+        if (data_type == 1) {
+            scale = 32768;
+        }
+
+        for (i = 0; i < speech_len; i++) {
+            speech_data[i] = (float)speech_buff[i] / scale;
+        }
+
+
+        return true;
+
+    }
+    else
+        return false;
+
+    
+}
+
+bool Audio::loadpcmwav(const char* filename)
+{
+
+    if (speech_data != NULL) {
+        free(speech_data);
+    }
+    if (speech_buff != NULL) {
+        free(speech_buff);
+    }
+    offset = 0;
+
+    FILE* fp;
+    fp = fopen(filename, "rb");
+    if (fp == nullptr)
+        return false;
+    fseek(fp, 0, SEEK_END);
+    uint32_t nFileLen = ftell(fp);
+    fseek(fp, 0, SEEK_SET);
+
+    speech_len = (nFileLen) / 2;
+    speech_align_len = (int)(ceil((float)speech_len / align_size) * align_size);
+    speech_buff = (int16_t*)malloc(sizeof(int16_t) * speech_align_len);
+    if (speech_buff)
+    {
+        memset(speech_buff, 0, sizeof(int16_t) * speech_align_len);
+        int ret = fread(speech_buff, sizeof(int16_t), speech_len, fp);
+        fclose(fp);
+
+        speech_data = (float*)malloc(sizeof(float) * speech_align_len);
+        memset(speech_data, 0, sizeof(float) * speech_align_len);
+
+
+
+        int i;
+        float scale = 1;
+
+        if (data_type == 1) {
+            scale = 32768;
+        }
+
+        for (i = 0; i < speech_len; i++) {
+            speech_data[i] = (float)speech_buff[i] / scale;
+        }
+
+
+        AudioFrame* frame = new AudioFrame(speech_len);
+        frame_queue.push(frame);
+
+    
+        return true;
+    }
+    else
+        return false;
+
+}
+
 
 int Audio::fetch_chunck(float *&dout, int len)
 {
@@ -163,7 +332,7 @@
     } else if (offset == speech_align_len - len) {
         dout = speech_data + offset;
         offset = speech_align_len;
-        // 涓存椂瑙e喅
+        // 涓存椂瑙e喅 
         AudioFrame *frame = frame_queue.front();
         frame_queue.pop();
         delete frame;
diff --git a/funasr/runtime/onnxruntime/src/CMakeLists.txt b/funasr/runtime/onnxruntime/src/CMakeLists.txt
index 4842072..aea222b 100644
--- a/funasr/runtime/onnxruntime/src/CMakeLists.txt
+++ b/funasr/runtime/onnxruntime/src/CMakeLists.txt
@@ -18,7 +18,7 @@
         endif()
         target_include_directories(rapidasr PUBLIC ${CMAKE_SOURCE_DIR}/win/include )
         
-
+        target_compile_definitions(rapidasr PUBLIC -D_RPASR_API_EXPORT)
 else()
 
     set(EXTRA_LIBS fftw3f webrtcvad pthread)
diff --git a/funasr/runtime/onnxruntime/src/commonfunc.h b/funasr/runtime/onnxruntime/src/commonfunc.h
index 3f3c53a..237df86 100644
--- a/funasr/runtime/onnxruntime/src/commonfunc.h
+++ b/funasr/runtime/onnxruntime/src/commonfunc.h
@@ -1,7 +1,18 @@
 #pragma once 
+
+
+typedef struct
+{
+    std::string msg;
+
+}RPASR_RECOG_RESULT;
+
+
 #ifdef _WIN32
 #include <codecvt>
 
+
+
 inline std::wstring string2wstring(const std::string& str, const std::string& locale)
 {
     typedef std::codecvt_byname<wchar_t, char, std::mbstate_t> F;
diff --git a/funasr/runtime/onnxruntime/src/librapidasrapi.cpp b/funasr/runtime/onnxruntime/src/librapidasrapi.cpp
new file mode 100644
index 0000000..4e1a457
--- /dev/null
+++ b/funasr/runtime/onnxruntime/src/librapidasrapi.cpp
@@ -0,0 +1,204 @@
+#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
+
diff --git a/funasr/runtime/onnxruntime/src/precomp.h b/funasr/runtime/onnxruntime/src/precomp.h
index ec0766d..358844b 100644
--- a/funasr/runtime/onnxruntime/src/precomp.h
+++ b/funasr/runtime/onnxruntime/src/precomp.h
@@ -41,9 +41,10 @@
 #include "FeatureExtract.h"
 #include "FeatureQueue.h"
 #include "SpeechWrap.h"
+#include <Audio.h>
 #include "Model.h"
 #include "paraformer_onnx.h"
-
+#include "librapidasrapi.h"
 
 
 using namespace paraformer;
diff --git a/funasr/runtime/onnxruntime/tester/CMakeLists.txt b/funasr/runtime/onnxruntime/tester/CMakeLists.txt
index 651b87f..d794271 100644
--- a/funasr/runtime/onnxruntime/tester/CMakeLists.txt
+++ b/funasr/runtime/onnxruntime/tester/CMakeLists.txt
@@ -15,6 +15,6 @@
 set(EXECNAME "tester")
 
 add_executable(${EXECNAME} "tester.cpp")
-target_link_libraries(${EXECNAME} PUBLIC onnxruntime ${EXTRA_LIBS})
+target_link_libraries(${EXECNAME} PUBLIC ${EXTRA_LIBS})
 
 
diff --git a/funasr/runtime/onnxruntime/tester/tester.cpp b/funasr/runtime/onnxruntime/tester/tester.cpp
index 7bfb4c0..21b783f 100644
--- a/funasr/runtime/onnxruntime/tester/tester.cpp
+++ b/funasr/runtime/onnxruntime/tester/tester.cpp
@@ -1,12 +1,13 @@
-#include <iostream>
+
 #ifndef _WIN32
 #include <sys/time.h>
 #else
 #include <win_func.h>
 #endif
 
-#include <Audio.h>
-#include <Model.h>
+#include "librapidasrapi.h"
+
+#include <iostream>
 
 using namespace std;
 
@@ -21,52 +22,49 @@
     struct timeval start, end;
     gettimeofday(&start, NULL);
     int nThreadNum = 4;
-    Model* mm = create_model(argv[1], nThreadNum);
-    if (!mm)
+    RPASR_HANDLE AsrHanlde=RapidAsrInit(argv[1], nThreadNum);
+
+    if (!AsrHanlde)
     {
         printf("Cannot load ASR Model from: %s, there must be files model.onnx and vocab.txt", argv[1]);
         exit(-1);
     }
     
-  
-    Audio audio(0);
-    if (!audio.loadwav(argv[2]))
-    {
-        printf("cannot load %s\n", argv[2]);
-        return -1;
-    }
-    audio.disp();
-  
+ 
 
     gettimeofday(&end, NULL);
     long seconds = (end.tv_sec - start.tv_sec);
     long micros = ((seconds * 1000000) + end.tv_usec) - (start.tv_usec);
     printf("Model initialization takes %lfs.\n", (double)micros / 1000000);
-    audio.split();
 
     setbuf(stdout, NULL);
     cout << "Result: \"";
     gettimeofday(&start, NULL);
-    float *buff;
-    int len;
-    int flag;
-    while (audio.fetch(buff, len, flag) > 0) {
-        mm->reset();
-        string msg = mm->forward(buff, len, flag);
-        cout << msg;
-    }
 
+    RPASR_RESULT Result=RapidAsrRecogPCMFile(AsrHanlde, argv[2], RASR_NONE, NULL);
     gettimeofday(&end, NULL);
 
-    cout << "\"." << endl;
-
+    if (Result)
+    {
+        string msg = RapidAsrGetResult(Result, 0);
+        cout << msg << endl;
+        cout << "\"." << endl;
+        RapidAsrFreeResult(Result);
+    }
+    else
+    {
+        cout <<("no return data!");
+    }
+  
     seconds = (end.tv_sec - start.tv_sec);
     long taking_micros = ((seconds * 1000000) + end.tv_usec) - (start.tv_usec);
     printf("Model inference takes %lfs.\n", (double)micros / 1000000);
 
     printf("Model inference RTF: %04lf.\n", (double)taking_micros/micros );
 
-    delete mm;
+    RapidAsrUninit(AsrHanlde);
 
     return 0;
 }
+
+    
\ No newline at end of file

--
Gitblit v1.9.1