发送音频流 usign asyncio

Sending audio stream usign asyncio

提问人:p.magalhaes 提问时间:10/24/2023 更新时间:10/24/2023 访问量:35

问:

我正在尝试将麦克风数据流式传输到异步服务器。客户端代码如下。我的第一次尝试没有使用 await asyncio.sleep(0),但代码被阻止了。我想它被阻止了,因为该过程从未完成,不允许事件循环使用消息。这种说法正确吗?当我添加 await asyncio.sleep(0) 时,事件循环可能会被消耗掉。

好吧,我想有一种更正确的方法可以做到这一点。那会是什么?会是通过在客户端中生成线程吗?有人可以向我提供代码片段吗?

@sio.event
async def speechData(data):
    print("message received with ", data)


async def main():
    audio = pyaudio.PyAudio()
    FORMAT = pyaudio.paInt16
    CHANNELS = 1
    RATE = 16000
    CHUNK = int(RATE / 10)

    await sio.connect("http://localhost:9000")
    await sio.emit(
        "startGoogleCloudStream",
        {
            "audio": {
                "encoding": "LINEAR16",
                "sampleRateHertz": 16000,
                "languageCode": "pt-BR",
            },
            "interimResults": True,
        },
    )

    stream = audio.open(
        format=FORMAT,
        channels=CHANNELS,
        rate=RATE,
        input=True,
        frames_per_buffer=CHUNK,
    )
    while True:
        data = stream.read(CHUNK)
        await sio.emit("binaryAudioData", data)
        await asyncio.sleep(0)

    # this shoud be here?
    await sio.wait()


if __name__ == "__main__":
    asyncio.run(main())
异步 python-asyncio pyaudio python-socketio

评论

0赞 Miguel Grinberg 10/25/2023
我的理解是 PyAudio 与 asyncio 不兼容,因此更好的方法是使用同步 Socket.IO 客户端。否则,您应该使用与 asyncio 兼容的音频库(使用 async/await),但我不确定是否有。

答: 暂无答案