iOS 17 上的 SpeechSynthesis API 因某些文本而失败

问题描述 投票:0回答:1

更新:已在 iOS 18 上修复

let voice = null;
function updateVoice() {
  voice = speechSynthesis.getVoices().find(voice => voice.voiceURI == 'com.apple.voice.compact.zh-CN.Tingting')
  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>

我的 PWA 使用语音合成 API 简单地可以在 Safari iOS 16.5 上运行,但在我将设备升级到 iOS 17 后就失败了。代码如上所示。当我在装有 iOS 17 的 iPhone SE3 上运行时,尝试说出

“你好”
你好
,带 CJK 引号
“”
)结果没有任何反应。但是,如果您删除引号并仅在文本区域中保留
你好
,然后再次单击“讲话”按钮,它将按预期工作。我不知道我能做些什么来解决这个问题。那么有人可以帮我在这附近找到工作吗?

javascript ios safari cjk speech-synthesis
1个回答
0
投票

由于说话的文字是由用户给出的,这是我无法控制的。我无法避免在文中引用这句话。经过一番尝试和错误。到目前为止我得到的最好的解决方法是:

  • 在 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>

我发现如果我在文本末尾添加

,语音合成会再次起作用。然而,
怎么?
怎么?。
会有不同的曲调,这不是我想要的。但是
怎么?“”。
效果很好。这就是为什么它使用如此奇怪的后缀。

© www.soinside.com 2019 - 2024. All rights reserved.