LWN:开源语音助手的希望!
关注了就能看到更多这么棒的文章哦~
Hopes and promises for open-source voice assistants
March 21, 2023
This article was contributed by Koen Vervloesem
DeepL assisted translation
https://lwn.net/Articles/926484/
2022 年底,Paulus Schoutsen 宣布 2023 年是 Home Assistant 的 "语音之年(the year of voice)"。Home Assistant 这个受欢迎的开源家庭自动化项目是他在 9 年前创立的。该项目在今年的目标是可以让用户用自己国家的语言来用语音命令控制他们的家居,并且使用离线处理而不是将数据发送到云端来处理。多年来,离线语音控制一直是开源家庭自动化系统的圣杯。一些项目已经尝试过,但都失败了。不过随着 Rhasspy 的开发者 Mike Hansen 带头进行 Home Assistant 的语音工作,这次情况可能会有所不同。
科幻节目和电影已经向我们推销了宇宙飞船以及可以对话的家庭等等新事物。近年来,得益于谷歌、亚马逊和苹果的所谓 "智能音箱(smart speakers)",家居语音控制已经成为可能。然而,这些设备并不智能:它们的智能处理几乎完全在云端,用户的语音需要在那里被记录下来并翻译成句子以及理解它代表什么意思。
这是一项复杂的计算密集型任务,这些公司让我们相信,他们的服务是能够使用语音控制的必要条件。当然,这种做法也有弊端:用户无法控制他们的语音记录会被如何使用,这是一个很大的隐私风险。但是,从根本问题则在更深层次。对用户来说,完全没有必要让他们的声音在互联网上来回绕一圈从而仅仅是打开同一个房间的一盏灯。
The challenges of offline voice control
幸运的是,多年来一直有一些项目在研究离线语音控制,其中一些项目是部分甚至全部开源的。当然,在家庭内部的服务器上运行的语音助手无法达到跟那些利用云端服务器的通用智能音箱一样好的表现。然而,哪怕是使用树莓派这种硬件,如果目的仅限于某些特定的领域例如打开和关闭百叶窗、打开和关闭灯光、询问现在是什么时间或者门是否关闭,也是可以拥有一个符合人们要求的声控系统的。
语音控制软件栈(voice-control software stack)是由很多部分组成。这一切都从唤醒词检测(wake-word detection)开始:语音助理需要聆听来自麦克风的音频流,当它识别到一个唤醒词或短语,如 "Hey Rhasspy",它就会被激活。在这之后,麦克风会记录音频,直到它检测到用户停止说话为止。
之后会有一个语音到文本模块(speech-to-text module)将用户所说的话转录成文本,如 "外面的温度是多少?"。这个文本由一个 intent 分析器(intent parser)来处理,该分析器找出用户的意思:也就是所谓的 intent。然后由一个 intent 处理程序来处理这个结果,该程序会从家里的传感器读取温度,或通过网络 API 来获取温度,然后返回文本,如 "外面是 20 度"。然后会有一个文本到语音模块(text-to-speech module)进行声音合成从而将该文本转换为音频,在扬声器上播放,最终回复用户的请求。
将所有这些部分结合在一起并且创建一个可以正常工作并且用户使用上非常友好的语音控制系统,是比较困难的。如果该系统需要完全开放源代码并在离线情况下工作,那就更加困难了。本文会讨论一些在过去人们认为很有希望但最终失败了的项目,并且研究了目前最有希望的一个,夜就是作为 Home Assistant 的一部分的 Rhasspy。
Broken promises
几年前,Snips 还是一家在语音领域很有前途的创业公司。这家法国公司由三位应用数学家(applied mathematicians)于 2013 年创立,目标是在尊重隐私的前提下将人工智能(AI)放到每台设备中去。2016 年的时候,他们决定专注于创建一个语音助手来离线处理用户的语音记录,从而在设计上就确保个人隐私安全。Snips 语音助手能够在 Raspberry Pi 上运行,它的大部分软件都是开源的,采用了 Apache 2.0 的 license 许可。
Snips 成功地吸引了一个小而专注的社区,他们创造了 Snips skill 这些 intent 处理脚本(通常用 Python 编写),从而对 Snips 识别出来的 intent 作出反应。本文作者也是其中的一员,相信 Snips 将帮助我们实现开源离线语音助手的愿景。它还支持 Home Assistant 集成,可以根据用户的语音命令触发 action。
Snips 在其网站上有一个 FAQ(现在仍然还存在),解释说他们软件的专有部分会 "很快" 成为开源代码,这就是笔者决定参与社区的原因。然而,那个 FAQ 项一直说 "很快",已经持续了很长时间。2019 年初,我为一家杂志采访了 Snips 的 CTO,询问了该公司开放其余源代码的计划。他的回答很含糊,没有给我太大的信心,很难看出这会真正发生。就在那时,我决定放弃,离开 Snips 社区。我的感觉最终证明是正确的:在 2019 年底,Snips 被 Sonos 收购。该公司的基于网络的 Snips Console 是用来训练语音助手的必备工具,几个月后就被关闭了。
Death by patents
另一个有前途的项目是 Mycroft。该公司与 Snips 语音助手同时启动。开发人员为语音软件栈的大多数部分都进行了自由软件开发,并在 2016 年 5 月根据 GPL 许可发布了他们的软件(2017 年 10 月根据 Apache 2.0 重新许可)。该公司创造了自己的智能扬声器硬件,即 Mark 1 和后来的 Mark II。这两款设备都通过成功的 Kickstarter 活动获得了资金资助,不过 Mark II 的交付在该公司的硬件合作伙伴出现问题后被严重推迟了。
Snips 的问题是其语音栈的重要部分没有开源,而 Mycroft 则有另一个问题:默认情况下,音频会被发送到谷歌的语音到文本服务进行语音识别。不过,Mycroft 是作为了一个代理,所以谷歌只看到来自 Mycroft 服务器的请求,而不是来自某个个人用户的请求。当然,Mycroft 的服务器仍然能看到原始的请求。企业用户可以随时将基于云上的语音转文字服务换成开源的离线解决方案,如 Mozilla DeepSpeech 或 Kaldi。
2020 年,当 Voice Tech 公司提起专利侵权诉讼时,Mycroft 开始出现了一些真正的问题。最终,Voice Tech 公司的所有主张都被宣布无效,但今年早些时候,Mycroft 公司的首席执行官迈克尔-刘易斯(Michael Lewis)在 Kickstarter 上发文称 "活动的结束(The End of the Compaign)",宣布了一些坏消息:该公司没有资金继续有效运作了。未来看起来很暗淡:
自从 2020 年初开始在这里工作以来,我不得不做出一些我所面临的最艰难的决定,并且没有一个比去年年底的决定更艰难。11 月底,就在 Mark II 进入生产阶段后,我面临着不得不裁掉 Mycroft 大部分员工的现实。目前,我们的员工是两名开发人员,一名客户服务人员和一名律师。此外,如果没有马上进来的新投资的话,我们将不得不在本月底前停止开发。
[……]那么什么地方出了问题?我无法预测到的最昂贵的一项支出是我们对 non-practicing patent entity 的持续诉讼,该实体从未停止过给我们捣乱。如果我们有一百万美元,我们现在的状态会很不一样。
刘易斯还在 1 月底在公司的博客上发表了文章,内容与 Kickstarter 上的文章基本相同,但最后说: "还有很多东西要讲,还有很多其他的话题,我将在未来几天的文章中介绍。" 然而,在写这篇文章时,该博客还没有任何更新。
那么 Mycroft 现在死了吗?它可能活在 OpenVoiceOS 中,OpenVoiceOS 最初是一个基于 Linux 的操作系统,用于运行 Mycroft。随着时间的推移,它把 Mycroft 的核心代码 fork 了出来,增加了一些 upstream 不接受的功能。几周前,开发者宣布了一项计划,即根据荷兰法律成为一个非营利协会,并开始了 GoFundMe 的活动来以筹集资金支持其倡议。OpenVoiceOS 的开发者多年来一直活跃在 Mycroft 社区;他们一直保持他们的 fork 与 Mycroft 的 skill 的兼容,所以很多用户可能会转移到 OpenVoiceOS。
Rhasspy
另一个项目,也是我在离开 Snips 社区后开始贡献的项目,是由 MIT 授权的 Rhasspy。它是一个开源的、模块化的语音助手服务集合,可以在完全不与互联网连接的情况下运作,它与家庭自动化软件可以很好地配合起来。此外,它不限于英语,而是支持许多国家的语言。
Rhasspy 经历了几次架构重写,并从 Snips 的关闭中获益良多。在 2019-2020 年左右,有大量来自 Snips 社区的人员涌入,寻找替代的语音助手。Rhasspy 的开发者 Mike Hansen 看到了一个机会,将作为一个整体的 Rhasspy Python 应用程序分解成多个 service,从而发布了 Rhasspy 2.5,其中的各个 service 都是通过消息队列遥测传输(MQTT, Message Queuing Telemetry Transport)进行通信,使用了 Snips 的 Hermes 协议的一个扩展过的版本。这种模块化的方法允许插入不同的实现来进行唤醒词检测、语音到文本、intent 识别和文本到语音等工作。
使用了 Hermes 协议,就使得贡献者可以用任何能识别 MQTT 和 JSON 的编程语言来编写 Rhasspy skill 了。例如,我写了一个辅助函数库,用 Python 为 Rhasspy 创建语音应用程序。Hansen 还为 Home Assistant 创建了一个 Rhasspy 插件。社区中另一个受欢迎的项目是 ESP32-Rhasspy-Satellite,它让用户在 ESP32 微控制器板上运行一个 Rhasspy "卫星",用于音频输入和输出,然后通过 MQTT 与 Raspberry Pi 或其他运行 Rhasspy 核心服务的计算机进行语音传递。
然而,当 Hansen 在 2021 年 11 月加入 Mycroft 时,看起来另一个开源的语音助手项目可能会慢慢死去。Mycroft 聘请 Hansen 帮助其 Mark II 智能音箱达成目标前的最后一步;他在 Rhasspy 论坛上解释说,他将改变 Mycroft 对云服务器的依赖。他还说,他不会放弃 Rhasspy,他希望在某个时候将两个社区合并。
可以理解,Rhasspy 的发展在这之后放缓了。但一年后,汉森又宣布了一个令人惊讶的消息:他将加入正在开发 Home Assistant 的公司 Nabu Casa,担任语音工程负责人,全职从事 Rhasspy 的工作。
The year of voice
Rhasspy 作为 Home Assistant 的一部分而复兴了,意味着它将再进行一次架构重写。Hansen 现在正在开发 Rhasspy 3,他称之为 "非常早期的开发者预览版本"。主要的目标仍然是一样的:它可以完全离线工作,有广泛的语言支持,并且完全可定制。有一篇文章介绍了如何设置 Rhasspy 3,但其中许多手动步骤将在未来会被替换成用户友好的方式。
Rhasspy 3 现在不再使用 MQTT 了,而是让它的所有服务使用新的 Wyoming 协议进行通信;服务使用标准输入和输出进行通信,这降低了程序与 Rhasspy 对话的障碍。本质上,Wyoming 协议是带有二进制的 payload 的 JSON Lines(JSONL)。
因此,如果 Rhasspy 需要发送音频数据块给语音转文字程序,它就会发送一行 JSON,其中有一个 type 字段会告诉接收程序它正在发送一段音频,此外还有一个可选的 data 字段,包含了采样率和通道数等参数,以及一个 payload 长度信息。在这之后,它将发送指定长度一段音频数据。当然,现有的程序并不使用这个 Wyoming 协议,但可以写一些很短小的 Python 程序来完成适配工作。例如,如果有一个在 stdin 上接受原始音频并将识别的文本发送到 stdout 的语音转文本的程序,就可以跟 asr_adapter_raw2text.py 这个适配程序配合起来使用。
Voice commands at home
Rhasspy 3 专注于 Home Assistant 的这种使用场景,也就是用语音命令控制设备。对于 intent 处理方面,Rhasspy 3 使用 Home Assistant 2023.2 中引入的 Assist 功能。intent 识别是由 HassIL 所提供的。这样就可以把用户的输入跟句子模板(sentence templates)匹配起来。例如下面这样的一个模板就可以匹配 "turn on kitchen lights"和 "switch on the kitchen lights" 这样的输入内容:
(turn | switch) on [the] {area} lights
Home Assistant 支持了很小的一个内置 intent 列表。例如,HassTurnOn intent 可以打开一个设备。如果之前打开厨房灯的模板被定义为这个 HassTurnOn intent 的模板的话,并且用户的 Home Assistant 配置中有定义好厨房区域的灯,那么 intent 处理程序助手将打开厨房灯。
Home Assistant intent 项目的目标是给所有可能的家庭自动化 intent 创建出所有可用的国家语言下的模板,采用了 CC-BY-4.0 许可发布。目前,已有 156 人给 52 种语言提供了各种 sentence。该项目从支持六种 intent 开始,希望能让工作量可控;后续目标是逐步增加支持的 intent 数量。
Conclusion
一个离线的、开源的、可以支持自己国家的语言的语音助手对很多人来说是很重要的。然而,这样做的技术挑战非常高的。Snips 和 Mycroft 能够吸引一个社区,但未能成为一个成功的企业。Rhasspy 在喜欢捣鼓的小众人群中相当成功,也围绕项目提供的灵活服务建立了自己的语音助手,但其核心代码主要由一个人开发,项目也没有得到资金支持。好消息是,Rhasspy 将与 Home Assistant 紧密结合,后者是 GitHub 上最活跃的项目之一,由 Nabu Casa 资助。因此,我们有希望最终达到那些科幻小说的梦想,会可以用上一个既尊重隐私又由开源软件制的用户友好型语音助手来控制我们的家。
全文完
LWN 文章遵循 CC BY-SA 4.0 许可协议。
欢迎分享、转载及基于现有协议再创作~
长按下面二维码关注,关注 LWN 深度文章以及开源社区的各种新近言论~
更多推荐
所有评论(0)