编程 浏览器居然自带语音 API 和流处理 API!

2024-11-19 06:19:21 +0800 CST views 539

惊了!浏览器居然自带语音 API 和流处理 API!

引言

在数字时代,网页的可访问性对所有用户来说都至关重要,尤其是对于有视觉障碍的用户或无法随时使用视觉的场景,传统的网页展示方式显得不够便利。浏览器提供的 语音合成 API(Speech Synthesis API)流处理 API(ReadableStream API),可以使网页内容通过语音“读出来”,或通过流的方式逐步加载和处理数据。

本文将介绍这些 API 的工作原理、应用场景,以及它们如何提升网页的可访问性和用户体验。
images

简介

1. Speech Synthesis API

  • 定义:Speech Synthesis API 允许浏览器将文本内容转换为语音输出。
  • 工作原理:开发者通过调用 speechSynthesis.speak() 方法,将文本发送到浏览器的语音合成引擎,生成语音。
  • 应用场景:为有视觉障碍的用户朗读网页内容;在驾驶等无法用眼时为用户提供信息(如导航)。

2. ReadableStream API

  • 定义:ReadableStream API 提供了一种处理数据流的方式,按需逐步读取数据而非一次性加载全部内容。
  • 工作原理:通过创建 ReadableStream 对象,数据可以按块(chunk)读取,实时处理。
  • 应用场景:处理大型文件、流媒体、实时数据,如在线阅读器或股市行情展示。

Speech Synthesis API 的使用

1. 基本用法

if ('speechSynthesis' in window) {
  const speechText = "这是一个语音合成示例。";
  const utterance = new SpeechSynthesisUtterance(speechText);

  // 可选:设置语音参数
  utterance.voice = speechSynthesis.getVoices()[0]; // 获取第一个可用语音
  utterance.pitch = 1;  // 音调
  utterance.rate = 1;   // 语速

  window.speechSynthesis.speak(utterance);  // 朗读文本
} else {
  alert('当前浏览器不支持语音合成 API。');
}

2. 高级用法

  • 监听事件:通过事件监听合成状态变化,如开始、暂停、结束。

    utterance.onstart = () => console.log("语音合成开始");
    utterance.onend = () => console.log("语音合成结束");
    
  • 支持多语言:通过设置 utterance.lang 属性可以支持不同的语言,如中文、英文等。

    utterance.lang = 'zh-CN';  // 朗读中文
    

ReadableStream API 的使用

1. 基本用法

const stream = new ReadableStream({
  start(controller) {
    // 将 "Hello World" 作为流数据
    controller.enqueue(new TextEncoder().encode("Hello"));
    controller.enqueue(new TextEncoder().encode("World"));
    controller.close();  // 结束流
  }
});

// 读取流数据
const reader = stream.getReader();
reader.read().then(({ value, done }) => {
  console.log(new TextDecoder().decode(value));  // 输出:Hello
});

2. 高级用法

  • 处理大型文件:分块处理大型文件,通过 ReadableStream 按需读取而不是一次性加载,减轻内存压力。
  • 实时数据处理:处理实时数据流,如音频、视频或 WebSocket 的数据传输,可以边接收边处理。

应用案例

1. 辅助阅读工具

描述:为有视觉障碍的用户开发一个网页辅助阅读工具,使用 Speech Synthesis API 将网页内容转换为语音。

<button id="read-btn">朗读页面内容</button>
<p id="text-to-read">欢迎来到语音合成示例页面,这里展示了如何将文字转换为语音。</p>

<script>
  document.getElementById('read-btn').addEventListener('click', function() {
    const textToRead = document.getElementById('text-to-read').innerText;
    if ('speechSynthesis' in window) {
      const utterance = new SpeechSynthesisUtterance(textToRead);
      window.speechSynthesis.speak(utterance);
    }
  });
</script>

2. 实时数据展示

描述:在新闻网站或股市行情中,使用 ReadableStream API 处理实时数据流。

const newsStream = new ReadableStream({
  start(controller) {
    // 模拟实时接收数据
    setTimeout(() => controller.enqueue(new TextEncoder().encode("最新新闻:")), 1000);
    setTimeout(() => controller.enqueue(new TextEncoder().encode("市场发生了大变化")), 2000);
    setTimeout(() => controller.close(), 3000); // 结束数据流
  }
});

// 处理流数据
const reader = newsStream.getReader();
function readNews() {
  reader.read().then(({ value, done }) => {
    if (!done) {
      console.log(new TextDecoder().decode(value)); // 输出每条新闻
      readNews(); // 递归读取
    }
  });
}

readNews();

总结

浏览器内置的 Speech Synthesis APIReadableStream API 提供了一种全新的交互方式,使网页内容可以通过语音或流式传输被“阅读”或处理。这不仅提升了网页的可访问性,还为开发者提供了新的应用场景和创新机会。

通过这些 API,开发者可以构建更智能、友好的网页应用,从而改善用户体验。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Speech Synthesis and Readable Stream Demo</title>
    <style>
        body {
            font-family: Arial, sans-serif;
            margin: 20px;
            padding: 0;
        }
        .container {
            margin-bottom: 20px;
        }
        button {
            padding: 10px 20px;
            background-color: #007bff;
            color: white;
            border: none;
            border-radius: 5px;
            cursor: pointer;
            font-size: 16px;
        }
        button:hover {
            background-color: #0056b3;
        }
        p {
            font-size: 18px;
        }
        #news-output {
            margin-top: 10px;
            padding: 10px;
            background-color: #f4f4f4;
            border: 1px solid #ccc;
            border-radius: 5px;
        }
    </style>
</head>
<body>

    <div class="container">
        <h2>Speech Synthesis API Demo</h2>
        <p id="text-to-read">欢迎来到语音合成示例页面,这里展示了如何将文字转换为语音。</p>
        <button id="read-btn">点击朗读</button>
    </div>

    <div class="container">
        <h2>ReadableStream API Demo</h2>
        <button id="start-stream">开始实时数据流</button>
        <div id="news-output"></div>
    </div>

    <script>
        // Speech Synthesis API Demo
        document.getElementById('read-btn').addEventListener('click', function() {
            const textToRead = document.getElementById('text-to-read').innerText;
            if ('speechSynthesis' in window) {
                const utterance = new SpeechSynthesisUtterance(textToRead);
                utterance.pitch = 1;  // 音调
                utterance.rate = 1;   // 语速
                window.speechSynthesis.speak(utterance);
            } else {
                alert('当前浏览器不支持语音合成 API。');
            }
        });

        // ReadableStream API Demo
        document.getElementById('start-stream').addEventListener('click', function() {
            const newsStream = new ReadableStream({
                start(controller) {
                    // 模拟实时数据流接收
                    setTimeout(() => controller.enqueue(new TextEncoder().encode("最新新闻:")), 1000);
                    setTimeout(() => controller.enqueue(new TextEncoder().encode("市场发生了大变化")), 2000);
                    setTimeout(() => controller.enqueue(new TextEncoder().encode("股市大跌 10%")), 3000);
                    setTimeout(() => controller.close(), 4000); // 结束数据流
                }
            });

            const reader = newsStream.getReader();
            const newsOutput = document.getElementById('news-output');
            newsOutput.innerHTML = ''; // 清空之前内容

            function readNews() {
                reader.read().then(({ value, done }) => {
                    if (!done) {
                        const text = new TextDecoder().decode(value);
                        newsOutput.innerHTML += `<p>${text}</p>`;  // 输出实时新闻内容
                        readNews();  // 递归继续读取数据
                    } else {
                        newsOutput.innerHTML += '<p><strong>数据流已结束。</strong></p>';
                    }
                });
            }

            readNews(); // 开始读取数据
        });
    </script>
</body>
</html>

复制全文 生成海报 网页开发 无障碍技术 前端技术

推荐文章

前端开发中常用的设计模式
2024-11-19 07:38:07 +0800 CST
Vue3中的v-bind指令有什么新特性?
2024-11-18 14:58:47 +0800 CST
Vue 中如何处理跨组件通信?
2024-11-17 15:59:54 +0800 CST
Shell 里给变量赋值为多行文本
2024-11-18 20:25:45 +0800 CST
vue打包后如何进行调试错误
2024-11-17 18:20:37 +0800 CST
Python 获取网络时间和本地时间
2024-11-18 21:53:35 +0800 CST
Plyr.js 播放器介绍
2024-11-18 12:39:35 +0800 CST
SQL常用优化的技巧
2024-11-18 15:56:06 +0800 CST
PHP 唯一卡号生成
2024-11-18 21:24:12 +0800 CST
Vue3 组件间通信的多种方式
2024-11-19 02:57:47 +0800 CST
php机器学习神经网络库
2024-11-19 09:03:47 +0800 CST
企业官网案例-芊诺网络科技官网
2024-11-18 11:30:20 +0800 CST
介绍 Vue 3 中的新的 `emits` 选项
2024-11-17 04:45:50 +0800 CST
Linux 网站访问日志分析脚本
2024-11-18 19:58:45 +0800 CST
Vue3中的v-slot指令有什么改变?
2024-11-18 07:32:50 +0800 CST
五个有趣且实用的Python实例
2024-11-19 07:32:35 +0800 CST
Vue3中如何进行错误处理?
2024-11-18 05:17:47 +0800 CST
MySQL 1364 错误解决办法
2024-11-19 05:07:59 +0800 CST
Go 1.23 中的新包:unique
2024-11-18 12:32:57 +0800 CST
实用MySQL函数
2024-11-19 03:00:12 +0800 CST
Go 如何做好缓存
2024-11-18 13:33:37 +0800 CST
Golang在整洁架构中优雅使用事务
2024-11-18 19:26:04 +0800 CST
Vue3中的自定义指令有哪些变化?
2024-11-18 07:48:06 +0800 CST
程序员茄子在线接单