科大讯飞
  1. AI虚拟人技术
科大讯飞
  • iOS SDK接入文档
  • 平台文档
    • 开发者新手指南
      • 平台简介
      • 快速指引
    • 服务协议
      • 讯飞开放平台用户服务协议
      • 讯飞星火认知大模型接口服务协议
      • 开发者应用创建规则
      • 讯飞开放平台隐私政策
      • 开发者用户个人信息保护合规指引
      • 开放平台SDK合规使用说明
      • SDK隐私政策总览
      • SDK合规使用说明总览
      • 科大讯飞儿童隐私保护政策
      • 讯飞开放平台SLA协议
      • 讯飞开放平台订购协议
    • 用户认证须知
      • 用户认证简介
      • 企业实名认证
      • 个人实名认证
      • 初创团队认证
      • 学生认证
      • 公益项目认证
      • 个人升级企业认证
    • 财务
      • 退款规则及退款流程
      • 财务相关说明
    • 账号
      • 账号注销与删除流程
      • 账号与应用说明
    • 会员
      • 会员权益详情
      • 会员时效说明
      • 会员试用版
  • 星火认知大模型
    • SparkDesk
      • SparkDesk使用指南
      • SparkDesk隐私政策
      • SparkDesk用户协议
    • 星火认知大模型
      • 服务说明
      • 通用鉴权URL生成说明
      • Spark Android SDK接入文档
      • Linux SDK接入文档
      • Windows SDK接入文档
      • 讯飞星火认知大模型隐私政策
      • Web 文档
        • 星火认知大模型Web API文档
        • 星火大模型V1.5
        • 星火大模型V2
        • 星火大模型V3
    • 星火知识库
      • 星火知识库 API 文档
        • 星火知识库 API 文档
        • 文档问答
        • 文档上传
        • 文档总结
        • 获取文档总结/概要信息
      • 新版Embedding API文档
    • 图片生成
      • 图片生成 API
    • 图片理解
      • 图片理解 API
    • 大模型定制训练平台
      • 产品使用说明
      • 星火微调服务Web API文档文档
        • 星火微调服务Web API文档文档
        • V1.5版本
        • 微调模型
  • 语音识别
    • 语音唤醒(新版)
    • 语音听写
      • Android SDK 文档
      • iOS SDK 文档
      • Linux SDK 文档
      • Windows SDK 文档
      • Java SDK 文档
      • 音频文件格式说明
      • 语音听写服务说明
      • 语音听写(流式版)SDK隐私政策
      • 语音听写(流式版)SDK合规使用说明
      • HarmonyOS SDK 文档
      • 语音听写自训练平台
      • 语音听写(流式版)WebAPI
    • 语音转写
      • 语音转写服务说明
      • 语音转写 服务协议
      • WebAPI 文档
        • 语音转写 API 文档
        • 文件上传
        • 查询结果
    • 极速语音转写
      • 极速语音转写 API 文档
      • 小文件上传
      • 初始化分块信息
      • 分块上传
      • 分块上传完成
      • 创建任务
      • 查询任务
    • 实时语音转写
      • 实时语音转写服务说明
      • 实时语音转写 API
    • 离线语音听写
      • Android SDK 文档
      • 离线语音听写服务说明
      • 离线语音听写SDK隐私政策
      • 离线语音听写SDK合规使用说明
    • 离线语音听写(新版)
      • Android SDK 文档
      • 离线语音听写隐私政策
    • 语音唤醒
      • Android SDK 文档
      • iOS SDK 文档
      • Linux SDK 文档
      • Windows SDK 文档
      • 语音唤醒服务说明
      • 离线唤醒SDK隐私政策
    • 语音唤醒(新版)
      • Android SDK 文档
      • Linux SDK 文档
      • 语音唤醒隐私政策
    • 离线命令词识别
      • Android SDK 文档
      • iOS SDK 文档
      • Linux SDK 文档
      • Windows SDK 文档
      • 离线命令词识别服务说明
      • 离线命令词识别SDK隐私政策
      • 离线命令词SDK合规使用说明
  • 语音合成
    • 在线语音合成
      • Android SDK 文档
      • iOS SDK 文档
      • Linux SDK 文档
      • Windows SDK 文档
      • Java SDK 文档
      • 服务协议
      • 在线语音合成服务说明
      • 发音人自训练平台使用指南
      • WebAPI
    • 长文本语音合成
      • 长文本语音合成 API 文档
      • 创建任务
      • 查询任务
    • 离线语音合成
      • Android SDK 文档
      • iOS SDK 文档
      • Linux SDK 文档
      • Windows SDK 文档
      • 服务协议
      • 离线语音合成服务说明
    • AI虚拟人技术
      • Web SDK 2.0 接入指南
      • Android-SDK
      • iOS-SDK
      • Web API 文档
        • AI虚拟人技术 API 文档
        • 音频驱动
        • 启动
        • 文本驱动
        • 停止
        • 心跳
  • 语音扩展
    • 语音评测(流式版)
      • 接口说明
      • Android SDK 文档
      • iOS SDK 文档
      • Linux SDK 文档
      • Windows SDK 文档
      • 语音评测SDK隐私政策
      • 语音评测(流式版)API
    • 语音评测suntone
      • 语音评测suntone API
    • 离线变声
      • Android SDK 集成文档
    • 音色转换
      • 音色转换 API
    • 性别年龄识别
      • 性别能力识别 API
    • 声纹识别
      • Web API 文档
      • 声纹识别 API
    • 歌曲识别
      • 歌曲识别 API
    • 歌曲识别 ACRCloud
      • 接口说明
      • 哼唱识别
      • 音乐识别
    • AI 客服中间件
      • 接口说明
      • 获取token
      • 查询配置
      • 直接外呼
      • 创建外呼任务
      • 提交任务数据
      • 启动外呼任务
      • 暂停外呼任务
      • 删除外呼任务
      • 查询任务
      • 结果数据推送
      • 话单推送
      • 录音推送
      • 会话推送
      • 呼入话术上下文动态数据获取
  • 自然语言处理
    • 文本纠错
      • 文本纠错 API
      • 黑白名单上传
    • 公文校队
      • 公文校对 API
    • 文本合规
      • 文本合规 API
      • 新增黑名单词库
      • 根据lib_id添加黑名单词条
      • 根据lib_id查询词条明细
      • 根据lib_id删除词条
      • 根据appid查询账户下所有词库
      • 根据lib_id删除词库
      • 创建白名单库
      • 根据lib_id添加放行词条
      • 根据lib_id查询词条详情
      • 根据lib_id删除词条信息
      • 根据appid查询所有词库列表
      • 根据lib_id删除词库
    • 图片合规
      • 图片合规 API
    • 音频合规
      • 音频合规 API
    • 视频合规
      • 视频合规 API
    • 文本改写
      • 文本改写 API
    • 机器翻译
      • 机器翻译(新) API
    • 机器翻译niutrans
      • 机器翻译niutrans API
    • 同声传译
      • 同声传译 API 
    • 离线分词
      • Android SDK 文档
  • 人脸识别
    • 人脸验证与检索
      • Android SDK 文档
      • iOS SDK 文档
      • 人脸验证与检索SDK隐私政策
      • 人脸验证与检索SDK合规使用说明
    • 人脸对比
      • 人脸比对 API
    • 人脸比对sensetime
      • 人脸比对sensetime API
    • 人脸水印照比对
      • 人脸水印照比对 API
    • 静默活体检测
      • 静默活体检测 API
    • 配合式活体检测
      • 配合式活体检测 API
    • 静默活体检测sensetime
      • 静默活体检测sensetime API
    • 人脸检测和属性分析
      • 人脸检测和属性分析 API
    • 人脸特征分析tuputech
      • 年龄 API
      • 颜值 API
      • 性别 API
      • 表情 API
  • 文字识别
    • 通用文字识别
      • 通用文字识别 API
    • 通用文字识别
      • 通用文字识别 intsig API
    • 手写文字识别
      • 手写文字识别 API
    • 印刷文字识别
      • 印刷文字识别 API
    • 印刷文字识别(多语种)
      • 印刷文字识别(多语种)
    • 印刷文字识别(多语种)intsig
      • 印刷文字识别(多语种)intsig API
    • 图片文档还原
      • 图片文档还原 API 
    • 国内通用票据识别
      • 接口说明
      • 国内通用票据识别 API
    • 离线OCR
      • Android SDK 文档
    • 名片识别 intsig
      • 名片识别 API
    • 身份证识别 intsig
      • 身份证识别 intsig API
    • 银行卡识别 intsig
      • 银行卡识别 API
    • 营业执照识别 intsig
      • 营业执照识别 intsig API
    • 增值税发票识别 intsig
      • 增值税发票识别 intsig API
    • 拍照速算识别
      • 接口说明
      • 拍照速算识别 API
    • 公式识别
      • 接口说明
      • 公式识别 API
    • 指尖文字识别
      • 接口说明
      • 指尖文字识别 API
    • 身份证识别
      • 接口说明
      • 身份证识别 API
    • 增值税发票识别
      • 接口说明
      • 增值税发票识别 API
    • 营业执照识别
      • 接口说明
      • 营业执照识别 API
    • 火车票识别
      • 接口说明
      • 火车票识别 API
    • 出租车发票识别
      • 接口说明
      • 出租车发票识别 API
  • 图像识别
    • 场景识别
      • 场景识别 API
    • 物体识别
      • 物体识别 API
    • 场所识别
      • 场所识别 API 文档
  • 基础服务
    • 云服务器 CVM
      • 云服务器 CVM 产品简介
      • 快速入门
      • 服务协议
  • 解决方案
    • 签到解决方案
      • SaaS操作文档
    • 智能硬件通用方案
      • 智能硬件通用方案说明
      • 麦克风阵列Android SDK
      • 麦克风阵列Linux SDK
      • 双麦阵列设计参考
      • 麦克风阵列录音要求
      • 语音唤醒Android SDK
      • 语音唤醒Linux SDK
      • 离线声纹Android SDK
      • 离线声纹Linux SDK
  • MSC API 文档
    • Android
      • 文件列表
      • SDK初始化
      • 语音识别(Recognizer)
      • 语音合成(Synthesizer)
      • 语音评测(Evaluator)
      • 语音唤醒(Wakeuper)
      • 声纹人脸(Verifier)
      • Android 常量字段值
      • 基础类
    • IOS
      • 文件列表
      • SDK初始化
      • 语音识别(Recognizer)
      • 语音合成(Synthesizer)
      • 语音评测(Evaluator)
      • 语音唤醒(Wakeuper)
      • 声纹人脸(Verifier)
      • 基础类
    • Windows&Linux
      • 文件列表
      • API 文档
    • Java
      • 所有类列表
      • SDK初始化
      • 语音识别(Recognizer)
      • 语音合成(Synthesizer)
      • 常量字段值
      • 基础类
  1. AI虚拟人技术

Android-SDK

一、兼容性说明#

类别兼容范围
系统支持Android 5.0 ~ Android 13 版本,鸿蒙系统未做兼容性验证
机型上市的Android手机和平板、及符合具体能力性能要求的Android系统设备
网络依赖网络
开发环境建议使用Android Studio 进行开发

#二、SDK组成#

将SDK zip包解压缩,得到如下文件:
├── Demo SDK的使用DEMO,DEMO中已经集成了SDK,您可以参考DEMO,集成SDK。集成前,请先测通DEMO,了解调用原理。 ├── ReleaseNote.txt SDK版本日志 ├── libs 使用虚拟人所需要的依赖库 │ └── AIKit.aar AIKit框架库,虚拟人基于AIKit框架开发 │ ├── vms.aar 虚拟人业务接口封装层 │ └── xrtcsdk-4.4.0.aar 虚拟人依赖的音视频库

#三、接口调用流程#

img

#四、快速集成#

#4.1 导入SDK库#

拷贝libs下所有aar到您项目的libs目录下,然后在主工程的build.gradle文件中,增加如下配置:
// 已忽略无关代码
dependencies {
   //虚拟人SDK及依赖库
    api files('libs/AIKit.aar')
    api files('libs/vms.aar')
    //音视频依赖库
    api files('libs/xrtcsdk-4.4.0.aar')
    implementation 'com.squareup.okhttp3:okhttp:3.10.0'
    implementation 'com.squareup.okhttp3:logging-interceptor:3.10.0'
}

#4.2 SDK初始化#

在使用前,需要先获取已授权的应用信息(appId、apiKey、apiSecret),如果没有,请联系项目经理获取。使用SDK时,SDK只需要初始化一次。SDK 初始化示例代码如下:
// 初始化参数构建
BaseLibrary.Params params = BaseLibrary.Params.builder()
                    .appId("$appId")
                    .apiKey("$apiKey")
                    .apiSecret("$apiSecret")
                    .workDir("/sdcard/iflytek/VMS")//SDK工作路径,这里为绝对路径,路径可自行指定,此处仅为示例
                    .build();
//注册授权结果监听
VmsHelper.getInst().registerAuthListener(coreListener);
// 初始化
VmsHelper.getInst().initEntry(MainActivity.this.getApplicationContext(), params);
 
 
//授权结果回调
private CoreListener coreListener = new CoreListener() {
    @Override
    public void onAuthStateChange(final ErrType type, final int code) {
        runOnUiThread(new Runnable() {
            @Override
            public void run() {
                switch (type) {
                    case AUTH:
                        //txt_result.setText("SDK状态:授权结果码" + code);
                        break;
                    case HTTP:
                        //txt_result.setText("SDK状态:HTTP认证结果" + code);
                        break;
                    default:
                        //txt_result.setText("SDK状态:其他错误");
                }
            }
        });
    }
};
参数类型必填说明
apiKeyString是平台创建应用后,生成的唯一应用标识
apiSecretString是平台创建应用后,生成的唯一应用秘钥
appIDString是平台创建应用后,生成的应用ID
workDirString是SDK工作目录,用户可自行指定,但要确保有访问权限
onAuthStateChange 方法说明:
参数类型必填说明
typeErrType是SDK错误类型,0 表示授权错误,1 表示 http 请求错误
codeint是错误码,0 表示正常
首次初始化成功后,再次初始化不会调用该方法。若初始化失败,再次调用初始化,会再次回调此方法。

#** **#

#4.3 注册虚拟人会话状态回调#

虚拟人状态回调 AiResponseListener实,示例代码如下:
 AiResponseListener vmsListener = new AiResponseListener() {
   
    @Override
    public void onResult(String ability, int handleID, List<AiResponse> outputData, Object usrContext) {
        if (null != outputData && outputData.size() > 0) {
 
            Log.i(TAG, "VMS:onResult:handleID:" + handleID + ":" + outputData.size() + ",ability:" + ability);
            for (int i = 0; i < outputData.size(); i++) {
                byte[] bytes = outputData.get(i).getValue();
                if (bytes == null) {
                    continue;
                }
                String key = outputData.get(i).getKey();
                Log.i(TAG, "VMS:onResult内容:" + key + "," + new String(bytes));
                switch (key) {
                    case "session":
                        String session = new String(bytes);  // 会话的session,驱动等接口必须携带该字段,start成功后会回调此字段
                        break;
                    case "res_id": //上传背景的回调
                        resId = new String(bytes);
                        showTip("上传成功!Start后生效。res_id:" + resId);
                        break;
                    case "realtime_status": //用于判断虚拟人播放状态(仅支持ws接口)
                        JSONObject jsonObject = null;
                        try {
                            jsonObject = new JSONObject(new String(bytes));
                            String global_status = jsonObject.optString("vmr_status", "");
                            if (global_status.equals("2")) { //0开始 1继续 2结束
                                showTip("播放完毕");
                            }
                        } catch (JSONException e) {
                            e.printStackTrace();
                        }
                        break;
                }
 
            }
        }
    }
 
    //事件回调
    @Override
    public void onEvent(String ability, int handleID, int event, List<AiResponse> eventData, Object usrContext) {
        Log.i(TAG, "VMS:onEvent:ability:" + ability + ",event:" + event);
        if (ability.equals(VmsHelper.ABILITY_VMS_CTRL) && event == 19) { //追加模式输入间隔超时,需要重置到首帧
            interactiveModeIndex = 0;   //用于追加模式下传首帧还是中间帧
        }
    }
 
    //错误通知
    @Override
    public void onError(String ability, int handleID, int err, String msg, Object usrContext) {
        showTip("错误通知:" + msg);
        Log.e(TAG, "VMS:onError,ability " + ability + " ERROR::" + msg + ",err code:" + err);
        if(ability.equals("vms2d_ping")){   //ping报错
 
        }
        switch (err){
            case 20014:  //打断模式时,打断之前的驱动,会返回此code
                Log.w(TAG, "当前任务被打断,Ability " + ability + " ERROR::" + msg + ",err code:" + err);
            break;
            default:
                showTip("错误通知:" + msg);
                Log.e(TAG, "错误通知,Ability " + ability + " ERROR::" + msg + ",err code:" + err);
            break;
        }
    }
};
//添加虚拟人回调监听
VmsHelper.getInst().registerListener(vmsListener);
onResult:
变量名类型非空说明
abilityString是能力标识ID
handleIDint是会话ID
usrContextObject否用户自定义标识
responseDataList是能力执行结果
onEvent:
变量名类型非空说明
abilityString是能力标识ID
handleIDint是会话ID
eventenum是0=未知;1=开始;2=结束;3=超时;4=进度
usrContextObject否用户自定义标识
eventDataList是事件消息数据
onError:
变量名类型非空说明
abilityString是能力标识ID
handleIDint是会话ID
errint是错误码
msgString否错误描述
usrContextObject否用户自定义标识
目前通过onError返回的错误码有两类,一类是云端错误码,一类是SDK错误码(以18开头),具体错误码信息请参见第六章。
AiResponse对象:
变量名类型非空说明
keyString是输出数据名称
typeenum是输出数据类型,0=音频;1=文本;2=图片;3=视频;5=个性化数据
valuebyte[]否字节数组类型输出数据
varTypeenum是输出数据变量类型,0=字节数组;1=整型;2=实型;3=布尔型
lenint是输出数据长度

#4.4能力调用#

#4.4.1启动虚拟人#

参考代码如下:
  //传入拉流视图
ViewGroup virtualContainer = findViewById(R.id.ll_virtual);
VmsHelper.getInst().setVmsView(virtualContainer);
 
//从配置文件读取参数
AiRequest.Builder in = AiRequest.builder();
in.header().param("uid", mUid);
if (!TextUtils.isEmpty(resId)) {    //背景
    in.param("res_id", resId);
}
 
in.service("vmr");
AvatarB avatarB = avatarCtrlB.getCurrentSelectItem();
in.param("avatar_id", avatarB.getAvatar_id());//形象id  avatarB.getAvatar_id()
if (!TextUtils.isEmpty(resId)) {    //有背景
    in.param("scale", 0.9); //[0.1, 1.0] 主播在背景图像中的大小 (仅在个性化背景中生效)
    in.param("move_h", 0); //[-4096, +4096] 主播平移像素距离 (仅在个性化背景中生效)
    in.param("move_v", 0); //[-4096, +4096] 控制主播在展示画面中的上下移动距离(仅在个性化背景中生效
}else {
    //视频分辨率:宽,高
    //width must be one of [1920 1280 640 360 720 1080]
    //height must be one of [1080 720 360 640 1280 1920]
    in.param("width", 1080).param("height", 1920);
}
//响应数据控制
AiRequest.Builder streamBuilder = AiRequest.builder();
streamBuilder.param("protocol", "xrtc");
if (fps > 0) {
    streamBuilder.param("fps", fps); //视频帧率 13-25
}
if (bitrate > 0) {
    streamBuilder.param("bitrate", bitrate); //视频的码率 800 ~ 2000
}
in.param("stream", streamBuilder);
 
VMSConfig vmsConfig = VMSConfig.builder()
        .videoFillMode(videoFillMode)
        .videoRotation(videoRotation)
        .videoMirrorType(VideoMirrorType.VIDEO_MIRROR_TYPE_DISABLE)
        .videoStreamType(VideoStreamType.VIDEO_STREAM_TYPE_BIG)
        .useWebSocket(isWebSocket)   //是否使用使用ws接口,非实ws接口不支持时返回状态数据 默认使用ws接口
        .interactiveMode(InteractiveMode.valueOf(interactiveMode))  //模式 0 追加模式。1打断模式
        .build();
int ret = VmsHelper.getInst().start(in.build(), vmsConfig);
 
if (ret != 0) {
    showTip("start失败");
}

#4.4.2 输入数据#

输入数据包含音频数据和文本数据两种类型
音频输入参考代码如下:
byte[] byteArray = readStream(filePath);
if (byteArray == null || byteArray.length <= 0) {
    Log.e(TAG, "audioDrive 当前文件大小异常!");
    return;
}
 
int leftAudioBytes = byteArray.length;
int byteWrites = 1024;   //每次输入的字节数
int writeLen = 0;
int index = 0;
 
isAudioRunning = true;
while (leftAudioBytes > 0) {
 
    boolean isLast = false;
    if (leftAudioBytes > byteWrites) {
        writeLen = byteWrites;
    } else {
        isLast = true;
        writeLen = leftAudioBytes;
    }
    leftAudioBytes -= writeLen;
 
    byte[] part = Arrays.copyOfRange(byteArray, index * byteWrites, index * byteWrites + writeLen);
 
    index++;
 
    AiRequest.Builder aiRequest = AiRequest.builder();
    //协议头部,用于描述平台特性的参数
    aiRequest.header()
            .param("uid", mUid)
            .param("session", mSession);
 
    if (checkbox_nit.isChecked()) {   //非打断模式
        //需要实时返回状态数据时传入
        aiRequest.service("vms_dispatch");
        AiRequest.Builder paramBuilder = AiRequest.builder();
        paramBuilder.param("vmr_status", 1);
        paramBuilder.param("vmr_action_status", 1);
        aiRequest.param("realtime_status", paramBuilder);
    }
 
    AiAudio aiAudio = null;
 
    if (index <= 1) {
        aiAudio = AiAudio.get("audio").data(part).begin().valid();  //开始帧
    } else if (isLast || !isAudioRunning) {
        aiAudio = AiAudio.get("audio").data(part).end().valid();     //结束帧
    } else {
        aiAudio = AiAudio.get("audio").data(part).cont().valid();   //中间帧
    }
    aiRequest.payload(aiAudio);//音频
    int ret = VmsHelper.getInst().audioCtrl(aiRequest.build());
 
    if (ret != 0) {
        Log.e(TAG, "audioDrive:start write failed:" + ret);
        return;
    }
    SystemClock.sleep(10);  //防止太快了服务器处理不过来
}
#文本输入参考代码如下:#
AiRequest.Builder aiRequest = AiRequest.builder();
 
       aiRequest.header()
               .param("uid", mUid)
               .param("session", mSession)
               .param("scene", "main_box");
       AiText aiText = null;
       if (checkbox_nit.isChecked()) { //非打断模式
           aiText = AiText.get("text").data(text).end().valid();
       } else {
           aiText = AiText.get("text").data(text).once().valid();
       }
 
       aiRequest.payload(aiText);//文本
       //动作协议
       /**
        * "type":"action" 动作
        * value 动作类型
        * wb 对应文本起始位置
        * we 对应文本结束位置
        */
       String cw = "{\"avatar\":[{\"type\":\"action\",\"value\":\"" + 动作id + "\",\"wb\":0,\"we\":" + text.length() + "}]}";
       AiText aiCtrlW = AiText.get("ctrl_w").data(cw).once().valid();
       aiRequest.payload(aiCtrlW);//动作
       int pitch = 55; //(int) (50 + Math.random() * 100)
       Log.d(TAG, "动作驱动文本:" + cw + "," + pitch);
       //发音人
       aiRequest.service("tts")
               .param("vcn", vcn)
               .param("speed", 48)
               .param("pitch", pitch);
       aiRequest.param("volume", 100);
 
 
       aiRequest.service("vms_dispatch");
       aiRequest.param("interactive_mode", interactiveMode);
       //请求服务端实时返回状态数据
       if (isWebSocket) {
           AiRequest.Builder paramBuilder = AiRequest.builder();
           paramBuilder.param("tts_status", 1);
           paramBuilder.param("vmr_status", 1);
           paramBuilder.param("vmr_action_status", 1);
           aiRequest.param("realtime_status", paramBuilder);
       }
 
       int ret = VmsHelper.getInst().textCtrl(aiRequest.build());
       aiRequest.clear();
       Log.d(TAG, "enterText ret:" + ret);
       if (ret != 0) {
           showTip("输入文本指令失败");
       }

#interactive_mode、vms_dispatch参数说明:#

功能标识功能描述数据类型取值范围必填默认值
interactive_mode打断模式int[0,1] (0 追加模式 1 打断模式)否1 打断模式
realtime_status实时返回状态数据object否
tts_status文本合成状态 0 关闭 1打开int0 - 10
vmr_status渲染引擎文本实时响应状态 0 关闭 1打开int0 - 10
vmr_action_status渲染引擎动作实时响应状态 0 关闭 1打开int0 - 10

#4.4.3 上传背景#

#参考代码如下:#
String base64Str = Base64.encodeToString(readStream(filePath), Base64.DEFAULT);
AiRequest.Builder aiRequest = AiRequest.builder();
aiRequest.header().param("app_id", getString(R.string.appid)).param("uid", mUid).end();
AiText aiText = AiText.get("background_data").data(base64Str).once().valid();
aiRequest.payload(aiText);//文本
 
int code = VmsHelper.getInst().loadData(aiRequest.build());
Log.d(TAG, "uploadBackground:output code is " + code);
if (code != 0) {
    showTip("背景上传失败:" + code);
}

#上传成功后,可在上文注册的 AiResponseListener 回调中获取 res_id ,在 VmsHelper.getInst().start 接口参数中传入,即可显示背景。#

#4.4.4 重置接口#

reset 接口用于中止当前正在进行中的所有驱动任务,回到虚拟形象静默状态
AiRequest.Builder aiRequest = AiRequest.builder();
aiRequest.header()
        .param("uid", mUid)
        .param("session", mSession);
int ret = VmsHelper.getInst().reset(aiRequest.build());
if (ret == 0) {
    isAudioRunning = false;
    interactiveModeIndex = 0; //如为追加模式,下次驱动需要重新从首帧开始
}
Log.d(TAG, "reset:" + ret);

#4.4.5 更新VmsConfig#

VmsHelper.getInst().updateVmsConfig 用于更新start接口传入的VMSConfig参数(全量更新),如切换前正在进行中会话的追加模式/打断模式 


VMSConfig vmsConfig = VMSConfig.builder()
        .useWebSocket(isWebSocket)   //是否使用使用ws接口,非实ws接口不支持时返回状态数据 默认使用ws接口
        .interactiveMode(InteractiveMode.valueOf(interactiveMode))  //模式 0 追加模式。1打断模式 可在会话期间更改
        .build();
VmsHelper.getInst().updateVmsConfig(vmsConfig);

#4.4.6 回调#

通过 AiResponseListener 监听回调,参考 3.4.2 节实现,在onResult 方法中根据获取到的key字段来区分各子能力结果,然后进行客制化处理。

#4.4.7 关闭虚拟人#

当调用start开启会话后,用户可以进行多轮输入,但无论进行多少轮输入,在程序退出前,一定要调用end方法。
//关闭虚拟人``int` `ret = VmsHelper.getInst().end();

#4.5 设置视频流相关监听#

您可以通过VmsHelper.getInst().setXrtcListener 获得来自视频拉流相关的各类事件通知(比如:音视频状态参数、错误码等)、自定义渲染回调等。示例代码如下:
VmsHelper.getInst().setXrtcListener(new VmsHelper.XrtcListener() {
    @Override
    public void onUserVideoAvailable(String userId, boolean available) {
 
    }
 
    @Override
    public void onError(int errCode, String errMsg, Bundle extraInfo) {
 
    }
 
    @Override
    public void onFirstVideoFrame(String userId, int streamType, int width, int height) {
 
    }
 
    @Override
    public void onNetworkQuality(IXRTCCloudDef.IXRTCQuality localQuality, ArrayList<IXRTCCloudDef.IXRTCQuality> remoteQuality) {
 
    }
 
    @Override
    public void onConnectionLost() {
 
    }
 
    @Override
    public void onTryToReconnect() {
 
    }
 
    @Override
    public void onConnectionRecovery() {
 
    }
 
    @Override
    public void onEnterRoom(int result) {
 
    }
 
    @Override
    public void onExitRoom(int reason) {
 
    }
 
    @Override
    public void onRenderVideoFrame(String userId, int streamType, IXRTCCloudDef.IXRTCVideoFrame videoFrame) {
 
    }
});

#4.5.1 自定义视频渲染回调说明#

void onRenderVideoFrame(String userId, int streamType, IXRTCCloudDef.IXRTCVideoFrame frame)
出入参参数说明
INuserId视频源的 userId,该参数可以不用理会
INstreamType视频流类型,例如是摄像头画面还是屏幕分享画面等等
INframe视频帧数据
RETURNvoid无
XRTCVideoFrame说明:
属性类型必填描述
pixelFormatint是视频的像素格式,透明通道视频帧为BGRA格式
bufferTypeint是视频数据结构类型,目前只支持XRTCVideoBufferType_Buffer
databyte[]是视频数据
widthint是视频宽度
heightint是视频高度
timestamplong是视频帧的时间戳,单位毫秒
rotationint是视频像素的顺时针旋转角度
pixelFormat 支持如下格式 IXRTCCloudDef.XRTC_VIDEO_PIXEL_FORMAT_I420、 IXRTCCloudDef.XRTC_VIDEO_PIXEL_FORMAT_BGRA32、 IXRTCCloudDef.XRTC_VIDEO_PIXEL_FORMAT_RGBA、 IXRTCCloudDef.XRTC_VIDEO_PIXEL_FORMAT_BGR24

#4.6 逆初始化SDK#

当不再使用SDK时,需调用逆初始化方法释放资源,示例代码如下:
JLibrary.getInst().unInit();

#五.错误码#

错误码有两张表,一个是SDK错误码,一个是云端错误码。

#5.1 SDK错误码列表#

该错误码字典适用于 AEE SDK 内核 v2.2.3_rc1 及以上版本。
错误码问题分类含义
错误码问题分类含义
18000授权错误本地 license 文件不存在
18001授权错误授权文件内容非法
18002授权错误授权文件解析失败
18003授权错误payload 内容缺失
18004授权错误signature 内容缺失
18005授权错误授权已过期
18006授权错误授权时间错误,设备时间比标准时间慢 30 分钟以上
18007授权错误授权应用不匹配(apiKey、apiSecret)
18008授权错误授权文件激活过期
18009授权错误授权 App 信息指针为空
18010授权错误离线授权激活文件指定平台与设备平台不匹配
18011授权错误离线授权激活文件指定架构与设备 CPU 架构不匹配
18012授权错误离线授权激活文件中包含 license 个数异常
18013授权错误离线授权激活文件中未找到当前设备
18014授权错误离线授权激活文件中设备指纹安全等级非法
18015授权错误硬件授权验证失败
18016授权错误离线授权激活文件内容非法
18017授权错误离线授权激活文件中协议头非法
18018授权错误离线授权激活文件中指纹组成项个数为0
18100资源错误资源鉴权失败
18101资源错误资源格式解析失败
18102资源错误资源(与引擎)不匹配
18103资源错误资源参数不存在(指针为 NULL)
18104资源错误资源路径打开失败
18105资源错误资源加载失败,workDir 内未找到对应资源
18106资源错误资源卸载失败, 卸载的资源未加载过
18200引擎错误引擎鉴权失败
18201引擎错误引擎动态加载失败
18202引擎错误引擎未初始化
18203引擎错误引擎不支持该接口调用
18204引擎错误引擎 craete 函数指针为空
18300SDK错误SDK 不可用
18301SDK错误SDK 没有初始化
18302SDK错误SDK 初始化失败
18303SDK错误SDK 已经初始化
18304SDK错误SDK 不合法参数
18305SDK错误SDK 会话 handle 为空
18306SDK错误SDK 会话未找到
18307SDK错误SDK 会话重复终止
18308SDK错误超时错误
18309SDK错误SDK正在初始化中
18310SDK错误SDK会话重复开启
18400系统错误工作目录无写权限
18401系统错误设备指纹获取失败,设备未知
18402系统错误文件打开失败
18403系统错误内存分配失败
18404系统错误设备指纹比较失败
18500参数错误未找到该参数 key
18501参数错误参数范围溢出,不满足约束条件
18502参数错误SDK 初始化参数为空
18503参数错误SDK 初始化参数中 AppId 为空
18504参数错误SDK 初始化参数中 ApiKey为空
18505参数错误SDK 初始化参数中 ApiSecret 为空
18506参数错误ability 参数为空
18507参数错误input 参数为空
18508参数错误输入数据参数 Key 不存在
18509参数错误必填参数确实
18510参数错误output参数缺失
18520编解码错误不支持的编解码类型
18521编解码错误编解码handle指针为空
18522编解码错误编解码模块条件编译未打开
18600协议错误协议中时间戳字段缺失
18601协议错误协议中未找到该能力 ID
18602协议错误协议中未找到该资源 ID
18603协议错误协议中未找到该引擎 ID
18604协议错误协议中引擎个数为 0
18605协议错误协议未被初始化解析
18606协议错误协议能力接口类型不匹配
18607协议错误预置协议解析失败
18608云端错误能力不存在,appid未授权或授权已过期
18700云端错误通用网络错误
18701云端错误网络不通
18702云端错误网关检查不过
18703云端错误云端响应格式不对
18704云端错误应用未注册
18705云端错误应用 ApiKey & ApiSecret 校验失败
18706云端错误引擎不支持的平台架构
18707云端错误授权已过期
18708云端错误授权数量已满
18709云端错误未找到该 App 绑定的能力
18710云端错误未找到该 App 绑定的能力资源
18711云端错误SDK请求参数云端无法解析
18712云端错误网络请求 404 错误
18713云端错误设备指纹安全等级不匹配
18714云端错误服务端无法查询到api_key,请检查api_key和api_secret信息是否填写正确
18715云端错误未找到该SDK ID
18716云端错误未找到该组合能力集合
18717云端错误SDK组合能力授权不足
18718云端错误无效授权应用签名
18719云端错误应用签名不唯一
18720授权错误能力schema不可用
18721授权错误竞争授权: 未找到能力集模板
18722授权错误竞争授权: 能力不在模板能力集模板中
18801在线能力错误连接建立出错
18802在线能力错误结果等待超时

#5.2 常见云端错误码#

ret="20014", ws打断功能异常
ret="10101", 引擎回话已结束
ret="10110", 授权不足
ret="10221", 服务端没有可用连接 
ret="10222", 请求超时
ret="11200", 功能未授权或授权到期
ret="11203", 并发流控超限
ret="20001", session 无效
ret="20004", 请求类型异常
ret="20007", 动作指令异常
ret="20015", 当前形象id 不存在
ret="20017", 文本审核不通过
ret="10163", json shema 校验异常
ret="20012", 同步请求调用超时
ret="20016", 当前发音人不存在
上一页
Web SDK 2.0 接入指南
下一页
iOS-SDK
Built with