久久婷婷香蕉热狠狠综合,精品无码国产自产拍在线观看蜜,寡妇房东在做爰3,中文字幕日本人妻久久久免费,国产成人精品三上悠亚久久

當前位置:首頁 > 嵌入式培訓 > Linux學習 > linux入門 > linux語音識別程序就(jiu)是這(zhe)么簡(jian)單

linux語(yu)音(yin)識別程序就(jiu)是這么簡單 時(shi)間:2018-07-19      來源:未(wei)知

linux語(yu)(yu)(yu)音識別(bie)(bie)技術對(dui)于(yu)一些熟練掌握的(de)人(ren)(ren)(ren)而(er)言是很有意思(si)的(de),但是對(dui)于(yu)一些對(dui)這(zhe)(zhe)方面(mian)苦惱的(de)人(ren)(ren)(ren)來說,linux語(yu)(yu)(yu)音識別(bie)(bie)毫無(wu)樂(le)趣而(er)言,而(er)對(dui)于(yu)我這(zhe)(zhe)久經沙場的(de)人(ren)(ren)(ren)來說,linux語(yu)(yu)(yu)音識別(bie)(bie)程序是很容易的(de),在這(zhe)(zhe)里(li)分(fen)享一些linux語(yu)(yu)(yu)音識別(bie)(bie)程序的(de)詳細步驟,對(dui)這(zhe)(zhe)方面(mian)有迷惑的(de)人(ren)(ren)(ren),讓你加快(kuai)學習(xi)的(de)速度。

我(wo)之前在(zai)學習的(de)時候做過一個貪吃蛇小(xiao)游戲,本來打算想把(ba)這(zhe)個游戲弄成語音(yin)控(kong)制(zhi)的(de),在(zai)我(wo)工作(zuo)了以后一直也沒(mei)有時間(jian),就在(zai)幾天前,應一位小(xiao)學弟的(de)要求(qiu),今(jin)天就用(yong)這(zhe)個小(xiao)游戲來舉例,讓你學會linux語音(yin)識別。

linux語音識別

剛開(kai)始你需要(yao)去(qu)下(xia)(xia)(xia)(xia)載一個(ge)(ge)科大訊飛的SDK-linux版本,需要(yao)注(zhu)冊(ce)先。。。在(zai)下(xia)(xia)(xia)(xia)載下(xia)(xia)(xia)(xia)來的include文(wen)(wen)(wen)件(jian)(jian)夾(jia)(jia)下(xia)(xia)(xia)(xia),有四個(ge)(ge)文(wen)(wen)(wen)件(jian)(jian):msp_errors.h msp_types.h qisr.h qtts.h。這四個(ge)(ge)文(wen)(wen)(wen)件(jian)(jian)前面(mian)的兩(liang)個(ge)(ge)是(shi)通(tong)用(yong)的數據(ju)結(jie)構,而(er)后(hou)面(mian)的一個(ge)(ge)是(shi)語(yu)音(yin)(yin)識(shi)別用(yong)的頭(tou)文(wen)(wen)(wen)件(jian)(jian),一個(ge)(ge)是(shi)語(yu)音(yin)(yin)合成用(yong)的頭(tou)文(wen)(wen)(wen)件(jian)(jian),因為我就(jiu)需要(yao)語(yu)音(yin)(yin)識(shi)別的功能(neng),只要(yao)在(zai)我的代碼中include進qisr.h頭(tou)文(wen)(wen)(wen)件(jian)(jian)就(jiu)OK啦(la)。在(zai)bin文(wen)(wen)(wen)件(jian)(jian)夾(jia)(jia)下(xia)(xia)(xia)(xia)比較亂,但主要(yao)就(jiu)是(shi)libmsc.so和libspeex.so兩(liang)個(ge)(ge)動態庫,我直接把這兩(liang)個(ge)(ge)動態庫拷到/usr/lib里面(mian)。

在(zai)bin文(wen)件夾下(xia)注意到(dao)一(yi)(yi)個(ge)(ge)asr_keywords_utf8.txt的(de)(de)文(wen)件,這個(ge)(ge)SDK的(de)(de)你(ni)需(xu)要知道思路(lu):你(ni)把(ba)你(ni)想(xiang)識別(bie)的(de)(de)文(wen)字寫到(dao)asr_keywords_utf8.txt中,接下(xia)來(lai)上(shang)(shang)傳到(dao)訊飛的(de)(de)服務(wu)(wu)器上(shang)(shang),然后返回一(yi)(yi)個(ge)(ge)GrammarID,據說上(shang)(shang)傳一(yi)(yi)次“終(zhong)身(shen)有效”,意思就是(shi)不讓重復上(shang)(shang)傳占用服務(wu)(wu)器空間(jian),反正有了這個(ge)(ge)GrammarID以(yi)后在(zai)不同的(de)(de)程(cheng)序中想(xiang)識別(bie)相同的(de)(de)文(wen)字就直接用好了,比(bi)如我想(xiang)識別(bie)“左,右,上(shang)(shang),下(xia),圖書館,獨自”,把(ba)這些漢字寫到(dao)asr_keywords_utf8.txt中,而(er)且必須是(shi)utf-8的(de)(de)格式,當然在(zai)linux下(xia)默(mo)認(ren)如此。下(xia)面展示一(yi)(yi)下(xia)我寫的(de)(de)上(shang)(shang)傳這個(ge)(ge)txt并獲得(de)GrammarID的(de)(de)代碼:

#include

#include

#include

#include

#include

#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;

}

記住要(yao)達到這(zhe)個效果以(yi)后,把這(zhe)些記下(xia)來就好(hao)了(le)(le),接下(xia)來的一(yi)(yi)個步(bu)驟要(yao)好(hao)好(hao)挺,就是(shi)錄(lu)(lu)(lu)制了(le)(le),在這(zhe)里有(you)一(yi)(yi)個點需要(yao)注意一(yi)(yi)下(xia),就是(shi)不能直(zhi)接用(yong)ubuntu自帶的錄(lu)(lu)(lu)音(yin)機(ji),那樣會識別不了(le)(le),自帶的錄(lu)(lu)(lu)音(yin)軟件都是(shi)默認32位(wei)采(cai)樣,只能用(yong)ffmpeg或(huo)自己寫代(dai)碼(ma)錄(lu)(lu)(lu)制,ffmpeg命令如下(xia):

ffmpeg -f alsa -i hw:0 -ar 16000 -ac 1 lib.wav

我錄制了(le)2秒音頻,就會有識(shi)別代碼(ma):

#include

#include

#include

#include

#include

#define TRUE 1

#define FALSE 0

int run_asr(const char* asrfile);

const int BUFFER_NUM = 4096;

const int MAX_KEYWORD_LEN = 4096;

int main(int argc, char* argv[])

{

int ret = MSP_SUCCESS;

const char* asrfile ="lib.wav";

ret = QISRInit("appid=xxxxxx");

if(ret != MSP_SUCCESS)

{

printf("QISRInit with errorCode: %d \n", ret);

return 0;

}

ret = run_asr(asrfile);

QISRFini();

char key = getchar();

return 0;

}

int run_asr(const char* asrfile)

{

int ret = MSP_SUCCESS;

int i = 0;

FILE* fp = NULL;

char buff[BUFFER_NUM];

unsigned int len;

int status = MSP_AUDIO_SAMPLE_CONTINUE, ep_status = -1, rec_status = -1, rslt_status = -1;

//const char* GrammarID="e7eb1a443ee143d5e7ac52cb794810fe";

const char *GrammarID="c66d4eecd37d4fe1c8274a2224b832d5";

const char* param = "rst=json,sub=asr,ssm=1,aue=speex,auf=audio/L16;rate=16000";//注意sub=asr

const char* sess_id = QISRSessionBegin(GrammarID, param, &ret);

if ( MSP_SUCCESS != ret )

{

printf("QISRSessionBegin err %d\n", ret);

return ret;

}

fp = fopen( asrfile , "rb");

if ( NULL == fp )

{

printf("failed to open file,please check the file.\n");

QISRSessionEnd(sess_id, "normal");

return -1;

}

printf("writing audio...\n");

//

int count=0;

//

while ( !feof(fp) )

{

len = (unsigned int)fread(buff, 1, BUFFER_NUM, fp);

feof(fp) ? status = MSP_AUDIO_SAMPLE_LAST : status = MSP_AUDIO_SAMPLE_CONTINUE;

if(status==MSP_AUDIO_SAMPLE_LAST)

printf("MSP_AUDIO_SAMPLE_LAST\n");

if(status==MSP_AUDIO_SAMPLE_CONTINUE)

 printf("MSP_AUDIO_SAMPLE_CONTINUE\n");

//

 ret = QISRAudioWrite(sess_id, buff, len, status, &ep_status, &rec_status);

if ( ret != MSP_SUCCESS )

{

printf("\nQISRAudioWrite err %d\n", ret);

break;

}

//

printf("%d\n",count++);

//

if ( rec_status == MSP_REC_STATUS_SUCCESS )

{

const char* result = QISRGetResult(sess_id, &rslt_status, 0, &ret);

if (ret != MSP_SUCCESS )

{

printf("error code: %d\n", ret);

break;

}

else if( rslt_status == MSP_REC_STATUS_NO_MATCH )

printf("get result nomatch\n");

else

{

if ( result != NULL )

printf("get result[%d/%d]:len:%d\n %s\n", ret, rslt_status,strlen(result), result);

}

}

printf(".");

}

printf("\n");

if (ret == MSP_SUCCESS)

{

printf("get reuslt~~~~~~~\n");

char asr_result[1024] = "";

unsigned int pos_of_result = 0;

int loop_count = 0;

do

{

const char* result = QISRGetResult(sess_id, &rslt_status, 0, &ret);

if ( ret != 0 )

{

printf("QISRGetResult err %d\n", ret);

break;

}

if( rslt_status == MSP_REC_STATUS_NO_MATCH )

{

printf("get result nomatch\n");

}

else if ( result != NULL )

{

//

FILE*f=fopen("data.txt","wb");

printf("~~~%d\n",strlen(result));

fwrite(result,1,strlen(result),f);

fclose(f);

//

printf("[%d]:get result[%d/%d]: %s\n", (loop_count), ret, rslt_status, result);

strcpy(asr_result+pos_of_result,result);

pos_of_result += (unsigned int)strlen(result);

}

else

{

printf("[%d]:get result[%d/%d]\n",(loop_count), ret, rslt_status);

}

usleep(500000);

} while (rslt_status != MSP_REC_STATUS_COMPLETE && loop_count++ < 30);

if (strcmp(asr_result,"")==0)

{

printf("no result\n");

}

}

QISRSessionEnd(sess_id, NULL);

printf("QISRSessionEnd.\n");

fclose(fp);

return 0;

}

識(shi)別后,你就會看到輸出結果如下(xia):

kl@kl-Latitude:~/xunfeiSDK$ ./a.out

writing audio...

MSP_AUDIO_SAMPLE_CONTINUE

0

.MSP_AUDIO_SAMPLE_CONTINUE

1

.MSP_AUDIO_SAMPLE_CONTINUE

2

.MSP_AUDIO_SAMPLE_CONTINUE

3

.MSP_AUDIO_SAMPLE_CONTINUE

4

.MSP_AUDIO_SAMPLE_CONTINUE

5

.MSP_AUDIO_SAMPLE_CONTINUE

6

.MSP_AUDIO_SAMPLE_CONTINUE

7

.MSP_AUDIO_SAMPLE_CONTINUE

8

.MSP_AUDIO_SAMPLE_CONTINUE

9

.MSP_AUDIO_SAMPLE_CONTINUE

10

.MSP_AUDIO_SAMPLE_CONTINUE

11

.MSP_AUDIO_SAMPLE_CONTINUE

12

.MSP_AUDIO_SAMPLE_CONTINUE

13

.MSP_AUDIO_SAMPLE_CONTINUE

14

.MSP_AUDIO_SAMPLE_CONTINUE

15

.MSP_AUDIO_SAMPLE_CONTINUE

16

.MSP_AUDIO_SAMPLE_CONTINUE

17

.MSP_AUDIO_SAMPLE_CONTINUE

18

.MSP_AUDIO_SAMPLE_CONTINUE

19

.MSP_AUDIO_SAMPLE_CONTINUE

20

.MSP_AUDIO_SAMPLE_CONTINUE

21

.MSP_AUDIO_SAMPLE_CONTINUE

22

.MSP_AUDIO_SAMPLE_LAST

23

.

get reuslt~~~~~~~

[0]:get result[0/2]

~~~123

[1]:get result[0/5]: {"sn":1,"ls":true,"bg":0,"ed":0,"ws":[{"bg":0,"cw":[{"sc":"85","gm":"0","w":"圖書館","mn":[{"contact":"圖書館"}]}]}]}

QISRSessionEnd.

還有一(yi)個(ge)注(zhu)意的(de)(de)(de)點(dian)這個(ge)輸(shu)(shu)出格(ge)(ge)式是(shi)個(ge)坑,因為(wei)官方的(de)(de)(de)例子默認是(shi)直接輸(shu)(shu)出識(shi)別的(de)(de)(de)結果(guo),但是(shi)結果(guo)是(shi)GB2312格(ge)(ge)式的(de)(de)(de),在linux終(zhong)端下是(shi)亂(luan)碼(ma),在這里你要(yao)注(zhu)意:在QISRSessionBegin()函數(shu)(shu)初始化的(de)(de)(de)時候(hou)第(di)二個(ge)參數(shu)(shu)param中(zhong)的(de)(de)(de)rst改成json,就是(shi)按照json格(ge)(ge)式把所有結果(guo)全輸(shu)(shu)出來(lai)后,是(shi)utf8格(ge)(ge)式的(de)(de)(de)漢(han)字,之后再用json模(mo)塊來(lai)解(jie)就妥妥的(de)(de)(de)了~整體代碼(ma)很清晰。

1.先要調用(yong)(yong)QISRInit()函數,參數是自己的(de)(de)appid,每(mei)個SDK都是注冊才能下載的(de)(de),所以是唯(wei)一的(de)(de),用(yong)(yong)來區分用(yong)(yong)戶(hu)的(de)(de),不(bu)同(tong)級別的(de)(de)用(yong)(yong)戶(hu)每(mei)天可(ke)以使用(yong)(yong)SDK的(de)(de)次(ci)數有(you)限制,畢竟(jing)人(ren)用(yong)(yong)的(de)(de)多了語音(yin)識別的(de)(de)性(xing)能肯定會下降(jiang);

linux語音識別

2.之后就是把(ba)GrammarID,輸入輸出的參數param和調用狀態返回(hui)值(zhi)ret作為參數傳入QISRSessionBegin()函(han)數中進行(xing)初始化,返回(hui)值(zhi)是sessionID,這個是后面(mian)所有函(han)數的主要參數之一;

3.打開(kai)自己的(de)音(yin)頻文件(jian),調(diao)用(yong)QISRAudioWrite()函數(shu)(shu)寫入(ru),可以分段(duan)也可以一(yi)次,第(di)一(yi)個(ge)(ge)(ge)(ge)參(can)數(shu)(shu)是sessionID,上面(mian)初始化函數(shu)(shu)返(fan)回(hui)的(de)值,第(di)二個(ge)(ge)(ge)(ge)參(can)數(shu)(shu)是音(yin)頻數(shu)(shu)據頭指(zhi)針(zhen),第(di)三個(ge)(ge)(ge)(ge)參(can)數(shu)(shu)是音(yin)頻文件(jian)大小,第(di)四個(ge)(ge)(ge)(ge)參(can)數(shu)(shu)是音(yin)頻發(fa)送的(de)狀(zhuang)態(tai),表示發(fa)送完(wan)了(le)沒(mei)有,剩下兩個(ge)(ge)(ge)(ge)是服(fu)務(wu)器端(duan)檢測(ce)語音(yin)狀(zhuang)態(tai)和識別狀(zhuang)態(tai)的(de)返(fan)回(hui)值;

4.調用QISRGetResult()函數(shu)獲取識別的(de)結果,第一個參(can)數(shu)還是sessionID,第二個參(can)數(shu)是輸出識別的(de)狀態(tai),第三個參(can)數(shu)是與服務器交(jiao)互的(de)間隔時間,官方建議5000,我(wo)取為0,第四個參(can)數(shu)是調用狀態(tai)返回值(zhi)(zhi)ret,最后這個函數(shu)的(de)返回值(zhi)(zhi)就是上面結果的(de)json數(shu)據(ju)了;

linux語音(yin)識別程(cheng)(cheng)序你(ni)是(shi)(shi)不是(shi)(shi)已經掌握了(le)呢,你(ni)可以多看幾遍,先做(zuo)一個簡(jian)單的,接下來有簡(jian)到難,明白了(le)其中(zhong)的道理,那(nei)么你(ni)就是(shi)(shi)linux語音(yin)識別程(cheng)(cheng)序的大神了(le)。

上一篇:嵌入式linux開發流程,大牛詳細總結

下一篇:嵌入式linux項目實例,嵌入式學霸總結

熱點文(wen)章推(tui)薦
華清學員就(jiu)業榜單
高薪(xin)學員經驗分享
熱點新聞推薦
前臺專線(xian):010-82525158 企(qi)業培訓洽(qia)談專線:010-82525379 院校合(he)作洽談專線:010-82525379 Copyright © 2004-2022 北京華清遠見科技集團有限公司 版權所有 ,,京公海網安備11010802025203號

回到頂部