文字转语音 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

相关推荐
开开心心_Every6 分钟前
无广告输入法推荐:内置丰富词库免费皮肤
服务器·前端·学习·决策树·edge·powerpoint·动态规划
卓怡学长1 小时前
m111基于MVC的舞蹈网站的设计与实现
java·前端·数据库·spring boot·spring·mvc
C_心欲无痕6 小时前
前端实现水印的两种方式:SVG 与 Canvas
前端·安全·水印
尾善爱看海9 小时前
不常用的浏览器 API —— Web Speech
前端
美酒没故事°10 小时前
vue3拖拽+粘贴的综合上传器
前端·javascript·typescript
jingling55511 小时前
css进阶 | 实现罐子中的水流搅拌效果
前端·css
悟能不能悟12 小时前
前端上载文件时,上载多个文件,但是一个一个调用接口,怎么实现
前端
可问春风_ren13 小时前
前端文件上传详细解析
前端·ecmascript·reactjs·js
羊小猪~~13 小时前
【QT】--文件操作
前端·数据库·c++·后端·qt·qt6.3
晚风资源组14 小时前
CSS文字和图片在容器内垂直居中的简单方法
前端·css·css3