diff --git a/.gitignore b/.gitignore
index 1ceb3af..5ffe4bd 100644
--- a/.gitignore
+++ b/.gitignore
@@ -2,6 +2,7 @@ HiveCoreR0/build/**
HiveCoreR0/install/**
HiveCoreR0/log/**
HiveCoreR0/MUJOCO_LOG.TXT
+HiveCoreR0/msc/**
HiveCoreR1/build/**
HiveCoreR1/install/**
diff --git a/.vscode/settings.json b/.vscode/settings.json
index 48f93c7..3ba90a1 100644
--- a/.vscode/settings.json
+++ b/.vscode/settings.json
@@ -78,6 +78,10 @@
"cinttypes": "cpp",
"typeindex": "cpp",
"typeinfo": "cpp",
- "variant": "cpp"
+ "variant": "cpp",
+ "formats.h": "c",
+ "linuxrec.h": "c",
+ "msp_errors.h": "c",
+ "msp_cmn.h": "c"
}
}
\ No newline at end of file
diff --git a/HiveCoreR0/src/voice_control/CMakeLists.txt b/HiveCoreR0/src/voice_control/CMakeLists.txt
new file mode 100644
index 0000000..77c0655
--- /dev/null
+++ b/HiveCoreR0/src/voice_control/CMakeLists.txt
@@ -0,0 +1,93 @@
+cmake_minimum_required(VERSION 3.16)
+project(voice_control)
+
+if(NOT CMAKE_CXX_STANDARD)
+ set(CMAKE_CXX_STANDARD 17)
+endif()
+
+if(CMAKE_COMPILER_IS_GNUCXX OR CMAKE_CXX_COMPILER_ID MATCHES "Clang")
+ add_compile_options(-Wall -Wextra -Wpedantic)
+endif()
+
+# 寻找依赖包
+find_package(ament_cmake REQUIRED)
+find_package(rclcpp REQUIRED)
+find_package(std_msgs REQUIRED)
+
+# 科大讯飞SDK路径配置 - 关键修改
+set(XUNFEI_SDK_LIB_DIRS
+ ${CMAKE_CURRENT_SOURCE_DIR}/libs
+)
+
+# 添加头文件路径
+include_directories(
+ include
+ ${CMAKE_CURRENT_SOURCE_DIR}/include
+)
+
+# 添加库文件路径
+link_directories(
+ ${XUNFEI_SDK_LIB_DIRS}
+)
+
+# 打印库路径用于调试
+message(STATUS "寻找libmsc.so的路径: ${XUNFEI_SDK_LIB_DIRS}")
+
+# 检查libmsc.so是否存在
+foreach(LIB_DIR ${XUNFEI_SDK_LIB_DIRS})
+ if(EXISTS "${LIB_DIR}/libmsc.so")
+ message(STATUS "找到libmsc.so: ${LIB_DIR}/libmsc.so")
+ endif()
+endforeach()
+
+add_executable(iat_publish
+ src/iat_publish.cpp
+ src/speech_recognizer.c
+ src/linuxrec.c
+)
+
+ament_target_dependencies(iat_publish
+ rclcpp
+ std_msgs
+)
+
+# 链接库
+target_link_libraries(iat_publish
+ -L${XUNFEI_SDK_LIB_DIRS} # 显式指定库路径
+ msc # 科大讯飞主库
+ dl pthread m rt asound
+)
+
+# 安装可执行文件
+install(TARGETS
+ iat_publish
+ DESTINATION lib/${PROJECT_NAME}
+)
+
+# 安装SDK库文件到系统能找到的地方
+install(DIRECTORY ${XUNFEI_SDK_LIB_DIRS}/
+ DESTINATION lib
+ FILES_MATCHING PATTERN "*.so*"
+)
+
+install(DIRECTORY include/
+ DESTINATION include
+)
+
+if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/config)
+ install(DIRECTORY config/
+ DESTINATION share/${PROJECT_NAME}/config
+ )
+endif()
+
+if(EXISTS ${CMAKE_CURRENT_SOURCE_DIR}/launch)
+ install(DIRECTORY launch/
+ DESTINATION share/${PROJECT_NAME}/launch
+ )
+endif()
+
+ament_export_include_directories(include)
+ament_export_dependencies(rclcpp std_msgs)
+
+ament_package()
+
\ No newline at end of file
diff --git a/HiveCoreR0/src/voice_control/LICENSE b/HiveCoreR0/src/voice_control/LICENSE
new file mode 100644
index 0000000..d645695
--- /dev/null
+++ b/HiveCoreR0/src/voice_control/LICENSE
@@ -0,0 +1,202 @@
+
+ Apache License
+ Version 2.0, January 2004
+ http://www.apache.org/licenses/
+
+ TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+ 1. Definitions.
+
+ "License" shall mean the terms and conditions for use, reproduction,
+ and distribution as defined by Sections 1 through 9 of this document.
+
+ "Licensor" shall mean the copyright owner or entity authorized by
+ the copyright owner that is granting the License.
+
+ "Legal Entity" shall mean the union of the acting entity and all
+ other entities that control, are controlled by, or are under common
+ control with that entity. For the purposes of this definition,
+ "control" means (i) the power, direct or indirect, to cause the
+ direction or management of such entity, whether by contract or
+ otherwise, or (ii) ownership of fifty percent (50%) or more of the
+ outstanding shares, or (iii) beneficial ownership of such entity.
+
+ "You" (or "Your") shall mean an individual or Legal Entity
+ exercising permissions granted by this License.
+
+ "Source" form shall mean the preferred form for making modifications,
+ including but not limited to software source code, documentation
+ source, and configuration files.
+
+ "Object" form shall mean any form resulting from mechanical
+ transformation or translation of a Source form, including but
+ not limited to compiled object code, generated documentation,
+ and conversions to other media types.
+
+ "Work" shall mean the work of authorship, whether in Source or
+ Object form, made available under the License, as indicated by a
+ copyright notice that is included in or attached to the work
+ (an example is provided in the Appendix below).
+
+ "Derivative Works" shall mean any work, whether in Source or Object
+ form, that is based on (or derived from) the Work and for which the
+ editorial revisions, annotations, elaborations, or other modifications
+ represent, as a whole, an original work of authorship. For the purposes
+ of this License, Derivative Works shall not include works that remain
+ separable from, or merely link (or bind by name) to the interfaces of,
+ the Work and Derivative Works thereof.
+
+ "Contribution" shall mean any work of authorship, including
+ the original version of the Work and any modifications or additions
+ to that Work or Derivative Works thereof, that is intentionally
+ submitted to Licensor for inclusion in the Work by the copyright owner
+ or by an individual or Legal Entity authorized to submit on behalf of
+ the copyright owner. For the purposes of this definition, "submitted"
+ means any form of electronic, verbal, or written communication sent
+ to the Licensor or its representatives, including but not limited to
+ communication on electronic mailing lists, source code control systems,
+ and issue tracking systems that are managed by, or on behalf of, the
+ Licensor for the purpose of discussing and improving the Work, but
+ excluding communication that is conspicuously marked or otherwise
+ designated in writing by the copyright owner as "Not a Contribution."
+
+ "Contributor" shall mean Licensor and any individual or Legal Entity
+ on behalf of whom a Contribution has been received by Licensor and
+ subsequently incorporated within the Work.
+
+ 2. Grant of Copyright License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ copyright license to reproduce, prepare Derivative Works of,
+ publicly display, publicly perform, sublicense, and distribute the
+ Work and such Derivative Works in Source or Object form.
+
+ 3. Grant of Patent License. Subject to the terms and conditions of
+ this License, each Contributor hereby grants to You a perpetual,
+ worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+ (except as stated in this section) patent license to make, have made,
+ use, offer to sell, sell, import, and otherwise transfer the Work,
+ where such license applies only to those patent claims licensable
+ by such Contributor that are necessarily infringed by their
+ Contribution(s) alone or by combination of their Contribution(s)
+ with the Work to which such Contribution(s) was submitted. If You
+ institute patent litigation against any entity (including a
+ cross-claim or counterclaim in a lawsuit) alleging that the Work
+ or a Contribution incorporated within the Work constitutes direct
+ or contributory patent infringement, then any patent licenses
+ granted to You under this License for that Work shall terminate
+ as of the date such litigation is filed.
+
+ 4. Redistribution. You may reproduce and distribute copies of the
+ Work or Derivative Works thereof in any medium, with or without
+ modifications, and in Source or Object form, provided that You
+ meet the following conditions:
+
+ (a) You must give any other recipients of the Work or
+ Derivative Works a copy of this License; and
+
+ (b) You must cause any modified files to carry prominent notices
+ stating that You changed the files; and
+
+ (c) You must retain, in the Source form of any Derivative Works
+ that You distribute, all copyright, patent, trademark, and
+ attribution notices from the Source form of the Work,
+ excluding those notices that do not pertain to any part of
+ the Derivative Works; and
+
+ (d) If the Work includes a "NOTICE" text file as part of its
+ distribution, then any Derivative Works that You distribute must
+ include a readable copy of the attribution notices contained
+ within such NOTICE file, excluding those notices that do not
+ pertain to any part of the Derivative Works, in at least one
+ of the following places: within a NOTICE text file distributed
+ as part of the Derivative Works; within the Source form or
+ documentation, if provided along with the Derivative Works; or,
+ within a display generated by the Derivative Works, if and
+ wherever such third-party notices normally appear. The contents
+ of the NOTICE file are for informational purposes only and
+ do not modify the License. You may add Your own attribution
+ notices within Derivative Works that You distribute, alongside
+ or as an addendum to the NOTICE text from the Work, provided
+ that such additional attribution notices cannot be construed
+ as modifying the License.
+
+ You may add Your own copyright statement to Your modifications and
+ may provide additional or different license terms and conditions
+ for use, reproduction, or distribution of Your modifications, or
+ for any such Derivative Works as a whole, provided Your use,
+ reproduction, and distribution of the Work otherwise complies with
+ the conditions stated in this License.
+
+ 5. Submission of Contributions. Unless You explicitly state otherwise,
+ any Contribution intentionally submitted for inclusion in the Work
+ by You to the Licensor shall be under the terms and conditions of
+ this License, without any additional terms or conditions.
+ Notwithstanding the above, nothing herein shall supersede or modify
+ the terms of any separate license agreement you may have executed
+ with Licensor regarding such Contributions.
+
+ 6. Trademarks. This License does not grant permission to use the trade
+ names, trademarks, service marks, or product names of the Licensor,
+ except as required for reasonable and customary use in describing the
+ origin of the Work and reproducing the content of the NOTICE file.
+
+ 7. Disclaimer of Warranty. Unless required by applicable law or
+ agreed to in writing, Licensor provides the Work (and each
+ Contributor provides its Contributions) on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+ implied, including, without limitation, any warranties or conditions
+ of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+ PARTICULAR PURPOSE. You are solely responsible for determining the
+ appropriateness of using or redistributing the Work and assume any
+ risks associated with Your exercise of permissions under this License.
+
+ 8. Limitation of Liability. In no event and under no legal theory,
+ whether in tort (including negligence), contract, or otherwise,
+ unless required by applicable law (such as deliberate and grossly
+ negligent acts) or agreed to in writing, shall any Contributor be
+ liable to You for damages, including any direct, indirect, special,
+ incidental, or consequential damages of any character arising as a
+ result of this License or out of the use or inability to use the
+ Work (including but not limited to damages for loss of goodwill,
+ work stoppage, computer failure or malfunction, or any and all
+ other commercial damages or losses), even if such Contributor
+ has been advised of the possibility of such damages.
+
+ 9. Accepting Warranty or Additional Liability. While redistributing
+ the Work or Derivative Works thereof, You may choose to offer,
+ and charge a fee for, acceptance of support, warranty, indemnity,
+ or other liability obligations and/or rights consistent with this
+ License. However, in accepting such obligations, You may act only
+ on Your own behalf and on Your sole responsibility, not on behalf
+ of any other Contributor, and only if You agree to indemnify,
+ defend, and hold each Contributor harmless for any liability
+ incurred by, or claims asserted against, such Contributor by reason
+ of your accepting any such warranty or additional liability.
+
+ END OF TERMS AND CONDITIONS
+
+ APPENDIX: How to apply the Apache License to your work.
+
+ To apply the Apache License to your work, attach the following
+ boilerplate notice, with the fields enclosed by brackets "[]"
+ replaced with your own identifying information. (Don't include
+ the brackets!) The text should be enclosed in the appropriate
+ comment syntax for the file format. We also recommend that a
+ file or class name and description of purpose be included on the
+ same "printed page" as the copyright notice for easier
+ identification within third-party archives.
+
+ Copyright [yyyy] [name of copyright owner]
+
+ Licensed under the Apache License, Version 2.0 (the "License");
+ you may not use this file except in compliance with the License.
+ You may obtain a copy of the License at
+
+ http://www.apache.org/licenses/LICENSE-2.0
+
+ Unless required by applicable law or agreed to in writing, software
+ distributed under the License is distributed on an "AS IS" BASIS,
+ WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ See the License for the specific language governing permissions and
+ limitations under the License.
diff --git a/HiveCoreR0/src/voice_control/include/voice_control/formats.h b/HiveCoreR0/src/voice_control/include/voice_control/formats.h
new file mode 100644
index 0000000..386fb47
--- /dev/null
+++ b/HiveCoreR0/src/voice_control/include/voice_control/formats.h
@@ -0,0 +1,17 @@
+#ifndef FORMATS_H_160601_TT
+#define FORMATS_H_160601_TT 1
+
+#ifndef WAVE_FORMAT_PCM
+#define WAVE_FORMAT_PCM 1
+typedef struct tWAVEFORMATEX {
+ unsigned short wFormatTag;
+ unsigned short nChannels;
+ unsigned int nSamplesPerSec;
+ unsigned int nAvgBytesPerSec;
+ unsigned short nBlockAlign;
+ unsigned short wBitsPerSample;
+ unsigned short cbSize;
+} WAVEFORMATEX;
+#endif
+
+#endif
diff --git a/HiveCoreR0/src/voice_control/include/voice_control/linuxrec.h b/HiveCoreR0/src/voice_control/include/voice_control/linuxrec.h
new file mode 100644
index 0000000..17ace26
--- /dev/null
+++ b/HiveCoreR0/src/voice_control/include/voice_control/linuxrec.h
@@ -0,0 +1,156 @@
+/*
+ * @file
+ * @brief a record demo in linux
+ *
+ * a simple record code. using alsa-lib APIs.
+ * keep the function same as winrec.h
+ *
+ * Common steps:
+ * create_recorder,
+ * open_recorder,
+ * start_record,
+ * stop_record,
+ * close_recorder,
+ * destroy_recorder
+ *
+ * @author taozhang9
+ * @date 2016/06/01
+ */
+
+#ifndef __IFLY_WINREC_H__
+#define __IFLY_WINREC_H__
+
+#include "formats.h"
+/* error code */
+enum {
+ RECORD_ERR_BASE = 0,
+ RECORD_ERR_GENERAL,
+ RECORD_ERR_MEMFAIL,
+ RECORD_ERR_INVAL,
+ RECORD_ERR_NOT_READY
+};
+
+typedef struct {
+ union {
+ char * name;
+ int index;
+ void * resv;
+ }u;
+}record_dev_id;
+
+/* recorder object. */
+struct recorder {
+ void (*on_data_ind)(char *data, unsigned long len, void *user_para);
+ void * user_cb_para;
+ volatile int state; /* internal record state */
+
+ void * wavein_hdl;
+ /* thread id may be a struct. by implementation
+ * void * will not be ported!! */
+ pthread_t rec_thread;
+ /*void * rec_thread_hdl;*/
+
+ void * bufheader;
+ unsigned int bufcount;
+
+ char *audiobuf;
+ int bits_per_frame;
+ unsigned int buffer_time;
+ unsigned int period_time;
+ size_t period_frames;
+ size_t buffer_frames;
+};
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* C++ */
+
+/**
+ * @fn
+ * @brief Get the default input device ID
+ *
+ * @return returns "default" in linux.
+ *
+ */
+record_dev_id get_default_input_dev();
+
+/**
+ * @fn
+ * @brief Get the total number of active input devices.
+ * @return
+ */
+int get_input_dev_num();
+
+/**
+ * @fn
+ * @brief Create a recorder object.
+ *
+ * Never call the close_recorder in the callback function. as close
+ * action will wait for the callback thread to quit.
+ *
+ * @return int - Return 0 in success, otherwise return error code.
+ * @param out_rec - [out] recorder object holder
+ * @param on_data_ind - [in] callback. called when data coming.
+ * @param user_cb_para - [in] user params for the callback.
+ * @see
+ */
+int create_recorder(struct recorder ** out_rec,
+ void (*on_data_ind)(char *data, unsigned long len, void *user_para),
+ void* user_cb_para);
+
+/**
+ * @fn
+ * @brief Destroy recorder object. free memory.
+ * @param rec - [in]recorder object
+ */
+void destroy_recorder(struct recorder *rec);
+
+/**
+ * @fn
+ * @brief open the device.
+ * @return int - Return 0 in success, otherwise return error code.
+ * @param rec - [in] recorder object
+ * @param dev - [in] device id, from 0.
+ * @param fmt - [in] record format.
+ * @see
+ * get_default_input_dev()
+ */
+int open_recorder(struct recorder * rec, record_dev_id dev, WAVEFORMATEX * fmt);
+
+/**
+ * @fn
+ * @brief close the device.
+ * @param rec - [in] recorder object
+ */
+
+void close_recorder(struct recorder *rec);
+
+/**
+ * @fn
+ * @brief start record.
+ * @return int - Return 0 in success, otherwise return error code.
+ * @param rec - [in] recorder object
+ */
+int start_record(struct recorder * rec);
+
+/**
+ * @fn
+ * @brief stop record.
+ * @return int - Return 0 in success, otherwise return error code.
+ * @param rec - [in] recorder object
+ */
+int stop_record(struct recorder * rec);
+
+/**
+ * @fn
+ * @brief test if the recording has been stopped.
+ * @return int - 1: stopped. 0 : recording.
+ * @param rec - [in] recorder object
+ */
+int is_record_stopped(struct recorder *rec);
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif /* C++ */
+
+#endif
diff --git a/HiveCoreR0/src/voice_control/include/voice_control/msp_cmn.h b/HiveCoreR0/src/voice_control/include/voice_control/msp_cmn.h
new file mode 100644
index 0000000..4b111fa
--- /dev/null
+++ b/HiveCoreR0/src/voice_control/include/voice_control/msp_cmn.h
@@ -0,0 +1,282 @@
+/**
+ * @file msp_cmn.h
+ * @brief Mobile Speech Platform Common Interface Header File
+ *
+ * This file contains the quick common programming interface (API) declarations
+ * of MSP. Developer can include this file in your project to build applications.
+ * For more information, please read the developer guide.
+
+ * Use of this software is subject to certain restrictions and limitations set
+ * forth in a license agreement entered into between iFLYTEK, Co,LTD.
+ * and the licensee of this software. Please refer to the license
+ * agreement for license use rights and restrictions.
+ *
+ * Copyright (C) 1999 - 2012 by ANHUI USTC iFLYTEK, Co,LTD.
+ * All rights reserved.
+ *
+ * @author Speech Dept. iFLYTEK.
+ * @version 1.0
+ * @date 2012/09/01
+ *
+ * @see
+ *
+ * History:
+ * index version date author notes
+ * 0 1.0 2012/09/01 MSC40 Create this file
+ */
+
+#ifndef __MSP_CMN_H__
+#define __MSP_CMN_H__
+
+#include "msp_types.h"
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* C++ */
+//#ifdef MSP_WCHAR_SUPPORT
+/**
+ * @fn Wchar2Mbytes
+ * @brief wchar to mbytes
+ *
+ * User login.
+ *
+ * @return int MSPAPI - Return 0 in success, otherwise return error code.
+ * @param const wchar_t* wcstr - [in] Null-terminated source string(wchar_t *).
+ * @param char* mbstr - [in] Destination string(char *).
+ * @param int len - [in] The maximum number of bytes that can be stored in the multibyte output string.
+ * @see
+ */
+
+char *Wchar2Mbytes(const wchar_t* wcstr);
+
+/**
+ * @fn Mbytes2Wchar
+ * @brief mbytes to wchar
+ *
+ * User login.
+ *
+ * @return int MSPAPI - Return 0 in success, otherwise return error code.
+ * @param const char* mbstr - [in] Null-terminated source string(char *).
+ * @param wchar_t* wcstr - [in] Destination string(wchar_t *).
+ * @param int wlen - [in] The maximum number of multibyte characters to convert.
+ * @see
+ */
+wchar_t *Mbytes2Wchar(const char *mbstr);
+
+//#endif /*MSP_WCHAR_SUPPORT*/
+
+/**
+ * @fn MSPLogin
+ * @brief user login interface
+ *
+ * User login.
+ *
+ * @return int MSPAPI - Return 0 in success, otherwise return error code.
+ * @param const char* usr - [in] user name.
+ * @param const char* pwd - [in] password.
+ * @param const char* params - [in] parameters when user login.
+ * @see
+ */
+int MSPAPI MSPLogin(const char* usr, const char* pwd, const char* params);
+typedef int (MSPAPI *Proc_MSPLogin)(const char* usr, const char* pwd, const char* params);
+//#ifdef MSP_WCHAR_SUPPORT
+int MSPAPI MSPLoginW(const wchar_t* usr, const wchar_t* pwd, const wchar_t* params);
+typedef int (MSPAPI *Proc_MSPLoginW)(const wchar_t* usr, const wchar_t* pwd, const wchar_t* params);
+//#endif/*MSP_WCHAR_SUPPORT*/
+/**
+ * @fn MSPLogout
+ * @brief user logout interface
+ *
+ * User logout
+ *
+ * @return int MSPAPI - Return 0 in success, otherwise return error code.
+ * @see
+ */
+int MSPAPI MSPLogout();
+typedef int (MSPAPI *Proc_MSPLogout)();
+//#ifdef MSP_WCHAR_SUPPORT
+int MSPAPI MSPLogoutW();
+typedef int (MSPAPI *Proc_MSPLogoutW)();
+//#endif/*MSP_WCHAR_SUPPORT*/
+/**
+ * @fn MSPUpload
+ * @brief Upload User Specific Data
+ *
+ * Upload data such as user config, custom grammar, etc.
+ *
+ * @return int MSPAPI - Return 0 in success, otherwise return error code.
+ * @param const char* dataName - [in] data name, should be unique to diff other data.
+ * @param const char* params - [in] parameters about uploading data.
+ * @param const char* dataID - [in] id of the data to be operated.
+ * @see
+ */
+int MSPAPI MSPUpload( const char* dataName, const char* params, const char* dataID);
+typedef int (MSPAPI* Proc_MSPUpload)( const char* dataName, const char* params, const char* dataID);
+
+/**
+ * @fn MSPDownload
+ * @brief Download User Specific Data
+ *
+ * Download data such as user config, etc.
+ *
+ * @return int MSPAPI - Return 0 in success, otherwise return error code.
+ * @param const char* params - [in] parameters about data to be downloaded.
+ * @see
+ */
+typedef int (*DownloadStatusCB)(int errorCode, long param1, const void *param2, void *userData);
+typedef int (*DownloadResultCB)(const void *data, long dataLen, void *userData);
+int MSPAPI MSPDownload(const char* dataName, const char* params, DownloadStatusCB statusCb, DownloadResultCB resultCb, void*userData);
+typedef int (MSPAPI* Proc_MSPDownload)(const char* dataName, const char* params, DownloadStatusCB statusCb, DownloadResultCB resultCb, void*userData);
+int MSPAPI MSPDownloadW(const wchar_t* wdataName, const wchar_t* wparams, DownloadStatusCB statusCb, DownloadResultCB resultCb, void*userData);
+typedef int (MSPAPI* Proc_MSPDownloadW) (const wchar_t* wdataName, const wchar_t* wparams, DownloadStatusCB statusCb, DownloadResultCB resultCb, void*userData);
+
+/**
+ * @fn MSPAppendData
+ * @brief Append Data.
+ *
+ * Write data to msc, such as data to be uploaded, searching text, etc.
+ *
+ * @return int MSPAPI - Return 0 in success, otherwise return error code.
+ * @param void* data - [in] the data buffer pointer, data could be binary.
+ * @param unsigned int dataLen - [in] length of data.
+ * @param unsigned int dataStatus - [in] data status, 2: first or continuous, 4: last.
+ * @see
+ */
+int MSPAPI MSPAppendData(void* data, unsigned int dataLen, unsigned int dataStatus);
+typedef int (MSPAPI* Proc_MSPAppendData)(void* data, unsigned int dataLen, unsigned int dataStatus);
+
+/**
+ * @fn MSPGetResult
+ * @brief Get Result
+ *
+ * Get result of uploading, downloading or searching, etc.
+ *
+ * @return const char* MSPAPI - Return result of uploading, downloading or searching, etc.
+ * @param int* rsltLen - [out] Length of result returned.
+ * @param int* rsltStatus - [out] Status of result returned.
+ * @param int* errorCode - [out] Return 0 in success, otherwise return error code.
+ * @see
+ */
+const char* MSPAPI MSPGetResult(unsigned int* rsltLen, int* rsltStatus, int *errorCode);
+typedef const char * (MSPAPI *Proc_MSPGetResult)(unsigned int* rsltLen, int* rsltStatus, int *errorCode);
+
+/**
+ * @fn MSPSetParam
+ * @brief set params of msc
+ *
+ * set param of msc
+ *
+ * @return int - Return 0 if success, otherwise return errcode.
+ * @param const char* paramName - [in] param name.
+ * @param const char* paramValue - [in] param value
+ * @see
+ */
+int MSPAPI MSPSetParam( const char* paramName, const char* paramValue );
+typedef int (MSPAPI *Proc_MSPSetParam)(const char* paramName, const char* paramValue);
+
+/**
+ * @fn MSPGetParam
+ * @brief get params of msc
+ *
+ * get param of msc
+ *
+ * @return int - Return 0 if success, otherwise return errcode.
+ * @param const char* paramName - [in] param name.
+ * @param const char* paramValue - [out] param value
+ * @param const char* valueLen - [in/out] param value (buffer) length
+ * @see
+ */
+int MSPAPI MSPGetParam( const char *paramName, char *paramValue, unsigned int *valueLen );
+typedef int (MSPAPI *Proc_MSPGetParam)( const char *paramName, char *paramValue, unsigned int *valueLen );
+
+/**
+ * @fn MSPUploadData
+ * @brief Upload User Specific Data
+ *
+ * Upload data such as user config, custom grammar, etc.
+ *
+ * @return const char* MSPAPI - data id returned by Server, used for special command.
+ * @param const char* dataName - [in] data name, should be unique to diff other data.
+ * @param void* data - [in] the data buffer pointer, data could be binary.
+ * @param unsigned int dataLen - [in] length of data.
+ * @param const char* params - [in] parameters about uploading data.
+ * @param int* errorCode - [out] Return 0 in success, otherwise return error code.
+ * @see
+ */
+const char* MSPAPI MSPUploadData(const char* dataName, void* data, unsigned int dataLen, const char* params, int* errorCode);
+typedef const char* (MSPAPI* Proc_MSPUploadData)(const char* dataName, void* data, unsigned int dataLen, const char* params, int* errorCode);
+
+/**
+ * @fn MSPDownloadData
+ * @brief Download User Specific Data
+ *
+ * Download data such as user config, etc.
+ *
+ * @return const void* MSPAPI - received data buffer pointer, data could be binary, NULL if failed or data does not exsit.
+ * @param const char* params - [in] parameters about data to be downloaded.
+ * @param unsigned int* dataLen - [out] length of received data.
+ * @param int* errorCode - [out] Return 0 in success, otherwise return error code.
+ * @see
+ */
+const void* MSPAPI MSPDownloadData(const char* params, unsigned int* dataLen, int* errorCode);
+typedef const void* (MSPAPI* Proc_MSPDownloadData)(const char* params, unsigned int* dataLen, int* errorCode);
+//#ifdef MSP_WCHAR_SUPPORT
+const void* MSPAPI MSPDownloadDataW(const wchar_t* params, unsigned int* dataLen, int* errorCode);
+typedef const void* (MSPAPI* Proc_MSPDownloadDataW)(const wchar_t* params, unsigned int* dataLen, int* errorCode);
+//#endif/*MSP_WCHAR_SUPPORT*/
+/**
+ * @fn MSPSearch
+ * @brief Search text for result
+ *
+ * Search text content, and got text result
+ *
+ * @return const void* MSPAPI - received data buffer pointer, data could be binary, NULL if failed or data does not exsit.
+ * @param const char* params - [in] parameters about data to be downloaded.
+ * @param unsigned int* dataLen - [out] length of received data.
+ * @param int* errorCode - [out] Return 0 in success, otherwise return error code.
+ * @see
+ */
+const char* MSPAPI MSPSearch(const char* params, const char* text, unsigned int* dataLen, int* errorCode);
+typedef const char* (MSPAPI* Proc_MSPSearch)(const char* params, const char* text, unsigned int* dataLen, int* errorCode);
+
+
+
+typedef int (*NLPSearchCB)(const char *sessionID, int errorCode, int status, const void* result, long rsltLen, void *userData);
+const char* MSPAPI MSPNlpSearch(const char* params, const char* text, unsigned int textLen, int *errorCode, NLPSearchCB callback, void *userData);
+typedef const char* (MSPAPI* Proc_MSPNlpSearch)(const char* params, const char* text, unsigned int textLen, int *errorCode, NLPSearchCB callback, void *userData);
+int MSPAPI MSPNlpSchCancel(const char *sessionID, const char *hints);
+
+/**
+ * @fn MSPRegisterNotify
+ * @brief Register a Callback
+ *
+ * Register a Callback
+ *
+ * @return int -
+ * @param msp_status_ntf_handler statusCb - [in] notify handler
+ * @param void *userData - [in] userData
+ * @see
+ */
+typedef void ( *msp_status_ntf_handler)( int type, int status, int param1, const void *param2, void *userData );
+int MSPAPI MSPRegisterNotify( msp_status_ntf_handler statusCb, void *userData );
+typedef const char* (MSPAPI* Proc_MSPRegisterNotify)( msp_status_ntf_handler statusCb, void *userData );
+
+/**
+ * @fn MSPGetVersion
+ * @brief Get version of MSC or Local Engine
+ *
+ * Get version of MSC or Local Engine
+ *
+ * @return const char * MSPAPI - Return version value if success, NULL if fail.
+ * @param const char *verName - [in] version name, could be "msc", "aitalk", "aisound", "ivw".
+ * @param int *errorCode - [out] Return 0 in success, otherwise return error code.
+ * @see
+ */
+const char* MSPAPI MSPGetVersion(const char *verName, int *errorCode);
+typedef const char* (MSPAPI * Proc_MSPGetVersion)(const char *verName, int *errorCode);
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif /* C++ */
+
+#endif /* __MSP_CMN_H__ */
diff --git a/HiveCoreR0/src/voice_control/include/voice_control/msp_errors.h b/HiveCoreR0/src/voice_control/include/voice_control/msp_errors.h
new file mode 100644
index 0000000..1c240f9
--- /dev/null
+++ b/HiveCoreR0/src/voice_control/include/voice_control/msp_errors.h
@@ -0,0 +1,563 @@
+#ifndef __MSP_ERRORS_H__
+#define __MSP_ERRORS_H__
+
+#define MSP_HTTP_ERROR(x) ((x) + MSP_ERROR_HTTP_BASE )
+
+enum
+{
+ MSP_SUCCESS = 0,
+ MSP_ERROR_FAIL = -1,
+ MSP_ERROR_EXCEPTION = -2,
+
+ /* General errors 10100(0x2774) */
+ MSP_ERROR_GENERAL = 10100, /* 0x2774 */
+ MSP_ERROR_OUT_OF_MEMORY = 10101, /* 0x2775 */
+ MSP_ERROR_FILE_NOT_FOUND = 10102, /* 0x2776 */
+ MSP_ERROR_NOT_SUPPORT = 10103, /* 0x2777 */
+ MSP_ERROR_NOT_IMPLEMENT = 10104, /* 0x2778 */
+ MSP_ERROR_ACCESS = 10105, /* 0x2779 */
+ MSP_ERROR_INVALID_PARA = 10106, /* 0x277A */ /* ȱٲ */
+ MSP_ERROR_INVALID_PARA_VALUE = 10107, /* 0x277B */ /* Чֵ */
+ MSP_ERROR_INVALID_HANDLE = 10108, /* 0x277C */
+ MSP_ERROR_INVALID_DATA = 10109, /* 0x277D */
+ MSP_ERROR_NO_LICENSE = 10110, /* 0x277E */ /* Ȩ */
+ MSP_ERROR_NOT_INIT = 10111, /* 0x277F */ /* δʼ, */
+ MSP_ERROR_NULL_HANDLE = 10112, /* 0x2780 */
+ MSP_ERROR_OVERFLOW = 10113, /* 0x2781 */ /* ûģ(10), */
+ /* ֻڲʱһûвע */
+ MSP_ERROR_TIME_OUT = 10114, /* 0x2782 */ /* ʱ */
+ MSP_ERROR_OPEN_FILE = 10115, /* 0x2783 */
+ MSP_ERROR_NOT_FOUND = 10116, /* 0x2784 */ /* ݿģͲ */
+ MSP_ERROR_NO_ENOUGH_BUFFER = 10117, /* 0x2785 */
+ MSP_ERROR_NO_DATA = 10118, /* 0x2786 */ /* ӿͻ˶Ƶλȡʱ */
+ MSP_ERROR_NO_MORE_DATA = 10119, /* 0x2787 */
+ MSP_ERROR_NO_RESPONSE_DATA = 10120, /* 0x2788 */
+ MSP_ERROR_ALREADY_EXIST = 10121, /* 0x2789 */ /* ݿģѴ */
+ MSP_ERROR_LOAD_MODULE = 10122, /* 0x278A */
+ MSP_ERROR_BUSY = 10123, /* 0x278B */
+ MSP_ERROR_INVALID_CONFIG = 10124, /* 0x278C */
+ MSP_ERROR_VERSION_CHECK = 10125, /* 0x278D */
+ MSP_ERROR_CANCELED = 10126, /* 0x278E */
+ MSP_ERROR_INVALID_MEDIA_TYPE = 10127, /* 0x278F */
+ MSP_ERROR_CONFIG_INITIALIZE = 10128, /* 0x2790 */
+ MSP_ERROR_CREATE_HANDLE = 10129, /* 0x2791 */
+ MSP_ERROR_CODING_LIB_NOT_LOAD = 10130, /* 0x2792 */
+ MSP_ERROR_USER_CANCELLED = 10131, /* 0x2793 */
+ MSP_ERROR_INVALID_OPERATION = 10132, /* 0x2794 */
+ MSP_ERROR_MESSAGE_NOT_COMPLETE = 10133, /* 0x2795 */ /* flash */
+ MSP_ERROR_NO_EID = 10134, /* 0x2795 */
+ MSP_ERROE_OVER_REQ = 10135, /* 0x2797 */ /* client Redundancy request */
+ MSP_ERROR_USER_ACTIVE_ABORT = 10136, /* 0x2798 */ /* user abort */
+ MSP_ERROR_BUSY_GRMBUILDING = 10137, /* 0x2799 */
+ MSP_ERROR_BUSY_LEXUPDATING = 10138, /* 0x279A */
+ MSP_ERROR_SESSION_RESET = 10139, /* 0x279B */ /* mscֹỰش */
+ MSP_ERROR_BOS_TIMEOUT = 10140, /* 0x279C */ /* VADǰ˵㳬ʱ */
+ MSP_ERROR_STREAM_FILTER = 10141, /* 0X279D */ /* AIUIǰStream */
+ MSP_ERROR_STREAM_CLEAR = 10142, /* 0X279E */ /* AIUIǰStream */
+
+ /* Error codes of network 10200(0x27D8)*/
+ MSP_ERROR_NET_GENERAL = 10200, /* 0x27D8 */
+ MSP_ERROR_NET_OPENSOCK = 10201, /* 0x27D9 */ /* Open socket */
+ MSP_ERROR_NET_CONNECTSOCK = 10202, /* 0x27DA */ /* Connect socket */
+ MSP_ERROR_NET_ACCEPTSOCK = 10203, /* 0x27DB */ /* Accept socket */
+ MSP_ERROR_NET_SENDSOCK = 10204, /* 0x27DC */ /* Send socket data */
+ MSP_ERROR_NET_RECVSOCK = 10205, /* 0x27DD */ /* Recv socket data */
+ MSP_ERROR_NET_INVALIDSOCK = 10206, /* 0x27DE */ /* Invalid socket handle */
+ MSP_ERROR_NET_BADADDRESS = 10207, /* 0x27EF */ /* Bad network address */
+ MSP_ERROR_NET_BINDSEQUENCE = 10208, /* 0x27E0 */ /* Bind after listen/connect */
+ MSP_ERROR_NET_NOTOPENSOCK = 10209, /* 0x27E1 */ /* Socket is not opened */
+ MSP_ERROR_NET_NOTBIND = 10210, /* 0x27E2 */ /* Socket is not bind to an address */
+ MSP_ERROR_NET_NOTLISTEN = 10211, /* 0x27E3 */ /* Socket is not listening */
+ MSP_ERROR_NET_CONNECTCLOSE = 10212, /* 0x27E4 */ /* The other side of connection is closed */
+ MSP_ERROR_NET_NOTDGRAMSOCK = 10213, /* 0x27E5 */ /* The socket is not datagram type */
+ MSP_ERROR_NET_DNS = 10214, /* 0x27E6 */ /* domain name is invalid or dns server does not function well */
+ MSP_ERROR_NET_INIT = 10215, /* 0x27E7 */ /* ssl ctx create failed */
+
+ /*nfl error*/
+ MSP_ERROR_NFL_INNER_ERROR = 10216, /* NFL inner error */
+ MSP_ERROR_MSS_TIME_OUT = 10217, /* MSS TIMEOUT */
+ MSP_ERROT_CLIENT_TIME_OUT = 10218, /* CLIENT TIMEOUT */
+ MSP_ERROR_CLIENT_CLOSE = 10219, /* CLIENT CLOSED CONNECTION */
+
+ MSP_ERROR_CLIENT_AREA_CHANGE = 10220,
+ MSP_ERROR_NET_SSL_HANDSHAKE = 10221,
+ MSP_ERROR_NET_INVALID_ROOT_CERT = 10222,
+ MSP_ERROR_NET_INVALID_CLIENT_CERT = 10223,
+ MSP_ERROR_NET_INVALID_SERVER_CERT = 10224,
+ MSP_ERROR_NET_INVALID_KEY = 10225,
+ MSP_ERROR_NET_CERT_VERIFY_FAILED = 10226,
+ MSP_ERROR_NET_WOULDBLOCK = 10227,
+ MSP_ERROR_NET_NOTBLOCK = 10228,
+
+ /* Error codes of mssp message 10300(0x283C) */
+ MSP_ERROR_MSG_GENERAL = 10300, /* 0x283C */
+ MSP_ERROR_MSG_PARSE_ERROR = 10301, /* 0x283D */
+ MSP_ERROR_MSG_BUILD_ERROR = 10302, /* 0x283E */
+ MSP_ERROR_MSG_PARAM_ERROR = 10303, /* 0x283F */
+ MSP_ERROR_MSG_CONTENT_EMPTY = 10304, /* 0x2840 */
+ MSP_ERROR_MSG_INVALID_CONTENT_TYPE = 10305, /* 0x2841 */
+ MSP_ERROR_MSG_INVALID_CONTENT_LENGTH = 10306, /* 0x2842 */
+ MSP_ERROR_MSG_INVALID_CONTENT_ENCODE = 10307, /* 0x2843 */
+ MSP_ERROR_MSG_INVALID_KEY = 10308, /* 0x2844 */
+ MSP_ERROR_MSG_KEY_EMPTY = 10309, /* 0x2845 */
+ MSP_ERROR_MSG_SESSION_ID_EMPTY = 10310, /* 0x2846 */ /* ỰIDΪ */
+ MSP_ERROR_MSG_LOGIN_ID_EMPTY = 10311, /* 0x2847 */ /* ƵIDΪ */
+ MSP_ERROR_MSG_SYNC_ID_EMPTY = 10312, /* 0x2848 */
+ MSP_ERROR_MSG_APP_ID_EMPTY = 10313, /* 0x2849 */
+ MSP_ERROR_MSG_EXTERN_ID_EMPTY = 10314, /* 0x284A */
+ MSP_ERROR_MSG_INVALID_CMD = 10315, /* 0x284B */
+ MSP_ERROR_MSG_INVALID_SUBJECT = 10316, /* 0x284C */
+ MSP_ERROR_MSG_INVALID_VERSION = 10317, /* 0x284D */
+ MSP_ERROR_MSG_NO_CMD = 10318, /* 0x284E */
+ MSP_ERROR_MSG_NO_SUBJECT = 10319, /* 0x284F */
+ MSP_ERROR_MSG_NO_VERSION = 10320, /* 0x2850 */
+ MSP_ERROR_MSG_MSSP_EMPTY = 10321, /* 0x2851 */
+ MSP_ERROR_MSG_NEW_RESPONSE = 10322, /* 0x2852 */
+ MSP_ERROR_MSG_NEW_CONTENT = 10323, /* 0x2853 */
+ MSP_ERROR_MSG_INVALID_SESSION_ID = 10324, /* 0x2854 */ /* ЧĻỰID(sid) */
+ MSP_ERROR_MSG_INVALID_CONTENT = 10325, /* 0x2855 */
+
+ /* Error codes of DataBase 10400(0x28A0)*/
+ MSP_ERROR_DB_GENERAL = 10400, /* 0x28A0 */ /* ݿ쳣 */
+ MSP_ERROR_DB_EXCEPTION = 10401, /* 0x28A1 */
+ MSP_ERROR_DB_NO_RESULT = 10402, /* 0x28A2 */ /* redisûҵỰID(sid) */
+ MSP_ERROR_DB_INVALID_USER = 10403, /* 0x28A3 */
+ MSP_ERROR_DB_INVALID_PWD = 10404, /* 0x28A4 */
+ MSP_ERROR_DB_CONNECT = 10405, /* 0x28A5 */
+ MSP_ERROR_DB_INVALID_SQL = 10406, /* 0x28A6 */
+ MSP_ERROR_DB_INVALID_APPID = 10407, /* 0x28A7 */
+ MSP_ERROR_DB_NO_UID = 10408,
+
+ /* Error codes of Resource 10500(0x2904)*/
+ MSP_ERROR_RES_GENERAL = 10500, /* 0x2904 */
+ MSP_ERROR_RES_LOAD = 10501, /* 0x2905 */ /* Load resource */
+ MSP_ERROR_RES_FREE = 10502, /* 0x2906 */ /* Free resource */
+ MSP_ERROR_RES_MISSING = 10503, /* 0x2907 */ /* Resource File Missing */
+ MSP_ERROR_RES_INVALID_NAME = 10504, /* 0x2908 */ /* Invalid resource file name */
+ MSP_ERROR_RES_INVALID_ID = 10505, /* 0x2909 */ /* Invalid resource ID */
+ MSP_ERROR_RES_INVALID_IMG = 10506, /* 0x290A */ /* Invalid resource image pointer */
+ MSP_ERROR_RES_WRITE = 10507, /* 0x290B */ /* Write read-only resource */
+ MSP_ERROR_RES_LEAK = 10508, /* 0x290C */ /* Resource leak out */
+ MSP_ERROR_RES_HEAD = 10509, /* 0x290D */ /* Resource head currupt */
+ MSP_ERROR_RES_DATA = 10510, /* 0x290E */ /* Resource data currupt */
+ MSP_ERROR_RES_SKIP = 10511, /* 0x290F */ /* Resource file skipped */
+
+ /* Error codes of TTS 10600(0x2968)*/
+ MSP_ERROR_TTS_GENERAL = 10600, /* 0x2968 */
+ MSP_ERROR_TTS_TEXTEND = 10601, /* 0x2969 */ /* Meet text end */
+ MSP_ERROR_TTS_TEXT_EMPTY = 10602, /* 0x296A */ /* no synth text */
+ MSP_ERROR_TTS_LTTS_ERROR = 10603, /* 0x296B */
+
+ /* Error codes of Recognizer 10700(0x29CC) */
+ MSP_ERROR_REC_GENERAL = 10700, /* 0x29CC */ /* 쳣 */
+ MSP_ERROR_REC_INACTIVE = 10701, /* 0x29CD */
+ MSP_ERROR_REC_GRAMMAR_ERROR = 10702, /* 0x29CE */
+ MSP_ERROR_REC_NO_ACTIVE_GRAMMARS = 10703, /* 0x29CF */
+ MSP_ERROR_REC_DUPLICATE_GRAMMAR = 10704, /* 0x29D0 */
+ MSP_ERROR_REC_INVALID_MEDIA_TYPE = 10705, /* 0x29D1 */
+ MSP_ERROR_REC_INVALID_LANGUAGE = 10706, /* 0x29D2 */
+ MSP_ERROR_REC_URI_NOT_FOUND = 10707, /* 0x29D3 */
+ MSP_ERROR_REC_URI_TIMEOUT = 10708, /* 0x29D4 */
+ MSP_ERROR_REC_URI_FETCH_ERROR = 10709, /* 0x29D5 */
+ MSP_ERROR_REC_PROC_MOD = 10710, /* 0x29D6 */
+
+
+ /* Error codes of Speech Detector 10800(0x2A30) */
+ MSP_ERROR_EP_GENERAL = 10800, /* 0x2A30 */
+ MSP_ERROR_EP_NO_SESSION_NAME = 10801, /* 0x2A31 */
+ MSP_ERROR_EP_INACTIVE = 10802, /* 0x2A32 */
+ MSP_ERROR_EP_INITIALIZED = 10803, /* 0x2A33 */
+
+ /* Error codes of TUV */
+ MSP_ERROR_TUV_GENERAL = 10900, /* 0x2A94 */
+ MSP_ERROR_TUV_GETHIDPARAM = 10901, /* 0x2A95 */ /* Get Busin Param huanid*/
+ MSP_ERROR_TUV_TOKEN = 10902, /* 0x2A96 */ /* Get Token */
+ MSP_ERROR_TUV_CFGFILE = 10903, /* 0x2A97 */ /* Open cfg file */
+ MSP_ERROR_TUV_RECV_CONTENT = 10904, /* 0x2A98 */ /* received content is error */
+ MSP_ERROR_TUV_VERFAIL = 10905, /* 0x2A99 */ /* Verify failure */
+
+ /* Error codes of IMTV */
+ MSP_ERROR_LOGIN_SUCCESS = 11000, /* 0x2AF8 */ /* ɹ */
+ MSP_ERROR_LOGIN_NO_LICENSE = 11001, /* 0x2AF9 */ /* ôûҪ */
+ MSP_ERROR_LOGIN_SESSIONID_INVALID = 11002, /* 0x2AFA */ /* SessionIdʧЧҪµ¼֤ͨ */
+ MSP_ERROR_LOGIN_SESSIONID_ERROR = 11003, /* 0x2AFB */ /* SessionIdΪգ߷Ƿ */
+ MSP_ERROR_LOGIN_UNLOGIN = 11004, /* 0x2AFC */ /* δ¼֤ͨ */
+ MSP_ERROR_LOGIN_INVALID_USER = 11005, /* 0x2AFD */ /* ûIDЧ */
+ MSP_ERROR_LOGIN_INVALID_PWD = 11006, /* 0x2AFE */ /* ûЧ */
+ MSP_ERROR_LOGIN_SYSTEM_ERROR = 11099, /* 0x2B5B */ /* ϵͳ */
+
+ /* Error codes of HCR */
+ MSP_ERROR_HCR_GENERAL = 11100,
+ MSP_ERROR_HCR_RESOURCE_NOT_EXIST = 11101,
+ MSP_ERROR_HCR_CREATE = 11102,
+ MSP_ERROR_HCR_DESTROY = 11103,
+ MSP_ERROR_HCR_START = 11104,
+ MSP_ERROR_HCR_APPEND_STROKES = 11105,
+ MSP_ERROR_HCR_INIT = 11106,
+ MSP_ERROR_HCR_POINT_DECODE = 11107,
+ MSP_ERROR_HCR_DISPATCH = 11108,
+ MSP_ERROR_HCR_GETRESULT = 11109,
+ MSP_ERROR_HCR_RESOURCE = 11110,
+
+ /* Error Codes using in local engine */
+ MSP_ERROR_AUTH_NO_LICENSE = 11200, /* 0x2BC0 */ /* Ȩ */
+ MSP_ERROR_AUTH_NO_ENOUGH_LICENSE = 11201, /* 0x2BC1 */ /* Ȩ */
+ MSP_ERROR_AUTH_INVALID_LICENSE = 11202, /* 0x2BC2 */ /* ЧȨ */
+ MSP_ERROR_AUTH_LICENSE_EXPIRED = 11203, /* 0x2BC3 */ /* Ȩ */
+ MSP_ERROR_AUTH_NEED_MORE_DATA = 11204, /* 0x2BC4 */ /* 豸Ϣ */
+ MSP_ERROR_AUTH_LICENSE_TO_BE_EXPIRED = 11205, /* 0x2BC5 */ /* ȨڣԴ */
+ MSP_ERROR_AUTH_INVALID_MACHINE_ID = 11206, /* 0x2BC6 */ /* ЧĻ */
+ MSP_ERROR_AUTH_LOCAL_ASR_FORBIDDEN = 11207, /* 0x2BC7 */ /* ֹʹñʶ */
+ MSP_ERROR_AUTH_LOCAL_TTS_FORBIDDEN = 11208, /* 0x2BC8 */ /* ֹʹñغϳ */
+ MSP_ERROR_AUTH_LOCAL_IVW_FORBIDDEN = 11209, /* 0x2BC9 */ /* ֹʹñػ */
+ MSP_ERROR_AUTH_APPID_NOT_MATCH = 11210, /* 0x2BCA */ /* ԴappidӦappidƥ */
+ MSP_ERROR_AUTH_UID_NOT_MATCH = 11211, /* 0x2BCB */ /* Դuid͵¼ûuidƥ */
+ MSP_ERROR_AUTH_TRIAL_EXPIRED = 11212, /* 0x2BCC */ /* Դ */
+ MSP_ERROR_AUTH_LOCAL_IFD_FORBIDDEN = 11213, /* 0x2BC9 */ /* ֹʹñ */
+
+ MSP_ERROR_AIUI_NO_ENOUGH_LICENSE = 11216, /* 0x2BD0 */ /* AIUIȨ */
+ /*Error Codes of Authorization*/
+ MSP_ERROR_AUTH_DVC_NO_LICENSE = 11300,
+ MSP_ERROR_AUTH_DVC_NO_ENOUGH_LICENSE = 11301,
+ MSP_ERROR_AUTH_DVC_INVALID_LICENSE = 11302,
+ MSP_ERROR_AUTH_DVC_LICENSE_EXPIRED = 11303,
+ MSP_ERROR_AUTH_DVC_NEED_MORE_DATA = 11304,
+ MSP_ERROR_AUTH_DVC_LICENSE_TO_BE_EXPIRED = 11305,
+ MSP_ERROR_AUTH_DVC_EXCEED_LICENSE = 11306,
+
+ /* Error codes of Ise */
+
+ MSP_ERROR_ASE_EXCEP_SILENCE = 11401,
+ MSP_ERROR_ASE_EXCEP_SNRATIO = 11402,
+ MSP_ERROR_ASE_EXCEP_PAPERDATA = 11403,
+ MSP_ERROR_ASE_EXCEP_PAPERCONTENTS = 11404,
+ MSP_ERROR_ASE_EXCEP_NOTMONO = 11405,
+ MSP_ERROR_ASE_EXCEP_OTHERS = 11406,
+ MSP_ERROR_ASE_EXCEP_PAPERFMT = 11407,
+ MSP_ERROR_ASE_EXCEP_ULISTWORD = 11408,
+
+ /* Error codes of Iot */
+ MSP_ERROR_IOT_BASE = 11500,
+ MSP_ERROR_IOT_PARAM_ERROR = 11501, // param error
+ MSP_ERROR_IOT_INVALID_SERVICE = 11502, // invalid service for iot ProTranServer
+ MSP_ERROR_IOT_INVALID_PRODUCTID = 11503, // invalid productid for ProTranServer
+ MSP_EEROR_IOT_INVALID_ATTR = 11504, // invalid attr value for one product in ProTranServer
+ MSP_ERROR_IOT_INVALID_PLATFORM = 11505, // invalid platform for ProTranServer
+ MSP_ERROR_IOT_DID_NOT_FOUND = 11506, // not found device id in semantic
+
+ /* Error codes of IVP */
+ MSP_ERROR_IVP_GENERAL = 11600, // ں쳣
+ MSP_ERROR_IVP_EXTRA_RGN_SOPPORT = 11601, // עʱдƵ(9)
+ MSP_ERROR_IVP_TRUNCATED = 11602, // Ƶط(źŲεķ̫ϵͳԷΧ)¼Ƶ
+ MSP_ERROR_IVP_MUCH_NOISE = 11603, // Ƶȹ
+ MSP_ERROR_IVP_TOO_LOW = 11604, // Ƶ
+ MSP_ERROR_IVP_ZERO_AUDIO = 11605, // Ƶ
+ MSP_ERROR_IVP_UTTER_TOO_SHORT = 11606, // Ƶ̫
+ MSP_ERROR_IVP_TEXT_NOT_MATCH = 11607, // 1.Ƶıƥ䣬ԭ1.(ڰ¼֮ǰ)
+ // 2.¼¼ƵƵг 3.ȷʵƥ"
+ MSP_ERROR_IVP_NO_ENOUGH_AUDIO = 11608, // Ƶע˵дƵֲʱᱨߵƵ
+ MSP_ERROR_IVP_MODEL_NOT_FOUND_IN_HBASE = 11610, // ģhbaseûҵ
+
+ /* Error codes of Face */
+
+ MSP_ERROR_IFR_NOT_FACE_IMAGE = 11700, // Ӧ20200
+ MSP_ERROR_FACE_IMAGE_FULL_LEFT = 11701, // Ӧ20201
+ MSP_ERROR_FACE_IMAGE_FULL_RIGHT = 11702, // ңӦ20202
+ MSP_ERROR_IMAGE_CLOCKWISE_WHIRL = 11703, // ˳ʱתӦ20203
+ MSP_ERROR_IMAGE_COUNTET_CLOCKWISE_WHIRL = 11704, // ʱתӦ20204
+ MSP_ERROR_VALID_IMAGE_SIZE = 11705, // ͼƬС쳣 Ӧ20205
+ MSP_ERROR_ILLUMINATION = 11706, // 쳣Ӧ20206
+ MSP_ERROR_FACE_OCCULTATION = 11707, // ڵӦ20207
+ MSP_ERROR_FACE_INVALID_MODEL = 11708, // ǷģݣӦ20208
+ MSP_ERROR_FUSION_INVALID_INPUT_TYPE = 11709, // ͷǷӦ20300
+ MSP_ERROR_FUSION_NO_ENOUGH_DATA = 11710, // ݲӦ20301
+ MSP_ERROR_FUSION_ENOUGH_DATA = 11711, // ݹ࣬Ӧ20302
+
+ /*Error Codes of AIUI*/
+ MSP_ERROR_AIUI_CID_EXPIRED = 11800,
+
+ /*Error Codes of Encoder*/
+ MSP_ERROR_ICT_ENCODER = 11900,
+
+ /* Error codes of http 12000(0x2EE0) */
+ MSP_ERROR_HTTP_BASE = 12000, /* 0x2EE0 */
+ MSP_ERROR_HTTP_400 = 12400,
+ MSP_ERROR_HTTP_401 = 12401,
+ MSP_ERROR_HTTP_402 = 12402,
+ MSP_ERROR_HTTP_403 = 12403,
+ MSP_ERROR_HTTP_404 = 12404,
+ MSP_ERROR_HTTP_405 = 12405,
+ MSP_ERROR_HTTP_406 = 12406,
+ MSP_ERROR_HTTP_407 = 12407,
+ MSP_ERROR_HTTP_408 = 12408,
+ MSP_ERROR_HTTP_409 = 12409,
+ MSP_ERROR_HTTP_410 = 12410,
+ MSP_ERROR_HTTP_411 = 12411,
+ MSP_ERROR_HTTP_412 = 12412,
+ MSP_ERROR_HTTP_413 = 12413,
+ MSP_ERROR_HTTP_414 = 12414,
+ MSP_ERROR_HTTP_415 = 12415,
+ MSP_ERROR_HTTP_416 = 12416,
+ MSP_ERROR_HTTP_417 = 12417,
+ MSP_ERROR_HTTP_500 = 12500,
+ MSP_ERROR_HTTP_501 = 12501,
+ MSP_ERROR_HTTP_502 = 12502,
+ MSP_ERROR_HTTP_503 = 12503,
+ MSP_ERROR_HTTP_504 = 12504,
+ MSP_ERROR_HTTP_505 = 12505,
+ /*Error codes of ISV */
+ MSP_ERROR_ISV_NO_USER = 13000, /* 32C8 */ /* the user doesn't exist */
+
+ /* Error codes of Lua scripts */
+ MSP_ERROR_LUA_BASE = 14000, /* 0x36B0 */
+ MSP_ERROR_LUA_YIELD = 14001, /* 0x36B1 */
+ MSP_ERROR_LUA_ERRRUN = 14002, /* 0x36B2 */
+ MSP_ERROR_LUA_ERRSYNTAX = 14003, /* 0x36B3 */
+ MSP_ERROR_LUA_ERRMEM = 14004, /* 0x36B4 */
+ MSP_ERROR_LUA_ERRERR = 14005, /* 0x36B5 */
+ MSP_ERROR_LUA_INVALID_PARAM = 14006, /* 0x36B6 */
+
+ /* Error codes of MMP */
+ MSP_ERROR_MMP_BASE = 15000, /* 0x3A98 */
+ MSP_ERROR_MMP_MYSQL_INITFAIL = 15001, /* 0x3A99 */
+ MSP_ERROR_MMP_REDIS_INITFAIL = 15002, /* 0x3A9A */
+ MSP_ERROR_MMP_NETDSS_INITFAIL = 15003, /* 0x3A9B */
+ MSP_ERROR_MMP_TAIR_INITFAIL = 15004, /* 0x3A9C */
+ MSP_ERROR_MMP_MAIL_SESSION_FAIL = 15006, /* 0x3A9E */ /* ʼ½ʱỰ*/
+ MSP_ERROR_MMP_MAIL_LOGON_FAIL = 15007, /* 0x3A9F */ /* ʼ½ʱܾ½*/
+ MSP_ERROR_MMP_MAIL_USER_ILLEGAL = 15008, /* 0x3AA0 */ /* ʼ½ʱûǷ*/
+ MSP_ERROR_MMP_MAIL_PWD_ERR = 15009, /* 0x3AA1 */ /* ʼ½ʱ*/
+ MSP_ERROR_MMP_MAIL_SOCKET_ERR = 15010, /* 0x3AA2 */ /* ʼִ*/
+ MSP_ERROR_MMP_MAIL_INIT_FAIL = 15011, /* 0x3AA3 */ /* ʼʼ*/
+ MSP_ERROR_MMP_STORE_MNR_NO_INIT = 15012, /* 0x3AA4 */ /* store_managerδʼʼʧ*/
+ MSP_ERROR_MMP_STORE_MNR_POOL_FULL = 15013, /* 0x3AA5 */ /* store_managerӳ*/
+ MSP_ERROR_MMP_STRATGY_PARAM_ILLEGAL = 15014, /* 0x3AA6 */ /* ԱʽǷ*/
+ MSP_ERROR_MMP_STRATGY_PARAM_TOOLOOG = 15015, /* 0x3AA7 */ /* Աʽ̫*/
+ MSP_ERROR_MMP_PARAM_NULL = 15016, /* 0x3AA8 */ /* Ϊ*/
+ MSP_ERROR_MMP_ERR_MORE_TOTAL = 15017, /* 0x3AA9 */ /* pmsݿдܱݣ > ܴ*/
+ MSP_ERROR_MMP_PROC_THRESHOLD = 15018, /* 0x3AAA */ /* ̼طֵô*/
+ MSP_ERROR_MMP_SERVER_THRESHOLD = 15019, /* 0x3AAB */ /* طֵô*/
+ MSP_ERROR_MMP_PYTHON_NO_EXIST = 15020, /* 0x3AAC */ /* pythonűļ */
+ MSP_ERROR_MMP_PYTHON_IMPORT_FAILED = 15021, /* 0x3AAD */ /* pythonű */
+ MSP_ERROR_MMP_PYTHON_BAD_FUNC = 15022, /* 0x3AAE */ /* pythonűʽ */
+ MSP_ERROR_MMP_DB_DATA_ILLEGAL = 15023, /* 0x3AAF */ /* ݿеݸʽ */
+ MSP_ERROR_MMP_REDIS_NOT_CONN = 15024, /* 0x3AB0 */ /* redisûӵ */
+ MSP_ERROR_MMP_PMA_NOT_FOUND_STRATEGY = 15025, /* 0x3AB1 */ /* ûҵ */
+ MSP_ERROR_MMP_TAIR_CONNECT = 15026, /* 0x3AB2 */ /* tairȺʧ */
+ MSP_ERROR_MMP_PMC_SERVINFO_INVALID = 15027, /* Ox3AB3 */ /* pmcķϢѾЧ */
+ MSP_ERROR_MMP_ALARM_GROUP_NULL = 15028, /* Ox3AB4 */ /* ĶűʼΪ */
+ MSP_ERROR_MMP_ALARM_CONTXT_NULL = 15029, /* Ox3AB5 */ /* ıΪ */
+
+ /* Error codes of MSC(lmod loader) */
+ MSP_ERROR_LMOD_BASE = 16000, /* 0x3E80 */
+ MSP_ERROR_LMOD_NOT_FOUND = 16001, /* 0x3E81 */ /* ûҵlmodļ */
+ MSP_ERROR_LMOD_UNEXPECTED_BIN = 16002, /* 0x3E82 */ /* Чlmod */
+ MSP_ERROR_LMOD_LOADCODE = 16003, /* 0x3E83 */ /* lmodָʧ */
+ MSP_ERROR_LMOD_PRECALL = 16004, /* 0x3E84 */ /* ʼlmodʧ */
+ MSP_ERROR_LMOD_RUNTIME_EXCEPTION = 16005, /* 0x3E85 */ /* lmodʱ쳣 */
+ MSP_ERROR_LMOD_ALREADY_LOADED = 16006, /* 0x3E86 */ /* lmodظ */
+
+ // Error code of Third Business
+ MSP_ERROR_BIZ_BASE = 17000, /* 0x4268 */ /* ҵ */
+
+ //Error of Nginx errlog file increase exception
+ MSP_ERROR_NGX_LOG_MORE_TOTEL_SIZE = 18000, /*nginx־С쳣*/
+
+ //Error of Flash client when network checking
+ MSP_ERROR_FLASH_NETWORK_CONNECT_FIALED = 19000, /*flashʧ*/
+ MSP_ERROR_FLASH_NETWORK_CHECK_FIALED = 19001, /*flashӦ쳣Ϣ*/
+ MSP_ERROR_FLASH_NETWORK_CHECK_TIMEOUT = 19002, /*flash糬ʱ*/
+ MSP_ERROR_FLASH_NETWORK_CLOSED_EXCEPTION = 19003, /*flash쳣ر*/
+
+ /*Error Code Of Speech plus*/
+
+ SPEECH_ERROR_NO_NETWORK = 20001, /* Ч*/
+ SPEECH_ERROR_NETWORK_TIMEOUT = 20002, /* ӳʱ*/
+ SPEECH_ERROR_NET_EXPECTION = 20003, /* 쳣*/
+ SPEECH_ERROR_INVALID_RESULT = 20004, /* ЧĽ*/
+ SPEECH_ERROR_NO_MATCH = 20005, /* ƥ */
+ SPEECH_ERROR_AUDIO_RECORD = 20006, /* ¼ʧ */
+ SPEECH_ERROR_NO_SPPECH = 20007, /* δ*/
+
+ SPEECH_ERROR_SPEECH_TIMEOUT = 20008, /* Ƶ볬ʱ*/
+ SPEECH_ERROR_EMPTY_UTTERANCE = 20009, /* Чı */
+ SPEECH_ERROR_FILE_ACCESS = 20010, /* ļдʧ */
+ SPEECH_ERROR_PLAY_MEDIA = 20011, /* Ƶʧ */
+
+ SPEECH_ERROR_INVALID_PARAM = 20012, /* ЧIJ*/
+ SPEECH_ERROR_TEXT_OVERFLOW = 20013, /* ı */
+ SPEECH_ERROR_INVALID_DATA = 20014, /* Ч */
+ SPEECH_ERROR_LOGIN = 20015, /* ûδ½*/
+ SPEECH_ERROR_PERMISSION_DENIED = 20016, /* ЧȨ */
+ SPEECH_ERROR_INTERRUPT = 20017, /* 쳣 */
+
+ SPEECH_ERROR_VERSION_LOWER = 20018, /* 汾 */
+ SPEECH_CLIENT_ERROR_ISUSING = 20019, /* ¼ռ(iOSƽ̨) */
+ SPEECH_ERROR_SYSTEM_PREINSTALL = 20020, /* ϵͳԤð汾 */
+ SPEECH_ERROR_UNSATISFIED_LINK = 20021, /* δʵֵNative */
+ SPEECH_ERROR_UNKNOWN = 20999, /* δ֪ */
+
+
+ SPEECH_ERROR_COMPONENT_NOT_INSTALLED = 21001, /* ûаװ */
+ SPEECH_ERROR_ENGINE_NOT_SUPPORTED = 21002, /* 治֧ */
+ SPEECH_ERROR_ENGINE_INIT_FAIL = 21003, /* ʼʧ */
+ SPEECH_ERROR_ENGINE_CALL_FAIL = 21004, /* ʧ */
+ SPEECH_ERROR_ENGINE_BUSY = 21005, /* 深æ */
+
+ SPEECH_ERROR_LOCAL_NO_INIT = 22001, /* δʼ */
+ SPEECH_ERROR_LOCAL_RESOURCE = 22002, /* Դ */
+ SPEECH_ERROR_LOCAL_ENGINE = 22003, /* ڲ */
+ SPEECH_ERROR_IVW_INTERRUPT = 22004, /* ػ汻쳣 */
+
+
+ /*Error Code Of Local iflytek Engines*/
+
+ /*Error Code Of AiTalk*/
+
+ /*Error Code Of AiTalk Operation*/
+ SPEECH_SUCCESS = 0 , // ivErr_OK = 0 /*ɹ״̬*/
+
+ SPEECH_ERROR_ASR_CLIENT = 23000, /*ͻӦó*///?????????
+ SPEECH_ERROR_ASR_INVALID_PARA = 23001, /*ЧIJ*/
+ SPEECH_ERROR_ASR_INVALID_PARA_VALUE = 23002, /*ЧIJֵ*/
+ SPEECH_ERROR_ASR_OUT_OF_MEMORY = 23003, /*ڴľ*/
+ SPEECH_ERROR_ASR_CREATE_HANDLE_FAILED = 23004, /*ʧ*/
+ SPEECH_ERROR_ASR_ENGINE_INIT_FAILED = 23005, /*ʼʧ*/
+ SPEECH_ERROR_ASR_ENGINE_STARTED = 23006, /*Ѿ*/
+ SPEECH_ERROR_ASR_ENGINE_UNINIT = 23007, /*δʼ*/
+ SPEECH_ERROR_ASR_SPEECH_TIMEOUT = 23008, /*ʶʱVADûûм˵㣩*/
+ SPEECH_ERROR_ASR_NO_RECOGNIZED_RESULT = 23009, /*ʶ*/
+ SPEECH_ERROR_ASR_INVALID_HANDLE = 23010, /*Чľ*/
+ SPEECH_ERROR_ASR_FILE_ACCESS = 23011, /*ļʧ*/
+
+ /*Error Code Of AiTalk Engine*/
+ SPEECH_ERROR_AITALK_FALSE = 23100, // ivErr_FALSE = 1
+
+ /* For license check */
+ SPEECH_ERROR_AITALK_PERMISSION_DENIED = 23101, // ivErr_InvSN = 2
+
+ /* General */
+ SPEECH_ERROR_AITALK_INVALID_PARA = 23102, // ivErr_InvArg = 3
+ SPEECH_ERROR_AITALK_BUFFER_OVERFLOW = 23103, // ivErr_BufferFull = 4 /*Ƶݻ*/
+ SPEECH_ERROR_AITALK_FAILED = 23104, // ivErr_Failed = 5
+ SPEECH_ERROR_AITALK_NOT_SUPPORTED = 23105, // ivErr_NotSupport = 6 /*治֧*/
+ SPEECH_ERROR_AITALK_OUT_OF_MEMORY = 23106, // ivErr_OutOfMemory = 7
+ SPEECH_ERROR_AITALK_INVALID_RESOURCE = 23107, // ivErr_InvResource = 8 /*ԴЧ*/
+ SPEECH_ERROR_AITALK_NOT_FOUND = 23108, // ivErr_NotFound = 9 /*ļʧ*/
+ SPEECH_ERROR_AITALK_INVALID_GRAMMAR = 23109, // ivErr_InvGrmr = 10 /*ʶ*/
+
+ /* For object status */
+ SPEECH_ERROR_AITALK_INVALID_CALL = 23110, // ivErr_InvCall = 11 /*Ч*/
+
+ /* For ASR Input */
+ SPEECH_ERROR_AITALK_SYNTAX_ERROR = 23111, // ivErr_InvCall = 12
+
+ /* For Message Call Back */
+ SPEECH_ERROR_AITALK_RESET = 23112, // ivErr_Reset = 13
+ SPEECH_ERROR_AITALK_ENDED = 23113, // ivErr_Ended = 14
+ SPEECH_ERROR_AITALK_IDLE = 23114, // ivErr_Idle = 15
+ SPEECH_ERROR_AITALK_CANNOT_SAVE_FILE = 23115, // ivErr_CanNotSaveFile = 16
+
+ /* For Lexicon name */
+ SPEECH_ERROR_AITALK_INVALID_GRAMMAR_NAME = 23116, // ivErr_InvName = 17 /*ķʵƷǷ*/
+
+ SPEECH_ERROR_AITALK_BUFFER_EMPTY = 23117, // ivErr_BufferEmpty = 18
+
+ SPEECH_ERROR_AITALK_GET_RESULT = 23118, // ivErr_GetResult = 19
+
+ SPEECH_ERROR_AITALK_REACT_OUT_TIME = 23119, // ivErr_ReactOutTime = 20 /*Ӧʱ*/
+ SPEECH_ERROR_AITALK_SPEECH_OUT_TIME = 23120, // ivErr_SpeechOutTime = 21 /*ʱ*/
+
+ SPEECH_ERROR_AITALK_AUDIO_CUT = 23121, // ivErr_CUT = 22 /*¼*/
+ SPEECH_ERROR_AITALK_AUDIO_LOWER = 23122, // ivErr_LOWER = 23 /*¼*/
+
+ SPEECH_ERROR_AITALK_INSUFFICIENT_PERMISSIONS = 23123, // ivErr_Limitted = 24 /*Ȩ*/
+ SPEECH_ERROR_AITALK_RESULT_ERROR = 23124, // ivErr_ResultError = 25 /*WfstȻcmd*/
+ SPEECH_ERROR_AITALK_SHORT_PAUSE = 23125, // ivErr_ShortPause = 26
+ SPEECH_ERROR_AITALK_BUSY = 23126, // ivErr_Busy = 27
+ SPEECH_ERROR_AITALK_GRM_NOT_UPDATE = 23127, // ivErr_GrmNotUpdate = 28 /*δ*/
+ SPEECH_ERROR_AITALK_STARTED = 23128, // ivErr_Started = 29
+ SPEECH_ERROR_AITALK_STOPPED = 23129, // ivErr_Stopped = 30
+ SPEECH_ERROR_AITALK_ALREADY_STARTED = 23130, // ivErr_AlreadyStarted = 31
+ SPEECH_ERROR_AITALK_ALREADY_STOPPED = 23131, // ivErr_AlreadyStopped = 32
+ SPEECH_ERROR_AITALK_TOO_MANY_COMMAND = 23132, // ivErr_TooManyCmd = 33
+ SPEECH_ERROR_AITALK_WAIT = 23133, // ivErr_Wait = 34 /*һЩ߳Ҫȴ*/
+ SPEECH_ERROR_AITALK_MAE_RIGHT = 23134, // ivErr_MAERight = 35
+ SPEECH_ERROR_AITALK_MAE_WRONG = 23135, // ivErr_MAEWrong = 36
+
+ SPEECH_ERROR_AITALK_GRM_ERR = 23300, //
+
+
+
+ /*Error Code Of AiSound*/
+
+ /*Error Code Of AiSound Operation*/
+ SPEECH_ERROR_TTS_INVALID_PARA = 24000, /* */
+ SPEECH_ERROR_TTS_INVALID_PARA_VALUE = 24001, /* ЧIJֵ*/
+ SPEECH_ERROR_TTS_OUT_OF_MEMORY = 24002, /* ڴ治*/
+ SPEECH_ERROR_TTS_INVALID_HANDLE = 24003, /* Чľ*/
+ SPEECH_ERROR_TTS_CREATE_HANDLE_FAILED = 24004, /* ʧ*/
+ SPEECH_ERROR_TTS_INVALID_RESOURCE = 24005, /* ЧԴ */
+ SPEECH_ERROR_TTS_INVALID_VOICE_NAME = 24006, /* Ч*/
+ SPEECH_ERROR_TTS_ENGINE_UNINIT = 24007, /* δʼ */
+ SPEECH_ERROR_TTS_ENGINE_INIT_FAILED = 24008, /* ʼʧ */
+ SPEECH_ERROR_TTS_ENGINE_BUSY = 24009, /* æ */
+
+
+ /*Error Code Of AiSound Engine*/
+ SPEECH_ERROR_AISOUND_BASE = 24100,
+ SPEECH_ERROR_AISOUND_UNIMPEMENTED = 24100, /* unimplemented function */
+ SPEECH_ERROR_AISOUND_UNSUPPORTED = 24101, /* unsupported on this platform */
+ SPEECH_ERROR_AISOUND_INVALID_HANDLE = 24102, /* invalid handle */
+ SPEECH_ERROR_AISOUND_INVALID_PARA = 24103, /* invalid parameter(s) */
+ SPEECH_ERROR_AISOUND_INSUFFICIENT_HEAP = 24104, /* insufficient heap size */
+ SPEECH_ERROR_AISOUND_STATE_REFUSE = 24105, /* refuse to do in current state */
+ SPEECH_ERROR_AISOUND_INVALID_PARA_ID = 24106, /* invalid parameter ID */
+ SPEECH_ERROR_AISOUND_INVALID_PARA_VALUE = 24107, /* invalid parameter value */
+ SPEECH_ERROR_AISOUND_RESOURCE = 24108, /* Resource is error */
+ SPEECH_ERROR_AISOUND_RESOURCE_READ = 24109, /* read resource error */
+ SPEECH_ERROR_AISOUND_LBENDIAN = 24110, /* the Endian of SDK is error */
+ SPEECH_ERROR_AISOUND_HEADFILE = 24111, /* the HeadFile is different of the SDK */
+ SPEECH_ERROR_AISOUND_BUFFER_OVERFLOW = 24112, /* get data size exceed the data buffer */
+ SPEECH_ERROR_AISOUND_INVALID_ISAMPA = 24113, /* !Invalid iSampa format or input iSampa text contain invalid alphabet*/
+ SPEECH_ERROR_AISOUND_INVALID_CSSML = 24114, /* !Invalid cssml format */
+
+
+ /*Error Code Of ivw*/
+
+ /*Error Code Of ivw Operation*/
+ SPEECH_ERROR_IVW_ENGINE_UNINI = 25000, /* δʼ */
+ SPEECH_ERROR_IVW_RESVER_NOMATCH = 25001, /* Դ汾ƥ */
+ SPEECH_ERROR_IVW_BUFFERED_AUDIOD_LITTLE = 25002, /* ѼʶƵ */
+ SPEECH_ERROR_IVW_INVALID_RESTYPE = 25003, /* ϷԴ */
+ SPEECH_ERROR_IVW_INVALID_RESHEADVER = 25004, /* ϷԴͷ汾 */
+
+ /*Error Code Of ivw Engine*/
+ SPEECH_ERROR_IVW_INVALID_CALL = 25101, // IvwErr_InvCal = 1
+ SPEECH_ERROR_IVW_INVALID_ARG = 25102, // IvwErr_InvArg = 2
+ SPEECH_ERROR_IVW_TELL_SIZE = 25103, // IvwErr_TellSize = 3
+ SPEECH_ERROR_IVW_OUT_OF_MEMORY = 25104, // IvwErr_OutOfMemory = 4
+ SPEECH_ERROR_IVW_OUT_BUFFER_FULL = 25105, // IvwErr_BufferFull = 5
+ SPEECH_ERROR_IVW_OUT_BUFFER_EMPTY = 25106, // IvwErr_BufferEmpty = 6
+ SPEECH_ERROR_IVW_INVALID_RESOURCE = 25107, // IvwErr_InvRes = 7
+ SPEECH_ERROR_IVW_REPETITIOPN_ENTER = 25108, // IvwErr_ReEnter = 8
+ SPEECH_ERROR_IVW_NOT_SUPPORT = 25109, // IvwErr_NotSupport = 9
+ SPEECH_ERROR_IVW_NOT_FOUND = 25110, // IvwErr_NotFound = 10
+ SPEECH_ERROR_IVW_INVALID_SN = 25111, // IvwErr_InvSN = 11
+ SPEECH_ERROR_IVW_LIMITTED = 25112, // IvwErr_Limitted = 12
+ SPEECH_ERROR_IVW_TIME_OUT = 25113, // IvwErr_TimeOut = 13
+
+ SPEECH_ERROR_IVW_ENROLL1_SUCESS = 25114, // IvwErr_Enroll1_Success = 14
+ SPEECH_ERROR_IVW_ENROLL1_FAILED = 25115, // IvwErr_Enroll1_Failed = 15
+ SPEECH_ERROR_IVW_ENROLL2_SUCESS = 25116, // IvwErr_Enroll2_Success = 16
+ SPEECH_ERROR_IVW_ENROLL2_FAILED = 25117, // IvwErr_Enroll2_Failed = 17
+ SPEECH_ERROR_IVW_ENROLL3_SUCESS = 25118, // IvwErr_Enroll3_Success = 18
+ SPEECH_ERROR_IVW_ENROLL3_FAILED = 25119, // IvwErr_Enroll3_Failed = 19
+ SPEECH_ERROR_IVW_SPEECH_TOO_SHORT = 25120, // IvwErr_SpeechTooShort = 20
+ SPEECH_ERROR_IVW_SPEECH_STOP = 25121, // IvwErr_SpeechStop = 21
+
+ /* ʵʱתд룺26000~26999 */
+ SPEECH_ERROR_LFASR_BASE = 26000, /* ʵʱתд */
+};
+
+#endif /* __MSP_ERRORS_H__ */
\ No newline at end of file
diff --git a/HiveCoreR0/src/voice_control/include/voice_control/msp_types.h b/HiveCoreR0/src/voice_control/include/voice_control/msp_types.h
new file mode 100644
index 0000000..87ff875
--- /dev/null
+++ b/HiveCoreR0/src/voice_control/include/voice_control/msp_types.h
@@ -0,0 +1,123 @@
+#ifndef __MSP_TYPES_H__
+#define __MSP_TYPES_H__
+
+#if !defined(MSPAPI)
+#if defined(WIN32) || defined(WINPHONE8) || defined(WIN8)
+ #define MSPAPI __stdcall
+#else
+ #define MSPAPI
+#endif /* WIN32 */
+#endif /* MSPAPI */
+
+
+/**
+ * MSPSampleStatus indicates how the sample buffer should be handled
+ * MSP_AUDIO_SAMPLE_FIRST - The sample buffer is the start of audio
+ * If recognizer was already recognizing, it will discard
+ * audio received to date and re-start the recognition
+ * MSP_AUDIO_SAMPLE_CONTINUE - The sample buffer is continuing audio
+ * MSP_AUDIO_SAMPLE_LAST - The sample buffer is the end of audio
+ * The recognizer will cease processing audio and
+ * return results
+ * Note that sample statii can be combined; for example, for file-based input
+ * the entire file can be written with SAMPLE_FIRST | SAMPLE_LAST as the
+ * status.
+ * Other flags may be added in future to indicate other special audio
+ * conditions such as the presence of AGC
+ */
+enum
+{
+ MSP_AUDIO_SAMPLE_INIT = 0x00,
+ MSP_AUDIO_SAMPLE_FIRST = 0x01,
+ MSP_AUDIO_SAMPLE_CONTINUE = 0x02,
+ MSP_AUDIO_SAMPLE_LAST = 0x04,
+};
+
+/*
+ * The enumeration MSPRecognizerStatus contains the recognition status
+ * MSP_REC_STATUS_SUCCESS - successful recognition with partial results
+ * MSP_REC_STATUS_NO_MATCH - recognition rejected
+ * MSP_REC_STATUS_INCOMPLETE - recognizer needs more time to compute results
+ * MSP_REC_STATUS_NON_SPEECH_DETECTED - discard status, no more in use
+ * MSP_REC_STATUS_SPEECH_DETECTED - recognizer has detected audio, this is delayed status
+ * MSP_REC_STATUS_COMPLETE - recognizer has return all result
+ * MSP_REC_STATUS_MAX_CPU_TIME - CPU time limit exceeded
+ * MSP_REC_STATUS_MAX_SPEECH - maximum speech length exceeded, partial results may be returned
+ * MSP_REC_STATUS_STOPPED - recognition was stopped
+ * MSP_REC_STATUS_REJECTED - recognizer rejected due to low confidence
+ * MSP_REC_STATUS_NO_SPEECH_FOUND - recognizer still found no audio, this is delayed status
+ */
+enum
+{
+ MSP_REC_STATUS_SUCCESS = 0,
+ MSP_REC_STATUS_NO_MATCH = 1,
+ MSP_REC_STATUS_INCOMPLETE = 2,
+ MSP_REC_STATUS_NON_SPEECH_DETECTED = 3,
+ MSP_REC_STATUS_SPEECH_DETECTED = 4,
+ MSP_REC_STATUS_COMPLETE = 5,
+ MSP_REC_STATUS_MAX_CPU_TIME = 6,
+ MSP_REC_STATUS_MAX_SPEECH = 7,
+ MSP_REC_STATUS_STOPPED = 8,
+ MSP_REC_STATUS_REJECTED = 9,
+ MSP_REC_STATUS_NO_SPEECH_FOUND = 10,
+ MSP_REC_STATUS_FAILURE = MSP_REC_STATUS_NO_MATCH,
+};
+
+/**
+ * The enumeration MSPepState contains the current endpointer state
+ * MSP_EP_LOOKING_FOR_SPEECH - Have not yet found the beginning of speech
+ * MSP_EP_IN_SPEECH - Have found the beginning, but not the end of speech
+ * MSP_EP_AFTER_SPEECH - Have found the beginning and end of speech
+ * MSP_EP_TIMEOUT - Have not found any audio till timeout
+ * MSP_EP_ERROR - The endpointer has encountered a serious error
+ * MSP_EP_MAX_SPEECH - Have arrive the max size of speech
+ */
+enum
+{
+ MSP_EP_LOOKING_FOR_SPEECH = 0,
+ MSP_EP_IN_SPEECH = 1,
+ MSP_EP_AFTER_SPEECH = 3,
+ MSP_EP_TIMEOUT = 4,
+ MSP_EP_ERROR = 5,
+ MSP_EP_MAX_SPEECH = 6,
+ MSP_EP_IDLE = 7 // internal state after stop and before start
+};
+
+/* Synthesizing process flags */
+enum
+{
+ MSP_TTS_FLAG_STILL_HAVE_DATA = 1,
+ MSP_TTS_FLAG_DATA_END = 2,
+ MSP_TTS_FLAG_CMD_CANCELED = 4,
+};
+
+/* Handwriting process flags */
+enum
+{
+ MSP_HCR_DATA_FIRST = 1,
+ MSP_HCR_DATA_CONTINUE = 2,
+ MSP_HCR_DATA_END = 4,
+};
+
+/*ivw message type */
+enum
+{
+ MSP_IVW_MSG_WAKEUP = 1,
+ MSP_IVW_MSG_ERROR = 2,
+ MSP_IVW_MSG_ISR_RESULT = 3,
+ MSP_IVW_MSG_ISR_EPS = 4,
+ MSP_IVW_MSG_VOLUME = 5,
+ MSP_IVW_MSG_ENROLL = 6,
+ MSP_IVW_MSG_RESET = 7
+};
+
+/* Upload data process flags */
+enum
+{
+ MSP_DATA_SAMPLE_INIT = 0x00,
+ MSP_DATA_SAMPLE_FIRST = 0x01,
+ MSP_DATA_SAMPLE_CONTINUE = 0x02,
+ MSP_DATA_SAMPLE_LAST = 0x04,
+};
+
+#endif /* __MSP_TYPES_H__ */
diff --git a/HiveCoreR0/src/voice_control/include/voice_control/qise.h b/HiveCoreR0/src/voice_control/include/voice_control/qise.h
new file mode 100644
index 0000000..75c0eef
--- /dev/null
+++ b/HiveCoreR0/src/voice_control/include/voice_control/qise.h
@@ -0,0 +1,223 @@
+/**
+ * @file qise.h
+ * @brief iFLY Speech Evaluation Header File
+ *
+ * This file contains the quick application programming interface (API) declarations
+ * of evaluation. Developer can include this file in your project to build applications.
+ * For more information, please read the developer guide.
+
+ * Use of this software is subject to certain restrictions and limitations set
+ * forth in a license agreement entered into between iFLYTEK, Co,LTD.
+ * and the licensee of this software. Please refer to the license
+ * agreement for license use rights and restrictions.
+ *
+ * Copyright (C) 1999 - 2012 by ANHUI USTC iFLYTEK, Co,LTD.
+ * All rights reserved.
+ *
+ * @author Speech Dept. iFLYTEK.
+ * @version 1.0
+ * @date 2012/4/16
+ *
+ * @see
+ *
+ * History:
+ *
+ * | Version | Date | Author | Notes |
+ * | 1.0 | 2012/4/16 | MSP40 | Create this file |
+ *
+ *
+ */
+
+#ifndef __MSP_ISE_H__
+#define __MSP_ISE_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* C++ */
+
+#include "msp_types.h"
+
+/**
+ * @fn QISEInit
+ * @brief Initialize API
+ *
+ * Load API module with specified configurations.
+ *
+ * @return int MSPAPI - Return 0 in success, otherwise return error code.
+ * @param const char* configs - [in] Configurations to initialize.
+ * @see
+ */
+/*int MSPAPI QISEInit(const char* configs);
+typedef int (MSPAPI *Proc_QISEInit)(const char* configs);
+#ifdef MSP_WCHAR_SUPPORT
+int MSPAPI QISEInitW(const wchar_t* configs);
+typedef int (MSPAPI *Proc_QISEInitW)(const wchar_t* configs);
+#endif*/
+
+/**
+ * @fn QISESessionBegin
+ * @brief Begin a Evaluation Session
+ *
+ * Create a evaluation session to evaluate audio data
+ *
+ * @return const char* MSPAPI - Return the new session id in success, otherwise return NULL.
+ * @param const char* params - [in] Parameters to create session.
+ * @param const char* userModelId - [in] user model id.
+ * @param int *errorCode - [out] Return 0 in success, otherwise return error code.
+ * @see
+ */
+const char* MSPAPI QISESessionBegin(const char* params, const char* userModelId, int* errorCode);
+typedef const char* (MSPAPI *Proc_QISESessionBegin)(const char* params, const char* userModelID, int *errorCode);
+#ifdef MSP_WCHAR_SUPPORT
+const wchar_t* MSPAPI QISESessionBeginW(const wchar_t* params, const wchar_t* userModelID, int *errorCode);
+typedef const wchar_t* (MSPAPI *Proc_QISESessionBeginW)(const wchar_t* params, const wchar_t* userModelID, int *errorCode);
+#endif
+
+
+
+/**
+ * @fn QISEPaperCheck
+ * @brief Paper Check
+ *
+ * Checking the papaer .
+ *
+ * @return int MSPAPI - Return 0 in success, otherwise return error code.
+ * @param void *data - [in] Text buffer.
+ * @param unsigned int* dataLen - [in] Text length in bytes,[out] Length of result returned
+ * @param const char* params - [in] Parameters describing the text.
+ * @see
+ */
+const char* MSPAPI QISEPaperCheck(void *data, unsigned int * dataLen, const char *params, int *errorCode );
+
+
+/**
+ * @fn QISETextPut
+ * @brief Put Text
+ *
+ * Writing text string to evaluator.
+ *
+ * @return int MSPAPI - Return 0 in success, otherwise return error code.
+ * @param const char* sessionID - [in] The session id returned by QISESessionBegin.
+ * @param const char* textString - [in] Text buffer.
+ * @param unsigned int textLen - [in] Text length in bytes.
+ * @param const char* params - [in] Parameters describing the text.
+ * @see
+ */
+int MSPAPI QISETextPut(const char* sessionID, const char* textString, unsigned int textLen, const char* params);
+typedef int (MSPAPI *Proc_QISETextPut)(const char* sessionID, const char* textString, unsigned int textLen, const char* params);
+#ifdef MSP_WCHAR_SUPPORT
+int MSPAPI QISETextPutW(const wchar_t* sessionID, const wchar_t* textString, unsigned int textLen, const wchar_t* params);
+typedef int (MSPAPI *Proc_QISETextPutW)(const wchar_t* sessionID, const wchar_t* textString, unsigned int textLen, const wchar_t* params);
+#endif
+
+/**
+ * @fn QISEAudioWrite
+ * @brief Write Audio
+ *
+ * Writing binary audio data to evaluator.
+ *
+ * @return int MSPAPI - Return 0 in success, otherwise return error code.
+ * @param const char* sessionID - [in] The session id returned by QISESessionBegin.
+ * @param const void* waveData - [in] Audio data to write.
+ * @param unsigned int waveLen - [in] Audio length in bytes.
+ * @param int audioStatus - [in] Audio status.
+ * @param int *epStatus - [out] EP or vad status.
+ * @param int *evlStatus - [out] Status of evaluation result, 0: success, 1: no match, 2: incomplete, 5:speech complete.
+ * @see
+ */
+int MSPAPI QISEAudioWrite(const char* sessionID, const void* waveData, unsigned int waveLen, int audioStatus, int *epStatus, int *Status);
+typedef int (MSPAPI *Proc_QISEAudioWrite)(const char* sessionID, const void* waveData, unsigned int waveLen, int audioStatus, int *epStatus, int *recogStatus);
+#ifdef MSP_WCHAR_SUPPORT
+int MSPAPI QISEAudioWriteW(const wchar_t* sessionID, const void* waveData, unsigned int waveLen, int audioStatus, int *epStatus, int *evlStatus);
+typedef int (MSPAPI *Proc_QISEAudioWriteW)(const wchar_t* sessionID, const void* waveData, unsigned int waveLen, int audioStatus, int *epStatus, int *evlStatus);
+#endif
+
+/**
+ * @fn QISEGetResult
+ * @brief Get Evaluation Result
+ *
+ * Get evaluation result.
+ *
+ * @return int MSPAPI - Return 0 in success, otherwise return error code.
+ * @param const char* sessionID - [in] The session id returned by QISESessionBegin.
+ * @param int* rsltLen - [out] Length of result returned.
+ * @param int* rsltStatus - [out] Status of evaluation result returned.
+ * @param int* errorCode - [out] Return 0 in success, otherwise return error code.
+ * @see
+ */
+const char * MSPAPI QISEGetResult(const char* sessionID, unsigned int* rsltLen, int* rsltStatus, int *errorCode);
+typedef const char * (MSPAPI *Proc_QISEGetResult)(const char* sessionID, unsigned int* rsltLen, int* rsltStatus, int *errorCode);
+#ifdef MSP_WCHAR_SUPPORT
+const wchar_t* MSPAPI QISEGetResultW(const wchar_t* sessionID, int* rsltLen, unsigned int* rsltStatus, int *errorCode);
+typedef const wchar_t* (MSPAPI *Proc_QISEGetResultW)(const wchar_t* sessionID, unsigned int* rsltLen, int* rsltStatus, int *errorCode);
+#endif
+
+/**
+ * @fn QISEResultInfo
+ * @brief Get Result Info
+ *
+ * Get info of evaluation result.
+ *
+ * @return const char * - The session id returned by QISESessionBegin.
+ * @param const char* sessionID - [in] session id returned by QISESessionBegin.
+ * @see
+ */
+const char* MSPAPI QISEResultInfo(const char* sessionID, int *errorCode);
+typedef const char* (MSPAPI *Proc_QISEResultInfo)(const char* sessionID, int *errorCode);
+#ifdef MSP_WCHAR_SUPPORT
+const wchar_t* MSPAPI QISEResultInfoW(const wchar_t* sessionID, int *errorCode);
+typedef const wchar_t* (MSPAPI *Proc_QISEResultInfoW)(const wchar_t* sessionID, int *errorCode);
+#endif
+
+/**
+ * @fn QISESessionEnd
+ * @brief End a ISR Session
+ *
+ * End a evaluation session, release all resource.
+ *
+ * @return int MSPAPI - Return 0 in success, otherwise return error code.
+ * @param const char* sessionID - [in] The session id returned by QISESessionBegin.
+ * @param const char* hints - [in] Reason to end current session.
+ * @see
+ */
+int MSPAPI QISESessionEnd(const char* sessionID, const char* hints);
+typedef int (MSPAPI *Proc_QISESessionEnd)(const char* sessionID, const char* hints);
+#ifdef MSP_WCHAR_SUPPORT
+int MSPAPI QISESessionEndW(const wchar_t* sessionID, const wchar_t* hints);
+typedef int (MSPAPI *Proc_QISESessionEndW)(const wchar_t* sessionID, const wchar_t* hints);
+#endif
+
+/**
+ * @fn QISEGetParam
+ * @brief get params related with msc
+ *
+ * the params could be local or server param, we only support netflow params "upflow" & "downflow" now
+ *
+ * @return int MSPAPI - Return 0 in success, otherwise return error code.
+ * @param const char* sessionID - [in] session id of related param, set NULL to got global param
+ * @param const char* paramName - [in] param name,could pass more than one param splited by ',' ';' or '\n'.
+ * @param const char* paramValue - [in] param value buffer, malloced by user.
+ * @param int *valueLen - [in, out] in: length of value buffer, out: length of value string.
+ * @see
+ */
+int MSPAPI QISEGetParam(const char* sessionID, const char* paramName, char* paramValue, unsigned int* valueLen);
+typedef int (MSPAPI *Proc_QISEGetParam)(const char* sessionID, const char* paramName, char* paramValue, unsigned int* valueLen);
+#ifdef MSP_WCHAR_SUPPORT
+int MSPAPI QISEGetParamW(const wchar_t* sessionID, const wchar_t* paramName, wchar_t* paramValue, unsigned int* valueLen);
+typedef int (MSPAPI *Proc_QISEGetParamW)(const wchar_t* sessionID, const wchar_t* paramName, wchar_t* paramValue, unsigned int* valueLen);
+#endif
+
+/*
+//
+// typedef void ( MSPAPI *recog_result_ntf_handler)( const char *sessionID, const char *result, int resultLen, int resultStatus, void *userData );
+// typedef void ( MSPAPI *status_ntf_handler)( const char *sessionID, int type, int status, const void *param1, const void *param2, void *userData);
+// typedef void ( MSPAPI *error_ntf_handler)(const char *sessionID, int errorCode, const char *detail, void *userData);
+// int MSPAPI QISRRegisterNotify(const char *sessionID, recog_result_ntf_handler rsltCb, status_ntf_handler statusCb, error_ntf_handler errCb, void *userData);
+*/
+
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif /* C++ */
+
+#endif /* __MSP_ISE_H__ */
diff --git a/HiveCoreR0/src/voice_control/include/voice_control/qisr.h b/HiveCoreR0/src/voice_control/include/voice_control/qisr.h
new file mode 100644
index 0000000..082ec73
--- /dev/null
+++ b/HiveCoreR0/src/voice_control/include/voice_control/qisr.h
@@ -0,0 +1,203 @@
+/**
+ * @file qisr.h
+ * @brief iFLY Speech Recognizer Header File
+ *
+ * This file contains the quick application programming interface (API) declarations
+ * of ISR. Developer can include this file in your project to build applications.
+ * For more information, please read the developer guide.
+
+ * Use of this software is subject to certain restrictions and limitations set
+ * forth in a license agreement entered into between iFLYTEK, Co,LTD.
+ * and the licensee of this software. Please refer to the license
+ * agreement for license use rights and restrictions.
+ *
+ * Copyright (C) 1999 - 2007 by ANHUI USTC iFLYTEK, Co,LTD.
+ * All rights reserved.
+ *
+ * @author Speech Dept. iFLYTEK.
+ * @version 1.0
+ * @date 2008/12/12
+ *
+ * @see
+ *
+ * History:
+ * index version date author notes
+ * 0 1.0 2008/12/12 Speech Create this file
+ */
+
+#ifndef __QISR_H__
+#define __QISR_H__
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* C++ */
+
+#include "msp_types.h"
+
+/**
+ * @fn QISRSessionBegin
+ * @brief Begin a Recognizer Session
+ *
+ * Create a recognizer session to recognize audio data
+ *
+ * @return return sessionID of current session, NULL is failed.
+ * @param const char* grammarList - [in] grammars list, inline grammar support only one.
+ * @param const char* params - [in] parameters when the session created.
+ * @param int *errorCode - [out] return 0 on success, otherwise return error code.
+ * @see
+ */
+const char* MSPAPI QISRSessionBegin(const char* grammarList, const char* params, int* errorCode);
+typedef const char* (MSPAPI *Proc_QISRSessionBegin)(const char* grammarList, const char* params, int *result);
+#ifdef MSP_WCHAR_SUPPORT
+const wchar_t* MSPAPI QISRSessionBeginW(const wchar_t* grammarList, const wchar_t* params, int *result);
+typedef const wchar_t* (MSPAPI *Proc_QISRSessionBeginW)(const wchar_t* grammarList, const wchar_t* params, int *result);
+#endif
+
+
+/**
+ * @fn QISRAudioWrite
+ * @brief Write Audio Data to Recognizer Session
+ *
+ * Writing binary audio data to recognizer.
+ *
+ * @return int MSPAPI - Return 0 in success, otherwise return error code.
+ * @param const char* sessionID - [in] The session id returned by recog_begin
+ * @param const void* waveData - [in] Binary data of waveform
+ * @param unsigned int waveLen - [in] Waveform data size in bytes
+ * @param int audioStatus - [in] Audio status, can be
+ * @param int *epStatus - [out] ISRepState
+ * @param int *recogStatus - [out] ISRrecRecognizerStatus, see isr_rec.h
+ * @see
+ */
+int MSPAPI QISRAudioWrite(const char* sessionID, const void* waveData, unsigned int waveLen, int audioStatus, int *epStatus, int *recogStatus);
+typedef int (MSPAPI *Proc_QISRAudioWrite)(const char* sessionID, const void* waveData, unsigned int waveLen, int audioStatus, int *epStatus, int *recogStatus);
+#ifdef MSP_WCHAR_SUPPORT
+int MSPAPI QISRAudioWriteW(const wchar_t* sessionID, const void* waveData, unsigned int waveLen, int audioStatus, int *epStatus, int *recogStatus);
+typedef int (MSPAPI *Proc_QISRAudioWriteW)(const wchar_t* sessionID, const void* waveData, unsigned int waveLen, int audioStatus, int *epStatus, int *recogStatus);
+#endif
+
+/**
+ * @fn QISRGetResult
+ * @brief Get Recognize Result in Specified Format
+ *
+ * Get recognize result in Specified format.
+ *
+ * @return int MSPAPI - Return 0 in success, otherwise return error code.
+ * @param const char* sessionID - [in] session id returned by session begin
+ * @param int* rsltStatus - [out] status of recognition result, 0: success, 1: no match, 2: incomplete, 5:speech complete
+ * @param int *errorCode - [out] return 0 on success, otherwise return error code.
+ * @see
+ */
+const char * MSPAPI QISRGetResult(const char* sessionID, int* rsltStatus, int waitTime, int *errorCode);
+typedef const char * (MSPAPI *Proc_QISRGetResult)(const char* sessionID, int* rsltStatus, int waitTime, int *errorCode);
+#ifdef MSP_WCHAR_SUPPORT
+const wchar_t* MSPAPI QISRGetResultW(const wchar_t* sessionID, int* rsltStatus, int waitTime, int *errorCode);
+typedef const wchar_t* (MSPAPI *Proc_QISRGetResultW)(const wchar_t* sessionID, int* rsltStatus, int waitTime, int *errorCode);
+#endif
+
+/**
+ * @fn QISRGetBinaryResult
+ * @brief Get Recognize Result in Specified Format
+ *
+ * Get recognize result in Specified format.
+ *
+ * @return int MSPAPI - Return 0 in success, otherwise return error code.
+ * @param const char* sessionID - [in] session id returned by session begin
+ * @param int* rsltStatus - [out] status of recognition result, 0: success, 1: no match, 2: incomplete, 5:speech complete
+ * @param int *errorCode - [out] return 0 on success, otherwise return error code.
+ * @see
+ */
+const char * MSPAPI QISRGetBinaryResult(const char* sessionID, unsigned int* rsltLen,int* rsltStatus, int waitTime, int *errorCode);
+typedef const char * (MSPAPI *Proc_QISRGetBinaryResult)(const char* sessionID, unsigned int* rsltLen, int* rsltStatus, int waitTime, int *errorCode);
+#ifdef MSP_WCHAR_SUPPORT
+const wchar_t* MSPAPI QISRGetBinaryResultW(const wchar_t* sessionID, unsigned int* rsltLen, int* rsltStatus, int waitTime, int *errorCode);
+typedef const wchar_t* (MSPAPI *Proc_QISRGetBinaryResultW)(const wchar_t* sessionID, unsigned int* rsltLen, int* rsltStatus, int waitTime, int *errorCode);
+#endif
+
+
+/**
+ * @fn QISRSessionEnd
+ * @brief End a Recognizer Session
+ *
+ * End the recognizer session, release all resource.
+ *
+ * @return int MSPAPI - Return 0 in success, otherwise return error code.
+ * @param const char* sessionID - [in] session id string to end
+ * @param const char* hints - [in] user hints to end session, hints will be logged to CallLog
+ * @see
+ */
+int MSPAPI QISRSessionEnd(const char* sessionID, const char* hints);
+typedef int (MSPAPI *Proc_QISRSessionEnd)(const char* sessionID, const char* hints);
+#ifdef MSP_WCHAR_SUPPORT
+int MSPAPI QISRSessionEndW(const wchar_t* sessionID, const wchar_t* hints);
+typedef int (MSPAPI *Proc_QISRSessionEndW)(const wchar_t* sessionID, const wchar_t* hints);
+#endif
+
+/**
+ * @fn QISRGetParam
+ * @brief get params related with msc
+ *
+ * the params could be local or server param, we only support netflow params "upflow" & "downflow" now
+ *
+ * @return int - Return 0 if success, otherwise return errcode.
+ * @param const char* sessionID - [in] session id of related param, set NULL to got global param
+ * @param const char* paramName - [in] param name,could pass more than one param split by ','';'or'\n'
+ * @param const char* paramValue - [in] param value buffer, malloced by user
+ * @param int *valueLen - [in, out] pass in length of value buffer, and return length of value string
+ * @see
+ */
+int MSPAPI QISRGetParam(const char* sessionID, const char* paramName, char* paramValue, unsigned int* valueLen);
+typedef int (MSPAPI *Proc_QISRGetParam)(const char* sessionID, const char* paramName, char* paramValue, unsigned int* valueLen);
+#ifdef MSP_WCHAR_SUPPORT
+int MSPAPI QISRGetParamW(const wchar_t* sessionID, const wchar_t* paramName, wchar_t* paramValue, unsigned int* valueLen);
+typedef int (MSPAPI *Proc_QISRGetParamW)(const wchar_t* sessionID, const wchar_t* paramName, wchar_t* paramValue, unsigned int* valueLen);
+#endif
+
+/**
+ * @fn QISRSetParam
+ * @brief get params related with msc
+ *
+ * the params could be local or server param, we only support netflow params "upflow" & "downflow" now
+ *
+ * @return int - Return 0 if success, otherwise return errcode.
+ * @param const char* sessionID - [in] session id of related param, set NULL to got global param
+ * @param const char* paramName - [in] param name,could pass more than one param split by ','';'or'\n'
+ * @param const char* paramValue - [in] param value buffer, malloced by user
+ * @param int *valueLen - [in, out] pass in length of value buffer, and return length of value string
+ * @see
+ */
+int MSPAPI QISRSetParam(const char* sessionID, const char* paramName, const char* paramValue);
+typedef int (MSPAPI *Proc_QISRSetParam)(const char* sessionID, const char* paramName, const char* paramValue);
+#ifdef MSP_WCHAR_SUPPORT
+int MSPAPI QISRSetParamW(const wchar_t* sessionID, const wchar_t* paramName, const wchar_t* paramValue);
+typedef int (MSPAPI *Proc_QISRSetParamW)(const wchar_t* sessionID, const wchar_t* paramName, const wchar_t* paramValue);
+#endif
+
+
+typedef void ( *recog_result_ntf_handler)( const char *sessionID, const char *result, int resultLen, int resultStatus, void *userData );
+typedef void ( *recog_status_ntf_handler)( const char *sessionID, int type, int status, int param1, const void *param2, void *userData);
+typedef void ( *recog_error_ntf_handler)(const char *sessionID, int errorCode, const char *detail, void *userData);
+int MSPAPI QISRRegisterNotify(const char *sessionID, recog_result_ntf_handler rsltCb, recog_status_ntf_handler statusCb, recog_error_ntf_handler errCb, void *userData);
+
+typedef int ( *UserCallBack)( int, const char*, void*);
+typedef int ( *GrammarCallBack)( int, const char*, void*);
+typedef int ( *LexiconCallBack)( int, const char*, void*);
+
+int MSPAPI QISRBuildGrammar(const char *grammarType, const char *grammarContent, unsigned int grammarLength, const char *params, GrammarCallBack callback, void *userData);
+typedef int (MSPAPI *Proc_QISRBuildGrammar)(const char *grammarType, const char *grammarContent, unsigned int grammarLength, const char *params, GrammarCallBack callback, void *userData);
+#ifdef MSP_WCHAR_SUPPORT
+int MSPAPI QISRBuildGrammarW(const wchar_t *grmmarType, const wchar_t *grammarContent, unsigned int grammarLength, const wchar_t *params, GrammarCallBack callback, void *userData);
+typedef int (MSPAPI *Proc_QISRBuildGrammarW)(const wchar_t *grmmarType, const wchar_t *grammarContent, unsigned int grammarLength, const wchar_t *params, GrammarCallBack callback, void *userData);
+#endif
+
+int MSPAPI QISRUpdateLexicon(const char *lexiconName, const char *lexiconContent, unsigned int lexiconLength, const char *params, LexiconCallBack callback, void *userData);
+typedef int (MSPAPI *Proc_QISRUpdataLexicon)(const char *lexiconName, const char *lexiconContent, unsigned int lexiconLength, const char *params, LexiconCallBack callback, void *userData);
+#ifdef MSP_WCHAR_SUPPORT
+int MSPAPI QISRUpdateLexiconW(const wchar_t *lexiconName, const wchar_t *lexiconContent, unsigned int lexiconLength, const wchar_t *params, LexiconCallBack callback, void *userData);
+typedef int (MSPAPI Proc_QISRUpdateLexiconW)(const wchar_t *lexiconName, const wchar_t *lexiconContent, unsigned int lexiconLength, const wchar_t *params, LexiconCallBack callback, void *userData);
+#endif
+#ifdef __cplusplus
+} /* extern "C" */
+#endif /* C++ */
+
+#endif /* __QISR_H__ */
diff --git a/HiveCoreR0/src/voice_control/include/voice_control/qtts.h b/HiveCoreR0/src/voice_control/include/voice_control/qtts.h
new file mode 100644
index 0000000..eee6cda
--- /dev/null
+++ b/HiveCoreR0/src/voice_control/include/voice_control/qtts.h
@@ -0,0 +1,187 @@
+/**
+ * @file qtts.h
+ * @brief iFLY Speech Synthesizer Header File
+ *
+ * This file contains the quick application programming interface (API) declarations
+ * of TTS. Developer can include this file in your project to build applications.
+ * For more information, please read the developer guide.
+
+ * Use of this software is subject to certain restrictions and limitations set
+ * forth in a license agreement entered into between iFLYTEK, Co,LTD.
+ * and the licensee of this software. Please refer to the license
+ * agreement for license use rights and restrictions.
+ *
+ * Copyright (C) 1999 - 2009 by ANHUI USTC iFLYTEK, Co,LTD.
+ * All rights reserved.
+ *
+ * @author Speech Dept.
+ * @version 1.0
+ * @date 2009/11/26
+ *
+ * @see
+ *
+ * History:
+ *
+ * | Version | Date | Author | Notes |
+ * | 1.0 | 2009/11/26 | Speech | Create this file |
+ *
+ *
+ */
+#ifndef __QTTS_H__
+#define __QTTS_H__
+
+#if !defined(MSPAPI)
+#if defined(WIN32)
+ #define MSPAPI __stdcall
+#else
+ #define MSPAPI
+#endif /* WIN32 */
+#endif /* MSPAPI */
+
+#ifdef __cplusplus
+extern "C" {
+#endif /* C++ */
+
+#include "msp_types.h"
+
+/**
+ * @fn QTTSSessionBegin
+ * @brief Begin a TTS Session
+ *
+ * Create a tts session to synthesize data.
+ *
+ * @return const char* - Return the new session id in success, otherwise return NULL, error code.
+ * @param const char* params - [in] parameters when the session created.
+ * @param const char** sessionID - [out] return a string to this session.
+ * @see
+ */
+const char* MSPAPI QTTSSessionBegin(const char* params, int* errorCode);
+typedef const char* (MSPAPI *Proc_QTTSSessionBegin)(const char* params, int* errorCode);
+#ifdef MSP_WCHAR_SUPPORT
+const wchar_t* MSPAPI QTTSSessionBeginW(const wchar_t* params, int* errorCode);
+typedef const wchar_t* (MSPAPI *Proc_QTTSSessionBeginW)(const wchar_t* params, int* errorCode);
+#endif
+
+/**
+ * @fn QTTSTextPut
+ * @brief Put Text Buffer to TTS Session
+ *
+ * Writing text string to synthesizer.
+ *
+ * @return int MSPAPI - Return 0 in success, otherwise return error code.
+ * @param const char* sessionID - [in] The session id returned by sesson begin
+ * @param const char* textString - [in] text buffer
+ * @param unsigned int textLen - [in] text size in bytes
+ * @see
+ */
+int MSPAPI QTTSTextPut(const char* sessionID, const char* textString, unsigned int textLen, const char* params);
+typedef int (MSPAPI *Proc_QTTSTextPut)(const char* sessionID, const char* textString, unsigned int textLen, const char* params);
+#ifdef MSP_WCHAR_SUPPORT
+int MSPAPI QTTSTextPutW(const wchar_t* sessionID, const wchar_t* textString, unsigned int textLen, const wchar_t* params);
+typedef int (MSPAPI *Proc_QTTSTextPutW)(const wchar_t* sessionID, const wchar_t* textString, unsigned int textLen, const wchar_t* params);
+#endif
+
+/**
+ * @fn QTTSAudioGet
+ * @brief Synthesize text to audio
+ *
+ * Synthesize text to audio, and return audio information.
+ *
+ * @return const void* - Return current synthesized audio data buffer, size returned by QTTSTextSynth.
+ * @param const char* sessionID - [in] session id returned by session begin
+ * @param unsigned int* audioLen - [out] synthesized audio size in bytes
+ * @param int* synthStatus - [out] synthesizing status
+ * @param int* errorCode - [out] error code if failed, 0 to success.
+ * @see
+ */
+const void* MSPAPI QTTSAudioGet(const char* sessionID, unsigned int* audioLen, int* synthStatus, int* errorCode);
+typedef const void* (MSPAPI *Proc_QTTSAudioGet)(const char* sessionID, unsigned int* audioLen, int* synthStatus, int* errorCode);
+#ifdef MSP_WCHAR_SUPPORT
+const void* MSPAPI QTTSAudioGetW(const wchar_t* sessionID, unsigned int* audioLen, int* synthStatus, int* errorCode);
+typedef const void* (MSPAPI *Proc_QTTSAudioGetW)(const wchar_t* sessionID, unsigned int* audioLen, int* synthStatus, int* errorCode);
+#endif
+
+/**
+ * @fn QTTSAudioInfo
+ * @brief Get Synthesized Audio information
+ *
+ * Get synthesized audio data information.
+ *
+ * @return const char * - Return audio info string.
+ * @param const char* sessionID - [in] session id returned by session begin
+ * @see
+ */
+const char* MSPAPI QTTSAudioInfo(const char* sessionID);
+typedef const char* (MSPAPI *Proc_QTTSAudioInfo)(const char* sessionID);
+#ifdef MSP_WCHAR_SUPPORT
+const wchar_t* MSPAPI QTTSAudioInfoW(const wchar_t* sessionID);
+typedef const wchar_t* (MSPAPI *Proc_QTTSAudioInfoW)(const wchar_t* sessionID);
+#endif
+
+/**
+ * @fn QTTSSessionEnd
+ * @brief End a Recognizer Session
+ *
+ * End the recognizer session, release all resource.
+ *
+ * @return int MSPAPI - Return 0 in success, otherwise return error code.
+ * @param const char* session_id - [in] session id string to end
+ * @param const char* hints - [in] user hints to end session, hints will be logged to CallLog
+ * @see
+ */
+int MSPAPI QTTSSessionEnd(const char* sessionID, const char* hints);
+typedef int (MSPAPI *Proc_QTTSSessionEnd)(const char* sessionID, const char* hints);
+#ifdef MSP_WCHAR_SUPPORT
+int MSPAPI QTTSSessionEndW(const wchar_t* sessionID, const wchar_t* hints);
+typedef int (MSPAPI *Proc_QTTSSessionEndW)(const wchar_t* sessionID, const wchar_t* hints);
+#endif
+
+/**
+ * @fn QTTSGetParam
+ * @brief get params related with msc
+ *
+ * the params could be local or server param, we only support netflow params "upflow" & "downflow" now
+ *
+ * @return int - Return 0 if success, otherwise return errcode.
+ * @param const char* sessionID - [in] session id of related param, set NULL to got global param
+ * @param const char* paramName - [in] param name,could pass more than one param split by ','';'or'\n'
+ * @param const char* paramValue - [in] param value buffer, malloced by user
+ * @param int *valueLen - [in, out] pass in length of value buffer, and return length of value string
+ * @see
+ */
+int MSPAPI QTTSGetParam(const char* sessionID, const char* paramName, char* paramValue, unsigned int* valueLen);
+typedef int (MSPAPI *Proc_QTTSGetParam)(const char* sessionID, const char* paramName, char* paramValue, unsigned int* valueLen);
+#ifdef MSP_WCHAR_SUPPORT
+int MSPAPI QTTSGetParamW(const wchar_t* sessionID, const wchar_t* paramName, wchar_t* paramValue, unsigned int* valueLen);
+typedef int (MSPAPI *Proc_QTTSGetParamW)(const wchar_t* sessionID, const wchar_t* paramName, wchar_t* paramValue, unsigned int* valueLen);
+#endif
+
+/**
+ * @fn QTTSSetParam
+ * @brief set params related with msc
+ *
+ * the params could be local or server param, we only support netflow params "upflow" & "downflow" now
+ *
+ * @return int - Return 0 if success, otherwise return errcode.
+ * @param const char* sessionID - [in] session id of related param, set NULL to got global param
+ * @param const char* paramName - [in] param name,could pass more than one param split by ','';'or'\n'
+ * @param const char* paramValue - [in] param value buffer, malloced by user
+ * @see
+ */
+int MSPAPI QTTSSetParam(const char *sessionID, const char *paramName, const char *paramValue);
+typedef int (MSPAPI *Proc_QTTSSetParam)(const char* sessionID, const char* paramName, char* paramValue);
+#ifdef MSP_WCHAR_SUPPORT
+int MSPAPI QTTSSetParamW(const wchar_t* sessionID, const wchar_t* paramName, wchar_t* paramValue);
+typedef int (MSPAPI *Proc_QTTSSetParamW)(const wchar_t* sessionID, const wchar_t* paramName, wchar_t* paramValue);
+#endif
+
+typedef void ( *tts_result_ntf_handler)( const char *sessionID, const char *audio, int audioLen, int synthStatus, int ced, const char *audioInfo, int audioInfoLen, void *userData );
+typedef void ( *tts_status_ntf_handler)( const char *sessionID, int type, int status, int param1, const void *param2, void *userData);
+typedef void ( *tts_error_ntf_handler)(const char *sessionID, int errorCode, const char *detail, void *userData);
+int MSPAPI QTTSRegisterNotify(const char *sessionID, tts_result_ntf_handler rsltCb, tts_status_ntf_handler statusCb, tts_error_ntf_handler errCb, void *userData);
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif /* C++ */
+
+#endif /* __QTTS_H__ */
diff --git a/HiveCoreR0/src/voice_control/include/voice_control/speech_recognizer.h b/HiveCoreR0/src/voice_control/include/voice_control/speech_recognizer.h
new file mode 100644
index 0000000..6ec2b3d
--- /dev/null
+++ b/HiveCoreR0/src/voice_control/include/voice_control/speech_recognizer.h
@@ -0,0 +1,63 @@
+/*
+@file
+@brief ¼ӿںѶMSCӿڷװһMIC¼ʶģ
+
+@author taozhang9
+@date 2016/05/27
+*/
+
+
+enum sr_audsrc
+{
+ SR_MIC, /* write data from mic */
+ SR_USER /* write data from user by calling API */
+};
+
+//#define DEFAULT_INPUT_DEVID (-1)
+
+
+#define E_SR_NOACTIVEDEVICE 1
+#define E_SR_NOMEM 2
+#define E_SR_INVAL 3
+#define E_SR_RECORDFAIL 4
+#define E_SR_ALREADY 5
+
+
+struct speech_rec_notifier {
+ void (*on_result)(const char *result, char is_last);
+ void (*on_speech_begin)();
+ void (*on_speech_end)(int reason); /* 0 if VAD. others, error : see E_SR_xxx and msp_errors.h */
+};
+
+#define END_REASON_VAD_DETECT 0 /* detected speech done */
+
+struct speech_rec {
+ enum sr_audsrc aud_src; /* from mic or manual stream write */
+ struct speech_rec_notifier notif;
+ const char * session_id;
+ int ep_stat;
+ int rec_stat;
+ int audio_status;
+ struct recorder *recorder;
+ volatile int state;
+ char * session_begin_params;
+};
+
+
+#ifdef __cplusplus
+extern "C" {
+#endif
+
+/* must init before start . is aud_src is SR_MIC, the default capture device
+ * will be used. see sr_init_ex */
+int sr_init(struct speech_rec * sr, const char * session_begin_params, enum sr_audsrc aud_src, struct speech_rec_notifier * notifier);
+int sr_start_listening(struct speech_rec *sr);
+int sr_stop_listening(struct speech_rec *sr);
+/* only used for the manual write way. */
+int sr_write_audio_data(struct speech_rec *sr, char *data, unsigned int len);
+/* must call uninit after you don't use it */
+void sr_uninit(struct speech_rec * sr);
+
+#ifdef __cplusplus
+} /* extern "C" */
+#endif /* C++ */
diff --git a/HiveCoreR0/src/voice_control/launch/voice_control.launch.py b/HiveCoreR0/src/voice_control/launch/voice_control.launch.py
new file mode 100644
index 0000000..611946a
--- /dev/null
+++ b/HiveCoreR0/src/voice_control/launch/voice_control.launch.py
@@ -0,0 +1,13 @@
+from launch import LaunchDescription
+from launch_ros.actions import Node
+
+def generate_launch_description():
+
+ return LaunchDescription([
+ Node(
+ package='voice_control',
+ executable='iat_publish',
+ name='iat_publish',
+ output='screen'
+ )
+ ])
diff --git a/HiveCoreR0/src/voice_control/libs/libmsc.so b/HiveCoreR0/src/voice_control/libs/libmsc.so
new file mode 100644
index 0000000..27348f9
Binary files /dev/null and b/HiveCoreR0/src/voice_control/libs/libmsc.so differ
diff --git a/HiveCoreR0/src/voice_control/package.xml b/HiveCoreR0/src/voice_control/package.xml
new file mode 100644
index 0000000..ac15035
--- /dev/null
+++ b/HiveCoreR0/src/voice_control/package.xml
@@ -0,0 +1,23 @@
+
+
+
+ voice_control
+ 0.0.0
+ 语音控制功能包
+ Your Name
+ Apache-2.0
+
+ ament_cmake
+
+
+ rclcpp
+ std_msgs
+
+
+ ament_cmake
+
+
+ ament_cmake
+
+
+
\ No newline at end of file
diff --git a/HiveCoreR0/src/voice_control/src/iat_publish.cpp b/HiveCoreR0/src/voice_control/src/iat_publish.cpp
new file mode 100644
index 0000000..6739335
--- /dev/null
+++ b/HiveCoreR0/src/voice_control/src/iat_publish.cpp
@@ -0,0 +1,153 @@
+/*
+* 语音听写(iFly Auto Transform)技术能够实时地将语音转换成对应的文字。
+*/
+#include
+#include
+#include
+#include
+#include "voice_control/qisr.h"
+#include "voice_control/msp_cmn.h"
+#include "voice_control/msp_errors.h"
+#include "voice_control/speech_recognizer.h"
+
+#include "rclcpp/rclcpp.hpp"
+#include "std_msgs/msg/string.hpp"
+
+// 全局标志和结果变量
+std::atomic resultFlag(false);
+std::string g_result;
+
+
+// 科大讯飞语音识别回调函数
+void on_result(const char *result, char is_last)
+{
+ if (result != nullptr) {
+ g_result += result;
+ resultFlag = true;
+ }
+}
+
+void on_speech_begin()
+{
+ RCLCPP_INFO(rclcpp::get_logger("voice_recognition"), "开始说话...");
+}
+
+void on_speech_end(int reason)
+{
+ if (reason == END_REASON_VAD_DETECT) {
+ RCLCPP_INFO(rclcpp::get_logger("voice_recognition"), "说话结束");
+ } else {
+ RCLCPP_WARN(rclcpp::get_logger("voice_recognition"), "说话结束,原因: %d", reason);
+ }
+}
+
+
+/* demo recognize the audio from microphone */
+static void demo_mic(const char* session_begin_params)
+{
+ int errcode;
+ int i = 0;
+
+ struct speech_rec iat;
+
+ struct speech_rec_notifier recnotifier = {
+ on_result,
+ on_speech_begin,
+ on_speech_end
+ };
+
+ errcode = sr_init(&iat, session_begin_params, SR_MIC, &recnotifier);
+ if (errcode) {
+ printf("speech recognizer init failed\n");
+ return;
+ }
+ errcode = sr_start_listening(&iat);
+ if (errcode) {
+ printf("start listen failed %d\n", errcode);
+ }
+ /* demo 8 seconds recording */
+ while(i++ < 8)
+ sleep(1);
+ errcode = sr_stop_listening(&iat);
+ if (errcode) {
+ printf("stop listening failed %d\n", errcode);
+ }
+
+ sr_uninit(&iat);
+}
+
+void WakeUp(const std_msgs::msg::String::ConstPtr& msg)
+{
+ printf("waking up\r\n");
+ usleep(700*1000);
+}
+
+/* main thread: start/stop record ; query the result of recgonization.
+ * record thread: record callback(data write)
+ * helper thread: ui(keystroke detection)
+ */
+int main(int argc, char* argv[])
+{
+ // 初始化ROS 2
+ rclcpp::init(argc, argv);
+ auto node = rclcpp::Node::make_shared("voice_recognition");
+
+ // 设置循环频率
+ rclcpp::Rate loop_rate(10);
+
+ // 发布语音识别结果
+ auto voiceWordsPub = node->create_publisher("voiceWords", 1000);
+
+ RCLCPP_INFO(node->get_logger(), "Sleeping...");
+
+ int ret = MSP_SUCCESS;
+ /* login params, please do keep the appid correct */
+ const char* login_params = "appid = 4d9c997f, work_dir = .";
+ int aud_src = 0; /* from mic or file */
+
+ /*
+ * See "iFlytek MSC Reference Manual"
+ */
+ const char* session_begin_params =
+ "sub = iat, domain = iat, language = zh_cn, "
+ "accent = mandarin, sample_rate = 16000, "
+ "result_type = plain, result_encoding = utf8";
+
+ /* Login first. the 1st arg is username, the 2nd arg is password
+ * just set them as NULL. the 3rd arg is login paramertes
+ * */
+ ret = MSPLogin(NULL, NULL, login_params);
+ if (MSP_SUCCESS != ret) {
+ printf("MSPLogin failed , Error code %d.\n",ret);
+ return -1; // 登录失败,退出程序
+ }
+
+ while (rclcpp::ok())
+ {
+ // 语音识别唤醒
+ RCLCPP_INFO(node->get_logger(), "开始从麦克风识别语音");
+ RCLCPP_INFO(node->get_logger(), "8秒内请说话...");
+
+ demo_mic(session_begin_params);
+
+ RCLCPP_INFO(node->get_logger(), "8秒已过");
+
+ // 语音识别完成,发布结果
+ if (resultFlag) {
+ resultFlag = false;
+ auto msg = std_msgs::msg::String();
+ msg.data = g_result;
+ voiceWordsPub->publish(msg);
+ RCLCPP_INFO(node->get_logger(), "发布识别结果: %s", msg.data.c_str());
+ g_result.clear(); // 清空结果,准备下一次识别
+ }
+
+ rclcpp::spin_some(node);
+ loop_rate.sleep();
+ }
+
+ // 退出时清理
+ MSPLogout();
+ rclcpp::shutdown();
+ return 0;
+}
diff --git a/HiveCoreR0/src/voice_control/src/linuxrec.c b/HiveCoreR0/src/voice_control/src/linuxrec.c
new file mode 100644
index 0000000..ae71335
--- /dev/null
+++ b/HiveCoreR0/src/voice_control/src/linuxrec.c
@@ -0,0 +1,707 @@
+/*
+@file
+@brief record demo for linux
+
+@author taozhang9
+@date 2016/05/27
+*/
+
+#include
+#include
+#include
+#include
+#include
+#include
+#include
+#include "voice_control/formats.h"
+#include "voice_control/linuxrec.h"
+
+#define DBG_ON 1
+
+#if DBG_ON
+#define dbg printf
+#else
+#define dbg
+#endif
+
+
+/* Do not change the sequence */
+enum {
+ RECORD_STATE_CREATED, /* Init */
+ RECORD_STATE_CLOSING,
+ RECORD_STATE_READY, /* Opened */
+ RECORD_STATE_STOPPING, /* During Stop */
+ RECORD_STATE_RECORDING, /* Started */
+};
+
+#define SAMPLE_RATE 16000
+#define SAMPLE_BIT_SIZE 16
+#define FRAME_CNT 10
+//#define BUF_COUNT 1
+#define DEF_BUFF_TIME 500000
+#define DEF_PERIOD_TIME 100000
+
+#define DEFAULT_FORMAT \
+{\
+ WAVE_FORMAT_PCM, \
+ 1, \
+ 16000, \
+ 32000, \
+ 2, \
+ 16, \
+ sizeof(WAVEFORMATEX) \
+}
+#if 0
+struct bufinfo {
+ char *data;
+ unsigned int bufsize;
+};
+#endif
+
+
+static int show_xrun = 1;
+static int start_record_internal(snd_pcm_t *pcm)
+{
+ return snd_pcm_start(pcm);
+}
+
+static int stop_record_internal(snd_pcm_t *pcm)
+{
+ return snd_pcm_drop(pcm);
+}
+
+
+static int is_stopped_internal(struct recorder *rec)
+{
+ snd_pcm_state_t state;
+
+ state = snd_pcm_state((snd_pcm_t *)rec->wavein_hdl);
+ switch (state) {
+ case SND_PCM_STATE_RUNNING:
+ case SND_PCM_STATE_DRAINING:
+ return 0;
+ default: break;
+ }
+ return 1;
+
+}
+
+static int format_ms_to_alsa(const WAVEFORMATEX * wavfmt,
+ snd_pcm_format_t * format)
+{
+ snd_pcm_format_t tmp;
+ tmp = snd_pcm_build_linear_format(wavfmt->wBitsPerSample,
+ wavfmt->wBitsPerSample, wavfmt->wBitsPerSample == 8 ? 1 : 0, 0);
+ if ( tmp == SND_PCM_FORMAT_UNKNOWN )
+ return -EINVAL;
+ *format = tmp;
+ return 0;
+}
+
+/* set hardware and software params */
+static int set_hwparams(struct recorder * rec, const WAVEFORMATEX *wavfmt,
+ unsigned int buffertime, unsigned int periodtime)
+{
+ snd_pcm_hw_params_t *params;
+ int err;
+ unsigned int rate;
+ snd_pcm_format_t format;
+ snd_pcm_uframes_t size;
+ snd_pcm_t *handle = (snd_pcm_t *)rec->wavein_hdl;
+
+ rec->buffer_time = buffertime;
+ rec->period_time = periodtime;
+
+ snd_pcm_hw_params_alloca(¶ms);
+ err = snd_pcm_hw_params_any(handle, params);
+ if (err < 0) {
+ dbg("Broken configuration for this PCM");
+ return err;
+ }
+ err = snd_pcm_hw_params_set_access(handle, params,
+ SND_PCM_ACCESS_RW_INTERLEAVED);
+ if (err < 0) {
+ dbg("Access type not available");
+ return err;
+ }
+ err = format_ms_to_alsa(wavfmt, &format);
+ if (err) {
+ dbg("Invalid format");
+ return - EINVAL;
+ }
+ err = snd_pcm_hw_params_set_format(handle, params, format);
+ if (err < 0) {
+ dbg("Sample format non available");
+ return err;
+ }
+ err = snd_pcm_hw_params_set_channels(handle, params, wavfmt->nChannels);
+ if (err < 0) {
+ dbg("Channels count non available");
+ return err;
+ }
+
+ rate = wavfmt->nSamplesPerSec;
+ err = snd_pcm_hw_params_set_rate_near(handle, params, &rate, 0);
+ if (err < 0) {
+ dbg("Set rate failed");
+ return err;
+ }
+ if(rate != wavfmt->nSamplesPerSec) {
+ dbg("Rate mismatch");
+ return -EINVAL;
+ }
+ if (rec->buffer_time == 0 || rec->period_time == 0) {
+ err = snd_pcm_hw_params_get_buffer_time_max(params,
+ &rec->buffer_time, 0);
+ assert(err >= 0);
+ if (rec->buffer_time > 500000)
+ rec->buffer_time = 500000;
+ rec->period_time = rec->buffer_time / 4;
+ }
+ err = snd_pcm_hw_params_set_period_time_near(handle, params,
+ &rec->period_time, 0);
+ if (err < 0) {
+ dbg("set period time fail");
+ return err;
+ }
+ err = snd_pcm_hw_params_set_buffer_time_near(handle, params,
+ &rec->buffer_time, 0);
+ if (err < 0) {
+ dbg("set buffer time failed");
+ return err;
+ }
+ err = snd_pcm_hw_params_get_period_size(params, &size, 0);
+ if (err < 0) {
+ dbg("get period size fail");
+ return err;
+ }
+ rec->period_frames = size;
+ err = snd_pcm_hw_params_get_buffer_size(params, &size);
+ if (size == rec->period_frames) {
+ dbg("Can't use period equal to buffer size (%lu == %lu)",
+ size, rec->period_frames);
+ return -EINVAL;
+ }
+ rec->buffer_frames = size;
+ rec->bits_per_frame = wavfmt->wBitsPerSample;
+
+ /* set to driver */
+ err = snd_pcm_hw_params(handle, params);
+ if (err < 0) {
+ dbg("Unable to install hw params:");
+ return err;
+ }
+ return 0;
+}
+static int set_swparams(struct recorder * rec)
+{
+ int err;
+ snd_pcm_sw_params_t *swparams;
+ snd_pcm_t * handle = (snd_pcm_t*)(rec->wavein_hdl);
+ /* sw para */
+ snd_pcm_sw_params_alloca(&swparams);
+ err = snd_pcm_sw_params_current(handle, swparams);
+ if (err < 0) {
+ dbg("get current sw para fail");
+ return err;
+ }
+
+ err = snd_pcm_sw_params_set_avail_min(handle, swparams,
+ rec->period_frames);
+ if (err < 0) {
+ dbg("set avail min failed");
+ return err;
+ }
+ /* set a value bigger than the buffer frames to prevent the auto start.
+ * we use the snd_pcm_start to explicit start the pcm */
+ err = snd_pcm_sw_params_set_start_threshold(handle, swparams,
+ rec->buffer_frames * 2);
+ if (err < 0) {
+ dbg("set start threshold fail");
+ return err;
+ }
+
+ if ( (err = snd_pcm_sw_params(handle, swparams)) < 0) {
+ dbg("unable to install sw params:");
+ return err;
+ }
+ return 0;
+}
+
+static int set_params(struct recorder *rec, WAVEFORMATEX *fmt,
+ unsigned int buffertime, unsigned int periodtime)
+{
+ int err;
+ WAVEFORMATEX defmt = DEFAULT_FORMAT;
+
+ if (fmt == NULL) {
+ fmt = &defmt;
+ }
+ err = set_hwparams(rec, fmt, buffertime, periodtime);
+ if (err)
+ return err;
+ err = set_swparams(rec);
+ if (err)
+ return err;
+ return 0;
+}
+
+/*
+ * Underrun and suspend recovery
+ */
+
+static int xrun_recovery(snd_pcm_t *handle, int err)
+{
+ if (err == -EPIPE) { /* over-run */
+ if (show_xrun)
+ printf("!!!!!!overrun happend!!!!!!");
+
+ err = snd_pcm_prepare(handle);
+ if (err < 0) {
+ if (show_xrun)
+ printf("Can't recovery from overrun,"
+ "prepare failed: %s\n", snd_strerror(err));
+ return err;
+ }
+ return 0;
+ } else if (err == -ESTRPIPE) {
+ while ((err = snd_pcm_resume(handle)) == -EAGAIN)
+ usleep(200000); /* wait until the suspend flag is released */
+ if (err < 0) {
+ err = snd_pcm_prepare(handle);
+ if (err < 0) {
+ if (show_xrun)
+ printf("Can't recovery from suspend,"
+ "prepare failed: %s\n", snd_strerror(err));
+ return err;
+ }
+ }
+ return 0;
+ }
+ return err;
+}
+static ssize_t pcm_read(struct recorder *rec, size_t rcount)
+{
+ ssize_t r;
+ size_t count = rcount;
+ char *data;
+ snd_pcm_t *handle = (snd_pcm_t *)rec->wavein_hdl;
+ if(!handle)
+ return -EINVAL;
+
+ data = rec->audiobuf;
+ while (count > 0) {
+ r = snd_pcm_readi(handle, data, count);
+ if (r == -EAGAIN || (r >= 0 && (size_t)r < count)) {
+ snd_pcm_wait(handle, 100);
+ } else if (r < 0) {
+ if(xrun_recovery(handle, r) < 0) {
+ return -1;
+ }
+ }
+
+ if (r > 0) {
+ count -= r;
+ data += r * rec->bits_per_frame / 8;
+ }
+ }
+ return rcount;
+}
+
+static void * record_thread_proc(void * para)
+{
+ struct recorder * rec = (struct recorder *) para;
+ size_t frames, bytes;
+ sigset_t mask, oldmask;
+
+
+ sigemptyset(&mask);
+ sigaddset(&mask, SIGINT);
+ sigaddset(&mask, SIGTERM);
+ pthread_sigmask(SIG_BLOCK, &mask, &oldmask);
+
+ while(1) {
+ frames = rec->period_frames;
+ bytes = frames * rec->bits_per_frame / 8;
+
+ /* closing, exit the thread */
+ if (rec->state == RECORD_STATE_CLOSING)
+ break;
+
+ if(rec->state < RECORD_STATE_RECORDING)
+ usleep(100000);
+
+ if (pcm_read(rec, frames) != frames) {
+ return NULL;
+ }
+
+ if (rec->on_data_ind)
+ rec->on_data_ind(rec->audiobuf, bytes,
+ rec->user_cb_para);
+ }
+ return rec;
+
+}
+static int create_record_thread(void * para, pthread_t * tidp)
+{
+ int err;
+ err = pthread_create(tidp, NULL, record_thread_proc, (void *)para);
+ if (err != 0)
+ return err;
+
+ return 0;
+}
+
+#if 0 /* don't use it now... cuz only one buffer supported */
+static void free_rec_buffer(struct recorder * rec)
+{
+ if (rec->bufheader) {
+ unsigned int i;
+ struct bufinfo *info = (struct bufinfo *) rec->bufheader;
+
+ assert(rec->bufcount > 0);
+ for (i = 0; i < rec->bufcount; ++i) {
+ if (info->data) {
+ free(info->data);
+ info->data = NULL;
+ info->bufsize = 0;
+ info->audio_bytes = 0;
+ }
+ info++;
+ }
+ free(rec->bufheader);
+ rec->bufheader = NULL;
+ }
+ rec->bufcount = 0;
+}
+
+static int prepare_rec_buffer(struct recorder * rec )
+{
+ struct bufinfo *buffers;
+ unsigned int i;
+ int err;
+ size_t sz;
+
+ /* the read and QISRWrite is blocked, currently only support one buffer,
+ * if overrun too much, need more buffer and another new thread
+ * to write the audio to network */
+ rec->bufcount = 1;
+ sz = sizeof(struct bufinfo)*rec->bufcount;
+ buffers=(struct bufinfo*)malloc(sz);
+ if (!buffers) {
+ rec->bufcount = 0;
+ goto fail;
+ }
+ memset(buffers, 0, sz);
+ rec->bufheader = buffers;
+
+ for (i = 0; i < rec->bufcount; ++i) {
+ buffers[i].bufsize =
+ (rec->period_frames * rec->bits_per_frame / 8);
+ buffers[i].data = (char *)malloc(buffers[i].bufsize);
+ if (!buffers[i].data) {
+ buffers[i].bufsize = 0;
+ goto fail;
+ }
+ buffers[i].audio_bytes = 0;
+ }
+ return 0;
+fail:
+ free_rec_buffer(rec);
+ return -ENOMEM;
+}
+#else
+static void free_rec_buffer(struct recorder * rec)
+{
+ if (rec->audiobuf) {
+ free(rec->audiobuf);
+ rec->audiobuf = NULL;
+ }
+}
+
+static int prepare_rec_buffer(struct recorder * rec )
+{
+ /* the read and QISRWrite is blocked, currently only support one buffer,
+ * if overrun too much, need more buffer and another new thread
+ * to write the audio to network */
+ size_t sz = (rec->period_frames * rec->bits_per_frame / 8);
+ rec->audiobuf = (char *)malloc(sz);
+ if(!rec->audiobuf)
+ return -ENOMEM;
+ return 0;
+}
+#endif
+
+static int open_recorder_internal(struct recorder * rec,
+ record_dev_id dev, WAVEFORMATEX * fmt)
+{
+ int err = 0;
+
+ err = snd_pcm_open((snd_pcm_t **)&rec->wavein_hdl, dev.u.name,
+ SND_PCM_STREAM_CAPTURE, 0);
+ if(err < 0)
+ goto fail;
+
+ err = set_params(rec, fmt, DEF_BUFF_TIME, DEF_PERIOD_TIME);
+ if(err)
+ goto fail;
+
+ assert(rec->bufheader == NULL);
+ err = prepare_rec_buffer(rec);
+ if(err)
+ goto fail;
+
+ err = create_record_thread((void*)rec,
+ &rec->rec_thread);
+ if(err)
+ goto fail;
+
+
+ return 0;
+fail:
+ if(rec->wavein_hdl)
+ snd_pcm_close((snd_pcm_t *) rec->wavein_hdl);
+ rec->wavein_hdl = NULL;
+ free_rec_buffer(rec);
+ return err;
+}
+
+static void close_recorder_internal(struct recorder *rec)
+{
+ snd_pcm_t * handle;
+
+ handle = (snd_pcm_t *) rec->wavein_hdl;
+
+ /* may be the thread is blocked at read, cancel it */
+ pthread_cancel(rec->rec_thread);
+
+ /* wait for the pcm thread quit first */
+ pthread_join(rec->rec_thread, NULL);
+
+ if(handle) {
+ snd_pcm_close(handle);
+ rec->wavein_hdl = NULL;
+ }
+ free_rec_buffer(rec);
+}
+/* return the count of pcm device */
+/* list all cards */
+static int get_pcm_device_cnt(snd_pcm_stream_t stream)
+{
+ void **hints, **n;
+ char *io, *filter, *name;
+ int cnt = 0;
+
+ if (snd_device_name_hint(-1, "pcm", &hints) < 0)
+ return 0;
+ n = hints;
+ filter = stream == SND_PCM_STREAM_CAPTURE ? "Input" : "Output";
+ while (*n != NULL) {
+ io = snd_device_name_get_hint(*n, "IOID");
+ name = snd_device_name_get_hint(*n, "NAME");
+ if (name && (io == NULL || strcmp(io, filter) == 0))
+ cnt ++;
+ if (io != NULL)
+ free(io);
+ if (name != NULL)
+ free(name);
+ n++;
+ }
+ snd_device_name_free_hint(hints);
+ return cnt;
+}
+
+static void free_name_desc(char **name_or_desc)
+{
+ char **ss;
+ ss = name_or_desc;
+ if(NULL == name_or_desc)
+ return;
+ while(*name_or_desc) {
+ free(*name_or_desc);
+ *name_or_desc = NULL;
+ name_or_desc++;
+ }
+ free(ss);
+}
+/* return success: total count, need free the name and desc buffer
+ * fail: -1 , *name_out and *desc_out will be NULL */
+static int list_pcm(snd_pcm_stream_t stream, char**name_out,
+ char ** desc_out)
+{
+ void **hints, **n;
+ char **name, **descr;
+ char *io;
+ const char *filter;
+ int cnt = 0;
+ int i = 0;
+
+ if (snd_device_name_hint(-1, "pcm", &hints) < 0)
+ return 0;
+ n = hints;
+ cnt = get_pcm_device_cnt(stream);
+ if(!cnt) {
+ goto fail;
+ }
+
+ *name_out = calloc(sizeof(char *) , (1+cnt));
+ if (*name_out == NULL)
+ goto fail;
+ *desc_out = calloc(sizeof(char *) , (1 + cnt));
+ if (*desc_out == NULL)
+ goto fail;
+
+ /* the last one is a flag, NULL */
+ name_out[cnt] = NULL;
+ desc_out[cnt] = NULL;
+ name = name_out;
+ descr = desc_out;
+
+ filter = stream == SND_PCM_STREAM_CAPTURE ? "Input" : "Output";
+ while (*n != NULL && i < cnt) {
+ *name = snd_device_name_get_hint(*n, "NAME");
+ *descr = snd_device_name_get_hint(*n, "DESC");
+ io = snd_device_name_get_hint(*n, "IOID");
+ if (name == NULL ||
+ (io != NULL && strcmp(io, filter) != 0) ){
+ if (*name) free(*name);
+ if (*descr) free(*descr);
+ } else {
+ if (*descr == NULL) {
+ *descr = malloc(4);
+ memset(*descr, 0, 4);
+ }
+ name++;
+ descr++;
+ i++;
+ }
+ if (io != NULL)
+ free(io);
+ n++;
+ }
+ snd_device_name_free_hint(hints);
+ return cnt;
+fail:
+ free_name_desc(name_out);
+ free_name_desc(desc_out);
+ snd_device_name_free_hint(hints);
+ return -1;
+}
+/* -------------------------------------
+ * Interfaces
+ --------------------------------------*/
+/* the device id is a pcm string name in linux */
+record_dev_id get_default_input_dev()
+{
+ record_dev_id id;
+ id.u.name = "default";
+ return id;
+}
+
+record_dev_id * list_input_device()
+{
+ // TODO: unimplemented
+ return NULL;
+}
+
+int get_input_dev_num()
+{
+ return get_pcm_device_cnt(SND_PCM_STREAM_CAPTURE);
+}
+
+
+/* callback will be run on a new thread */
+int create_recorder(struct recorder ** out_rec,
+ void (*on_data_ind)(char *data, unsigned long len, void *user_cb_para),
+ void* user_cb_para)
+{
+ struct recorder * myrec;
+ myrec = (struct recorder *)malloc(sizeof(struct recorder));
+ if(!myrec)
+ return -RECORD_ERR_MEMFAIL;
+
+ memset(myrec, 0, sizeof(struct recorder));
+ myrec->on_data_ind = on_data_ind;
+ myrec->user_cb_para = user_cb_para;
+ myrec->state = RECORD_STATE_CREATED;
+
+ *out_rec = myrec;
+ return 0;
+}
+
+void destroy_recorder(struct recorder *rec)
+{
+ if(!rec)
+ return;
+
+ free(rec);
+}
+
+int open_recorder(struct recorder * rec, record_dev_id dev, WAVEFORMATEX * fmt)
+{
+ int ret = 0;
+ if(!rec )
+ return -RECORD_ERR_INVAL;
+ if(rec->state >= RECORD_STATE_READY)
+ return 0;
+
+ ret = open_recorder_internal(rec, dev, fmt);
+ if(ret == 0)
+ rec->state = RECORD_STATE_READY;
+ return 0;
+
+}
+
+void close_recorder(struct recorder *rec)
+{
+ if(rec == NULL || rec->state < RECORD_STATE_READY)
+ return;
+ if(rec->state == RECORD_STATE_RECORDING)
+ stop_record(rec);
+
+ rec->state = RECORD_STATE_CLOSING;
+
+ close_recorder_internal(rec);
+
+ rec->state = RECORD_STATE_CREATED;
+}
+
+int start_record(struct recorder * rec)
+{
+ int ret;
+ if(rec == NULL)
+ return -RECORD_ERR_INVAL;
+ if( rec->state < RECORD_STATE_READY)
+ return -RECORD_ERR_NOT_READY;
+ if( rec->state == RECORD_STATE_RECORDING)
+ return 0;
+
+ ret = start_record_internal((snd_pcm_t *)rec->wavein_hdl);
+ if(ret == 0)
+ rec->state = RECORD_STATE_RECORDING;
+ return ret;
+}
+
+int stop_record(struct recorder * rec)
+{
+ int ret;
+ if(rec == NULL)
+ return -RECORD_ERR_INVAL;
+ if( rec->state < RECORD_STATE_RECORDING)
+ return 0;
+
+ rec->state = RECORD_STATE_STOPPING;
+ ret = stop_record_internal((snd_pcm_t *)rec->wavein_hdl);
+ if(ret == 0) {
+ rec->state = RECORD_STATE_READY;
+ }
+ return ret;
+}
+
+int is_record_stopped(struct recorder *rec)
+{
+ if(rec->state == RECORD_STATE_RECORDING)
+ return 0;
+
+ return is_stopped_internal(rec);
+}
diff --git a/HiveCoreR0/src/voice_control/src/speech_recognizer.c b/HiveCoreR0/src/voice_control/src/speech_recognizer.c
new file mode 100644
index 0000000..0a963c6
--- /dev/null
+++ b/HiveCoreR0/src/voice_control/src/speech_recognizer.c
@@ -0,0 +1,374 @@
+/*
+@file
+@brief a simple demo to recognize speech from microphone
+
+@author taozhang9
+@date 2016/05/27
+*/
+
+#include
+#include
+#include
+#include
+#include "voice_control/speech_recognizer.h"
+#include "voice_control/qisr.h"
+#include "voice_control/msp_cmn.h"
+#include "voice_control/msp_errors.h"
+#include "voice_control/linuxrec.h"
+
+
+#define SR_DBGON 1
+#if SR_DBGON == 1
+# define sr_dbg printf
+#else
+# define sr_dbg
+#endif
+
+#define DEFAULT_SESSION_PARA \
+ "sub = iat, domain = iat, language = zh_cn, accent = mandarin, sample_rate = 16000, result_type = plain, result_encoding = utf8"
+
+#define DEFAULT_FORMAT \
+{\
+ WAVE_FORMAT_PCM, \
+ 1, \
+ 16000, \
+ 32000, \
+ 2, \
+ 16, \
+ sizeof(WAVEFORMATEX) \
+}
+
+/* internal state */
+enum {
+ SR_STATE_INIT,
+ SR_STATE_STARTED
+};
+
+
+#define SR_MALLOC malloc
+#define SR_MFREE free
+#define SR_MEMSET memset
+
+
+static void Sleep(size_t ms)
+{
+ usleep(ms*1000);
+}
+
+
+static void end_sr_on_error(struct speech_rec *sr, int errcode)
+{
+ if(sr->aud_src == SR_MIC)
+ stop_record(sr->recorder);
+
+ if (sr->session_id) {
+ if (sr->notif.on_speech_end)
+ sr->notif.on_speech_end(errcode);
+
+ QISRSessionEnd(sr->session_id, "err");
+ sr->session_id = NULL;
+ }
+ sr->state = SR_STATE_INIT;
+}
+
+static void end_sr_on_vad(struct speech_rec *sr)
+{
+ int errcode;
+ const char *rslt;
+
+ if (sr->aud_src == SR_MIC)
+ stop_record(sr->recorder);
+
+ while(sr->rec_stat != MSP_REC_STATUS_COMPLETE ){
+ rslt = QISRGetResult(sr->session_id, &sr->rec_stat, 0, &errcode);
+ if (rslt && sr->notif.on_result)
+ sr->notif.on_result(rslt, sr->rec_stat == MSP_REC_STATUS_COMPLETE ? 1 : 0);
+
+ Sleep(100); /* for cpu occupy, should sleep here */
+ }
+
+ if (sr->session_id) {
+ if (sr->notif.on_speech_end)
+ sr->notif.on_speech_end(END_REASON_VAD_DETECT);
+ QISRSessionEnd(sr->session_id, "VAD Normal");
+ sr->session_id = NULL;
+ }
+ sr->state = SR_STATE_INIT;
+}
+
+/* the record call back */
+static void iat_cb(char *data, unsigned long len, void *user_para)
+{
+ int errcode;
+ struct speech_rec *sr;
+
+ if(len == 0 || data == NULL)
+ return;
+
+ sr = (struct speech_rec *)user_para;
+
+ if(sr == NULL || sr->ep_stat >= MSP_EP_AFTER_SPEECH)
+ return;
+ if (sr->state < SR_STATE_STARTED)
+ return; /* ignore the data if error/vad happened */
+
+ errcode = sr_write_audio_data(sr, data, len);
+ if (errcode) {
+ end_sr_on_error(sr, errcode);
+ return;
+ }
+}
+
+static char * skip_space(char *s)
+{
+ while (s && *s != ' ' && *s != '\0')
+ s++;
+ return s;
+}
+static int update_format_from_sessionparam(const char * session_para, WAVEFORMATEX *wavefmt)
+{
+ char *s;
+ if ((s = strstr(session_para, "sample_rate"))) {
+ s = strstr(s, "=");
+ if (s && *s) {
+ s = skip_space(s);
+ if (s && *s) {
+ wavefmt->nSamplesPerSec = atoi(s);
+ wavefmt->nAvgBytesPerSec = wavefmt->nBlockAlign * wavefmt->nSamplesPerSec;
+ }
+ }
+ else
+ return -1;
+ }
+ else {
+ return -1;
+ }
+
+ return 0;
+}
+
+/* devid will be ignored if aud_src is not SR_MIC ; use get_default_dev_id
+ * to use the default input device. Currently the device list function is
+ * not provided yet.
+ */
+
+int sr_init_ex(struct speech_rec * sr, const char * session_begin_params,
+ enum sr_audsrc aud_src, record_dev_id devid,
+ struct speech_rec_notifier * notify)
+{
+ int errcode;
+ size_t param_size;
+ WAVEFORMATEX wavfmt = DEFAULT_FORMAT;
+
+ if (aud_src == SR_MIC && get_input_dev_num() == 0) {
+ return -E_SR_NOACTIVEDEVICE;
+ }
+
+ if (!sr)
+ return -E_SR_INVAL;
+
+ if (session_begin_params == NULL) {
+ session_begin_params = DEFAULT_SESSION_PARA;
+ }
+
+ SR_MEMSET(sr, 0, sizeof(struct speech_rec));
+ sr->state = SR_STATE_INIT;
+ sr->aud_src = aud_src;
+ sr->ep_stat = MSP_EP_LOOKING_FOR_SPEECH;
+ sr->rec_stat = MSP_REC_STATUS_SUCCESS;
+ sr->audio_status = MSP_AUDIO_SAMPLE_FIRST;
+
+ param_size = strlen(session_begin_params) + 1;
+ sr->session_begin_params = (char*)SR_MALLOC(param_size);
+ if (sr->session_begin_params == NULL) {
+ sr_dbg("mem alloc failed\n");
+ return -E_SR_NOMEM;
+ }
+ strncpy(sr->session_begin_params, session_begin_params, param_size);
+
+ sr->notif = *notify;
+
+ if (aud_src == SR_MIC) {
+ errcode = create_recorder(&sr->recorder, iat_cb, (void*)sr);
+ if (sr->recorder == NULL || errcode != 0) {
+ sr_dbg("create recorder failed: %d\n", errcode);
+ errcode = -E_SR_RECORDFAIL;
+ goto fail;
+ }
+ update_format_from_sessionparam(session_begin_params, &wavfmt);
+
+ errcode = open_recorder(sr->recorder, devid, &wavfmt);
+ if (errcode != 0) {
+ sr_dbg("recorder open failed: %d\n", errcode);
+ errcode = -E_SR_RECORDFAIL;
+ goto fail;
+ }
+ }
+
+ return 0;
+
+fail:
+ if (sr->recorder) {
+ destroy_recorder(sr->recorder);
+ sr->recorder = NULL;
+ }
+
+ if (sr->session_begin_params) {
+ SR_MFREE(sr->session_begin_params);
+ sr->session_begin_params = NULL;
+ }
+ SR_MEMSET(&sr->notif, 0, sizeof(sr->notif));
+
+ return errcode;
+}
+
+/* use the default input device to capture the audio. see sr_init_ex */
+int sr_init(struct speech_rec * sr, const char * session_begin_params,
+ enum sr_audsrc aud_src, struct speech_rec_notifier * notify)
+{
+ return sr_init_ex(sr, session_begin_params, aud_src,
+ get_default_input_dev(), notify);
+}
+
+int sr_start_listening(struct speech_rec *sr)
+{
+ int ret;
+ const char* session_id = NULL;
+ int errcode = MSP_SUCCESS;
+
+ if (sr->state >= SR_STATE_STARTED) {
+ sr_dbg("already STARTED.\n");
+ return -E_SR_ALREADY;
+ }
+
+ session_id = QISRSessionBegin(NULL, sr->session_begin_params, &errcode); //��д����Ҫ�����һ������ΪNULL
+ if (MSP_SUCCESS != errcode)
+ {
+ sr_dbg("\nQISRSessionBegin failed! error code:%d\n", errcode);
+ return errcode;
+ }
+ sr->session_id = session_id;
+ sr->ep_stat = MSP_EP_LOOKING_FOR_SPEECH;
+ sr->rec_stat = MSP_REC_STATUS_SUCCESS;
+ sr->audio_status = MSP_AUDIO_SAMPLE_FIRST;
+
+ if (sr->aud_src == SR_MIC) {
+ ret = start_record(sr->recorder);
+ if (ret != 0) {
+ sr_dbg("start record failed: %d\n", ret);
+ QISRSessionEnd(session_id, "start record fail");
+ sr->session_id = NULL;
+ return -E_SR_RECORDFAIL;
+ }
+ }
+
+ sr->state = SR_STATE_STARTED;
+
+ if (sr->notif.on_speech_begin)
+ sr->notif.on_speech_begin();
+
+ return 0;
+}
+
+/* after stop_record, there are still some data callbacks */
+static void wait_for_rec_stop(struct recorder *rec, unsigned int timeout_ms)
+{
+ while (!is_record_stopped(rec)) {
+ Sleep(1);
+ if (timeout_ms != (unsigned int)-1)
+ if (0 == timeout_ms--)
+ break;
+ }
+}
+
+int sr_stop_listening(struct speech_rec *sr)
+{
+ int ret = 0;
+ const char * rslt = NULL;
+
+ if (sr->state < SR_STATE_STARTED) {
+ sr_dbg("Not started or already stopped.\n");
+ return 0;
+ }
+
+ if (sr->aud_src == SR_MIC) {
+ ret = stop_record(sr->recorder);
+ if (ret != 0) {
+ sr_dbg("Stop failed! \n");
+ return -E_SR_RECORDFAIL;
+ }
+ wait_for_rec_stop(sr->recorder, (unsigned int)-1);
+ }
+ sr->state = SR_STATE_INIT;
+ ret = QISRAudioWrite(sr->session_id, NULL, 0, MSP_AUDIO_SAMPLE_LAST, &sr->ep_stat, &sr->rec_stat);
+ if (ret != 0) {
+ sr_dbg("write LAST_SAMPLE failed: %d\n", ret);
+ QISRSessionEnd(sr->session_id, "write err");
+ return ret;
+ }
+
+ while (sr->rec_stat != MSP_REC_STATUS_COMPLETE) {
+ rslt = QISRGetResult(sr->session_id, &sr->rec_stat, 0, &ret);
+ if (MSP_SUCCESS != ret) {
+ sr_dbg("\nQISRGetResult failed! error code: %d\n", ret);
+ end_sr_on_error(sr, ret);
+ return ret;
+ }
+ if (NULL != rslt && sr->notif.on_result)
+ sr->notif.on_result(rslt, sr->rec_stat == MSP_REC_STATUS_COMPLETE ? 1 : 0);
+ Sleep(100);
+ }
+
+ QISRSessionEnd(sr->session_id, "normal");
+ sr->session_id = NULL;
+ return 0;
+}
+
+int sr_write_audio_data(struct speech_rec *sr, char *data, unsigned int len)
+{
+ const char *rslt = NULL;
+ int ret = 0;
+ if (!sr )
+ return -E_SR_INVAL;
+ if (!data || !len)
+ return 0;
+
+ ret = QISRAudioWrite(sr->session_id, data, len, sr->audio_status, &sr->ep_stat, &sr->rec_stat);
+ if (ret) {
+ end_sr_on_error(sr, ret);
+ return ret;
+ }
+ sr->audio_status = MSP_AUDIO_SAMPLE_CONTINUE;
+
+ if (MSP_REC_STATUS_SUCCESS == sr->rec_stat) { //�Ѿ��в�����д���
+ rslt = QISRGetResult(sr->session_id, &sr->rec_stat, 0, &ret);
+ if (MSP_SUCCESS != ret) {
+ sr_dbg("\nQISRGetResult failed! error code: %d\n", ret);
+ end_sr_on_error(sr, ret);
+ return ret;
+ }
+ if (NULL != rslt && sr->notif.on_result)
+ sr->notif.on_result(rslt, sr->rec_stat == MSP_REC_STATUS_COMPLETE ? 1 : 0);
+ }
+
+ if (MSP_EP_AFTER_SPEECH == sr->ep_stat)
+ end_sr_on_vad(sr);
+
+ return 0;
+}
+
+void sr_uninit(struct speech_rec * sr)
+{
+ if (sr->recorder) {
+ if(!is_record_stopped(sr->recorder))
+ stop_record(sr->recorder);
+ close_recorder(sr->recorder);
+ destroy_recorder(sr->recorder);
+ sr->recorder = NULL;
+ }
+
+ if (sr->session_begin_params) {
+ SR_MFREE(sr->session_begin_params);
+ sr->session_begin_params = NULL;
+ }
+}