JS 文字转语音 谷歌内核浏览器,实现音频与文字展示时间同步

1 篇文章 0 订阅
1 篇文章 0 订阅

功能问题概述

项目中用到了谷歌内核浏览器的文字转语音功能,需要把要朗读的文字展示出来,因此出现了语音还未读完文字已经展示结束的问题(开始使用的setTimeout函数倒计时展示文字,这种方式并不好用,倒计时结束文字收起展示,但是语音还在朗读。)

 问题修改

实现文字转语音需要用到 window.speechSynthesis 与 new SpeechSynthesisUtterance()这两个对象。

其中SpeechSynthesisUtterance提供了监听文字转语音开始于结束的函数,通过控制这两个函数来控制文字展示的时间。

//简单实现
handleSpeak(e) {
    const msg = new SpeechSynthesisUtterance();
    const synth = window.speechSynthesis

    msg.text = e //要读的文字
    msg.lang = 'zh-CN' //读汉语
    msg.volume = 1 //音量
    msg.rate = 0.9 //语速
    msg.pitch = 0.8 //音色

    msg.addEventListener('start', () => {
        console.log("开始!!!!!!")
    });

    synth.speak(msg) //开始读

    msg.addEventListener('end', this.handleEndEvent());
},
handleEndEvent() {
    console.log("结束!!!!!!")
}

代码中的synth.speak(msg),当多个要转语音的文本进入队列时,它是阻塞的,排队队列的实现原则是先进先出的。

并且监听end函数一定要在speak函数后面。

同时建议使用edge浏览器或者低于7.6版本的谷歌浏览器来测试该功能!!!!!

 具体代码

<script>
    export default {
        data() {
			return {
                textZC: [],
				textZCZY: [],
                msginfo: '',
                divVisable: false,
                urlTwo: 'http://localhost:8083',
            }
        },
        methods: {
            getMessages() {
                uni.request({
                    url: this.urlTwo + '******',
                    method: 'GET',
                    dataType: 'json'
                }).then((res) => {
                    var that = this
                    // 我这里是将请求响应回来的要读取的文字暂存到一个数组中,用于展示内容。
                    const item = res[1].data.data.message
                    that.textZC.push(item.message)
                    that.textZCZY.push(item.message)
                    setTimeout(() => {
                        that.handleSpeak(item.message)
                    },100)
                })
            },
            handleSpeak(e) {
				const synth = window.speechSynthesis
				let voice = undefined
				// setTimeout(() => {
				//     voice = synth.getVoices(); //获取浏览器自带的语音包
				//     console.log(voice)
				// }, 50);
				setTimeout(() => {
					const msg = new SpeechSynthesisUtterance()
					const msgHK = new SpeechSynthesisUtterance()
					msg.text = e //要读的文字
					msg.lang = 'zh-CN' //读汉语
					msg.volume = 1 //音量
					msg.rate = 0.9 //语速
					msg.pitch = 0.8 //音色
					msgHK.text = e //要读的文字
					msgHK.lang = 'zh-HK' //读汉语
					msgHK.volume = 1 //音量
					msgHK.rate = 0.9 //语速
					msgHK.pitch = 0.8 //音色
					// if (this.voice[0] !== undefined) {
					// 	msg.voice = this.voice[0]; //设置语音包
					// }
					msg.addEventListener('start', () => {
						console.log("开始!!!!!!")
                        //将数组第一位的文本赋值给要展示的弹出框
						this.msginfo = this.textZC[0] 
						this.divVisable = true
					});
					synth.speak(msg) //开始读
					msg.addEventListener('end', this.handleEndEvent(msgHK,synth));
				}, 50);
			},
			handleEndEvent(msgHK,synth) {
				synth.speak(msgHK)
				msgHK.addEventListener('end', this.handleEndEventHK);
			},
			handleEndEventHK() {
				this.divVisable = false
				this.textZC.shift()
				this.textZCZY.shift()
			},
        }
</script>

        因为项目是在广东那边上线的所以他们要求先普通话再粤语来读语音,所以以上代码顺便实现了先普通话再粤语的功能。

        如果不需要 可以将msgHK相关的内容删除掉,并将handleEndEventHK里的内容放在handleEndEvent内,msgHK的end监听函数以及synth.speak(msgHK)删除即可。

        谢谢大家的观看!!希望对您的项目有所帮助,同时如果您有更好的方法实现此功能或者代码有需要优化的地方,希望提出宝贵意见,不胜感激!!!

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
VB(Visual Basic)是一种编程语言,而谷歌内核浏览器指的是基于谷歌内核(Google Chromium)开发的浏览器。 VB语言是一种易学易用的开发语言,广泛用于Windows平台的软件开发。通过VB编程,可以快速开发各种应用程序,包括浏览器。由于VB语言的开发环境和工具链完善,许多开发者选择使用VB来开发自定义浏览器谷歌内核谷歌开发的一种浏览器引擎,它负责解析和渲染网页内容。谷歌内核浏览器以其快速的加载速度、强大的性能和稳定的运行而受到广泛欢迎。谷歌内核浏览器支持现代Web标准,并提供了丰富的扩展和插件生态系统,使用户可以根据自己的需求进行个性化定制。 基于VB语言开发的谷歌内核浏览器具有以下特点: 1. 可定制性强:VB语言易学易用,开发者可以根据自己的需求进行定制,实现个性化的浏览器功能和界面设计。 2. 快速加载:谷歌内核浏览器的核心优势是其快速的加载速度,VB语言的开发环境可以充分发挥谷歌内核的性能优势。 3. 强大的功能支持:谷歌内核浏览器支持现代Web标准,并提供了丰富的功能和扩展,用户可以享受到更好的上网体验。 4. 稳定可靠:谷歌内核浏览器经过大规模的测试和优化,具有较高的稳定性和可靠性。 总之,基于VB语言开发的谷歌内核浏览器具有强大的定制能力、快速加载、丰富的功能支持和稳定性可靠等优点,为用户提供了更好的上网体验。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值