IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 游戏开发 -> SpeechSynthesisUtterance语音播报的使用text-reader(HTML+CSS+Js) -> 正文阅读

[游戏开发]SpeechSynthesisUtterance语音播报的使用text-reader(HTML+CSS+Js)

SpeechSynthesisUtterance

Web Speech API的SpeechSynthesisUtterance接口代表一个语音请求。它包含语音服务应阅读的内容以及有关如何阅读的信息(例如语言、音高和音量)。–引自MDN

属性

SpeechSynthesisUtterance.lang
获取和设置说话的语言。
SpeechSynthesisUtterance.pitch
获取和设置说话的音调。
SpeechSynthesisUtterance.rate
获取和设置说话的速度。
SpeechSynthesisUtterance.text
获取并设置说话时将合成的文本。
SpeechSynthesisUtterance.voice
获取和设置将用于说语的声音。
SpeechSynthesisUtterance.volume
获取和设置说话的音量。

事件

boundary
当口语达到单词或句子边界时触发。
end
当口语结束时触发
error
当错误发生时触发,该错误导致无法成功说出该语句。
mark
当口语达到指定的SSML“mark”标记时触发。
pause
在说话暂停时触发
resume
当暂停的说话恢复时触发。
start
当开始说话时触发

小项目还是在github上面找的然后模仿着做的
在这里插入图片描述

在这里插入图片描述
html代码

<body>
    <div class="container">
        <h1>Speech Text Reader</h1>
        <button class="btn" id="toggle">Toggle Text Box</button>
        <div class="text-box show">
            <h3>Choose Voice</h3>
            <div id="close" class="close">X</div>
            <select name="" id="voices"></select>
            <textarea name="" id="text" placeholder="Enter text to read..."></textarea>
            <button class="btn" id="read">Read Text</button>
        </div>
        <main></main>
    </div>
    <script src="script.js"></script>
</body>

css代码

* {
    margin: 0;
    padding: 0;
    box-sizing: border-box;
}

body {
    background-color: #ffefea;
    min-height: 100vh;
}

.container {
    text-align: center;
    padding: 20px;
}

h1 {
    margin: 20px 0;
}

.btn {
    background-color: darksalmon;
    color: white;
    border-radius: 5px;
    font-size: 16px;
    padding: 8px;
    border: 0 none;
    cursor: pointer;
}

.btn:active {
    transform: scale(0.98);
}

#toggle {
    margin-bottom: 20px;
}

.text-box {
    position: absolute;
    top: 30%;
    left: 50%;
    width: 70%;
    transform: translateX(-50%);
    background-color: #333;
    padding: 20px;
    border-radius: 5px;
    color: white;
    transition: all 1s ease-in-out;
}

.close {
    float: right;
    cursor: pointer;
}

h3 {
    float: left;
    margin: 18px 0;
}

#voices {
    background-color: darksalmon;
    height: 30px;
    width: 100%;
    color: white;
    cursor: pointer;
    outline: none;
}

#text {
    margin: 15px 0;
    padding: 8px;
    font-size: 16px;
    border-radius: 5px;
    width: 100%;
    height: 150px;
    resize: none;
}

#read {
    width: 100%;
}

.show {
    transform: translate(-50%, -200%);
}

main {
    display: grid;
    grid-template-columns: repeat(4, 1fr);
    grid-gap: 10px;
}

.box {
    display: flex;
    flex-direction: column;
    cursor: pointer;
    box-shadow: 0 2px 10px rgba(0, 0, 0, 0.718);
    border-radius: 5px;
    overflow: hidden;
}

.box.active {
    box-shadow: 0 0 10px 5px darksalmon;
}

.box img {
    width: 100%;
    height: 200px;
    object-fit: cover;
}

.box .info {
    background-color: darksalmon;
    padding: 10px;
    color: white;
    font-size: 18px;
}

@media (max-width:1100px) {
    main {
        grid-template-columns: repeat(3, 1fr);
    }
}

@media(max-width:760px) {
    main {
        grid-template-columns: repeat(2, 1fr);
    }
}

@media(max-width:500px) {
    main {
        grid-template-columns: 1fr;
    }
}

js代码

var toggleBtn = document.querySelector('#toggle')
var textbox = document.querySelector('.text-box')
var closeBtn = document.querySelector('#close')
var main = document.querySelector('main')
var readBtn = document.querySelector('#read')
var textarea = document.querySelector('#text')
var voicesSelect = document.querySelector('#voices')


toggleBtn.addEventListener('click', () =>
    textbox.classList.toggle('show'))

closeBtn.addEventListener('click', () => {
    textbox.classList.toggle('show')
    textarea.value = ''
})

var data = [{
        image: './img/drink.jpg',
        text: "多喝热水"
    },
    {
        image: './img/food.jpg',
        text: "不要减肥"
    },
    {
        image: './img/tired.jpg',
        text: "多睡觉"
    },
    {
        image: './img/hurt.jpg',
        text: "啊哦"
    },
    {
        image: './img/happy.jpg',
        text: "病毒快死!"
    },
    {
        image: './img/angry.jpg',
        text: "疫情快滚!"
    },
    {
        image: './img/sad.jpg',
        text: "烦死人啦!"
    },
    {
        image: './img/scared.jpg',
        text: "好想出去玩"
    },
    {
        image: './img/outside.jpg',
        text: '世界多好'
    },
    {
        image: './img/home.jpg',
        text: '快出去!'
    },
    {
        image: './img/school.jpg',
        text: '想回学校!'
    },
    {
        image: './img/grandma.jpg',
        text: '呜呜呜'
    }
];
data.forEach(createBox)

function createBox(item) {
    var box = document.createElement('div')
    box.classList.add('box')
    var { image, text } = item
    box.innerHTML = `<img src="${image}" alt="text"/><p class="info">${text}</p>`
    box.addEventListener('click', () => {
        setTextMessage(text)
        speakText()
        box.classList.add('active')
        setTimeout(() => {
            box.classList.remove('active')
        }, 800);
    })
    main.appendChild(box);
}

var message = new SpeechSynthesisUtterance()

var voices = []

function setTextMessage(text) {
    message.text = text
}

function speakText() {
    speechSynthesis.speak(message)
}

speechSynthesis.addEventListener('voiceschanged', getVoices)

readBtn.addEventListener('click', () => {
    setTextMessage(textarea.value)
    speakText()
})

function getVoices() {
    voices = speechSynthesis.getVoices()
    voices.forEach(voice => {
        var options = document.createElement('option')
        options.value = voice.name
        options.innerHTML = `${voice.name}${voice.lang}`
        voicesSelect.appendChild(options)
    })
}

voicesSelect.addEventListener('change', function(e) {
    message.voice = voices.find(voices => voices.name === e.target.value)
})

写的可能有点乱,都是想到哪写到哪,不会了就去看看人家咋写的了。

  游戏开发 最新文章
6、英飞凌-AURIX-TC3XX: PWM实验之使用 GT
泛型自动装箱
CubeMax添加Rtthread操作系统 组件STM32F10
python多线程编程:如何优雅地关闭线程
数据类型隐式转换导致的阻塞
WebAPi实现多文件上传,并附带参数
from origin ‘null‘ has been blocked by
UE4 蓝图调用C++函数(附带项目工程)
Unity学习笔记(一)结构体的简单理解与应用
【Memory As a Programming Concept in C a
上一篇文章      下一篇文章      查看所有文章
加:2022-04-26 12:08:57  更:2022-04-26 12:11:21 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2025年1日历 -2025/1/17 0:07:53-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码