基于阿里云微信小程序语音识别

页面效果
在这里插入图片描述
其中采用阿里云语音识别:阿里云一句话语音识别

语音识别页面


<template><view><view class="chat_list"><view v-for="v in chatList" :class="v.type == 'right' ? 'type_right' : 'type_left'"><chat :text="v.result" :type="v.type"></chat></view></view><view :class="longPress == '1' ? 'record-layer' : 'record-layer1'"><view :class="longPress == '1' ? 'record-box' : 'record-box1'"><view class="record-btn-layer flex_row"><button v-show="longPress == '1'" class="record-btn-cir" @click="isKeyWord = !isKeyWord"><image v-if="!isKeyWord" :src="keyword" style=" margin-top: -8rpx;" /><image v-else :src="record" style=" margin-top: -8rpx;" /></button><button v-show="!isKeyWord" class="record-btn":class="longPress == '1' ? 'record-btn-1' : 'record-btn-2'":style="VoiceTitle != '松开手指,取消发送' && longPress != '1' ? 'background-image: linear-gradient(to top, #cfd9df 0%, #e2ebf0 100%);' : 'background-color: rgba(0, 0, 0, .5);color:white'"@longpress="longpressBtn" @touchend="touchendBtn()" @touchmove="handleTouchMove"><image :src="record" /><text>{{ VoiceText }}</text></button><u--input v-if="longPress == '1' && isKeyWord" shape="circle" customStyle="u_input" clearableplaceholder="请输入内容..." @confirm="confirmMsg"></u--input></view><!-- 语音音阶动画 --><view :class="VoiceTitle != '松开手指,取消发送' ? 'prompt-layer prompt-layer-1' : 'prompt-layer1 prompt-layer-1'"v-if="longPress == '2'"><view class="prompt-loader"><view class="em" v-for="(item, index) in 15" :key="index"></view></view><text class="span">{{ VoiceTitle }}</text></view></view></view></view>
</template><script>
const recorderManager = uni.getRecorderManager()
const SpeechRecognition = require("../../utils/sr")
const getToken = require("../../utils/token").getToken
import keyword from '../public/images/keyword.png'
import record from '../public/images/record.png'
import chat from './com/chat.vue'
export default {components: { chat },data() {return {record,keyword,longPress: '1', // 1显示 按住 说话 2显示 说话中delShow: false, // 删除提示框显示隐藏time: 0, //录音时长duration: 60000, //录音最大值ms 60000/1分钟tempFilePath: '', //音频路径startPoint: {}, //记录长按录音开始点信息,用于后面计算滑动距离。sendLock: true, //发送锁,当为true时上锁,false时解锁发送VoiceTitle: '松手结束录音',VoiceText: '按住 说话',token: "",srStart: false,srResult: {},sr: null,isKeyWord: false,chatList: []}},async onLoad() {recorderManager.onFrameRecorded((res) => {if (this.sr && this.srStart) {if (res.frameBuffer) {console.log("send " + res.frameBuffer.byteLength)this.sr.sendAudio(res.frameBuffer)}}})recorderManager.onStop(async (res) => {if (this.sendLock) {//上锁不发送} else {//解锁发送,发送网络请求if (res.duration < 1000) {wx.showToast({title: "录音时间太短",icon: "none",duration: 1000});await this.sr.close()this.srStart = false}else {// this.tempFilePath = res.tempFilePathawait this.sr.close()this.srStart = falsethis.srResult.payload.type = 'right'this.chatList.push(this.srResult.payload)console.log('this.chatList.', this.chatList);}}})try {let token = await getToken('your akid','your akkey')this.token = token} catch (e) {console.log("error on get token:", JSON.stringify(e))}},onUnload: function () {this.srStart = falserecorderManager.stop()if (this.sr) {this.sr.shutdown()}},methods: {initSt() {const sr = new SpeechRecognition({url: 'wss://nls-gateway-cn-shanghai.aliyuncs.com/ws/v1',appkey: 'your app key',token: this.token})console.warn("sr 初始化成功")sr.on("started", (msg) => {console.log("Client recv started", JSON.parse(msg))})sr.on("changed", (msg) => {console.log("Client recv changed:", JSON.parse(msg))this.srResult = JSON.parse(msg)})sr.on("completed", (msg) => {console.log("Client recv completed:", JSON.parse(msg))this.srResult = JSON.parse(msg)})sr.on("failed", (msg) => {console.log("Client recv failed:", JSON.parse(msg))})sr.on("closed", () => {console.error("sr 连接已关闭")})this.sr = sr},// 长按录音事件async longpressBtn(e) {recorderManager.start({duration: 600000,numberOfChannels: 1,sampleRate: 16000,format: "PCM",frameSize: 4})this.initSt()this.startPoint = e.touches[0];//记录长按时开始点信息,后面用于计算上划取消时手指滑动的距离。this.longPress = '2';this.VoiceText = '说话中...';if (!this.sr || this.srStart) {return}try {await this.sr.start(this.sr.defaultStartParams())this.srStart = true} catch (e) {console.log("start failed:" + e)return}// 监听音频开始事件this.sendLock = false;//长按时是不上锁的。},// 长按松开录音事件touchendBtn() {this.longPress = '1';this.VoiceText = '按住 说话';this.VoiceTitle = '松手结束录音'recorderManager.stop();},// 删除录音handleTouchMove(e) {//touchmove时触发var moveLenght = e.touches[e.touches.length - 1].clientY - this.startPoint.clientY; //移动距离if (Math.abs(moveLenght) > 70) {this.VoiceTitle = "松开手指,取消发送";this.VoiceText = '松开手指,取消发送';this.delBtn()this.sendLock = true;//触发了上滑取消发送,上锁} else {this.VoiceTitle = "松手结束录音";this.VoiceText = '松手结束录音';this.sendLock = false;//上划距离不足,依然可以发送,不上锁}},delBtn() {this.delShow = false;this.time = 0// this.tempFilePath = '';// this.VoiceTitle = '松手结束录音'},}
}
</script><style lang="scss">
/* 语音录制开始--------------------------------------------------------------------- */
.record-layer {width: 91vw;box-sizing: border-box;height: 15vw;position: fixed;margin-left: 4vw;z-index: 10;bottom: 2vh;
}.record-layer1 {width: 100vw;box-sizing: border-box;height: 100vh;position: fixed;background-color: rgba(0, 0, 0, .6);z-index: 10;bottom: 0vh;
}.record-box {width: 100%;position: relative;
}.record-box1 {width: 100%;position: relative;bottom: -83vh;height: 17vh;
}.record-btn-layer {// width: 100%;
}.record-btn-layer button::after {border: none;transition: all 0.1s;
}.record-btn-layer button {font-size: 14px;line-height: 40px;width: 100%;height: 40px;text-align: center;transition: all 0.1s;
}.record-btn-layer button image {width: 16px;height: 16px;margin-right: 4px;vertical-align: middle;transition: all 0.3s;
}.record-btn-layer .record-btn-2 {border-radius: 168rpx 168rpx 0 0;height: 17vh;line-height: 17vh;transition: all 0.3s;
}/* 提示小弹窗 */
.prompt-layer {border-radius: 15px;background: #95EB6C;padding: 8px 16px;box-sizing: border-box;position: absolute;left: 50%;height: 11vh;transform: translateX(-50%);transition: all 0.3s;
}.prompt-layer::after {content: '';display: block;border: 12px solid rgba(0, 0, 0, 0);border-radius: 10rpx;border-top-color: #95EB6C;position: absolute;bottom: -46rpx;left: 50%;transform: translateX(-50%);transition: all 0.3s;
}//取消动画
.prompt-layer1 {border-radius: 15px;background: #FB5353;padding: 8px 16px;box-sizing: border-box;position: absolute;left: 50%;height: 11vh;transform: translateX(-50%);transition: all 0.3s;
}.prompt-layer1::after {content: '';display: block;border: 12px solid rgba(0, 0, 0, 0);border-radius: 10rpx;border-top-color: #FB5353;position: absolute;bottom: -46rpx;left: 50%;transform: translateX(-50%);transition: all 0.3s;
}.prompt-layer-1 {font-size: 12px;width: 150px;text-align: center;display: flex;flex-direction: column;align-items: center;justify-content: center;top: -400rpx;
}.prompt-layer-1 .p {color: #000000;
}.prompt-layer-1 .span {color: rgba(0, 0, 0, .6);
}.prompt-loader .em {}/* 语音音阶------------- */
.prompt-loader {width: 96px;height: 20px;display: flex;align-items: center;justify-content: space-between;margin-bottom: 6px;
}.prompt-loader .em {display: block;background: #333333;width: 1px;height: 10%;margin-right: 2.5px;float: left;
}.prompt-loader .em:last-child {margin-right: 0px;
}.prompt-loader .em:nth-child(1) {animation: load 2.5s 1.4s infinite linear;
}.prompt-loader .em:nth-child(2) {animation: load 2.5s 1.2s infinite linear;
}.prompt-loader .em:nth-child(3) {animation: load 2.5s 1s infinite linear;
}.prompt-loader .em:nth-child(4) {animation: load 2.5s 0.8s infinite linear;
}.prompt-loader .em:nth-child(5) {animation: load 2.5s 0.6s infinite linear;
}.prompt-loader .em:nth-child(6) {animation: load 2.5s 0.4s infinite linear;
}.prompt-loader .em:nth-child(7) {animation: load 2.5s 0.2s infinite linear;
}.prompt-loader .em:nth-child(8) {animation: load 2.5s 0s infinite linear;
}.prompt-loader .em:nth-child(9) {animation: load 2.5s 0.2s infinite linear;
}.prompt-loader .em:nth-child(10) {animation: load 2.5s 0.4s infinite linear;
}.prompt-loader .em:nth-child(11) {animation: load 2.5s 0.6s infinite linear;
}.prompt-loader .em:nth-child(12) {animation: load 2.5s 0.8s infinite linear;
}.prompt-loader .em:nth-child(13) {animation: load 2.5s 1s infinite linear;
}.prompt-loader .em:nth-child(14) {animation: load 2.5s 1.2s infinite linear;
}.prompt-loader .em:nth-child(15) {animation: load 2.5s 1.4s infinite linear;
}@keyframes load {0% {height: 10%;}50% {height: 100%;}100% {height: 10%;}
}/* 语音音阶-------------------- */
.prompt-layer-2 {top: -40px;
}.prompt-layer-2 .text {color: rgba(0, 0, 0, 1);font-size: 12px;
}/* 语音录制结束---------------------------------------------------------------- */
.flex_row {display: flex;flex-direction: row;gap: 10rpx
}.record-btn-cir {flex-basis: 100rpx;border-width: 0.5px !important;border-color: #dadbde !important;border-style: solid;
}.u_input {border-width: 0.5px !important;border-color: #dadbde !important;border-style: solid;
}.record-btn-layer .record-btn-1 {background: #fff !important;// background-image: linear-gradient(to right, #43e97b 0%, #38f9d7 100%);color: #000000 !important;border-width: 0.5px !important;border-color: #dadbde !important;border-style: solid;border-radius: 8px;
}.chat_list {padding-top: 30rpx;max-height: 86vh;overflow-y: scroll;
}.type_right {margin: 30rpx 0 30rpx 50%;
}.type_left {margin: 30rpx 0 30rpx 30rpx;
}
</style>

聊天组件

<template><view class="box"><view class="qpk">{{ text }}</view><view :class="type == 'right' ? 'triangle_right' : 'triangle_left'"></view></view>
</template><script>
export default {props: {text: {type: String,default: ""},type: {type: String,default: "right"}},data() {return {};},watch: {},methods: {},
};
</script>
<style lang="scss" scoped>
// 气泡框样式
.box {position: relative;.qpk {width: 300rpx;height: 100%;text-align: left;background: #43e97b !important;-webkit-border-radius: 10px;-moz-border-radius: 10px;border-radius: 10px;word-break: break-all;padding: 18rpx 20rpx;font-size: 14px;}.triangle_left {position: absolute;height: 0px;width: 0px;border-width: 8px 18px 8px 0;border-style: solid;border-color: transparent #43e97b transparent transparent;top: 8rpx;left: -26rpx;}.triangle_right {position: absolute;height: 0px;width: 0px;border-width: 8px 0px 8px 18px;border-style: solid;border-color: transparent transparent transparent #43e97b;top: 8rpx;left: 326rpx;}
}
</style>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/41848.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

飞讯管理员端群组部分完整版实现

群组概括信息页面&#xff1a; /GroupBrief 需要展示有关群组的概括信息&#xff0c;包括群组的组成占比&#xff0c;群组数量&#xff0c;不同群组的数量&#xff0c;均可视化展示 群组有六个种类 Public Work Meeting AVChatRoom Community Private 使用一个一维数组存储…

快速开发智能硬件,阿里云AIoT首期云端一体训练营开麦了

6月10号&#xff0c;阿里云AIoT面向智能硬件开发者发起首期云端一体物联网开发训练营&#xff0c;免费报名火热开启&#xff0c;为期5天干货详解&#xff0c;内容覆盖阿里云Cloud AIoT Native架构中多个核心产品&#xff0c;包括物联网平台、IoT Studio、HaaS开发板&#xff0c…

微信小程序+云函数+腾讯云对话机器人API(ChatBot)

文章目录 前言 一、小程序云开发是什么&#xff1f; 二、步骤 1. 在app.js中绑定好云环境id&#xff0c;并且选好当前环境以及选好云文件夹 2. 去到腾讯云API Explorer中选好Region地区和Query这个必填参数&#xff0c;然后进行代码生成 3. 在上面的API Explorer网站点击前往获…

001,Python微信接龙脚本与腾讯会议定时挂网课脚本

目录 前言: 微信接龙: 腾讯会议: 前言: 这是我的第一篇博客,看到一个视频,推荐写写博客来验证所学,觉得很有道理,就来写一个. 这两个脚本是我的处女作,还有很多不完善的地方,但重点是能跑..... 系统是win11 微信接龙: 我使用的wxauto库,pip install wxauto就行,不过需要…

如何用网易邮箱大师登录QQ邮箱账号

非常无语&#xff0c;非常不理解为什么QQ邮箱整这么多幺蛾子&#xff1f; 问题描述&#xff1a; 登陆的时候&#xff0c;问你是否有授权码&#xff0c;如果有用授权码登录&#xff08;注意不是QQ密码&#xff09;&#xff1b;如果没有&#xff0c;就需要获取授权码。 获取授权…

利用masigpro包进行时间序列分析

这边文章的代码主要源于网上已有的精品推文&#xff0c;根据自身数据和作图时出现的报错“Error in plot.new() : figure margins too large”进行了个性化修改 值得注意的是&#xff1a;maSigPro软件包主要用于差异基因分析&#xff0c;因此其内置的函数和方法都是基于差异基…

文末赠书 | 基于python的《AI医学图像处理》

关注我们丨文末赠书 说到生成型人工智能ChatGPT&#xff0c;恐怕没人不知道吧&#xff1f; 毫无意外&#xff0c;它也对医疗界产生了不小震撼。不仅能够书写医疗论文、提供问诊服务&#xff0c;甚至连影像医生的饭碗都要抢—— 有网友把OpenAI的GPT3.0系统接入了自家服务器&…

GPT免费好用,国内手机用户人人可玩!

使用ChatGPT已经成为我生活中不可或缺的一部分&#xff0c;它太好用了&#xff01;无论是写作、编程还是日常咨询搜索&#xff0c;我都可以全部交给它处理。但是&#xff0c;很少有人知道如何在手机上使用GPT。对于大多数普通用户来说&#xff0c;想要在手机上使用GPT&#xff…

阿里发布免费的全新可变字体;Stability AI CEO:5年内,人类程序员将不复存在;Perl 5.38发布|极客头条...

「极客头条」—— 技术人员的新闻圈&#xff01; CSDN 的读者朋友们早上好哇&#xff0c;「极客头条」来啦&#xff0c;快来看今天都有哪些值得我们技术人关注的重要新闻吧。 整理 | 梦依丹 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 一分钟速览新闻点&#…

抖音多闪背后的AI和社交

https://www.toutiao.com/a6646710308825989636/ 2019-01-16 08:16:00 通过多闪发布会现场可知字节跳动创始人张一鸣并没有出场&#xff0c;而是给了95年颜值正义的小姑娘徐璐冉一个靠前的产品经理的位子。我们姑且不去猜这门安排的意义。 本文主要讨论抖音多闪产品背后都用到…

Python音视频开发:消除抖音短视频Logo的图形化工具实现

☞ ░ 前往老猿Python博文目录 ░ 一、引言 在《Python音视频开发&#xff1a;消除抖音短视频Logo和去电视台标的实现详解》节介绍了怎么通过PythonMoviepyOpenCV实现消除视频Logo的四种方法&#xff0c;并提供了详细的实现思路和实现代码&#xff0c;但这种原生态的应用不适…

元宇宙系列--用AI数字人物进行抖音直播

目前抖音无人直播比较普及&#xff0c;从起初的挤火车&#xff0c;云蹦迪&#xff0c;冲马桶&#xff0c;随后比较火的广场舞、过马路等等一系列的抖音互动游戏直播。 以上都是一个软件可以完成&#xff0c;非常容易被抖音禁播。近期已经有不少直播互动游戏被禁播了。 现在来介…

每秒最高1w+使用量,「AI绘画」成抖音年度爆款,背后技术秘籍现已公开

允中 发自 凹非寺来源 | 量子位 QbitAI 「AI绘画」是2022年抖音上最火的一款特效玩法&#xff0c;用户只要输入一张图片&#xff0c;AI就会根据图片生成一张动漫风格的图片。 由于生成的图片效果带有一定的“盲盒”属性 &#xff0c;画风精致唯美中又带着些许的蠢萌和无厘头&am…

用AI人脸识别技术实现抖音特效

♚ 李远君 &#xff0c;Web和云计算开发人员。Java&#xff0c;Python&#xff0c;Golang爱好者。 个人网址&#xff1a;https://tomoncle.com 本文作者已加入Python中文社区专栏作者计划 导言 为什么会写这个人脸例子&#xff1f; 浏览博客的过程&#xff0c;无意发现了一篇名…

Github 热度飙升,一键生成最近抖音超火的 AI 人物绘图

点击关注公众号&#xff0c;利用碎片时间学习 Paper2GUI 是一款面向普通人的 AI 桌面 APP 工具箱&#xff0c;免安装即开即用&#xff0c;已支持20AI 模型&#xff0c;内容涵盖语音合成、视频补帧、视频超分、目标检测、图片风格化、OCR 识别等领域。支持 Windows、Mac、Linux …

抖音一键生成的AI绘画火了,网友惊呼:有点东西

在各大AI绘画软件争奇斗艳的时候&#xff0c;近期最火的AI绘画莫过于抖音一键生成的AI绘画特效&#xff0c;网友惊呼&#xff1a;有点东西。 就连最近话题度超高的“汪小菲”&#xff0c;也用AI绘画来“秀”恩爱了。 AI绘画识别度还挺高&#xff0c;特别是关于大白志愿者的生成…

讯飞语音的中的bug用户校验失败

用户校验失败&#xff1a;原因是目录没有复制粘贴正确. 下面是刚刚下载的SDK目录: 下面的是自己Android工程中的目录&#xff1a;注意复制粘贴的文件路径要正确 转载于:https://www.cnblogs.com/Oldz/p/9620359.html

Android端科大讯飞语音应用开发

创建语音应用及sdk集成 讯飞开放平台网址 网址&#xff1a;http://www.xfyun.cn/ 1.注册讯飞账号,我以前注册过就直接登录了,创建应用(注:创建过的应用不能被删除)2.创建应用名称规范: 名称_平台类型3.这里显示你的APPID,应用的唯一标示4.创建完成之后现在并没什么卵用,还需要…

python3讯飞语音识别

#!/usr/bin/python # -*- coding: UTF-8 -*- import urllib.parse, urllib.request #这是python3&#xff0c;原先py2里的urllib2或者其他都包含在了py3的urllib里了&#xff0c; # py3里的urllib里的parse和request一定要这么导入&#xff0c;直接import urllib # 是不行的imp…

移动开发-语音识别-调用讯飞平台提供的API

1 登录讯飞平台&#xff0c;申请账号&#xff0c;创建一个应用 具体步骤可以百度查找 2 进入“我的应用”&#xff0c;下载相应的SDK文件 选择语音听写&#xff08;流式版&#xff09;-> Android MSC 3 打开安卓&#xff0c;新建项目 创建一个EditText和一个Button &…