智能家居 ——语音识别线程控制

Posted 行稳方能走远

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了智能家居 ——语音识别线程控制相关的知识,希望对你有一定的参考价值。

语音识别线程控制代码

inputCommand.h

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <wiringPi.h>
#include <wiringSerial.h>


struct Command
{
	char commandName[128];						//“控制方式”名
	char deviceFilesName[128];					//存放初始化所需文件的路径 串口用到
	char command[32];							//存放指令
	int fd;										//存放文件描述符
	int (*Init)(struct Command *file);			//“初始化”函数指针 C语言要传参 不太好的面向对象
	int s_fd;
	char ipAdress[32];
	char port[12];
	int (*getCommand)(struct Command *cmd);		//“获取指令”函数指针

	struct Command *next;
};

struct Command *addvoiceControlToCommandLink(struct Command *phead);		//“语音控制”加入指令链表函数声明

mainPro.c

#include <stdio.h>
#include <string.h>
#include "inputCommand.h"
#include <pthread.h>
#include <unistd.h>

struct Command *addVoiceControlToCommandLink(struct Command *phead);
struct Command *findCommandByName(char *name,struct Command *phead);		//链节查找函数声明
void *voiceControl_thread(void *data);										//“语音控制”线程函数声明

struct Command *cmdhead = NULL;					//创建“指令”链表全局变量

int main()
{
	cmdhead = addVoiceControlToCommandLink(cmdhead);			//“语音控制”对象加入链表

	pthread_t voiceControl_thread_t;					//存放线程 ID

	pthread_create(&voiceControl_thread_t,NULL,voiceControl_thread,NULL);		//创建“语音控制”线程
	pthread_join(voiceControl_thread_t, NULL);			//主函数等待“语音控制”线程退出
	return 0;
}


void *voiceControl_thread(void *data)				//“语音控制”线程
{
	int nread;
	struct Command *voiceHandler = NULL;

	voiceHandler = findCommandByName("voiceControl",cmdhead);		//寻找“语音控制”链节,返回给voiceHandler
	if(voiceHandler == NULL){										//找不到
		printf("find voiceHandler error\\n");
		pthread_exit(NULL);											//线程退出
	}else{															//找到
		if(voiceHandler->Init(voiceHandler) < 0){					//初始化
			printf("voiceHandler init error\\n");					//初始化失败
			pthread_exit(NULL);										//线程退出
		}

		while(1){
			nread = voiceHandler->getCommand(voiceHandler);						//读取指令
			if(nread == 0){														//没接收到指令
				printf("No command received\\n");
			}else{																//接收到指令
				printf("Get command:%s\\n",voiceHandler->command);
			}
		}
	}
}

struct Command *findCommandByName(char *name,struct Command *phead)			//“控制方式”链表查找链节函数
{
	struct Command *tmp = phead;

	if(phead == NULL){
		return NULL;
	}

	while(tmp != NULL){
		if(strcmp(name,tmp->commandName) == 0){
			return tmp;
		}
		tmp = tmp->next;
	}
	return NULL;
}

voiceControl.c

#include "inputCommand.h"			//自定义类文件
#include <unistd.h>

int voiceControlInit(struct Command *file);						//“语音控制”功能初始化函数声明

int voiceControlGetCommand(struct Command *cmd);					//“获取指令”函数初始化
struct Command *addVoiceControlToCommandLink(struct Command *phead);		//“语音控制”(对象)加入指令链表函数声明

struct Command voiceControl = {						//定义“语音控制”对象
	.commandName = "voiceControl",					//名字
	.deviceFilesName = "/dev/ttyAMA0",				//树莓派串口文件所在地址
	.command = {'\\0'},								//初始化储存“指令”的空间
	.Init = voiceControlInit,						//指定“语音控制”功能初始化函数
	.getCommand = voiceControlGetCommand,			//指定“获取指令”函数
};

int voiceControlInit(struct Command *file)  //  C语言要传参,java可直接访问
{
	int fd;
	if((fd = serialOpen(file->deviceFilesName,9600)) == -1){		//打开树莓派串口,波特率指定为9600
		exit(-1);
	}
	file->fd = fd;	//(传过来的是地址)打开串口文件成功,返回“文件描述符”到“语音控制”链节中
}

int voiceControlGetCommand(struct Command *cmd)
{
	int nread = 0;
	nread = read(cmd->fd,cmd->command,sizeof(cmd->command));	//读取串口
	if(nread == 0){
		printf("usart for voice over time\\n");
    }else{
	return nread;            //返回读取到数据的字节数,实际读取的指令放到了command里
	}												
}

struct Command *addVoiceControlToCommandLink(struct Command *phead)	//“语音控制”(对象)加入指令方式链表函数
{
	if(phead == NULL){
		return &voiceControl;
	}else{
		voiceControl.next = phead;
		phead = &voiceControl;
		return phead;
	}
}

代码测试

注意树莓派串口出厂状态是和蓝牙绑定的,后来我们又用于开机启动字符以及一些调试界面的作用,这里要记得开启树莓派正常的串口通信功能,把串口用于正常的数据通信。

连接好语音模块和树莓派,运行程序。

所有指令均可识别成功!

在这里插入图片描述

往期文章

智能家居 (1) ——智能家居整体功能框架
智能家居 (2) ——设计模式的引入
智能家居 (3) ——工厂模式继电器控制灯
智能家居 (4) ——工厂模式火焰报警
智能家居 (5) —— LD3320语音模块二次开发
智能家居 (6) ——语音识别线程控制
智能家居 (7) ——网络服务器线程控制
智能家居 (8) ——智能家居项目整合(网络控制线程、语音控制线程,火灾报警线程)
网络编程知识预备(1) ——了解OSI网络模型
网络编程知识预备(2) ——浅显易懂的三次握手与四次挥手
网络编程知识预备(3) ——SOCKET、TCP、HTTP之间的区别与联系
网络编程知识预备(4) ——了解HTTP协议与HTTPS协议
网络编程知识预备(5) ——libcurl库简介及其编程使用
智能家居 (9) ——人脸识别摄像头安装实现监控功能
智能家居 (10) ——人脸识别祥云平台编程使用
智能家居 (11) ——树莓派摄像头捕捉人脸并识别
智能家居 (12) ——人脸识别整合到智能家居系统
智能家居 (13) ——智能家居加入手机app端控制

以上是关于智能家居 ——语音识别线程控制的主要内容,如果未能解决你的问题,请参考以下文章

智能家居 ——智能家居项目整合(网络控制线程语音控制线程,火灾报警线程)

如何实现离线语音控制

毕业设计——基于STM32的智能家具系统(语音识别控制步进电机舵机)

智能家居入门DIY——LD3320之语音识别

浏览器中的语音识别功能

人工智能语音识别系统开发