Goal
我们的用户在 Google 文档中工作。他们编写的文本将在他们输入时使用文本转语音朗读给他们听。
它应该能够跨尽可能多的平台和浏览器工作。
我们的解决方案
这似乎适合谷歌应用脚本 https://developers.google.com/apps-script/,它适用于所有桌面浏览器和一些移动浏览器。
这有效
我们有一个文本转语音模块,效果很好,所以这不是问题。
我们正在使用一个sidebar https://developers.google.com/apps-script/quickstart/docs现在。侧边栏可以使用以下方式播放音频HTML 5 音频标签 http://www.w3schools.com/html/html5_audio.asp其工作没有任何问题。
问题
问题实际上是从 Google 文档中获取文本。
到目前为止,我还没有找到任何方法可以直接从侧边栏访问 Google 文档文本。
相反,我们一直在做的是:
- 侧边栏每 x 毫秒轮询一次在 Google 云上运行的 Google Apps 脚本
- 我们的 Google Apps 脚本在 Google 云上运行,然后访问云中的同步文档
- 如果发现任何更改,会将其发送回侧边栏
- 侧边栏使用 HTML5 音频标签和我们的文本转语音来播放音频。
从用户在 google docs 中输入文本到更改同步到 google docs 云中需要一秒或更长时间。
我们已经安排了不同步骤的时间。文字转语音速度很快,HTML5 音频也没有问题。
The 时间沉没正在得到文本更改。目前需要1-3秒,这对于我们的用例来说太长了。
Question
我们能否更快地访问 Google 文档中的文本?也许直接而不是通过谷歌的云?
更新2017-02-15目前看来是不可能的。
可以使用 Chrome 扩展来完成此操作,它解析 Google Docs 主页并从 HTML+JS 中提取文本。这是相当困难的,但是……是可能的。
如果浏览器插件是提供该功能的适当方式,那么应该可以监听 Google Docs 在更新页面内容时对 DOM 所做的更改。
// This div contains all of the page content and not much else, in my rudimentary testing.
var pageRoot = document.getElementsByClassName('kix-appview-editor')[0].firstChild;
var observer = new MutationObserver(handleNewChanges);
observer.observe(pageRoot, {
subtree: true,
childList: true,
attributes: false,
});
// Later, you can stop observing
observer.disconnect();
Your handleNewChanges
每当 DOM 内容发生更改时都会调用该函数,并附带更改列表。这些变化相当混乱,但是
- 可以通过查看添加和删除的节点来过滤无关紧要的更改(例如用户选择某些文本),
- 您可以沿着 DOM 树查找文档中更改的位置,并且
- 您可以使用
someNode.innerText
以获得实际内容。
通过观察更改并保留某些文档状态,您应该能够确定您关心的更改何时发生。
这似乎很适合您的用例,因为
-
不需要远程服务器。数据流看起来更像是这样,完全在浏览器选项卡中:
--------------- ----------
| Google Docs | <= fetch doc <= | Your |
| Document | => DOM changes => | Module |
--------------- ----------
更新与文档视觉更新同步,这感觉触发此操作是很自然的事情。
解析每个 DOM 更改所需的簿记量可能是恒定的(即,无需循环遍历文档内容)。这意味着观察增加的开销是恒定的,因此它应该扩展到任何大小的文档。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)