IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 人工智能 -> 语音手势识别智能终端部分代码 -> 正文阅读

[人工智能]语音手势识别智能终端部分代码

简历项目内容

语音手势识别智能终端
TCP通信线程

void *thread_tcp_xml(void *parg)
{
	int socket_fd;
	int rt;
	int len;
	pthread_t tid_touch, tid_led;

	//lcd_draw_bmp_file(0, 0, "welcome.bmp");
	//music_play("13.mp3");


	//创建套接字,协议为IPv4,类型为TCP
	socket_fd = socket(AF_INET, SOCK_STREAM, 0);

	if (socket_fd < 0)
	{
		perror("create socket fail:");

		return -1;
	}

	struct sockaddr_in	 dest_addr;

	dest_addr.sin_family = AF_INET;					//IPv4
	dest_addr.sin_port = htons(54321);				//目的端口为54321
	dest_addr.sin_addr.s_addr = inet_addr("10.12.1.84");	//目的IP地址填写


	//3秒超时
	struct timeval timeout = { 5, 0 };//设置发送超时
	rt = setsockopt(socket_fd, SOL_SOCKET, SO_SNDTIMEO, (const char *)&timeout, sizeof timeout);

	if (rt < 0)
	{
		perror("setsockopt SO_RCVTIMEO:");
		return -1;
	}

	//设置接收超时
	rt = setsockopt(socket_fd, SOL_SOCKET, SO_RCVTIMEO, (const char *)&timeout, sizeof timeout);

	if (rt < 0)
	{
		perror("setsockopt SO_RCVTIMEO:");
		return -1;
	}

	int on = 1;
	/* 设置socket允许重复使用地址与端口 */
	setsockopt(socket_fd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof on);


	//要跟服务器建立连接(等同于登陆游戏)
	rt = connect(socket_fd, (struct sockaddr *)&dest_addr, sizeof dest_addr);

	if (rt < 0)
	{
		perror("connect fail:");
		system("madplay 11.mp3");
		printf("连接服务器失败!\n");
		LED_SWITCH(D8, LED_OFF);
		return -1;
	}
	else
	{
		printf("连接服务器成功!\n");
		system("madplay 12.mp3");
		LED_SWITCH(D8, LED_ON);

	}

	while (1)
	{
		if (flag == 12 )
		{
			printf("start recording...");
			system("rm cmd.pcm");
			//进入系统
			//lcd_draw_bmp_file(0, 0, "ack.bmp");
			//开始录制语音
			system("arecord -d3 -c1 -r16000 -traw -fS16_LE cmd.pcm");
			//向语音识别引擎系统发送cmd.pcm
			tcp_send_pcm(socket_fd, "cmd.pcm");


			//从语音识别引擎系统接收XML结果,并将结果保存到result.xml	
			tcp_recv_xml(socket_fd);


			//分析result.xml
			xmlChar *id = parse_xml("result.xml","cmd");
			printf("flag =%d \n",flag);
			if (flag == 12)
			{
				flag = 0;
			}
		}
	}
}

XML文件处理

xmlChar *__get_cmd_id(xmlDocPtr doc, xmlNodePtr cur, char *NodeName)
{
	xmlChar *key, *id;
	cur = cur->xmlChildrenNode;
	while (cur != NULL)
	{
		//查找到cmd子节点
	    if ((!xmlStrcmp(cur->name, (const xmlChar *)NodeName)))
	    {
			//获取字符串
		    key = xmlNodeListGetString(doc, cur->xmlChildrenNode, 1);
		    printf("%s: %s\n",NodeName, key);
		    xmlFree(key);

			//读取节点属性
		    id = xmlGetProp(cur, (const xmlChar *)"id");
		    printf("id: %s\n", id);
			flag = atoi(id);     //获得id号
		    xmlFree(doc);
		    return id;
 	    }
		cur = cur->next;
	}
	//释放文档指针
	xmlFree(doc);
    return NULL;
}

xmlChar *parse_xml(char *xmlfile, char *NodeName)
{
	xmlDocPtr doc;
	xmlNodePtr cur1, cur2;

	//分析一个xml文件,并返回一个xml文档的对象指针
	doc = xmlParseFile(xmlfile);
	if (doc == NULL)
	{
		fprintf(stderr,"Document not parsed successfully. \n");
		return NULL;
	}
	
	//获得文档的根节点
	cur1 = xmlDocGetRootElement(doc);
	if(cur1 == NULL)
	{
		fprintf(stderr,"empty document\n");
		xmlFreeDoc(doc);
		return NULL;
	}
	//检查根节点的名称是否为nlp
	if(xmlStrcmp(cur1->name, (const xmlChar *)"nlp"))
	{
		fprintf(stderr,"document of the wrong type, root node != nlp");
		xmlFreeDoc(doc);
		return NULL;
	}
	
	//获取子元素节点
	cur1 = cur1->xmlChildrenNode;

	while (cur1 != NULL)
	{
		//检查子元素是否为result
		if ((!xmlStrcmp(cur1->name, (const xmlChar *)"result")))
		{
			//得到result的子节点
			cur2 = cur1->xmlChildrenNode;
			while(cur2 != NULL)
			{
				//查找到准确率
				if((!xmlStrcmp(cur2->name, (const xmlChar *)"confidence")))
				{
					xmlChar *key = xmlNodeListGetString(doc, cur2->xmlChildrenNode, 1);
					
					printf("confidence: %s\n",key);
					
					//若准确率低于30,则放弃当前识别
					if(atoi((char *)key) <30)
					{
						xmlFree(doc);
						fprintf(stderr, "sorry, I'm NOT sure what you say.\n");
						return NULL;
					}
					
					
				}
				
				//查找到object,则执行提取字符串及属性
				if((!xmlStrcmp(cur2->name, (const xmlChar *)"object")))
				{
					
					return __get_cmd_id(doc, cur2, NodeName);
				}
				cur2 = cur2->next;
			}
		}
		cur1 = cur1->next;
	}

	//释放文档指针
	xmlFreeDoc(doc);
	return NULL;
}
TCP接收XML文件

```c
int tcp_recv_xml(int socket_fd)
{

	//calloc动态分配完内存后,自动初始化该内存空间为零
	//分配1个1024字节大小的缓冲区
	char *xml_buf = calloc(1, 1024);

	// 从ubuntu接收XML结果
	int n = recv(socket_fd, xml_buf, 1024, 0);

	if (n <= 0)
	{
		perror("tcp recv:");

		return -1;
	}

	printf("%d bytes has been recv\n", n);

	//创建result.xml文件并清空
	int fd = open("result.xml", O_CREAT | O_RDWR | O_TRUNC);

	if (fd < 0)
	{
		printf("create result.xml fail\n");

		return -1;

	}

	//将接收到XML写入到result.xml文件
	n = write(fd, xml_buf, n);

	printf("%d bytes has been write to result.xml\n", n);

	//关闭result.xml文件
	close(fd);

	return 0;
}

发送PCM录音文件

int  tcp_send_pcm(int socket_fd, const char *pcm_file)
{
	int fd;

	//以只读方式打开pcm文件
	fd = open(pcm_file, O_RDONLY);

	if (fd < 0)
	{
		printf("open %s\n", pcm_file);

		return -1;

	}

	// 取得PCM数据的大小
	off_t pcm_size = lseek(fd, 0, SEEK_END);

	// 从新定位到文件的头部
	lseek(fd, 0, SEEK_SET);

	// 分配1个pcm_size字节大小的缓冲区
	char *pcm_buf = calloc(1, pcm_size);

	// 读取PCM文件数据
	read(fd, pcm_buf, pcm_size);

	// 将PCM文件发送给语音识别引擎系统
	int m = send(socket_fd, pcm_buf, pcm_size, 0);

	printf("%d bytes has been sent\n", m);

	free(pcm_buf);

	return 0;
}

主函数部分

int main(int argc, char **argv)
{
	
	//login();
	pthread_t tid_audio, tid_speechrec, tid_tcp, tid_pic, tid_music, tid_camera, tid_vedio, tid_led, tid_ges;
	/*pthread_t tid_login;
	while (1){
		pthread_create(&tid_login, NULL, thread_login, NULL);
		if (mima == 1){
			break;
		}

	}*/
	login();
	pthread_create(&tid_ges, NULL, thread_gesture, NULL);
	pthread_create(&tid_led, NULL, thread_led, NULL);
	pthread_create(&tid_vedio, NULL, thread_vedio, NULL);
	pthread_create(&tid_camera, NULL, thread_camera, NULL);
	pthread_create(&tid_music, NULL, thread_music, NULL);
	pthread_create(&tid_audio,NULL,thread_audio,NULL);  //音频播放线程
	pthread_create(&tid_tcp,NULL,thread_tcp_xml,NULL);  //tcp发送读取线程
	pthread_create(&tid_pic,NULL,thread_pic,NULL);  //图片显示控制线程
	
	
	touch();  //主函数
	
	return 0;
	
}
  人工智能 最新文章
2022吴恩达机器学习课程——第二课(神经网
第十五章 规则学习
FixMatch: Simplifying Semi-Supervised Le
数据挖掘Java——Kmeans算法的实现
大脑皮层的分割方法
【翻译】GPT-3是如何工作的
论文笔记:TEACHTEXT: CrossModal Generaliz
python从零学(六)
详解Python 3.x 导入(import)
【答读者问27】backtrader不支持最新版本的
上一篇文章      下一篇文章      查看所有文章
加:2021-08-16 11:44:45  更:2021-08-16 11:45:18 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/27 20:30:29-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码