2020 年美国大选技术平台架构( 五 )


用户通过电子邮件被邀请到Pencil平台 , 这个在Cognito注册账户的过程是独立的 。 在用户第一次登录时 , Pencil会自动将他们添加到Cognito的用户组中 , 这样他们就可以访问Pencil的用户API 。
从用户的角度来看 , 是他们点击了一个注册链接触发了短信发送 。 经过竞选活动数字团队的简单操作之后 , 用户(志愿者)就可以开始工作了 。
这是非常容易做到的 , 因为它是建立在先前的Turbotots基础设施之上 。
Tots
Tots的架构与Turbotots不同 , 它位于Turbotots的下游 。 在之前的图中 , Tots解析了Turbotots下面列出的很多服务 , 这些服务是Tots架构的一部分 。
图6:Tots平台
Tots是一个重要的平台 。 随着我们构建了越来越多的机器学习工具 , 我们很快意识到 , 我们需要合并逻辑和简化架构 。
在各种项目中 , 机器学习最主要的应用场景是从文本块中提取词袋 。 我们将这些数据保存到Elastic的索引中 , 让数据主题可用于快速检索 。 我们使用AWSComprehend从文本中提取词袋 。 这是一个很棒的服务——给它一段文本 , 它就会告诉你在这段文本中出现的人、地点、主题等等 。 文本以多种形式进入平台 , 包括多媒体、新闻文章和文档格式 。
图6Tots平台中的很多机制都涉及在将内容发送给Comprehend之前需要如何处理 。 这个平台上的流程为竞选活动节省了成千上万个小时的人力工作 , 包括花时间转录现场活动内容(如辩论) , 并将它们转换成文本格式 , 以便竞选人员日后阅读 。
CouchPotato
CouchPotato帮助我们解决了计算机科学中最难的问题:在Linux上制作音频 。 CouchPotato对我们来说非常重要 , 因为它为我们制作音频和视频材料节省了大量时间 。 这也是我们所构建的最强大的技术平台之一 。
图7:竞选活动用CouchPotato处理多媒体任务
CouchPotato是图7所示的架构的主要角色 , 但从连接多个独立服务的连线可以看出 , 在整个过程中 , 它也需要其他的支持角色 。
CouchPotato的主要功能是将URL或媒体文件作为输入 , 在隔离的X11VirtualFrameBuffer中打开媒体文件 , 在PulseAudio播放设备(FFmpeg)上收听回放 , 然后记录X11会话的内容 。 这就产生了一个MP3文件 , 然后将它发送到AWSTranscribe进行自动语音识别(ASR) 。
在ASR完成之后 , 它会过一遍生成的文本 , 纠正一些常见错误 。 例如 , 它很少能把市长PeteButtigieg的名字写对 。 我们用RegEx做一些常见的文本替换 。
在完成这些工作之后 , 转录文本将被发送到Comprehend , 它将提取其中的词袋 。 最后 , 文本被索引到Elasticsearch中 。
CouchPotato的关键之处在于它能够利用FFmpeg的分段功能生成更小的音频块 。 它会为每个片段执行整个过程 , 并确保被索引到Elasticsearch中时保持统一 。
这种分段是CouchPotato最初的特性之一 , 因为我们用它来实时记录辩论内容 。 通常情况下 , 在竞选活动中 , 会有一群实习生观看辩论 , 并把辩论内容打出来 。 但我们没有一大批实习生来做这个事情 , 所以就有了CouchPotato 。
不过 , 分段带来了顺序问题 。 有时候 , Transcribe会在前一个片段完成之前完成后一个片段的ASR , 这意味着所有需要异步完成的工作在处理完毕之后需要按照正确的顺序重新编译 。 对我来说 , 这听起来就像是一个反应式编程问题 。
我们花了很多时间来解决异步处理事件的顺序问题 。 这很复杂 , 但我们做到了 。
这个时候 , DocsWeb就派上用场了 。 DocsWeb将CouchPotato的片段转录输出发送到GoogleDoc , 让我们可以几乎实时地与竞选活动的其他成员分享转录文本——除了从Transcribe到Elasticsearch有点延迟 , 但这并不算太糟 。 我们记录下了每一场辩论以及大量其他媒体内容 , 这些内容需要一群实习生花上一辈子的时间才能完成 。