【开个空调】语音识别+红外发射

废话少说,直接上空调板子:YAPOF3。红外接收发射模块用的某宝上发现的YF-33(遗憾解码还没搞清楚,不然做个lirc.conf功能才多)。最后是语音识别用的幻尔的,某宝自然也有,它是个i2c的接口。

 

 本篇胡说八道其实纯粹为了留个地方以后知道怎么在python脚本里面写串口指令。接下来就顺带着讲一下全流程吧。

1. 先把幻尔的语音模块里面录好几个要说的话。

# initiate_yuyin.py
# encoding: utf-8
'''
Company: 深圳市幻尔科技有限公司
官网:hiwonder.com
日期:2019/9/20
by Aiden
'''
'''
 * 只能识别汉字,将要识别的汉字转换成拼音字母,每个汉字之间空格隔开,比如:幻尔科技 --> huan er ke ji
 * 最多添加50个词条,每个词条最长为79个字符,每个词条最多10个汉字
 * 每个词条都对应一个识别号(1~255随意设置)不同的语音词条可以对应同一个识别号,
 * 比如“幻尔科技”和“幻尔”都可以将识别号设置为同一个值
 * 模块上的STA状态灯:亮起表示正在识别语音,灭掉表示不会识别语音,当识别到语音时状态灯会变暗,或闪烁,等待读取后会恢复当前的状态指示
'''
#使用例程
import smbus
import time
import numpy

class ASR:

    # Global Variables
    address = None
    bus = None

    ASR_RESULT_ADDR = 100
    #识别结果存放处,通过不断读取此地址的值判断是否识别到语音,不同的值对应不同的语音

    ASR_WORDS_ERASE_ADDR = 101
    #擦除所有词条

    ASR_MODE_ADDR = 102
    #识别模式设置,值范围1~3
    #1:循环识别模式。状态灯常亮(默认模式)
    #2:口令模式,以第一个词条为口令。状态灯常灭,当识别到口令词时常亮,等待识别到新的语音,并且读取识别结果后即灭掉
    #3:按键模式,按下开始识别,不按不识别。支持掉电保存。状态灯随按键按下而亮起,不按不亮

    ASR_ADD_WORDS_ADDR = 160
    #词条添加的地址,支持掉电保存

    def __init__(self, address, bus=1):
        self.address = address
        self.bus = smbus.SMBus(bus)

    def readByte(self):
        return self.bus.read_byte(self.address)

    def writeByte(self, val):
        value = self.bus.write_byte(self.address, val)
        if value != 0:
            return False
        return True

    def writeData(self, reg, val):
        self.bus.write_byte(self.address,  reg)
        self.bus.write_byte(self.address,  val)

    def getResult(self):
        if ASR.writeByte(self, self.ASR_RESULT_ADDR):
            return -1
        value = self.bus.read_byte(self.address)
        return value
    '''
    * 添加词条函数,
    * idNum:词条对应的识别号,1~255随意设置。识别到该号码对应的词条语音时,
    *        会将识别号存放到ASR_RESULT_ADDR处,等待主机读取,读取后清0
    * words:要识别汉字词条的拼音,汉字之间用空格隔开
    *
    * 执行该函数,词条是自动往后排队添加的。
    '''
    def addWords(self, idNum, words):
        buf = [idNum]
        for i in range(0, len(words)):
            buf.append(eval(hex(ord(words[i]))))
        self.bus.write_i2c_block_data(self.address, self.ASR_ADD_WORDS_ADDR, buf)
        time.sleep(0.05)

    def eraseWords(self):
        result = self.bus.write_byte_data(self.address, self.ASR_WORDS_ERASE_ADDR, 0)
        time.sleep(0.06)
        if result != 0:
           return False
        return True

    def setMode(self, mode):
        result = self.bus.write_byte_data(self.address, self.ASR_MODE_ADDR, mode)
        if result != 0:
           return False
        return True

if __name__ == "__main__":
    addr = 0x79 #传感器iic地址
    asr = ASR(addr)

    if 1:
        asr.eraseWords()
        asr.setMode(1)
        asr.addWords(1,'miao le ge mi mi mi')  # 唤醒词条在此
        asr.addWords(2,'da kai kong tiao zhi leng')  # 打开空调制冷
        asr.addWords(3,'kong tiao zhi re kai')  # 空调制热开
        asr.addWords(4,'guan bi kong tiao') # 关闭空调

2. 开启唤醒模式,操控空调。

# yuyin.py
# encoding: utf-8
import smbus
import time
import serial

ser = serial.Serial(
    port='/dev/ttyUSB0',
    baudrate=9600,
    parity=serial.PARITY_NONE,
    stopbits=serial.STOPBITS_ONE,
    bytesize=serial.EIGHTBITS,
    timeout=1
    )

class ASR:

    # Global Variables
    address = None
    bus = None

    ASR_RESULT_ADDR = 100

    ASR_MODE_ADDR = 102

    ASR_ADD_WORDS_ADDR = 160
    #词条添加的地址,支持掉电保存

    def __init__(self, address, bus=1):
        self.address = address
        self.bus = smbus.SMBus(bus)

    def readByte(self):
        return self.bus.read_byte(self.address)

    def writeByte(self, val):
        value = self.bus.write_byte(self.address, val)
        if value != 0:
            return False
        return True

    def writeData(self, reg, val):
        self.bus.write_byte(self.address,  reg)
        self.bus.write_byte(self.address,  val)

    def getResult(self):
        if ASR.writeByte(self, self.ASR_RESULT_ADDR):
            return -1
        value = self.bus.read_byte(self.address)
        return value

    def setMode(self, mode):
        result = self.bus.write_byte_data(self.address, self.ASR_MODE_ADDR, mode)
        if result != 0:
           return False
        return True

if __name__ == "__main__":
    addr = 0x79 #传感器iic地址
    asr = ASR(addr)

    #来自串口指令那个图片给的发送地址。这儿就已经用了3个,这个模块一共才4个位置。
    arr_data2 = [0x01,0x06,0x00,0x01,0x00,0x02,0x59,0xCB]
    arr_data3 = [0x01,0x06,0x00,0x01,0x00,0x03,0x98,0x0B]
    arr_data4 = [0x01,0x06,0x00,0x01,0x00,0x01,0x19,0xCA]

    if 1:
        asr.setMode(2)  #启动唤醒模式
        #asr.addWords(1,'miao le ge mi mi mi')  # 唤醒
        #asr.addWords(2,'da kai kong tiao zhi leng')  # 打开空调制冷
        #asr.addWords(3,'kong tiao zhi re kai')  # 空调制热开
        #asr.addWords(4,'guan bi kong tiao') # 关闭空调
    while 1:
        data = asr.getResult()
        #print("result:", data)
        if data == 2:
            #echo -en '\x01\x06\x00\x01\x00\x02\x59\xCB' > /dev/ttyUSB0
            ser.write(serial.to_bytes(arr_data2))
        elif data == 3:
            #echo -en '\x01\x06\x00\x01\x00\x03\x98\x0B' > /dev/ttyUSB0
            ser.write(serial.to_bytes(arr_data3))
        elif data == 4:
            #echo -en '\x01\x06\x00\x01\x00\x01\x19\xCA' > /dev/ttyUSB0
            ser.write(serial.to_bytes(arr_data4))
        else:
            continue
        time.sleep(0.5)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/86997.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

什么是遗传算法(Genetic Algorithm,简称 GA)?

目录 一、遗传算法介绍二、遗传算法应用场景三、遗传算法具体案列1、求解旅行商问题(TSP 问题)2、求解一个矩阵中的最大值3、基于遗传算法的图像压缩方法 四、遗传算法重要意义五、生物进化与遗传算法之间的关系 一、遗传算法介绍 遗传算法(…

基于PHP的电脑商城系统

有需要请加文章底部Q哦 可远程调试 基于PHP的电脑商城系统 一 介绍 此电脑商城系统基于原生PHP开发,数据库mysql,前端bootstrap。用户可注册登录,购物下单,评论等。管理员登录后台对电脑商品,用户,订单&a…

C语言小白急救 指针进阶讲解1

文章目录 指针一、 字符指针二、 指针数组三、数组指针1.数组的地址2.数组指针3.数组指针的应用 四、数组参数、指针参数1. 一维数组传参2.二维数组传参3.一级指针传参4.二级指针传参 五、函数指针1.函数的地址2.函数指针3.练习 指针 指针的概念: 1.指针就是个变量…

时序预测 | Matlab实现SO-CNN-GRU蛇群算法优化卷积门控循环单元时间序列预测

时序预测 | Matlab实现SO-CNN-GRU蛇群算法优化卷积门控循环单元时间序列预测 目录 时序预测 | Matlab实现SO-CNN-GRU蛇群算法优化卷积门控循环单元时间序列预测预测效果基本介绍程序设计参考资料 预测效果 基本介绍 时序预测 | Matlab实现SO-CNN-GRU蛇群算法优化卷积门控循环单…

分类预测 | MATLAB实现S4VM半监督支持向量机二分类预测

分类预测 | MATLAB实现S4VM半监督支持向量机二分类预测 目录 分类预测 | MATLAB实现S4VM半监督支持向量机二分类预测分类效果基本介绍程序设计参考资料 分类效果 基本介绍 分类预测 | MATLAB实现S4VM半监督支持向量机二分类预测 程序设计 完整源码和数据获取方式: …

Spring Cache的介绍以及怎么使用(redis)

Spring Cache 文章目录 Spring Cache1、Spring Cache介绍2、Spring Cache常用注解2.1、EnableCaching注解2.2、CachePut注解2.3、CacheEvict注解2.4、Cacheable注解 3、Spring Cache使用方式--redis 1、Spring Cache介绍 Spring Cache是一个框架,实现了基于注解的缓…

删除链表的中间节点

题目: 示例: 思路: 这个题类似于寻找链表中间的数字,slow和fast都指向head,slow走一步,fast走两步,也许你会有疑问,节点数的奇偶不考虑吗?while执行条件写成fast&&…

JVM——类加载与字节码技术—字节码指令

2.字节码指令 2.1 入门 jvm的解释器可以识别平台无关的字节码指令,解释为机器码执行。 2a b7 00 01 b1 this . init() return 准备了System.out对象,准备了参数“hello world”,准备了对象的方法println(String)V&#xff…

如何优化因为高亮造成的大文本(大字段)检索缓慢问题

首先还是说一下背景,工作中用到了 elasticsearch 的检索以及高亮展示,但是索引中的content字段是读取的大文本内容,所以后果就是索引的单个字段很大,造成单独检索请求的时候速度还可以,但是加入高亮之后检索请求的耗时…

Prometheus+Grafana+AlertManager监控Linux主机状态

文章目录 PrometheusGrafanaAlertManager监控平台搭建开始监控Grafana连接Prometheus数据源导入Grafana模板监控Linux主机状态 同系列文章 PrometheusGrafanaAlertManager监控平台搭建 Docker搭建并配置Prometheus Docker拉取并配置Grafana Docker安装并配置Node-Exporter …

WordArt Designer:基于用户驱动与大语言模型的艺术字生成

AIGC推荐 FaceChain人物写真开源项目,支持风格与穿着自定义,登顶github趋势榜首! 前言 本文介绍了一个基于用户驱动,依赖于大型语言模型(LLMs)的艺术字生成框架,WordArt Designer。 该系统包含四个关键模块:LLM引擎、…

微人事 登录问题完善

重启服务端的时候,发现前端页面会操作不了,这样后端session会失效,我们就需要让页面重新跳转到登录页 springsecurity配置类后端配置 前端拦截器进行拦截跳转

【C++数据结构】二叉搜索树

【C数据结构】二叉搜索树 目录 【C数据结构】二叉搜索树二叉搜索树概念二叉搜索树操作二叉搜索树的查找二叉搜索树的插入二叉搜索树的删除二叉搜索树的实现二叉搜索树的应用二叉搜索树的性能分析 作者:爱写代码的刚子 时间:2023.8.22 前言:二…

SpringMVC入门笔记

一、SpringMVC简介 1. 什么是MVC MVC是一种软件架构的思想,将软件按照模型、视图、控制器来划分 M:Model,模型层,指工程中的JavaBean,作用是处理数据 JavaBean分为两类: 一类称为实体类Bean&#xff1…

怎么维护自己的电脑

文章目录 我的电脑日常维护措施维护技巧键盘&屏幕清洁清理磁盘空间控制温度 电脑换电池 无论是学习还是工作,电脑都是IT人必不可少的重要武器,一台好电脑除了自身配置要经得起考验,后期主人对它的维护也是决定它寿命的重要因素&#xff0…

如何使用NLP库解析Python中的文本

Python是一种强大的面向对象的编程(object-oriented programming,OOP)语言,在人工智能领域有着广泛的用途。正是鉴于其实用性,以Google为首的大型科技公司,已经对其开发了Tensorflow等代码库,帮…

Flask狼书笔记 | 03_模板

文章目录 3 模板3.1 模板基本使用3.2 模板结构组织3.3 模板进阶 3 模板 模板(template):包含固定内容和动态部分的可重用文件。Jinja2模板引擎可用于任何纯文本文件。 3.1 模板基本使用 HTML实体:https://dev.w3.org/html5/htm…

Ubuntu系统安装之后首需要做的事情

Ubuntu系统的初步环境搭建 1、换源2、显卡3、浏览器4、输入法5、终端6、ROS7、VSCode8、设置时间与win一致9、 TimeShift10、 Anaconda(考虑装不装) 1、换源 点开Software&&Update,找到Ubuntu Software中的Download from&#xff0c…

数据通信——传输层(UDP)

引言 我们上网观看比赛的时候,一旦网络信号出现问题,那可就太难受了,这意味着卡顿的时间内,你会错过这段时间内的内容。这种特性要归功于UDP(User Datagram Protocol)用户数据报协议。 无连接性 一般的&am…

IntelliJ IDEA maven配置,设置pom.xml的配置文件

IntelliJ IDEA项目,选择 文件 设置,弹窗 构建、执行、部署 构建工具 Maven就可以 maven配置好以后,在pom.xml的配置文件中就可以设置对应的jar包了,这样构建的时候自动需要的jar,在项目中导入即 需要的jar包设置在po…