如何在 Chromium 浏览器中创建文本或将文本转换为音频?

2024-02-08

在尝试确定解决方案时如何在 chromium 上使用 Web Speech API? https://stackoverflow.com/questions/44013933/how-to-use-web-speech-api-at-chromium发现

var voices = window.speechSynthesis.getVoices();

返回一个空数组voices标识符。

不确定 chromium 浏览器缺乏支持是否与此问题有关谷歌不行:Chromium 语音扩展因间谍问题而被撤下 https://arstechnica.com/security/2015/06/not-ok-google-chromium-voice-extension-pulled-after-spying-concerns/?

问题:

1)是否有任何解决方法可以实现在 Chromium 浏览器中创建或从文本转换音频的要求?

2)我们开发者社区如何创建一个反映常见和不常见单词的音频文件的开源数据库;配以适当的CORS标题?


有几种可能的解决方法可以提供从文本创建音频的能力;其中两个需要请求外部资源,另一个使用meSpeak.js http://www.masswerk.at/mespeak/通过@masswerk。

使用描述于的方法从 Google 下载单词的音频发音 https://www.labnol.org/internet/download-audio-pronunciation-words/21064/,它的缺点是无法预先确定哪些单词实际上作为资源中的文件存在,而无需编写 shell 脚本 https://github.com/thevoiceless/google_words/blob/master/google_words.py或执行HEAD请求检查是否发生网络错误。例如,“do”一词在下面使用的资源中不可用。

window.addEventListener("load", () => {

  const textarea = document.querySelector("textarea");

  const audio = document.createElement("audio");

  const mimecodec = "audio/webm; codecs=opus";

  audio.controls = "controls";

  document.body.appendChild(audio);

  audio.addEventListener("canplay", e => {
    audio.play();
  });

  let words = textarea.value.trim().match(/\w+/g);

  const url = "https://ssl.gstatic.com/dictionary/static/sounds/de/0/";

  const mediatype = ".mp3";

  Promise.all(
    words.map(word =>
      fetch(`https://query.yahooapis.com/v1/public/yql?q=select * from data.uri where url="${url}${word}${mediatype}"&format=json&callback=`)
      .then(response => response.json())
      .then(({query: {results: {url}}}) =>
        fetch(url).then(response => response.blob())
        .then(blob => blob)
      )
    )
  )
  .then(blobs => {
    // const a = document.createElement("a");
    audio.src = URL.createObjectURL(new Blob(blobs, {
                  type: mimecodec
                }));
    // a.download = words.join("-") + ".webm";
    // a.click()
  })
  .catch(err => console.log(err));
});
<textarea>what it does my ninja?</textarea>

资源位于维基共享资源类别:公共领域 https://commons.wikimedia.org/wiki/Category:Public_domain不需要从同一目录提供服务,请参阅如何检索维基词典单词内容? https://stackoverflow.com/questions/2770547/how-to-retrieve-wiktionary-word-content, 维基百科 API - 单词的含义 https://stackoverflow.com/questions/4175533/wikionary-api-meaning-of-words.

如果知道资源的精确位置,则可以请求音频,尽管 URL 可能包含单词本身以外的前缀。

fetch("https://upload.wikimedia.org/wikipedia/commons/c/c5/En-uk-hello-1.ogg")
.then(response => response.blob())
.then(blob => new Audio(URL.createObjectURL(blob)).play());

不完全确定如何使用维基百科API https://en.wiktionary.org/wiki/Special:ApiSandbox, 如何使用维基百科的 API 获取维基百科内容? https://stackoverflow.com/questions/7185288/how-to-get-wikipedia-content-using-wikipedias-api, 仅获取音频文件。这JSON响应需要解析以结尾的文本.ogg,那么需要对资源本身发出第二个请求。

fetch("https://en.wiktionary.org/w/api.php?action=parse&format=json&prop=text&callback=?&page=hello")
.then(response => response.text())
.then(data => {
  new Audio(location.protocol + data.match(/\/\/upload\.wikimedia\.org\/wikipedia\/commons\/[\d-/]+[\w-]+\.ogg/).pop()).play()
})
// "//upload.wikimedia.org/wikipedia/commons/5/52/En-us-hello.ogg\"

哪个记录

Fetch API cannot load https://en.wiktionary.org/w/api.php?action=parse&format=json&prop=text&callback=?&page=hello. No 'Access-Control-Allow-Origin' header is present on the requested resource

当没有来自同一来源的请求时。我们需要尝试使用YQL再次,尽管不确定如何制定查询以避免错误。

第三种方法使用稍微修改的版本meSpeak.js无需发出外部请求即可生成音频。修改是为创建适当的回调.loadConfig() method

fetch("https://gist.githubusercontent.com/guest271314/f48ee0658bc9b948766c67126ba9104c/raw/958dd72d317a6087df6b7297d4fee91173e0844d/mespeak.js")
  .then(response => response.text())
  .then(text => {
    const script = document.createElement("script");
    script.textContent = text;
    document.body.appendChild(script);

    return Promise.all([
      new Promise(resolve => {
        meSpeak.loadConfig("https://gist.githubusercontent.com/guest271314/8421b50dfa0e5e7e5012da132567776a/raw/501fece4fd1fbb4e73f3f0dc133b64be86dae068/mespeak_config.json", resolve)
      }),
      new Promise(resolve => {
        meSpeak.loadVoice("https://gist.githubusercontent.com/guest271314/fa0650d0e0159ac96b21beaf60766bcc/raw/82414d646a7a7ef11bb04ddffe4091f78ef121d3/en.json", resolve)
      })
    ])
  })
  .then(() => {
    // takes approximately 14 seconds to get here
    console.log(meSpeak.isConfigLoaded());
    meSpeak.speak("what it do my ninja", {
      amplitude: 100,
      pitch: 5,
      speed: 150,
      wordgap: 1,
      variant: "m7"
    });
})
.catch(err => console.log(err));

上述方法的一个需要注意的是,在播放音频之前加载三个文件大约需要 14 秒半的时间。但是,避免外部请求。

1)创建一个FOSS https://en.wikipedia.org/wiki/Free_and_open-source_software,开发人员维护常见和不常见单词的数据库或声音目录; 2) 进一步开发meSpeak.js减少三个必要文件的加载时间;并使用Promise基于方法来提供文件加载进度和应用程序准备情况的通知。

根据该用户的估计,如果开发人员自己创建并贡献一个在线文件数据库,并以特定单词的音频文件进行响应,那么这将是一个有用的资源。不完全确定是否github https://github.com是托管音频文件的合适场所吗?如果对此类项目表现出兴趣,则必须考虑可能的选择。

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

如何在 Chromium 浏览器中创建文本或将文本转换为音频? 的相关文章

随机推荐

  • 组合来自不同 SOAP 方法的循环值

    我从不同的 SOAP 方法获取数据 举个例子 wsdl the url of wsdl client new SoapClient wsdl parameters array all the parameters inside values
  • 使用 Jasmine 或任何其他替代方案在 Node 上运行测试 .mjs / ESM

    我的基于 Node 的项目是使用 Node 上的原生 ES 模块支持来实现的 这要归功于 experimental modulesCLI 开关 即node experimental modules 显然 当我使用 Jasmine 运行规范时
  • C# 中的闭包分配

    我已经安装了 Clr 堆分配分析器扩展 在一个项目中我看到了一些我完全不理解的东西 我有一个带有签名的方法 public Task
  • 如何从两个或多个矩阵的所有可能组合创建一个矩阵?

    假设有两个矩阵 A lt B lt diag 3 gt A 1 2 3 1 1 0 0 2 0 1 0 3 0 0 1 我想创建一个新的矩阵AB 它由A和B行的所有可能组合组成 预期结果 gt AB 1 2 3 4 5 6 1 1 0 0
  • Monkey Runner 在触摸时抛出套接字异常损坏的管道

    我在运行 Monkeyrunner 脚本时有时会看到以下错误 140501 17 01 58 950 S MainThread com android chimpchat adb AdbChimpDevice 发送触摸事件时出错 500 5
  • MPdf - 全页尺寸图像,但仅适用于单页

    我知道有类似的问题 但没有一个能解决我的问题 我想对 mPDF 执行以下操作 Page 1 Text for item 1 Page 2 Full width and height image to cover the page with
  • 如何在R中绘制不同颜色的直方图

    我的 csv 文件中有大约 500 个整数值的数据集 每个值都在 50 89 之间 我正在尝试在 R 中创建一个直方图 其中代表值 50 65 的条形为青铜色 66 74 为银色 75 89 为金色 到目前为止我的脚本如下 dat1 lt
  • 如何在 Android 中动态创建编辑文本

    我是 android 编程新手 我在动态创建文本字段时遇到问题 我想创建一个视图 其中有一个名为 创建文本字段 的按钮和两个编辑文本 其中一个编辑文本名称为 行 第二个编辑文本名称为 列 当用户在编辑文本中输入数字 假设行 2 和列 3 并
  • 定期发送自动电子邮件

    我有带有 PostgreSQL 数据库的 Windows 服务器 我在数据库中存储了员工数据 包括合同到期日期 我想在到期日之前 30 天为每位员工发送一封自动电子邮件 每个员工都有一个电子邮件帐户 最好的方法是什么 我正在考虑执行以下操作
  • Sql Server 2014 - 更新到 Windows 10 且无法连接到本地服务器

    最近 我将 Windows 从 8 更新到 10 突然我的 SQL Server 2014 停止工作 当我打开 Management Studio 并尝试连接到服务器 本地 时 出现以下错误 你们中有人遇到过类似的问题吗 在更新 Windo
  • 解析c#类文件以获取属性和方法[重复]

    这个问题在这里已经有答案了 可能的重复 C 解析器 https stackoverflow com questions 81406 parser for c sharp 假设我有一个简单的类 例如 winforms 应用程序中的文本框控件内
  • 如何比较 viewDidLoad 和 viewDidAppear? [复制]

    这个问题在这里已经有答案了 我如何比较viewDidLoad and viewDidAppear 最好的办法是在视图控制器中实现这两种方法 该控制器加载带有子视图的视图 最简单的是来自 NIB 并在每个方法中放置一个断点 当应用程序在每个断
  • SQL Server 视图 - 错误的命名约定?

    DECLARE TableName AS VARCHAR 250 DECLARE SQL AS VARCHAR 500 DECLARE ViewCheck as CURSOR SET ViewCheck CURSOR FOR SELECT
  • 有没有办法从应用程序的 .ipa 存档中查看应用程序的 .entitlements 文件?

    我认为创建 ipa 时我的应用程序的 entitlements 文件存在问题 因此我想检查权利文件的捆绑 ID 在构建之前 我使用一个相当复杂的构建脚本来更改其中的一些内容 所以我想看看最终的产品是什么 我知道曾经有一个 Entitleme
  • 何时实施和扩展? [关闭]

    Closed 这个问题是基于意见的 help closed questions 目前不接受答案 什么时候应该implement or extend使用 有哪些现实世界的例子 它是否正确 实施似乎是强制类中存在某些方法并且这些方法函数调用格式
  • 检查委托是否为空

    我正在阅读 Essential C 3 0 一书 想知道这是否是检查委托是否为 null 的好方法 class Thermostat public delegate void TemperatureChangeHandler float n
  • cbind() 正在更改日期格式

    我正在尝试创建数据框的子集 当我这样做时 R 会切换日期列的格式 知道为什么或如何解决这个问题吗 gt head spyPr2 Date Open High Low Close Volume Adj Close 1 12 30 2011 1
  • Julia 中的方法链接

    I read https github com JuliaLang julia issues 5571 https github com JuliaLang julia issues 5571这让我觉得我可以因为一些评论而打破这样的界限 a
  • 无法在 systemd 203/EXEC 中将 Gunicorn 作为服务运行

    我正在尝试使用 Gunicorn WSGI Nginx 部署 FlaskApp 我已经尝试让它工作一段时间了 除了我一直遵循的数字海洋指南之外找不到任何东西 下面是我目前状态下的文件 我尝试了几种不同的调整mywebapp service文
  • 如何在 Chromium 浏览器中创建文本或将文本转换为音频?

    在尝试确定解决方案时如何在 chromium 上使用 Web Speech API https stackoverflow com questions 44013933 how to use web speech api at chromi