一、项目介绍
家里有一台老电脑,安装了Ubuntu系统。用的不多,塞在桌子底下的角落里。每次需要使用,需要钻到桌子底下去开机,空间很逼仄,操作非常麻烦。借着这次“2026 贸泽电子 M-Design 创意设计大赛”决定制作一个通过语音控制的电脑开机键,来远程语音控制电脑的开机。基本要求有:
1、要安全可靠,不能随意误触发。只能在我需要时开机,其余时间不能随意误触发。
2、通过语音控制,要求识别准确。
3、无需联网,不需要依赖wifi、蓝牙、红外等无线设备,遥控器的管理实在是太麻烦。
二、硬件选择
依照以上需求,再加上大赛规则,这里硬件我选择了 Seeed Studio家的XIAO ESP32S3 Sense。
Seeed Studio XIAO ESP32S3 Sense 采用高集成度的 Xtensa 处理器 ESP32-S3R8 SoC,支持 2.4GHz WiFi 和低功耗蓝牙® BLE 5.0 双模,适用于多种无线应用。它具有锂电池充电管理功能。作为 Seeed Studio XIAO ESP32S3 的高级版本,该电路板配备了一个插入式 OV2640 摄像头传感器,可显示 1600*1200 的全分辨率。它的底座甚至兼容 OV5640,支持高达 2592*1944 的分辨率。电路板还配有数字麦克风,用于语音感应和音频识别。SenseCraft AI 可为XIAO ESP32S3 Sense 提供各种预训练的人工智能(AI)模型和无代码部署。本项目未使用到摄像头,所以摄像头就没有安装。

三、任务选择
本项目主要功能为控制角落里的电脑开机。应该属于 方向一:智能家居。
四、任务实现
本次开发使用ESP-IDF5.5进行开发,选择的编程工具为Vscode。乐鑫官方的ESP-IDF中有提供开源的语音解决方案esp-sr,效果非常不错。

第一步:解决供电问题。 XIAO ESP32S3 Sense是要塞到电脑机箱内部的,计划使用电脑电源供电。PC机在关机后,依然会有5V电源输出,提供给电脑主板使用。

从电脑电源插座中,绿色线的位置接出电源线。通过万用表测量是5V电压,连接给XIAO ESP32S3 Sense做为电源线使用。但是遇到了问题,ESP32S3 始终不能正常工作,上网查询,说电源标准,PC机这路5V电源输出,在关机状态下,应该能输出700ma的电流,但是不知为啥,我这台机器的关机电流就是无法带动ESP32S3工作。最后采用个折中办法,给ESP32S3连接了个锂电池,同时也连接这个PC机的5V电源。让5V电源通过XIAO ESP32S3 Sense给电池充电,同时电池做为主要的供电来源。

第二步:语音唤醒和命令识别。

dependencies:
espressif/esp-sr: ^2.1.0
使用esp-sr组件,在idf_component.yml文件中添加以上内容。XIAO ESP32S3 Sense开发板,带了一颗PDM的硅麦。通过I2S总线,读取这颗麦克风。使用16000的采样率。
static esp_err_t bsp_i2s_init(i2s_port_t i2s_num, uint32_t sample_rate, int channel_format, int bits_per_chan)
{
esp_err_t ret_val = ESP_OK;
#if ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(5, 0, 0)
i2s_chan_config_t chan_cfg = I2S_CHANNEL_DEFAULT_CONFIG(i2s_num, I2S_ROLE_MASTER);
ret_val |= i2s_new_channel(&chan_cfg, NULL, &rx_handle);
i2s_pdm_rx_config_t pdm_rx_cfg = {
.clk_cfg = I2S_PDM_RX_CLK_DEFAULT_CONFIG(s_play_sample_rate),
/* The data bit-width of PDM mode is fixed to 16 */
.slot_cfg = I2S_PDM_RX_SLOT_DEFAULT_CONFIG(I2S_DATA_BIT_WIDTH_16BIT, I2S_SLOT_MODE_MONO),
.gpio_cfg = {
.clk = GPIO_NUM_42,
// Only ESP32-S3 can support 4-line PDM RX
.dins = {
GPIO_NUM_41,
},
.invert_flags = {
.clk_inv = false,
},
},
};
ret_val |= i2s_channel_init_pdm_rx_mode(rx_handle, &pdm_rx_cfg);
ret_val |= i2s_channel_enable(rx_handle);
#else
// i2s_config_t i2s_config = I2S_CONFIG_DEFAULT(16000, I2S_CHANNEL_FMT_ONLY_LEFT, 32);
i2s_config_t i2s_config = I2S_CONFIG_DEFAULT(sample_rate, I2S_CHANNEL_FMT_ONLY_LEFT, bits_per_chan);
i2s_pin_config_t pin_config = {
.bck_io_num = GPIO_I2S_SCLK,
.ws_io_num = GPIO_I2S_LRCK,
.data_out_num = GPIO_I2S_DOUT,
.data_in_num = GPIO_I2S_SDIN,
.mck_io_num = GPIO_I2S_MCLK,
};
ret_val |= i2s_driver_install(i2s_num, &i2s_config, 0, NULL);
ret_val |= i2s_set_pin(i2s_num, &pin_config);
#endif
return ret_val;
}
唤醒词通过配置来进行选择,这里我选择了“喵喵同学”和“小鸭小鸭”。系统唤醒后,就进入命令词识别阶段。

命令词通过拼音方式提供给系统,这里只有一个开机动作,给了三个命令字,都对应开机动作。
esp_mn_commands_add(1, (char *)"da kai dian nao");
esp_mn_commands_add(1, (char *)"qi dong dian nao");
esp_mn_commands_add(1, (char *)"kai ji");
最后一步——开机。PC机的开机还是挺简单的,只需要将主板上PWR拉低电平,并持续一段时间即可触发电脑开机。所以这里的处理逻辑就是当收到唤醒词后,识别命令字——识别成功后,拉低GPIO(与电脑PWR连接)并持续100ms,然后立即退出唤醒模式。即实现了开机动作。
gpio_set_direction(OPENPC_GPIO, GPIO_MODE_OUTPUT);
gpio_set_level(OPENPC_GPIO, 0);
vTaskDelay(100 / portTICK_PERIOD_MS);
gpio_set_level(OPENPC_GPIO, 1);
gpio_set_direction(OPENPC_GPIO, GPIO_MODE_INPUT);
detect_flag=0;
五、效果展示
将机箱上的开机按键连接的杜邦线拆除,更换为自己的杜邦线,连接到ESP32S3上。


从PC机上接出5V电源(绿线,关机后依然有电),通过Type-c接头给ESP32S3供电,同时还连接了一节锂电池供电。

当听到唤醒词时,板载的LED灯开始闪烁,等待命令字的发出。

听到开机命令字,开机。

六、心得体会
感谢贸泽电子、感谢硬禾科技。参加这次大赛,没有自己再去打板子,直接使用了Seeed Studio XIAO ESP32S3 Sense成品开发板。板子很小巧,安装在机箱内部,基本不可见,通过语音控制电脑的开机,语音识别非常准确且灵敏。功能虽然简单,却实实在在的解决了生活中的痛点。