2

所以我正在处理来自 Watson Text to Speech 的传入音频。当数据通过 nodeJS 的 websocket 到达 Python 时,我想立即播放声音。这是我使用 websocket 发送的数据示例:

  <Buffer e3 f8 28 f9 fa f9 5d fb 6c fc a6 fd 12 ff b3 00 b8 02 93 04 42 06 5b 07 e4 07 af 08 18 0a 95 0b 01 0d a2 0e a4 10 d7 12 f4 12 84 12 39 13 b0 12 3b 13 ... >

因此数据以十六进制字节流的形式到达,我尝试将其转换为 Sounddevice 可以读取/播放的内容。(请参阅文档:'float32'、'int32'、'int16'、'int8' 和 'uint8' 类型可用于所有流和函数。)但是我该如何转换呢?我已经尝试过一些东西,但是当我运行我的代码时,我只听到一些噪音,没有任何可识别的声音。在这里你可以阅读我的部分代码:

def onMessage(self, payload, isBinary):
    a = payload.encode('hex')
    queue.put(a)

在收到字节流并转换为十六进制后,我尝试将传入的字节流发送到 Sounddevice:

def stream_audio():
    with sd.OutputStream(channels=1, samplerate=24000, dtype='int16', callback=callback):
        sd.sleep(int(20 * 1000))


def callback(outdata, frames, time, status):
    global reststuff, i, string
    LENGTH = frames
    while len(reststuff) < LENGTH:
        a = queue.get()
        reststuff += a
    returnstring = reststuff[:LENGTH]
    reststuff = reststuff[LENGTH:]

    for char in returnstring:
        i += 1
        string += char
        if i % 2 == 0:
            print string
            outdata[:] = int(string, 16)
            string = ""
4

1 回答 1

0

查看您的数据流:

e3 f8 28 f9 fa f9 5d fb 6c fc a6 fd 12 ff b3 00
b8 02 93 04 42 06 5b 07 e4 07 af 08 18 0a 95 0b
01 0d a2 0e a4 10 d7 12 f4 12 84 12 39 13 b0 12
3b 13

您在这里看到每两个字节第二个字节以 e/f/0/1 开头,这意味着接近零(在二进制补码中)。所以这是你最重要的字节,所以你的流是小端的!你应该在你的转换中考虑到这一点。如果我有更多数据我会测试,但这值得几毫秒!

于 2019-10-08T03:11:28.323 回答