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

问题描述 投票:2回答:1

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

收到字节流并转换为十六进制后,我尝试将传入的字节流发送到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 = ""
python audio websocket hex python-sounddevice
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开头,这意味着接近零(以二进制补码)。因此,这是您最重要的字节,因此您的流是低位字节序!您应该在转换时考虑到这一点。如果我有更多数据可以进行测试,则值得花几毫秒!

© www.soinside.com 2019 - 2024. All rights reserved.