GEC6818科大訊飛離線語(yǔ)音識(shí)別
一、 下載科大訊飛離線語(yǔ)音SDK
在下載SDK時(shí)需要注意選擇Linux的版本??!
在官網(wǎng)下載離線語(yǔ)音的包,解壓后可以得到下面的一些文件夾:
二、 解壓文件夾后
解壓后你需要知道自己命令放在下面的文件夾中
關(guān)于Make file文件:
關(guān)于asr_offline_sample.c文件:
asr_offline_sample.c
文件是我們更改為自己的邏輯的文件,但是也不需要都了解清楚只要會(huì)改就行。
更改完asr_offline_sample.c
文件后,在ubantu里面運(yùn)行makefile文件后會(huì)有一些警告,這些都是定義的問題,可以不用管,但是在./asr_offline_sample
運(yùn)行的時(shí)候會(huì)報(bào)錯(cuò)找不到庫(kù),所以我們需要將資料包里面文件復(fù)制到lib目錄下,具體如下:
需要移動(dòng)的文件:
執(zhí)行命令:
cp ./libmsc.so /lib
注意前面的`./libmsc.so`是相對(duì)路徑,可以根據(jù)自己的當(dāng)前路徑進(jìn)行更改,后面是移動(dòng)到根目錄下的lib目錄下。
然后再執(zhí)行就不會(huì)報(bào)錯(cuò)了。
三、與GEC6818開發(fā)板一起使用
3.1 使用科大訊飛的離線語(yǔ)音在ubantu中運(yùn)行,作為服務(wù)端進(jìn)行關(guān)鍵字的識(shí)別
需要更改的重要的兩個(gè)文件就是bin/call.bnf
和samples/asr_offine_sample/asr_offine_sample.c
.這兩個(gè)文件,第一個(gè)文件是修改我們需要識(shí)別的字眼,第二個(gè)文件是C 語(yǔ)言代碼,可以在官方的基礎(chǔ)上修改為自己所需要的邏輯
3.2 call.bnf–>hehe.bnf
我自己將官方自帶的call.bnf復(fù)制了一份修改名字為hehe.bnf,在新的基礎(chǔ)上進(jìn)行的修改,更改了這個(gè)文件后,需要在后面的例程中的.c文件中修改這個(gè)文件。
例如:
注意我們這里使用對(duì)應(yīng)的ID是非常重要的,因?yàn)槲液蠛罄m(xù)進(jìn)行語(yǔ)音識(shí)別后就是根據(jù)這個(gè)ID來(lái)判斷識(shí)別到的內(nèi)容,然后在執(zhí)行相應(yīng)的操作。
3.3 asr_offine_sample.c文件修改
上面有提到過的修改了離線語(yǔ)法文件后在.c文件中也需要修改相應(yīng)的文件名
修改后的代碼–當(dāng)然也可以不用這樣大幅度的修改,只是將官方的代碼進(jìn)行了規(guī)整。文章來(lái)源:http://www.zghlxwxcb.cn/news/detail-797178.html
//服務(wù)器
#include <stdio.h>
#include <sys/types.h> /* See NOTES */
#include <sys/socket.h>
#include <arpa/inet.h>
#include <stdlib.h>
#include <unistd.h>
#include <pthread.h>
#include <string.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "asr_offline_sample.h" //科大訊飛
//全局的套接字
int sockfd = -1;
//將套接字創(chuàng)建好 并且綁定 監(jiān)聽
//將ip地址和端口號(hào)傳進(jìn)來(lái) 端口號(hào)釋放需要時(shí)間(輪詢機(jī)制)
void TcpInit(const char * ipaddr,unsigned short port)
{
//1 創(chuàng)建套接字 ---- 神馬都是文件,因此你的網(wǎng)絡(luò)通信也是一個(gè)文件
sockfd = socket(AF_INET,SOCK_STREAM,0);
if(-1 == sockfd)
{
perror("server socket error");
exit(1);//沒有必要運(yùn)行了
}
//2 我們需要將服務(wù)器的IP地址綁定到套接字
struct sockaddr_in sa;
sa.sin_family = AF_INET;//協(xié)議族
sa.sin_port = htons(port);//端口號(hào) 內(nèi)存是小端的 我們要轉(zhuǎn)大端
sa.sin_addr.s_addr = inet_addr(ipaddr);//將我們點(diǎn)分式的ip地址轉(zhuǎn)換為一個(gè)大端整數(shù)
//printf("ipaddr = %x port = %x\n",inet_addr(ipaddr),htons(port));
int r = bind(sockfd,(struct sockaddr *)&sa,sizeof(sa));
if(-1 == r)
{
perror("server bind error");
exit(2);//沒有必要運(yùn)行了
}
//3 監(jiān)聽連接 ---- 創(chuàng)建一個(gè)監(jiān)聽隊(duì)列 建立5個(gè)10個(gè)可以了
listen(sockfd,5);
}
//接收客戶端發(fā)過來(lái)的文件內(nèi)容
void SaveFile(int accceptfd,int filesize)
{
//每一次都是重復(fù)的覆蓋hehe.pcm
int fd = open("wav/hehe.pcm",O_RDWR | O_TRUNC|O_CREAT,0644);//截短這個(gè)文件
if(-1 == fd)
{
send(accceptfd,"error!!!",9,0);//失敗發(fā)送這個(gè)錯(cuò)誤
return;
}
send(accceptfd,"next!!!!",9,0);//發(fā)送下一步的指令
unsigned char buf[1024] = {0};
int size = 0;
//接收文件的內(nèi)容
while(1)
{
int r = recv(accceptfd,buf,1024,0);
if(-1 == r)
{
perror("recv error");
break;
}
else if(0 == r)//客戶端已經(jīng)斷了
{
printf("對(duì)方斷開連接了\n");
break;
}
else//接收到信息了
{
//將文件的內(nèi)容寫入到文件
write(fd,buf,r);
//做完之后要退出
size += r;
if(size >= filesize)
break;
}
}
close(fd);
}
//專門用于去服務(wù)一個(gè)客戶的線程
void * ClinetFunction(void * arg)
{
pthread_detach(pthread_self());//將其分離
int * accceptfd = (int *)arg;
printf(" * accceptfd = %d\n", * accceptfd);
int filesize = 0;
//你發(fā)什么信息過來(lái) 我就在這個(gè)信息之前加上一節(jié) 然后回發(fā)給你
while(1)
{
printf("\t\t等待客戶端傳文件過來(lái)........\n");
int r = recv(*accceptfd,&filesize,4,0);//阻塞等待數(shù)據(jù)過來(lái)
if(-1 == r)
{
perror("recv error");
break;
}
else if(0 == r)//客戶端已經(jīng)斷了
{
printf("對(duì)方斷開連接了\n");
break;
}
else//接收到信息了
{
//文件大小
SaveFile(* accceptfd,filesize);
int id = GetFlayId();//文件接收完畢 那么我們就放過去識(shí)別即可
//給客戶端返回id
send(* accceptfd,&id,4,0);
}
}
close(*accceptfd);
free(accceptfd);
return NULL;
}
//等待客戶端的連接
void waitconnect(void)
{
//我們要基于這個(gè)連接套接字去通信
struct sockaddr_in sa;
socklen_t addrlen = sizeof(sa);
while(1)
{
printf("一直等待對(duì)方的連接.......\n");
int * accceptfd = malloc(4);//避免釋放 因此我們要?jiǎng)討B(tài)內(nèi)存分配才可以
*accceptfd = accept(sockfd,(struct sockaddr *)&sa,&addrlen);
printf("連接者為:%s %d\n",inet_ntoa(sa.sin_addr),ntohs(sa.sin_port));
//開一個(gè)線程出去 讓它去服務(wù)與我的連接
pthread_t thread;
if(pthread_create(&thread,NULL,ClinetFunction,(void *)accceptfd) != 0)
{
perror("create thread error");
continue;
}
}
close(sockfd);
}
//通過main函數(shù)的參數(shù) 我們將這個(gè)ip地址和端口給進(jìn)去
//./a.out 192.168.31.251 8888
int main(int argc,char * argv[])
{
if(argc < 3)
{
printf("參數(shù)都不齊\n");
return -1;
}
//初始化科大訊飛的庫(kù)
FlayInit();
TcpInit(argv[1],atoi(argv[2]));
waitconnect();
return 0;
}
完整的工程大家可以在我的gitee上進(jìn)行下載
下載地址:GEC6818智能語(yǔ)音家居系統(tǒng)文章來(lái)源地址http://www.zghlxwxcb.cn/news/detail-797178.html
到了這里,關(guān)于GEC6818科大訊飛離線語(yǔ)音識(shí)別的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!