描述问题
在使用MaryTTS时,如果技能使用speak_dialog并设置wait=True,或者依赖于该方法的其他方法,如get_response,语音播放将在语音结束之前不会等待,而是直接跳到下一个指令。后果取决于技能是如何构建的:对话可能会突然被音频提示开始录音打断,从而导致技能执行顺序混乱。或者,由于RemoteTTS(MaryTTS的超类)将长句子拆分,不同的语音部分重叠在一起,导致音频混乱。
我发现的问题是RemoteTTS(MaryTTS的超类)在其execute方法的定义中没有调用create_signal("isSpeaking"),而大多数其他TTS模块使用的是基本的TTS超类。因为"isSpeaking"没有设置,应该一直等到语音结束的等待循环立即结束。
在RemoteTTS的execute方法开头添加create_signal("isSpeaking")可以解决这个问题。此外,我认为扩展RemoteTTS而不是TTS的其他TTS模块也会受到影响。
重现步骤
重现行为的方法:
- 配置TTS以使用MaryTTS
- 使用一个要求用户响应的技能(或创建一个)
- 您应该在Mycroft结束问题之前听到提示说话的声音
预期行为
当使用wait=True或像get_response、ask_selection等方法进行对话时,语音应在技能移动到下一个指令之前完成。
日志文件
如果有必要,我可以尝试提取一些日志,尽管我不得不手动向Mycroft /skills脚本添加一些额外的日志记录来弄清楚发生了什么。我也可以尝试提供一些音频录制。
环境信息
- 设备类型:树莓派4 Model B 4GB
- 操作系统:Picroft发布候选版v21.02.0_20210604
- Mycroft-core版本:v21.02.0
附加信息
我已经将Mycroft配置为使用"marytts"作为TTS模块,但实际服务器并没有运行MaryTTS,而是运行OpenTTS,它可以作为MaryTTS客户端的替代品。服务器在笔记本电脑上运行测试,我使用的语音质量较高。这导致合成语音时出现明显的延迟,使得等待时间不足更加明显。对于非常短的句子和快速的服务器响应,这种bug的影响可能很容易被忽略。
3条答案
按热度按时间zengzsys1#
你可以使用https://github.com/OpenVoiceOS/ovos-tts-plugin-marytts。
d8tt03nd2#
你可以使用https://github.com/OpenVoiceOS/ovos-tts-plugin-marytts。
我没有尝试过,但会去看看。然而,如果这个插件也扩展了原始的RemoteTTS,问题仍然存在,因为问题不在于MaryTTS本身,而是在于RemoteTTS类。
顺便说一下,如果我要朗读一个非常长的句子,我仍然会遇到问题。我不得不修改RemoteTTS以避免被拆分成更小的句子,然后它就可以正常工作了。
4bbkushb3#
插件使用了ovos-plugin-manager,它具有向后兼容性,但作为依赖项有很多改进。RemoteTTS类与mycroft-core中的类不同,并正确地使用了
get_tts
,而不是覆盖内部的execute
方法,从某种意义上说,这应该是私有的。