如何在输入流上播放声音
我在想,能不能直接从Python里把声音播放到一个输入设备上。我现在用的是Linux系统,同时还在用OSS、ALSA和Pulseaudio这些工具。
2 个回答
-1
我想这要看你拿到数据后想用它做什么。如果你想处理声音的话,我推荐你看看scikits.audiolab这个库。这个库可以帮助你绘制声音的频谱图,我猜这正是你想要做的事情吧?
3
你完全可以用Python来播放(和生成)声音。
这里有一个示例代码,它会生成一个正弦波,打开默认的Alsa播放设备,并通过这个设备播放正弦波。
#!/usr/bin/env python3
import math
import struct
import alsaaudio
from itertools import *
def sine_wave(frequency=440.0, framerate=44100, amplitude=0.5):
"""Stolen from here: http://zacharydenton.com/generate-audio-with-python/"""
period = int(framerate / frequency)
if amplitude > 1.0: amplitude = 1.0
if amplitude < 0.0: amplitude = 0.0
lookup_table = [float(amplitude) * math.sin(2.0*math.pi*float(frequency)*(float(i%period)/float(framerate))) for i in range(period)]
return (lookup_table[i%period] for i in count(0))
sound_out = alsaaudio.PCM() # open default sound output
sound_out.setchannels(1) # use only one channel of audio (aka mono)
sound_out.setrate(44100) # how many samples per second
sound_out.setformat(alsaaudio.PCM_FORMAT_FLOAT_LE) # sample format
for sample in sine_wave():
# alsa only eats binnary data
b = struct.pack("<f", sample) # convert python float to binary float
sound_out.write(b)
或者你可以把麦克风的声音回放到扬声器上。
#!/usr/bin/env python3
import struct
import alsaaudio
sound_out = alsaaudio.PCM() # open default sound output
sound_out.setchannels(1) # use only one channel of audio (aka mono)
sound_out.setperiodsize(5) # buffer size, default is 32
sound_in = alsaaudio.PCM(type=alsaaudio.PCM_CAPTURE) # default recording device
sound_in.setchannels(1) # use only one channel of audio (aka mono)
sound_in.setperiodsize(5) # buffer size, default is 32
while True:
sample_lenght, sample = sound_in.read()
sound_out.write(sample)
在Python的alsaaudio库中还有很多其他的例子可以找到,链接是 http://pyalsaaudio.sourceforge.net/libalsaaudio.html