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

问题描述 投票:0回答:2

我想创建一个语音干扰器。它本质上是重复你刚才所说的东西,但它是连续的。我试图使用声音设备库并记录我正在播放的内容。然后我改变它原来记录我说的话,然后播放它同时也记录新的东西。但它没有按照我的意愿运作。对其他图书馆的任何建议?或者,如果有人看到我已经拥有的代码的建议。

它不是经常回放给我,而是开始和停止。它以指定的持续时间间隔执行此操作。因此它将记录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()
python-3.x python-sounddevice
2个回答
0
投票

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

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

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

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

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

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


0
投票

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

你可以在你的while循环中使用.playrec().record()之间的一小段延迟,而不是使用.play()命令。

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

duration = 0.001

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

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

© www.soinside.com 2019 - 2024. All rights reserved.