搭建环境
在项目中引入如下三个库
AgoraRTC N-4.19.3.js
crypto-js.min.js
voice.min.js
环境装配
创建一个
startRTC
方法。该方法会创建一个供 SDK
各个接口使用的上下文
RTC
对象,初始化 SDK 环境,并填写 SDK 的相关参数信息。代码如下:
- 导入必要的命名空间。例如:
import {RTC,processorVideo} from "./basicVideoCall_fz.js";
- 提供待机视频,提供html容器。如下:
- 创建上下文,启动渲染器进程,装配环境。如下:
var rtc;
function startRTC() {
rtc = new RTC({
channel: 'XDLIVECHAT',
StandbyVideo: document.getElementById("video"),//数字人待机视频
prefixUrl:'http://180.76.97.202:9099',//为所有接口地址,测试环境为 (http://180.76.97.202:9099),线上为(https://qhw.smart-xiaoduo.cn/webapi_commons);
KeyID:'ZXRwN8x2Nmttem7lNmJkM2w1bmJlbnpydmppb2hsb8YzYzdjd3psdfsdfsdgcccdfs333',//为调取所有接口的token,
websocketUrl:'ws://180.76.97.202:9099//ws2/',//为询问房间人数的长链接接口地址,测试环境为 (ws://180.76.97.202:9099//ws2/),线上为(wss://qhw.smart-xiaoduo.cn/webapi_wss/ws2/);
Objfunction:vm7.setYw,//房间空了之后的回调函数名称,需要自己在业务代码中定义
NoJTime:20,//允许不交互的时间,不配置默认300
Timeoutfunction:vm7.goChaos,//在房间中了过了不交互时间之后的回调函数名称,需要自己在业务代码中定义
aiId:276,//必传,
videoW:vm7.divWidth,
videoh:vm7.divHeight
});
};
通过new RTC()
初始化rtc运行环境:
channel
为当前数字人房间;必填项
StandbyVideo
为数字人待机视频;必填项
prefixUrl
为所有接口地址,测试环境为 (http://180.76.97.202:9099),线上为(https://qhw.smart-xiaoduo.cn/webapi_commons);必填项
KeyID
为调取所有接口的token;必填项
websocketUrl
为询问房间人数的长链接接口地址;非必填
Objfunction
为房间空了之后的回调函数名称,需要自己在业务代码中全局定义;如果配置了websocketUrl,此项是必填项,回调函数需要有参数,参数返回当前房间人数,大于1则当前房间不可加入
NoJTime
为长时间不交互自动退出数字人服务的时间;非必填,不配置默认300;
Timeoutfunction
在房间中了过了不交互时间之后的回调函数名称,需要自己在业务代码中全局定义;必填项,回调函数可以处理在一定时间不交互离开房间的提示
aiId
为当前数字人id;必填项
videoW
为数字人展示宽度;必填项
videoh
为数字人展示宽度;必填项
加载待机视频
SDK提供去绿幕方法,processorVideo.doLoad()函数将待机视频去绿幕后画到页面
参数1:待机视频video;
参数2:画布width;
参数3:画布height,
在画到页面之前必须保证待机视频在循环播放
let video2 = document.getElementById("video");
video2.play();
console.log(video2)
processorVideo.doLoad(video2,524,931);
检测当前房间人数
用户与数字人交互前,需要确定当前房间人数,rtc.getUserLsit()
方法可以检测当前房间人数,当返回值为true
时,调用rtc.startBasicCall()
方法进入数字人预备服务状态
rtc.getUserLsit().then(function(data){
console.log(data);
if(data === true){
rtc.startBasicCall();
}else{
//当前处于排队
}
})
注:rtc.startBasicCall()
方法初始化房间,使数字人进入服务状态
开启语音识别
初始化语音环境-new Voice()
,包含两个方法:
1)voice.start()
----开始语音识别
2)voice.stop()
----停止语音识别
voice = new Voice({
onTextChange: function(text) {
//vm7.RWwenziNR为上一次识别内容,防止重复发送
if(vm7.RWwenziNR.replace("。", "").replace("?", "").replace("?", "").replace("?",
"") != text.replace("。", "").replace("?", "").replace("?", "").replace("?", "")){
if (text != '') {
//拿到识别结果进行逻辑处理
console.log(text);
vm7.yhK_show = true;//开始加载用户内容框
vm7.sending(text);//text为识别内容,识别内容进行发送,这里可以去调取知识库
}
}
// 3秒钟内没有说话,就自动关闭
if (text) {
clearTimeout(times);
times = setTimeout(() => {
index = 0;
vm7.imgList = vm7.imgList1;//停止识别后处理你页面上的逻辑
vm7.yuyingshibie_sf = false;//停止识别后处理你页面上的逻辑
console.log("停止识别")
this.stop();
}, 2000);
};
}
});
TTS合成
数字人说话需要提供音频文件,格式为wav,SDK提供TTS合成方法。
调取rtc.getTTS(text)
方法进行语音合成,text参数为将要合成的文字,返回值为一个wav格式的音频文件
rtc.getTTS(text).then(function(result){
console.log(result)
rtc.xdService(result);//调取数字人互动,参数为wav格式音频
})
数字人互动
SDK提供数字人互动方法rtc.xdService(result)
,告诉数字人开始互动,参数result参数为wav格式
的音频文件:
rtc.xdService('http://180.76.97.202/factory-tts/87bac151-d979-4e45-adcb-a19bc1e4ad8a.wav')
重置不交互时间
SDK存有在一定时间不交互离开房间的机制,提供方法rtc.xdService(result)
重置计时,配合使用重启计时,
重置成功之后返回true
,想要重启需要将leaveHouse
设置为false,然后调取SDK方法rtc.NointeractionJS()
进行计时重启:
self.clearNointeraction().then(function(obj){
if(obj === true){
rtc.leaveHouse = false;
rtc.NointeractionJS();//重启
}
});
停止推流方法
SDK提供方法rtc.TlStopService()
---停止推流方法,成功返回true
,否则返回false
:,
rtc.TlStopService().then(function(result){
if(result===true){
//业务代码
}
})
房间自动询问
SDK提供方法rtc.ljwebsocket(boolean)
---建立长链接进行房间自动询问,参数为Boolean
类型,true
为开启长链接,false
为关闭长链接;
注意:必须配合new RTC({})选项Objfunction回调函数使用,Objfunction回调函数必须是全局函数,参数返回当前数字人服务房间人数:
setYw(obj){
if(obj>1){
console.log("当前房间已满,不可进入房间");
}else{
console.log("当前房间为空,可以进入房间");
this.CxgetUserLsit();//重新进入房间
}
}
音频播放失败监听
音频播放失败的回调AgoraRTC.onAutoplayFailed::
AgoraRTC.onAutoplayFailed = () => {
console.log("此处监听到音频不能播放")
vm7.btn_yd = true;
}