Android端搭建火山引擎实时对话式AI场景

移动开发
前言

引言

现在在应用中接入各种文本的大模型已经很普遍了,各种API接口接入也很方便。但很多都是文字版的,一直想实现一款类似于豆包或者ChatGpt那样可以像跟人聊天一样的应用,调查下来,火山引擎rtc技术下的实时对话式AI方案符合我的需求。

火山引擎rtc技术下的实时对话式AI方案本质上就是通过RTC开启视频/语音聊天室,然后开启语音识别ASR、在线推理大模型、文字转语音TTS,这样就完成了从文本到语音的升级,可以像豆包那样跟大模型对话了。

因为豆包实时音视频的文档中只提供了实时对话式AI的web端实现源码,而Android端要想实现实时对话式AI,就只能参考web端的代码,把web端的代码迁移到Android端。

官方文档

火山引擎的实时对话式 AI场景方案介绍

web端演示地址

代码实现

代码地址

https://github.com/xiaoniu/RealtimeChat

项目采用了MVVM架构,使用了Kotlin、Compose、Retrofit、Hilt等技术栈。

准备工作【必要条件】

实现实时对话式AI需要开通RTCApp、ASR、TTS还有各种权限等,在这里不再赘述。

具体需要开通的服务可以按照官方文档的操作: 开通服务

在完成了前面的步骤后,可以在无代码跑通实时对话式AI Demo链接里,测试服务能否正常开启跑通,如果可以跑通demo,就可以进行Android端的迁移了。

跑通Demo

替换Constants中的配置运行

object Constants {

    // 获取Access Key https://console.volcengine.com/iam/keymanage/
    const val ACCESS_KEY: String = ""
    // 获取Secret Key https://console.volcengine.com/iam/keymanage/
    const val SECRET_KEY: String = ""
    // 获取Rtc App ID https://console.volcengine.com/rtc/listRTC
    const val APP_ID = ""
    // 自定义房间ID
    const val ROOM_ID = "RtcTestRoom01"
    // 自定义User ID
    const val USER_ID = "RtcTestUser02"
    // 获取临时token https://console.volcengine.com/rtc/listRTC
    const val TOKEN =
        "" // 填写临时 token
    // 获取TTS APP ID https://console.volcengine.com/speech/service/8
    const val TTS_APP_ID = ""
    // 获取ASR APP ID https://console.volcengine.com/speech/service/16
    const val ASR_APP_ID = ""
    // 获取大模型 接入点 https://console.volcengine.com/ark/region:ark+cn-beijing/endpoint
    const val LLM_ENDPOINT_ID = ""
}

代码讲解

整体业务流程图

picture.image

开启/关闭音视频通话

这部分代码可以参考示例项目,里面给出的RTC服务代码很完整。

开启

// 开启音频采集
rtcVideo.startAudioCapture()

// 创建并加入房间
rtcRoom = rtcVideo.createRTCRoom(Constants.ROOM_ID)
rtcRoom?.setRTCRoomEventHandler(rtcRoomListener)

val userInfo = UserInfo(Constants.USER_ID, "")
val roomConfig = RTCRoomConfig(
    ChannelProfile.CHANNEL_PROFILE_CHAT_ROOM,
    true, // 自动发布
    true, // 自动订阅音频
    true  // 自动订阅视频
)

rtcRoom?.joinRoom(Constants.TOKEN, userInfo, roomConfig)

关闭

// 停止音频采集
rtcVideo.stopAudioCapture()

// 离开并销毁房间
rtcRoom?.leaveRoom()
rtcRoom?.destroy()
rtcRoom = null

启动智能体

这一步就是通过向豆包发送Post请求,以让一个AI智能体加入到前面创建的房间中。

这部分代码是整个项目耗费我时间最多的,遇到了两个问题:

  1. 签名。

文档里给出的签名示例是java服务端的,无法直接迁移到Android上。最后只能参考签名源码,按照签名方法里的步骤,对比API Explorer的结果一步步调试。这也是我写这篇文章的原因,这个签名是公共方法,火山引擎大部分服务的API请求都用的到,也可以让后人少走弯路。

具体内容还是直接看我的源码结合官方文档吧。

  1. 请求参数。

刚开始我是按照请求示例来构建请求参数的,返回结果也是正确的,但是就是无法开启服务。后面我参考了无代码跑通实时对话式AI Demo发送的post请求携带的参数来构建参数,才成功开启。

这里要说的一点就是,火山引擎后台服务未正确开启也会返回正确的结果,这就导致无法排查问题,最终联系了在线客服解决的。

具体内容还是直接看我的源码结合官方文档吧。

后话

在我搞完没几天,1月20号豆包发布了新的语音大模型 豆包实时语音大模型上线即开放!情商智商双高 声称实现了端到端语音对话,不需要语音到文本再到语音的繁琐,后续我也会进行体验试用,并在火山引擎更新API后进行尝试。

0
0
0
0
相关资源
火山引擎音视频体验白皮书
火山引擎联合AMD发布了音视频体验白皮书,以抖音亿级日活用户实践和大规模场景落地经验,详细解读音视频体验评估指标和模型,分享火山引擎音视频实验室的评测方案和抖音在音视频体验优化上的典型策略、案例,助力企业优化用户体验,促进业务增长。
相关产品
评论
未登录
看完啦,登录分享一下感受吧~
暂无评论