我之前发过我的贪吃蛇的代码,我想把它变成语音控制上下左右的,于是选择科大讯飞的SDK,官方有一些文档,但有一些细节还是会让在linux下开发的孩子们产生困惑比如我,现在总结在此~
首先下载科大讯飞的SDK-linux版本,需要注册先。。。在下载下来的include文件夹下,有四个文件:msp_errors.h msp_types.h qisr.h qtts.h。前两个是通用的一些数据结构,剩下的qisr.h是语音识别用的头文件,qtts.h是语音合成用的头文件,因为我之需要语音识别的功能,只要在我的代码中include进qisr.h头文件就OK啦。在bin文件夹下比较乱,但主要就是libmsc.so和libspeex.so两个动态库,我直接把这两个动态库拷到/usr/lib里面。
在bin文件夹下注意到一个asr_keywords_utf8.txt的文件,这个SDK的思路是这样:把自己想识别的文字写到asr_keywords_utf8.txt中,然后上传到讯飞的服务器上,然后返回一个GrammarID,据说上传一次“终身有效”,意思就是不让重复上传占用服务器空间,反正有了这个GrammarID以后在不同的程序中想识别相同的文字就直接用好了,比如我想识别“左,右,上,下,图书馆,独自”,把这些汉字写到asr_keywords_utf8.txt中,而且必须是utf-8的格式,当然在linux下默认如此。下面是我写的上传这个txt并获得GrammarID的代码:
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <unistd.h> #include <qisr.h> #define TRUE 1 #define FALSE 0 int main() { int ret = QISRInit("appid=xxxxxxx"); if(ret != MSP_SUCCESS) { printf("QISRInit with errorCode: %d \n", ret); return 0; } char GrammarID[128]; memset(GrammarID, 0, sizeof(GrammarID)); const int MAX_KEYWORD_LEN = 4096; ret = MSP_SUCCESS; const char * sessionID = NULL; sessionID = QISRSessionBegin(NULL, "ssm=1,sub=asr", &ret); if(ret != MSP_SUCCESS) { printf("QISRSessionBegin with errorCode: %d \n", ret); return ret; } char UserData[MAX_KEYWORD_LEN]; memset(UserData, 0, MAX_KEYWORD_LEN); FILE* fp = fopen("asr_keywords_utf8.txt", "rb"); if (fp == NULL) { printf("keyword file cannot open\n"); return -1; } unsigned int len = (unsigned int)fread(UserData, 1, MAX_KEYWORD_LEN, fp); UserData[len] = 0; fclose(fp); const char* testID = QISRUploadData(sessionID, "contact", UserData, len, "dtt=keylist", &ret); if(ret != MSP_SUCCESS) { printf("QISRUploadData with errorCode: %d \n", ret); return ret; } memcpy((void*)GrammarID, testID, strlen(testID)); printf("GrammarID: \"%s\" \n", GrammarID); QISRSessionEnd(sessionID, "normal"); return 0; } |