所以我正在处理来自 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 = ""