提问人:tsh 提问时间:9/19/2023 最后编辑:tsh 更新时间:9/19/2023 访问量:80
iOS 17 上的 SpeechSynthesis API 因某些文本而失败
SpeechSynthesis API on iOS 17 failed with certain text
问:
let voice = null;
function updateVoice() {
voice = speechSynthesis.getVoices().find(voice => voice.lang == 'zh-CN')
document.getElementById('voice_name').textContent = voice?.name ?? '(No Voice)';
}
speechSynthesis.addEventListener('voiceschanged', updateVoice);
updateVoice()
const speak = document.getElementById('speak');
const text = document.getElementById('text');
speak.addEventListener('click', () => {
const ssu = new SpeechSynthesisUtterance(text.value);
ssu.voice = voice;
ssu.lang = 'zh-CN';
ssu.addEventListener('start', e => console.log('start', e));
ssu.addEventListener('end', e => console.log('end', e));
ssu.addEventListener('error', e => console.log('error', e));
speechSynthesis.speak(ssu);
});
<textarea id="text">“你好”</textarea>
<div id="voice_name"></div>
<button type="button" id="speak">
Speak
</button>
我使用语音合成 API 简化的 PWA 在 Safari iOS 16.5 上运行,但在我将设备升级到 iOS 17 后它就失败了。代码如上所示。在装有 iOS 2 的 iPhone SE17 上运行时,尝试说话(用 CJK 引号)结果什么也没发生。但是,如果删除引号并仅保留在文本区域中,然后再次单击“朗读”按钮,它将按预期工作。我不确定我能做些什么来解决这个问题。那么谁能帮我在这里找到工作呢?“你好”
你好
“”
你好
答:
0赞
tsh
9/19/2023
#1
由于要说话的文本是由用户提供的,这超出了我的控制范围。我无法避免文本中的引用。经过一番尝试和错误。到目前为止,我得到的最好的解决方法是:
- 附加到 ssu 的每个文本上
“”。
这可能很棘手,但无论如何都有效。
const extraSuffix = '“”。';
let voice = null;
function updateVoice() {
voice = speechSynthesis.getVoices().find(voice => voice.lang == 'zh-CN')
document.getElementById('voice_name').textContent = voice?.name ?? '(No Voice)';
}
speechSynthesis.addEventListener('voiceschanged', updateVoice);
updateVoice()
const speak = document.getElementById('speak');
const text = document.getElementById('text');
speak.addEventListener('click', () => {
const ssu = new SpeechSynthesisUtterance(text.value + extraSuffix);
ssu.voice = voice;
ssu.lang = 'zh-CN';
ssu.addEventListener('start', e => console.log('start', e));
ssu.addEventListener('end', e => console.log('end', e));
ssu.addEventListener('error', e => console.log('error', e));
speechSynthesis.speak(ssu);
});
<textarea id="text">“你好”</textarea>
<div id="voice_name"></div>
<button type="button" id="speak">
Speak
</button>
我发现如果我在文本末尾附加一个,语音合成就会再次起作用。但是,会有不同的曲调,这不是我想要的。但工作正常。这就是为什么它使用如此奇怪的后缀。。
怎么?
怎么?。
怎么?“”。
评论