如何在端侧SOC 上打通豆包大模型?

电子说

1.4w人已加入

描述

# 前言

该文档介绍Sigmastar Pcupid系列(Comake_pi_D1 SSU9353X SSD235X SSU9222X SSU9383CM)如何对接火山引擎RTC服务实现板端音视频AI对话和视觉推理,这里主要介绍测试环境的搭建,Demo Code跟着SDK释放,如客户有需要可以联系对应支持的FAE兄弟获取。


 

Comake Pi D1的客户可以通过https://www.comake.online/index.php?p=down_list&lanmu=4&c_id=15&id=59 "GUI 开发Demo" 栏位下载flythings_gui_demo,火山引擎交互对应的代码路径为 “zkgui_demo/zk_mini/jni/logic/volc”。


 

# 准备条件


 

## 硬件环境搭建

完整的Comake PI D1开发板(可以在社区商店购买 https://www.comake.online/index.php?p=shop),包含摄像头,模拟麦克风,喇叭,并准备能访问外网的网络环境。


 

## 软件环境搭建

Comake PI D1 32Bit 软件默认有集成火山引擎Demo,但是没有提供对应的火山账号,需要开发者参考如下步骤去开通自己的账号,火山有提供一定额度的免费体验token。 否则运行火山引擎会提示不存在如下配置文件/customer/zkgui_mini/resource/sample/config.json [空的config.json下载路径](https://dev-comake-1251124109.cos.ap-guangzhou.myqcloud.com/file/1755226688840272/config.json)。 


 

### 火山引擎云服务开通


 

火山引擎的实时音视频RTC功能,需要依赖语音识别(ASR)、语音合成(TTS)、大语言模型(LLM),我们先创建自己的火山引擎账号,并开通对应的服务。


 

### 开通RTC服务并创建应用ID

参考 https://www.volcengine.com/docs/6348/69865 开通实时音视频服务(RTC),并创建RTC 应用,**获取 App_ID、APP_KEY并保留**,后面需要将此信息填入通讯配置config.json对应的栏位,这两个分别是应用标识符和对应的密钥,需要妥善保管以防泄漏。



 

```

  "RTC_APP_ID": "XXXXXXXXXXXX",

  "RTC_APP_KEY": "XXXXXXXXXX",

```



 

### 开通语音识别(ASR)、语音合成(TTS)、大语言模型(LLM)服务

参考 https://www.volcengine.com/docs/6348/1315561 开通 ASR、LLM、TTS 服务。

需要注意的最后需要为账号配置策略,不然会出现板端收不到智能体回复数据的情况。


 

#### **开通语音识别、语音合成服务**

根据场景需求,开通ASR和TTS服务(ASR和TTS服务存在一些可选配置,不同的配置价格不同) https://console.volcengine.com/speech/app 。

**记录TTS_AST_APP_ID和TTS_TOKEN_ID填入config.json**



 

```

 "ASR_APP_ID": "67790xxxxx",


 

  "TTS_APP_ID": "67790xxxxx",


 

  "TTS_TOKEN_ID": "OKly6Lr3XFFIw3xxxxx",

```

另外需要注意代码里TTS的配置和应用配置的权限要对上,例如如果应用没有开通音频生成大模型,代码就不能配置"Provider"为 "volcano_bidirection" ,只能配置为volcano,也不能传递tts_token, 不然音频传生成功能会异常,进入房间听不到欢迎语,demo代码默认使用的音频生成和语音识别,没有使用大模型。


 

下图是具体的示意图:

![大模型.png](https://dev-comake-1251124109.cos.ap-guangzhou.myqcloud.com/img/175548383528347111474.png)



 

#### **开通大语言模型服务**

根据场景需要,开通需要的LLM服务(不同的LLM大模型价格不同,我们演示使用的是Doubao-1.5-vision-pro-32k) 通过https://console.volcengine.com/ark/region:ark+cn-beijing/endpoint 创建应用,并记录应用ID号,**填入config.json "LLM_END_POINT_ID": "ep-xxxxxx",**

这步如果没有正常开通,demo也会遇到没有欢迎语的提示


 

下图是具体开通步骤的示意图:

![llm服务开通.jpg](https://dev-comake-1251124109.cos.ap-guangzhou.myqcloud.com/img/175013199879164911474.jpg)


 

#### **配置不同权限账号调用智能体**

开通完服务后,还需要为角色配置策略,打开https://console.volcengine.com/rtc/aigc/iam, 前往**跨服务授权**,点击一键开通跨服务授权配置角色。

![授权服务开通.png](https://dev-comake-1251124109.cos.ap-guangzhou.myqcloud.com/img/175548288134770111474.png)


 

配置成功后你可以在https://console.volcengine.com/iam/identitymanage/role 角色管理中找到该角色,该角色拥有SAFullAccess 、 MaaSExperienceAccess 和 RTCFullAccess权限。下图为配置后的示意图:

![image.png](https://dev-comake-1251124109.cos.ap-guangzhou.myqcloud.com/img/175548523878923111474.png)


 

最后在https://console.volcengine.com/iam/keymanage 界面获取ACCESS_KEY


 

```

  "ACCESS_KEY": "XXXX",

  "SECRET_ACCESS_KEY": "XXX==", 填入config.json

```



 

![image.png](https://dev-comake-1251124109.cos.ap-guangzhou.myqcloud.com/img/175013287100600311474.png)


 

#### **如果是使用子账号,在板端调用权限有所同,注意参考https://www.volcengine.com/docs/6348/1315561设定**

![image.png](https://dev-comake-1251124109.cos.ap-guangzhou.myqcloud.com/img/175548507506980611474.png)


 

### **依赖库移植**

该AI demo 开启智能体使用的是API方式,因而需要通过网络发送http post数据包,需要为板端移植相关的库,访问网络时使用到的库有:openssl、cares、curl。此外,由于火山引擎RTC服务的音频不支持pcm格式,目前仅支持opus,g722,aac,g711a格式,根据实际需求移植相关的音频编解码库,本AI demo使用的是opus。

注意需要使用对应的Toolchain 编译对应的Lib库,libVolcEngineRTCLite.so 需要联系火山引擎软件人员并提供Toolchain,其他依赖库可以使用BuildRoot 环境进行更新。 目前Demo只支持glibc 12.4.0 arm32Bit的开发环境。


 

### 配置文件准备

板端运行该AI demo需要输入一个配置文件config.json,前面篇章有介绍到的字段均需要写入此配置文件中。


 

配置好后推送到主板/customer/zkgui_mini/resource/sample/config.json 即可使用火山引擎Demo。


 

该配置文件包含了火山引擎服务的Key和Id信息,文件中的各字段所表示的意义可以参考开启智能体API( https://www.volcengine.com/docs/6348/1558163 )时所使用的参数。


 

```

config.json

{

  "RTC_APP_ID": "xxx",

  "RTC_APP_KEY": "xxx",

  "ACCESS_KEY": "xxx",

  "SECRET_ACCESS_KEY": "xxx",

  "ROOM_ID": "xxx",

  "USER_ID": "xxx",

  "AGENT_USER_ID": "xxx",

  "TASK_ID": "xxx",

  "TOKEN_VALUE": "xxx",

  "ASR_APP_ID": "xxx",

  "TTS_APP_ID": "xxx",

  "TTS_TOKEN_ID": "xxx",

  "LLM_END_POINT_ID": "xxx",

  "SERVER_MESSAGE_URL": "xxx",

  "SERVER_MESSAGE_SIGNATURE": "xxx"

}

```



 

其中如下4项"ROOM_ID"  "USER_ID":  "AGENT_USER_ID"  "TASK_ID": "task1",为房间信息用户填写,而  "TOKEN_VALUE" 目前是根据上述信息自动生产。


 

如下两项可以保持默认值不变


 

  "SERVER_MESSAGE_URL": "https://pm.comake.online/doubao_debug.log?type=subv",


 

  "SERVER_MESSAGE_SIGNATURE": "892495980b78182f2fbab8e317e607a1bd6f1111c0b43a6ebb37337a6971c2bb"


 

# demo介绍


 

## demo流程说明

该AI demo实现了AI对话以及视频图像推理的功能。用户通过关键词唤醒设备后,将语音输入(opus)和图像输入(h264)通过火山引擎的RTC SDK传输到火山引擎的云服务,通过火山引擎的RTC SDK回调接收智能体的语音回复,解码后进行播放。从而实现AI式对话和视觉推理的功能。如下所示为该AI demo的框图:

![demo框图.jpg](https://dev-comake-1251124109.cos.ap-guangzhou.myqcloud.com/img/175013356567623011474.jpg)


 

**VIF**接收**Sensor**的数据,送到**ISP****SCL**进行图像处理和图像的缩小,将处理后的图像送到**SW VENC**进行软件编码得到h264码流数据,当Audio往火山传输数据时,同时发生Video H264 I帧数据。


 

**AI(Audio Input)**接收**Mic**的输出,经过**AEC**回声消除处理、**APC**降噪处理、**VAD**语音检测、**KWS**关键词检测,将语音输入编码成opus格式。


 

通过火山引擎RTC的接口,将编码后的语音和视频数据发送到火山引擎云端进行分析,等待火山引擎云端回复分析结果,将回复的语音数据进行opus解码后通过**AO**输出到**Speaker**


 

## demo使用说明


 

### demo使用流程

### 网络环境

```

    该demo需要访问外部网络,连接外网

    Demo软件可以通过如下命令设定Mac地址通过DHCP获取IP地址:

        ifconfig eth0 hw ether 00:71:30:1B:xx:xx

        ifconfig eth0 up

        udhcpc -i eth0 -s /etc/init.d/udhcpc.script

    获取IP后 确认ping 豆包官网 access.rtc.volcvideo.com是否成功

```



 

### demo运行

Comake Pi D1 32Bit 软件默认有集成此Demo, UI点击"火山引擎"即可打开。 


 

### 查看加入房间打印以及欢迎语

demo成功跑起来后会收到RTC加入房间的回调打印以及听到智能体的欢迎语(你好,我是小星,我是你的好朋友,可以陪你谈天说地!),如下所示:

![加入房间打印.jpg](https://dev-comake-1251124109.cos.ap-guangzhou.myqcloud.com/img/175014166773131311474.jpg)


 

上图中红框部分就是RTC加入房间的回调打印以及智能体的欢迎语回复信息打印,看到这些信息基本可以说明智能体已经正常开始工作了。


 

### 查看关键词打印

当听到智能体的欢迎语后就可以开始对话了,对话前,请先说关键词:"你好,小星"。当板端检测到关键词后,会有这个打印后,此时可以开始询问问题:

![image.png](https://dev-comake-1251124109.cos.ap-guangzhou.myqcloud.com/img/175014177427726911474.png)

超过60s 没有检测到实时语音就需要再次通过关键词触发。



 

### 查看发送音频/视频数据打印

demo发送一帧音频或一帧h264时,会出现如下类似打印:


 

![image.png](https://dev-comake-1251124109.cos.ap-guangzhou.myqcloud.com/img/175014161922303411474.png)


 

上图中send opus encode是发送的一帧音频数据的打印;send video frame是发送的一帧h264的打印。


 

#### 查看智能体回复打印

不管发送视频还是音频数据,只要智能体有回复数据时,就可以看到如下图所示打印:

![智能体回复打印.jpg](https://dev-comake-1251124109.cos.ap-guangzhou.myqcloud.com/img/175014194552178911474.jpg)


 

#### 实例演示

![实例演示.jpg](https://dev-comake-1251124109.cos.ap-guangzhou.myqcloud.com/img/175014196977447911474.jpg)


 

## 火山引擎相关开发说明


 

### RTC SDK接口调用顺序

首先是进行RTC的初始化,user和agent加入房间。当APP收到回调函数后,就可以通过byte_rtc_send_audio_data以及byte_rtc_send_video_data接口发送音频和视频数据给大模型。经过大模型分析后,会通过回调函数将回复数据给到APP。当用户离开房间后,就可以关闭房间,但需要等待RTC的回调函数通知才可以销毁房间。


 

需要注意的是,demo中使用的是opus编码格式,火山引擎还支持G722、AAC、G711格式,APP发送什么格式的音频数据,火山引擎就会回复什么格式的音频数据。应用场景需要什么编码格式可自行移植相关编解码库进行对接,并通过byte_rtc_set_audio_codec接口告知RTC传输的是什么编码格式,该接口需要在byte_rtc_init之后,byte_rtc_join_room之前调用。

![RTC交互时序.jpg](https://dev-comake-1251124109.cos.ap-guangzhou.myqcloud.com/img/175014198809268011474.jpg)


 

### Toke鉴权

用户在加入房间时(调用byte_rtc_join_room接口),需要传入Token参数。在volc_agent.cpp文件中,实现了根据AppID、AppKey、RoomID、UserID、时间戳等参数实时生成Token的程序,而该部分对应的具体生成过程可以参考火山引擎官方文档:https://www.volcengine.com/docs/6348/70121 。


 

### API签名验证

在调用Open API时,需要对API进行签名以便火山引擎能够进行身份验证。在volc_agent.cpp文件中,实现了通过curl库调用StartVoiceChat等API的程序,而该部分对应的具体签名过程可以参考火山引擎官方文档:https://www.volcengine.com/docs/6348/69859 。


 

# 问题记录


 

## 出现signature请求过期的打印

调用开启智能体API时需要需要按照一定格式发送http post请求,如果发送请求时出现以下打印:


 

![signature请求过期.jpg](https://dev-comake-1251124109.cos.ap-guangzhou.myqcloud.com/img/175014239674583711474.jpg)


 

出现上图打印说明http post的签名是过期的,这个是因为签名鉴权时需要使用当前时间,板端开机后时间从1970年开始计算,因此,构造的请求就是过期的。

需要确保 Demo运行时ntp相关调用没有异常。


 

## 加入房间没有成功

在智能体加入房间成功后,会有回调打印显示,但是如果串口一直在刷如下打印:

![加入房间没有成功.jpg](https://dev-comake-1251124109.cos.ap-guangzhou.myqcloud.com/img/175014255006587111474.jpg)


 

当遇到这种情况时,说明智能体并没有成功加入房间,大概率是地址解析失败,需要检查网络看看,可以尝试ping access.rtc.volcvideo.com这个域名看看需要多久才可以解析出,如果时间超过了5s(RTC那边握手最多5s),说明网络有问题,建议更换一个网络。


 

## 出现global error打印

在智能体加入房间时,如果长时间都没有加入成功(至少5s),并且会有如下打印:

![global error.jpg](https://dev-comake-1251124109.cos.ap-guangzhou.myqcloud.com/img/175014257123060311474.jpg)


 

当遇到这种情况时,根据豆包的回复是由于网络的原因,这种情况豆包那边会尝试重新连接,一般最后都会成功,因此,这个错误可以暂时不用管。


 

## 智能体没有回复数据

当出现智能体没有欢迎语播报, 或者智能体没有回复数据时,可以按照以下步骤进行确认。


 

### 确认ASR、TTS服务是否开通

demo依赖火山引擎云端的语音识别(ASR)和语音合成(TTS)服务的,请务必开通这两个服务,如下所示:

![大模型.png](https://dev-comake-1251124109.cos.ap-guangzhou.myqcloud.com/img/175548381390999611474.png)


 

### 确认是否为角色配置策略

智能体要想回复,是需要有权限的,请务必在页面https://console.volcengine.com/rtc/aigc/iam 点击一键开通跨服务授权配置角色进行配置策略,授权后https://console.volcengine.com/iam/identitymanage/role 可以看到如下角色权限:


 

![角色管理.PNG](https://dev-comake-1251124109.cos.ap-guangzhou.myqcloud.com/img/175548329044692411474.PNG)


 

### 确认开启智能体时的json参数配置

除了一些必要的服务以及权限外,在调用开启智能体API时还会需要配置智能体的一些属性,SystemMessages 系统提示词,用于输入控制大模型行为方式的指令,定义了模型的角色、行为准则,特定的输出格式等,这个配置很重要。


 

目前,demo中为智能体配置的属性如下所示:


 

![json配置.jpg](https://dev-comake-1251124109.cos.ap-guangzhou.myqcloud.com/img/175014261136009611474.jpg)


 

json中具体每个字段的含义,可以参考该链接中的说明:https://www.volcengine.com/docs/6348/1404673 。一般情况下,智能体没有回复,基本都是这个json配置有问题。


 

## 智能体回复不准确

智能体回复不准确,需要修改智能体的初始化人设. 方法是修改llm_config SystemMessages字段 代码位置:

zk_minijnilogicvolcvolc_agent.cpp 480行,目前人设是一个简单的陪伴机器人。


 

```

    cJSON_AddItemToArray(system_messages, cJSON_CreateString("你是小星,你是用户的好朋友,你是一个具备情感陪伴能力的智能机器人,核心目标是通过表情识别与自然语言交互,为用户提供有温度的情感支持,回复内容不能包含图片相关字眼。

    请遵循以下原则: 角色设定:以朋友身份互动,语气亲切自然,避免机械感(禁用技术术语,多用口语化表达)。

    情感优先:任何回复需优先匹配用户当前表情识别的情绪(如高兴、悲伤、疲惫),再结合对话内容。

    情绪识别标准:微笑、大笑表示高兴,皱眉、流泪表示悲伤,瞪眼、咬牙表示愤怒,瞪眼、张嘴表示惊讶。"));

```



 

## 其它问题

其他问题可以参考火山引擎RTC服务官网中的文档说明 https://www.volcengine.com/docs/6348 。

审核编辑 黄宇

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分