在 Watson Speech To Text 和 Watson Conversation 服务的帮助下,我制作了一个在 NAO Robot 上运行的 Python 应用程序,充当“朋友”。机器人将在提问和回答问题之间交替。
当机器人处于“提问”模式时,它会倾听人类的声音并将语音流式传输到 Watson STT。语音是使用 Arecord 录制的。每当用户完成通话时,Arecord 就会停止。然后转录的语音将被发送到 Conversation,然后机器人将相应地回答问题。通常,“答题”模式会持续不到 30 秒。但是有些回复足够长,以至于 Watson STT 会触发会话超时。
为了防止此会话超时,我们过去每 10 秒发送一次“no-op”消息信号。
def keepAlive(self):
self.send({"action": "no-op"})
但是,Watson最近弃用了发送“no-op”消息以防止会话超时。作为发送“no-op”的替代方法,您可以发送静音音频数据以防止会话超时。根据文档:
“向服务发送音频数据(包括静音)以避免 30 秒 > 会话超时。您将为发送到服务的任何数据付费,>包括您为延长会话而发送的静音。”
所以我尝试了这个:
def keepAlive(self):
data = {"action": "start", "content-type": "audio/l16;rate=16000", "inactivity_timeout":-1}
self.send(json.dumps(data).encode('utf8'), binary)
reccmd = ["arecord", "-f", "S16_LE", "-r", "16000", "-t", "raw"]
p = subprocess.Popen(reccmd, stdout=subprocess.PIPE)
data = p.stdout.read(1024)
self.send(bytearray(data), binary=True)
self.send({"action": "stop"})
但是,我收到了这个错误:
Msg received: {u'error': u'could not detect endianness after looking at a tail 924 non-zero byte string in a data stream of 1024 bytes. 字节流真的是 PCM 数据吗?'}
之后,websocket 也会立即关闭。将静音音频数据发送到 Watson STT 的正确方法是什么?或者是否有任何其他解决方法可以防止会话超时?