语音合成 API 在说出单词时突出显示单词

2023-11-22

目前,我正在制作一个简单的应用程序,其中使用语音合成 API 说出文本。我想突出显示正在说出的单词(粗体)。我目前有一个非常基本的实现,使用“onboundary”事件来执行此操作。然而,我想知道是否有更好/更好的方法来做到这一点,因为我的实现是基于一些假设。

var words;
var wordIdx;
var text;
var utterance = new SpeechSynthesisUtterance();
utterance.lang = 'en-UK';
utterance.rate = 1;

window.onload = function(){
    document.getElementById('textarea').innerText = 'This is a text area.  It is used as a simple test to check whether these words are highlighted as they are spoken using the web speech synthesis API (utterance).';

    document.getElementById('playbtn').onclick = function(){
        text    = document.getElementById('textarea').innerText;
        words   = text.split(' ');
        wordIdx = 0;

        utterance.text = text;
        speechSynthesis.speak(utterance);
    }

    utterance.onboundary = function(event){
        var e = document.getElementById('textarea');
        var it = '';

        for(var i = 0; i < words.length; i++){
            if(i === wordIdx){
                it += '<strong>' + words[i] + '</strong>';
            } else {
                it += words[i];
            }

            it += ' ';
        }

        e.innerHTML = it;
        wordIdx++;
    }
}

您的代码不起作用,但我刚刚编写了一个可以按照您想要的方式工作的示例。打开小提琴看看它的工作情况

var utterance = new SpeechSynthesisUtterance();
var wordIndex = 0;
var global_words = [];
utterance.lang = 'en-UK';
utterance.rate = 1;


document.getElementById('playbtn').onclick = function(){
    var text    = document.getElementById('textarea').value;
    var words   = text.split(" ");
    global_words = words;
    // Draw the text in a div
    drawTextInPanel(words);
    spokenTextArray = words;
    utterance.text = text;
    speechSynthesis.speak(utterance);
};

utterance.onboundary = function(event){
    var e = document.getElementById('textarea');
    var word = getWordAt(e.value,event.charIndex);
    // Show Speaking word : x
    document.getElementById("word").innerHTML = word;
    //Increase index of span to highlight
    console.info(global_words[wordIndex]);

    try{
        document.getElementById("word_span_"+wordIndex).style.color = "blue";
    }catch(e){}

    wordIndex++;
};

utterance.onend = function(){
        document.getElementById("word").innerHTML = "";
    wordIndex = 0;
    document.getElementById("panel").innerHTML = "";
};

// Get the word of a string given the string and the index
function getWordAt(str, pos) {
    // Perform type conversions.
    str = String(str);
    pos = Number(pos) >>> 0;

    // Search for the word's beginning and end.
    var left = str.slice(0, pos + 1).search(/\S+$/),
        right = str.slice(pos).search(/\s/);

    // The last word in the string is a special case.
    if (right < 0) {
        return str.slice(left);
    }
    // Return the word, using the located bounds to extract it from the string.
    return str.slice(left, right + pos);
}

function drawTextInPanel(words_array){
console.log("Dibujado");
        var panel = document.getElementById("panel");
    for(var i = 0;i < words_array.length;i++){
        var html = '<span id="word_span_'+i+'">'+words_array[i]+'</span>&nbsp;';
        panel.innerHTML += html;
    }
}

请演奏以下小提琴:

突出显示口语单词 SpeechSynthesis Javascript 小提琴

它用蓝色突出显示div中的口语单词,您可以自定义它的粗体样式,但重要的是想法。

Note:请记住onboundary仅当本机(本地)语音合成时才会触发事件。按照 Google 示例中指定的方式更改语音(即谷歌英国英国男)对于谷歌远程语音,将使您的代码失败,因为 SpeechSynthesis API 似乎只播放谷歌服务器生成的声音。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

语音合成 API 在说出单词时突出显示单词 的相关文章

随机推荐

  • Android 设备上的低功耗蓝牙 RSSI 会定期更改

    我注意到 Android 上接收到的低功耗蓝牙信号强度随周期变化 下图表示一个 BLE 信标在两分钟内的 RSSI 值 接收机器人和信标均处于静止状态 距离均为 1 米 我确保干扰尽可能低 Android 是 Nexus 5 但我在其他 A
  • 使用 jQuery 最小化/最大化 div

    我基本上想最小化一些 div 我不想使用 和 而是想使用一些符号 来自 font awesome 来最小化和最大化 div 我对此的问题 如何在这段代码中插入图标 的类 我尝试用 attr 替换 html 部分 但这没有成功 多谢 Upda
  • 如何在 OnCompleteListener Firebase 中使用异步/等待/协程

    我正在构建一个客户端应用程序 它使用 Firebase 来做两件事 用户认证 使用实时数据库 我已成功在客户端和后端服务器上正确设置所有内容 使用 Firebase 的 Admin SDK 并且能够正确验证用户身份并允许他们读取 写入数据库
  • 哪些代码控制 WPF 应用程序的启动?

    更具体地说 我怎样才能设置像这样的启动顺序在 WPF 中 启动时不显示窗口 但存在通知图标 要运行 WPF 需要Application目的 当你执行时Run在该对象上 应用程序进入无限循环 事件循环负责处理用户输入和任何其他操作系统信号 换
  • 为什么运行一次(并且从未加载)的 Meteor 应用程序的数据库占用了近 3GB?

    UPDATE 这个问题在 Meteor v0 4 2012 之后得到了修复 出于历史目的 摘自du 2890768 Code Meteor QuarterTo meteor local db journal 2890772 Code Met
  • Dask read_csv 失败,而 pandas 则失败

    尝试使用 dask 的read csv在文件中 pandas 的位置read csv像这样 dd read csv data ecommerce new csv 失败并出现以下错误 pandas errors ParserError Err
  • 使用子类对象访问超类函数

    我有一个扩展其超类的子类对象 子类中有一个重写的方法 可以使用该对象调用 是否可以使用子类对象调用超类的函数 package supercall public class Main public static void main Strin
  • 如何编写可以运行 x86 十六进制代码的 C 程序

    我有一组十六进制代码 可以转换为汇编指令 我想用 C 语言创建可以执行这些指令的程序 unsigned char rawData 5356 0x4C 0x01 0x0A 0x00 0x00 0x00 0x00 0x00 0x64 0x0C
  • 如何在 php 中从 .doc 模板创建 word .doc 文件

    我需要从Word模板创建一个Word文档 就像我们需要用值替换模板中的几个字符串 比如变量 请告诉我们如何在 PHP 或 cakePHP 中做到这一点 我建议查看 phpLiveDocx http www phplivedocx org 还
  • 存储指令是否会在缓存未命中时阻塞后续指令?

    假设我们有一个具有两个核心 C0 和 C1 的处理器和一个从地址开始的高速缓存行k最初由 C0 拥有 如果 C1 在第 8 行的 8 字节槽上发出存储指令k 这会影响 C1 上执行的以下指令的吞吐量吗 intel优化手册有如下一段 当指令将
  • Java 的接口优势

    我的问题很简单 如果接口由单个类实现 那么使用接口有什么优势吗 我一直认为只有当接口有多个实现时 接口才是好的 Thanks 一句话 不 接口所表示的契约可以直接在您唯一的类中指定 如果您清楚将来不需要相同方法的另一个实现 则可以避免定义接
  • 选择框选项上的工具提示

    我有一个选择框 其中选项具有策略名称 我需要在选项的工具提示中显示策略的描述 我尝试了tipr插件 其中使用了data tip选项 它适用于 div span 等 但不适用于选择框选项 我还尝试了上面链接中附加的正常方法 仅当下拉列表默认打
  • .NET 5 GRPC 客户端调用引发异常:在未启用 HTTP/2 的情况下使用版本策略 RequestVersionOrHigher 请求 HTTP 版本 2.0

    这是我的第一个 gRPC 应用程序 我尝试从 NET 5 gRPC 客户端 Grpc Net Client 2 35 0 调用服务器流式 RPC 调用 这会在我的本地开发环境中导致以下异常 Grpc Core RpcException 状态
  • 如何在google v8(和nodejs)中渲染32位unicode字符

    有谁知道如何在谷歌v8 驱动谷歌浏览器和nodejs的javascript虚拟机 中渲染unicode 星体平面 字符 其CID超出0xffff 有趣的是 当我给google chrome 它标识为11 0 696 71 在ubuntu 1
  • 如何使用 FieldValue.serverTimestamp() 在 android 中自定义模型类

    我使用 Firestore 作为数据库 现在我想在用户注册时存储服务器时间戳 来自 Firestore 文档 Map
  • 使用 jquery 增加和减少输入值

    单击 和 按钮时我需要增加和减少输入的值 但它似乎不起作用 我从这篇文章中得到了代码 如何使用 jQuery 增加数量字段的值 单击添加按钮时 我插入了一条 console log 语句以进行调试 令人惊讶的是 即使我单击了 id 为 ad
  • 分布式作业调度、管理和报告

    我最近玩了Hadoop它对 MapReduce 作业的调度 管理和报告印象深刻 它似乎使新作业的分配和执行变得非常无缝 使开发人员能够专注于其作业的实施 我想知道Java领域中是否存在一些对于作业的分布式执行来说不容易表达为MapReduc
  • RandomNumber 方法每次调用都返回相同的数字

    每次从 for 循环中调用 RandomNumber 方法时 我都尝试生成不同的随机数 现在 它每次都返回相同的数字 这是我的 RandomNumber 方法 private int RandomNumber int min int max
  • 我如何模拟 java.time.LocalDate.now()

    在我的测试用例中 我需要测试时间敏感的方法 在该方法中我们使用 java 8 类 LocalDate 它是not Joda 当我运行测试时 我可以做什么来改变时间 在您的代码中 替换LocalDate now with LocalDate
  • 语音合成 API 在说出单词时突出显示单词

    目前 我正在制作一个简单的应用程序 其中使用语音合成 API 说出文本 我想突出显示正在说出的单词 粗体 我目前有一个非常基本的实现 使用 onboundary 事件来执行此操作 然而 我想知道是否有更好 更好的方法来做到这一点 因为我的实