SpeechSynthesis onboundary事件未触发问题求助
以下是几个可能导致onboundaryHandler未被调用的原因及对应的解决思路:
文本内容为空或过短
你的textToSpeak初始值是空字符串,如果点击播放时未给它赋值有效文本,语音合成不会执行,自然不会触发边界事件。另外,极短的文本(比如单个单词)可能也无法触发boundary事件,因为没有明确的语音边界可以检测。
解决:确保textToSpeak被赋值为包含多个单词或句子的有效文本,比如设置textToSpeak = "Hello world, this is a test sentence."。事件绑定方式的兼容性问题
部分浏览器对直接赋值onboundary属性的支持不如使用addEventListener稳定。
解决:替换事件绑定方式,改用addEventListener:utterance.addEventListener('boundary', this.onboundaryHandler);浏览器兼容性限制
不同浏览器对Web Speech API的boundary事件支持存在差异,比如部分版本的Safari或移动端浏览器可能不支持该事件,或者支持程度有限。
解决:在Chrome、Edge等对Web Speech API支持更完善的浏览器中测试,同时可以通过'onboundary' in SpeechSynthesisUtterance.prototype提前检测浏览器是否支持该事件。语音合成的异步状态问题
初始调用this.synth.getVoices()可能无法获取到语音列表(因为语音包是异步加载的),如果当前使用的语音不支持边界事件,也会导致触发失败。另外,如果speechSynthesis处于暂停或其他异常状态,也会影响事件触发。
解决:监听voiceschanged事件确保语音加载完成后再使用:constructor() { this.synth.onvoiceschanged = () => { this.voices = this.synth.getVoices(); }; }同时播放前可以检查
speechSynthesis.paused状态,确保处于可播放状态。上下文绑定问题
虽然你的play是箭头函数,this指向组件实例,但如果onboundaryHandler被意外改变上下文,也可能导致无法正常执行(不过当前代码中这种情况概率较低)。
解决:可以将onboundaryHandler定义为箭头函数,确保上下文稳定:onboundaryHandler = (event: any) => { console.log('onboundaryHandler called *************') }
内容的提问来源于stack exchange,提问作者koque

