国产成人精品三级麻豆,色综合天天综合高清网,亚洲精品夜夜夜,国产成人综合在线女婷五月99播放,色婷婷色综合激情国产日韩

當(dāng)前位置:首頁 > 嵌入式培訓(xùn) > Linux學(xué)習(xí) > linux入門 > linux語音識(shí)別程序就是這么簡(jiǎn)單

linux語音識(shí)別程序就是這么簡(jiǎn)單 時(shí)間:2018-07-19      來源:未知

linux語音識(shí)別技術(shù)對(duì)于一些熟練掌握的人而言是很有意思的,但是對(duì)于一些對(duì)這方面苦惱的人來說,linux語音識(shí)別毫無樂趣而言,而對(duì)于我這久經(jīng)沙場(chǎng)的人來說,linux語音識(shí)別程序是很容易的,在這里分享一些linux語音識(shí)別程序的詳細(xì)步驟,對(duì)這方面有迷惑的人,讓你加快學(xué)習(xí)的速度。

我之前在學(xué)習(xí)的時(shí)候做過一個(gè)貪吃蛇小游戲,本來打算想把這個(gè)游戲弄成語音控制的,在我工作了以后一直也沒有時(shí)間,就在幾天前,應(yīng)一位小學(xué)弟的要求,今天就用這個(gè)小游戲來舉例,讓你學(xué)會(huì)linux語音識(shí)別。

linux語音識(shí)別

剛開始你需要去下載一個(gè)科大訊飛的SDK-linux版本,需要注冊(cè)先。。。在下載下來的include文件夾下,有四個(gè)文件:msp_errors.h msp_types.h qisr.h qtts.h。這四個(gè)文件前面的兩個(gè)是通用的數(shù)據(jù)結(jié)構(gòu),而后面的一個(gè)是語音識(shí)別用的頭文件,一個(gè)是語音合成用的頭文件,因?yàn)槲揖托枰Z音識(shí)別的功能,只要在我的代碼中include進(jìn)qisr.h頭文件就OK啦。在bin文件夾下比較亂,但主要就是libmsc.so和libspeex.so兩個(gè)動(dòng)態(tài)庫(kù),我直接把這兩個(gè)動(dòng)態(tài)庫(kù)拷到/usr/lib里面。

在bin文件夾下注意到一個(gè)asr_keywords_utf8.txt的文件,這個(gè)SDK的你需要知道思路:你把你想識(shí)別的文字寫到asr_keywords_utf8.txt中,接下來上傳到訊飛的服務(wù)器上,然后返回一個(gè)GrammarID,據(jù)說上傳一次“終身有效”,意思就是不讓重復(fù)上傳占用服務(wù)器空間,反正有了這個(gè)GrammarID以后在不同的程序中想識(shí)別相同的文字就直接用好了,比如我想識(shí)別“左,右,上,下,圖書館,獨(dú)自”,把這些漢字寫到asr_keywords_utf8.txt中,而且必須是utf-8的格式,當(dāng)然在linux下默認(rèn)如此。下面展示一下我寫的上傳這個(gè)txt并獲得GrammarID的代碼:

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

}

記住要達(dá)到這個(gè)效果以后,把這些記下來就好了,接下來的一個(gè)步驟要好好挺,就是錄制了,在這里有一個(gè)點(diǎn)需要注意一下,就是不能直接用ubuntu自帶的錄音機(jī),那樣會(huì)識(shí)別不了,自帶的錄音軟件都是默認(rèn)32位采樣,只能用ffmpeg或自己寫代碼錄制,ffmpeg命令如下:

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

我錄制了2秒音頻,就會(huì)有識(shí)別代碼:

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

}

識(shí)別后,你就會(huì)看到輸出結(jié)果如下:

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.

還有一個(gè)注意的點(diǎn)這個(gè)輸出格式是個(gè)坑,因?yàn)楣俜降睦幽J(rèn)是直接輸出識(shí)別的結(jié)果,但是結(jié)果是GB2312格式的,在linux終端下是亂碼,在這里你要注意:在QISRSessionBegin()函數(shù)初始化的時(shí)候第二個(gè)參數(shù)param中的rst改成json,就是按照json格式把所有結(jié)果全輸出來后,是utf8格式的漢字,之后再用json模塊來解就妥妥的了~整體代碼很清晰。

1.先要調(diào)用QISRInit()函數(shù),參數(shù)是自己的appid,每個(gè)SDK都是注冊(cè)才能下載的,所以是唯一的,用來區(qū)分用戶的,不同級(jí)別的用戶每天可以使用SDK的次數(shù)有限制,畢竟人用的多了語音識(shí)別的性能肯定會(huì)下降;

linux語音識(shí)別

2.之后就是把GrammarID,輸入輸出的參數(shù)param和調(diào)用狀態(tài)返回值ret作為參數(shù)傳入QISRSessionBegin()函數(shù)中進(jìn)行初始化,返回值是sessionID,這個(gè)是后面所有函數(shù)的主要參數(shù)之一;

3.打開自己的音頻文件,調(diào)用QISRAudioWrite()函數(shù)寫入,可以分段也可以一次,第一個(gè)參數(shù)是sessionID,上面初始化函數(shù)返回的值,第二個(gè)參數(shù)是音頻數(shù)據(jù)頭指針,第三個(gè)參數(shù)是音頻文件大小,第四個(gè)參數(shù)是音頻發(fā)送的狀態(tài),表示發(fā)送完了沒有,剩下兩個(gè)是服務(wù)器端檢測(cè)語音狀態(tài)和識(shí)別狀態(tài)的返回值;

4.調(diào)用QISRGetResult()函數(shù)獲取識(shí)別的結(jié)果,第一個(gè)參數(shù)還是sessionID,第二個(gè)參數(shù)是輸出識(shí)別的狀態(tài),第三個(gè)參數(shù)是與服務(wù)器交互的間隔時(shí)間,官方建議5000,我取為0,第四個(gè)參數(shù)是調(diào)用狀態(tài)返回值ret,最后這個(gè)函數(shù)的返回值就是上面結(jié)果的json數(shù)據(jù)了;

linux語音識(shí)別程序你是不是已經(jīng)掌握了呢,你可以多看幾遍,先做一個(gè)簡(jiǎn)單的,接下來有簡(jiǎn)到難,明白了其中的道理,那么你就是linux語音識(shí)別程序的大神了。

上一篇:嵌入式linux開發(fā)流程,大牛詳細(xì)總結(jié)

下一篇:嵌入式linux項(xiàng)目實(shí)例,嵌入式學(xué)霸總結(jié)

熱點(diǎn)文章推薦
華清學(xué)員就業(yè)榜單
高薪學(xué)員經(jīng)驗(yàn)分享
熱點(diǎn)新聞推薦
前臺(tái)專線:010-82525158 企業(yè)培訓(xùn)洽談專線:010-82525379 院校合作洽談專線:010-82525379 Copyright © 2004-2022 北京華清遠(yuǎn)見科技集團(tuán)有限公司 版權(quán)所有 ,京ICP備16055225號(hào)-5,京公海網(wǎng)安備11010802025203號(hào)

回到頂部