针对上一篇微信同声传译语音播报部分坑的解决和优化

2024-05-25 14:20

本文主要是介绍针对上一篇微信同声传译语音播报部分坑的解决和优化,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. 上一篇语音播报其实是不完美的,就是如何停止上一个音频开始下一个音频的问题,我在此做一下修改

在这里插入图片描述
比如说:现在正在播放1,我点击2让2开始播放,1停止播放,我上面的写法是有问题的:

  • 通过 innerAudioContext.pause() 是可以停止播放音频的;
  • wx.createInnerAudioContext()的实例,我是在readStart方法里面创建的
  • 再次执行readStart方法,会重新创建wx.createInnerAudioContext()实例
  • 我们如果在点击播放图标的时候执行pause() 方法,执行的不是正在播放的音频的实例

因此:我们需要创建一个全局的实例,这样我们执行pause() 方法时,在同一个实例下,就是停止正在播放的音频
代码如下:

	data:{dialogue:'您好,我是您的健康管家"向我提问。您好,我是您的健康管家"质迹"!您有什么疑问都可以在此向我提问。',type:'play'}// 在onLoad中创建一个全局的实例onLoad(){this.innerAudioContext = wx.createInnerAudioContext();}// 阅读文字readText: async function () {const that = this;// ------------------------------在点击播放图标之前,我们先执行一个pause()方法,停止上一段音频--------------------that.innerAudioContext.pause()that.setData({type :'pause'})// 将文字按照每200个长度截取成一段,组成一个数组// 切片处理,将超过1000个字符的文字,截取成几段let list =this.splitStringByLength(dialogue, 200)// 循环遍历数组,将文字转化成音频let radioList = list.map(el => {return new Promise(resolve => {plugin.textToSpeech({lang: "zh_CN",tts: true,content: el,success: function (res) {resolve(res.filename)},fail: function (res) {wx.showToast({title: '语音转换失败',})}})})})// 将promise执行结果放在一起执行(解决for循环中有异步操作的方法之一,经典面试题)// 有个弊端: 如果前面的promise有一个执行错误,Promise.all就不会执行,因此:可以用map/filter将radioList过滤一遍(本项目中有一个Promise执行失败,就应该失败)Promise.all(radioList).then(res => {that.readStart(res)})},// 将字符串每隔length个就截取一段splitStringByLength :function (str, length)  {let result = [];for (let i = 0; i < str.length; i += length) {result.push(str.substring(i, i + length));}return result;}// 开始阅读readStart: async function (radioList) {const that = thisfor (let text of radioList) {// --------------------------在此就不需要再次创建实例了---------------------------// const innerAudioContext = wx.createInnerAudioContext();that.innerAudioContext.src = text;that.innerAudioContext.onPlay(() => {console.log('开始播放当前片段', 'onPlay');});that.innerAudioContext.onError((err) => {console.error('音频播放出错', err);});that.innerAudioContext.onEnded(async () => {// 如果是最后一个片段,这里可以结束,否则不需要awaitif (text === radioList[radioList.length - 1]) {that.setData({type: 'play',})}});// 确保前一个音频播放结束后再播放下一个await new Promise(resolve => {that.innerAudioContext.onEnded(resolve);that.innerAudioContext.play();});}},// 暂停阅读readPause: function () {this.innerAudioContext.pause()const that = this;that.setData({type: 'play',})}

2. 对于splitStringByLength方法,我也进行了一些优化 (wx.createInnerAudioContext()只支持1000个字符以内的文字转为音频)

下面一段代码是无脑按照长度切割,在进行语音播报的时候,第一段语音和第二段语音之前的衔接会有1-2秒的停顿,语音播报不流畅
比如:您好,我是您的健康管家"向我提问。您好,我是您的健康 | 管家"质迹"!您有什么疑问都可以在此向我提问。
在 | 处切成两段,语音在播放到‘康’的时候,会停顿1-2秒,在开始播放‘管家…’

splitStringByLength :function (str, length)  {let result = [];for (let i = 0; i < str.length; i += length) {result.push(str.substring(i, i + length));}return result;}

在此,我对切割方法进行了一下优化

  • 不超过length的长度,不进行切割
  • 超过length的长度,首先找中文句号,在中文句号处切割
  • 如果整个文本都没有中文句号,则在中文逗号处切割
  • 语音在逗号和句号处本来就是会停顿的,在此处切割,这样用户的体验更好一些
const splitStringByLength = (text, length) => {const MAX_LENGTH = length;  // 最大长度const CHINESE_PERIOD = '。'; // 首个切割条件const CHINESE_COMMA = ',';  // 当首个切割条件不存在时的次要切割条件let result = [];let startIndex = 0;// 文本长度不超过最大长度,就不切割,直接返回if (text.length < MAX_LENGTH) {return [text]}while (startIndex < text.length) {// 查找下一个中文句号的位置,若找不到则返回-1let periodIndex = text.indexOf(CHINESE_PERIOD, startIndex);if (periodIndex === -1 || periodIndex - startIndex > MAX_LENGTH) {// 如果没有找到句号,或者句号距离起始点超过了300个字符// 则查找中文逗号的位置,同样,若找不到则返回-1let commaIndex = text.lastIndexOf(CHINESE_COMMA, startIndex + MAX_LENGTH);if (commaIndex === -1 || commaIndex <= startIndex) {// 如果也没有找到逗号,或者逗号位置不满足条件,则直接在MAX_LENGTH处截断result.push(text.substring(startIndex, startIndex + MAX_LENGTH));startIndex += MAX_LENGTH;} else {// 找到了逗号并且位置合适,就在逗号后分割result.push(text.substring(startIndex, commaIndex + 1));startIndex = commaIndex + 1;}} else {// 找到了句号并且位置合适,就在句号后分割result.push(text.substring(startIndex, periodIndex + 1));startIndex = periodIndex + 1;}}return result;
}

这篇关于针对上一篇微信同声传译语音播报部分坑的解决和优化的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1001754

相关文章

Vue3 的 shallowRef 和 shallowReactive:优化性能

大家对 Vue3 的 ref 和 reactive 都很熟悉,那么对 shallowRef 和 shallowReactive 是否了解呢? 在编程和数据结构中,“shallow”(浅层)通常指对数据结构的最外层进行操作,而不递归地处理其内部或嵌套的数据。这种处理方式关注的是数据结构的第一层属性或元素,而忽略更深层次的嵌套内容。 1. 浅层与深层的对比 1.1 浅层(Shallow) 定义

W外链微信推广短连接怎么做?

制作微信推广链接的难点分析 一、内容创作难度 制作微信推广链接时,首先需要创作有吸引力的内容。这不仅要求内容本身有趣、有价值,还要能够激起人们的分享欲望。对于许多企业和个人来说,尤其是那些缺乏创意和写作能力的人来说,这是制作微信推广链接的一大难点。 二、精准定位难度 微信用户群体庞大,不同用户的需求和兴趣各异。因此,制作推广链接时需要精准定位目标受众,以便更有效地吸引他们点击并分享链接

HDFS—存储优化(纠删码)

纠删码原理 HDFS 默认情况下,一个文件有3个副本,这样提高了数据的可靠性,但也带来了2倍的冗余开销。 Hadoop3.x 引入了纠删码,采用计算的方式,可以节省约50%左右的存储空间。 此种方式节约了空间,但是会增加 cpu 的计算。 纠删码策略是给具体一个路径设置。所有往此路径下存储的文件,都会执行此策略。 默认只开启对 RS-6-3-1024k

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

阿里开源语音识别SenseVoiceWindows环境部署

SenseVoice介绍 SenseVoice 专注于高精度多语言语音识别、情感辨识和音频事件检测多语言识别: 采用超过 40 万小时数据训练,支持超过 50 种语言,识别效果上优于 Whisper 模型。富文本识别:具备优秀的情感识别,能够在测试数据上达到和超过目前最佳情感识别模型的效果。支持声音事件检测能力,支持音乐、掌声、笑声、哭声、咳嗽、喷嚏等多种常见人机交互事件进行检测。高效推

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

如何解决线上平台抽佣高 线下门店客流少的痛点!

目前,许多传统零售店铺正遭遇客源下降的难题。尽管广告推广能带来一定的客流,但其费用昂贵。鉴于此,众多零售商纷纷选择加入像美团、饿了么和抖音这样的大型在线平台,但这些平台的高佣金率导致了利润的大幅缩水。在这样的市场环境下,商家之间的合作网络逐渐成为一种有效的解决方案,通过资源和客户基础的共享,实现共同的利益增长。 以最近在上海兴起的一个跨行业合作平台为例,该平台融合了环保消费积分系统,在短

MySQL高性能优化规范

前言:      笔者最近上班途中突然想丰富下自己的数据库优化技能。于是在查阅了多篇文章后,总结出了这篇! 数据库命令规范 所有数据库对象名称必须使用小写字母并用下划线分割 所有数据库对象名称禁止使用mysql保留关键字(如果表名中包含关键字查询时,需要将其用单引号括起来) 数据库对象的命名要能做到见名识意,并且最后不要超过32个字符 临时库表必须以tmp_为前缀并以日期为后缀,备份

poj 2976 分数规划二分贪心(部分对总体的贡献度) poj 3111

poj 2976: 题意: 在n场考试中,每场考试共有b题,答对的题目有a题。 允许去掉k场考试,求能达到的最高正确率是多少。 解析: 假设已知准确率为x,则每场考试对于准确率的贡献值为: a - b * x,将贡献值大的排序排在前面舍弃掉后k个。 然后二分x就行了。 代码: #include <iostream>#include <cstdio>#incl

SWAP作物生长模型安装教程、数据制备、敏感性分析、气候变化影响、R模型敏感性分析与贝叶斯优化、Fortran源代码分析、气候数据降尺度与变化影响分析

查看原文>>>全流程SWAP农业模型数据制备、敏感性分析及气候变化影响实践技术应用 SWAP模型是由荷兰瓦赫宁根大学开发的先进农作物模型,它综合考虑了土壤-水分-大气以及植被间的相互作用;是一种描述作物生长过程的一种机理性作物生长模型。它不但运用Richard方程,使其能够精确的模拟土壤中水分的运动,而且耦合了WOFOST作物模型使作物的生长描述更为科学。 本文让更多的科研人员和农业工作者