AI打印机最佳实践
概览
本文主要介绍分别基于sdk及websocket两种接入方式实现AI打印机的核心生图功能。
开发准备
需求场景
-
生成图片
- 文本请求生成图片; 如用户发送文本query: "生成一张小猫的图片"
- 语音请求生成图片: 如用户语音说:“生成一张小猫的图片”
-
定义生成图片的风格、样式
- 支持动态更新生成图片的风格、样式,如生成彩色图、生成适合白纸打印的线条图
- 生成文字图片;
-
生图质量及延时
- 不同的场景,客户可能会对生成图片的质量、延时有要求,有些场景希望生成的图片质量优先、有时考虑延时优先;
- 需兼顾生图质量及延时要求;
方案概述
如下图所示,用户通过文本或语音发起生图请求(如"生成一张小猫的图片"),系统处理流程如下:
- 语音识别(ASR):将语音输入转换为文本
- 意图识别(FunctionCall):解析用户意图,触发生图函数调用
- 图片生成(mediaGenerate Models):调用生图模型生成目标图片
- 媒体传输(MediaTransport):将生成的图片下发至设备
- 语音播报(TTS):可选,播报生图结果
最终输出支持 Jpeg、Base64Jpeg、Url 等多种格式,下发至终端设备完成图片打印。

方案实现
前置条件
- 控制台应用配置勾选文生图;

注:若控制台无此项,可联系百度技术支持进行处理;
SDK 集成方式
SDK 集成方式,媒体流通过UDP方式传输,图片走视频通道,需配置打开视频功能;触发生图后, 图片数据从sdk 指定回调函数传出,图片格式为Jpeg。 可通过参数配置生成的图片分辨率;
- 初始化、打开多模态通道
配置参数描述:

1// 1. 智能体创建config(端或服务端配置)里配置 enable_visual为true;配置服务端开启多模态功能;通过screen_width、screen_height 属性指定生成的图片分辨率;
2#define JSON_CONFIG_TEMPLATE_VISUAL "{\"app_id\": \"%s\", \"config\" : \"{\\\"llm\\\" : \\\"%s\\\", \\\"llm_token\\\" : \\\"no\\\", \\\"enable_visual\\\" : \\\"%s\\\", \\\"screen_width\\\" : \\\"640\\\", \\\"screen_height\\\" : \\\"480\\\", \\\"dfda\\\" : \\\"true\\\",\\\"remote_music_player\\\" : \\\"true\\\", \\\"rtc_ac\\\": \\\"pcmu\\\", \\\"lang\\\" : \\\"%s\\\"}\", \"quick_start\": true}"
3
4void brtc_init(void)
5{
6 BaiduChatAgentEvent events = {
7 .onError = onErrorCallback,
8 .onCallStateChange = onCallStateChangeCallback,
9 .onConnectionStateChange = onConnectionStateChangeCallback,
10 .onUserAsrSubtitle = onUserAsrSubtitleCallback,
11 .onFunctionCall = onFunctionCall,
12 .onMediaSetup = onMediaSetup,
13 .onAIAgentSubtitle = onAIAgentSubtitle,
14 .onAIAgentSpeaking = onAIAgentSpeaking,
15 .onAudioPlayerOp = onAudioPlayerOp,
16 .onAudioData = onAudioData,
17 .onVideoData = onVideoData, // 2.设置视频、图片接收回调, 生成的图片从该接口下发;
18 .onLicenseResult = onLicenseResult,
19 ... ...
20 .onMediaGenerateResult = onMediaGenerateResult, // 3.设置图片生成结果回调
21 };
22
23 AgentEngineParams agentParams;
24 memset(&agentParams, 0, sizeof(agentParams));
25 setUserParameters(&agentParams);
26 // 初始化智能体引擎
27 int result = baidu_chat_agent_engine_init(engine, &agentParams);
28 ...
29 baidu_chat_agent_engine_call(engine);
30}
31
32void setUserParameters(AgentEngineParams *params)
33{
34 strncpy(params->agent_platform_url, g_platform_host, sizeof(params->agent_platform_url) - 1);
35 ... ...
36 params->AudioInChannel = 1;
37 params->AudioInFrequency = 8000;
38 if(g_enable_visual || g_enable_image_generate) {
39 params->enable_video = true; // 3. 多模态场景(生图、视觉)开启视频通道
40 }
41 params->region = region;
42}
- 自定义生图提示词
1// 1. 自定义生图prompt, 可参考这个修改自定义的prompt, 注意转义符号;
2static const char* object_media_generate_prompt =
3 "要求生成精致的黑白简笔画。严格只用纯黑线与纯白背景,无灰度、无填色、无阴影、无高光、无纹理、无噪点。线条要求: \
4 统一且细的单一线宽,干净、连续、锐利;允许在主体内部加入更多**同线宽的细节线条**(例如:发丝、衣褶、须眉、纹饰等)\
5 以增加精致感,但所有细节必须由与轮廓相同的单一线宽构成。构图需简洁、留白充分、主体明确。\\\\n\\\\n";
6
7static char media_generate_prompt_text[4096];
8// 2. 生图、视觉 prompt更新消息格式定义,注意括号内为 \\\ 三斜扛转义;
9static const char g_updata_media_generate_prompt_cmd[] = "%s{\\\"model_type\\\":\\\"%s\\\",\\\"prompt\\\":\\\"%s\\\"}";
10
11void update_media_generate_prompt(char *prompt) {
12 int prompt_len = prompt ? strlen(prompt) : 0;
13 int total_len = prompt_len + strlen(g_updata_media_generate_prompt_cmd) + 64;
14 char *update_prompt_cmd = (char *)custom_malloc_psram(total_len);
15
16 if (update_prompt_cmd) {
17 snprintf(update_prompt_cmd, total_len, g_updata_vision_prompt_cmd,
18 AGENT_EVENT_UPDATE_SYSTEM_PROMPT, "3", prompt);
19 } else {
20 os_printf("update_media_generate_prompt malloc failed\r\n");
21 return;
22 }
23 strncpy(media_generate_prompt_text, update_prompt_cmd, sizeof(media_generate_prompt_text) -1);
24 custom_free_psram(update_prompt_cmd);
25}
26
27void agent_update_prompt(void * text) {
28 baidu_chat_agent_engine_send_event_to_agent(g_engine, (char *)text);
29}
30
31// 3. 更新视觉prompt, 3: 更新生图prompt; 0: 为恢复系统prompt;
32void update_prompt(const char *prompt_mode) {
33 int mode = os_atoi(prompt_mode);
34 os_memset(media_generate_prompt_text, 0, sizeof(media_generate_prompt_text) -1);
35 if (mode == 3) {
36 update_media_generate_prompt(object_vision_prompt);
37 } else if (mode == 0) {
38 // reset media generate prompt
39 update_media_generate_prompt("");
40 }
41
42 os_printf("update prompt text:%s\r\n", media_generate_prompt_text);
43 os_task_create("brtc_task_update_prompt", agent_update_prompt, (void*)media_generate_prompt_text, OS_TASK_PRIORITY_NORMAL, 0, NULL, 16 * 1024);
44}
- 触发生图 配置好FunctionCall后,用户可直接发送文本或语音query,触发图片生成;
- 图片生成 图片生成后,sdk 通过该接口回调图片数据,格式为jpeg; 图片分辨率为在创建智能体config 配置的尺寸,默认 640*480,用户可根据屏幕尺寸适配合适的图片分辨率,过大的分辨率可能异常传输延迟或组帧失败;
1void onVideoData(const uint8_t *data, size_t len, RtcImageType imgtype, int width, int height)
2{
3 BRTC_LOG("FrameReceived video data of length: %d, width: %d, height: %d\n", len, width, height);
4 if (imgtype == RTC_IMAGE_TYPE_JPEG) {
5#ifdef DUMP_VIDEO_FRAME
6 if (len > 0) {
7 char filename[64] = {0};
8 os_sprintf(filename, "0:video_frame_%04d.jpeg", (uint32_t)os_jiffies() % 9999);
9 dumpVideoFrame(filename, data, len);
10 }
11#endif
12 // render to display
13 jpeg_photo_renderer(data, len, 320, 240);
14 }
15}
同时回调生图结果消息,回调接口如下:
1void onMediaGenerateResult(const char* result) {
2 if (result && strlen(result) > 0) {
3 BRTC_LOG("onMediaGenerateResult content: %s\n", result);
4 }
5}
WebSocket 集成方式
WS集成方式,媒体下发走WS数据通道,下发的图片数据为对Jpeg进行Base64编码的数据。不需要单独设置相关智能体配置参数(如需修改图片分辨率除外);
生成图片分辨率在智能体创建config里设置

- 媒体下发通道
通过原websocket数据通道下发生成的图片;
- 自定义生图提示词
发送ws生图prompt更新指令,如:

- 图片生成
触发生图后, 服务端会下发生图结果WS消息, 包含Base64编码的Jpeg图片,用户可以如下WS消息中还原Jpeg图片

生图质量及延时
为满足客户在不同场景对于生图的要求, 云端集成标准、快速、极速三种生图模型:
- 标准版:质量优先, 生图延时10s左右;
- 快速版:兼顾质量与时延, 生图延时5s左右;
- 极速版:时延优生, 生图延时2~3s;
注:目前默认配置为标准版模型,暂未开放用户配置接口,如有需求, 可联系百度技术支持进行切换;
进阶
当前的生图触发为FunctionCall方式, 如用户需要通过说 “生成一张xxx的图片”的query 才能命中生图。如果用户在特定的场景想随意说出一个要生成图片的内容即可实现生图。
可以尝试通过提供的Query增强接口实现,Query增强可以在用户query前面或后面插入一小段补充文字。

如用户说出 “小猫”, 则可以通过Query增强前插 “生成一张图片”, 则送到生模型的query为 "生成一张图片小猫"。
测试验证
以websocket 接入 web 端 demo 为例进行测试:
| 功能 | 测试case | 结果 |
|---|---|---|
| 图片生成 | query:“生成一张小猫的图片” | ![]() |
| 设置分辨率 | 智能体config 指定图片分辨率; cfg={"llm" : "LLMRacing", "llm_token" : "no", "dfda" : "true","rtc_ac": "g722", "lang" : "zh", "screen_width": "800", "screen_height": "480"} | ![]() |
| 更新提示词 | 1,发送生图提示词更新指令; 2,触发生图; | ![]() |
相关产品(必选)
评价此篇文章



