仿三方智能对话分析原始会话窗口

设计效果如下:

设计要求如下:

1、顶部播放条播放时,文字内容自动滚动。

监听audio事件timeupdate,只要播放器在播放就会触发该事件。每行文字有开始时间begin。判断当前时间(currentTime)<=开始时间(begin)时,滚动到相应位置。

        // 监听当前播放时间和音频结束事件this.$refs.audioPlayer.addEventListener('timeupdate', () => {this.currentTime = this.$refs.audioPlayer.currentTime// 播放或拖动播放器文字滚动this.data.dialogue.some(item => {if (item.begin >= (this.currentTime * 1000)) {this.$refs.dialogue.scrollTop = this.$refs[item.begin][0].offsetTop - 300return true}})// 暂停播放if (this.endTime) {if (this.currentTime >= this.endTime) {this.$refs.audioPlayer.pause()this.endTime = 0}}})

2、点击文字边上的播放按钮,顶部播放器跳转到指定位置播放。

toPlay方法能拿到当前文字行的开始和结束时间(服务端给的),把播放器的当前时间设置成开始时间,结束时间设置给this.endTime,监听audio事件timeupdate中有判断:如果this.endTime存在且this.currentTime >= this.endTime,就暂停播放。

        // 文字播放按钮toPlay(begin, end) {this.$refs.audioPlayer.currentTime = begin / 1000this.$refs.audioPlayer.play()this.endTime = end / 1000},

3、倍速值扩展,增加2.5,3.0

audio的controls属性产生的默认播放器播放速度最大是2,直接扩展没找到解决办法。

通过属性controlslist="noplaybackrate nodownload"把他们隐藏了

noplaybackrate:隐藏播放速度

nodownload:隐藏下载

然后增加2个按钮(下载和倍速):

        <div class="audio-btns"><el-button type="text" class="each-btn" @click="toDownload">下载</el-button><el-popover placement="bottom" trigger="hover" width="300"><el-button type="text" v-for="(item, i) in rateConf" :key="i" @click="toPlaybackRate(item)">{{ item }}</el-button><el-button type="text" slot="reference" class="each-btn">倍速 {{ curRate === 1.0 ? '正常' : curRate }}</el-button></el-popover></div>

点击倍速效果如下:

倍速的实现方法:

        // 播放速度toPlaybackRate(rate) {this.curRate = ratethis.$refs.audioPlayer.playbackRate = rate},

this.curRate用于展示当前选中的倍速,this.$refs.audioPlayer.playbackRate是给播放器赋值为当前选中的倍速。

4、命中规则文字红色显示

getHitRuleWords方法如下:

        // 命中文字特殊显示,b标签占7个字节,所以在计算后面的from、to时要加上前面加进去的b标签getHitRuleWords(words, rule) {rule.forEach((item, i) => {let from = item.from + i * 7let to = item.to + i * 7words = words.slice(0, from) + '<b>' + words.slice(from, to) + '</b>' + words.slice(to)})return words}

完整代码(vue实现)如下:

<template>
<div class="audio-out"><div class="audio-top"><!-- 添加一个音频元素 --><audio ref="audioPlayer" preload="auto" controls controlslist="noplaybackrate nodownload" :src="data.audioUrl" style="width: 480px; height: 30px;"></audio><div class="audio-btns"><el-button type="text" class="each-btn" @click="toDownload">下载</el-button><el-popover placement="bottom" trigger="hover" width="300"><el-button type="text" v-for="(item, i) in rateConf" :key="i" @click="toPlaybackRate(item)">{{ item }}</el-button><el-button type="text" slot="reference" class="each-btn">倍速 {{ curRate === 1.0 ? '正常' : curRate }}</el-button></el-popover></div></div><div class="audio-layer" ref="dialogue"><div v-for="(item, i) in data.dialogue" :key="i" :ref="item.begin"><template v-if="item.role === '客户'"><!-- 用户 or 用户命中规则 --><div class="word-layer" :class="{'hit-rule': item.hitRuleInfoList.length > 0}"><div class="word-header"><el-button type="primary" icon="el-icon-user" circle></el-button></div><div class="word-cont"><div class="word-time">{{ item.hourMinSec }}</div><div class="word-text"><div><el-button class="play-btn" type="info" icon="el-icon-caret-right" circle @click="toPlay(item.begin, item.end)"></el-button></div><template v-if="item.hitRuleInfoList"><p class="text" v-html="getHitRuleWords(item.words, item.hitRuleInfoList)"></p></template><template v-else><p class="text">{{ item.words }}</p></template></div></div></div></template><template v-if="item.role === '客服'"><!-- 客服 --><div class="word-layer layer-r" :class="{'hit-rule': item.hitRuleInfoList.length > 0}"><div class="word-cont"><div class="word-time">{{ item.hourMinSec }}</div><div class="word-text"><template v-if="item.hitRuleInfoList"><p class="text" v-html="getHitRuleWords(item.words, item.hitRuleInfoList)"></p></template><template v-else><p class="text">{{ item.words }}</p></template><div><el-button class="play-btn" type="info" icon="el-icon-caret-right" circle @click="toPlay(item.begin, item.end)"></el-button></div></div></div><div class="word-header"><el-button type="info" icon="el-icon-service" circle></el-button></div></div></template></div></div>
</div>
</template><script>
export default {name: 'audioView',props: {data: {type: Object,default () {return {audioUrl: '',dialogue: []}}}},data() {return {currentTime: 0,endTime: 0,rateConf: [0.5, 0.75, 1.0, 1.25, 1.5, 1.75, 2.0, 2.5, 3.0],curRate: 1.0}},watch: {data(n) {if (Object.keys(n).length <= 0) {this.$refs.audioPlayer.pause()this.currentTime = 0this.endTime = 0}}},mounted() {// 当音频加载完成时,获取总时长并更新计算属性this.$refs.audioPlayer.addEventListener('loadedmetadata', () => {this.$refs.audioPlayer.pause()this.currentTime = 0this.endTime = 0this.toPlaybackRate(this.curRate)})// 监听当前播放时间和音频结束事件this.$refs.audioPlayer.addEventListener('timeupdate', () => {this.currentTime = this.$refs.audioPlayer.currentTime// 播放或拖动播放器文字滚动this.data.dialogue.some(item => {if (item.begin >= (this.currentTime * 1000)) {this.$refs.dialogue.scrollTop = this.$refs[item.begin][0].offsetTop - 300return true}})// 暂停播放if (this.endTime) {if (this.currentTime >= this.endTime) {this.$refs.audioPlayer.pause()this.endTime = 0}}})},methods: {// 播放速度toPlaybackRate(rate) {this.curRate = ratethis.$refs.audioPlayer.playbackRate = rate},// 命中文字特殊显示getHitRuleWords(words, rule) {rule.forEach((item, i) => {let from = item.from + i * 7let to = item.to + i * 7words = words.slice(0, from) + '<b>' + words.slice(from, to) + '</b>' + words.slice(to)})return words},// 文字播放按钮toPlay(begin, end) {this.$refs.audioPlayer.currentTime = begin / 1000this.$refs.audioPlayer.play()this.endTime = end / 1000},// 下载toDownload() {window.open(this.data.audioUrl)}}
}
</script><style lang="scss" scoped>
.audio-out {display: flex;flex-direction: column;background-color: #ddd;height: 100%;border-radius: 10px;overflow: hidden;
}
.audio-top {background-color: #f1f3f4;height: 55px;
}
.audio-layer {flex: 1;overflow-y: auto;padding: 10px 0;
}
.audio-btns {text-align: right;.each-btn {padding: 0 5px;}
}
// 用户
.word-layer {display: flex;margin-top: 25px;.word-header {margin: 0 10px;.el-button--primary {background-color: #e1f9ff;border-color: #e1f9ff;color: #2399ff;}}.word-cont {position: relative;background-color: #e1f9ff;border-radius: 20px;}.word-time {padding: 0 10px;position: absolute;left: 0;top: -20px;color: #999;}.word-text {display: flex;align-items: center;padding: 5px 10px;}.text {line-height: 1.5em;}.el-button.is-circle {padding: 5px;font-size: 18px;}.play-btn {background-color: #2399ff;color: #e1f9ff;margin: 0 10px 0 0;}.play-btn.is-circle {padding: 0;border: 0}
}
// 客服
.layer-r {justify-content: right;.word-time {left: auto;right: 0;}.word-cont {background-color: #c9c9c9;}.play-btn {background-color: #333;color: #c9c9c9;margin: 0 0 0 10px;}
}
// 命中规则
.hit-rule {.word-cont {background-color: #fdf2f3;}.play-btn {background-color: #bd0926;color: #fdf2f3;}/deep/.text b {color: #FF0000;font-weight: normal;}
}
</style>

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

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

相关文章

JAVA实现向Word模板中插入Base64图片和数据信息

目录 需求一、准备模板文件二、引入Poi-tl、Apache POI依赖三、创建实体类&#xff08;用于保存向Word中写入的数据&#xff09;四、实现Service接口五、Controller层实现 需求 在服务端提前准备好Word模板文件&#xff0c;并在用户请求接口时服务端动态获取图片。数据等信息插…

[UofTCTF 2024]

最近没有比赛&#xff0c;拿个国外刚比完的练练手。只是网站太慢了&#xff0c;点任何一处都得等一分钟。而且pwn的远程都开不了。不过pwn过于简单&#xff0c;连本地都没调&#xff0c;当是个pwn概念吧。 Crypto repeat 题 import os import secretsflag "REDACATED…

限流算法之固定窗口算法

文章目录 原理示例图 优缺点优点缺点 示例代码java 适用场景不推荐原因如下&#xff1a; 原理 固定窗口算法是一种常见的限流算法&#xff0c;它通过在固定长度的时间窗口内限制请求数量来实现限流。这种算法的原理是在每个时间窗口内&#xff0c;对到达的请求进行计数&#x…

【EI会议征稿通知】第七届先进电子材料、计算机与软件工程国际学术会议(AEMCSE 2024)

第七届先进电子材料、计算机与软件工程国际学术会议(AEMCSE 2024&#xff09; 2024 7th International Conference on Advanced Electronic Materials, Computers and Software Engineering 第七届先进电子材料、计算机与软件工程国际学术会议(AEMCSE 2024)将于2024年5月10-1…

C++、QT 数字合成游戏

一、项目介绍 数字合成游戏 基本要求&#xff1a; 1&#xff09;要求游戏界面简洁美观&#xff0c;且符合扫雷的游戏风格。 2&#xff09;需要有游戏操作或者规则说明&#xff0c;方便玩家上手。 3&#xff09;需具有开始游戏&#xff0c;暂停游戏&#xff0c;结束游戏等方便玩…

2024--Django平台开发-订单项目管理(十四)

day14 订单管理系统 1.关于登录 1.1 UI美化 页面美化&#xff0c;用BootStrap 自定义BooStrapForm类实现。 class BootStrapForm:exclude_filed_list []def __init__(self, *args, **kwargs):super().__init__(*args, **kwargs)# {title:对象,"percent":对象}fo…

市场监管总局发布区块链和分布式记账技术6项标准,中创积极推动区块链产业发展!

近日&#xff0c;市场监管总局&#xff08;国家标准委&#xff09;批准发布一批重要国家标准&#xff0c;涉及生产生活、绿色可持续等多个领域&#xff0c;这些标准将在引领产业发展、促进绿色转型、助力对外贸易、推动城乡建设、提升生活品质等方面发挥重要作用。 其中一项标…

免费三款备受推崇的爬虫软件

在信息爆炸的时代&#xff0c;爬虫软件成为了数据采集、信息挖掘的得力工具。为了解决用户对优秀爬虫软件的需求&#xff0c;本文将专心分享三款备受推崇的爬虫软件&#xff0c;其中特别突出推荐147采集软件&#xff0c;为您开启爬虫软件的奇妙世界。 一、爬虫软件的重要性 爬…

【开源】基于JAVA的教学资源共享平台

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 数据中心模块2.2 课程档案模块2.3 课程资源模块2.4 课程作业模块2.5 课程评价模块 三、系统设计3.1 用例设计3.2 类图设计3.3 数据库设计3.3.1 课程档案表3.3.2 课程资源表3.3.3 课程作业表3.3.4 课程评价表 四、系统展…

【MATLAB】 SSA奇异谱分析信号分解算法

有意向获取代码&#xff0c;请转文末观看代码获取方式~ 1 基本定义 SSA奇异谱分析&#xff08;Singular Spectrum Analysis&#xff09;是一种处理非线性时间序列数据的方法&#xff0c;可以对时间序列进行分析和预测。 它基于构造在时间序列上的特定矩阵的奇异值分解&#…

3Dmax灯光学习(Vray灯光应用)

渲染效果图可以用渲染100哦&#xff0c;最高支持max2024&#xff0c;cr11&#xff0c;vr6.2&#xff0c;支持LUT和Acescg工作流等常用插件&#xff0c;同时森林插件7.43也进行了支持&#xff0c;注册填邀请码【7788】即可免费测试&#xff01; 灯光应用 普通灯光/标准灯光(外景…

RIP基础实验配置

要使用RIP完成以上命令需求 1&#xff0c;首先划分ip地址 有图可见有四个网段需要划分 192.168.1.0/26 192.168.3.0/26 192.168.7.0/26 192.168.5.0/26 给两个骨干网段&#xff0c;给两个环回接口&#xff0c;由下图所示&#xff1a; 其次&#xff0c;规划好ip后在各个接口…

多测师肖sir___ui自动化测试po框架(升级)

ui自动化测试po框架&#xff08;升级&#xff09; po框架 一、ui自动化po框架介绍 &#xff08;1&#xff09;PO是Page Object的缩写&#xff08;pom模型&#xff09; &#xff08;2&#xff09;业务流程与页面元素操作分离的模式&#xff0c;可以简单理解为每个页面下面都有一…

hanlp,pkuseg,jieba,cutword分词实践

总结&#xff1a;只有jieba,cutword,baidu lac成功将色盲色弱成功分对,这两个库字典应该是最全的 hanlp[持续更新中] https://github.com/hankcs/HanLP/blob/doc-zh/plugins/hanlp_demo/hanlp_demo/zh/tok_stl.ipynb import hanlp # hanlp.pretrained.tok.ALL # 语种见名称最…

初识Ubuntu

其实还是linux操作系统 命令都一样 但是在学习初级阶段&#xff0c;我还是将其分开有便于我的学习和稳固。 cat 查看文件 命令 Ubuntu工作中经常是用普通用户&#xff0c;在需要时才进行登录管理员用户 sudn -i 切换成管理用户 我们远程连接时 如果出现 hostname -I没有出现…

长亭科技-雷池WAF的安装与使用

目录 1、安装雷池 2、登录雷池 3、简单配置 4、防护测试 5、其他补充 1、安装雷池 在Linux系统上执行如下命令 &#xff08;需要docker环境&#xff0c;提前把docker、docker-compose 装好&#xff09; bash -c "$(curl -fsSLk https://waf-ce.chaitin.cn/release…

vba设置excel单元格背景色

vba设置excel单元格背景色位蓝色 Sheet1.Cells(hang, 2).Interior.Color RGB(0, 0, 255) 参考链接 【VBA】给单元格设置背景色_vba 将一行底色置绿色-CSDN博客https://blog.csdn.net/s_h_m114_2/article/details/105787093 参考2 知乎 VBA--单元格的背景色设置 特此…

个性化定制的知识付费小程序,为用户提供个性化的知识服务

明理信息科技知识付费saas租户平台 随着知识经济的兴起&#xff0c;越来越多的人开始重视知识付费&#xff0c;并希望通过打造自己的知识付费平台来实现自己的知识变现。本文将介绍如何打造自己的知识付费平台&#xff0c;并从定位、内容制作、渠道推广、运营维护四个方面进行…

【SpringBoot系列】JDK动态代理

🤵‍♂️ 个人主页:@香菜的个人主页,加 ischongxin ,备注csdn ✍🏻作者简介:csdn 认证博客专家,游戏开发领域优质创作者,华为云享专家,2021年度华为云年度十佳博主 🐋 希望大家多多支持,我们一起进步!😄 如果文章对你有帮助的话, 欢迎评论 💬点赞👍🏻 收…

数据库经典面试题

习题一 1.1 创建表 ①创建Student表 mysql> create table Student ( -> Sno int primary key, -> Sname varchar(255), -> Ssex varchar(10), -> Sdept varchar(50) -> ); Query OK, 0 rows affected (0.01 sec) ②创建Course表 mysql…