You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何预测speechSynthesis.speak()的语音播放时长?

预测Web Speech API语音合成朗读时长的可行方法

Web Speech API本身没有提供直接预测朗读时长的原生接口,但可以通过以下两种间接方法实现需求:

方法1:基于语速的估算(提前预测)

不同语言的语音合成有大致的基准语速(比如英式英文的平均语速约为160词/分钟),结合你设置的rate参数,可以估算出大致时长:

  • 先统计文本的单词数(英文可按空格分割,需简单处理标点干扰)
  • 用基准语速换算出每秒单词数,再结合rate值调整,最终时长 = 单词数 ÷ (基准语速/60) ÷ rate

示例代码:

// 简单统计英文单词数(可根据实际文本复杂度优化)
function countWords(text) {
  return text.trim().split(/\s+/).filter(word => word.length > 0).length;
}

// 估算朗读时长
function estimateDuration(text, rate, baseWPM = 160) {
  const wordCount = countWords(text);
  return (wordCount / baseWPM) * 60 / rate;
}

// 使用示例
const txt = "This is a sample text for speech synthesis";
const estimatedTime = estimateDuration(txt, 1.1);
console.log(`估算时长:${estimatedTime.toFixed(2)}秒`);

方法2:监听合成事件获取准确时长(实时计算)

如果可以接受在朗读开始后获取准确时长,可通过监听合成的start和end事件,计算时间差得到实际时长:

示例代码:

let msg = new SpeechSynthesisUtterance();
msg.lang = "en-GB";
msg.rate = 1.1;
msg.pitch = 1.1;
msg.text = txt;

let startTime;
msg.addEventListener('start', () => {
  startTime = Date.now();
});

msg.addEventListener('end', () => {
  const actualDuration = (Date.now() - startTime) / 1000;
  console.log(`实际朗读时长:${actualDuration.toFixed(2)}秒`);
});

window.speechSynthesis.speak(msg);

注意点

  • 方法1是估算值,精度取决于基准语速的选择,不同发音人的语速可能存在差异
  • 方法2能得到完全准确的时长,但只能在朗读结束后获取,无法提前预测

内容的提问来源于stack exchange,提问作者Diego

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 12:52:09