Mar*_*elj 11 python audio numpy audio-streaming
目前我正在使用NumPy从NumPy数组生成WAV文件.我想知道是否可以在实际写入硬盘之前实时播放NumPy阵列.我发现使用PyAudio的所有示例都依赖于首先将NumPy数组写入WAV文件,但我希望有一个预览函数,它只是将NumPy数组吐出到音频输出.
也应该是跨平台的.我正在使用Python 3(Anaconda发行版).
这有效!感谢帮助!
def generate_sample(self, ob, preview):
print("* Generating sample...")
tone_out = array(ob, dtype=int16)
if preview:
print("* Previewing audio file...")
bytestream = tone_out.tobytes()
pya = pyaudio.PyAudio()
stream = pya.open(format=pya.get_format_from_width(width=2), channels=1, rate=OUTPUT_SAMPLE_RATE, output=True)
stream.write(bytestream)
stream.stop_stream()
stream.close()
pya.terminate()
print("* Preview completed!")
else:
write('sound.wav', SAMPLE_RATE, tone_out)
print("* Wrote audio file!")
Run Code Online (Sandbox Code Playgroud)
现在看起来很简单,但是当你不太了解Python时,它似乎很糟糕.
正如您在示例中所见,pyaudio 只是从 WAV 文件中读取数据并将其写入流。
没有必要先写一个 WAV 文件,你只需要一个正确格式的数据流。
我正在添加下面的示例,以防链接失效(请注意,我没有编写此代码):
"""PyAudio Example: Play a WAVE file."""
import pyaudio
import wave
import sys
CHUNK = 1024
if len(sys.argv) < 2:
print("Plays a wave file.\n\nUsage: %s filename.wav" % sys.argv[0])
sys.exit(-1)
wf = wave.open(sys.argv[1], 'rb')
p = pyaudio.PyAudio()
stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
channels=wf.getnchannels(),
rate=wf.getframerate(),
output=True)
data = wf.readframes(CHUNK)
while data != '':
stream.write(data)
data = wf.readframes(CHUNK)
stream.stop_stream()
stream.close()
p.terminate()
Run Code Online (Sandbox Code Playgroud)
使用python-sounddevice,这真的很简单:
import sounddevice as sd
sd.play(myarray, 44100)
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
33587 次 |
最近记录: |