简单项目,天问ASR离线语音+esp8266的红外语音助手2026-1-2

天问ASR离线语音端程序:

本来打算就用这个设备来控制的,天问的那个库不怎么好用所以改成两个芯片控制

天问仅控制离线语音,esp8266负责控制设备


获取红外对应码需要看我主页(之前的文档:简单项目 esp8266 红外接收 2025年6月24日21:35:32),是esp8266读取.

读取之后自己记录下来就行. 关于音色:需要先,生成模型之后再下载!

esp8266发送红外控制信号代码如下(简化代码方便阅读和理解):

cpp 复制代码
#include <Arduino.h>//arduino支持文件
#include <WiFiManager.h>//联网用的库,没实例化不可用
#include <IRsend.h>//红外发射库文件
#define IR_send_PIN 5  //宏定义接收脚
IRsend irsend(IR_send_PIN);//实例化红外发射
uint64_t IR_CODE;//创建一个转储,用于存储临时红外代码

void setup()
{
irsend.begin();//初始化红外发射

}
void open_tv()
{//用于打开电视 对应天问1A 反馈
    IR_CODE=0xFD00FF;//打开电视代码
irsend.sendNEC(IR_CODE,32);//红外发射
delay(20);//低延时
  IR_CODE=0x8877C23D;//打开机顶盒代码
irsend.sendNEC(IR_CODE,32);//红外发射
}
void swap_tv()
{
 IR_CODE=0x887728D7;//打开机顶盒上,方向按钮用于换台
irsend.sendNEC(IR_CODE,32);//红外发射
}
 void open_WDYH_tv()
 {
    //打开雾都夜话频道,我机顶盒是3403
 IR_CODE=0x887702FD;//3对应红外码
irsend.sendNEC(IR_CODE,32);//红外发射
delay(20);//小小延时
IR_CODE=0x8877629D;//4对应红外码
irsend.sendNEC(IR_CODE,32);//红外发射
delay(20);//小小延时
IR_CODE=0x8877B24D;//0对应红外码
irsend.sendNEC(IR_CODE,32);//红外发射
delay(20);//小小延时
IR_CODE=0x887702FD;//3对应红外码
irsend.sendNEC(IR_CODE,32);//红外发射
delay(20);//小小延时

 }
 void  open_new_tv()
 {//用于切换新闻频道
IR_CODE=0x887742BD;//1对应红外码
irsend.sendNEC(IR_CODE,32);//红外发射
delay(20);//小小延时
 }


void loop()
{

    // 检查串口是否有可读取的数据
    if (Serial.available() > 0) {
        // 读取串口接收到的所有数据,存储到String类型变量中
        String data = Serial.readString();
    
        
        // 如果天问设备发送"1A"、"1A 1A 1A"会被检测到
        if (data.indexOf("1A") != -1) {
            // 当检测到"1A"时,这里执行相应的操作
           open_tv();//调用打开电视函数 
        }
          
        if (data.indexOf("0A") != -1) {
            // 当检测到"0A"时,这里执行相应的操作
           open_tv();//调用打开电视函数 ,如果电视已经打开这就会关闭电视
        }
          
        if (data.indexOf("1B") != -1) {
            // 当检测到"1B"时,这里执行相应的操作
          swap_tv(); //调用换台函数,默认递增换台 
        }
         
        if (data.indexOf("2B") != -1) {
            // 当检测到"2B"时,这里执行相应的操作
           open_WDYH_tv();//调用函数切换到雾都夜话频道
        }
          
        if (data.indexOf("3B") != -1) {
            // 当检测到"3B"时,这里执行相应的操作
           open_new_tv();//调用函数切换到新闻频道
        }
    }

    // 短暂延迟,减少CPU占用,保持系统响应性
    delay(10);

    
}

以上是简单示范,因为是两个芯片,我们还可以使用esp8266获取网络时间定时打开电视 切换频道

还可以绑定mqtt,远程给家里老人开电视和换台


整体完整修复版本

天问代码(新增心跳闪灯,提示板子运行状态):
ESP8266(新增线程心跳闪灯提示板子状态):
复制代码
#include <Arduino.h>     //arduino支持文件
#include <WiFiManager.h> //联网用的库,没实例化不可用
#include <IRsend.h>      //红外发射库文件
#include <Ticker.h>      // Ticker库

#define LED_PIN 2           // GPIO2 板载LED
#define IR_send_PIN 5       // 宏定义接收脚
IRsend irsend(IR_send_PIN); // 实例化红外发射
uint64_t IR_CODE;           // 创建一个转储,用于存储临时红外代码
// LED翻转函数
void toggleLED()
{
    digitalWrite(LED_PIN, !digitalRead(LED_PIN));
}

// 创建Ticker对象
Ticker ledTicker(toggleLED, 500); // 500毫秒间隔

void setup()
{
    Serial.begin(9600); // 约定串口频率9600
    irsend.begin();     // 初始化红外发射
                        // 心跳,标识设备在运行
    pinMode(LED_PIN, OUTPUT);
    digitalWrite(LED_PIN, HIGH); // 初始熄灭(ESP8266 LED低电平点亮)

    // 启动Ticker
    ledTicker.start();
}
void open_tv()
{                                // 用于打开电视 对应天问1A 反馈
    IR_CODE = 0xFD00FF;          // 打开电视代码
    irsend.sendNEC(IR_CODE, 32); // 红外发射
    delay(20);                   // 低延时
    IR_CODE = 0x8877C23D;        // 打开机顶盒代码
    irsend.sendNEC(IR_CODE, 32); // 红外发射
}
void swap_tv()
{
    IR_CODE = 0x887728D7;        // 打开机顶盒上,方向按钮用于换台
    irsend.sendNEC(IR_CODE, 32); // 红外发射
}
void open_WDYH_tv()
{
    // 打开雾都夜话频道,我机顶盒是3403
    IR_CODE = 0x887702FD;        // 3对应红外码
    irsend.sendNEC(IR_CODE, 32); // 红外发射
    delay(20);                   // 小小延时
    IR_CODE = 0x8877629D;        // 4对应红外码
    irsend.sendNEC(IR_CODE, 32); // 红外发射
    delay(20);                   // 小小延时
    IR_CODE = 0x8877B24D;        // 0对应红外码
    irsend.sendNEC(IR_CODE, 32); // 红外发射
    delay(20);                   // 小小延时
    IR_CODE = 0x887702FD;        // 3对应红外码
    irsend.sendNEC(IR_CODE, 32); // 红外发射
    delay(20);                   // 小小延时
}
void open_new_tv()
{                                // 用于切换新闻频道
    IR_CODE = 0x887742BD;        // 1对应红外码
    irsend.sendNEC(IR_CODE, 32); // 红外发射
    delay(20);                   // 小小延时
}

void loop()
{
//调用update()!Ticker才会工作
    ledTicker.update();
    // 检查串口是否有可读取的数据
    if (Serial.available() > 0)
    {
        // 读取串口接收到的所有数据,存储到String类型变量中
        String data = Serial.readString();
        data.trim();  // 去除首尾空白和换行符

        // 如果天问设备发送"1A"、"1A 1A 1A"会被检测到
        if (data.indexOf("1A") != -1)
        {
            // 当检测到"1A"时,这里执行相应的操作
            open_tv(); // 调用打开电视函数
        }

        if (data.indexOf("0A") != -1)
        {
            // 当检测到"0A"时,这里执行相应的操作
            open_tv(); // 调用打开电视函数 ,如果电视已经打开这就会关闭电视
        }

        if (data.indexOf("1B") != -1)
        {
            // 当检测到"1B"时,这里执行相应的操作
            swap_tv(); // 调用换台函数,默认递增换台
        }

        if (data.indexOf("2B") != -1)
        {
            // 当检测到"2B"时,这里执行相应的操作
            open_WDYH_tv(); // 调用函数切换到雾都夜话频道
        }

        if (data.indexOf("3B") != -1)
        {
            // 当检测到"3B"时,这里执行相应的操作
            open_new_tv(); // 调用函数切换到新闻频道
        }
    }

    // 短暂延迟,减少CPU占用,保持系统响应性
    delay(10);
}

使用上和接线的问题:因为esp8266是3.3v所以红外发送二极管不串电阻也是能工作的,接收红外管理论上也是可以的,如果条件允许也可加一个200Ω的电阻或者串一个小贴片led

需要考虑的问题:电视声音过大,导致模块识别精度下降,可再天问唤醒后 先发送串口信息给esp8266控制电视静音,等例如换台操作完成后 附加一个静音代码以解除.(治标不治本,还是会出现小问题)

相关推荐
小二·8 分钟前
Python Web 开发进阶实战 :AI 原生数字孪生 —— 在 Flask + Three.js 中构建物理世界实时仿真与优化平台
前端·人工智能·python
chinesegf31 分钟前
文本嵌入模型的比较(一)
人工智能·算法·机器学习
珠海西格电力41 分钟前
零碳园区的能源结构优化需要哪些技术支持?
大数据·人工智能·物联网·架构·能源
Black蜡笔小新43 分钟前
视频汇聚平台EasyCVR打造校园消防智能监管新防线
网络·人工智能·音视频
珠海西格电力科技44 分钟前
双碳目标下,微电网为何成为能源转型核心载体?
网络·人工智能·物联网·云计算·智慧城市·能源
2501_941837261 小时前
【计算机视觉】基于YOLOv26的交通事故检测与交通状况分析系统详解_1
人工智能·yolo·计算机视觉
HyperAI超神经1 小时前
加州大学构建基于全连接神经网络的片上光谱仪,在芯片级尺寸上实现8纳米的光谱分辨率
人工智能·深度学习·神经网络·机器学习·ai编程
badfl1 小时前
AI漫剧技术方案拆解:NanoBanana+Sora视频生成全流程
人工智能·ai·ai作画
杭州杭州杭州2 小时前
李沐动手学深度学习笔记(4)---物体检测基础
人工智能·笔记·深度学习
小二·2 小时前
Python Web 开发进阶实战(终章):从单体应用到 AI 原生生态 —— 45 篇技术演进全景与未来开发者生存指南
前端·人工智能·python