0

在 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 的正确方法是什么?或者是否有任何其他解决方法可以防止会话超时?

4

0 回答 0