小程序实现语音识别功能

news/2024/7/20 1:35:45 标签: 小程序, 语音识别, 人工智能, vue.js

在这里插入图片描述
不废话,直接上代码

<template>
  <view>
    <u-popup
      round="16" :show="recordShow" :close-on-click-overlay="false"
      :safe-area-inset-bottom="false"
      @close="close"
      @open="open"
    >
      <view class="tag-popup-box">
        <view class="title">
          <text>{{ tips }}</text>
          <image
            src=""
            @click="close"
          />
        </view>
        <view class="voice-box" @touchstart="startRecord" @touchend="stopRecord" @touchcancel="stopRecord">
          <image
            src=""
            class="voice-icon"
          />
        </view>
      </view>
    </u-popup>
  </view>
</template>
<script setup lang="ts">
import {onMounted, ref, watch} from "vue";
let start = false
const tips = ref<string>('按住开始录音')
const props = defineProps({
  show: {
    type: Boolean,
    default: false
  }
})
const manager = ref<any>()
const emits = defineEmits(['update:show','startRecord','textChange','micInput'])

const startRecord = async () => {
  if (start) return // 防止还在识别中时又触发录音
  console.log('touch started')
  tips.value = '准备中...'
  try {
    await checkPermission()
  } catch (e) {
    tips.value = '需要授权'
    return
  }
  manager.value.start()
  emits("startRecord")
}

const stopRecord = () => {
  if (!start) return // 触发极短时间,stop会在还未start的情况下触发
  console.log('touch ended or canceled')
  manager.value.stop()
}


watch(() => props.show, (value) => {
  recordShow.value = value
})

const recordShow = ref<boolean>(props.show)
const open = () => {
  manager.value = requirePlugin("WechatSI").getRecordRecognitionManager()
  // recordShow.value = true
  manager.value.onStart = (e:any) => {
    console.log('on-start')
    console.log(e)
    start = true
    tips.value = '正在识别...'
  }
  manager.value.onStop = (e:any) => {
    console.log('on-stop')
    console.log(e)
    start = false
    if (e.result){
      tips.value = '按住开始录音'
      emits("micInput", e.result)
    } else {
      tips.value = '识别失败,请重试'
    }
  }
  manager.value.onRecognize = (e:any) => {
    console.log('on-recognize')
    console.log(e)
  }
  manager.value.onError = (e:any) => {
    console.log('on-error')
    console.log(e)
    start = false
    tips.value = '识别失败,请重试'
  }
}
const close = () => {
  recordShow.value = false
  emits('update:show', recordShow.value)
}


const  checkPermission = async () => {
  const sRes = await uni.getSetting()
  if (sRes.authSetting['scope.record']) return
  try {
    const aRes = await uni.authorize({
      scope: 'scope.record'
    })
  } catch (e) {
    const mRes = await uni.showModal({
      title: '授权',
      content: '请打开 录音功能 权限以便进行语音识别',
      showCancel: true,
    })
    if (mRes.cancel) throw new Error('授权失败')
    const sRes = await uni.openSetting()
    if (sRes.authSetting['scope.record']) {
      uni.showModal({
        title: '授权成功',
        content: '请继续点击下方按钮 进行语音输入',
        showCancel: false
      })
      throw new Error('授权成功')
    }
    throw new Error('授权失败')
  }
}
</script>
<style scoped lang="scss">
.tag-popup-box{
  height: 524rpx;
  background: #FFFFFF;
  width: 100%;
  padding: 40rpx 40rpx 0 ;
  box-sizing: border-box;
  border-radius: 32rpx 32rpx 0rpx 0rpx;
  .voice-box{
    width: 100%;
    display: flex;
    justify-content: center;
    margin-top: 60rpx;
    .voice-icon{
      width: 180rpx;
      height: 180rpx;
    }
  }

  .title{
    display: flex;
    justify-content: space-between;
    align-items: center;
    margin-bottom: 60rpx;
    &>text{
      font-size: 30rpx;
      font-family: PingFangSC-Medium, PingFang SC;
      font-weight: 500;
      color: #333333;
      line-height: 44rpx;
    }
    &>image{
      width: 44rpx;
      height: 44rpx;
    }
  }
  .content{
    width: 100%;
    height: 96rpx;
    background: rgba(153, 153, 153, 0.08);
    border-radius: 12rpx;
    padding: 0 26rpx;
    box-sizing: border-box;
  }
  .confirm-btn{
    margin-top: 138rpx;
    width: 100%;
    height: 80rpx;
    text-align: center;
    background: #07B780;
    border-radius: 8rpx;
    font-size: 28rpx;
    font-family: PingFangSC-Regular, PingFang SC;
    font-weight: 400;
    color: #FFFFFF;
    line-height: 80rpx;
  }
}
</style>

http://www.niftyadmin.cn/n/5184066.html

相关文章

第三方软件测试服务有哪些形式?选择时如何避雷?

高新技术的快速发展&#xff0c;人们对于软件产品越来越依赖&#xff0c;因此软件质量对于软件企业来说至关重要。产品质量的好坏需要通过检测才得知&#xff0c;软件企业为了获得更客观公正的检验结果&#xff0c;会将软件测试交由第三方软件测试服务机构进行?那么有哪些形式…

使用 com.jacob.activeX 库实现 Word 到 PDF

使用 com.jacob.activeX 库实现 Word 到 PDF 的转换涉及到使用 Java 和 Microsoft Office 的 COM 自动化。JACOB&#xff08;Java COM Bridge&#xff09;库提供了一个桥接器&#xff0c;允许 Java 代码通过 COM&#xff08;组件对象模型&#xff09;与 Windows 应用程序&#…

(三)什么是Vite——Vite 主体流程(运行npm run dev后发生了什么?)

什么是vite系列目录: &#xff08;一&#xff09;什么是Vite——vite介绍与使用-CSDN博客 &#xff08;二&#xff09;什么是Vite——Vite 和 Webpack 区别&#xff08;冷启动&#xff09;-CSDN博客 &#xff08;三&#xff09;什么是Vite——Vite 主体流程(运行npm run dev…

数据挖掘 决策树

# 编码声明&#xff0c;并不是注释&#xff0c;而是一种特殊的源文件指令&#xff0c;用于指定文件的字符编码格式 # -*- coding: utf-8 -*-import pandas as pd # 提供了DataFrame等数据结构 from sklearn.tree import DecisionTreeClassifier, export_graphviz # 决策树分类…

决策树的Boosting策略是什么

在决策树的Boosting策略中&#xff0c;最常见的算法是梯度提升决策树&#xff08;Gradient Boosting Decision Trees&#xff0c;简称GBDT&#xff09;。GBDT是一种集成学习方法&#xff0c;通过串行训练多个决策树&#xff0c;并根据前一个树的预测结果来调整下一个树的训练目…

Ps:利用 AI 技术创建人像皮肤图层蒙版

Photoshop 并没有提供专门选择人像皮肤的工具或命令&#xff08;色彩范围中的肤色选择非常不精准&#xff09;&#xff0c;但较新版的 Camera Raw 滤镜则提供了基于 AI 技术的选择人物并创建面部和身体皮肤蒙版的功能。 如果能将 Camera Raw 滤镜中创建的 AI 皮肤蒙版转换成 Ps…

posix定时器的使用

POSIX定时器是基于POSIX标准定义的一组函数&#xff0c;用于实现在Linux系统中创建和管理定时器。POSIX定时器提供了一种相对较高的精度&#xff0c;可用于实现毫秒级别的定时功能。 POSIX定时器的主要函数包括&#xff1a; timer_create()&#xff1a;用于创建一个定时器对象…

计算机毕业设计选题推荐-二手交易跳蚤市场微信小程序/安卓APP-项目实战

✨作者主页&#xff1a;IT毕设梦工厂✨ 个人简介&#xff1a;曾从事计算机专业培训教学&#xff0c;擅长Java、Python、微信小程序、Golang、安卓Android等项目实战。接项目定制开发、代码讲解、答辩教学、文档编写、降重等。 ☑文末获取源码☑ 精彩专栏推荐⬇⬇⬇ Java项目 Py…