将模块多处理与 pyaudio 一起使用
Using Module multiprocessing with pyaudio
抱歉,如果之前有人问过这个问题,我检查过但找不到我的问题的答案。
我正在尝试使用多处理使用 pyaudio 播放声音,以便我可以同时获取输入(最终来自 NI 板,但现在只是键盘)。我尝试使用多处理模块并以这段代码结束(gensin 函数 returns 两个 numpy 数组,一个时间向量和一个 'sin vector')。我是 multiprocessing 和 pyaudio 模块的新手,所以非常感谢任何帮助:)
def play_sound(frequency,duration,sampRate):
#generate the sin wave
t, wave = gensin(frequency,duration,sampRate)
#open the audio file
p = pyaudio.PyAudio()
#create a stream to play
stream = p.open(format = pyaudio.paFloat32,
channels = 1,
rate = sampRate,
output = True)
stream.write(wave.astype(np.float32).tostring())
p.close(stream)
frequency = 1200
duration = 0.5
sampRate = 64000
p1 = multiprocessing.Process(target=play_sound,name='audioOut',args=(frequency,duration,sampRate))
当我发出命令时
p1.run()
它运行良好,但我认为我无法通过这种方式获得并发性。
但是当我尝试
if __name__ == '__main__':
p1.start()
p1.join()
我收到以下错误:
Process play sounds:
Traceback (most recent call last):
File "/Applications/anaconda/python.app/Contents/lib/python2.7/multiprocessing/process.py", line 258, in _bootstrap
self.run()
File "/Applications/anaconda/python.app/Contents/lib/python2.7/multiprocessing/process.py", line 114, in run
self._target(*self._args, **self._kwargs)
File "<ipython-input-5-d9030c79195e>", line 13, in play_sound
output = True)
File "/Applications/anaconda/lib/python2.7/site-packages/pyaudio.py", line 747, in open
stream = Stream(self, *args, **kwargs)
File "/Applications/anaconda/lib/python2.7/site-packages/pyaudio.py", line 442, in __init__
self._stream = pa.open(**arguments)
IOError: [Errno Internal PortAudio error] -9986
我 运行 Yosemite 在 2013 Macbook pro 上,此代码在 Ipython 中执行,但在脚本 python 中也不起作用,我获得相同的 PortAudio 错误号。我尝试过使用 billiard 而不是 multiprocessing,但没有任何改变。任何建议都会非常有帮助。谢谢 :)。
您可以使用 billiard
而不是 multiprocessing
并使其禁用分叉:
pip install billiard
并将以下内容添加到代码的顶部:
import billiard as multiprocessing
multiprocessing.forking_enable(False)
抱歉,如果之前有人问过这个问题,我检查过但找不到我的问题的答案。 我正在尝试使用多处理使用 pyaudio 播放声音,以便我可以同时获取输入(最终来自 NI 板,但现在只是键盘)。我尝试使用多处理模块并以这段代码结束(gensin 函数 returns 两个 numpy 数组,一个时间向量和一个 'sin vector')。我是 multiprocessing 和 pyaudio 模块的新手,所以非常感谢任何帮助:)
def play_sound(frequency,duration,sampRate):
#generate the sin wave
t, wave = gensin(frequency,duration,sampRate)
#open the audio file
p = pyaudio.PyAudio()
#create a stream to play
stream = p.open(format = pyaudio.paFloat32,
channels = 1,
rate = sampRate,
output = True)
stream.write(wave.astype(np.float32).tostring())
p.close(stream)
frequency = 1200
duration = 0.5
sampRate = 64000
p1 = multiprocessing.Process(target=play_sound,name='audioOut',args=(frequency,duration,sampRate))
当我发出命令时
p1.run()
它运行良好,但我认为我无法通过这种方式获得并发性。
但是当我尝试
if __name__ == '__main__':
p1.start()
p1.join()
我收到以下错误:
Process play sounds:
Traceback (most recent call last):
File "/Applications/anaconda/python.app/Contents/lib/python2.7/multiprocessing/process.py", line 258, in _bootstrap
self.run()
File "/Applications/anaconda/python.app/Contents/lib/python2.7/multiprocessing/process.py", line 114, in run
self._target(*self._args, **self._kwargs)
File "<ipython-input-5-d9030c79195e>", line 13, in play_sound
output = True)
File "/Applications/anaconda/lib/python2.7/site-packages/pyaudio.py", line 747, in open
stream = Stream(self, *args, **kwargs)
File "/Applications/anaconda/lib/python2.7/site-packages/pyaudio.py", line 442, in __init__
self._stream = pa.open(**arguments)
IOError: [Errno Internal PortAudio error] -9986
我 运行 Yosemite 在 2013 Macbook pro 上,此代码在 Ipython 中执行,但在脚本 python 中也不起作用,我获得相同的 PortAudio 错误号。我尝试过使用 billiard 而不是 multiprocessing,但没有任何改变。任何建议都会非常有帮助。谢谢 :)。
您可以使用 billiard
而不是 multiprocessing
并使其禁用分叉:
pip install billiard
并将以下内容添加到代码的顶部:
import billiard as multiprocessing
multiprocessing.forking_enable(False)