如何在不断录制的同时用python播放实时音频?

时间:2019-03-06 19:51:19

标签: python-3.x python-sounddevice

我想创建语音干扰器。从本质上讲,这是重复您刚才所说的内容,但它是连续的。我试图使用声音设备库并记录我在说的内容,同时还要回放它。然后,我将其更改为最初记录我在说什么,然后在播放时又记录了一些新内容。但是,它没有按照我的意愿运行。对其他图书馆有什么建议吗?或者,如果有人看到我已有的代码的建议。

它不是在不断地回放我,而是开始和停止。它以指定的持续时间间隔执行此操作。因此它将录制500毫秒,然后播放500毫秒,然后再次开始录制。想要的行为是-录制500ms的同时播放正在录制的音频,并延迟一些ms。

import sounddevice as sd
import numpy as np

fs = 44100
sd.default.samplerate = fs
sd.default.channels = 2
#the above is to avoid having to specify arguments in every function call
duration = .5

myarray = sd.rec(int(duration*fs))
while(True):
    sd.wait()
    myarray = sd.playrec(myarray)
    sd.wait()

2 个答案:

答案 0 :(得分:0)

我在这里看到一个潜在的问题,试图将myarray用作.playrec()函数的输入和输出。我建议使用两个阵列,一个用于录制现场音频,另一个用于播放录制的音频。

除了使用.playrec()命令之外,您还可以在使用.record().play()之间快速切换,而在while循环之间只有很小的延迟。

例如,以下代码应录制一毫秒,等待一毫秒,然后播放一毫秒的音频:

duration = 0.001

while(True):
    myarray= sd.rec(int(duration*fs))
    sd.wait()
    sd.play(myarray, (int(duration*fs)))

回放后没有毫秒延迟,因为您想立即返回以记录下一个毫秒。 但是应该注意,这不会使您的音频录制时间超过一毫秒!您将必须添加自己的代码,该代码将添加到指定大小的数组中并填充它随着时间的推移。

答案 1 :(得分:0)

https://stackoverflow.com/a/54569667来回答我自己的答案:

  

函数sd.play()sd.rec()sd.playrec()不能快速重复使用。在内部,它们每次分别创建一个sd.OutputStreamsd.InputStreamsd.Stream,播放/录制音频数据并再次关闭流。由于打开和关闭流,将出现间隙。这是预期的。

对于连续播放,您可以通过创建单个流并在其上调用read()和/或write()方法来使用所谓的“阻止模式”。

或者,我通常更喜欢通过创建自定义的“回调”函数并将其传递给创建时的流来使用所谓的“非阻塞模式”。 在此回调函数中,您可以例如将输入数据写入queue.Queue,并从同一队列中读取输出数据。通过预先在队列中填充一定数量的零,可以指定输入和输出之间的延迟时间。

您可以查看examples,了解如何使用回调函数和队列。

如果需要更多帮助,请告诉我,然后尝试提供具体的代码示例。