引言
现在在应用中接入各种文本的大模型已经很普遍了,各种API接口接入也很方便。但很多都是文字版的,一直想实现一款类似于豆包或者ChatGpt那样可以像跟人聊天一样的应用,调查下来,火山引擎rtc技术下的实时对话式AI方案符合我的需求。
火山引擎rtc技术下的实时对话式AI方案本质上就是通过RTC开启视频/语音聊天室,然后开启语音识别ASR、在线推理大模型、文字转语音TTS,这样就完成了从文本到语音的升级,可以像豆包那样跟大模型对话了。
因为豆包实时音视频的文档中只提供了实时对话式AI的web端实现源码,而Android端要想实现实时对话式AI,就只能参考web端的代码,把web端的代码迁移到Android端。
官方文档
代码地址
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 = ""
}
代码讲解
整体业务流程图
开启/关闭音视频通话
这部分代码可以参考示例项目,里面给出的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智能体加入到前面创建的房间中。
这部分代码是整个项目耗费我时间最多的,遇到了两个问题:
- 签名。
文档里给出的签名示例是java服务端的,无法直接迁移到Android上。最后只能参考签名源码,按照签名方法里的步骤,对比API Explorer的结果一步步调试。这也是我写这篇文章的原因,这个签名是公共方法,火山引擎大部分服务的API请求都用的到,也可以让后人少走弯路。
具体内容还是直接看我的源码结合官方文档吧。
- 请求参数。
刚开始我是按照请求示例来构建请求参数的,返回结果也是正确的,但是就是无法开启服务。后面我参考了无代码跑通实时对话式AI Demo发送的post请求携带的参数来构建参数,才成功开启。
这里要说的一点就是,火山引擎后台服务未正确开启也会返回正确的结果,这就导致无法排查问题,最终联系了在线客服解决的。
具体内容还是直接看我的源码结合官方文档吧。
在我搞完没几天,1月20号豆包发布了新的语音大模型 豆包实时语音大模型上线即开放!情商智商双高 声称实现了端到端语音对话,不需要语音到文本再到语音的繁琐,后续我也会进行体验试用,并在火山引擎更新API后进行尝试。