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

废话少说,直接上空调板子: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)

2023-09-01:换了一款红外模块,BQ-TTL-IRTM。这个直接解码出来的一长串hex code再发回给空调就好。意味着可以一个个定义:开,26度制冷4风,制热blablabla 。

GitHub - Michshelle/BQ-TTL-IRTM_Hiwonder: on Rpi4 for Speech recognition + IR transmission

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
本文在阐述了嵌入式语音识别原理和红外遥控技术的基础上,介绍了一种非常适合进行嵌入式语音处理的单片机—凌阳SPCE061A微控制器,并且通过运用此控制器数字语音处理功能和红外遥控技术设计出一种新型的基于语音控制的万能遥控器。 本设计有如下特点: 一、有别于采用专用集成发射芯片来实现遥控码发射的传统遥控器,而是采用微控制器模拟发射红外遥控码,具有灵活性和多样性。 二、能够利用微控制器接收和分析红外遥控码,并可以保存遥控码的信息特征,以便重新发射相同功能的遥控码,具有智能性。 三、该设计依据特定人语音识别原理,将经过处理的输入语音的特征参数作为未知模式,与预先存储的标准模式进行比较,通过调用SPEC061A的C函数库和语音处理函数库中的函数来实现语音识别、处理与控制,并采用SACM _480语音编码算法播放提示语音。与组成系统复杂、编程难、价格高的处理语音信号的专用芯片相比,开发人员只需应用SPEC061A的处理语音信号的API接口函数,缩短了开发周期。 该遥控器用语音命令来替代普通遥控器的按键功能,弥补了目前遥控器人机交互界面和功能单调的缺陷,提供了更友好、更人性化的操作方式,同时利用此系统的学习功能使得该遥控器具有“一器多用”的功能。 最后,在结论中提到系统功能的扩展,利用SPCE061A内部的丰富资源,在不增加成本的前提下,嵌入其他常用功能,具有升级性好、性价比高的优点。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

取啥都被占用

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值