文章目录

  • 【1】Makefile编写
  • 【2】项目图片素材
  • 【3】客户端Client_Tcp.c
  • 【4】客户端配套lcd.c
  • 【5】服务器代码
  • 【6】源码分享

【1】Makefile编写

all:
arm-linux-gcc Client_Tcp.c lcd.c  -o main -I./include -L./lib -ljpeg -pthread.PHONY:clean
clean:rm -r  main

【2】项目图片素材




【3】客户端Client_Tcp.c


#include <stdio.h>
#include <string.h>
#include <pthread.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/select.h>
#include <sys/socket.h>
#include <stdlib.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <stdbool.h>
#include <sys/stat.h>
#include <fcntl.h>#include "myhead.h"//*********************************************************************************************
/*函数名称: Send_mp3函数功能: 打开音频文件,并发送音频文件给服务器参数:   服务器的套接字返回值:  成功返回0,失败返回-1
*/
int Send_mp3(int sockfd)
{int wav_fp;char file_name[20] = "abc.wav"; wav_fp = open(file_name,O_RDWR); if(wav_fp == -1) { perror("abc.wav open failed");return -1;} //获取文件大小struct stat file_msg;bzero(&file_msg, sizeof(file_msg));stat("abc.wav", &file_msg); //向服务器传入音频文件大小 <1>    那么服务器第一步接收文件大小<1>write(sockfd, &file_msg.st_size, sizeof(file_msg.st_size));//发送数据char *buf;buf = malloc(50000);bzero(buf,50000);int n = 0;while(1){//每次从wav_fd 读取50000存入buf缓冲区n = read(wav_fp, buf, 50000);if(n == 0){printf("读取完毕\n");break;}if(n <0 ){perror("读取失败");return -1;}//通过套接字向服务器传输文件int ret = send(sockfd, buf, n, 0);if(ret == -1){perror("发送失败:");return -1;}printf("成功发送大小:ret = %d\n", ret);}return 0;
}//*********************************************************************************************
/*函数名称: main函数功能: 1.创建套接字 2.连接服务器 3.功能选择参数: IP 端口运行方式: ./client 192.168.24.206 50000返回值: 成功返回0,失败返回-1
*/
int main(int argc,const char *argv[])
{if(argc != 3){printf("./main IP PORT \n");return -1;}lcd_draw_jpg(0,0,"enum.jpg",NULL,0,0);int sockfd = socket(AF_INET,SOCK_STREAM,0);if(sockfd == -1){perror("socket failed");return -1;}struct sockaddr_in saddr;socklen_t slen = sizeof(saddr);bzero(&saddr,sizeof(struct sockaddr_in));saddr.sin_family = AF_INET;saddr.sin_port = htons(50000);        //端口与客户端一致saddr.sin_addr.s_addr = inet_addr("192.168.24.19");   //服务器的IP地址int ret = connect(sockfd,(struct sockaddr *)&saddr,slen);if(ret == -1){perror("connect failed");return -1;}while(1){printf("录音口令->打开:视频|相册|上一张|下一张|暂停|关闭|退出\n");printf("开始录音........");getchar();system("arecord -d3 -c1 -r16000 -twav -fS16_LE abc.wav");//发送录音文件函数int ret = Send_mp3(sockfd);if(ret == -1){printf("send file failed\n");break;}printf("文件发送成功,等待接收回传指令\n");// //发送完删除录音//system("rm abc.wav");while(1){char str_cmd[50] = {0};int CMD =0 ;//接收服务器发送的口令recv(sockfd, str_cmd, 24, 0);if(strstr(str_cmd,"相册")!=NULL)CMD = 0;if(strstr(str_cmd,"上一张")!=NULL)CMD = 1;if(strstr(str_cmd,"下一张")!=NULL)CMD = 2;if(strstr(str_cmd,"视频1")!=NULL)CMD = 3;if(strstr(str_cmd,"暂停")!=NULL)CMD = 4;if(strstr(str_cmd,"继续")!=NULL)CMD = 5;if(strstr(str_cmd,"关闭")!=NULL)CMD = 6;if(strstr(str_cmd,"退出")!=NULL)CMD = 7;if(strstr(str_cmd,"视频2")!=NULL)CMD = 8;switch (CMD){case 0:printf("打开相册\n");//关闭视频system("killall -9 mplayer");lcd_draw_jpg(0,0,"1.jpg",NULL,0,0);break;case 1:printf("打开上一张\n");lcd_draw_jpg(0,0,"2.jpg",NULL,0,0);break;case 2:printf("打开下一张\n");lcd_draw_jpg(0,0,"3.jpg",NULL,0,0);break;case 3://播放视频1system("mplayer -quiet -zoom -x 800 -y 480 2.avi < /dev/null &"); // 后台播放视频break;case 4://暂停视频system("killall -STOP mplayer &");break;case 5://继续播放system("killall -CONT mplayer &");break;case 6:printf("关闭相册\n");lcd_draw_jpg(0,0,"enum.jpg",NULL,0,0);    break;case 7://关闭播放printf("退出视频1\n");system("killall -9 mplayer");lcd_draw_jpg(0,0,"enum.jpg",NULL,0,0);break;case 8://播放视频2system("mplayer -quiet -zoom -x 800 -y 480 kjwei.avi < /dev/null &");break;}break;}  }return 0;
}

【4】客户端配套lcd.c

#include "myhead.h"int lcd_draw_jpg(unsigned int x,unsigned int y,const char *pjpg_path,char *pjpg_buf,unsigned int jpg_buf_size,unsigned int jpg_half);static char g_color_buf[FB_SIZE]={0};static int  g_fb_fd;
static int *g_pfb_memory;volatile int g_jpg_in_jpg_x;
volatile int g_jpg_in_jpg_y;//鑾峰彇鏂囦欢鐨勫睘鎬?unsigned long file_size_get(const char *pfile_path)
{unsigned long filesize = -1;  struct stat statbuff;//鑾峰彇鏂囦欢灞炴€?   if(stat(pfile_path, &statbuff) < 0){return filesize;}else{filesize = statbuff.st_size; //鑾峰彇鏂囦欢澶у皬}return filesize;
}int lcd_open(const char *str)
{g_fb_fd = open(str, O_RDWR);if(g_fb_fd<0){printf("open lcd error\n");return -1;}//鏄犲皠鍥剧墖绌洪棿澶у皬g_pfb_memory  = (int *)mmap(NULL, FB_SIZE,    PROT_READ|PROT_WRITE, MAP_SHARED, g_fb_fd, 0    );if (MAP_FAILED == g_pfb_memory ){printf ("mmap failed %d\n",__LINE__);}return g_fb_fd;}//鍏抽棴鏄犲皠绌洪棿鍜屾枃浠?void close_lcd(void)
{munmap(g_pfb_memory, FB_SIZE);close(g_fb_fd);
}void lcd_draw_point(unsigned int x,unsigned int y, unsigned int color)
{*(g_pfb_memory+y*800+x)=color;
}#if EN_LCD_SHOW_JPG//鏄剧ずjpg鍥剧墖
int lcd_draw_jpg(unsigned int x,unsigned int y,const char *pjpg_path,char *pjpg_buf,unsigned int jpg_buf_size,unsigned int jpg_half)
{//鎵撳紑鏂囦欢璁惧lcd_open("/dev/fb0");struct   jpeg_decompress_struct  cinfo;struct    jpeg_error_mgr  jerr;   char    *pcolor_buf = g_color_buf;char     *pjpg;unsigned int  i=0;unsigned int   color =0;unsigned int  count =0;unsigned int  x_s = x;unsigned int   x_e ;   unsigned int    y_e ;int    jpg_fd;unsigned int     jpg_size;unsigned int   jpg_width;unsigned int  jpg_height;//娌℃湁鏂囦欢鍜屾槧灏勭┖闂? if(pjpg_path == NULL && pjpg_buf == NULL)return -1; if(pjpg_path!=NULL){//鎵撳紑鏂囦欢jpg_fd=open(pjpg_path,O_RDWR);if(jpg_fd == -1){printf("open %s error\n",pjpg_path);return -1; }   //鑾峰彇鏂囦欢澶у皬鍑芥暟jpg_size=file_size_get(pjpg_path);   //鐢宠鏂囦欢澶у皬鐨勭┖闂?pjpg = malloc(jpg_size);//璇诲彇鎵撳紑鐨勬枃浠? 瀛樺湪鏂囦欢澶у皬鐨勭┖闂?read(jpg_fd,pjpg,jpg_size);}else {jpg_size = jpg_buf_size;pjpg = pjpg_buf;}//鍥剧墖鍑洪敊澶勭悊cinfo.err = jpeg_std_error(&jerr);jpeg_create_decompress(&cinfo);jpeg_mem_src(&cinfo,pjpg,jpg_size);jpeg_read_header(&cinfo, TRUE);jpeg_start_decompress(&cinfo); if(jpg_half) {x_e   = x_s+(cinfo.output_width/2);y_e  = y  +(cinfo.output_height/2);        while(cinfo.output_scanline < cinfo.output_height){      pcolor_buf = g_color_buf;jpeg_read_scanlines(&cinfo,(JSAMPARRAY)&pcolor_buf,1);            jpeg_read_scanlines(&cinfo,(JSAMPARRAY)&pcolor_buf,1);for(i=0; i<(cinfo.output_width/2); i++){color =        *(pcolor_buf+2); // Bcolor = color | *(pcolor_buf+1)<<8; // Gcolor = color | *(pcolor_buf)<<16; //Rlcd_draw_point(x,y,color);pcolor_buf +=6;x++;}y++;                 x = x_s;   }}else{x_e  = x_s+cinfo.output_width;y_e  = y  +cinfo.output_height;    while(cinfo.output_scanline < cinfo.output_height )// 锟叫断讹拷取一锟斤拷锟斤拷锟斤拷{      pcolor_buf = g_color_buf;jpeg_read_scanlines(&cinfo,(JSAMPARRAY)&pcolor_buf,1);for(i=0; i<cinfo.output_width; i++){/* 锟斤拷取rgb值  锟斤拷RGB锟较筹拷16位锟斤拷锟斤拷锟截碉拷锟斤拷锟斤拷 0x00ff0000 */color =      *(pcolor_buf+2)<<0;//Bcolor = color | *(pcolor_buf+1)<<8;//Gcolor = color | *(pcolor_buf)<<16;//R  /* 锟斤拷示锟斤拷锟截碉拷 */lcd_draw_point(x,y,color);pcolor_buf +=3;x++;}/* 锟斤拷锟斤拷 */y++;          x = x_s;}      }/*锟斤拷锟斤拷锟斤拷锟?/jpeg_finish_decompress(&cinfo);jpeg_destroy_decompress(&cinfo);if(pjpg_path!=NULL){/* 锟截憋拷jpg锟侥硷拷 */close(jpg_fd);  /* 锟酵凤拷jpg锟侥硷拷锟节达拷占锟?*/free(pjpg);      }close_lcd();return 0;
}int lcd_draw_jpg_in_jpg(unsigned int x,unsigned int y,const char *pjpg_path,char *pjpg_buf,unsigned int jpg_buf_size)
{/*锟斤拷锟斤拷锟斤拷锟斤拷锟襟,达拷锟斤拷锟斤拷锟斤拷锟斤拷*/struct     jpeg_decompress_struct  cinfo;struct    jpeg_error_mgr          jerr;   char    *pcolor_buf = g_color_buf;char     *pjpg;unsigned int  i=0,j=0;unsigned int  color =0;unsigned int  count =0;unsigned int  x_s = x;unsigned int   x_e ;   unsigned int    y_e ;unsigned int   y_n = y;unsigned int   x_n = x;int    jpg_fd;unsigned int     jpg_size;if(pjpg_path!=NULL){/* 锟斤拷锟斤拷jpg锟斤拷源锟斤拷权锟睫可讹拷锟斤拷写 */  jpg_fd=open(pjpg_path,O_RDWR);if(jpg_fd == -1){printf("open %s error\n",pjpg_path);return -1;  }   /* 锟斤拷取jpg锟侥硷拷锟侥达拷小 */jpg_size=file_size_get(pjpg_path);   /* 为jpg锟侥硷拷锟斤拷锟斤拷锟节达拷占锟?*/  pjpg = malloc(jpg_size);/* 锟斤拷取jpg锟侥硷拷锟斤拷锟斤拷锟斤拷锟捷碉拷锟节达拷 */     read(jpg_fd,pjpg,jpg_size);}else{jpg_size = jpg_buf_size;pjpg = pjpg_buf;}/*注锟斤拷锟斤拷锟斤拷锟斤拷锟?/cinfo.err = jpeg_std_error(&jerr);/*锟斤拷锟斤拷锟斤拷锟斤拷*/jpeg_create_decompress(&cinfo);/*直锟接斤拷锟斤拷锟节达拷锟斤拷锟斤拷*/      jpeg_mem_src(&cinfo,pjpg,jpg_size);/*锟斤拷锟侥硷拷头*/jpeg_read_header(&cinfo, TRUE);/*锟斤拷始锟斤拷锟斤拷*/jpeg_start_decompress(&cinfo);  x_e = x_s+cinfo.output_width;y_e  = y  +cinfo.output_height;    /*锟斤拷锟斤拷锟斤拷锟斤拷锟斤拷*/while(cinfo.output_scanline < cinfo.output_height ){      pcolor_buf = g_color_buf;/* 锟斤拷取jpg一锟叫碉拷rgb值 */jpeg_read_scanlines(&cinfo,(JSAMPARRAY)&pcolor_buf,1);for(i=0; i<cinfo.output_width; i++){/* 锟斤拷锟斤拷示锟侥诧拷锟斤拷 */if(y_n>g_jpg_in_jpg_y && y_n<g_jpg_in_jpg_y+240)if(x_n>g_jpg_in_jpg_x && x_n<g_jpg_in_jpg_x+320){pcolor_buf +=3;x_n++;continue;}/* 锟斤拷取rgb值 */color =        *(pcolor_buf+2);color = color | *(pcolor_buf)<<8;color = color | *(pcolor_buf)<<16;  /* 锟斤拷示锟斤拷锟截碉拷 */lcd_draw_point(x_n,y_n,color);pcolor_buf +=3;x_n++;}/* 锟斤拷锟斤拷 */y_n++;           x_n = x_s;}        /*锟斤拷锟斤拷锟斤拷锟?/jpeg_finish_decompress(&cinfo);jpeg_destroy_decompress(&cinfo);if(pjpg_path!=NULL){/* 锟截憋拷jpg锟侥硷拷 */close(jpg_fd);   /* 锟酵凤拷jpg锟侥硷拷锟节达拷占锟?*/free(pjpg);      }return 0;
}
#endif//LCD锟斤拷锟斤拷锟街凤拷锟斤拷锟酵计?int lcd_draw_bmp(unsigned int x,unsigned int y,const char *pbmp_path)
{int bmp_fd;unsigned int blue, green, red;unsigned int color;unsigned int bmp_width;unsigned int bmp_height;unsigned int bmp_type;unsigned int bmp_size;unsigned int x_s = x;unsigned int x_e ;    unsigned int y_e ;unsigned char buf[54]={0};char *pbmp_buf=g_color_buf;/* 锟斤拷锟斤拷位图锟斤拷源锟斤拷权锟睫可讹拷锟斤拷写 */    bmp_fd=open(pbmp_path,O_RDWR);if(bmp_fd == -1){printf("open bmp error\r\n");return -1; }/* 锟斤拷取位图头锟斤拷锟斤拷息 */read(bmp_fd,buf,54);/* 锟斤拷锟斤拷  */bmp_width =buf[18];bmp_width|=buf[19]<<8;printf("bmp_width=%d\r\n",bmp_width);/* 锟竭讹拷  */bmp_height =buf[22];bmp_height|=buf[23]<<8;printf("bmp_height=%d\r\n",bmp_height); /* 锟侥硷拷锟斤拷锟斤拷 */bmp_type =buf[28];bmp_type|=buf[29]<<8;printf("bmp_type=%d\r\n",bmp_type);   /* 锟斤拷锟斤拷锟斤拷示x锟斤拷y锟斤拷锟斤拷锟斤拷锟轿伙拷锟?*/x_e = x + bmp_width;y_e = y + bmp_height;/* 锟斤拷取位图锟侥硷拷锟侥达拷小 */bmp_size=file_size_get(pbmp_path);/* 锟斤拷取锟斤拷锟斤拷RGB锟斤拷锟斤拷 */read(bmp_fd,pbmp_buf,bmp_size-54);for(;y < y_e; y++){for (;x < x_e; x++){/* 锟斤拷取锟斤拷锟斤拷锟斤拷锟斤拷色锟斤拷锟斤拷 */blue  = *pbmp_buf++;green = *pbmp_buf++;red   = *pbmp_buf++;/* 锟叫断碉拷前锟斤拷位图锟角凤拷32位锟斤拷色 */if(bmp_type == 32){pbmp_buf++;}/* 锟斤拷锟?4bit锟斤拷色 */color = red << 16 | green << 8 | blue << 0;lcd_draw_point(x, y, color);              }x = x_s;}/* 锟斤拷锟斤拷使锟斤拷BMP锟斤拷锟斤拷锟酵凤拷bmp锟斤拷源 */close(bmp_fd);   return 0;
}// int main(int argc, char const *argv[])
// {//  printf("1:1.jpg 2:2.jpg 3:3.jpg\n");
//  int num;
//  scanf("%d",&num);
//  if(num ==1)
//  {//      lcd_draw_jpg(0, 0, "1.jpg", NULL, 0, 0);
//  }
//  else if(num == 2)
//  {//      lcd_draw_jpg(0, 0, "2.jpg", NULL, 0, 0);
//  }
//  else if(num ==3)
//  {//      lcd_draw_jpg(0, 0, "3.jpg", NULL, 0, 0);
//  }
//  return 0;
// }

【5】服务器代码

#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <netinet/in.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <sys/socket.h>
#include <stdbool.h>#include "../../include/qisr.h"
#include "../../include/msp_cmn.h"
#include "../../include/msp_errors.h"#define SAMPLE_RATE_16K     (16000)
#define SAMPLE_RATE_8K      (8000)
#define MAX_GRAMMARID_LEN   (32)
#define MAX_PARAMS_LEN      (1024)const char * ASR_RES_PATH        = "fo|res/asr/common.jet"; //离线语法识别资源路径
const char * GRM_BUILD_PATH      = "res/asr/GrmBuilld"; //构建离线语法识别网络生成数据保存路径
const char * GRM_FILE            = "call.bnf"; //构建离线识别语法网络所用的语法文件
const char * LEX_NAME            = "contact"; //更新离线识别语法的contact槽(语法文件为此示例中使用的call.bnf)typedef struct _UserData {int     build_fini; //标识语法构建是否完成int     update_fini; //标识更新词典是否完成int     errcode; //记录语法构建或更新词典回调错误码char    grammar_id[MAX_GRAMMARID_LEN]; //保存语法构建返回的语法ID
}UserData;int connfd;   //连接文件描述符const char *get_audio_file(void); //选择进行离线语法识别的语音文件
int build_grammar(UserData *udata); //构建离线识别语法网络
int update_lexicon(UserData *udata); //更新离线识别语法词典
int run_asr(UserData *udata); //进行离线语法识别const char* get_audio_file(void)
{// char key = 0;// while(key != 27) //按Esc则退出// {//  printf("请选择音频文件:\n");//    printf("1.打电话给丁伟\n");//   printf("2.打电话给黄辣椒\n");//  key = getchar();//     getchar();//    switch(key)//   {//     case '1'://       printf("\n1.打电话给丁伟\n");//         return "wav/ddhgdw.pcm";//    case '2'://       printf("\n2.打电话给黄辣椒\n");//        return "wav/ddhghlj.pcm";//   default://      continue;//     }// }// exit(0);// return NULL;printf("开始接收文件...................................................n");int wavSize;read(connfd,&wavSize,sizeof(int));printf("文件大小ret = %d\n",wavSize);int file_fp;// 打开文件,准备写入 file_fp = open("wav/abc.wav",O_CREAT|O_RDWR|O_TRUNC,0777); if(file_fp<0) { printf("文件打开失败\n"); exit(1); } printf("open file succeed\n");// 接收文件内容char recvBuf[50000] = {0}; //接收到的数据存放到此处int recvSize = 0;          //实际接收的大小int fileSize = 0;         //总共接收的数据大小//循环接收,直到文件尾while(1){memset(recvBuf,0,50000);   //将recvBuf前50000个字符置0,相当于清空内存,bezero()recvSize = recv(connfd,recvBuf,50000,0); //接收客户端发送过来的数据fileSize += recvSize;  //累加读取到的总数据量printf("recvSize = %d\n",fileSize);int retval = write(file_fp,recvBuf,recvSize);   //将recvBuf中的数据写入fd中,写入数据大小为recvSizeif(retval == -1 || retval == EINTR){printf("写入数据失败\n");return false;}if(fileSize == wavSize) //写入完成break;}close(file_fp);return "wav/abc.wav";
}int build_grm_cb(int ecode, const char *info, void *udata)
{UserData *grm_data = (UserData *)udata;if (NULL != grm_data) {grm_data->build_fini = 1;grm_data->errcode = ecode;}if (MSP_SUCCESS == ecode && NULL != info) {printf("构建语法成功! 语法ID:%s\n", info);if (NULL != grm_data)snprintf(grm_data->grammar_id, MAX_GRAMMARID_LEN - 1, info);}elseprintf("构建语法失败!%d\n", ecode);return 0;
}int build_grammar(UserData *udata)
{FILE *grm_file                           = NULL;char *grm_content                        = NULL;unsigned int grm_cnt_len                 = 0;char grm_build_params[MAX_PARAMS_LEN]    = {NULL};int ret                                  = 0;grm_file = fopen(GRM_FILE, "rb");  if(NULL == grm_file) {printf("打开\"%s\"文件失败![%s]\n", GRM_FILE, strerror(errno));return -1; }fseek(grm_file, 0, SEEK_END);grm_cnt_len = ftell(grm_file);fseek(grm_file, 0, SEEK_SET);grm_content = (char *)malloc(grm_cnt_len + 1);if (NULL == grm_content){printf("内存分配失败!\n");fclose(grm_file);grm_file = NULL;return -1;}fread((void*)grm_content, 1, grm_cnt_len, grm_file);grm_content[grm_cnt_len] = '\0';fclose(grm_file);grm_file = NULL;snprintf(grm_build_params, MAX_PARAMS_LEN - 1, "engine_type = local, \asr_res_path = %s, sample_rate = %d, \grm_build_path = %s, ",ASR_RES_PATH,SAMPLE_RATE_16K,GRM_BUILD_PATH);ret = QISRBuildGrammar("bnf", grm_content, grm_cnt_len, grm_build_params, build_grm_cb, udata);free(grm_content);grm_content = NULL;return ret;
}int update_lex_cb(int ecode, const char *info, void *udata)
{UserData *lex_data = (UserData *)udata;if (NULL != lex_data) {lex_data->update_fini = 1;lex_data->errcode = ecode;}if (MSP_SUCCESS == ecode)printf("更新词典成功!\n");elseprintf("更新词典失败!%d\n", ecode);return 0;
}int update_lexicon(UserData *udata)
{const char *lex_content                   = "丁伟\n黄辣椒";unsigned int lex_cnt_len                  = strlen(lex_content);char update_lex_params[MAX_PARAMS_LEN]    = {NULL}; snprintf(update_lex_params, MAX_PARAMS_LEN - 1, "engine_type = local, text_encoding = UTF-8, \asr_res_path = %s, sample_rate = %d, \grm_build_path = %s, grammar_list = %s, ",ASR_RES_PATH,SAMPLE_RATE_16K,GRM_BUILD_PATH,udata->grammar_id);return QISRUpdateLexicon(LEX_NAME, lex_content, lex_cnt_len, update_lex_params, update_lex_cb, udata);
}int run_asr(UserData *udata)
{char asr_params[MAX_PARAMS_LEN]    = {NULL};const char *rec_rslt               = NULL;const char *session_id             = NULL;const char *asr_audiof             = NULL;FILE *f_pcm                        = NULL;char *pcm_data                     = NULL;long pcm_count                     = 0;long pcm_size                      = 0;int last_audio                     = 0;int aud_stat                       = MSP_AUDIO_SAMPLE_CONTINUE;int ep_status                      = MSP_EP_LOOKING_FOR_SPEECH;int rec_status                     = MSP_REC_STATUS_INCOMPLETE;int rss_status                     = MSP_REC_STATUS_INCOMPLETE;int errcode                        = -1;asr_audiof = get_audio_file();f_pcm = fopen(asr_audiof, "rb");if (NULL == f_pcm) {printf("打开\"%s\"失败![%s]\n", f_pcm, strerror(errno));goto run_error;}fseek(f_pcm, 0, SEEK_END);pcm_size = ftell(f_pcm);fseek(f_pcm, 0, SEEK_SET);pcm_data = (char *)malloc(pcm_size);if (NULL == pcm_data)goto run_error;fread((void *)pcm_data, pcm_size, 1, f_pcm);fclose(f_pcm);f_pcm = NULL;//离线语法识别参数设置snprintf(asr_params, MAX_PARAMS_LEN - 1, "engine_type = local, \asr_res_path = %s, sample_rate = %d, \grm_build_path = %s, local_grammar = %s, \result_type = xml, result_encoding = UTF-8, ",ASR_RES_PATH,SAMPLE_RATE_16K,GRM_BUILD_PATH,udata->grammar_id);session_id = QISRSessionBegin(NULL, asr_params, &errcode);if (NULL == session_id)goto run_error;printf("开始识别...\n");while (1) {unsigned int len = 6400;if (pcm_size < 12800) {len = pcm_size;last_audio = 1;}aud_stat = MSP_AUDIO_SAMPLE_CONTINUE;if (0 == pcm_count)aud_stat = MSP_AUDIO_SAMPLE_FIRST;if (len <= 0)break;printf(">");fflush(stdout);errcode = QISRAudioWrite(session_id, (const void *)&pcm_data[pcm_count], len, aud_stat, &ep_status, &rec_status);if (MSP_SUCCESS != errcode)goto run_error;pcm_count += (long)len;pcm_size -= (long)len;//检测到音频结束if (MSP_EP_AFTER_SPEECH == ep_status)break;usleep(150 * 1000); //模拟人说话时间间隙}//主动点击音频结束QISRAudioWrite(session_id, (const void *)NULL, 0, MSP_AUDIO_SAMPLE_LAST, &ep_status, &rec_status);free(pcm_data);pcm_data = NULL;//获取识别结果while (MSP_REC_STATUS_COMPLETE != rss_status && MSP_SUCCESS == errcode) {rec_rslt = QISRGetResult(session_id, &rss_status, 0, &errcode);usleep(150 * 1000);}printf("\n识别结束:\n");printf("=============================================================\n");if (NULL != rec_rslt)  {printf("识别到的关键字是:%s\n",rec_rslt);//匹配关键字if(strstr(rec_rslt, "相册") != NULL){//将关键字传给客户端send(connfd, "相册",strlen("相册"),0);}else if(strstr(rec_rslt, "上一张") !=NULL){send(connfd,"上一张",strlen("上一张"),0);}else if(strstr(rec_rslt, "下一张") !=NULL){send(connfd,"下一张",strlen("下一张"),0);}else if(strstr(rec_rslt, "视频1") !=NULL){send(connfd,"视频1",strlen("视频1"),0);}else if(strstr(rec_rslt,"暂停")!=NULL){send(connfd, "暂停", strlen("暂停"), 0);}else if(strstr(rec_rslt,"继续")!=NULL){send(connfd, "继续", strlen("继续"), 0);}else if(strstr(rec_rslt, "退出") !=NULL){send(connfd,"退出",strlen("退出"),0);}else if(strstr(rec_rslt, "关闭") !=NULL){send(connfd,"关闭",strlen("关闭"),0);}else if(strstr(rec_rslt, "视频2") !=NULL){send(connfd,"视频2",strlen("视频2"),0);}}elseprintf("没有识别结果!\n");printf("=============================================================\n");goto run_exit;run_error:if (NULL != pcm_data) {free(pcm_data);pcm_data = NULL;}if (NULL != f_pcm) {fclose(f_pcm);f_pcm = NULL;}
run_exit:QISRSessionEnd(session_id, NULL);return errcode;
}//server  init
int init_tcp(int port)
{// 创建套接字int sockfd = socket(AF_INET, SOCK_STREAM, 0);if(sockfd == -1)return -1;// 设置特殊结构体地址用于通信struct sockaddr_in saddr;socklen_t len = sizeof(saddr); bzero(&saddr,sizeof(saddr));saddr.sin_family = AF_INET;saddr.sin_port = htons(port);//saddr.sin_addr.s_addr = htonl(INADDR_ANY);saddr.sin_addr.s_addr = inet_addr("192.168.24.19");// 绑定套接字int ret = bind(sockfd,(struct sockaddr *)&saddr,len);if(ret == -1)return -1;// 监听套接字ret = listen(sockfd,5);if(ret == -1)return -1;return sockfd; }int main(int argc, char* argv[])
{//******************************************************************************************************//接收客户端发送过来的音频存放到 wav/abc.wav下if(argc != 2){perror("输入格式 ./asr IP");return -1;}int sockfd = init_tcp(atoi(argv[1]));if(sockfd == -1){perror("sockfd open failed");return -1;}// 用户存放已连接套接字的信息struct sockaddr_in cliaddr;socklen_t len = sizeof(cliaddr); bzero(&cliaddr,sizeof(cliaddr));printf("等待连接中。。。。。。。。。。\n");// 等待连接connfd = accept(sockfd,(struct sockaddr *)&cliaddr,&len);printf("成功连接 connfd = %d\n",connfd);printf("new connect ip : %s\n",inet_ntoa(cliaddr.sin_addr));//*******************************************************************************************************const char *login_config    = "appid = 68e5809b"; //登录参数UserData asr_data; int ret                     = 0 ;char c;ret = MSPLogin(NULL, NULL, login_config); //第一个参数为用户名,第二个参数为密码,传NULL即可,第三个参数是登录参数if (MSP_SUCCESS != ret) {printf("登录失败:%d\n", ret);goto exit;}printf("登录成功!\n");memset(&asr_data, 0, sizeof(UserData));printf("构建离线识别语法网络...\n");ret = build_grammar(&asr_data);  //第一次使用某语法进行识别,需要先构建语法网络,获取语法ID,之后使用此语法进行识别,无需再次构建if (MSP_SUCCESS != ret) {printf("构建语法调用失败!\n");goto exit;}while (1 != asr_data.build_fini)usleep(300 * 1000);if (MSP_SUCCESS != asr_data.errcode)goto exit;printf("离线识别语法网络构建完成,开始识别...\n");   while(1){ret = run_asr(&asr_data);if (MSP_SUCCESS != ret) {printf("离线语法识别出错: %d \n", ret);goto exit;}// printf("更新离线语法词典...\n");// ret = update_lexicon(&asr_data);  //当语法词典槽中的词条需要更新时,调用QISRUpdateLexicon接口完成更新// if (MSP_SUCCESS != ret) {//   printf("更新词典调用失败!\n");//   goto exit;// }// while (1 != asr_data.update_fini)//   usleep(300 * 1000);// if (MSP_SUCCESS != asr_data.errcode)//   goto exit;// printf("更新离线语法词典完成,开始识别...\n");// ret = run_asr(&asr_data);// if (MSP_SUCCESS != ret) {//   printf("离线语法识别出错: %d \n", ret);//     goto exit;// }system("rm wav/abc.wav");}
exit:MSPLogout();printf("请按任意键退出...\n");getchar();return 0;
}

【6】源码分享

【百度网盘】链接:https://pan.baidu.com/s/1sqdr4rTu4y-flCgZRsVvlw?pwd=3ubj
提取码:3ubj

基于局域网网络编程实现开发板显示相册以及视频和音乐相关推荐

  1. 安卓学习笔记42:基于HTTP网络编程

    文章目录 零.学习目标 一.安卓基于HTTP网络编程 (一)两种请求方式 (二)安卓基于HTTP网络编程的两种方式 1.使用HttpURLConnection访问网络资源 2.利用HttpClient ...

  2. zigbee无线传感网实训---zigbee显示温湿度以及连接LCD开发板显示温湿度(The Eighth day)

    承接第七天:zigbee无线传感网实训---实现LCD开发板播放音乐并切换歌曲(The Seventh day) 一.实验准备器材如图:              二:步骤 ============= ...

  3. linux开发板显示百叶窗图片,03Linux命令操作2

    第一天 第一个小时嵌入式介绍,何为嵌入式,为什么学习嵌入式,嵌入式的发展前景,嵌入式的具体工作岗位以及薪资待遇如何. 第二个小时项目介绍 1.为什么需要项目的的沉淀,企业需要什么样的嵌入式开发人才 2 ...

  4. 基于 Netty 网络编程项目实战课程

    一 基于 Netty 网络编程项目实战课程 1项目介绍 2Netty 介绍与相关基础知识 2.1Netty 介绍 简介 Netty 是由 JBOSS 提供的一个 java 开源框架.Netty 提供异 ...

  5. c语言模拟32u4单片机,一种基于Atmega32u4的教学型Arduino开发板的制作方法

    本实用新型涉及一种教学型Arduino开发板,具体是基于Atmega32u4芯片的教学型Arduino开发板. 背景技术: 近些年来,互联网和物联网高速发展,在推动社会生产力快速发展的同时,也对我们的 ...

  6. STM32下载程序至SRAM——基于正点原子精英STM32F103ZET6开发板

    STM32下载程序至SRAM--基于正点原子精英STM32F103ZET6开发板 如题,由于STM32的FLASH烧写寿命在1万次左右,对于本人这样的改一行代码都想下载到开发板中测试的强迫症患者,真是 ...

  7. 基于TI AM335x创龙开发板U-Boot编译

    分享一下基于广州创龙TL335x-IDK开发板的U-Boot编译.希望能帮助上你. 板子特点如下:  基于 TI AM335x ARM Cortex-A8 CPU,主频可高达 1GHz,运算能力可高 ...

  8. PAJ7620手势传感器快速应用- -基于涂鸦CBU模组开发板

    PAJ7620手势传感器快速驱动- -基于涂鸦CBU模组开发板 正在,或是想要开发物联网小产品的你是否会觉得一些常用的控制需要繁琐地掏出手机会让你的产品体验不佳?添加实体按键又显得太 low ?不妨来 ...

  9. 视频教程-C++socket网络编程--http服务器(支持php)实战教学视频-C/C++

    C++socket网络编程--http服务器(支持php)实战教学视频 夏曹俊:南京捷帝科技有限公司创始人,南京大学计算机硕士毕业,有15年c++跨平台项目研发的经验,领导开发过大量的c++虚拟仿真, ...

  10. C++socket网络编程大全实战http服务器(支持php)视频课程-夏曹俊-专题视频课程

    C++socket网络编程大全实战http服务器(支持php)视频课程-16782人已学习 课程介绍         C++socket网络编程大全实战http服务器(支持php)视频培训教程概况:本 ...

最新文章

  1. MySQL5.7 支持一个表有多个INSERT/DELETE/UPDATE触发器
  2. [原创]关于在VS2008和VS2010中禁用及卸载Visual Assist X的方法研究
  3. __METHOD__
  4. 前端学习(1757):前端调试值之网络条件与user-Agent的设置
  5. 云原生2.0时代:企业更应了解一下容器安全
  6. mysql主从应用_MySQL主从复制应用、主从复制原理
  7. python使用字典描述学生信息_一起学Python:字典介绍
  8. 【剑指offer】Java版代码(完整版)
  9. poj 1164(DFS)
  10. 代码生成工具系列-----代码生成工具(CodeEasy)介绍
  11. 第014讲 CSS 定位
  12. ubuntu安装vmplayer出现问题的解决方法
  13. 【前端——补充学习】解决emos项目报错、路由、组件
  14. git、KDiff3、Git Extensions
  15. 防止电脑被木马迫害,检测和寻找木马隐藏的位置
  16. 电子学会青少年软件编程 Python编程等级考试三级真题解析(选择题)2021年3月
  17. am57xx Damo根文件加载过程
  18. 艾司博讯:拼多多增加自然访客的方法是什么?
  19. 昆石VOS3000/VOS2009 2.1.6.00 操作指南相关
  20. Metis异常检测算法源码概要

热门文章

  1. 微信小程序tab页面切换
  2. 实时视频通话超低延迟架构的思考与实践
  3. 点成分享 | 麦氏比浊仪在药敏试验中的应用
  4. 高速钢(HSS)金属切削刀具的全球与中国市场2022-2028年:技术、参与者、趋势、市场规模及占有率研究报告
  5. 2018年阿里安全工程师面试
  6. Thinkphp漏洞远程代码执行漏洞事件分析报告
  7. ZOJ 2480 Simplest Task in Windows
  8. springboot毕设项目商城积分兑换系统pez18(java+VUE+Mybatis+Maven+Mysql)
  9. DM642的PCI驱动编程笔记:缺页中断问题阐述以及与改变中断级相关的内核函数
  10. 超详细的程序员未来职业发展路线