这是部分橡胶鸭问题,用于记录我自己的思考,同时也对解决的最佳方法感兴趣。
目前在启动时,SkillsManager加载所有技能并发出mycroft.skills.initialized
消息。在检测到此消息后,PadatiousService开始训练,如果它是初始训练,则发出mycroft.ready
一次完成。mycroft.ready
旨在表示设备已准备好使用,但在某些情况下并非如此。
1. 初始训练仅针对priority_skills
在这种情况下,当Padatious运行其培训时,只有音量和配对技能被加载。一旦初始培训完成,它宣布Mycroft已准备就绪,设备会说出“Mycroft现在已准备好使用”的对话框。
在此点上,要求Mycroft回答任何未由这些技能处理的问题都会回复“请稍等片刻,因为我正在启动”,因为未知的后备不存在。
期望:
在发出mycroft.ready
消息之前,应加载并训练该平台的所有默认技能。
2. 需要重大技能更新
如果设备相当过时或许多Mycroft技能发生了重大更新,那么安装新依赖项和应用更新可能需要时间。
在这种情况下,旧版本的技能被加载和训练。然后Mycroft报告自己已准备就绪。在此之后,所有技能开始更新。在此期间接收到的话语可能会先击中旧技能,再击中新技能,然后才能进行意图训练。
问题:
我们是否希望在声明Mycroft已准备就绪之前立即运行所有技能的更新?
这会降低启动时间,但会提高响应的稳定性和可预测性。
3. 精确度未下载
Precise可执行文件是一个相当大的下载,可能需要一些时间。现在作为Picroft映像的一部分提供,但不是Mycroft-core的一部分,我们不能假设它在那里。
问题:
我们是否应该等待所有资源和服务都准备好后再将Mycroft宣布为整体准备就绪?
例如,每个服务(总线、技能、音频、语音、 shell )必须本身报告已准备好,然后才会发送全局mycroft.ready
消息。
我们是否应该在声明整个Mycroft已准备就绪之前检查所有服务是否报告已准备好?例如通过在#2601中提出的服务钩子?
6条答案
按热度按时间xam8gpfp1#
好的写作,我在下面分享了一些关于这些问题的想法和历史,但主要结论是,根据我的看法,上述建议都是好主意。
这是在没有安装技能的情况下发生的,还是总是这样?如果技能已经安装但在发送初始化消息之前没有加载,那么load_new_skills()方法中存在一些错误。
这是去年夏天讨论的预期行为。在此之前,我们有一个“两周检查”(我认为这是一个检查所有默认技能是否已安装的过程),如果在过去两周内没有进行更新,我们将在加载技能之前触发更新。
我个人认为我们可以采取一种组合方法。对于所有默认技能的检查可能会导致阻塞技能更新,而两周检查可能(在mark-1/2设备上显示屏幕上的消息)在第一次加载后检查更新时指示。
由于pocketsphinx的回退,可能很难确定它是否完全准备好。处理这个问题的一种方法可能是通知:“我可以使用,但我会在Precise下载时变得更好”。
另一个想法是,我们还在获取设置之前发送mycroft.ready信号,因为上传settingsmeta需要很长时间。这通常是可以接受的,但在配对时没有可用设置的情况下,这可能导致性能下降(Spotify在配对后几分钟才开始播放等)。
Precise也可以预先安装,我一直在研究将其作为我为Focal图像所做的打包工作的一部分打包,并使其成为依赖项,以便一开始就可以随时使用。
a8jjtwal2#
感谢Ake,
当没有安装技能时,是否总是这样?
我没有发现bug。我在运行
mycroft-wipe
的picroft上观看了这个,它有配对和音量可以加载,但没有其他内容。因此,它报告mycroft.ready
一次加载并训练这两个技能,但然后需要下载默认技能的其他部分。是的,我可以看到这需要仔细考虑正确的中间地带在哪里。我猜想这是缩短启动时间的一部分?我们不想无限期地等待加载,但我也宁愿再等几分钟而不是让用户首次查询完全失败,当这应该是有效的。我之前也没有考虑过技能设置的这种方式......但是这是一个好的观点。
我一直在考虑外部监控,但在短期内,也许一个标准的
Service.is_ready()
,我们在发出一切正常之前调用它。非常同意在镜像上预先安装精确度,这已经包含在当前的Picroft镜像中,它使iso略大一些,但无论如何都需要下载数据。
ffx8fchx3#
在擦除之后,根据当前的实现方式,当所有已安装的技能都加载完毕时,无论数量有多少,都是可以预料到的。添加一个check_and_install_defaults()阶段应该是相对容易的,并且对于原始镜像来说,不应该对速度产生太大的影响。
你的假设是正确的,它已经被更改为提高速度,直到操作状态。
wvyml7n54#
要评论@krisgesling在配对技能问题上的陈述;
对我来说,mycroft.ready意味着所有默认技能都已准备好。因此,基本上是特定设备中DEFAULT-SKILLS文件中列出的技能。( https://github.com/MycroftAI/mycroft-skills/blob/20.02/DEFAULT-SKILLS )
优先技能的初始培训仅是为了能够在准备过程中控制设备(重新启动配对过程或控制音量)。
至少这是我对该主题的看法,严重依赖于我mycroft的第一次运行。所以基本上我们完全同意第1点和对此的期望。
bkhjykvo5#
我发布了一篇PR,作为如何处理"默认技能丢失"情况的建议。
20jt8wwn6#
在经过多次讨论后,我为
mycroft.ready
的建议是,此消息将指示 - 所有五个核心服务[技能、音频、语音、总线、 shell ]都在运行,用户可以完成基本的交互。更具体地说,这意味着:
is_device_ready()
检查运行所隐含的。目前的目的是利用来自 PR #2645 的 ProcessStatus 类,使每个服务都能定义和报告自己的就绪状态。短期内, shell 将负责进行整体
is_device_ready()
就绪检查。将来,这可能会移动到一个独立的监控服务中,该服务位于核心之外。对于上述内容的任何评论、建议或不同意,都非常欢迎。我们真的希望在本月晚些时候的主要 20.08 版本中实现这一点。