针对上两篇微信同声传译语音播报功能,又出现了坑

news2024/9/19 13:25:17

我又双叒叕来了,自己写的bug,跪着也要改完,我是真的服了

  • 首先,我们来说说是什么问题吧

    1. 上一篇文章的这张图还记得吧,不记得的,我在下面贴出来了;
    1. 我们在长度大于300的时候,根据句号或者逗号进行了切片,然后将这些片段转换成若干个短语音,通过遍历来进行完整播放(不记得的看上一篇吧);
    1. 图中的1和2都是根据句号来切成几个小片段;
    1. 在1正在播放时,切换到2进行播放,等2播放完成了之后,图标会从红色变成绿色,但是语音会接着1暂停的时机继续播放;
  • 原因呢?其实我也不确定,我稍微思考了几个可能得原因

    1. 可能是我写的遍历播放的方法有问题?
    1. 或者是因为我在切换的时候写的是pause(),暂停的方法
    1. 又或者是,wx.createInnerAudioContext()实例里面已经缓存了之前的语音地址
    1. 反正我不确定,但是问题我解决了(鼓掌吧,兄弟们)

在这里插入图片描述

解决方式

在切换图中1和2时,直接把实例清掉,然后再重新注册一个实例,简单且粗暴(我另外又偷偷的进行了一项优化)

// 我在page外定义了两个全局属性,注意:这是写在page外的哈
let radioId = 0    // 存储当前播放id
let radioOldList = []    // 存储当前正在播放的语音列表


// 在onLoad里面进行实例化
this.innerAudioContext = wx.createInnerAudioContext();

// 阅读文字,页面上的点击图标
readText: async function (e) {
    const { item } = e.currentTarget.dataset
    const that = this;
    // 判断当前id和上一次存储的id是不是相同
    if (item.id == radioId) {
    // 相同就调用pause()暂停方法,再次点击会接着之前暂停处播放
      that.innerAudioContext.pause()
    } else {
    // 不相同就调用stop()停止方法
      that.innerAudioContext.stop()
      // 同时将实例清除
      that.innerAudioContext = null
      // 重新创建一个实例
      that.innerAudioContext = wx.createInnerAudioContext()
    }
    that.data.questionList.forEach(el => {
        if (el.id == item.id) {
          el.type = 'pause'
        } else {
          el.type = 'play'
        }
    });
    that.setData({
      questionList: that.data.questionList,
      playItem: item
    })
    // 当前id和上一次存储的id相同时,跳过语音转换步骤,直接使用之前的存储的语音列表
    if (item.id == radioId) {
      that.readStart(radioOldList, item.id)
      return
    }
    let list = splitStringByLength(item.audiodialogue, 300)
    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.all(radioList).then(res => {
      that.readStart(res, item.id)
    })
  },
  // 开始阅读
  readStart: async function (radioList, id) {
    const that = this
    // 将当前播放的语音列表存储起来
    radioOldList = radioList
    for (let text of radioList) {
      this.innerAudioContext.src = text;
      this.innerAudioContext.onPlay(() => {
        console.log('开始播放当前片段', 'onPlay');
      });
      this.innerAudioContext.onError((err) => {
        console.error('音频播放出错', err);
      });
      this.innerAudioContext.onEnded(async () => {
        // 如果是最后一个片段,这里可以结束,否则不需要await
        if (text === radioList[radioList.length - 1]) {
          that.data.questionList.forEach(el => {
            if (el.id == id) {
              el.type = 'play'
            }
          })
          that.setData({
            questionList: that.data.questionList,
          })
          that.innerAudioContext.stop()
          return
        }
      });
      // 将当前播放的id存储起来
      radioId = id
      // 确保前一个音频播放结束后再播放下一个
      await new Promise(resolve => {
        this.innerAudioContext.onEnded(resolve);
        this.innerAudioContext.play();
      });
    }
  },
关键代码:
  • 存储上一次的播放id和播放列表
    在这里插入图片描述

  • readText方法内,判断当前播放的id是否和存储的相同,相同就跳过语音转换步骤

  • 如果不相同,先停止当前的播放并清除实例后,重新创建实例

在这里插入图片描述

总结:

全是坑,一个坑填完还有另外好多坑排着队等着,咋整?站着填不完,那就跪着填吧。就这样吧,累了

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

嵌入式学习记录5.27(c++基础1)

目录 一.C和C的区别 二.输入输出流类 2.1输出cout 2.2输入cin 三.命名空间 2.1使用命名空间中的标识符 2.2命名空间中声明函数 2.3命名冲突问题 2.4匿名空间 2.5命名空间添加,嵌套,重命名 四.字符串的使用 4.1string类 4.2C风格和C风格字符串…

出生率下降 幼儿园如何面对困境创新转型

从2023年开始,全国幼儿园生存发展问题成为教育界焦点,民办幼儿园更为焦虑满满。当今年轻人对待婚姻和生育的观念,的确让上一辈人始料未及。那么,是否幼儿园再也不可能回到巅峰时期了?是否很多幼儿教育者将无用武之地呢…

只要尝试一次API正向工程,你就会无可救药的爱上她!

何为正向,何为反向? 举个例子:在数据库的设计里面这个概念可能被大量涉猎;古早先是 DBA设计好表以及表之间的关系(一对多,多对一,多对多...);然后应用是通过ORM 映射数据库表到业务内领域对象&a…

[猫头虎分享21天微信小程序基础入门教程] 第17天:小程序的用户授权与安全

[猫头虎分享21天微信小程序基础入门教程] 第17天:小程序的用户授权与安全 第17天:小程序的用户授权与安全 🔒 自我介绍 大家好,我是猫头虎,一名全栈软件工程师。今天我们继续微信小程序的学习,重点了解如…

OrangePi AIpro 性能测试以及使用体验

OrangePi AIpro 性能测试以及使用体验 1. 介绍 OrangePi AIpro(8T)采用昇腾AI技术路线。 具体为4核64位处理器AI处理器,集成图形处理器,支持8TOPS AI算力拥有8GB/16GB LPDDR4X,可以外接32GB/64GB/128GB/256GB eMMC模块,支持双4…

超详细避坑指南!OrangpiAIPro转换部署模型全流程!

目录 OrangepiPro初体验 前述: 一、硬件准备 二、安装CANN工具链(虚拟机) 三、配置模型转换环境(虚拟机) 1.安装miniconda 。 2.创建环境。 3.安装依赖包 四、转换模型 1. 查看设备号(开发板&…

Linux服务器安装anaconda、配置pytorch环境

Linux服务器安装anaconda并配置pytorch环境 Linux服务器安装anaconda下载anaconda安装anaconda验证是否安装成功注意默认python版本 配置pytorch环境新建虚拟环境安装pytorch Linux服务器安装anaconda 下载anaconda 首先进入anaconda网站,根据自己的需要选择一个版…

LLM中的RoPE位置编码代码解析与RoPE的性质分析(一)

本博客需要对位置编码有一定了解,但不熟悉代码实现的老哥看。 正弦位置编码(sinusoidal) 在介绍RoPE之前,先回顾一下正弦位置编码。 数学表达 P E ( p o s , 2 i ) s i n ( p o s 1000 0 2 i / d m o d e l ) PE(pos, 2i) sin…

5.27作业

定义自己的命名空间my_sapce&#xff0c;在my_sapce中定义string类型的变量s1&#xff0c;再定义一个函数完成对字符串的逆置。 #include <iostream>using namespace std; namespace my_space {string s1;string reverse1(string s1);} using namespace my_space; int m…

Web(数字媒体)期末作业

一.前言 1.本资源为类似于打飞机的网页游戏 2.链接如下&#xff1a;【免费】前端web或者数字媒体的期末作业&#xff08;类似于打飞机的2D网页小游戏&#xff09;资源-CSDN文库 二.介绍文档

HR人才测评,哪些岗位需要测评想象力?

什么是想象力&#xff1f; 想象力是指&#xff0c;人们通过在已有物质的基础上&#xff0c;通过大脑想象、加工、创造出新事物的能力&#xff0c;举一个非常简单的例子&#xff0c;在提到鸟这种生活的时候&#xff0c;大家会联想到各种各样不同鸟的品种。 哪些岗位需要测评…

喜讯 | 聚铭网络入选2024安在新榜网络安全产品“大众点评”百强榜及全景图

近日&#xff0c;安在新榜发布了备受期待的《2024中国网络安全产品用户调查报告》。在这份权威报告中&#xff0c;聚铭网络凭借先进的技术、优秀的产品和专业的配套服务&#xff0c;成功入选《2024安在新榜网络安全产品“大众点评”百强榜》。 报告通过对全国企业用户进行专项调…

海外仓erp系统是什么?和海外仓管理系统一样吗?

为了满足海外仓全球化发展的大趋势&#xff0c;同时提升海外仓运转的效率&#xff0c;一套好用&#xff0c;性价比高的海外仓管理系统还是非常重要的。 不过很多海外仓企业其实不太分得清erp系统和海外仓管理系统的差异&#xff0c;今天我们就来系统的聊一下&#xff0c;方便大…

React useState修改对象

在 React 中&#xff0c;useState 是一个 Hook&#xff0c;它可以让函数组件拥有状态。当想要改变一个对象类型的状态时&#xff0c;我们需要使用展开运算符&#xff08;...&#xff09;或者 Object.assign 来确保状态是正确地更新。 以下是一个使用 useState 来更新对象的例子…

windows下nvm的安装及使用

目录 一、下载二、安装三、使用 一、下载 下载链接&#xff1a;https://github.com/coreybutler/nvm-windows/releases 二、安装 双击 nvm-setup.exe&#xff0c;按提示一步步安装。 三、使用 # 查看已安装的版本信息 nvm list&#xff08;可简写为&#xff1a;nvm ls&am…

计算机视觉中-语义分割

语义分割 语义分割是计算机视觉中的一个关键技术&#xff0c;它涉及对图像中的每个像素进行类别划分&#xff0c;从而识别出图像中的不同物体或区域。具体来说&#xff0c;语义分割就是按照“语义”给图像上目标类别中的每一点打上一个标签&#xff0c;使得不同种类的东西在图像…

【RSGIS数据资源】中国多时期土地利用遥感监测数据集(CNLUCC)

文章目录 数据基本信息摘要数据说明数据引用方式 数据基本信息 数据时间&#xff1a; 多时期(1970年代末期以来11期) 空间位置&#xff1a; 中国 数据格式&#xff1a; 矢量与栅格 空间分辨率&#xff1a; 30m 主题分类&#xff1a; 中国土地利用遥感监测数据 DOI标识&#xf…

Android Gradle plugin 版本和Gradle 版本

1.当看到这两个版本时&#xff0c;确实有点迷糊。但是他们是独立的&#xff0c;没有太大关联。 就是说在Android studio中看到的两个版本信息&#xff0c;并无太大关联&#xff0c;是相互独立的。Gradle插件版本决定了你的项目是如何构建的&#xff0c;而Gradle版本是执行构建…

UML-系统架构师(二)

1、UML&#xff08;Unified Modeling Language&#xff09;是面向对象设计的建设工具&#xff0c;独立于任何具体程序设计语言&#xff0c;以下&#xff08;&#xff09;不属于UML中的模型。 A用例图 B协作图 C活动图 DPAD图 解析&#xff1a; UML一共14种图 结构图&…

电商场景的视频动效

AtomoVideo:AIGC赋能下的电商视频动效生成本文分享阿里妈妈视频 AIGC(AtomoVideo等) 赋能视频广告创意的探索和实践。通过基于扩散模型的视频生成技术,结合可控生成技术,使静态电商图片能够栩栩如生地“动”起来,实现了在电商领域的视频 AIGC 应用落地。https://mp.weixi…