Beken Genie AI
1. 简介
本工程是基于,端对云,云对大模型的设计方案。
支持双屏显示,提供视觉加语音的陪伴体验和情绪价值。
支持端侧打通,各种通用大模型的设计方案,直接对接Open AI、豆包、DeepSeek等。
并且能够有效,利用云的分布式部署,降低网络延迟,提高交互体验。
支持端侧AEC,NS等音频处理算法,支持G711/G722编码格式,支持KWS关键字打断唤醒,支持提示音播放。
包含常用外设的参考设计以及Demo,比如,陀螺仪,NFC,按键,震动马达,Nand Flash,LED灯效,充电管理,DVP camera,双QPSI屏。
1.1 硬件原理图
1.2 规格
- 硬件配置:
SPI LCD X2 (GC9D01)
麦克
喇叭
SD NAND 60MB
NFC (MFRC522)
陀螺仪 (SC7A20H)
充电管理芯片 (ETA3422)
锂电池
DVP (gc2145)
- 软件特性:
AEC
NS
G722 / G711u
唤醒词定制
WIFI Station
BLE
BT PAN

Figure 1. Hardware Development Board
1.3 按键
1.3.1 按键功能说明
开发板下边靠右三个按键,对应丝印S1,S2,S3;右边一个按键K1
- 开关机
1.开机:长按(>=3秒)
S2
开机2.关机:当系统处于开机状态时,长按(>=3秒)
S2
关机- 配网
1.配网:当系统处于开机状态时,长按(>=3秒)
S1
进入等待配网状态- 喇叭音量控制
1.调大音量:单击
S1
按钮调大音量2.调小音量:单击
S3
按钮调小音量- 恢复出厂设置
1.恢复出厂设置:长按
S3
按钮恢复出厂设置- 复位按键K1
1.关机状态复位:单击
K1
按钮,系统从关机状态开机2.开机状态复位:单击
K1
按钮,系统从开机状态硬重启
1.3.2 按键开发说明
- 1.GPIO按键
按键功能配置,参考key_config,开发者在该表中填写对应的IO管脚和按键对应的回调函数事件即可
长按键时长配置参考multi_button.h中的LONG_TICKS宏定义
当前所有的按键事件转到任务中执行,如果按键事件执行程序被阻塞或执行时间过长,会影响按键响应速度
- 2.GPIO按键注意事项
请确认GPIO管脚只供按键使用,否则同一个GPIO管脚功能冲突,会引起按键无效问题
如果开发者开发板与beken_genie开发板不同,请根据开发板硬件设计重新配置GPIO。关于GPIO使用方法,请参考:
1.4 灯效
开发板上边有红绿两个状态指示灯,重要信息红灯闪烁,一般性提示绿灯闪烁,以及特殊性提醒红绿灯交替闪烁。 灯效开发参考代码led_blink.c。
- 绿灯常亮/长灭提示信息
1.开机时,绿灯长亮,等待用户操作或下一个事件开始
2.对话开始,绿灯灭
- 红绿灯交替闪烁提示信息
1.用户配网:用户配网
- 绿灯闪烁提示信息
1.上电联网中:绿灯快闪
2.大模型服务器连接成功:绿灯慢闪
3.对话停止:绿灯慢闪
- 红灯闪烁提示信息
1.配网失败/网络重连失败:红灯快闪
2.WEBRTC连接断开:红灯快闪
3.大模型服务器连接断开:红灯快闪
4.电池电量低于20%:红灯慢闪30秒后自动停止闪烁;如果充电中,则红灯不闪烁
5.无重要提醒事件:当无重要提醒事件时,红灯处于关闭状态
1.5 SD-NAND存储器
1.SD-NAND存放本地资源文件,比如显示屏上的图片资源文件
2.SD-NAND存储器默认使用FAT32文件系统,供应用程序通过VFS接口间接调用FATFS开源程序接口访问文件
3.PC端,通过USB接口,读写访问开发板SD-NAND文件(开发板左边USB接口)
4.请注意PC端删除的文件,不要同时被本地应用程序使用,防止系统异常
1.6 陀螺仪-Gsensor
1.本地Gsensor支持唤醒系统功能,用户可以S形轨迹晃动开发板,将系统唤醒
1.7 充电管理
1.当前开发板使用充电管理芯片型号为 (ETA3422)
2.充电满时,充电口边上的红灯会关闭,绿灯亮;红灯亮表示在充电
3.注意:在充电过程中或者外部电源接入的情况下,系统切换至外部输入电压源进行电压检测,而非使用电池电压,此时用命令获取的电压为外部输入电压。
- 4.充电状态监测取决于GPIO51和GPIO26。
GPIO51负责检测是否为充电状态,GPIO51为高时,存在外部供电输入,反之,则没有。
GPIO26为高时,则表示电池正在充电中。为低时,则表示电池已经充满电。
注意:该功能需要确认硬件上R14电阻是否已经焊接,如无焊接,需额外焊接。
5.使能充电管理功能需配置CONFIG_BAT_MONITOR=y,使能充电管理的测试用例需配置CONFIG_BATTERY_TEST=y。
- 6.配置电池测试命令使能后,可以通过battery命令对电池的信息进行获取。
比如“battery init”可以对电池监控任务进行初始化。
“battery get_battery_info”可以查看电池的基本信息。
“battery get_voltage”可以查看电池当前的电压值。
“battery get_level”可以查看电池当前的电量。
如上命令使用时,需注意是否为外部电源供电情况下,否则检测电压信息为外部供电电压。
具体其他命令,可以只发送“battery”,打印相关命令支持。更进一步信息,可参考cli_battery.c中的定义。
- 7.当电量等于或小于20%时,会发送低电量告警事件。
只有不插电的时候会触发,外部供电或者充电时,不会发送低电量告警。
每次进入低电量状态时,只会发送一次。
此时,另一侧的红灯慢闪30s。
8.充电管理任务在充电时,会打印“Device is charging…”信息。
9.在充满电时,会打印“Battery is full.”信息。
10.尽管电池存在低压保护功能,但建议用户在低电量的时候及时充电,可延长电池的寿命。
11.用户如果使用其他厂家的电池,需要根据具体电池的信息修改电量插值表s_chargeLUT以及iot_battery_open中电池基本信息的内容。
12.在我们的SDK中,我们提供了电流、电压和电量的API函数。目前,电池仅支持电压和电量的检测功能。需要注意的是,电流检测的API接口虽然已保留,但目前尚未实现,因此如果用户的设备支持电流检测,需要自行对电流的API进行实现。
- 13.由于目前硬件仅支持非充电状态下的电量检测,若用户需要充电期间检测电压,硬件上需要进行改造。
仅去除D6二极管和R21电阻即可。
14 按键旁边的USB口既是充电口又是串口。
1.8 唤醒词
Hi Armino
用于唤醒,本地端侧和云端AI互动,同时LCD亮起,展示眼睛动画。响应词为
A Ha
byebye armino
用于关闭,本地端侧和云端AI互动,同时关闭LCD,眼睛动画不再展示。响应词为
Byebye
1.9 马达
1.LDO连接马达的正极,PWM连接马达的负极,通过调节PWM的占空比来控制马达的振动强度。
2.通过长按按键开机时,马达会振动。
3.PWM详细使用例程见cli_pwm.c。
1.10 提示音
1.10.1 提示音功能说明
开发板工作过程中会根据事件播放对应提示音,事件对应的提示音内容如下:
- 蓝牙配网:
1.开始蓝牙配网:
请使用蓝牙配网
2.蓝牙配网:
蓝牙配网失败,请重新配网。
3.蓝牙配网成功:
蓝牙配网成功
- 连网
1.连网中:
网络连接中,请稍后。
2.连网失败:
网络连接失败,请检查网络。
3.连网成功:
网络连接成功
- 唤醒和关闭
1.唤醒:
A Ha
2.关闭:
Byebye
- AI智能体
1.AI智能体连接成功:
AI智能体已连接
2.AI智能体断开连接:
AI智能体已断开
- 设备断连
1.设备断开连接:
设备断开连接
- 电池电量
1.电池低电量:
电池电量低,请充电。
1.10.2 提示音开发指南
源码路径:
<source code>/bk_avdk/components/multimedia/prompt_tone_play/
如下图所示: 提示音开发框架采用模块化的设计方案。主要分为三个模块,提示音播放模块(prompt_tone_play)、提示音读取模块(audio_source)和提示音解码模块(audio_codec).
- 1.提示音播放模块
提示音播放模块是提供给上层用户使用的app模块,负责集成提示音读取模块和提示音解码模块,完成整个提示音播放的配置和控制。
- 2.提示音读取模块
为了可扩展性,根据功能抽象为一个类,再基于该类开发不同功能实例。
目前已经支持从数组读取提示音的实例
audio_array.c
和从vfs文件系统读取提示音的实例audio_vfs.c
,客户有其他需求可以参考其他实例自行适配。默认使用支持vfs文件系统的sd nand存储提示音,可使用宏选择指定的实例。
- 3.提示音解码模块
为了可扩展性,根据功能抽象为一个类,再基于该类开发不同功能实例。
目前已经支持pcm格式解码的实例
pcm_codec.c
和wav格式解码的实例wav_codec.c
,客户有其他需求可以参考其他实例自行适配。默认使用wav格式的提示音,可使用宏选择指定的实例。

Figure 2. Prompt Tone Development Framework
备注
- 提示音文件格式必须满足下述要求:
单声道
16bit位宽
16K采样率
默认提示音文件资源路径:<source code>/projects/beken_genie/main/resource/
2. 开发指南
2.1 模块架构图
- 此AI demo方案和门锁方案类似,设备端和和AI大模型端双向语音通话,同时设备端向AI大模型端单向图传,门锁方案中的对端apk变为了AI Agent机器人。
软件模块架构如下图所示:

Figure 3. software module architecture
方案中,设备端采集mic语音,通过agora sdk将语音数据发送至声网服务器,声网服务器负责和AI Agent大模型的交互,将mic语音发送至AI Agent并获取回复,再将语音回复发送至设备端喇叭播放。
方案中,设备端采集图像,通过agora sdk将每帧图像发送至声网服务器,声网服务器再将图像送至AI Agent大模型进行识别。
2.2 配网及对话时序图

Figure 4. Operation Flow Sequence
2.3 工作状态机

Figure 5. module state diagram
1/2 Green light stays on.
3/4 Green and red lights flash alternately
5/6 Green light flashes quickly.
7 Green light flashes quickly.
8 LCD on, LED off.
9 LCD off
12/13 Red light flashes quickly
2.4 主要配置
打开声网功能库需要在
cpu0
上打开以下配置:
Kconfig
CPU
Format
Value
CONFIG_AGORA_IOT_SDK
CPU0
bool
y
打开Beken配网及agent启动需要在
cpu0
上打开以下配置:
Kconfig
CPU
Format
Value
CONFIG_NETWORK_AUTO_RECONNECT
CPU0
bool
y
2.5 关键代码说明
2.5.1 配网相关代码
配网相关代码主要分布在bk_genie_smart_config.c及boarding_core.c,如下函数客户可选择替换成自己方案,其余均可follow beken方案
1、bk_genie_smart_config_init负责配网相关初始化及开机自动重连判定
int bk_genie_smart_config_init(void)
{
int flag;
event_handler_init();
flag = demo_network_auto_reconnect(); //判断是否保存过配网信息及发起重连
if (flag != 0x71l && flag != 0x73l
#if CONFIG_NET_PAN
&& flag != 0x74l
#endif
) {
bk_genie_prepare_for_smart_config(); //未保存过配网信息,自动进入配网模式
}
return 0;
}
2、bk_genie_prepare_for_smart_config进入配网模式,客户可根据需求更改
void bk_genie_prepare_for_smart_config(void)
{
smart_config_running = true;
app_event_send_msg(APP_EVT_NETWORK_PROVISIONING, 0); //进入配网模式红绿交替闪灯提示
network_provisioning_stop_timeout_check(); //关闭配网超时检测
agora_stop(); //关闭声网设备端服务
demo_erase_network_auto_reconnect_info(); //擦除AP信息
bk_genie_erase_agent_info(); //擦除agent相关信息,若客户使用自己的服务,可以删除这段代码,自己控制
wifi_boarding_adv_start(); //BLE广播,进入配网模式
network_provisioning_start_timeout_check(300); //5min //开启配网超时检测
}
3、bk_genie_message_handle负责和手机app通过BLE交互配网信息,如下代码客户可disable,使用自己的agent方案
static void bk_genie_message_handle(void)
{
……
case DBEVT_START_AGORA_AGENT_START:
{
……
//上传module uid,若客户自行搭建服务器,可以不用这段代码
……
}
break;
case DBEVT_START_AGORA_AGENT_RSP:
{
……
//接收服务器分配的channel name,若客户自行搭建服务器,可以不用这段代码
……
}
break;
……
}
4、bk_genie_sconf_netif_event_cb负责wifi连上后启动agent、保存wifi及agent信息及配网后,agent唤醒,客户需替换成自己方案
5、bk_genie_erase_agent_info、bk_genie_save_agent_info、bk_genie_get_agent_info、bk_genie_wakeup_agent均是beken agent后台维护方案,客户需替换成自己方案
3. 演示说明
3.1 代码下载及编译
代码编译:
make bk7258 PROJECT=beken_genie
在源代码根目录下编译
工程目录位于``<source code>/project/beken_genie``
烧录的二进制文件位于``<source code>/build/beken_genie/bk7258/all-app.bin``
3.2 UI资源格式调整
1、将要使用的avi视频文件通过SDK中的
<bk_aidk源代码路径>/bk_avdk/components/multimedia/tools/aviconvert/bk_avi.7z
转换工具进行格式转换,具体使用方法可参考工具中的readme.txt说明2、将转换后的文件重新放进SD NAND中,并修改为只包含英文或数字的名称
3、修改
<bk_aidk源代码路径>/project/beken_genie/main/av_play/avi_play.c
文件中传入函数AVI_open_input_file("/genie_eye.avi", 1)
的文件名。
3.3 APP注册和下载
3.4 固件烧录和资源文件烧录
1、将要播放的avi视频文件存放到SD NAND中,SD NAND具体使用方法可参考 Nand磁盘使用注意事项
2、将SDK中的
<bk_aidk源代码路径>/project/beken_genie/main/resource/genie_eye.avi
文件存放到SD NAND中3、烧录编译好的all-app.bin文件并上电执行即可。
3.5 操作步骤
3.5.1 Beken App配网方式
3.5.2 重新配网
警告
重新配网之前,需要原来的配网的手机上,把设备移除,然后再重复上述章节的操作。
移除设备方法如下:
4. 调试命令
警告
调试命令章节,阅读须知:
调试命令,仅适合对代码有一定理解的开发人员使用。
如果对代码和流程不熟悉,建议先按照以下演示步骤,熟悉和理解代码后,再酌情考虑。
4.1 命令列表:
Command
Description
agora_test {start|stop appid video_en channel_name}
语音通话+识图
4.2 Start命令
agora_test
必填
命令
start
必填
参数,使能连接RTC Channel
appid
必填
参数,声网的APPID
video_en
必填
- 参数,识图功能开关:
1:
打开
0:
关闭
channel_name
必填
参数,频道名
备注
使用此命令前需要在PC端自行启动AI Agent
1、在声网官网注册,并获取以下参数 Beken声网注册文档
AGORA_APPID
AGORA_RESTFUL_TOKEN
2、根据Agora AI Agent提供的操作手册,启动服务端的AI Agent。
a.目前采用PC端启动Agora AI Agent的方式,POST指令请参考声网提供的使用手册
<bk_aidk源代码路径>/docs/thirdparty/agora_ai_agent
b.也可以参考 Beken AI Agent启动文档
4.2 Stop命令
agora_test
必填
命令
stop
必填
参数,关闭当前RTC Channel连接
5. 问题&回答
Q:应用层没有mic数据上报?
A:目前beken_genie默认支持基于命令词的语音唤醒功能,只有唤醒后才会上报mic采集的数据应用层,应用层再将数据发送给AI进行对话。如果客户不需要语音唤醒功能,可通过宏 CONFIG_AUD_INTF_SUPPORT_AI_DIALOG_FREE
将该功能关闭。