文字转语音入门版:用HTML和JavaScript实现语音朗读功能

1,080 阅读5分钟

背景

在现代的Web开发中,为用户提供更丰富的交互体验是一种常见的需求。文字转语音(Text-to-Speech,TTS)功能就是一个很好的例子,它可以帮助用户更轻松地获取信息,尤其是对于那些视力不佳或需要在开车等场景下获取信息的用户。本文将介绍如何使用HTML和JavaScript实现一个简单的文字转语音功能,并通过实际示例代码进行讲解。

一、什么是文字转语音(TTS)

文字转语音(TTS)是一种将文本内容转换为语音的技术。通过TTS,计算机可以将文字朗读出来,让用户能够听到文本内容。这种技术广泛应用于各种场景,如语音助手、有声读物、导航系统等。

二、实现文字转语音的基础

在浏览器中,我们可以使用Web Speech API来实现文字转语音功能。Web Speech API是一个强大的API,它提供了语音识别和语音合成的功能。本文将重点介绍语音合成部分。

1. Web Speech API简介

Web Speech API提供了window.speechSynthesis对象,用于控制语音合成。通过这个对象,我们可以创建语音实例(SpeechSynthesisUtterance),设置语音的音量、语速等属性,并控制语音的播放、暂停和停止。

2. 创建语音实例

要实现文字转语音,首先需要创建一个SpeechSynthesisUtterance实例。这个实例代表了要朗读的文本内容。以下是创建语音实例的基本代码:

const textToRead = "这是一个示例文本。";
const utterance = new SpeechSynthesisUtterance(textToRead);

3. 设置语音属性

SpeechSynthesisUtterance实例提供了多种属性,用于控制语音的朗读效果。常用的属性包括:

  • volume:音量,取值范围为0到1。
  • rate:语速,取值范围为0.1到10。
  • pitch:音调,取值范围为0到2。

以下是设置语音属性的代码示例:

utterance.volume = 1;  // 设置音量为最大
utterance.rate = 1;    // 设置语速为正常
utterance.pitch = 1;   // 设置音调为正常

4. 控制语音播放

通过window.speechSynthesis对象,我们可以控制语音的播放、暂停和停止。以下是控制语音播放的代码示例:

// 播放语音
window.speechSynthesis.speak(utterance);

// 暂停语音
window.speechSynthesis.pause();

// 继续语音
window.speechSynthesis.resume();

// 停止语音
window.speechSynthesis.cancel();

三、实际示例:一个简单的文字转语音应用

接下来,我们将通过一个实际的HTML和JavaScript示例,展示如何实现一个简单的文字转语音应用。

1. HTML部分

HTML部分定义了用户界面,包括一个文本框用于输入要朗读的文字,以及播放、暂停、继续和重新播放的按钮。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>文字转语音</title>
    <style>
        .highlight {
            background-color: yellow;
        }
    </style>
</head>
<body>
    <textarea id="text-to-read" rows="10" cols="50" placeholder="在这里输入文字..."></textarea><br>

    <label for="volume-range">音量:</label>
    <input type="range" id="volume-range" min="0" max="1" step="0.1" value="1">
    <span id="volume-value">1</span><br>

    <label for="rate-range">语速:</label>
    <input type="range" id="rate-range" min="0.5" max="2" step="0.1" value="1">
    <span id="rate-value">1</span><br>

    <button id="play-button">播放</button>
    <button id="pause-button">暂停</button>
    <button id="resume-button">继续</button>
    <button id="restart-button">重新播放</button>

    <div id="highlighted-text"></div>

    <!-- <button id="generate-audio-button">生成音频</button>
    <audio id="saved-audio" controls></audio> -->

    <script src="script.js"></script>
    <!-- <script src="script2.js"></script> -->
</body>
</html>

2. JavaScript部分

JavaScript部分实现了文字转语音的核心逻辑,包括获取用户输入的文本、设置语音属性、控制语音播放以及高亮显示当前正在朗读的单词或句子。

// 获取页面元素
const textToRead = document.getElementById('text-to-read');
const playButton = document.getElementById('play-button');
const pauseButton = document.getElementById('pause-button');
const resumeButton = document.getElementById('resume-button');
const restartButton = document.getElementById('restart-button');

// 音量和语速控件
const volumeRange = document.getElementById('volume-range');
const volumeValue = document.getElementById('volume-value');
const rateRange = document.getElementById('rate-range');
const rateValue = document.getElementById('rate-value');

// 高亮文本区域
const highlightedText = document.getElementById('highlighted-text');

// 语音合成实例
const synth = window.speechSynthesis;
let utterance = null;  // 保存语音实例
let currentIndex = 0;  // 当前正在读的句子/单词的索引

// 更新音量和语速显示
volumeRange.addEventListener('input', function() {
    volumeValue.textContent = volumeRange.value;  // 显示当前音量
});

rateRange.addEventListener('input', function() {
    rateValue.textContent = rateRange.value;  // 显示当前语速
});

// 将文本分割成句子或单词
function splitTextIntoWords(text) {
    return text.split(/([\s\n。,,.;:、])/);
}

// 高亮显示当前的句子或单词
function updateHighlightedText(words, currentIndex) {
    highlightedText.innerHTML = '';  // 清空高亮区域
    words.forEach((word, index) => {
        const span = document.createElement('span');
        span.textContent = word;
        if (index === currentIndex) {
            span.classList.add('highlight');  // 添加高亮样式
        }
        highlightedText.appendChild(span);
    });
}

// 播放按钮点击事件
playButton.addEventListener('click', function() {
    if (synth.speaking) {
        return;
    }

    const text = textToRead.value;
    if (text !== '') {
        const words = splitTextIntoWords(text);  // 将文本分割成单词或句子
        utterance = new SpeechSynthesisUtterance(text);
        utterance.volume = parseFloat(volumeRange.value);  // 设置音量
        utterance.rate = parseFloat(rateRange.value);      // 设置语速
        
        // 监听语音的boundary事件,每当朗读到一个新句子或单词时触发
        utterance.addEventListener('boundary', function(event) {
            const charIndex = event.charIndex;  // 当前朗读到的字符索引
            // 根据字符索引判断当前的单词
            currentIndex = words.findIndex(word => text.indexOf(word) <= charIndex && charIndex < text.indexOf(word) + word.length);
            updateHighlightedText(words, currentIndex);  // 更新高亮显示
        });

        synth.speak(utterance);
    }
});

// 暂停按钮点击事件
pauseButton.addEventListener('click', function() {
    if (synth.speaking && !synth.paused) {
        synth.pause();  // 暂停当前播放
    }
});

// 继续按钮点击事件
resumeButton.addEventListener('click', function() {
    if (synth.paused) {
        synth.resume();  // 继续当前播放
    }
});

// 重新播放按钮点击事件
restartButton.addEventListener('click', function() {
    if (utterance) {
        synth.cancel();  // 停止当前播放
    }
    const text = textToRead.value;
    if (text !== '') {
        const words = splitTextIntoWords(text);  // 将文本分割成单词或句子
        utterance = new SpeechSynthesisUtterance(text);
        utterance.volume = parseFloat(volumeRange.value);  // 设置音量
        utterance.rate = parseFloat(rateRange.value);      // 设置语速

        // 监听boundary事件
        utterance.addEventListener('boundary', function(event) {
            const charIndex = event.charIndex;  // 当前朗读到的字符索引
            currentIndex = words.findIndex(word => text.indexOf(word) <= charIndex && charIndex < text.indexOf(word) + word.length);
            updateHighlightedText(words, currentIndex);  // 更新高亮显示
        });

        synth.speak(utterance);  // 重新开始播放
    }
});

3. 功能说明

  • 输入文本:用户可以在文本框中输入要朗读的文字。
  • 音量和语速调节:用户可以通过滑动条调节音量和语速。
  • 高亮显示:在朗读过程中,当前正在朗读的单词或句子会被高亮显示,方便用户跟随。
  • 播放控制:支持播放、暂停、继续和重新播放的功能。

四、总结

通过本文的介绍,你已经了解了如何使用HTML和JavaScript实现一个简单的文字转语音应用。Web Speech API提供了强大的功能,可以帮助我们轻松地将文本内容转换为语音。你可以根据实际需求进一步扩展这个应用,例如支持多种语言、添加语音保存功能等。如有需要扩展功能的实现,可留言。

希望本文对你有所帮助!如果你有任何问题或建议,欢迎在评论区留言。


作者简介:我是Rafer,一个热爱技术的开发者。如果你喜欢这篇文章,别忘了点赞和分享哦!