首页 > 解决方案 > Sounddevice 的 wait() 方法不适用于短声音

问题描述

对于一个包括移动机器人手臂的项目,我需要一个类似“Geiger-Müller 计数器”的基于距离的警报。为此,我编写了一个 python 模块并尝试添加可能性,如果机器人手臂位于物体的左侧,则声音仅在左侧扬声器上,右侧模拟。为此,我查看了 sounddevice 库,其中可以进行简单的通道映射。从下面的代码片段 1 中可以看出,就像在文档中一样,我正在调用 sd.play() 并等待 sd.wait() 直到声音结束。

当我使用长度为 6 秒的样本声音时,一切正常。但是,如果我使用所需的声音,则发出短促的哔声(不到 1 秒),代码不起作用。脚本在约 1 秒后结束,没有任何声音。我可以通过添加睡眠语句(在代码中注释掉)来解决这个问题。

但是对于上下文,我需要一个小于 0.5 秒的播放窗口。有谁知道我该如何解决这个问题或解决这个问题?

我尝试改用 pyaudio,但无法将单声道 .wav 文件转换为立体声字节数组,以便在左/右扬声器上动态切换音频。(code-snippet2)但我总是遇到错误(“asscii 编解码器无法解码 pos 2 上的字节:序数不在范围内(128)”)

片段1:

    import sounddevice as sd
    import soundfile as sf

    data, fs = sf.read(args.filename, dtype='float32')

    byte = np.array(data)

    sd.play(byte, fs)
    #time.sleep(0.5)
    status = sd.wait()

片段2:

data = wave.readframes(chunkSize)

stereo_signal = np.zeros([len(data), 2])   
stereo_signal[:,0] = data[:]
stereo_signal[:,1] = 0

标签: pythonpyaudiopython-sounddevice

解决方案


推荐阅读