当前位置: 首页 > news >正文

同声传译语音合成接口,分段预合成实现丝滑的衔接效果

背景:
在使用微信官方语音合成插件的时候遇到一个问题,textToSpeech这个api的内容限制在官网的文档上明明是1000个字节,也就是说能保证333个中文字符应该是没有问题的,但是也不知道为什么我这里仅仅传了150个中文字符就报错了,报错内容返回{“retcode”:-20003,“msg”:“text to speech inner server failed.”},查了一下是因为内容过长导致的错误。
解决办法:
事实与文档说明完全不符,这个没办法解决,就想了一个分割内容分段合成的办法,但是分段吧就会有一个问题,那就是如果每段文字合成语音后,播放,然后再合成,在播放,就会出现明显的停顿,一点都不丝滑,很难受,为了解决这个问题,想了一个预加载的办法,也就是预先合成一段段的音频文件,然后将这些音频文件存到一个数组里面,通过shift函数每次从数组取出一个这样就实现了不管多少文字内容,都能够非常丝滑的合成语音文件。
代码:

    data() {return {showAudioModal: false,textAyy: [],audioAyy: [],content: '超长的文本'};},onLoad(e) {this.audioContext =	uni.createInnerAudioContext();this.audioContext.onEnded(() => {if(this.audioAyy && this.audioAyy.length > 0){this.audioContext.src = this.audioAyy.shift()this.audioContext.play()}else{this.showAudioModal = false}})},methods: {async textToSpeech(){this.audioAyy = []this.textAyy = this.splitStringByLength(this.content,100,100)let flag = truefor (var i = 0,len = this.textAyy.length; i < len; i++) {if(i === 0){uni.showLoading({title: '语音加载中',mask: true})}await this.callTextToSpeech(this.textAyy[i]).then(res => {console.log(i)this.showAudioModal = trueif(flag){this.audioContext.src = res;this.audioContext.play();flag = false}else{this.audioAyy.push(res)}uni.hideLoading()}).catch(() => {})}if(flag){uni.hideLoading()uni.showToast({title:'语音合成失败'})}},callTextToSpeech(content){return new Promise((resolve,reject) => {this.$wcs.textToSpeech({lang: "zh_CN",tts: true,content,success: (res) => {console.log("succ tts", res.filename)resolve(res.filename)},fail: function(res) {console.log("fail tts", res)reject()}})})},splitStringByLength(str, maxSize, chunkSize) {const totalLength = str.length;if (totalLength <= maxSize) {return [str];}const chunks = [];let start = 0;while (start < totalLength) {let end = Math.min(start + chunkSize, totalLength);const chunk = str.substring(start, end);chunks.push(chunk);start = end;}return chunks;},
}

大致逻辑
通过async和await保证语音合成的有序性,第一段成功的语音直接播放,后续的放入数组,等音频播放结束事件触发后,自动从数组中获取资源,这样一来就实现了预合成的效果,达到了非常丝滑的效果

http://www.lryc.cn/news/400726.html

相关文章:

  • 数据结构——单链表详解(超详细)(1)
  • 在 Linux 上使用 lspci 命令查看 PCI 总线硬件设备信息
  • python数据可视化(6)——绘制散点图
  • 【人工智能】Transformers之Pipeline(二):自动语音识别(automatic-speech-recognition)
  • Mysql-错误处理: Found option without preceding group in config file
  • [iOS]内存分区
  • sklearn基础教程:掌握机器学习入门的钥匙
  • 【unity实战】使用unity制作一个红点系统
  • 开发指南046-机构树控件
  • SpringBatch文件读写ItemWriter,ItemReader使用详解
  • 如何评估AI模型:评估指标的分类、方法及案例解析
  • 程序员学CFA——经济学(七)
  • imx335帧率改到10fps的方法
  • Large Language Model系列之二:Transformers和预训练语言模型
  • java后端项目启动失败,解决端口被占用问题
  • PostgreSQL安装/卸载(CentOS、Windows)
  • OutOfMemoryError异常OOM排查
  • 【Python】Arcpy将excel点生成shp文件
  • torch之从.datasets.CIFAR10解压出训练与测试图片 (附带网盘链接)
  • 什么ISP?什么是IAP?
  • 外卖霸王餐系统怎么快速盈利赚钱?
  • Linux环境下安装Nodejs
  • 【Rust】字符串String类型学习
  • 先验概率 后验概率 最大似然估计 自编码器AE
  • qt 鼠标接近某线时,形状变化举例
  • 800块,我从淘宝上买AGV……
  • C++相关概念和易错语法(21)(虚函数、协变、析构函数的重写)
  • SoulApp创始人张璐团队以AI驱动社交进化,平台社交玩法大变革
  • MySQL事务隔离级别+共享锁,排他锁,乐观锁,悲观锁
  • Zynq系列FPGA实现SDI编解码转SFP光口传输(光端机),基于GTX高速接口,提供6套工程源码和技术支持