我想创建一个语音干扰器。它本质上是向你重复你刚才所说的话,但它是连续的。我试图使用 sounddevice 库并在播放的同时记录我所说的内容。然后我将其更改为最初记录我所说的内容,然后在录制新内容的同时播放它。但是,它并没有像我希望的那样运行。对其他图书馆有什么建议吗?或者如果有人看到我已经拥有的代码的建议。
它不是不断地向我播放,而是开始和停止。它以指定的持续时间间隔执行此操作。所以它将录制 500 毫秒,然后播放 500 毫秒,然后再次开始录制。想要的行为是 - 录制 500 毫秒,同时播放以 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()
从https://stackoverflow.com/a/54569667转述我自己的答案:
该功能
sd.play()
,sd.rec()
并且sd.playrec()
不意味着要快速连续反复使用。在内部,他们每次创建一个sd.OutputStream
,sd.InputStream
或sd.Stream
(分别)播放/录制音频数据并再次关闭流。由于打开和关闭流,会出现间隙。这是预期的。
对于连续播放,您可以通过创建单个流并在其上调用read()和/或write()方法来使用所谓的“阻塞模式” 。
或者,我通常更喜欢的是,您可以通过创建自定义“回调”函数并将其传递给创建时的流来使用所谓的“非阻塞模式”。在此回调函数中,您可以例如将输入数据写入queue.Queue并从同一队列读取输出数据。通过预先在队列中填充一定数量的零,您可以指定输入和输出之间的延迟时间。
您可以查看示例以了解如何使用回调函数和队列。
如果您需要更多帮助,请告诉我,然后我可以尝试提出一个具体的代码示例。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句