文字转语音 H5API方案(Hook,拿去就能用)+接口方案+浏览器阻止自动播放的隐藏问题

H5的API:

功能: 支持间隔特定时间播放(这里的坑是,无法预判播放语音要多久,所以间隔特定时间播放功能,不能定时调用speak,需要根据utterance的状态,在结束时调用speak)

开发文档:developer.mozilla.org/en-US/docs/...

useTextToVoice:

js 复制代码
import { message } from 'ant-design-vue';

const useTextToVoice = (gap = 1000, voiceType = 0) => {
  const synth = window.speechSynthesis;
  const voices = synth.getVoices();
  const utteranceQueue = []; // 待播报文本队列

  const checkVoiceSupport = () => {
    const isSupport = 'speechSynthesis' in window;
    if (!isSupport) {
      message.warn('您的浏览器不支持文本转语音功能。请更换浏览器或者升级浏览器版本。');
    }
    return isSupport;
  };

  const speak = (text) => {
    if (!checkVoiceSupport()) return;

    const utterance = new SpeechSynthesisUtterance(text);
    utterance.voice = voices[voiceType];

    // 如果有待播报的文本或者正在播报中,将文本添加到队列中
    if (synth.pending || synth.speaking) {
      utteranceQueue.push(text);
    } else {
      synth.speak(utterance);
    }

    utterance.onend = () => {
      console.log('speak end');
      // 检查队列中是否还有待播报的文本
      if (utteranceQueue.length > 0) {
        const nextText = utteranceQueue.shift();

        setTimeout(() => speak(nextText), gap);
      }
    };
  };

  return { speak };
};

export default useTextToVoice;

使用

scss 复制代码
const { speak } = useTextToVoice(2000);
直接调用speak()传入文本就好啦~

接口

还有另一种方式,使用接口,觉得要构建audio标签有点麻烦,没采用

api.oick.cn/txt/apiz.ph...

隐藏问题

这里有个坑,就是浏览器出于避免打扰用户,做了安全机制限制了需要用户与界面有一定交互才可以自动播放,目前可以实现自动播放的方案:

  1. 播放次数多了,浏览器安全值提高则会自动播放。
  2. 打开浏览器的安全设置,解除当前网站的播放限制(需要能拿到用户设备,手动设置,最后我们采用了这个)。
  3. 模仿爱奇艺等视频网站,提供静音按钮让用户解除静音。
  4. iframe(没试过,因为我们的需求是动态的播放内容,用文字转语音方案,没有现成的音频文件,所以没用到audio标签)

自动点击是不生效的,自动点击需要等手动点击之后才生效。不生效的原因是 浏览器内置了isTrusted变量,这个变量只有等用户操作后才会变成true,自动点击事件才会生效。 也是出于安全考虑。

MDN文档如下:

Event接口的isTrusted是一个Boolean类型的只读属性.当事件由用户操作生成时为true,由脚本创建或修改,或通过调用EventTarget.dispatchEvent生成,为false

相关推荐
java1234_小锋4 小时前
【技术专题】HTML5 网页技术 - HTML5 Canvas 基础以及动画入门
前端·html·html5
知了学历孙老师7 小时前
小自考的校考和统考,出题方和难度差在哪
java·大数据·前端
ShineWinsu9 小时前
对于JavaScript:操作元素的解析
开发语言·前端·javascript·面试·web·dom·元素
福兮说10 小时前
JSON 格式正确,数据就可靠吗?我用一份自编配置检查类型与空值
java·前端·json
程序员老赵12 小时前
Docker 部署青龙面板:轻松搭建定时任务管理平台
前端·docker·开源
Swot12 小时前
Asciidoctor 公式数字下标错位问题:原因分析与解决方案
前端
Swot12 小时前
leo-editor 中将 Markdown 内容转成 asciidoc 格式
前端
狒狒AI12 小时前
Remotion / GSAP+Three / HyperFrames / Skia 四栈实测:代码渲染知识视频的选栈方法(附开源技能)
前端·人工智能·aigc
修炼的dance12 小时前
浏览器里导出H.265,8.5秒和55.5秒差在硬件
前端
补码缩写12 小时前
WebCodecs选编码器,探测之后还要验解码和播放
前端