Unity3D:讯飞实现语音识别功能语音转文字(Windows)

科大讯飞语音识别功能还是很强大的,之前一直在做移动端的语音识别功能,一直没弄过Windows平台的,在网上找了很多别人写的功能,然后自己整理了一下。 其实就是把讯飞的window平台的C/C++接口转换成C#能调用的接口,利用DllImport将封装在C/C++里的部分用到的函数转换为C#可以直接调用的函数 首先创建一个MscDLL类,将C/C++的接口转换为C#,然后把C语言头文件msp_errors.h中的错误以及各种状态封装到该类中。下面是代码。

using System;
using System.Runtime.InteropServices;

namespace iFlytekSpeechRecognizer
{
    public class MscDLL
    {
        [DllImport("msc_x64", CallingConvention = CallingConvention.StdCall)]
        public static extern int MSPLogin(string usr, string pwd, string parameters);
        [DllImport("msc_x64", CallingConvention = CallingConvention.StdCall)]
        public static extern int MSPLogout();
        [DllImport("msc_x64", CallingConvention = CallingConvention.StdCall)]
        public static extern IntPtr QISRSessionBegin(string grammarList, string _params, ref int errorCode);
        [DllImport("msc_x64", CallingConvention = CallingConvention.StdCall)]
        public static extern int QISRAudioWrite(IntPtr sessionID, byte[] waveData, uint waveLen, AudioStatus audioStatus, ref EpStatus epStatus, ref RecogStatus recogStatus);
        [DllImport("msc_x64", CallingConvention = CallingConvention.StdCall)]
        public static extern IntPtr QISRGetResult(IntPtr sessionID, ref RecogStatus rsltStatus, int waitTime, ref int errorCode);
        [DllImport("msc_x64", CallingConvention = CallingConvention.StdCall)]
        public static extern int QISRSessionEnd(IntPtr sessionID, string hints);
    }
    public enum Errors
    {
        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 */   /* 禁止使用本地人脸引擎 */

        /*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 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, /* 无效的参数*/
        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, /*无效的参数*/
        SPEECH_ERROR_ASR_INVALID_PARA_VALUE = 23002, /*无效的参数值*/
        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, /* 无效的参数值*/
        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,  /* 不合法的资源类型 */

        /*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,	/* 非实时转写错误码基码 */
    }
    #region ISR枚举常量
    //音频状态
    public enum AudioStatus
    {
        MSP_AUDIO_SAMPLE_INIT = 0x00,
        MSP_AUDIO_SAMPLE_FIRST = 0x01,
        MSP_AUDIO_SAMPLE_CONTINUE = 0x02,
        MSP_AUDIO_SAMPLE_LAST = 0x04,
    }
    //endpointer state 末端指针
    public enum EpStatus
    {
        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
    }

    //recognition status 识别状态
    public enum RecogStatus
    {
        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,
    }
    #endregion
}

然后在封装一个Unity可以调用的类,主要是初始化方法,和语音转换的方法。并且写了一个回调方法用来接收,转换完的文字内容。废话不多说下面上代码。

using System;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading;
using UnityEngine;

namespace iFlytekSpeechRecognizer
{
    public class iFlytek
    {
        public static Action RecognizerResult;
        private static string session_begin_params = "sub = iat, domain = iat, language = zh_cn, accent = mandarin, sample_rate = 16000, result_type = plain, result_encoding =gb2312";

        public static bool InitiFlytek(string my_appid, string begin_params)
        {
            int res = MscDLL.MSPLogin(null, null, my_appid);//用户名,密码,登陆信息,前两个均为空
            if (res != (int)Errors.MSP_SUCCESS)
            {
                //说明登陆失败
                Debug.Log("登陆失败!");
                Debug.Log("错误编号:" + res);
                return false;
            }
            Debug.Log("登陆成功!");
            session_begin_params = begin_params;
            return true;
        }

        public static bool QuitiFlytek()
        {
            int res = MscDLL.MSPLogout();
            if (res != (int)Errors.MSP_SUCCESS)
            {
                //说明登陆失败
                Debug.Log("退出登录失败!");
                Debug.Log("错误编号:" + res);
                return false;
            }
            Debug.Log("退出登录成功!");
            return true;
        }

        public static void StartRecording(byte[] data)
        {
            string hints = "hiahiahia";
            IntPtr session_id;
            StringBuilder result = new StringBuilder();//存储最终识别的结果
            var aud_stat = AudioStatus.MSP_AUDIO_SAMPLE_CONTINUE;//音频状态
            var ep_stat = EpStatus.MSP_EP_LOOKING_FOR_SPEECH;//端点状态
            var rec_stat = RecogStatus.MSP_REC_STATUS_SUCCESS;//识别状态
            int errcode = (int)Errors.MSP_SUCCESS;
            byte[] audio_content = data;  //用来存储音频文件的二进制数据
            int totalLength = 0;//用来记录总的识别后的结果的长度,判断是否超过缓存最大值

            if (audio_content == null)
            {
                Debug.Log("没有读取到任何内容");
                MscDLL.MSPLogout();//退出登录
            }
            Debug.Log("开始进行语音听写.......");

            /*
             * QISRSessionBegin();
             * 功能:开始一次语音识别
             * 参数一:定义关键词识别||语法识别||连续语音识别(null)
             * 参数2:设置识别的参数:语言、领域、语言区域。。。。
             * 参数3:带回语音识别的结果,成功||错误代码
             * 返回值intPtr类型,后面会用到这个返回值
             */
            session_id = MscDLL.QISRSessionBegin(null, session_begin_params, ref errcode);
            if (errcode != (int)Errors.MSP_SUCCESS)
            {
                Debug.Log("开始一次语音识别失败!");
                MscDLL.MSPLogout();
            }
            /*
             QISRAudioWrite();
             功能:写入本次识别的音频
             参数1:之前已经得到的sessionID
             参数2:音频数据缓冲区起始地址
             参数3:音频数据长度,单位字节。
             参数4:用来告知MSC音频发送是否完成     
                   MSP_AUDIO_SAMPLE_FIRST = 1	第一块音频
                   MSP_AUDIO_SAMPLE_CONTINUE = 2	还有后继音频
                   MSP_AUDIO_SAMPLE_LAST = 4	最后一块音频
             参数5:端点检测(End-point detected)器所处的状态
                   MSP_EP_LOOKING_FOR_SPEECH = 0	还没有检测到音频的前端点。
                   MSP_EP_IN_SPEECH = 1	已经检测到了音频前端点,正在进行正常的音频处理。
                   MSP_EP_AFTER_SPEECH = 3	检测到音频的后端点,后继的音频会被MSC忽略。
                   MSP_EP_TIMEOUT = 4	超时。
                   MSP_EP_ERROR = 5	出现错误。
                   MSP_EP_MAX_SPEECH = 6	音频过大。
             参数6:识别器返回的状态,提醒用户及时开始\停止获取识别结果
                   MSP_REC_STATUS_SUCCESS = 0	识别成功,此时用户可以调用QISRGetResult来获取(部分)结果。
                   MSP_REC_STATUS_NO_MATCH = 1	识别结束,没有识别结果。
                   MSP_REC_STATUS_INCOMPLETE = 2	正在识别中。
                   MSP_REC_STATUS_COMPLETE = 5	识别结束。
             返回值:函数调用成功则其值为MSP_SUCCESS,否则返回错误代码。
             本接口需不断调用,直到音频全部写入为止。上传音频时,需更新audioStatus的值。具体来说:
             当写入首块音频时,将audioStatus置为MSP_AUDIO_SAMPLE_FIRST
             当写入最后一块音频时,将audioStatus置为MSP_AUDIO_SAMPLE_LAST
             其余情况下,将audioStatus置为MSP_AUDIO_SAMPLE_CONTINUE
             同时,需定时检查两个变量:epStatus和rsltStatus。具体来说:
             当epStatus显示已检测到后端点时,MSC已不再接收音频,应及时停止音频写入
             当rsltStatus显示有识别结果返回时,即可从MSC缓存中获取结果
            */
            int res = MscDLL.QISRAudioWrite(session_id, audio_content, (uint)audio_content.Length, aud_stat, ref ep_stat, ref rec_stat);
            if (res != (int)Errors.MSP_SUCCESS)
            {
                Debug.Log("写入识别的音频失败!" + res);
                MscDLL.MSPLogout();
                MscDLL.QISRSessionEnd(session_id, hints);
            }
            res = MscDLL.QISRAudioWrite(session_id, null, 0, AudioStatus.MSP_AUDIO_SAMPLE_LAST, ref ep_stat, ref rec_stat);
            if (res != (int)Errors.MSP_SUCCESS)
            {
                Debug.Log("写入音频失败!" + res);
            }
            while (RecogStatus.MSP_REC_STATUS_COMPLETE != rec_stat)
            {
                //如果没有完成就一直继续获取结果
                /*
                 QISRGetResult();
                 功能:获取识别结果
                 参数1:session,之前已获得
                 参数2:识别结果的状态
                 参数3:waitTime[in]	此参数做保留用
                 参数4:错误编码||成功
                 返回值:函数执行成功且有识别结果时,返回结果字符串指针;其他情况(失败或无结果)返回NULL。
                */
                IntPtr now_result = MscDLL.QISRGetResult(session_id, ref rec_stat, 0, ref errcode);
                if (errcode != (int)Errors.MSP_SUCCESS)
                {
                    Debug.Log("获取结果失败:" + errcode);
                }
                if (now_result != null)
                {
                    int length = now_result.ToString().Length;
                    totalLength += length;
                    if (totalLength > 4096)
                    {
                        Debug.Log("缓存空间不够" + totalLength);
                    }
                    result.Append(Marshal.PtrToStringAnsi(now_result));
                }
                Thread.Sleep(150);//防止频繁占用cpu
            }
            
            res = MscDLL.QISRSessionEnd(session_id, hints);
            if (res != (int)Errors.MSP_SUCCESS)
            {
                Debug.Log("会话结束失败!");
                Debug.Log("错误编号:" + res);

                MscDLL.MSPLogout();
            }
            Debug.Log("成功结束会话!");


            Debug.Log("语音听写结束");

            if (RecognizerResult != null)
            {
                RecognizerResult.Invoke(result.ToString());
            }
        }
    }
}

最后就是Unity录音然后调用转换的具体方法了

using System.Collections;
using System.Collections.Generic;
using UnityEngine;
using iFlytekSpeechRecognizer;
using System;
using UnityEngine.UI;

public class SpeechRecognizer : MonoBehaviour
{
    public AudioSource _audio;
    public Text text;

    private int frequency = 16000;//采样率
    private const string app_id = "appid = 5940ac5d";
    #region 参数
    /*
    *sub:本次识别请求的类型  iat 连续语音识别;   asr 语法、关键词识别,默认为iat
    *domain:领域      iat:连续语音识别  asr:语法、关键词识别    search:热词   video:视频    poi:地名  music:音乐    默认为iat。 注意:sub=asr时,domain只能为asr
    *language:语言    zh_cn:简体中文  zh_tw:繁体中文  en_us:英文    默认值:zh_cn
    *accent:语言区域    mandarin:普通话    cantonese:粤语    lmz:四川话 默认值:mandarin
    *sample_rate:音频采样率  可取值:16000,8000  默认值:16000   离线识别不支持8000采样率音频
    *result_type:结果格式   可取值:plain,json  默认值:plain
    *result_encoding:识别结果字符串所用编码格式  GB2312;UTF-8;UNICODE    不同的格式支持不同的编码:   plain:UTF-8,GB2312  json:UTF-8
    */
    #endregion
    private const string session_begin_params = "sub = iat, domain = iat, language = zh_cn, accent = mandarin, sample_rate = 16000, result_type = plain, result_encoding = utf-8";
    // Start is called before the first frame update
    void Start()
    {
        iFlytek.InitiFlytek(app_id, session_begin_params);
        iFlytek.RecognizerResult += Result;
    }

    // Update is called once per frame
    void Update()
    {

    }

    public void StartSpeechRecording()
    {
        _audio.Stop();//停止上一个音频的播放
        _audio.clip = Microphone.Start(null, false, 5, frequency);//开始录制音频,3秒
        //while (Microphone.GetPosition(null) <= 0) { Debug.Log("null"); }//防止音频播放出错
    }
    public void StopSpeechRecording()
    {
        if (Microphone.IsRecording(null)) { Microphone.End(null); }//如果麦克没有在录制音频
        Debug.Log("开始播放音频");
        //_audio.Play();
        // audio.Stop();//停止播放音频
        Debug.Log("停止录音");
        byte[] AudioData = AudioClipToByte(_audio.clip);
        //调用语音识别函数
        Debug.Log("开始语音识别");
        iFlytek.StartRecording(AudioData);
    }
    public void Result(string result)
    {
        Debug.Log(result);
        text.text = result;
    }

    private void OnApplicationQuit()
    {
        iFlytek.QuitiFlytek();
    }

    public byte[] AudioClipToByte(AudioClip clip)
    {
        float[] data = new float[clip.samples];
        clip.GetData(data, 0);
        int rescaleFactor = 32767; //to convert float to Int16
        byte[] outData = new byte[data.Length * 2];
        for(int i = 0; i < data.Length; i++)
        {
            short temshort = (short)(data[i] * rescaleFactor);
            byte[] temdata = BitConverter.GetBytes(temshort);
            outData[i * 2] = temdata[0];
            outData[i * 2 + 1] = temdata[1];
        }
        return outData;
    }
}

最后将SDK包中的三个文件夹导入到新建的工程中。每个应用对应一个appid,每个应用的sdk都要和appid对应上。我这个只是测试用的,想要用到实际项目中要在讯飞上创建应用下载sdk。下载链接: https://pan.baidu.com/s/1Bf8L7uuuUXPwG9QyBZZGjQ 提取码: cj9m

You May Also Like

About the Author: 大腿Plus

发表评论