python - Python:将十六进制字节流转换为 “int16"

标签 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)

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

最佳答案

查看您的数据流:

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

关于python - Python:将十六进制字节流转换为 “int16",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43280495/

相关文章:

java - 无法在同一网络中按名称访问 Docker 容器

python - 使用 Python 和 BeautifulSoup 从 HTML 中抓取数字

python - 快速确定 Python 中小于 10 亿的数字是否为质数

javascript - 对网络上麦克风的影响

javascript - Web套接字多个请求

ios - PubNub 长轮询与套接字 - 移动电池生命周期

python - 错误的文件描述符 - Heroku Foreman

python - 如何在Elasticsearch和Python中更新标签数组列表

javascript - 如何在特定时间对音频 blob 进行切片?

html - 播放实时音频流 - html5