Google文档 - 实时访问文本更改

时间:2017-01-16 13:48:12

标签: javascript google-apps-script google-docs google-drive-realtime-api

目标

我们的用户使用Google文档。他们写的文字将在他们使用文字转语音键入时读给他们。 它应该在尽可能多的平台和浏览器中工作。

我们的解决方案

这似乎适合Google Apps Script,适用于所有桌面浏览器和某些移动浏览器。

此作品

我们有一个文字转语音模块,效果很好,所以没问题。 我们目前正在使用sidebar。侧边栏可以使用HTML 5 Audio tag播放音频,其工作没有任何问题。

问题

问题实际上是从Google文档文档中获取文本。 到目前为止,我还没有找到任何方法直接从侧边栏访问Google文档文本。 我们一直在做的是:

  1. 补充工具栏每隔x毫秒轮询我们在Google云上运行的Google Apps脚本
  2. 我们在Google云端运行的Google Apps脚本随后会访问云中的同步文档
  3. 如果发现任何更改,则会将其发送回补充工具栏
  4. 侧栏使用HTML5音频标签和我们的文字转语音播放音频。
  5. enter image description here

    从用户在Google文档中输入文本到将更改同步到Google文档云时,需要一秒或更长时间。

    我们有不同的步骤。文本转语音很快,HTML5音频也没问题。

    时间接收器正在获得文字更改。它目前需要 1-3秒,这对我们的用例来说太长了。

    问题

    我们可以更快地访问Google文档中的文字吗?也许直接而不是通过谷歌的云?

    UPDATE 2017-02-15 目前看来它是不可能的。 可以通过Chrome扩展程序执行此操作,它会解析Google文档主页并从HTML + JS中提取文本。这很难,但......可能。

2 个答案:

答案 0 :(得分:1)

如果浏览器插件是提供此功能的合适方式,则应该可以在更新网页内容时收听Google文档对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();

只要DOM的内容发生变化,您的handleNewChanges函数就会被调用,并带有更改列表。这些变化非常混乱,但

  • 可以通过查看添加和删除的节点来过滤无关紧要的更改(比如用户选择一些文本),
  • 您可以向上走DOM树以查找文档中更改的位置,
  • 您可以使用someNode.innerText获取实际内容。

通过观察更改并保持某些文档状态,您应该能够确定何时发生您所关注的更改。

这似乎非常适合您的用例,因为

  • 不需要远程服务器。数据流看起来更像是这样,完全在浏览器标签中:

    ---------------                   ----------        
    | Google Docs | <=  fetch doc  <= |  Your  |
    |  Document   | => DOM changes => | Module |
    ---------------                   ----------
    
  • 更新与文档的视觉更新同步,这感觉就像触发此事一样自然。

  • 解析每个DOM更改时需要执行的簿记量可能是不变的(即,不循环文档内容)。这意味着观察添加的开销是不变的,因此它应该扩展到任何大小的文档。

答案 1 :(得分:1)

您已经发现,浏览器扩展是一个很好的解决方案,它可能比您想象的要容易:Chrome的扩展API都有据可查,并且构建扩展与使用 HTML构建网页非常相似 JavaScript

甚至还有一个extension API for TTS可以与自定义的 TTS引擎集成:

  

使用chrome.ttsEngine API实施文本语音转换(TTS)引擎   使用扩展名。如果您的扩展程序使用此API注册,   将收到包含要说的话语的事件以及其他   任何扩展程序或Chrome应用程序使用tts API进行操作时的参数   产生语音。然后,您的扩展程序可以使用任何可用的网站   合成和输出语音并将事件发回的技术   到调用函数以报告状态。