Skip to content

使用方法

安卓讯飞虚拟数字人交互UTS原生插件是基于虚拟人SDK是基于科大讯飞虚拟人相关能力进行融合和封装的UTS插件,以便为客户提供更便捷的接入方式,快速打造属于自己的虚拟人业务场景。插件支持uniapp和uniapp x,支持vue2和vue3的选项式和组合式

注意

如果插件不符合你的要求可以联系作者优化

插件使用注意事项

  • 如果您在使用插件的过程中有任何问题,可以联系作者,作者将全力协助您使用插件
  • 本文档同时提供了uniapp的用法示例和uniappx的用法示例,插件市场导入的示例项目仅为uniapp的用法示例,如果您需要uniappx的示例项目可以通过下方的链接下载示例

https://pan.baidu.com/s/1qAW_RBoSvv2R-xzsHZYlng?pwd=urr1

sdk文档地址

https://www.yuque.com/xnrpt/bbc1du/nvg8cabgl4ycqvtv

联系作者

关注微信公众号可联系作者

插件地址

https://ext.dcloud.net.cn/plugin?id=28317

使用流程

  1. 初始化sdk
  2. 创建播放器 创建播放器需要在组件中使用,调用组件的创建播放器的方法
  3. 设置虚拟人参数
  4. 开启虚拟人
  5. 发送虚拟人数据

API用法

在使用插件的地方引入以下代码:

js
import * as module from "@/uni_modules/leven-uts-avatar"
js
import * as module from "@/uni_modules/leven-uts-avatar"

组件用法

在使用插件的地方引入以下代码:

vue
<leven-uts-avatar ref="refXfAvatarPlayer" style="height: 500px;" :config="config" @onEventMethod="onEventMethod"
      @onError="onError" @onEvent="onEvent"></leven-uts-avatar>
vue
<leven-uts-avatar ref="refAvatarPlayer" style="height: 500px;" :configX="config" @onEventMethod="onEventMethod"
      @onError="onError" @onEvent="onEvent"></leven-uts-avatar>

//组件的引用
const refAvatarPlayer = ref<LevenUtsAvatarElement | null>(null)

用法示例

api用法示例

vue
<template>
  <view class="content">
    <!-- sdk版本号 -->
    <sdk-version-nvue @onComMessage="onComMessage"></sdk-version-nvue>
    <!-- sdk初始化 -->
    <init-nvue :permissonIsEnd="permissonIsEnd" @onComMessage="onComMessage"></init-nvue>
    <!-- 全局参数设置 -->
    <global-params-nvue @onCreatePlayer="createPlayer"></global-params-nvue>
    <!-- 文本驱动交互 -->
    <text-active-nvue></text-active-nvue>
    <!-- 播放器组件 -->
    <player-nvue ref="refPlayer"></player-nvue>
  </view>
</template>

<script>
  import sdkVersionNvue from './component/sdk-version.nvue';
  import initNvue from './component/init.nvue';
  import globalParamsNvue from './component/global-params.nvue';
  import playerNvue from './component/player.nvue';
  import textActiveNvue from './component/text-active.nvue';
  import * as module from "@/uni_modules/leven-uts-avatar"
  export default {
    components: {
      sdkVersionNvue,
      initNvue,
      globalParamsNvue,
      playerNvue,
      textActiveNvue
    },
    data() {
      return {
        //权限是否申请结束
        permissonIsEnd: false
      }
    },
    mounted() {
      this.$nextTick(() => {
        this.requestPermissions();
      })
    },
    methods: {
      //显示消息
      showMessage(message) {
        uni.showToast({
          title: message,
          icon: "none"
        })
      },
      createPlayer(data) {
        this.$refs.refPlayer.createPlayer(data);
      },
      toAllFilesPermissionPage() {
        module.toAllFilesPermissionPage({
          complete: (res) => {
            if (res.code == 0) {
              let data = res.data;
              if (!data.status) {
                this.showMessage("所有文件访问权限未打开")
              } else {
                this.showMessage("权限申请完成,可以使用插件")
                this.permissonIsEnd = true;
              }
            } else {
              this.showMessage(res.message)
            }
          }
        })
      },
      checkAllFilesPermission() {
        module.checkAllFilesPermission({
          complete: (res) => {
            if (res.code == 0) {
              let data = res.data;
              if (!data.status) {
                this.toAllFilesPermissionPage();
              } else {
                this.showMessage("权限申请完成,可以使用插件")
                this.permissonIsEnd = true;
              }
            } else {
              this.showMessage(res.message)
            }
          }
        })
      },
      //申请插件所需权限
      requestPermissions() {
        module.requestPermissions({
          params: {
            permissions: [
              "android.permission.READ_EXTERNAL_STORAGE",
              "android.permission.WRITE_EXTERNAL_STORAGE",
              "android.permission.RECORD_AUDIO",
              "android.permission.READ_PHONE_STATE"
            ]
          },
          complete: (res) => {
            if (res.code == 0) {
              //判断是否有所有文件访问权限
              this.checkAllFilesPermission();
            } else {
              this.showMessage(res.message)
            }
          }
        })
      },
      onComMessage(e) {
        this.showMessage(e)
      }
    }
  }
</script>

<style>

</style>
vue
<template>
  <!-- #ifdef APP -->
  <scroll-view style="flex:1">
  <!-- #endif -->
    <!-- sdk版本号 -->
    <sdk-version @onComMessage="showMessage"></sdk-version>
    <!-- sdk初始化 -->
    <init-vue :permissonIsEnd="permissonIsEnd" @onComMessage="showMessage"></init-vue>
    <!-- 全局参数设置 -->
    <global-params-vue @onCreatePlayer="createPlayer"></global-params-vue>
    <!-- 文本驱动交互 -->
    <text-active></text-active>
    <!-- 播放器组件 -->
    <avatar-player ref="refPlayer"></avatar-player>
  <!-- #ifdef APP -->
  </scroll-view>
  <!-- #endif -->
</template>

<script setup lang="uts">
  import SdkVersion from "./components/sdk-version.uvue"
  import InitVue from "./components/init.uvue"
  import globalParamsVue from "./components/global-params.uvue";
  import AvatarPlayer from "./components/avatar-player.uvue";
  import TextActive from "./components/text-active.uvue"
  import * as module from "@/uni_modules/leven-uts-avatar"
  import { LevenResult, LevenOptions } from "@/uni_modules/leven-uts-avatar"

  const permissonIsEnd = ref<boolean>(false)
  const refPlayer = ref<ComponentPublicInstance | null>(null)

  function showMessage(message : string) {
    uni.showToast({
      title: message,
      icon: "none"
    })
  }

  function createPlayer(data : UTSJSONObject) {
    refPlayer.value?.$callMethod("createPlayer", data)
  }

  function toAllFilesPermissionPage() {
    module.toAllFilesPermissionPage({
      complete: (res : LevenResult) => {
        if (res.code == 0) {
          let data = res.data;
          let status = data.getBoolean("status")!
          if (!status) {
            showMessage("所有文件访问权限未打开")
          } else {
            showMessage("权限申请完成,可以使用插件")
            permissonIsEnd.value = true
          }
        } else {
          showMessage(res.message)
        }
      }
    })
  }

  function checkAllFilesPermission() {
    module.checkAllFilesPermission({
      complete: (res : LevenResult) => {
        if (res.code == 0) {
          let data = res.data;
          let status = data.getBoolean("status")!
          if (!status) {
            toAllFilesPermissionPage();
          } else {
            showMessage("权限申请完成,可以使用插件")
            permissonIsEnd.value = true
          }
        } else {
          showMessage(res.message)
        }
      }
    } as LevenOptions)
  }

  //申请插件所需权限
  function requestPermissions() {
    module.requestPermissions({
      params: {
        permissions: [
          "android.permission.READ_EXTERNAL_STORAGE",
          "android.permission.WRITE_EXTERNAL_STORAGE"
        ]
      },
      complete: (res : LevenResult) => {
        if (res.code == 0) {
          //判断是否有所有文件访问权限
          checkAllFilesPermission();
        } else {
          showMessage(res.message)
        }
      }
    } as LevenOptions)
  }

  onMounted(() => {
    nextTick(() => {
      requestPermissions()
    })
  })
</script>

<style>

</style>

组件用法示例

vue
<template>
  <uni-card title="播放器组件">
    <leven-uts-avatar ref="refXfAvatarPlayer" style="height: 500px;" :config="config" @onEventMethod="onEventMethod"
      @onError="onError" @onEvent="onEvent"></leven-uts-avatar>
  </uni-card>
</template>

<script>
  export default {
    data() {
      return {
        config: {}
      }
    },
    methods: {
      createPlayer(data) {
        this.$refs.refXfAvatarPlayer.createPlayer({
          stream: data.stream,
          renderTimeout: data.renderTimeout
        })
      },
      onEventMethod(e) {
        // console.log("onEventMethod:" + JSON.stringify(e.detail))
      },
      onError(e) {
        console.log("onError:" + JSON.stringify(e.detail))
      },
      onEvent(e) {
        console.log("onEvent:" + JSON.stringify(e.detail))
      }
    }
  }
</script>

<style>

</style>
vue
<template>
  <lux-card title="播放器组件">
    <leven-uts-avatar ref="refAvatarPlayer" style="height: 500px;" :configX="config" @onEventMethod="onEventMethod"
      @onError="onError" @onEvent="onEvent"></leven-uts-avatar>
  </lux-card>
</template>

<script lang="uts" setup>
  import JSONObject from 'com.alibaba.fastjson.JSONObject'
  //组件引用
  const refAvatarPlayer = ref<LevenUtsAvatarElement | null>(null)

  const config = ref({})
  function createPlayer(data : UTSJSONObject) {
    // console.log("进入player: " + JSON.stringify(data))
    let params = JSONObject.parse(JSON.stringify(data)) as JSONObject
    refAvatarPlayer.value?.createPlayer(params)
  }

  function onEventMethod(e : JSONObject) {
    console.log("onEventMethod:" + JSON.stringify(e))
  }

  function onError(e : JSONObject) {
    console.log("onError:" + JSON.stringify(e))
  }

  function onEvent(e : JSONObject) {
    console.log("onEvent:" + JSON.stringify(e))
  }

  defineExpose({ createPlayer })
</script>

<style>

</style>

示例说明

本文档的用法示例仅为页面部分代码,完整代码请导入示例程序查看