diff --git a/my-vue-app/src/views/secondTop/components/GoodMusic.vue b/my-vue-app/src/views/secondTop/components/GoodMusic.vue index 7705481..4367faa 100644 --- a/my-vue-app/src/views/secondTop/components/GoodMusic.vue +++ b/my-vue-app/src/views/secondTop/components/GoodMusic.vue @@ -18,9 +18,9 @@
-
+
{{ recording.name.length > 10 ? recording.name.substring(0, 10) + '...' : recording.name }}
+ {{ recording.sale_name }} + 评分: {{ recording.score }} {{ formatFileSize(recording.size) }} - {{ recording.uploadTime }} + {{ recording.uploadTime || recording.date }}
@@ -180,47 +182,16 @@ import MarkdownIt from 'markdown-it' import axios from 'axios' export default { - name: 'GroupRank', + name: 'GoodMusic', + props: { + recordData: { + type: Object, + default: () => ({}) + } + }, data() { return { - recordings: [ - { - id: 1, - name: '常家硕-张三丰-亮剑二部-20分钟通话-25-07-16_18-23-04-44196-215.mp3', - size: 2048576, // 2MB - duration: '00:03:45', - date: '2024-01-15', - url: '/recordings/sample_call_1.mp3', - transcription: null - }, - { - id: 2, - name: '常家硕-张三丰-亮剑二部-20分钟通话-25-07-16_18-23-01-439240-599.mp3', - size: 3145728, // 3MB - duration: '00:05:20', - date: '2024-01-14', - url: '/recordings/sample_call_2.mp3', - transcription: null - }, - { - id: 3, - name: '常家硕-张三丰-亮剑二部-20分钟通话-25-07-16_18-23-02-754615-508.mp3', - size: 2048576, // 2MB - duration: '00:03:45', - date: '2024-01-15', - url: '/recordings/sample_call_1.mp3', - transcription: null - }, - { - id: 4, - name: '丁传辉-丁传辉-勇士二部-20分钟通话-25-07-10_10-32-54-813815-322.mp3', - size: 3145728, // 3MB - duration: '00:05:20', - date: '2024-01-14', - url: '/recordings/sample_call_2.mp3', - transcription: null - } - ], + recordings: [ ], selectedRecording: null, currentAudio: null, showTranscriptView: false, @@ -252,6 +223,38 @@ export default { formattedAnalysisResult() { if (!this.analysisResult) return '' return this.md.render(this.analysisResult) + }, + // 处理外部传入的录音数据 + processedRecordings() { + let externalRecordings = [] + + // 处理外部传入的数据 + if (this.recordData && this.recordData.excellent_record_list) { + const recordList = this.recordData.excellent_record_list + + // 遍历每个销售人员的录音 + Object.keys(recordList).forEach(saleName => { + recordList[saleName].forEach((record, index) => { + externalRecordings.push({ + id: `${saleName}_${index}`, + name: record.obj_file_name ? record.obj_file_name.split('/').pop() : `${record.sale_name}的录音`, + size: 2048576, // 默认大小 + duration: '未知', + date: new Date().toLocaleDateString(), + url: record.obj_file_name, + transcription: record.context || null, + score: record.score, + sale_name: record.sale_name, + sop: record.sop, + isPlaying: false, + isConverting: false + }) + }) + }) + } + + // 合并外部数据和本地数据 + return [...externalRecordings, ...this.recordings] } }, beforeUnmount() { @@ -274,7 +277,13 @@ export default { isConverting: false, transcript: null } - this.recordings.push(recording) + // 如果没有外部数据,则添加到本地recordings数组 + if (!this.recordData || !this.recordData.excellent_record_list) { + this.recordings.push(recording) + } else { + // 如果有外部数据,可以触发事件通知父组件或其他处理逻辑 + this.$emit('file-uploaded', recording) + } // 清空input以便重复选择同一文件 event.target.value = '' } @@ -285,12 +294,12 @@ export default { }, // 播放/暂停录音 togglePlay(index) { - const recording = this.recordings[index] + const recording = this.processedRecordings[index] // 停止当前播放的音频 if (this.currentAudio) { this.currentAudio.pause() - this.recordings.forEach(r => r.isPlaying = false) + this.processedRecordings.forEach(r => r.isPlaying = false) } if (!recording.isPlaying) { @@ -303,48 +312,7 @@ export default { this.currentAudio = null } } - }, - // 转换为文本 - async convertToText(index) { - const recording = this.recordings[index] - this.selectedRecording = index - this.showTranscriptView = true - this.isConverting = true - this.currentTranscript = null - this.currentViewType = 'transcript' - - try { - // 模拟转换过程 - await axios.post('http://192.168.3.104:8000/api/asr/sync?priority=10', { - url: recording.url - }) - - - // 这里应该调用实际的语音转文本API - // 目前使用模拟数据 - recording.transcript = `这是 ${recording.name} 的转换文本示例。在实际应用中,这里会显示真实的语音转文本结果。您可以集成百度、阿里云、腾讯云等语音识别服务来实现真正的语音转文本功能。` - this.currentTranscript = recording.transcript - - // 转换完成后自动开始录音分析 - this.startRecordingAnalysis(recording) - - // 添加转换完成的动画效果 - const resultElement = document.querySelector('.conversion-result') - if (resultElement) { - resultElement.classList.add('show-result') - setTimeout(() => { - resultElement.classList.remove('show-result') - }, 1000) - } - } catch (error) { - console.error('转换失败:', error) - alert('转换失败,请重试') - this.showTranscriptView = false - } finally { - this.isConverting = false - } - }, - + }, // 开始通话录音分析 async startRecordingAnalysis(recording) { this.isAnalyzing = true @@ -361,7 +329,7 @@ export default { 录音信息: 文件名:${recording.name} 文件大小:${this.formatFileSize(recording.size)} -转换文本:${recording.transcript}` +转换文本:${recording.transcription}` try { await this.chatService_02.sendMessage( @@ -436,16 +404,58 @@ export default { fileInput.click() document.body.removeChild(fileInput) }, - downloadRecording(index) { - const recording = this.recordings[index] - if (recording && recording.url) { - const link = document.createElement('a') - link.href = recording.url - link.download = recording.name - document.body.appendChild(link) - link.click() - document.body.removeChild(link) + // 转换为文字 + convertToText(index) { + const recording = this.processedRecordings[index] + if (recording.isConverting) return + + // 如果有外部传入的transcription,直接显示 + if (recording.transcription) { + this.currentTranscript = recording.transcription + this.showTranscriptView = true + this.currentViewType = 'transcript' + + // 开始录音分析 + this.switchViewType('analysis') + this.startRecordingAnalysis(recording) + return } + + recording.isConverting = true + this.isConverting = true + this.showTranscriptView = true + this.currentViewType = 'transcript' + + // 模拟转换过程(用于本地上传的文件) + setTimeout(() => { + const transcriptText = `这是录音 "${recording.name}" 的转录文本内容。这里会显示实际的语音转文字结果。` + recording.transcription = transcriptText + this.currentTranscript = transcriptText + recording.isConverting = false + this.isConverting = false + + // 开始录音分析 + this.startRecordingAnalysis(recording) + }, 2000) + }, + downloadRecording(index) { + const recording = this.processedRecordings[index] + + // 使用obj_file_name字段作为下载链接 + const downloadUrl = recording.url + + if (!downloadUrl) { + alert('录音文件不可用') + return + } + + const link = document.createElement('a') + link.href = downloadUrl + link.download = recording.name + link.style.display = 'none' + document.body.appendChild(link) + link.click() + document.body.removeChild(link) } } } @@ -585,6 +595,16 @@ export default { color: #909399; } +.sale-name { + color: #409eff; + font-weight: 500; +} + +.score { + color: #67c23a; + font-weight: 500; +} + .recording-actions { display: flex; gap: 12px; @@ -797,11 +817,13 @@ export default { } .transcript-text { - padding: 16px; + padding: 8px; line-height: 1.6; color: #303133; background: white; flex: 1; + max-height: 200px; + overflow-y: auto; animation: fadeIn 0.5s ease; } @@ -819,7 +841,9 @@ export default { font-size: 14px; background: #fafafa; border-radius: 4px; - padding: 20px; + padding: 8px; + max-height: 200px; + } .analysis-content h1, diff --git a/my-vue-app/src/views/secondTop/secondTop.vue b/my-vue-app/src/views/secondTop/secondTop.vue index ade79a7..6aa312c 100644 --- a/my-vue-app/src/views/secondTop/secondTop.vue +++ b/my-vue-app/src/views/secondTop/secondTop.vue @@ -67,7 +67,7 @@ - +
@@ -714,6 +714,30 @@ const conversionRateVsAverage = ref({}) const res = await getExcellentRecordFile(requestParams) if (res.code === 200) { goodRecord.value = res.data + /** + * "data": { + "user_name": "张三丰", + "user_level": 4, + "excellent_record_list": { + "马然": [ + { + "sale_name": "马然", + "sop": null, + "context": "[4.61s - 324.55s] Speaker 1: 哎,星宇吗?能看到常老师吧。嗯嗯,好,老师也把摄像头翻转过来,带您看一下咱们平台。嗯,你看能看到吧啊,可以看到嗯,咱们规模够大吧啊,我们是全国也是全互联网规模最大的解决青少年心理问题的平台。所以为什么一开始就跟您说孩子问题不用担心,不用害怕。对于您来说,现在不知道该怎么去跟孩子沟通了,我们也能够感受到孩子也很痛苦,他也想改变,他也想让自己变优秀,但是到底怎么引导着孩子,让他成为一个优秀的自己呢?我们每天去处理的都是这样的事情。因为我刚刚跟您说的很多的各种阶段的、初中的、高中的,甚至说进入大学的孩子,也是本来也是一一个很优秀的孩子,真的就是面对这些问题,面对这些困难,他不知道怎么去处理我们家长到底如何给予孩子帮助?你看这个这是央视的品牌,中国,咱们是重点推荐品牌,这是央视的力量栏目组。咱们是受邀专访企业,这是咱们赵院长去年去参加腾讯的育儿盛典,给他们颁发的综合实力。家庭教育品牌这边呢是咱们前台暖洋葱,家庭教育能看到吧啊,看到了嗯,你看咱们的规模都是非常大的。我们的愿景就是让咱们孩子开心快乐的去主动学习自己,能够把精力放在学习上,我们也不用再去天天担心孩子了,孩子也能够有个更好的发展。咱们的使命就是改善我们的家庭教育,影响幸福代人孩只是孩子一一个成绩,有一良好的发展,更多多也孩孩子一个良好的品良良好心心态,够够自己己人生生展展,是咱们这几天上课的,也是说赵世杰、赵院长还记得吧?中科院的高级心理咨询师,也是我们暖阳村教研中心的主任课就在他那里买的。对对,然后最擅长的就是解决提升孩子这些学习力内驱力,让他主动学习,提升成绩,解决这些各种原因,厌学休学,不想上学,不想学习依赖手机沉迷游戏的问题。可以说,赵院孩子问题,赵院长眼中中等程度算不上,非常好解决,又不是说真的去割动脉了。那孩子也有这样一个行为,但是划破皮是不是?但是我们也需要重视视,毕竟现在是发的就是这个对,也是有这样一个感觉自己心理上的痛苦,当心理上的痛苦,他无法承受的时候,他就只能通过伤害自身身体来缓解内心的这种压力了。这边呢是咱们一个发展历程。你看我们是零九年的时候建立的,当时在北京、北京十七个家里面,九位老师都是如何高无一例外,孩子学习能力是有的,包括甚至小学的时候都非常听话,也非常开朗。但是你会发现,一旦进入初中,一旦进入高中,各种各样的情况,各种各样的问题就开始出现了。比如说跟咱们孩子一样,学校里面老师批评了孩子自尊心受到打击了,都甚至同学矛盾、矛盾,甚至到校园霸凌的程度。好,有的也是爸爸妈妈长期在家里面吵架,甚至说长期的对于孩子缺乏陪伴,孩子没有安全感,是不是那孩子的这个性格方面就肯定爸爸爸。嗯嗯,这一点咱们对于孩子做的还是很好的,但孩子面对的问题是各种各样的,从来没从来没挑战。嗯,有一个幸福的家庭,那这样已经也是超过大部分的来来解决的这些家长了。那关键就是孩子在面对其他问题的时候,我们到底能够给予到孩子一个什么样的帮助。由于孩子他没有一个解决的问题,他孩子就是孩子他不知道该怎么办,他的想法都是非常幼稚的,非常单纯的。我们家长到底如何引导着孩子给到他力量温暖和引导,让他去解决这些问题,对不对?你们这一开始咱们就是洋葱互助会的形式成立的。零九年到一三年,咱们互助会就累计帮助了数万人了。到一五年,我们正式成立了暖洋葱家庭教育。一七年两年的时间,咱们迅速发展,当时已经是非常大的规模了,能看到吧?很多人,你看你看现在国家也开始重视青少年的心理健康了,要求学校里面搭建什么校园心理工作室?我们想让孩子长大之后成为一个优秀的人。首先,他得能够心理健康的长大吧,对不对?那他们需要找到专业的平台呀,对,那就找到咱们咱们去帮助全国多所学校搭建校园经理工作室。二二年,全国多家媒体登门进行独家的专访。二三年抖音平台家庭教育板块给咱们颁发新锐领学官的证书,什么意思呢?孩子妈妈家庭教育这个板块,我们要说自己是第二的话,那就没人有资格说自己是第一了。领学官领学官领了在家学习的人才叫领学官。这个是二四年央视的两个栏目,对我们进行独家专访的原因。我们也成功的帮助,数万组家庭走向幸福。孩子们现在对我们洋葱有一个大概的了解了吧?啊嗯所以说专业的事情交给专业的人。咱们这些问题呢,我会反馈咱们赵院长让他去进行针对性的讲课。我稍后也整理一下咱们机构的资料,包括跟您孩子类似的他们的一些成长改变发给咱们,咱们可以了解一下课程。开始之前我也会提醒咱们有问题了,随时联系我,好吧,可以可以可以。那那老师今天就咱们沟通到这里,他的妈妈再见。好的好的好的嗯,\n[324.71s - 325.87s] Speaker 0: 好的,好,谢谢啊。\n", + "obj_file_name": "http://192.168.3.112:5000/api/record/download/马然-20分钟通话-25-08-20_20-17-36-347230-987.mp3", + "score": 25.0 + }, + { + "sale_name": "马然", + "sop": null, + "context": "[8.79s - 22.35s] Speaker 0: 我刚在给你打电话接话啊,我可以给初二给人打电话,给喂我的妈妈刚刚玩一下就行。现是进入直播间学习上班哦,\n[27.25s - 34.91s] Speaker 0: 但是这个哎新宇妈妈一个月开始十分钟吗?\n[34.91s - 36.13s] Speaker 1: 啊,能听到吗?\n[36.13s - 37.81s] Speaker 0: 稍等一下哈哦哦,\n[38.15s - 197.56s] Speaker 1: 等一下他在忙是吧,不能不能听得到。你说嗯信号怎么好哦,行行行,是咱们第三节直播已经开始十多分钟了,是来提醒了们上课的,看到没有?我刚才没听没有没有嗯嗯,老师今天晚上都忙,没时间吗?这几天赶货比较忙哦,赶货干啊,刚吃饭厂里上班的哦哦哦,厂里上班咱们就是刚休息是吗?一会儿是还要去吗?对,刚吃饭回来。对,哎呦,虽然我上课这两天上课都是边上班边听的。嗯嗯嗯,对,咱们可以戴个耳机边上班边听。嗯啊对对对,孩子这两天咱们跟孩子沟通情况怎么样啊,孩子没回来了,还在学校。嗯,嗯,哦咱们这两天也没给他发消息是吧?呃,手机没说,反正嗯手机没有嗯对手机收了。嗯,那郑院长昨天也提到了咱们的一对一指导,帮助孩子去解决这样一个问题。不管是心理方面了,还是对于学习这些的,咱们是呃怎么考虑的呢?我刚今天又听了我今天的那个课听差不多了。嗯,嗯,那个有点贵呀。嗯,好的,妈妈两个月的一对一指导啊。咱们如果说了解的话,平时都是一万以上的,也只有咱们这一天赵院长给我们的一个优惠名额是六千八。咱们也而且还是你抢到这个名额优惠名额有三百抵三千。今天晚上价值五千九百八的证件训练,也是截止赠送了三个六千八。说实话,孩孩子这样一个情况,我们这种情况,我们这种家庭嗯嗯非常啊对我非常理解咱们这样一个心情,对不对?但是如果说你孩子这样一个问题,你想两个月的老师这样一堆指导,你要是我我给你找一个一千块的让你报名,你想的是啥样的,老师给他们指导啊,对不对?哎,对于孩子来说,家家庭太困难了,我们哎,太难了,反正先写在外面的事。没事没事,咱们先嗯今天晚上依然该听课听课。好吧,有很多家长都是刚刚还没进去,没没去,刚刚吃饭有点忙。嗯,行行,刚刚回来,我就是稍后把链接发给咱们。然后晚上的时候,我也我我嗯整理跟咱们家庭情况比较相似的,都可以发给咱们,咱们可以看一看了解一下,好吧,我都还没没来得及看。你昨天给我发了好多,我都没没仔细看。哎呦啊,那都是时间太忙,工作太忙。那行,咱们先进直播间签到打卡吧,行吧,进直播间签到打卡,结果回放。嗯,好谢行吧,再见。好好好好好再见嗯,拜拜。\n", + "obj_file_name": "http://192.168.3.112:5000/api/record/download/马然-20分钟通话-25-08-20_20-24-43-653520-759.mp3", + "score": 55.0 + } + ] + } + } + */ } } catch (error) { console.error('获取优秀录音失败:', error)