【RT摩拳擦掌】基于RT106L/S语音识别的百度云控制系统

【RT摩拳擦掌】基于RT106L/S语音识别的百度云控制系统

  • 一 文档简介
  • 二 平台构建
    • 2.1 使用平台
    • 2.2 百度智能云
      • 2.2.1 物联网核心套件
      • 2.2.2 在线语音合成
    • 2.3 playback语音数据准备与烧录
    • 2.4 开机语音准备与添加
    • 2.5 唤醒词识别词命令准备与添加
  • 三 代码准备
    • 3.1 sln-local/2-iot 代码
      • 3.1.1 语音相关代码
      • 3.1.3网络连接代码
    • 3.2 MIMXRT1060-EVK 代码
  • 四 测试结果
    • 4.1 MQTT.fx 测试百度云连接
    • 4.2 语音识别唤醒并远程控制测试
      • 4.2.1 语音唤醒识别实现本地控制
      • 4.2.2 语音唤醒识别实现远程控制

一 文档简介

NXP RT106L和RT106S是一款用于本地语音识别的芯片,SLN-LOCAL-IOT基于RT106L, SLN-LOCAL2-IOT是基于RT106S的新款本地语音识别开发板。开发板包含murata 1DX wifi/BLE模块,AFE语音模拟前端,ASR识别系统,外部flash, 2个麦克风,以及模拟语音放大器与扬声器。SLN-LOCAL-IOT 和SLN-LOCAL2-IOT的语音识别过程有区别,建议使用新款SLN-LOCAL2-IOT。
本文基于语音识别板SLN-LOCAL/2-IOT实现如下框图功能:

在这里插入图片描述

图1
使用PC端speech model工具(Cyberon DSMT)生成WW(wakeup word)和VC(Voice command) 的voice engine binary 文件供IDE demo使用,当用户说中文:“小恩小恩”,语音唤醒SLN-LOCAL/2-IOT,板子给出反馈“小恩来了,请吩咐”。然后进入语音识别阶段,用户可以说语音识别命令:“开红灯”,“关红灯”,“开绿灯”,“关绿灯”,“开远程灯”,“关远程灯”,识别之后,板子给出反馈“好的“。其中“开红灯”,“关红灯”,“开绿灯”,“关绿灯” 四个命令是用于本地红绿灯的开关, 而“开远程灯”,“关远程灯”两个命令可以通过网络通信实现百度云端控制另外的MIMXRT1060-EVK开发板灯的开关。SLN-LOCAL/2-IOT通过WIFI模块接入互联网通过MQTT协议实现与百度云端的通信,当接到远程控制命令,发布json数据包到百度云端,同时MIMRT1060-EVK订阅百度云端数据,会收到IOT板子发过来的数据并予以解析实现EVK板子灯的控制。PC端可以使用MQTT.fx软件订阅百度云数据,也可以直接下发数据给设备达到远程控制的目的。
下面讲解如何基于SLN-LOCAL/2-IOT的SDK代码实现客户自定义中文(Mandarin)唤醒识别并且远程百度云控制MIMXRT1060-EVK的应用。

二 平台构建

2.1 使用平台

SLN-LOCAL-IOT/SLN-LOCAL2-IOT
MIMXRT1060-EVK
MQTT.fx
SDK_2_8_0_SLN-LOCAL2-IOT
MCUXPresso IDE
Segger JLINK
百度智能云:物联网核心套件+在线语音合成
Audacity:语音文件格式转换,剪辑,录音等
WAVToCode:wav转换成C数组数据,用于主题音频播放
MCUBootUtility:用于烧录feedback语音文件到filesystem
Cyberon DSMT: 唤醒词和识别词的PC代码生成软件
这里最关键的软件是用于唤醒词识别词生成代码的软件,申请渠道如下:
在这里插入图片描述

图2

2.2 百度智能云

2.2.1 物联网核心套件

参考之前的文档:
RT云端测试之百度天工物接入构建

2.2.2 在线语音合成

SLN-LOCAL/2-IOT板子识别到唤醒词,识别词,或者开机的时候,需要添加对应的反馈音频,比如:“百度云端语音测试demo”, “小恩来啦!请吩咐”,“好的”。这些词汇需要做一个文字到wav音频文件的合成,这里使用的是百度智能云的在线语音合成功能,具体操作可以参考如下文档:
https://ai.baidu.com/ai-doc/SPEECH/jk38y8gno
开通基础音库之后,使用上面链接中提供的main.py并修改,在文件“TEXT =“中添加自己要转换的中文字段,”save_file =“中添加要转换的音频文件,比如xxx.wav,使用命令:python main.py 即可完成转换,并且生成文字对应的音频格式,比如.mp3,.wav.
在这里插入图片描述

图7
得到wav之后,也不是立马可以使用,我们需要注意,对于SLN-LOCAL/2-IOT需要识别48K采样率16bit的音源,所以还需要进一步使用Audacity音频工具转换音频文件格式为48K16bit 的wav。导入百度语音合成生成的16K16bit wav文件到Audacity工具中, 选择project rate为48Khz,file->export->export as WAV, 选择encoding为signed 16bit PCM,重新生成48Khz16bit的wav供后续使用。
在这里插入图片描述

图8
“百度云端语音测试demo”:用于开机播报,存放在工程代码里,所以需要进一步转换为16bit的C代码数组,并且添加到工程中去。
“小恩来啦!请吩咐”,“好的”:作为回馈音,存放在filesystem ZH01,ZH02区域。

2.3 playback语音数据准备与烧录

涉及到的中文playback语音有两个:“小恩来啦!请吩咐”,“好的”,存放在filesystem ZH01,ZH02区域。Filesystem区域情况如下:
在这里插入图片描述

图9
所以需要将之前准备的对应的48K16bit wav转换成filesystem需要的格式。这里用到官方工具 :Ivaldi_sln_local2_iot
具体参考文档:SLN-LOCAL2-IOT-DG
chapter 10.1 Generating filesystem-compatible files
使用bash输入如下命令:
在这里插入图片描述

图10
使用转换命令得到需要的playback bin文件:
python file_format.py -if xiaoencoming_48k16bit.wav -of xiaoencoming_48k16bit.bin -ft H
最终生成文件:
“小恩来啦!请吩咐”->xiaoencoming_48k16bit.bin 烧录到芯片地址 0x6184_0000
“好的”->OK_48k16bit.bin烧录到芯片地址0x6180_0000
使用MCUBootUtility工具将两个反馈文件烧录到对应的image中。
这里以OK_48k16bit.bin为例,demo板进入serial download mode(J27-0),断电,上电。
Flash芯片选择hyper flash IS26KSXXS,使用boot device memory界面的write直接烧录对应bin文件到具体的地址,长度为0X40000。

在这里插入图片描述

图11
在这里插入图片描述

图12
xiaoencoming_48k16bit.bin 使用同样的方法烧录到地址0x6184_0000,长度0X40000.

2.4 开机语音准备与添加

之前准备好的baiduclouddemo_48K16bit.wav(“百度云端语音测试demo”),需要转换成可用的16bit C数组文件,放到工程代码中,供代码调用,用于语言模式demo语音播报。转换需要用到WAVToCode软件,转换如下:
在这里插入图片描述

图13
生成好的代码baiducloulddemo_48K16bit.c,添加到工程demo主题C文件中:sln_local_iot_local_demo->audio->demos->smart_home.c。

2.5 唤醒词识别词命令准备与添加

唤醒词识别词是通过cyberon DSMT工具生成,该工具支持多种丰富的语言转换,客户可以通过图2申请该软件。本文的中文唤醒词以及识别词也是通过DSMT生成。
DSMT可以有多个group,group1作为唤醒词配置,CmdMapID=1.
其他group作为识别词,比如本文的CMD-IOT,cmdMapID=2,作为识别词。
在这里插入图片描述

图14
在这里插入图片描述

图15
Wake word会连续检测输入的音频数据流,使用group1,如果成功唤醒之后,进行具体的识别词识别,使用group2,或者其他的识别group以及自定义group. 使用DSMT配置唤醒词如下:
在这里插入图片描述

图16
唤醒词可以支持多个,需要的唤醒词均配置在goup1中即可。使用DSMT配置识别词如下:
在这里插入图片描述

图17
然后保存生成文件,代码使用的主要相关文件有:_witMapID.bin, CMD_IOT.xml,WW.xml.
生成的文件中,CYBase.mod是基础模型,WW.mod是唤醒词模型,CMD_IOT.mod是识别词模型。
经过图16,17已经完成了唤醒词与识别词的准备,并且把生成的DSMT工程直接放到工程文件夹下:sln_local2_iot_local_demo\local_voice\oob_demo_zh

三 代码准备

本文代码基于官方SDK local_demo的基础上修改中文唤醒词和识别词(也可以直接构建新的客户自定义group),添加本地识别后灯状态操作,反馈中文音频,主题中文音频,wifi网络通信MQTT协议代码以及百度云物影子连接发布等操作。
源参考代码SDK路径:
SDK_2_8_0_SLN-LOCAL2-IOT\boards\sln_local2_iot\sln_voice_examples\local_demo
SDK_2_8_0_SLN-LOCAL2-IOT\boards\sln_local2_iot\sln_boot_apps
SLN-LOCAL2-IOT以及SLN-LOCAL-IOT代码一致,唯一区别使用的ASR库文件不一样,对于RT106S(SLN-LOCAL2-IOT)使用SDK自带libsln_asr.a库即可,对于RT106L(SLN-LOCAL-IOT)需要使用对应的libsln_asr_eval.a库。
导入代码需要三个工程:local_demo, bootloader, bootstrap. 三个工程存放的image空间不一样。具体查看SLN-LOCAL2-IOT-DG.pdf,chapter 3.3 Device memory map
关于三个工程在启动中的情况如下:
在这里插入图片描述

图18
本文用于demo测试,并且需要debug,所以本文将加密机制关闭,配置bootloader, bootstrap工程宏定义:DISABLE_IMAGE_VERIFICATION=1,并且使用JLINK连接SLN-LOCAL/2-IOT 的SWD接口烧录代码。
下面主要针对APP local_demo工程添加修改代码。

3.1 sln-local/2-iot 代码

Sln-local-iot, sln-local2-iot 平台,下面的修改代码一致。

3.1.1 语音相关代码

1)主题播报代码
播报内容:“百度云端语音测试demo”
sln_local2_iot_local_demo_xe_ledwifi\audio\demos\ smart_home.c 内容替换为前面生成的baiducloulddemo_48K16bit.C
audio_samples.h,修改:

#define SMART_HOME_DEMO_CLIP_SIZE 110733

本代码是供main.c 中的announce_demo 播报使用:

case ASR_CMD_IOT:
    ret = demo_play_clip((uint8_t *)smart_home_demo_clip, sizeof(smart_home_demo_clip));

2)command 打印信息

#define NUMBER_OF_IOT_CMDS      7
IndexCommands.h
static char *cmd_iot_en[] = {"Red led on", "Red led off", "Green led on", "Green led off",
                             "cycle led",        "remote led on",         "remote led off"};
static char *cmd_iot_zh[] = {"开红灯", "关红灯", "开绿灯", "关绿灯", "灯闪烁", "开远程灯", "关远程灯"};

这里是使用IOT的源代码修改,实际也可以直接添加自己的语音识别group,并且添加相关的命令标识。

3)sln_local_voice.c
Line757, 在ASR_CMD_IOT模式下,添加led相关通知信息。

oob_demo_control.ledCmd = g_asrControl.result.keywordID[1];    

该代码用于获取识别的VC命令数据,keywordID[1]的值代表语音识别的标号No,用来判断具体语音识别是哪个,从而可以在app中根据ledcmd的值做具体的操作。keywordID[1]的值和图17,Command list的No.一一对应。
比如“开远程灯”,如果唤醒后,并且识别到”开远程灯”,则这里的keywordID[1]为5并且可以传输给oob_demo_control.ledCmd,用于后续appTask中做具体控制动作。
4) main.c
void appTask(void *arg)
在 case kCommandGeneric:下,如果语言是中文,然后添加对应的识别后控制代码,首先先播放feedback响应,中文“好的“。
然后根据具体的音频识别键值,给与开关本地灯操作。

                else if (oob_demo_control.language == ASR_CHINESE)
                {
// play audio "OK" in Chinese
#if defined(SLN_LOCAL2_RD)
                    ret = audio_play_clip((uint8_t *)AUDIO_ZH_01_FILE_ADDR, AUDIO_ZH_01_FILE_SIZE);
#elif defined(SLN_LOCAL2_IOT)
                    ret = audio_play_clip(AUDIO_ZH_01_FILE);
#endif

                    //kerry add operation code==================================================begin
                    RGB_LED_SetColor(LED_COLOR_OFF);

                     if (oob_demo_control.ledCmd == LED_RED_ON)
                     {
                         RGB_LED_SetColor(LED_COLOR_RED);
                         vTaskDelay(5000);
                     }
                     else if (oob_demo_control.ledCmd == LED_RED_OFF)
                     {
                         RGB_LED_SetColor(LED_COLOR_OFF);
                         vTaskDelay(5000);
                     }
                     else if (oob_demo_control.ledCmd == LED_BLUE_ON)
                     {
                         RGB_LED_SetColor(LED_COLOR_BLUE);
                         vTaskDelay(5000);
                     }
                     else if (oob_demo_control.ledCmd == LED_BLUE_OFF)
                     {
                         RGB_LED_SetColor(LED_COLOR_OFF);
                         vTaskDelay(5000);
                     }
                     else if (oob_demo_control.ledCmd == CYCLE_SLOW)
                     {
                         for (int i = 0; i < 3; i++)
                         {
                             RGB_LED_SetColor(LED_COLOR_RED);
                             vTaskDelay(400);
                             RGB_LED_SetColor(LED_COLOR_OFF);
                             RGB_LED_SetColor(LED_COLOR_GREEN);
                             vTaskDelay(400);
                             RGB_LED_SetColor(LED_COLOR_OFF);
                             RGB_LED_SetColor(LED_COLOR_BLUE);
                             vTaskDelay(400);
                         }
                     }}

3.1.3网络连接代码

除了本地语音识别控制外,本文还添加了语音识别后远程控制功能,主要通过wifi连接以太网,通过mqtt协议连接到百度云服务器,当本地语音识别到要完成远程控制的命令后,发布对应的控制消息到百度云端,再由云端发给订阅消息的其他客户端,然后其他客户端收到消息后,可以通过解析订阅收到的json数据,解析数据并且予以控制。
1)sln_local2_iot_local_demo_xe_ledwifi\lwip\src\apps\mqtt
添加mqtt.c
2)sln_local2_iot_local_demo_xe_ledwifi\lwip\src\include\lwip\apps
添加mqtt.h, mqtt_opts.h,mqtt_prv.h
相关的mqtt驱动均来自RT1060 SDK驱动,已经添加到附件中。
3)sln_tcp_server.c
添加MQTT应用层API函数代码,客户端ID, 服务器主机, MQTT服务器端口号,用户名,密码,订阅主题,发布主题与数据等,具体查看附件代码,由于代码量较多,这里不一一说明。
MQTT应用层代码是从RT1060 SDK的mqtt工程移植过来,添加到sln_tcp_server.c中。TCP_OTA_Server函数用于初始化wifi网络,实现wifi连接,连接到网络之后,解析百度云服务器网址得到IP,然后通过mqtt连接百度云服务器,连接成功之后,先做一个启动数据发布,这样可以在上电之后通过mqttfx去查看启动网络发布消息是否成功。
TCP_OTA_Server函数代码如下:

static void TCP_OTA_Server(void *param) //kerry consider add mqtt related code
{
    err_t err      = ERR_OK;
    uint8_t status = kCommon_Failed;

#if USE_WIFI_CONNECTION
    /* Start the WiFi and connect to the network */
    APP_NETWORK_Init();

    while (status != kCommon_Success)
    {
        status_t statusConnect;

        statusConnect = APP_NETWORK_Wifi_Connect(true, true);
        if (WIFI_CONNECT_SUCCESS == statusConnect)
        {
            status = kCommon_Success;
        }
        else if (WIFI_CONNECT_NO_CRED == statusConnect)
        {
            APP_NETWORK_Uninit();
            /* If there are no credential in flash delete the TPC server task */
            vTaskDelete(NULL);
        }
        else
        {
            status = kCommon_Failed;
        }
    }
#endif
#if USE_ETHERNET_CONNECTION
    APP_NETWORK_Init(true);
#endif

    /* Wait for wifi/eth to connect */
    while (0 == get_connect_state())
    {
        /* Give time to the network task to connect */
        vTaskDelay(1000);
    }

    configPRINTF(("TCP server start\r\n"));
    configPRINTF(("MQTT connection start\r\n"));

    mqtt_client = mqtt_client_new();
    if (mqtt_client == NULL)
    {
    	configPRINTF(("mqtt_client_new() failed.\r\n");)
        while (1)
        {
        }
    }
    if (ipaddr_aton(EXAMPLE_MQTT_SERVER_HOST, &mqtt_addr) && IP_IS_V4(&mqtt_addr))
    {
        /* Already an IP address */
        err = ERR_OK;
    }
    else
    {
        /* Resolve MQTT broker's host name to an IP address */
    	configPRINTF(("Resolving \"%s\"...\r\n", EXAMPLE_MQTT_SERVER_HOST));
        err = netconn_gethostbyname(EXAMPLE_MQTT_SERVER_HOST, &mqtt_addr);
        configPRINTF(("Resolving status: %d.\r\n", err));
    }

    if (err == ERR_OK)
    {
    	 configPRINTF(("connect to mqtt\r\n"));
        /* Start connecting to MQTT broker from tcpip_thread */
        err = tcpip_callback(connect_to_mqtt, NULL);
        configPRINTF(("connect status: %d.\r\n", err));
        if (err != ERR_OK)
        {
        	configPRINTF(("Failed to invoke broker connection on the tcpip_thread: %d.\r\n", err));
        }
    }
    else
    {
    	configPRINTF(("Failed to obtain IP address: %d.\r\n", err));
    }

    int i=0;
    /* Publish some messages */
    for (i = 0; i < 5;)
    {
    	configPRINTF(("connect status enter: %d.\r\n", connected));
        if (connected)
        {
            err = tcpip_callback(publish_message_start, NULL);
            if (err != ERR_OK)
            {
            	configPRINTF(("Failed to invoke publishing of a message on the tcpip_thread: %d.\r\n", err));
            }
            i++;
        }
        sys_msleep(1000U);
    }
    vTaskDelete(NULL);
}

这里需要注意下代码的发布消息,发布内容不能直接给成json格式,比如:

{
  "reported": {
    "LEDstatus": false,
    "humid": 88,
    "temp": 22
  }
}

需要使用https://www.bejson.com/实现json压缩转义:
{“reported” : { “LEDstatus” : true, “humid” : 88, “temp” : 11 } }

4)main函数appTask
在 case kCommandGeneric:下,如果语言是中文,然后添加对应的语音远程识别后控制代码。
“开远程灯“:点本地黄灯,发布远程开灯mqtt消息到百度云端,控制远程1060EVK板上灯开。
“关远程灯“:点本地白灯,发布远程开灯mqtt消息到百度云端,控制远程1060EVK板上灯关。
相关处理代码:

else if (oob_demo_control.ledCmd == LED_REMOTE_ON)
 {
     RGB_LED_SetColor(LED_COLOR_YELLOW);
     vTaskDelay(5000);

     err_t err      = ERR_OK;
     err = tcpip_callback(publish_message_on, NULL);
     if (err != ERR_OK)
     {
     	configPRINTF(("Failed to invoke publishing of a message on the tcpip_thread: %d.\r\n", err));
     }

 }
 else if (oob_demo_control.ledCmd == LED_REMOTE_OFF)
 {
     RGB_LED_SetColor(LED_COLOR_WHITE);
     vTaskDelay(5000);

     err_t err      = ERR_OK;
     err = tcpip_callback(publish_message_off, NULL);
     if (err != ERR_OK)
     {
        configPRINTF(("Failed to invoke publishing of a message on the tcpip_thread: %d.\r\n", err));
      }
 }

3.2 MIMXRT1060-EVK 代码

MIMXRT1060-EVK代码主要功能是配置为云端的另外一个客户端,订阅SLN-LOCAL/2-IOT的远程命令发布的消息,然后控制板上LED,用于测试LOCAL2板子的语音识别后远程控制功能,本代码基于以太网,通过板上以太网口,实现网络通信,然后使用mqtt连接百度云,并且订阅local2的消息,从而实现对Local2命令的接收与执行。
对于网络代码部分和SLN-LOCAL2-IOT板子的网络代码类似,使用的服务器,云端账号密码等都是一样,主要功能是订阅服务器的消息。具体查看附件RT1060的代码,lwip_mqtt_freertos.c文件。
这里需要注意的是,当订阅接收到服务器发布过来的数据时,需要做一个数据解析,从而获得led灯的状态,然后予以控制。
正常从百度云端物影子发过来的数据如下:

Received 253 bytes from the topic "$baidu/iot/shadow/RT1060BTCDShadow/update/accepted": "{"requestId":"2fc0ca29-63c0-4200-843f-e279e0f019d3","reported":{"LEDstatus":false,"humid":44,"temp":33},"desired":{},"lastUpdatedTime":{"reported":{"LEDstatus":1635240225296,"humid":1635240225296,"temp":1635240225296},"desired":{}},"profileVersion":159}"

那么就需要从收到的数据中,解析出LEDstatus的数据是false还是true。
由于数据量不大,这里就没有采用json驱动去解析,而是纯数据方式解析,在mqtt_incoming_data_cb函数中添加如下解析代码:

   mqtt_rec_data.mqttindex = mqtt_rec_data.mqttindex + len;
    if(mqtt_rec_data.mqttindex >= 250)
    {
    	PRINTF("kerry test \r\n");
    	PRINTF("idex= %d", mqtt_rec_data.mqttindex);
        datap = strstr((char*)mqtt_rec_data.mqttrecdata,"LEDstatus");
        if(datap != NULL)
        {
        	if(!strncmp(datap+11,strtrue,4))//char strtrue[]="true";
        	{
        		GPIO_PinWrite(GPIO1, 3, 1U); //pull high
        		PRINTF("\r\ntrue");
        	}
        	else if(!strncmp(datap+11,strfalse,5))//char strfalse[]="false";
        	{
        		GPIO_PinWrite(GPIO1, 3, 0U); //pull low
        		PRINTF("\r\nfalse");
        	}
        }
    	mqtt_rec_data.mqttindex =0;

使用strstr在接收的订阅消息中寻找“LEDstatus“,然后获取位置指针并且偏移固定长度后,去查询LED状态值是true还是false, 如果是true,则开灯;如果是false,则关灯。

四 测试结果

本节给出本系统的测试结果以及视频。在测试语音功能之前,首先使用MQTTfx测试一下百度云的连接,发布,订阅都没有问题,然后再测试sln-local2-iot结合mimxrt1060-evk语音唤醒识别与远程控制的功能。
对于SLN-LOCAL2-IOT的wifi热点加入,在打印终端中输入命令:

setup AWS kerry123456

4.1 MQTT.fx 测试百度云连接

参考之前的文档:
RT云端测试之百度天工物接入构建

4.2 语音识别唤醒并远程控制测试

实物连接照片:
在这里插入图片描述

图 29

4.2.1 语音唤醒识别实现本地控制

在这里插入图片描述

图30
这是SLN-LOCAL2-IOT识别WW和VC之后打印的信息。
红灯开:

red led

灯闪烁:

cycle

4.2.2 语音唤醒识别实现远程控制

下面测试唤醒+远程开,唤醒+远程关,然后给出打印信息。
在这里插入图片描述

图 31

远程控制:

remote control

代码:

https://community.nxp.com/t5/i-MX-RT-Knowledge-Base/RT106L-S-voice-control-system-based-on-the-Baidu-cloud/ta-p/1363295

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

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

相关文章

黑马点评下订单-小程序下单没问题但是Postman发送请求失败了,返回401

经过多方探索&#xff0c;这个✓8错误就是由于黑马点评使用了拦截器&#xff0c;我们直接发送请求是会被拦截器拦截下来的&#xff0c;我给出的解决方案是通过配置Postman解决&#xff0c;方法很简单&#xff01; 解决方案 右边的value写上Redis里面登录所用token值就可以了…

【TB作品】打地鼠游戏,ATMEGA16单片机,Proteus仿真 打地鼠游戏

11个按键LCD1602显示器9个灯蜂鸣器打地鼠小游戏就是九个灯泡&#xff0c;对应九个按键&#xff0c;灯泡有红黄蓝&#xff0c;每间隔一会儿就会亮一个灯&#xff0c;代表地鼠冒出来&#xff0c;按一下按键让灯泡灭掉代表打地鼠&#xff0c;红的三分&#xff0c;黄的两分&#xf…

开发自动发送国际短信的工具需要用到哪些源代码?

在当今数字化、全球化的时代&#xff0c;国际短信作为一种高效、便捷的沟通方式&#xff0c;在各个领域发挥着越来越重要的作用。 开发一款能够自动发送国际短信的工具&#xff0c;不仅能够帮助企业实现精准营销、客户服务&#xff0c;还能为个人提供便捷的跨国交流方式。 本…

手把手教你搭建PyTorch环境:MindStudio中PyTorch模型开发实战

本次实验的视频链接如下&#xff1a;​https://www.bilibili.com/video/BV1iA4y1f7o1/ 本次实验在MindStudio上进行&#xff0c;请先按照 教程 配置环境,安装MindStudio。 ​ MindStudio的是一套基于华为自研昇腾AI处理器开发的AI全栈开发工具平台&#xff0c;该IDE上功能很多…

Leetcode.1735 生成乘积数组的方案数

题目链接 Leetcode.1735 生成乘积数组的方案数 rating : 2500 题目描述 给你一个二维整数数组 q u e r i e s queries queries &#xff0c;其中 q u e r i e s [ i ] [ n i , k i ] queries[i] [n_i, k_i] queries[i][ni​,ki​] 。第 i i i 个查询 q u e r i e s [ i …

AI绘画工具Midjourney:和Discord互相成就

前言 提到文生图&#xff0c;很多人都会想到植根于根植于Discord社区的Midjourney&#xff0c;本篇文章就基于作者的使用体验思考&#xff0c;并结合了Discord来对Midjourney进行探讨&#xff0c;感兴趣的朋友一起来看看吧。 如果要说现在最火的文生图&#xff0c;不得不说到Mi…

深入理解 “androidx.databinding.DataBindingUtil“ 细节和使用

介绍 数据绑定&#xff08;Data Binding&#xff09;是 Android 中的一个强大功能&#xff0c;它允许你使用声明性格式而不是编程方式将布局中的 UI 组件绑定到应用中的数据源。androidx.databinding.DataBindingUtil 类是一个工具类&#xff0c;它提供了用于处理数据绑定的方…

单片机语音识别控制蓝牙通信

基于单片机语音识别控制&蓝牙控制 1、Arduino单片机语音控制1.1 直连1.2 蓝牙无线连接1.3 部分核心程序1.4 实物演示 2、51单片机语音控制2.1 直连2.2 蓝牙无线连接2.3 部分核心程序2.4 实物演示 3、STM32单片机语音控制3.1 直连3.2 蓝牙无线连接3.3 部分核心程序3.4 实物演…

数据结构之“刷链表题”

&#x1f339;个人主页&#x1f339;&#xff1a;喜欢草莓熊的bear &#x1f339;专栏&#x1f339;&#xff1a;数据结构 目录 前言 一、相交链表 题目链接 大致思路 代码实现 二、环形链表1 题目链接 大致思路 代码实现 三、环形链表2 题目链接 大致思路 代码实…

RANSAC空间圆拟合实现

由初中的几何知识我们可以知道&#xff0c;确定一个三角形至少需要三个不共线的点&#xff0c;因此确定一个三角形的外接圆至少可用三个点。我们不妨假设三个点坐标为P1(x1,y1,z1),P2(x2,y2,z2),P3(x3,y3,z3)。 圆方程的标准形式为&#xff1a; (xi-x)2(yi-y)2R2 &#xff08;1…

8605 删数问题

这是一个典型的贪心算法问题。我们可以从高位开始&#xff0c;找到第一个比后面数字大的数字&#xff0c;删除它&#xff0c;然后继续这个过程&#xff0c;直到删除k个数字。如果我们已经删除了k个数字&#xff0c;但是还没有找到一个比后面数字大的数字&#xff0c;那么我们就…

专题六:Spring源码之初始化容器BeanFactory

上一篇咱们通过一个例子介绍初始化容器上下文相关内容&#xff0c;并通过两个示例代码看到了Spring在设计阶段为我预留的扩展点&#xff0c;和我们应该如何利用这两个扩展点在Spring初始化容器上下文阶段为我们提供服务。这一篇咱们接着往下看。 老这样子下回到refresh方法上来…

首款内置电源的迷你主机,不到千元的办公神器 | 零刻EQ13评测报告

零刻首款内置电源的迷你主机&#xff0c;不到千元的办公神器 | 零刻EQ13评测报告 哈喽小伙伴们好&#xff0c;我是Stark-C~ 众所周知&#xff0c;零刻作为目前国产迷你主机第一品牌&#xff0c;旗下系列众多&#xff0c;产线丰富&#xff0c;比如说它有针对游戏玩家的性能主机…

Transformer动画讲解 - 工作原理

Transformer模型在多模态数据处理中扮演着重要角色,其能够高效、准确地处理包含不同类型(如图像、文本、音频、视频等)的多模态数据。 Transformer工作原理四部曲:Embedding(向量化)、Attention(注意力机制)、MLPs(多层感知机)和Unembedding(模型输出)。 阶段一:…

JS数据处理(冒泡寻找对象里面有个Key相同的值并处理相关数据)

1.需要处理成的数据格式 [{ mpptNumber: 1, list:[{checked: false,pvEnableStatus: 0,pvSerialNumber: 1,},{checked: false,pvEnableStatus: 0,pvSerialNumber: 2,}] }, { mpptNumber: 2, list:[{checked: false,pvEnableStatus: 0,pvSerialNumber: 1,},{checked: false,pvE…

Cosine 余弦相似度并行计算的数学原理与Python实现

背景 Cosine 我在LLM与RAG系列课程已经讲了很多次了&#xff0c;这里不在熬述&#xff0c;它在LLM分析中&#xff0c;尤其是在语义相似度的计算中至关重要&#xff0c;在dot attention机制中&#xff0c;也会看到他的身影。这里讲的是纯数学上的运算与python是如何运用相关库进…

Ubuntu机器安装rdkit指定版本,通过conda安装不需要make,有手就行。

阿里云购买Ubuntu 22.0机器 IP没错&#xff0c;访问外网没问题 图片中的命令放在下面了。 useradd test-user -s /bin/bash mkdir /home/test-user chown -R test-user: /home/test-user passwd test-uservi /etc/sudoers wget -c https://repo.anaconda.com/archive/Anacon…

全同态加密在大模型应用中应用

密码学简介 上文的图例基本展示了常见加密体系。加密体系&#xff0c;如果用比较正式的描述方法&#xff0c;无疑是做了三件事&#xff1a; 首先&#xff0c;通过一个生成算法 &#x1d43e;&#x1d452;&#x1d466;&#x1d43a;&#x1d452;&#x1d45b;(1&#x1d70…

小白学习手册:轻松理解MQ消息队列

目录 # 开篇 RabbitMQ介绍 通讯概念 1. 初始MQ及类型 2. MQ的架构 2.1 RabbitMQ的结构和概念 2.2 RabbitMQ消息流示意图 3. MQ下载使用 3.1 Docker下载MQ参考 3.2 进入RabbitMQ # 开篇 MessagesQueue 是一个抽象概念&#xff0c;用于描述消息队列系统的一般特性和功能…

计算机视觉 | 基于 PointNet 网络的飞机零件 3D 点云分割

目录 一、简要介绍二、环境设置2.1 实验配置2.2 必要库安装 三、数据集解析3.1 数据集加载3.2 数据文件夹结构3.3 点云数据可视化3.4 数据获取与预处理3.5 数据集定义 四、模型组网4.1 PointNet 介绍4.2 Paddle模型组网4.3 模型概要 五、模型训练六、模型预测七、总结 Hi&#…