正在尝试使用python sounddevice lower level“;溪流;使用NumPy数组播放和录制的类,给出错误
我试图将音频文件分割成给定数量的NumPy块,并将其放入RAM中播放,就像这样。不幸的是,我相信我对NumPy阵列和音频文件的知识一般都是缺乏的。一旦这段代码开始工作,我想在回调函数中添加一个录制过程。根据我目前拥有的代码,我得到: ValueError:无法将字符串转换为浮点:“” 这发生在回调函数的第二个“if”块中。我正在尝试将零添加到outdata块的末尾,但不确定如何执行 另一件奇怪的事情是,我只从soundfile.read()返回一个numpy数组,它通常返回一个numpy数组和一个samplerate。但我想这是因为我把它分成了几帧。感谢您的帮助正在尝试使用python sounddevice lower level“;溪流;使用NumPy数组播放和录制的类,给出错误,numpy,python-sounddevice,pysoundfile,Numpy,Python Sounddevice,Pysoundfile,我试图将音频文件分割成给定数量的NumPy块,并将其放入RAM中播放,就像这样。不幸的是,我相信我对NumPy阵列和音频文件的知识一般都是缺乏的。一旦这段代码开始工作,我想在回调函数中添加一个录制过程。根据我目前拥有的代码,我得到: ValueError:无法将字符串转换为浮点:“” 这发生在回调函数的第二个“if”块中。我正在尝试将零添加到outdata块的末尾,但不确定如何执行 另一件奇怪的事情是,我只从soundfile.read()返回一个numpy数组,它通常返回一个numpy数组和一
def callback(outdata, frames, time, status):
assert frames == args.blocksize
if status.output_underflow:
print('Output underflow: increase blocksize?', file=sys.stderr)
raise sd.CallbackAbort
assert not status
try:
data = q.get_nowait()
except queue.Empty:
print('Buffer is empty: increase buffersize?', file=sys.stderr)
raise sd.CallbackAbort
if len(data) < len(outdata):
outdata[:len(data),0] = data
outdata[len(data):,0] = b'\x00' * (len(outdata) - len(data))
raise sd.CallbackStop
else:
outdata[:,0] = data
try:
with sf.SoundFile(args.filename) as f:
for _ in range(args.buffersize):
data = f.read(frames=args.blocksize, dtype='float32')
if data.size == 0:
break
q.put_nowait(data) # Pre-fill queue
stream = sd.OutputStream(
samplerate=f.samplerate, blocksize=args.blocksize,
device=args.device, channels=f.channels, dtype='float32',
callback=callback, finished_callback=event.set)
with stream:
timeout = args.blocksize * args.buffersize / f.samplerate
while data.size != 0:
data = f.read(args.blocksize, dtype='float32')
q.put(data, timeout=timeout)
event.wait() # Wait until playback is finished
def回调(输出数据、帧、时间、状态):
断言帧==args.blocksize
如果status.output\u下溢:
打印('输出下溢:增加块大小?',file=sys.stderr)
提升sd.CallbackAbort
不主张地位
尝试:
数据=q.获取_nowait()
队列除外。空:
打印('缓冲区为空:增加缓冲区大小?',file=sys.stderr)
提升sd.CallbackAbort
如果len(数据)outdata[len(data):]=0
soundfile.read()
返回NumPy数组和采样率,soundfile.soundfile.read()
仅返回NumPy数组。使用soundfile.soundfile.samplerate
获取采样率。@Matthias非常感谢,现在它工作得很好!我必须更深入地研究PySoundFile,因为我本应该抓住这个差异。感谢您为构建python sounddevice和回答有问题的人所付出的所有努力。play\u long\u file.py
使用普通python缓冲区而不是NumPy数组,因此它比您需要的复杂。对于NumPy数组,您只需使用outdata[len(data):]=0
soundfile.read()
返回NumPy数组和采样率,soundfile.soundfile.read()
仅返回NumPy数组。使用soundfile.soundfile.samplerate
获取采样率。@Matthias非常感谢,现在它工作得很好!我必须更深入地研究PySoundFile,因为我本应该抓住这个差异。感谢您在构建python sounddevice和回答有问题的人方面所做的一切努力。