当前位置: 首页 > news >正文

【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==================================================beginRGB_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_CONNECTIONAPP_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 highPRINTF("\r\ntrue");}else if(!strncmp(datap+11,strfalse,5))//char strfalse[]="false";{GPIO_PinWrite(GPIO1, 3, 0U); //pull lowPRINTF("\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

相关文章:

【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 代码…...

国标GB28181视频汇聚平台EasyCVR设备展示数量和显示条数不符的原因排查与解决

国标GB28181/GA/T1400协议/安防综合管理系统EasyCVR视频汇聚平台能在复杂的网络环境中&#xff0c;将前端设备统一集中接入与汇聚管理。智慧安防/视频存储/视频监控/视频汇聚EasyCVR平台可以提供实时远程视频监控、视频录像、录像回放与存储、告警、语音对讲、云台控制、平台级…...

FastAPI教程I

本文参考FastAPI教程https://fastapi.tiangolo.com/zh/tutorial 第一步 import uvicorn from fastapi import FastAPIapp FastAPI()app.get("/") async def root():return {"message": "Hello World"}if __name__ __main__:uvicorn.run(&quo…...

如何在 HTML 中实现响应式设计以适应不同设备的屏幕尺寸?

要在HTML中实现响应式设计以适应不同设备的屏幕尺寸&#xff0c;可以使用CSS媒体查询和流动布局。 以下是实现响应式设计的一些关键步骤&#xff1a; 使用CSS媒体查询&#xff1a;CSS媒体查询允许根据屏幕尺寸和设备特性应用不同的CSS样式。通过在CSS中使用media规则&#xf…...

【基础篇】第1章 Elasticsearch 引言

1.1 Elasticsearch简介 1.1.1 基本概念 Elasticsearch&#xff0c;一个开源的分布式搜索引擎&#xff0c;以其强大的搜索能力和实时数据分析能力&#xff0c;在大数据时代脱颖而出。它基于Apache Lucene库构建&#xff0c;旨在提供高效、可扩展且易于使用的全文检索解决方案。…...

在区块链技术广泛应用的情况下,C 语言如何在区块链的底层开发中发挥更有效的作用,提高性能和安全性?

C语言在区块链底层开发中发挥着重要的作用&#xff0c;可以提高性能和安全性。具体可以从以下几个方面进行优化&#xff1a; 性能优化&#xff1a;C语言是一种高效的编程语言&#xff0c;可以直接访问内存和硬件资源。在区块链底层开发中&#xff0c;使用C语言可以更好地利用底…...

量化投资 日周月报 2024-06-28

文章 深度学习在量化交易中的应用:在BigQuant量化交易平台的文章中,探讨了深度学习在量化交易中,特别是在因子挖掘方面的应用。文章提到,随着传统线性模型的潜力逐渐枯竭,非线性模型逐渐成为量化交易的主要探索方向。深度学习因其对非线性关系的拟合能力,在量化交易中展现…...

基于 Paimon 的袋鼠云实时湖仓入湖实战剖析

在当今数据驱动的时代&#xff0c;企业对数据的实施性能力提出了前所未有的高要求。为了应对这一挑战&#xff0c;构建高效、灵活且可扩展的实时湖仓成为数字化转型的关键。本文将深入探讨袋鼠云数栈如何通过三大核心实践——ChunJun 融合 Flink CDC、MySQL 一键入湖至 Paimon …...

IPython相关了解

一、什么是 IPython&#xff1f; 1.1 简单理解 IPython IPython 是一种增强的 Python 交互式解释器&#xff0c;它可以让你更方便地编写、调试和运行 Python 代码。你可以把它想象成一个比普通 Python 解释器更聪明、功能更丰富的工具&#xff0c;非常适合用来进行数据探索、…...

华为面试题及答案——机器学习(二)

21. 如何评价分类模型的优劣? (1)模型性能指标 准确率(Accuracy): 定义:正确分类的样本数与总样本数之比。适用:当各类样本的数量相对均衡时。精确率(Precision): 定义:预测为正类的样本中实际为正类的比例。适用:当关注假阳性错误的成本较高时(例如垃圾邮件检测…...

PlatformIO开发环境

PlatformIO是一个开源的生态系统&#xff0c;用于构建物联网应用&#xff0c;它支持多种微控制器&#xff08;MCU&#xff09;和硬件开发板&#xff0c;并且与各种IDE集成良好&#xff0c;如VSCode, Atom等&#xff0c;使得跨平台的固件开发变得更加简单和高效。 ### 平台介绍…...

In install.packages(“devtools“, verbose = TRUE) :

错误于curl::curl_download("https://r-lib.github.io/gert/libgit2-1.1.0.x86_64_legacy-linux.tar.gz", : Timeout was reached: [] Connection timed out after 10004 milliseconds 停止执行 Using PKG_CFLAGS Using PKG_LIBS-lgit2 ----------------------------…...

计算机网络 访问控制列表以及NAT

一、理论知识 1. 单臂路由 单臂路由是一种在路由器上配置多个子接口的方法&#xff0c;每个子接口代表不同的 VLAN&#xff0c;用于在一个物理接口上支持多 VLAN 通信。此方法使得不同 VLAN 之间可以通过路由器进行通信。 2. NAT (网络地址转换) NAT 是一种在私有网络和公共…...

使用Oracle IMP导入数据

使用Oracle IMP导入数据 大家好&#xff0c;我是免费搭建查券返利机器人省钱赚佣金就用微赚淘客系统3.0的小编&#xff0c;也是冬天不穿秋裤&#xff0c;天冷也要风度的程序猿&#xff01;今天我们来聊一聊如何使用Oracle的IMP工具来导入数据。 一、什么是Oracle IMP Oracle…...

C++ 100 之 容器插入和删除

vector插入和删除操作 insert(const_iterator pos, int count,ele);//迭代器指向位置pos插入count个元素ele. push_back(ele); //尾部插入元素ele pop_back();//删除最后一个元素 erase(const_iterator start, const_iterator end);//删除迭代器从start到end之间的元素 erase(c…...

提升 Selenium 测试稳定性的秘诀:深入理解等待 API 的使用

目录 为什么需要等待Selenium 等待 API 简介隐式等待显式等待Fluent Wait等待策略的选择示例代码总结 正文 1. 为什么需要等待 在 Web 自动化测试中&#xff0c;等待是一个关键因素。网络应用通常是动态的&#xff0c;页面加载时间、元素的显示时间都可能不同步。直接操作这…...

Python-算法编程100例-滑动窗口(入门级)

题目1&#xff1a;最大连续1的个数&#xff08;简单&#xff09; 给定一个二进制数组 nums &#xff0c; 计算其中最大连续 1 的个数。 解答&#xff1a;前缀和双指针 # 给定一个二进制数组 nums &#xff0c; 计算其中最大连续 1 的个数。 from typing import Listclass So…...

ffmpeg使用mjpeg把yuvj420p编码为jpg图像

version #define LIBAVUTIL_VERSION_MAJOR 58 #define LIBAVUTIL_VERSION_MINOR 12 #define LIBAVUTIL_VERSION_MICRO 100 node 不使用AVOutputFormat code void CFfmpegOps::EncodeYUVJ420pToMJPEG(const char* infile, const char* width_str, const char* height_s…...

龙迅#LT6911GXC支持HDMI2.1转MIPI/4PORT LVDS应用功能,分辨率高达8K30HZ/4K120HZ压缩格式。

1. 描述 该LT6911GXC是一款高性能HD-DVI2.1转MIPI或LVDS芯片&#xff0c;适用于VR/显示应用。 HDCP RX作为HDCP中继器的上游&#xff0c;可以与其他芯片的HDCP TX配合实现中继器功能。 对于 HD-DVI2.1 输入&#xff0c;LT6911GXC可以配置为 3/4 通道。 对于MIPI输出&#xff0c…...

.NET 6.0 Web API项目中实现基于Token的身份验证

本文以一个完整的示例&#xff0c;展示如何在.NET 6.0 Web API项目中实现基于Token的身份验证。这个例子包括了如何创建和验证JWT Token&#xff0c;以及如何在控制器中使用这些Token。 步骤 1: 创建Web API项目 首先&#xff0c;用Visual Studio 2022创建一个基于.NET6.0的 …...

Java常用对象的快速初始化

在Java中&#xff0c;有多种方式来快速初始化各种常用对象&#xff0c;如字符串数组&#xff08;String[]&#xff09;&#xff0c;集合列表&#xff08;List&#xff09;&#xff0c;映射表&#xff08;Map&#xff09;&#xff0c;以及集合&#xff08;Set&#xff09;。不同…...

逻辑回归模型模拟实现:从零开始

引言 逻辑回归是一种用于二分类问题的机器学习算法。尽管它的名字中有“回归”&#xff0c;但它实际上是用于分类的。在本文中&#xff0c;我们将通过模拟数据来演示逻辑回归模型的实现。 逻辑回归简介 逻辑回归通过使用逻辑函数&#xff08;通常是Sigmoid函数&#xff09;将…...

Docker基本使用和认识

目录 基本使用 镜像仓库 镜像操作 Docker 如何实现镜像 1) namespace 2) cgroup 3) LXC Docker常见的网络类型 bridge网络如何实现 基本使用 镜像仓库 镜像仓库登录 1)docker login 后面不指定IP地址&#xff0c;则默认登录到 docker hub 上 退出 2)docker logo…...

Halcon 文本文件操作,形态学

一文件的读写 *******************************************************向文本文件写入字符串内容*************************************************************read_image (Image, fabrik)threshold (Image, Region, 0, 120)area_center (Region, Area, Row, Column)open_…...

【鸿蒙】稍微理解一下Stage模型

鸿蒙的Stage模型是HarmonyOS多端统一的应用开发框架中的一个核心概念&#xff0c;用于描述应用的界面层次结构和组件之间的关系。下面将详细解析Stage模型的主要组成部分和特点&#xff1a; 模型组成&#xff1a; UIAbility组件&#xff1a;这是应用中负责绘制用户界面的组件&a…...

毕业答辩制作PPT【攻略】

毕业答辩制作PPT【攻略】 前言版权毕业答辩制作PPT【攻略】一、WPS AI 15天免费会员二、AI文档生成PPT三、修改完善PPT 最后 前言 2024-06-14 23:43:05 以下内容源自《【攻略】》 仅供学习交流使用 版权 禁止其他平台发布时删除以下此话 本文首次发布于CSDN平台 作者是CSDN…...

深入解析npm install --save-dev:开发依赖管理的艺术

npm&#xff08;Node Package Manager&#xff09;是JavaScript编程语言的包管理器&#xff0c;用于管理项目中的依赖关系。在开发过程中&#xff0c;合理地管理依赖是保证项目可维护性和可扩展性的关键。npm install命令是npm中最常用的命令之一&#xff0c;而--save-dev参数则…...

福布斯 AI 50 榜单中唯一开源向量数据库:Weaviate

本篇文章&#xff0c;聊聊福布斯全球网站前俩月发布的 2023 AI 50 榜单中的唯一一个开源的向量数据库&#xff1a;Weaviate。 它在数据持久化和容错性上表现非常好、支持混合搜索、支持水平扩展&#xff0c;同时又保持了轻量化。官方主打做 AI 时代的原生数据库&#xff0c;减…...

信息学奥赛初赛天天练-38-CSP-J2021阅读程序-约数个数、约数和、埃氏筛法、欧拉筛法筛素数应用

PDF文档公众号回复关键字:20240628 2021 CSP-J 阅读程序3 1阅读程序(判断题1.5分 选择题3分 共计40分 ) 01 #include<stdio.h> 02 using namespace std; 03 04 #define n 100000 05 #define N n1 06 07 int m; 08 int a[N],b[N],c[N],d[N]; 09 int f[N],g[N]; 10 11 …...

第100+13步 ChatGPT学习:R实现决策树分类

基于R 4.2.2版本演示 一、写在前面 有不少大佬问做机器学习分类能不能用R语言&#xff0c;不想学Python咯。 答曰&#xff1a;可&#xff01;用GPT或者Kimi转一下就得了呗。 加上最近也没啥内容写了&#xff0c;就帮各位搬运一下吧。 二、R代码实现决策树分类 &#xff08;…...

Hi3861 OpenHarmony嵌入式应用入门--LiteOS MessageQueue

CMSIS 2.0接口中的消息&#xff08;Message&#xff09;功能主要涉及到实时操作系统&#xff08;RTOS&#xff09;中的线程间通信。在CMSIS 2.0标准中&#xff0c;消息通常是通过消息队列&#xff08;MessageQueue&#xff09;来进行处理的&#xff0c;以实现不同线程之间的信息…...

ffmpeg编码图象时报错Invalid buffer size, packet size * < expected frame_size *

使用ffmpeg将单个yuv文件编码转为jpg或其他图像格式时&#xff0c;报错&#xff1a; Truncating packet of size 11985408 to 3585 [rawvideo 0x1bd5390] Packet corrupt (stream 0, dts 1). image_3264_2448_0.yuv: corrupt input packet in stream 0 [rawvideo 0x1bd7c60…...

解决类重复的问题

1.针对AndroidX 类重复问题 解决办法&#xff1a; android.useAndroidXtrue android.enableJetifiertrue2.引用其他sdk出现类重复的问题解决办法&#xff1a;configurations {all { // You should exclude one of them not both of themexclude group: "com.enmoli"…...

使用 shell 脚本 统计app冷启动耗时

下面是一个 shell 脚本&#xff0c;它使用 参数将包名称作为参数--app&#xff0c;识别相应应用程序进程的 PID&#xff0c;使用 终止该进程adb shell kill&#xff0c;最后使用 重新启动该应用程序adb shell am start&#xff1a; #!/bin/bash# Check if package name is pro…...

使用容器部署redis_设置配置文件映射到本地_设置存储数据映射到本地_并开发java应用_连接redis---分布式云原生部署架构搭建011

可以看到java应用的部署过程,首先我们要准备一个java应用,并且我们,用docker,安装一个redis 首先我们去start.spring.io 去生成一个简单的web项目,然后用idea打开 选择以后下载 放在这里,然后我们去安装redis 在公共仓库中找到redis . 可以看到它里面介绍说把数据放到了/dat…...

第五节:如何使用其他注解方式从IOC中获取bean(自学Spring boot 3.x的第一天)

大家好&#xff0c;我是网创有方&#xff0c;上节我们实践了通过Bean方式声明Bean配置。咱们这节通过Component和ComponentScan方式实现一个同样功能。这节实现的效果是从IOC中加载Bean对象&#xff0c;并且将Bean的属性打印到控制台。 第一步&#xff1a;创建pojo实体类studen…...

Paragon NTFS与Tuxera NTFS有何区别 Mac NTFS 磁盘读写工具选哪个好

macOS系统虽然以稳定、安全系数高等优点著称&#xff0c;但因其封闭性&#xff0c;不能对NTFS格式磁盘写入数据常被人们诟病。优质的解决方案是使用磁盘管理软件Paragon NTFS for Mac&#xff08;点击获取激活码&#xff09;和Tuxera NTFS&#xff08;点击获取激活码&#xff0…...

EtherCAT主站IGH-- 2 -- IGH之coe_emerg_ring.h/c文件解析

EtherCAT主站IGH-- 2 -- IGH之coe_emerg_ring.h/c文件解析 0 预览一 该文件功能coe_emerg_ring.c 文件功能函数预览 二 函数功能介绍coe_emerg_ring.c 中主要函数的作用1. ec_coe_emerg_ring_init2. ec_coe_emerg_ring_clear3. ec_coe_emerg_ring_size4. ec_coe_emerg_ring_pus…...

psensor 的手势功能

psensor 的手势功能的移植过程 有时间再来写下...

使用 nvm 管理 Node 版本及 pnpm 安装

文章目录 GithubWindows 环境Mac/Linux 使用脚本进行安装或更新Mac/Linux 环境变量nvm 常用命令npm 常用命令npm 安装 pnpmNode 历史版本 Github https://github.com/nvm-sh/nvm Windows 环境 https://nvm.uihtm.com/nvm.html Mac/Linux 使用脚本进行安装或更新 curl -o- …...

uni-appx使用form表单页面初始化报错

因为UniFormSubmitEvent的类型时 e-->detail-->value,然后没有了具体值。所以页面初始化的时候 不能直接从value取值&#xff0c;会报错找不到 所以form表单里的数据我们要设置成一个对象来存放 这个问题的关键在于第22行代码 取值&#xff1a; 不能按照点的方式取值 …...

TiDB-从0到1-数据导出导入

TiDB从0到1系列 TiDB-从0到1-体系结构TiDB-从0到1-分布式存储TiDB-从0到1-分布式事务TiDB-从0到1-MVCCTiDB-从0到1-部署篇TiDB-从0到1-配置篇TiDB-从0到1-集群扩缩容 一、数据导出 TiDB中通过Dumpling来实现数据导出&#xff0c;与MySQL中的mysqldump类似&#xff0c;其属于…...

动手学深度学习(Pytorch版)代码实践 -卷积神经网络-16自定义层

16自定义层 import torch import torch.nn.functional as F from torch import nnclass CenteredLayer(nn.Module):def __init__(self):super().__init__()#从其输入中减去均值#X.mean() 计算的是整个张量的均值#希望计算特定维度上的均值&#xff0c;可以传递 dim 参数。#例如…...

树莓派4设置

使用sudo命令时要求输入密码 以 sudo 为前缀的命令以超级用户身份运行。默认情况下&#xff0c;超级用户不需要密码。不过&#xff0c;您可以要求所有以 sudo 运行的命令都输入密码&#xff0c;从而提高 Raspberry Pi 的安全性。 要强制 sudo 要求输入密码&#xff0c;请为你…...

44.商城系统(二十五):k8s基本操作,ingress域名访问,kubeSphere可视化安装

上一章我们已经配置好了k8s集群,如果没有配置好先去照着上面的配。 一、k8s入门操作 1.部署一个tomcat,测试容灾恢复 #在主机器上执行 kubectl create deployment tomcat6 --image=tomcat:6.0.53-jre8#查看k8s中的所有资源 kubectl get all kubectl get all -o wide#查看po…...

MySQL高级查询

MySQL 前言 文本源自微博客 (www.microblog.store),且已获授权. 一. mysql基础知识 1. mysql常用系统命令 启动命令 net start mysql停止命令 net stop mysql登录命令 mysql -h ip -P 端口 -u 用户名 -p ​ 本机可以省略 ip mysql -u 用户名 -p 查看数据库版本 mysql --ve…...

聊聊啥项目适合做自动化测试

作为测试从业者&#xff0c;你是否遇到过这样的场景&#xff0c;某天公司大Boss找你谈话。 老板&#xff1a;小李&#xff0c;最近工作辛苦了 小李&#xff1a;常感谢您的认可&#xff0c;这不仅是对我个人的鼓励&#xff0c;更是对我们整个团队努力的认可。我们的成果离不开每…...

ROS2开发机器人移动

.创建功能包和节点 这里我们设计两个节点 example_interfaces_robot_01&#xff0c;机器人节点&#xff0c;对外提供控制机器人移动服务并发布机器人的状态。 example_interfaces_control_01&#xff0c;控制节点&#xff0c;发送机器人移动请求&#xff0c;订阅机器人状态话题…...

【强化学习】第02期:动态规划方法

笔者近期上了国科大周晓飞老师《强化学习及其应用》课程&#xff0c;计划整理一个强化学习系列笔记。笔记中所引用的内容部分出自周老师的课程PPT。笔记中如有不到之处&#xff0c;敬请批评指正。 文章目录 2.1 动态规划&#xff1a;策略收敛法/策略迭代法2.2 动态规划&#xf…...

安全技术和防火墙(二)

接上一节 备份和还原 iptables-save > /opt/iptables.bak iptables-restore < /opt/iptables.bak snat和dnat snat源地址转换 内网到外网 内网ip转换成可以访问外网的ip 内网的多个主机可以只有一个有效的公网ip地址访问外部网络 dnat 目的地址转发 外部用户&#…...

工程文件参考——ADS1118多从机驱动(base on spi_driver)

文章目录 前言ADS1118驱动实现ads_driver.hspi_driver.c 开发问题 前言 SPI设备如果不挂多机通讯的话真的是太遗憾了 ADS new_ADS_Driver(0, SPIx, GPIOx, GPIO_PIN_x);//完成初始化 value ADS->read(ADS, 0);//读取数据需要先挂这个库 工程文件参考——CubeMXLL库SPI主…...

Python和MATLAB粘性力接触力动态模型半隐式欧拉算法

&#x1f3af;要点 &#x1f3af;运动力模型计算制作过程&#xff1a;&#x1f58a;相机捕捉网球运动图&#xff0c;制定运动数学模型&#xff0c;数值微分运动方程 | &#x1f58a;计算运动&#xff0c;欧拉算法离散积分运动&#xff0c;欧拉-克罗默算法微分运动方程 &#…...

Firewalld 防火墙

1. 概述 在 RHEL7 系统中&#xff0c;firewalld 防火墙取代了传统的 iptables 防火墙。iptables 的防火墙策略是通过内核层面的 netfilter 网络过滤器来处理的&#xff0c;而 firewalld 则是通过内核层面的 nftables 包过滤框架来处理。firewalld 提供了更为丰富的功能和动态更…...

ubuntu 18 虚拟机安装(3)安装mysql

ubuntu 18 虚拟机安装&#xff08;3&#xff09;安装mysql 参考 https://cloud.tencent.com/developer/article/1700780 技术分享 | MySQL 设置管理员密码无法生效一例 https://cloud.tencent.com/developer/article/2014384 在Ubuntu18.04上安装MySQL &#xff5c; 超级详细…...

微服务-网关Gateway

个人对于网关路由的理解&#xff1a; 网关就相当于是一个项目里面的保安&#xff0c;主要作用就是做一个限制项。&#xff08;zuul和gateway两个不同的网关&#xff09; 在路由中进行配置过滤器 过滤器工厂&#xff1a;对请求或响应进行加工 其中filters&#xff1a;过滤器配置…...

51单片机外部中断(按键识别)

欢迎入群共同学习交流 时间记录&#xff1a;2024/7/2 一、电路原理图 51单片机包含INT0、INT1两个外部中断接口 二、知识点介绍 1.中断寄存器位介绍 &#xff08;1&#xff09;TCON定时控制寄存器&#xff0c;位0&#xff08;IT0&#xff09;中断INT0请求信号选择位&#x…...

48、spfa求最短路

spfa求最短路 题目描述 给定一个n个点m条边的有向图&#xff0c;图中可能存在重边和自环&#xff0c; 边权可能为负数。 请你求出1号点到n号点的最短距离&#xff0c;如果无法从1号点走到n号点&#xff0c;则输出impossible。 数据保证不存在负权回路。 输入格式 第一行包…...

一分钟学习数据安全——数字身份的三种模式

微软首席身份架构师金卡梅隆曾说&#xff1a;互联网的构建缺少一个身份层。互联网的构建方式让你无法得知所连接的人和物是什么。这限制了我们对互联网的使用&#xff0c;并让我们面临越来越多的危险。如果我们坐视不管&#xff0c;将面临迅速激增的盗窃和欺诈事件&#xff0c;…...

CF1899C Yarik and Array (最大子段和DP)

Yarik and Array 题面翻译 题目描述 给定一个数组&#xff0c;求数组中连续子数组之和的最大值&#xff0c;但要求子数组必须满足&#xff1a;相邻两项奇偶性不同。 输出最大总和。 输入描述 输入一个整数&#xff0c;第一行一个整数 t t t 代表测试样例的组数&#xff…...

深入理解数仓开发(二)数据技术篇之数据同步

1、数据同步 数据同步我们之前在数仓当中使用了多种工具&#xff0c;比如使用 Flume 将日志文件从服务器采集到 Kafka&#xff0c;再通过 Flume 将 Kafka 中的数据采集到 HDFS。使用 MaxWell 实时监听 MySQL 的 binlog 日志&#xff0c;并将采集到的变更日志&#xff08;json 格…...

24校招总结

个人背景 本科&#xff1a;三本通信专业 硕士&#xff1a;B区双非计算机硕 今年2月签了东南沿海二线城市某公司C游戏服务端开发 我同学大部分都是去电网&#xff0c;大专老师&#xff0c;气象局事业编……就我这个是纯牛马了。 离收到Offer3个月了&#xff0c;前段时间参加…...

闲话 .NET(7):.NET Core 能淘汰 .NET FrameWork 吗?

前言 虽然说&#xff0c;目前 .NET FrameWork 上的大部分类都已经移植到 .NET Core 上&#xff0c;而且 .NET FrameWork 也已经停止了更新&#xff0c;未来必然是 .NET Core 的天下&#xff0c;但要说现在 .NET Core 就能淘汰 .NET FrameWork&#xff0c;我觉得为时尚早&#…...