Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 10 additions & 0 deletions main/CMakeLists.txt
Original file line number Diff line number Diff line change
Expand Up @@ -521,6 +521,16 @@ elseif(CONFIG_BOARD_TYPE_YUNLIAO_S3)
set(LVGL_TEXT_FONT ${FONT_PUHUI_BASIC_20_4})
set(LVGL_ICON_FONT ${FONT_AWESOME_20_4})
set(DEFAULT_ASSETS ${ASSETS_XIAOZHI_PUHUI_COMMON_20_4_EMOJI_64})
elseif(CONFIG_BOARD_TYPE_ZHENGCHEN_CAM)
set(BOARD_TYPE "zhengchen-cam")
set(LVGL_TEXT_FONT ${FONT_PUHUI_BASIC_20_4})
set(LVGL_ICON_FONT ${FONT_AWESOME_20_4})
set(DEFAULT_ASSETS ${ASSETS_XIAOZHI_PUHUI_COMMON_20_4_EMOJI_64})
elseif(CONFIG_BOARD_TYPE_ZHENGCHEN_CAM_ML307)
set(BOARD_TYPE "zhengchen-cam-ml307")
set(LVGL_TEXT_FONT ${FONT_PUHUI_BASIC_20_4})
set(LVGL_ICON_FONT ${FONT_AWESOME_20_4})
set(DEFAULT_ASSETS ${ASSETS_XIAOZHI_PUHUI_COMMON_20_4_EMOJI_64})
endif()

file(GLOB BOARD_SOURCES
Expand Down
7 changes: 6 additions & 1 deletion main/Kconfig.projbuild
Original file line number Diff line number Diff line change
Expand Up @@ -339,6 +339,11 @@ choice BOARD_TYPE
config BOARD_TYPE_ZHENGCHEN_1_54TFT_ML307
bool "征辰科技1.54(ML307)"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_ZHENGCHEN_CAM
bool "征辰科技AI Camera"
depends on IDF_TARGET_ESP32S3
config BOARD_TYPE_ZHENGCHEN_CAM_ML307
bool "征辰科技AI Camera(ML307)"
config BOARD_TYPE_MINSI_K08_DUAL
bool "敏思科技K08(DUAL)"
depends on IDF_TARGET_ESP32S3
Expand Down Expand Up @@ -532,7 +537,7 @@ config USE_AUDIO_PROCESSOR
config USE_DEVICE_AEC
bool "Enable Device-Side AEC"
default n
depends on USE_AUDIO_PROCESSOR && (BOARD_TYPE_ESP_BOX_3 || BOARD_TYPE_ESP_BOX || BOARD_TYPE_ESP_BOX_LITE || BOARD_TYPE_LICHUANG_DEV || BOARD_TYPE_ESP32S3_KORVO2_V3 || BOARD_TYPE_ESP32S3_Touch_AMOLED_1_75 || BOARD_TYPE_ESP32S3_Touch_AMOLED_2_06 || BOARD_TYPE_ESP32P4_WIFI6_Touch_LCD_4B || BOARD_TYPE_ESP32P4_WIFI6_Touch_LCD_XC || BOARD_TYPE_ESP_S3_LCD_EV_Board_2 || BOARD_TYPE_YUNLIAO_S3)
depends on USE_AUDIO_PROCESSOR && (BOARD_TYPE_ESP_BOX_3 || BOARD_TYPE_ESP_BOX || BOARD_TYPE_ESP_BOX_LITE || BOARD_TYPE_LICHUANG_DEV || BOARD_TYPE_ESP32S3_KORVO2_V3 || BOARD_TYPE_ESP32S3_Touch_AMOLED_1_75 || BOARD_TYPE_ESP32S3_Touch_AMOLED_2_06 || BOARD_TYPE_ESP32P4_WIFI6_Touch_LCD_4B || BOARD_TYPE_ESP32P4_WIFI6_Touch_LCD_XC || BOARD_TYPE_ESP_S3_LCD_EV_Board_2 || BOARD_TYPE_YUNLIAO_S3 || BOARD_TYPE_ZHENGCHEN_CAM || BOARD_TYPE_ZHENGCHEN_CAM_ML307)
help
因为性能不够,不建议和微信聊天界面风格同时开启

Expand Down
50 changes: 50 additions & 0 deletions main/boards/zhengchen-cam-ml307/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
# 产品相关介绍网址
# 征辰科技 AI camera + 4G

## 简介
征辰科技 AI camera是小智AI的魔改项目,做了大量创新和优化。

## 合并版
合并版代码在小智AI主项目中维护,跟随主项目的一起版本更新,便于用户自行扩展和第三方固件扩展。支持语音唤醒、语音打断、OTA等功能。

## 魔改版
魔改版由于底层改动太大,代码单独维护,定期合并主项目代码。

https://e.tb.cn/h.6Gl2LC7rsrswQZp?tk=qFuaV9hzh0k CZ356
```
【淘宝】 「小智AI带摄像头支持识物双麦克风打断 ESP32S3N16R8开发板表情包」
https://e.tb.cn/h.hBc8Gcx9cUluJJO?tk=YW5C4LPixKg



## 配置、编译命令

由于此项目需要配置较多的 sdkconfig 选项,推荐使用编译脚本编译。

**编译**

```bash
python ./scripts/release.py zhengchen-cam-ml307
```

如需手动编译,请参考 `zhengchen-cam-ml307/config.json` 修改 menuconfig 对应选项。

**烧录**

```bash
idf.py flash


```

MCP Tool:
self.get_device_status
self.audio_speaker.set_volume
self.screen.set_brightness
self.screen.set_theme
self.gif.set_gif_mode
self.display.set_mode
self.camera.take_photo
self.AEC.set_mode
self.AEC.get_mode
self.res.esp_restart
70 changes: 70 additions & 0 deletions main/boards/zhengchen-cam-ml307/config.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
#ifndef _BOARD_CONFIG_H_
#define _BOARD_CONFIG_H_

#include <driver/gpio.h>

#define AUDIO_INPUT_SAMPLE_RATE 24000
#define AUDIO_OUTPUT_SAMPLE_RATE 24000

#define AUDIO_INPUT_REFERENCE true

#define AUDIO_I2S_GPIO_MCLK GPIO_NUM_38
#define AUDIO_I2S_GPIO_WS GPIO_NUM_13
#define AUDIO_I2S_GPIO_BCLK GPIO_NUM_14
#define AUDIO_I2S_GPIO_DIN GPIO_NUM_12
#define AUDIO_I2S_GPIO_DOUT GPIO_NUM_45

#define AUDIO_CODEC_USE_PCA9557
#define AUDIO_CODEC_I2C_SDA_PIN GPIO_NUM_1
#define AUDIO_CODEC_I2C_SCL_PIN GPIO_NUM_2
#define AUDIO_CODEC_ES8311_ADDR ES8311_CODEC_DEFAULT_ADDR
#define AUDIO_CODEC_ES7210_ADDR 0x82

#define BUILTIN_LED_GPIO GPIO_NUM_48
#define BOOT_BUTTON_GPIO GPIO_NUM_0
#define VOLUME_UP_BUTTON_GPIO GPIO_NUM_3
#define VOLUME_DOWN_BUTTON_GPIO GPIO_NUM_46

#define DISPLAY_WIDTH 320
#define DISPLAY_HEIGHT 240
#define DISPLAY_MIRROR_X true
#define DISPLAY_MIRROR_Y false
#define DISPLAY_SWAP_XY true

#define DISPLAY_WIDTH_1 240
#define DISPLAY_HEIGHT_1 320
#define DISPLAY_MIRROR_X_1 false
#define DISPLAY_MIRROR_Y_1 false
#define DISPLAY_SWAP_XY_1 false

#define DISPLAY_OFFSET_X 0
#define DISPLAY_OFFSET_Y 0

#define DISPLAY_BACKLIGHT_PIN GPIO_NUM_42
#define DISPLAY_BACKLIGHT_OUTPUT_INVERT true


/* Camera pins */
#define CAMERA_PIN_PWDN -1
#define CAMERA_PIN_RESET -1
#define CAMERA_PIN_XCLK 17
#define CAMERA_PIN_SIOD 1
#define CAMERA_PIN_SIOC 2

#define CAMERA_PIN_D7 15
#define CAMERA_PIN_D6 11
#define CAMERA_PIN_D5 9
#define CAMERA_PIN_D4 8
#define CAMERA_PIN_D3 6
#define CAMERA_PIN_D2 5
#define CAMERA_PIN_D1 4
#define CAMERA_PIN_D0 7
#define CAMERA_PIN_VSYNC 21
#define CAMERA_PIN_HREF 18
#define CAMERA_PIN_PCLK 16

#define XCLK_FREQ_HZ 24000000

#define ML307_RX_PIN GPIO_NUM_44
#define ML307_TX_PIN GPIO_NUM_43
#endif // _BOARD_CONFIG_H_
18 changes: 18 additions & 0 deletions main/boards/zhengchen-cam-ml307/config.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,18 @@
{
"target": "esp32s3",
"builds": [
{
"name": "zhengchen-cam-ml307",
"sdkconfig_append": [
"CONFIG_USE_DEVICE_AEC=y",
"CONFIG_LWIP_TCPIP_RECVMBOX_SIZE=48",
"CONFIG_ESP_WIFI_DYNAMIC_RX_BUFFER_NUM=32",
"CONFIG_ESP_WIFI_TASK_PINNED_TO_CORE_0=n",
"CONFIG_ESP_WIFI_TASK_PINNED_TO_CORE_1=y",
"CONFIG_LV_USE_FONT_COMPRESSED=y",
"CONFIG_LV_USE_FONT_PLACEHOLDER=y",
"CONFIG_PARTITION_TABLE_CUSTOM_FILENAME=\"partitions/v2/16m.csv\""
]
}
]
}
94 changes: 94 additions & 0 deletions main/boards/zhengchen-cam-ml307/mcp_controller.cc
Original file line number Diff line number Diff line change
@@ -0,0 +1,94 @@
#include <cJSON.h>
#include <esp_log.h>

#include <cstring>

#include "application.h"
#include "board.h"
#include "config.h"
#include "mcp_server.h"
#include "sdkconfig.h"
#include "settings.h"
#include "display.h"

#define TAG "MCPController"

class MCPController {
public:
MCPController() {
RegisterMcpTools();
ESP_LOGI(TAG, "注册MCP工具");
}

void RegisterMcpTools() {
auto& mcp_server = McpServer::GetInstance();
ESP_LOGI(TAG, "开始注册MCP工具...");

mcp_server.AddTool(
"self.AEC.set_mode",
"设置AEC对话打断模式。当用户意图切换对话打断模式时或者用户觉得ai对话容易被打断时或者用户觉得无法实现对话打断时都使用此工具。\n"
"参数:\n"
" `mode`: 对话打断模式,可选值只有`kAecOff`(关闭)和`kAecOnDeviceSide`(开启)\n"
"返回值:\n"
" 反馈状态信息,不需要确认,立即播报相关数据\n",
PropertyList({
Property("mode", kPropertyTypeString)
}),
[](const PropertyList& properties) -> ReturnValue {
auto mode = properties["mode"].value<std::string>();
auto& app = Application::GetInstance();
vTaskDelay(pdMS_TO_TICKS(2000));
if (mode == "kAecOff") {
app.SetAecMode(kAecOff);
return "{\"success\": true, \"message\": \"AEC对话打断模式已关闭\"}";
}else {
auto& board = Board::GetInstance();
app.SetAecMode(kAecOnDeviceSide);

return "{\"success\": true, \"message\": \"AEC对话打断模式已开启\"}";
}
}
);

mcp_server.AddTool(
"self.AEC.get_mode",
"获取AEC对话打断模式状态。当用户意图获取对话打断模式状态时使用此工具。\n"
"返回值:\n"
" 反馈状态信息,不需要确认,立即播报相关数据\n",
PropertyList(),
[](const PropertyList&) -> ReturnValue {
auto& app = Application::GetInstance();
const bool is_currently_off = (app.GetAecMode() == kAecOff);
if (is_currently_off) {
return "{\"success\": true, \"message\": \"AEC对话打断模式处于关闭状态\"}";
}else {
return "{\"success\": true, \"message\": \"AEC对话打断模式处于开启状态\"}";
}
}
);

mcp_server.AddTool(
"self.res.esp_restart",
"重启设备。当用户意图重启设备时使用此工具。\n",
PropertyList(),
[](const PropertyList&) -> ReturnValue {
vTaskDelay(pdMS_TO_TICKS(1000));
// Reboot the device
esp_restart();
return true;
}
);

ESP_LOGI(TAG, "MCP工具注册完成");
}

};

static MCPController* g_mcp_controller = nullptr;

void InitializeMCPController() {
if (g_mcp_controller == nullptr) {
g_mcp_controller = new MCPController();
ESP_LOGI(TAG, "注册MCP工具");
}
}
Loading
Loading