Python: преобразовать шестнадцатеричный байтовый поток в "int16"

Поэтому я работаю с входящим звуком из Watson Text to Speech. Я хочу воспроизвести звук сразу же, когда данные поступают в Python с помощью веб-сокета от nodeJS. Это пример данных, которые я отправляю с помощью веб-сокета:

  <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 = ""

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, что означает почти ноль (в двух дополнениях). Итак, это ваши самые важные байты, поэтому ваш поток имеет прямой порядок байтов! вы должны учитывать это при преобразовании. Если бы у меня было больше данных, я бы протестировал, но это стоит нескольких миллисекунд!

Другие вопросы по тегам