文档

数字人流媒体服务WebSDK

更新时间:
重要

本文中含有需要您注意的重要提示信息,忽略该信息可能对您的业务造成影响,请务必仔细阅读。

aliyun-avatar-sdk,数字人开放平台推出的适用于Web浏览器的数字人流媒体服务SDK。当您调用服务端OpenAPI StartInstance接口获取RTC和IM参数信息后,可以在Web端搭建本地SDK,实现数字人拉流和双工对话。aliyun-avatar-sdk通过阿里云音视频通信服务(阿里云RTC)提供视频流的订阅,并通过标准WebSocket与服务端建立IM连接。

接入前须知

  1. aliyun-avatar-sdk本身仅运行在浏览器环境,不包含操作服务端实例的接口(如启动数字人、结束数字人、播报文本等功能),如有需要请参考OpenAPI文档。同时,您可以在demo合集中的public_demo文件夹找到一个简易的nodejs服务端工程,帮助您快捷体验数字人流媒体服务,具体操作请参考public_demo文件夹下的readme.md;

  2. 页面协议请使用HTTPS,否则在部分机型上会出现录音权限被拒绝,拉流播放失败等问题;

  3. 由于网络等原因导致im连接中断(错误码:15011002)时,连接断开期间本地录音将不会保留;

  4. 各平台浏览器兼容性测试详见文末附录各平台浏览器兼容性

  5. 如在使用过程中遇到其他问题,请先浏览常见问题排查,如问题仍然存在,请提交工单与我们联系;

接入方法

CDN引入

<script src="https://g.alicdn.com/code/npm/@alife/aliyun-avatar-sdk/1.0.20/index.js"></script>

CDN方式引入将SDK实例挂载到window上,以DialogAvatarSDK为例:

/*
 * CDN方式 引入DialogAvatarSDK
 */
/* global options */
const dialogAvatarSDK = new window.DialogAvatarSDK({ options });

离线引入

从OSS下载SDK包

$ # 切换到项目根目录
$ cd your-project
$ # 解压下载的压缩包
$ tar -xvf avatar-sdk.tar.gz
$ # 本地安装
$ npm install avatar-sdk

功能模块展示

类名

适用的数字人类型

包含功能

DialogAvatarSDK

互动数字人

rtc拉流、im连接、本地录音

BroadcastingAvatarSDK

播报数字人、推流数字人

rtc拉流

demo使用

demo下载

从OSS下载DEMO合集,解压;

demo 介绍

解压后的demo文件结构如下:

├── asr_demo # 自定义问答(第三方问答机器人)
│ ├── readme.md # 自定义问答demo的说明文件
│ ├── src
│ │ ├── client.ts
│ │ ├── server.ts # nodejs 后端工程入口文件
│ │ └── www # 前端项目
│ │ ├── index.html
├── public_demo
│ ├── readme.md # 公有云demo的说明文件
│ ├── src
│ │ ├── client.ts
│ │ ├── server.ts #nodejs 后端工程入口文件
│ │ └── www # 前端项目
│ │ ├── broadcastingAvatar.html # 播报数字人(资讯播报)
│ │ ├── dialogAvatar.html # 互动数字人(客服助理)
├── readme.md # demo总说明文件
├── private_demo # 公有云用户忽略

您可以根据需要选择使用以下demo快速体验数字人:

  • 播报数字人(资讯播报):用户输入文字,由数字人播报出来;

image

  • 互动数字人(客服助理):用户通过文字/语音和数字人对话,数字人的回答内容由阿里云智能对话机器人生成(需要您在数字人开放平台配置对话机器人)

image

  • 用户自定义问答机器人:适合配置第三方问答机器人(如:通义千问、文心一言、ChatGPT等)。您可以在Web端通过ASR(自动语音识别)获取识别结果,将识别文字传给您的问答机器人,再将回答文本传输给数字人播报。注意:需要您开通阿里云智能语音交互服务,以及第三方对话接口。

image

使用方法

重要
  1. Node 版本要求 10.x 及以上,推荐16.16.0;

  2. 如果在Windows操作系统上运行,请避免直接使用cmd.exe,推荐使用支持Shell解释器的命令行客户端,如Git Bash,cmder等;

1. 运行nodejs服务端工程

# 生成ssl证书(仅测试用,请勿用于生产环境)
openssl req -newkey rsa:2048 -new -nodes -x509 -days 3650 -keyout key.pem -out cert.pem
# ALIBABA_CLOUD_ACCESS_KEY_ID 和 ALIBABA_CLOUD_ACCESS_KEY_SECRET 的获取请参考https://help.aliyun.com/zh/tablestore/support/obtain-an-accesskey-pair
npm install --registry=https://registry.npmmirror.com && npm run build && ALIBABA_CLOUD_ACCESS_KEY_ID=******** ALIBABA_CLOUD_ACCESS_KEY_SECRET=******** node ./dist/server.js

2. 运行前端工程

# cd到前端项目的根目录
cd ./src/www
# copy ssl证书
cp ../../cert.pem ./
cp ../../key.pem ./
# 安装http-server
npm install -g http-server
# 启动本项目
http-server -S -C cert.pem -p 3001

3. 访问demo页

在启动了服务端和前端工程后:

访问https://127.0.0.1:3001/dialogAvatar.html 互动数字人DEMO

访问https://127.0.0.1:3001/broadcastingAvatar.html 播报数字人DEMO

互动数字人 - DialogAvatarSDK

快速入门代码示例

/*
 * 引入DialogAvatarSDK
 */
const DialogAvatarSDK = window.DialogAvatarSDK;

/*
 * 获取建立im和拉rtc流的关键信息
 */
// StartInstanceRes:从服务端StartInstance接口返回值
/* global StartInstanceRes */
const { sessionId, token, channel } = StartInstanceRes;

/*
 * 调用构造方法,输入服务端返回的信息
 */
const dialogAvatarSDK = new DialogAvatarSDK({
  // im连接参数
  tenantId: "", // 用户自行提供
  appId: "", // 用户自行提供
  sessionId,
  token, // 注意是StartInstance外层返回的token,不是channel里的token
  // rtc拉流相关参数
  /*
  * 注意StartInstance接口返回的channel中的变量为大驼峰,如果服务端没有转化的话
  * 前端需要在这里手动转成小驼峰
  */
  channel: {
    appId: channel.AppId, // 手动转成小驼峰
    channelId: channel.ChannelId,
    expiredTime: channel.ExpiredTime,
    gslb: channel.Gslb,
    nonce: channel.Nonce,
    token: channel.Token,
    type: channel.Type,
    userId: channel.UserId,
  },
  // 用来播放rtc下行流的容器
  videoDOM: document.getElementById("rtc"),
  // 选项
  options: {
    wsUrl: "wss://avatar-im.console.aliyun.com/ws", // 建立IM连接的websocket地址
    maxReconnectTimeout: 300000, // 断线重连最大尝试时间(ms),超出这个时间仍未重连成功将抛出断线重连超时错误
    audio: {
      autoStartRecord: false, // 是否在初始化过程中自动开启浏览器录音
      interval: 100, // 音频采集间隔(ms),注意不能小于60ms,不能大于1000ms,否则会抛出错误
      autoDodge: false, // 是否开启音频闪避
    },
    rtc: {
      muted: false, // 是否静音订阅流
      // chromaKey: DialogAvatarSDK.canUseChromaKey(), // 如果需要开启抠绿幕,请解注释这行代码
    },
  },
  // 初始化成功回调
  onInitSuccess: () => {
    console.log("IM连接成功,RTC拉流成功");
    console.log(dialogAvatarSDK.rtc.aliRtcEngine); // 此时可以访问aliRtcEngine原始对象
  },
  // RTC初始化成功回调
  onRtcInitSuccess: () => {
    console.log("RTC拉流成功,等待IM链接...");
    console.log(dialogAvatarSDK.rtc.aliRtcEngine); // 此时可以访问aliRtcEngine原始对象
  },
  // IM初始化成功回调
  onIMInitSuccess: () => {
    console.log("IM连接成功,等待RTC拉流...");
  },
  // 错误回调
  onError: (e) => {
    console.error(e);
  },
  // 警告回调
  onWarning: (msg) => {
    console.warn(msg);
  },
  // 收音开始回调
  onRecordingStart: () => {
    // 可以在ui上提示用户
  },
  // 收音结束回调
  onRecordingStop: () => {
    // 可以在ui上提示用户
  },
  // ASR下发文本回调
  onASR: (text, sentenceId) => {
    console.log(`ASR: ${text}`);
    console.log(`sentenceId: ${sentenceId}`);
  },
  // 数字人回答下发文本回调
  onAnswer: (text, sentenceId) => {
    console.log(`Answer: ${text}`);
    console.log(`sentenceId: ${sentenceId}`);
  },
  // 未知im消息回调,用于接收后端业务增加新的消息类型
  onUnknownIMMessage: (msg) => {
    console.log("onUnknownIMMessage", msg);
  },
});

/*
 * 初始化
 */
dialogAvatarSDK
  .init()
  .then(() => {
    // 等同于onInitSuccess
    console.log("IM连接成功,RTC拉流成功");
    // dialogAvatarSDK.openAutoDodge(); // 开启音频闪避
    // dialogAvatarSDK.stopRecording(); // 手动停止收音,会触发onRecordingStop
    dialogAvatarSDK.startRecording().then(() => {
      // 手动开启收音,会触发onRecordingStart
      console.log("录音成功");
    });
    dialogAvatarSDK.sendText('查询杭州天气');
    // dialogAvatarSDK.destroy(); // 销毁实例
  })
  .catch((e) => {
    // 同样的错误也会被onError捕获
    console.log(e);
  });

新建实例

构造函数入参如下表:

参数名称

描述

是否必选

类型

默认值

备注

tenantId

用户自行提供租户id

string

appId

用户自行提供应用id

string

sessionId

StartInstance返回的会话id

string

token

im对话的token,注意是OpenAPI StartInstance外层返回的token,不是channel里的token

string

没有token无法建立im对话连接

channel

用来rtc拉流的信息,OpenAPI StartInstance返回的channel字段

object

注意StartInstance接口返回的channel中的变量为大驼峰,需要您手动转化成小驼峰命名

videoDOM

用来播放rtc下行流的容器

HTMLVideoElement

options

用户自定义配置

object

options.wsUrl

建立IM连接的Websocket地址

string

wss://avatar-im.console.aliyun.com/ws

options.maxReconnectTimeout

断线重连最大尝试时间(ms),超出这个时间仍未重连成功将抛出断线重连超时错误

number

300000

options.rtc.muted

是否静音订阅流

boolean

false

options.rtc.chromaKey

是否开启透明背景

boolean

false

可以通过DialogAvatarSDK.canUseChromaKey()来判断当前浏览器是否支持透明背景功能

options.audio.autoStartRecord

是否在初始化过程中自动开启浏览器录音

boolean

false

options.audio.interval

音频采集间隔,单位毫秒

number

100

注意不能小于60ms,不能大于1000ms,否则会抛出错误

options.audio.autoDodge

是否开启音频闪避

boolean

false

音频闪避:当RTC视频流数字人说话时,自动暂停浏览器录音

onInitSuccess

初始化成功回调

function

表示RTC和IM通道初始化均完成,在onIMInitSuccess和onRtcInitSuccess之后触发

onIMInitSuccess

IM初始化成功回调

function

onRtcInitSuccess

RTC初始化成功回调

function

onError

错误回调

function

onWarning

警告回调

function

错误和警告的区别详见数字人服务错误/警告

onASR

asr识别文本回调

function

onAnswer

数字人回答文本回调

function

onRecordingStart

收音开始回调

function

onRecordingStop

收音结束回调

function

onUnknownIMMessage

未知的im消息,用于接收后续业务增加新的消息类型

function

绑定回调

除了在构造函数绑定监听回调外,还可以直接在实例上绑定监听回调;

重要
  1. 所有的回调函数都是非必需的。您无需绑定任何监听回调,即可成功拉流。

  2. 建议在初始化操作init()执行前绑定监听回调,否则可能会出现回调没有被触发的情况。

  • onInitSuccess 初始化成功回调

表示RTC和IM通道初始化均完成,可以与数字人正常进行对话,在onIMInitSuccess和onRtcInitSuccess之后触发

/* global dialogAvatarSDK */
dialogAvatarSDK.onInitSuccess = () => {
  console.log("IM连接成功,RTC拉流成功");
  console.log(dialogAvatarSDK.rtc.aliRtcEngine); // 此时可以访问aliRtcEngine原始对象
};
  • onIMInitSuccess IM初始化成功回调

/* global dialogAvatarSDK */
dialogAvatarSDK.onIMInitSuccess = () => {
  console.log("IM连接成功,等待RTC拉流...");
};
  • onRtcInitSuccess RTC初始化成功回调

/* global dialogAvatarSDK */
dialogAvatarSDK.onRtcInitSuccess = () => {
  console.log("RTC拉流成功,等待IM链接...");
  console.log(dialogAvatarSDK.rtc.aliRtcEngine); // 此时可以访问aliRtcEngine原始对象
};
  • onError/onWarning 错误/警告回调

说明
  1. 不推荐在完成初始化后在实例上绑定onError/onWarning,因为这样可能会丢失构造函数内的报错信息(例如入参错误)。推荐直接在构造函数里绑定onError/onWarning。

  2. 错误和警告的区别详见数字人服务错误/警告

/* 不推荐 */
/* global dialogAvatarSDK */
dialogAvatarSDK.onError = (e) => {
  console.error(`errorCode: ${e.errorCode}, source:${e.source}, errorMsg:${e.errorMsg}`);
};

dialogAvatarSDK.onWarning = (e) => {
  console.warn(`errorCode: ${e.errorCode}, source:${e.source}, errorMsg:${e.errorMsg}`);
};

回调入参e数据结构:

参数名称

描述

类型

errorCode

错误码,详情参考文末错误码表

number

source

错误来源(AliRtc和Avatar,前者代表来自阿里云RTC的错误,后者代表来自数字人或客户端的错误)

string

errorMsg

错误描述

string

  • onASR ASR下发文本回调

/* global dialogAvatarSDK */
dialogAvatarSDK.onASR = (text, sentenceId) => {
  console.log(`ASR Result: ${text}`);
  console.log(`sentenceId: ${sentenceId}`);
};

回调入参说明:

参数名称

描述

类型

text

asr识别文本

string

sentenceId

句子id

string

  • onAnswer 数字人回答下发文本回调

/* global dialogAvatarSDK */
dialogAvatarSDK.onAnswer = (text, sentenceId) => {
  console.log(`Answer: ${text}`);
  console.log(`sentenceId: ${sentenceId}`);
};

回调入参说明:

参数名称

描述

类型

text

数字人回答文本

string

sentenceId

句子id

string

  • onRecordingStart 收音开始回调

/* global dialogAvatarSDK */
dialogAvatarSDK.onRecordingStart = () => {
  // 可以在ui上提示用户开始收音
};

  • onRecordingStop 收音结束回调

/* global dialogAvatarSDK */
dialogAvatarSDK.onRecordingStop = () => {
  // 可以在ui上提示用户停止收音
};

初始化

初始核心流程:

  1. 建立im连接;

  2. rtc拉流;

  3. 开启浏览器录音并通过im发送;(当options.autoStartRecord为true时)

  • init 初始化回调

/* global dialogAvatarSDK */
dialogAvatarSDK.init().then(
  () => {
    // 等同于onInitSuccess
    console.log("IM连接成功,rtc拉流成功");
  },
).catch(
  (e) => {
    // 该错误也会被onError捕获
    console.error(e);
  },
);

暂停/开始收音

/* global dialogAvatarSDK */
dialogAvatarSDK.stopRecording(); // 手动停止收音/自定义音频采集,会触发onRecordingStop
dialogAvatarSDK.startRecording().then(() => {
  // 手动开启收音/自定义音频采集,会触发onRecordingStart
  console.log("录音成功");
});

文字互动

除了使用麦克风收音外,您还可以使用文本与数字人进行对话互动

/* global dialogAvatarSDK */
dialogAvatarSDK.sendText('查询杭州天气');

RTC静音/取消静音

/* global dialogAvatarSDK */
dialogAvatarSDK.muteRtc();
dialogAvatarSDK.unMuteRtc();

透明背景

在启动数字人实例时若选择开启了透明通道,可以将数字人背景透明化,透出自定义背景及可交互组件,如按钮等。

重要
  1. 若使用了透明背景的接入方式,需要将StartInstance - 启动一个数字人接口中的AlphaSwitch置为True。

  2. 透明背景功能只能在新建实例时通过入参options.rtc.chromaKey开启,无法中途开启/关闭透明背景功能。如要开启/关闭透明背景,请新建实例。

  3. 由于透明背景功能使用的Web API 兼容性问题,目前只支持部分浏览器,在实例化之前,请调用静态方法DialogAvatarSDK.canUseChromaKey查看浏览器是否支持透明背景功能。详见文末附录各平台浏览器兼容性

以下为实现透明背景的参考代码,透明背景开关需要在SDK实例化前配置:

/* global DialogAvatarSDK */
// DialogAvatarSDK的入参
const params = {};
// 按照“新建实例”的要求填写params中的参数
// ...
// 打开透明背景功能
params.options.rtc.chromaKey = DialogAvatarSDK.canUseChromaKey();
// 实例化SDK
const dialogAvatarSDK = new DialogAvatarSDK(params);

高级功能

  • 暴露阿里云RTC原始对象

/* global dialogAvatarSDK */
// 访问aliyun-webrtc 原始对象
console.log(dialogAvatarSDK.rtc.aliRtcEngine);
  • 暴露Websocket原始对象

/* global dialogAvatarSDK */
// 访问WebSocket 原始对象
console.log(dialogAvatarSDK.websocket);
  • 音频闪避

音频闪避的含义为:当数字人说话时,暂停浏览器收音。

音频闪避有两种开启方式:

  1. 自动开启:

如果构造函数的options.audio.autoDodge字段设置为true,则会自动开启

  1. 手动开启:

/*
* 执行构造函数后,手动开启/关闭音频闪避
*/
/* global dialogAvatarSDK */
dialogAvatarSDK.openAutoDodge();
dialogAvatarSDK.closeAutoDodge();

销毁实例

断开rtc拉流、im连接、停止录音,避免资源浪费;

dialogAvatarSDK.destroy();
重要

该方法仅仅销毁客户端实例,若要避免云端资源浪费,请调用OpenAPI StopInstance接口

播报数字人 - BroadcastingAvatarSDK

快速入门代码示例

const BroadcastingAvatarSDK = window.BroadcastingAvatarSDK;
/*
 * 获取建立im和拉rtc流的关键信息
 */
// StartInstanceRes:从服务端StartInstance接口返回值
/* global StartInstanceRes */
const { channel } = StartInstanceRes;

/*
 * 调用构造方法,输入服务端返回的信息
 */
const broadcastingAvatarSDK = new BroadcastingAvatarSDK({
  // rtc拉流相关参数
  /*
  * 注意StartInstance接口返回的channel中的变量为大驼峰,如果服务端没有转化的话
  * 前端需要在这里手动转成小驼峰
  */
  channel: {
    appId: channel.AppId, // 手动转成小驼峰
    channelId: channel.ChannelId,
    expiredTime: channel.ExpiredTime,
    gslb: channel.Gslb,
    nonce: channel.Nonce,
    token: channel.Token,
    type: channel.Type,
    userId: channel.UserId,
  },
  // 用来播放rtc下行流的容器
  videoDOM: document.getElementById("rtc"),
  options: {
    maxReconnectTimeout: 300000, // 断线重连最大尝试时间(ms),超出这个时间仍未重连成功将抛出断线重连超时错误
    rtc: {
      muted: false, // 是否静音订阅流
      // chromaKey: BroadcastingAvatarSDK.canUseChromaKey(), // 如果需要开启透明背景,请解注释这行代码
    },
  },
  // 初始化成功回调
  onInitSuccess: () => {
    console.log("RTC拉流成功");
  },
  // 错误回调
  onError: (e) => {
    console.error(e);
  },
  onWarning: (msg) => {
    console.warn(msg);
  },
});

/*
 * 初始化
 */
broadcastingAvatarSDK
  .init()
  .then(() => {
    // 等同于onInitSuccess
    console.log("RTC拉流成功");
    console.log(broadcastingAvatarSDK.rtc.aliRtcEngine); // 此时可以访问aliRtcEngine原始对象
  })
  .catch((e) => {
    // 同样的错误也会被onError捕获
    console.log(e);
  });

// broadcastingAvatarSDK.destroy(); // 销毁实例

新建实例

构造函数入参

参数名称

描述

是否必选

类型

默认值

备注

channel

用来rtc拉流的信息,OpenAPI StartInstance返回的channel字段

object

注意StartInstance接口返回的channel中的变量为大驼峰,需要您手动转化成小驼峰命名

videoDOM

用来播放rtc下行流的容器

HTMLVideoElement

options

用户自定义配置

object

options.rtc.muted

是否静音订阅流

boolean

false

options.rtc.chromaKey

是否开启透明背景

boolean

false

可以通过DialogAvatarSDK.canUseChromaKey()来判断当前浏览器是否支持透明背景功能

options.maxReconnectTimeout

断线重连最大尝试时间,超出这个时间仍未重连成功将抛出断线重连超时错误, 单位毫秒

number

300000

options.onInitSuccess

初始化成功回调

function

onError

错误回调

function

onWarning

警告回调

function

错误和警告的区别详见数字人服务错误/警告

绑定回调

除了在构造函数绑定监听回调外,还可以直接在实例上绑定监听回调;

重要
  1. 所有的回调函数都是非必需的。您无需绑定任何监听回调,即可成功拉流。

  2. 建议在初始化操作init()执行前绑定监听回调,否则可能会出现回调没有被触发的情况。

  • onInitSuccess 初始化成功回调

/* global broadcastingAvatarSDK */
broadcastingAvatarSDK.onInitSuccess = () => {
  console.log("RTC拉流成功");
  console.log(broadcastingAvatarSDK.rtc.aliRtcEngine); // 此时可以访问aliRtcEngine原始对象
};
  • onError/onWarning 错误/警告回调

说明
  1. 不推荐在完成初始化后在实例上绑定onError/onWarning,因为这样可能会丢失构造函数内的报错信息(例如入参错误)。推荐直接在构造函数里绑定onError/onWarning。

  2. 错误和警告的区别详见数字人服务错误/警告

/* 不推荐 */
/* global broadcastingAvatarSDK */
broadcastingAvatarSDK.onError = (e) => {
  console.error(`errorCode: ${e.errorCode}, source:${e.source}, errorMsg:${e.errorMsg}`);
};

broadcastingAvatarSDK.onWarning = (e) => {
  console.warn(`errorCode: ${e.errorCode}, source:${e.source}, errorMsg:${e.errorMsg}`);
};

回调入参e数据结构:

参数名称

描述

类型

errorCode

错误码

number

source

错误来源(AliRtc和Avatar,前者代表来自阿里云RTC的错误,后者代表来自数字人或客户端的错误)

string

errorMsg

错误描述

string

初始化

初始化核心流程:rtc拉流

/* global broadcastingAvatarSDK */
broadcastingAvatarSDK.init().then(
  () => {
    // 等同于onInitSuccess
    console.log("RTC拉流成功");
    console.log(broadcastingAvatarSDK.rtc.aliRtcEngine); // 此时可以访问aliRtcEngine原始对象
  },
).catch(
  (e) => {
    // 该错误也会被onError捕获
    console.error(e);
  },
);

RTC静音/取消静音

/* global broadcastingAvatarSDK */
broadcastingAvatarSDK.muteRtc();
broadcastingAvatarSDK.unMuteRtc();

透明背景

在启动数字人实例时若选择开启了透明通道,可以将数字人背景透明化,透出自定义背景及可交互组件,如按钮等。

重要
  1. 若使用了透明背景的接入方式,需要将StartInstance - 启动一个数字人接口中的AlphaSwitch置为True。

  2. 透明背景功能只能在新建实例时通过入参options.rtc.chromaKey开启,无法中途开启/关闭透明背景功能。如要开启/关闭透明背景,请新建实例。

  3. 由于透明背景功能使用的Web API 兼容性问题,目前只支持部分浏览器,在实例化之前,请调用静态方法BroadcastingAvatarSDK.canUseChromaKey查看浏览器是否支持透明背景功能。详见文末附录各平台浏览器兼容性

以下为实现透明背景的参考代码,透明背景开关需要在SDK实例化前配置:

/* global BroadcastingAvatarSDK */
// BroadcastingAvatarSDK的入参
const params = {};
// 按照“新建实例”的要求填写params中的参数
// ...
// 打开透明背景功能
params.options.rtc.chromaKey = BroadcastingAvatarSDK.canUseChromaKey();
// 实例化SDK
const broadcastingAvatarSDK = new BroadcastingAvatarSDK(params);

高级功能

  • 暴露阿里云RTC原始对象

/* global broadcastingAvatarSDK */
console.log(broadcastingAvatarSDK.rtc.aliRtcEngine); // 访问aliyun-webrtc 原始对象

销毁实例

断开rtc拉流,避免资源浪费;

重要

该方法仅仅销毁客户端实例,若要避免云端资源浪费,请调用OpenAPI StopInstance接口

/* global broadcastingAvatarSDK */
broadcastingAvatarSDK.destroy();

常见问题

录音失败

当在接入了aliyun-avatar-sdk的页面第一次录音时,系统会弹窗提醒是否开启录音权限(不同浏览器的弹窗提示可能会有所差异),如果在同意开启录音权限后仍然无法录音,或没有弹出开启录音权限的弹窗,请按照以下步骤排查问题:

PC端:

  1. 检查协议名是否为https,例如https://www.aliyun.com/

image.png

  1. 请点击浏览器地址栏下的锁按钮,查看是否在该页面开启了录音权限

image.png

移动端H5:

  1. 纯H5页面在部分APP中无法获取录音权限,例如手机淘宝APP,微信等,aliyun-avatar-sdk暂不支持在这些APP中的录音功能,如有Native APP拉流需要请参考数字人流媒体服务AndroidSDK;

  2. 检查协议名是否为https,例如https://www.aliyun.com/。部分手机浏览器会拒绝在http协议下调用录音权限;

如果问题仍然存在,请提交工单与我们联系。

画面没有声音/无法自动播放

由于chrome对自动播放的限制,禁止自动播放带音频轨道的视频,如果您的页面在没有任何用户操作的情况下自动拉流(例如用js触发的方式自动拉流),会出现数字人无声音的问题,或浏览器控制台报错如下,无法播放拉流视频。

警告

Uncaught (in promise) DOMException: play() failed because the user didn't interact with the document first.

这种情况有三个解决方案,推荐程度依次降低:

  1. 建议您添加按钮来触发拉流;

  2. 或建议您在实例化SDK时开启静音订阅(参考是否静音订阅流),并在拉流成功后调用RTC静音/取消静音来取消静音。或者在UI上设置音量开关按钮,提醒用户打开声音;

  3. 如您不采用以上两种方案,则需要提示用户点击页面任意位置解除声音播放限制(aliyun-avatar-sdk的兜底策略);

拉流没有画面

  1. 请检查当前页面协议是否为HTTPS,若不是,请更换成HTTPS;

  2. 请检查构造函数是否被成功构建:当您输入的参数不合法时,使用new操作符实例化sdk会抛出错误;

  3. 请检查服务端是否成功调用StartInstance接口,以及前端是否将服务端的返回正确地填写到构造函数的入参里(注意StartInstance返回的字段名为大驼峰,需要手动转为小驼峰输入到入参里);

  4. 将options.rtc.chromaKey手动置为false,先关闭透明背景功能,尝试是否有画面;

  5. 请检查自定义的onInitSuccess事件是否被触发:若已经触发,请继续下面的步骤排查,若没有被触发,请提交工单与我们联系;

  6. 排查完以上问题后,请按照下图所示步骤继续排查客户端是否收到流

image.png

说明如下:

序号

相关操作

确保在您的页面已经调用init方法,且没有掉用destroy方法

onInitSuccess回调被触发后访问页面chrome://webrtc-internals/

ctrl+F,页面全局搜索bytesReceived

一直键入回车,直到找到对应页面的[bytesReceived_in_bits/s]图表,检查图标是否为空

  1. 若该图表为空,可能是浏览器插件导致,为过滤浏览器插件影响,请执行以下操作之一:

    1. 关闭所有浏览器插件,重新打开页面

    2. 或打开chrome浏览器无痕窗口,重新打开页面

    3. 或更换其他浏览器,重新打开页面

    目前已知会影响RTC正常拉流的浏览器插件:PureVPN Proxy

  2. 如关闭所有浏览器插件并更换其他浏览器仍没有画面,请提交工单与我们联系;

PC端调试正常,移动端无画面

出现这种情况可能是因为移动端播放限制,请尝试给您的video标签添加如下属性:

<video
  webkit-playsinline="true"
  x5-playsinline="true"
  x-webkit-airplay="allow"
  playsInline="true"
  muted
/>
重要

muted属性会禁止video标签的声音。设置这个属性是为了兼容某些移动端设备上,视频自动播放失效/无声音的情况。建议您在拉流成功后调用RTC静音/取消静音来取消静音,或者在UI上设置音量开关按钮,提醒用户打开声音。

如何获取当前流媒体音量

// 以播报数字人为例,互动数字人同理
// 注意broadcastingAvatarSDK是实例化后的对象,不是BroadcastingAvatarSDK构造函数
/* global broadcastingAvatarSDK */
broadcastingAvatarSDK.rtc.aliRtcEngine.enableAudioVolumeIndicator = true;
broadcastingAvatarSDK.rtc.aliRtcEngine.on("onAudioLevel", async (data) => {
  const audio = data[0];
  console.log(audio.level); // 当前音量大小,为0说明当前无音频数据
});

附录

错误码表

AliRtc 音视频服务错误

触发onError回调时,source字段为"AliRtc"时,标志为阿里云RTC错误,详见

Web端错误码_音视频通信-阿里云帮助中心

数字人服务错误/警告

触发onError/onWarning回调时,source字段为"Avatar"时,标志为数字人服务/本地客户端异常,该异常分为两类:

  • 错误:阻塞SDK功能正常使用,通过onError事件抛出;

  • 警告:不阻塞SDK主链路使用,通过onWarning事件抛出;

详见下表:

错误码

错误消息

描述

解决方案

级别

50009999

系统内部错误

系统内部错误

内部未明确错误,需要通过日志文件寻求支持

错误

50000001

缺少必填参数:audio

缺少必填参数

请确认接口调用是的必须参数

错误

50000002

非法参数:audio

非法参数

请确认参数格式是否错误或者缺少必须字段

错误

50000006

无效的sessionId

无效的sessionId

session失效或者sessionid传参错误

错误

50010001

发送的音频大小超过限制

发送的音频大小超过限制(默认最大为1s的PCM音频)

查看采集发送的音频大小,减小采集音频的时长

警告

50010002

互动数字人相关必要配置缺失

互动数字人相关必要配置缺失

请检查开发平台对应业务的互动机器人配置(主要为机器人的id\ak\sk)

错误

50010003

互动机器人问答结果为空

互动机器人问答结果为空

警告

50010004

天气预报机器人请求次数已达上限

天气预报机器人请求次数已达上限

请更换自己购买的云小蜜机器人对应配置

错误

50020001

ASR处理未知异常

ASR处理未知异常

错误

50020002

ASR长时间未收到对应的正确格式音频

ASR长时间未收到对应的正确格式音频

检查是否在持续采集上行的音频或者音频的内容格式是否正确

警告

50040001

云小蜜给出的errcode:errMsg

无权限访问对应云小蜜资源

检查对应云小蜜账号的权限

错误

50040002

云小蜜给出的errcode:errMsg

配置的云小蜜账号已被冻结

检查云小蜜对应账号是否已经欠费

错误

50040004

云小蜜给出的errcode:errMsg

云小蜜对话未知异常

错误

15011000

服务端双工对话开启失败

IM通道建立后,初始化对话通道失败

错误

15011001

IM通道异常

可能的原因:

  1. Websocket地址出错;

  2. 服务端拒绝了Websocket连接;

  3. 使用了不可信的SSL证书;

  1. 请检查options.wsUrl 输入的地址是否有误;

  2. 如果options.wsUrl指定的协议为ws,建议改成wss(需要IM服务器支持)

  3. 检查浏览器是否信任options.wsUrl对应的SSL证书(浏览器会拦截使用自签名的SSL证书的域名)

错误

15011002

IM断线

IM因网络问题断开连接

请检查网络连接,在最大重连时间options.maxReconnectTimeout内恢复网络连接会自动重连

错误

15011003

IM重连超时

IM断线后超出最大重连时间仍未重连成功

请销毁当前实例,重新新建实例

错误

15021000

rtc频道关闭

可能的原因:相同实例在另一个端登录;

请销毁当前实例,重新新建实例

错误

15021001

rtc重连超时

rtc断线后超出最大重连时间仍未重连成功

请销毁当前实例,重新新建实例

错误

15031002

未获取到录音权限

请检查麦克风设备是否正常运算,或者浏览器麦克风权限是否做了限制

  1. 请检查麦克风设备是否正常运行;

  2. 浏览器麦克风权限是否关闭;

  3. 页面是否运行在HTTPS域名上(ios设备的浏览器可能会禁止非HTTPS域名的录音功能)

错误

15031003

video参数为空,或不是合法的HTMLVideoElement

rtc拉流前应提供正确的HTMLVideoElement

  1. 检查您是否输入的是合法的HTMLVideoElement。其他类型的DOM元素会导致无法正常拉流,如:HTMLDivElement

  2. 如果您使用Vue,请检查使用本SDK的逻辑是否写在Mounted生命周期函数;如果您使用React,请检查使用本SDK的逻辑是否写在了onComponentDidMount或useEffect里

错误

15031004

您输入的是channel中的appId,非IM连接需要的appId,请从数字人控制台获取对应的appId

请检查是否将channel里的appId和外层用来连接IM的appId混淆了

错误

15031005

请使用https协议访问页面

http协议下,会出现拉流错误、录音失败等情况

请在本地调试/线上运行时都使用https协议

错误

各平台浏览器兼容性

平台

浏览器类型

主功能版本要求

透明背景功能版本要求

Mac

Safari

Safari 11或以上版本

不支持

Chrome

Chrome 83或以上版本

Chrome 94或以上版本

Edge

Edge 83或以上版本

Edge 94或以上版本

Windows

Chrome

Chrome 83或以上版本

Chrome 94或以上版本

Edge

Edge 83或以上版本

Edge 94或以上版本

iOS(11.1.2及以上版本)

Safari

Safari 11或以上版本

不支持

Android

Chrome

Android System Webview 83或以上版本

Android System Webview 94或以上版本

(经测试,Android12及以上版本系统内置的Android System Webview能够满足要求)

重要
  1. SDK暂不支持火狐浏览器;

  2. 由于H.264版权限制,SDK不支持华为系统的Chrome浏览器和以Chrome WebView为内核的浏览器;

  3. SDK依赖标准的Web APIs才能正常运行,因此不支持小程序;

  4. 其他浏览器及APP内置WebView兼容性请参照兼容性测试;

兼容性测试

  1. 访问https://avatar.console.aliyun.com/

  2. 左侧菜单进入【开发者中心】-【项目管理】,点击卡片上的【配置】进入配置页;image.png

  3. 在配置页点击【保存并测试】,耐心等待数字人加载;若数字人拉流成功,且与数字人对话成功(针对互动数字人),说明浏览器兼容性没有问题;image.png