Python:将十六进制字节流转换为“int16”

时间:2017-04-07 14:20:58

标签: python audio websocket hex python-sounddevice

所以我正在处理从Watson Text到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)

收到bytesstream并转换为十六进制后,我尝试将传入的字节流发送到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 = ""

1 个答案:

答案 0 :(得分: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开头,这意味着接近零(以二进制补码)。 因此,这是您最重要的字节,因此您的流是低位字节序! 您应该在转换时考虑到这一点。 如果我有更多数据可以进行测试,那值得花几毫秒!