接入腾讯云apass数智人[交互式]

第一步:

获取APP_KEY,ACCESS_TOKEN,可以在腾讯云控制台页面获取

第二步:

调用【新建视频流会话接口】获取[sessionId]会话唯一标识,[PlayStreamAddr]播放地址

调用步骤:

 public VhNewSessionResultDTO newSession() {
        VhNewSessionResultDTO resultDTO = null;
        try {
            long currentTime = System.currentTimeMillis() / 1000;
            String signature = getSignature(currentTime);
            VhOperateDTO operateDTO = new VhOperateDTO();
            VhNewSessionOperateDTO sessionOperateDTO = new VhNewSessionOperateDTO();
            //test zhc
            sessionOperateDTO.setUserId(TEST_USER_ID).setSessionId(new StringBuilder().append(SESSION_PREFIX).append(System.currentTimeMillis()).toString());
            operateDTO.setPayload(sessionOperateDTO);
            log.info("VirtualHumanPerformer.newSession-->operateDTO:{}", operateDTO);
            VhResponseDTO<VhNewSessionResultDTO> responseDTO = tencentCloudVhClient.newSession(currentTime, signature, APP_KEY, operateDTO);
            log.info("VirtualHumanPerformer.newSession-->responseDTO:{}", responseDTO);
            if (ObjectUtils.isNotEmpty(responseDTO)) {
                resultDTO = responseDTO.getPayload();
            }
        } catch (Exception e) {
            log.error("VirtualHumanPerformer.newSession-->", e);
        }
        return resultDTO;
    }

    /**
     * 新建视频流会话接口
     *
     * @param timestamp
     * @param signature
     * @param appkey
     * @param operateDTO
     * @return
     */
    @PostMapping(value = "v2/ivh/streammanager/streamservice/newsession", produces = MediaType.APPLICATION_JSON_UTF8_VALUE, consumes = "application/json;charset=UTF-8")
    VhResponseDTO<VhNewSessionResultDTO> newSession(@RequestParam("timestamp") long timestamp,
                                                    @RequestParam("signature") String signature,
                                                    @RequestParam("appkey") String appkey,
                                                    @RequestBody VhOperateDTO operateDTO);

获取签名函数:

 /**
     * @param currentTime
     * @return
     */
    private String getSignature(long currentTime) {
        try {
            byte[] hashBytes = HmacSha256(new StringBuilder()
                    .append(TencentContents.APP_KEY)
                    .append(StringPool.EQUAL)
                    .append(APP_KEY)
                    .append(StringPool.AMPERSAND)
                    .append(TencentContents.TIMESTAMP)
                    .append(StringPool.EQUAL)
                    .append(currentTime).toString(), ACCESS_TOKEN);
            BASE64Encoder base = new BASE64Encoder();
            String encodeStr = base.encode(hashBytes);
            String signature = URLEncoder.encode(encodeStr, StringPool.UTF8);
            return signature;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;

    }

  /**
     * @param strText
     * @param strKey
     * @return
     */
    private byte[] HmacSha256(final String strText, final String strKey) {
        byte[] strResult = null;
        try {
            Mac sha256_HMAC = Mac.getInstance(Constants.H_MAC_SHA256);
            SecretKeySpec secretKey = new SecretKeySpec(strKey.getBytes(), Constants.H_MAC_SHA256);
            sha256_HMAC.init(secretKey);
            strResult = sha256_HMAC.doFinal(strText.getBytes());
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (InvalidKeyException e) {
            e.printStackTrace();
        }
        return strResult;
    }

,第三步:建立会话长链接(websocket)-监听数智人播报内容,以及播报状态

关键代码:

    /**
     * 建立会话长链接(websocket)
     *
     * @param sessionId
     */
    public void commandChannelWebsocket(String sessionId) {
        log.info("VirtualHumanPerformer.commandChannelWebsocket-->sessionId:{}", sessionId);
        String url = new StringBuilder()
                .append(WSS_HOST)
                .append(WEB_SOCKET_URL)
                .append(StringPool.QUESTION)
                .append(TencentContents.REQUEST_ID)
                .append(StringPool.EQUAL)
                .append(sessionId)
                .toString();
        //签名
        String urlSign = this.getSignature(url);
        try {
            VirtualHumanWebSocketClient virtualHumanWebSocketClient = new VirtualHumanWebSocketClient(new URI(urlSign), sessionId, interviewSessionUserRelaManger, interviewStatusManager);
            virtualHumanWebSocketClient.connect();
        } catch (Exception e) {
            log.error("VirtualHumanPerformer.commandChannelWebsocket-->e", e);
        }
    }

签名函数:

 /**
     * 获取websocket连接路径及加密信息
     *
     * @param urlStr
     * @return
     */
    private String getSignature(String urlStr) {
        try {
            URI url = new URI(urlStr);
            String timeStamp = String.valueOf(new Date().getTime() / 1000);
            Map<String, String> paramMap = new HashMap<>();
            paramMap.put(TencentContents.APP_KEY, APP_KEY);
            paramMap.put(TencentContents.TIMESTAMP, timeStamp);
            String queryParam = url.getQuery();
            if (StringUtils.isNoneBlank(queryParam)) {
                String[] arr = queryParam.split(StringPool.AMPERSAND);
                for (int i = 0; i < arr.length; i++) {
                    String key = arr[i].substring(Constants.ZERO, arr[i].indexOf(StringPool.EQUAL));
                    String value = arr[i].substring(arr[i].indexOf(StringPool.EQUAL) + 1);
                    paramMap.put(key, value);
                }
            }
            List<String> paramList = paramMap.keySet().stream().collect(Collectors.toList());
            //字典排序
            Collections.sort(paramList);
            //拼接参数
            String paramString = paramList.stream().map(p -> p + StringPool.EQUAL + paramMap.get(p)).collect(Collectors.joining(StringPool.AMPERSAND));
            String signature =
                    Base64.encodeBase64String(this.HmacSha256(paramString, ACCESS_TOKEN));
            //urlEncoder
            String signature_encode = URLEncoder.encode(signature, StandardCharsets.UTF_8.toString());

            paramString += new StringBuilder().append(StringPool.AMPERSAND).append(TencentContents.SIGNATURE).append(StringPool.EQUAL).append(signature_encode).toString();
            if (url.toString().indexOf(StringPool.QUESTION) >= Constants.ZERO) {
                return url.toString().substring(Constants.ZERO, url.toString().indexOf(StringPool.QUESTION)) + StringPool.QUESTION + paramString;
            }
            return url + StringPool.QUESTION + paramString;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

websocket监听回调类

/**
 * 腾讯云数智人websocket调用客户端
 */
@Slf4j
public class VirtualHumanWebSocketClient extends WebSocketClient {

    private String sessionId;
    public static ConcurrentHashMap<String, VirtualHumanWebSocketClient> sessionClientMap = new ConcurrentHashMap<>();

    public VirtualHumanWebSocketClient(URI serverUri,
                                       String sessionId) {
        super(serverUri);
        this.sessionId = sessionId;
    }

    /**
     * 监听开启
     *
     * @param serverHandshake
     */
    @Override
    public void onOpen(ServerHandshake serverHandshake) {
        log.info("VirtualHumanWebSocketClient.onOpen-->sessionId:{}", sessionId);
        VirtualHumanWebSocketClient virtualHumanWebSocketClient = sessionClientMap.get(sessionId);
        if (!Objects.isNull(virtualHumanWebSocketClient)) {
            virtualHumanWebSocketClient.close();
        }
        sessionClientMap.put(sessionId, this);
    }

    /**
     * 监听消息
     *
     * @param message
     */
    @Override
    public void onMessage(String message) {
        log.info("VirtualHumanWebSocketClient.onMessage-->sessionId:{},message:{}", sessionId, message);
       
    }

    /**
     * 监听关闭
     *
     * @param i
     * @param s
     * @param b
     */
    @Override
    public void onClose(int i, String s, boolean b) {
        log.info("VirtualHumanWebSocketClient.onClose-->sessionId:{}", sessionId);
        sessionClientMap.remove(sessionId);
    }

    /**
     * 监听错误
     *
     * @param e
     */
    @Override
    public void onError(Exception e) {
        log.info("VirtualHumanWebSocketClient.onError-->sessionId:{},e:{}", sessionId, e);
    }

    /**
     * 发消息
     *
     * @param sessionId
     * @param text
     */
    public static void sendText(String sessionId, String text) {
        VirtualHumanWebSocketClient virtualHumanWebSocketClient = sessionClientMap.get(sessionId);
        if (Objects.isNull(virtualHumanWebSocketClient)) {
            log.warn("VirtualHumanWebSocketClient.sendText-->virtualHumanWebSocketClient is null!");
            return;
        }
        virtualHumanWebSocketClient.send(text);
    }

    /**
     * 关闭
     *
     * @param sessionId
     */
    public static void close(String sessionId) {
        VirtualHumanWebSocketClient virtualHumanWebSocketClient = sessionClientMap.get(sessionId);
        if (Objects.isNull(virtualHumanWebSocketClient)) {
            log.warn("VirtualHumanWebSocketClient.close-->virtualHumanWebSocketClient is null!");
            return;
        }
        virtualHumanWebSocketClient.close();
        log.info("VirtualHumanWebSocketClient.close-->sessionId:{}", sessionId);
    }
}

第四步:发送指令-进行播报

代码示例:

/**
     * 发送指令
     *
     * @param sessionId
     * @param text
     * @return
     */
    public Boolean sendCommand(String sessionId, String text) {
        Boolean result = false;
        try {
            long currentTime = System.currentTimeMillis() / 1000;
            String signature = getSignature(currentTime);
            VhOperateDTO operateDTO = new VhOperateDTO();
            operateDTO.setPayload(VhCommandOperateDTO.builder()
                    .sessionId(sessionId)
                    .command(TencentContents.VH_SEND_TEXT_COMMAND)
                    .data(VhCommandDataDTO.builder().text(text).interrupt(false).build())
                    .build());
            log.info("VirtualHumanPerformer.sendCommand-->operateDTO:{}", operateDTO);
            VhResponseDTO<Object> responseDTO = tencentCloudVhClient.command(currentTime, signature, APP_KEY, operateDTO);
            log.info("VirtualHumanPerformer.sendCommand-->responseDTO:{}", responseDTO);
            result = true;
        } catch (Exception e) {
            log.error("VirtualHumanPerformer.sendCommand-->", e);
        }
        return result;
    }
 /**
     * 文本驱动接口
     *
     * @param timestamp
     * @param signature
     * @param appkey
     * @param operateDTO
     * @return
     */
    @PostMapping(value = "v2/ivh/streammanager/streamservice/command", produces = MediaType.APPLICATION_JSON_UTF8_VALUE, consumes = "application/json;charset=UTF-8")
    VhResponseDTO<Object> command(@RequestParam("timestamp") long timestamp,
                                  @RequestParam("signature") String signature,
                                  @RequestParam("appkey") String appkey,
                                  @RequestBody VhOperateDTO operateDTO);

第五步:关闭会话-数智人停止播放

代码示例:


    /**
     * 关闭会话接口
     *
     * @param sessionId
     * @return
     */
    public Boolean closeSession(String sessionId) {
        Boolean result = false;
        try {
            long currentTime = System.currentTimeMillis() / 1000;
            String signature = getSignature(currentTime);
            VhOperateDTO operateDTO = new VhOperateDTO();
            operateDTO.setPayload(VhSessionOperateDTO.builder().sessionId(sessionId).build());
            log.info("VirtualHumanPerformer.startSession-->operateDTO:{}", operateDTO);
            VhResponseDTO<Object> responseDTO = tencentCloudVhClient.closeSession(currentTime, signature, APP_KEY, operateDTO);
            log.info("VirtualHumanPerformer.startSession-->responseDTO:{}", responseDTO);
            result = true;
        } catch (Exception e) {
            log.error("VirtualHumanPerformer.startSession-->", e);
        }
        return result;
    }
 /**
     * 关闭会话接口
     *
     * @param timestamp
     * @param signature
     * @param appkey
     * @param operateDTO
     * @return
     */
    @PostMapping(value = "v2/ivh/streammanager/streamservice/closesession", produces = MediaType.APPLICATION_JSON_UTF8_VALUE, consumes = "application/json;charset=UTF-8")
    VhResponseDTO<Object> closeSession(@RequestParam("timestamp") long timestamp,
                                       @RequestParam("signature") String signature,
                                       @RequestParam("appkey") String appkey,
                                       @RequestBody VhOperateDTO operateDTO);

注意:

1、多个播报指令播报时,需要监听该会话下播报【结束】的状态再发送,否则播报指令将可能出现丢失,数智人只播报最新的一条指令。

2、播放流采用rtmp协议时,视频会存在3s左右的延迟,请妥善处理播报监听状态,以及数智人结束时的操作时机

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
要在Android Studio中连接腾讯云MySQL云数据库,需要进行以下步骤: 1. 在腾讯云控制台中创建一个MySQL云数据库实例,并创建一个数据库和一个或多个表。 2. 在腾讯云云数据库实例的安全组中添加一个入站规则,允许来自Android应用程序的IP地址和端口访问数据库。 3. 在Android Studio项目中添加MySQL数据库的Java连接器依赖项。常见的MySQL连接器依赖项是mysql-connector-java。 4. 在Android Studio项目中创建一个Java类,并在该类中编写连接腾讯云MySQL云数据库的Java代码。以下是一个示例代码: ```java import java.sql.*; public class MySQLConnection { static final String JDBC_DRIVER = "com.mysql.jdbc.Driver"; static final String DB_URL = "jdbc:mysql://你的数据库IP地址:你的数据库端口号/你的数据库名称"; static final String USER = "你的数据库用户名"; static final String PASS = "你的数据库密码"; public static void main(String[] args) { Connection conn = null; Statement stmt = null; try{ Class.forName(JDBC_DRIVER); System.out.println("连接数据库..."); conn = DriverManager.getConnection(DB_URL,USER,PASS); System.out.println("实例化Statement对象..."); stmt = conn.createStatement(); String sql; sql = "SELECT id, name, age FROM user"; ResultSet rs = stmt.executeQuery(sql); while(rs.next()){ int id = rs.getInt("id"); String name = rs.getString("name"); int age = rs.getInt("age"); System.out.print("ID: " + id); System.out.print(", 名称: " + name); System.out.println(", 年龄: " + age); } rs.close(); stmt.close(); conn.close(); }catch(SQLException se){ se.printStackTrace(); }catch(Exception e){ e.printStackTrace(); }finally{ try{ if(stmt!=null) stmt.close(); }catch(SQLException se2){ } try{ if(conn!=null) conn.close(); }catch(SQLException se){ se.printStackTrace(); } } System.out.println("Goodbye!"); } } ``` 5. 编译并运行Java类,以确保它能够连接到腾讯云MySQL云数据库并读取数据。 6. 现在可以在Android应用程序中使用相同的Java代码来连接腾讯云MySQL云数据库。可以在Android应用程序中使用异步任务或线程来避免在主线程中执行长时间的数据库操作。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值