0

我想创建一个语音干扰器。它本质上是向你重复你刚才所说的话,但它是连续的。我试图使用 sounddevice 库并在播放的同时记录我所说的内容。然后我将其更改为最初录制我所说的内容,然后在录制新内容的同时播放它。但是,它没有按我的意愿运行。对其他图书馆有什么建议吗?或者,如果有人看到我已经拥有的代码的建议。

它不是不断地向我播放,而是开始和停止。它以指定的持续时间间隔执行此操作。所以它会录制 500 毫秒,然后播放 500 毫秒,然后重新开始录制。想要的行为是 - 录制 500 毫秒,同时播放它以一些毫秒延迟录制的音频。

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()
4

2 回答 2

0

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

除了使用.playrec()命令之外,您还可以在 while 循环内快速交替使用.record()和之间.play()的一小段延迟。

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

duration = 0.001

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

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

于 2019-03-06T21:14:36.897 回答
0

https://stackoverflow.com/a/54569667解释我自己的答案:

这些功能sd.play(),sd.rec()sd.playrec()并不意味着快速连续重复使用。在内部,他们每次都创建一个sd.OutputStreamsd.InputStreamsd.Stream(分别)播放/录制音频数据并再次关闭流。由于打开和关闭流,会出现间隙。这是意料之中的。

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

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

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

如果您需要更多帮助,请告诉我,然后我可以尝试提出一个具体的代码示例。

于 2019-03-07T07:59:29.157 回答