Python 是否可以播放正在进行的录音?
我想录下我的笔记本电脑麦克风捕捉到的音频,然后说延迟一段时间后,通过连接到笔记本电脑的耳机播放。我尝试的是以10秒为背景,分批录制传入音频&在录制完10秒的第一个音频片段后,开始通过耳机在背景中播放。我面临的问题是,在录音结束时,我合并了所有批次的声音片段,在停止一次录音和重新录制下一个传入声音的过程中,一些声音样本丢失Python 是否可以播放正在进行的录音?,python,python-2.7,ubuntu,audio,Python,Python 2.7,Ubuntu,Audio,我想录下我的笔记本电脑麦克风捕捉到的音频,然后说延迟一段时间后,通过连接到笔记本电脑的耳机播放。我尝试的是以10秒为背景,分批录制传入音频&在录制完10秒的第一个音频片段后,开始通过耳机在背景中播放。我面临的问题是,在录音结束时,我合并了所有批次的声音片段,在停止一次录音和重新录制下一个传入声音的过程中,一些声音样本丢失 那么,有没有可能让录音继续&在采集了一些样本之后,开始播放正在进行的录音?或者是否有任何其他的工作可以解决此示例丢失的问题?如果您只想录制和播放,pyaudio有很好的基本示例
那么,有没有可能让录音继续&在采集了一些样本之后,开始播放正在进行的录音?或者是否有任何其他的工作可以解决此示例丢失的问题?如果您只想录制和播放,
pyaudio
有很好的基本示例
但是,如果您需要自定义录制和播放之间的延迟,则根据复杂性和工作量有多种方法。一种方法是录制和保存音频文件块,并在录制和播放之间延迟一段时间后按顺序播放 可以将小块存储到内存中的对象中(尽管我还没有尝试过) 播放和录制可以是线程化的,也可以生成线程以同时运行。不过,我尝试了多处理,因为我没有多核CPU,所以它可能无法工作。欢迎您进一步发展 因此,正如前面所讨论的,我们使用
record\u audio
函数录制并保存音频文件块
import pyaudio
import wave
import time
from multiprocessing import Process
def record_audio(AUDIO_FILE):
#Create audio stream
stream = p.open(format=FORMAT,
channels=CHANNELS,
rate=RATE,
input=True,
frames_per_buffer=CHUNK)
# begin recording
print"* recording audio clip: ",AUDIO_FILE
frames = []
for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
data = stream.read(CHUNK)
frames.append(data)
#print"* done recording audio clip:", AUDIO_FILE
#cleanup objects
stream.stop_stream()
stream.close()
#save frames to audio clips
print"* sending data to audio file:", AUDIO_FILE
wf = wave.open(AUDIO_FILE , 'wb')
wf.setnchannels(CHANNELS)
wf.setsampwidth(p.get_sample_size(FORMAT))
wf.setframerate(RATE)
wf.writeframes(b''.join(frames))
wf.close()
接下来,我们使用play_audio
函数定义函数来播放音频块
def play_audio(AUDIO_FILE):
#open saved audio clip
wf2 = wave.open(AUDIO_FILE , 'rb')
#Introduce playback delay
time.sleep(AUDIO_DELAY)
#Define playback audio stream
stream2 = p.open(format=p.get_format_from_width(wf2.getsampwidth()),
channels=wf2.getnchannels(),
rate=wf2.getframerate(),
output=True)
data = wf2.readframes(CHUNK)
print" *************************** playing back audio file:", AUDIO_FILE
while data != '':
stream2.write(data)
data = wf2.readframes(CHUNK)
stream2.stop_stream()
stream2.close()
p.terminate()
然后我们将两个函数放在main
中,并(尝试)同时启动
if __name__=='__main__':
CHUNK = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 2 #stereo
RATE = 44100
RECORD_SECONDS = 5 #record chunks of 5 sec
TOTAL_RECORD_NUMBER = 5 # total chunks to record and play
AUDIO_DELAY = 5.0 #playback delay in seconds
x = 0
while x < TOTAL_RECORD_NUMBER:
#define audio file clip
AUDIO_FILE = "audio{0}.wav".format(x)
#initialize pyaudio
p = pyaudio.PyAudio()
#Kick off record audio function process
p1 = Process(target = record_audio(AUDIO_FILE))
p1.start()
#kick off play audio function process
p2 = Process(target = play_audio(AUDIO_FILE))
p2.start()
p1.join()
p2.join()
#increment record counter
x += 1
正如您所看到的,这些进程并没有同时产生。你可以进一步发展它
希望这能有所帮助。如果您只想录制和播放,
pyaudio
有很好的基本示例
但是,如果您需要自定义录制和播放之间的延迟,则根据复杂性和工作量有多种方法。一种方法是录制和保存音频文件块,并在录制和播放之间延迟一段时间后按顺序播放 可以将小块存储到内存中的对象中(尽管我还没有尝试过) 播放和录制可以是线程化的,也可以生成线程以同时运行。不过,我尝试了多处理,因为我没有多核CPU,所以它可能无法工作。欢迎您进一步发展 因此,正如前面所讨论的,我们使用
record\u audio
函数录制并保存音频文件块
import pyaudio
import wave
import time
from multiprocessing import Process
def record_audio(AUDIO_FILE):
#Create audio stream
stream = p.open(format=FORMAT,
channels=CHANNELS,
rate=RATE,
input=True,
frames_per_buffer=CHUNK)
# begin recording
print"* recording audio clip: ",AUDIO_FILE
frames = []
for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
data = stream.read(CHUNK)
frames.append(data)
#print"* done recording audio clip:", AUDIO_FILE
#cleanup objects
stream.stop_stream()
stream.close()
#save frames to audio clips
print"* sending data to audio file:", AUDIO_FILE
wf = wave.open(AUDIO_FILE , 'wb')
wf.setnchannels(CHANNELS)
wf.setsampwidth(p.get_sample_size(FORMAT))
wf.setframerate(RATE)
wf.writeframes(b''.join(frames))
wf.close()
接下来,我们使用play_audio
函数定义函数来播放音频块
def play_audio(AUDIO_FILE):
#open saved audio clip
wf2 = wave.open(AUDIO_FILE , 'rb')
#Introduce playback delay
time.sleep(AUDIO_DELAY)
#Define playback audio stream
stream2 = p.open(format=p.get_format_from_width(wf2.getsampwidth()),
channels=wf2.getnchannels(),
rate=wf2.getframerate(),
output=True)
data = wf2.readframes(CHUNK)
print" *************************** playing back audio file:", AUDIO_FILE
while data != '':
stream2.write(data)
data = wf2.readframes(CHUNK)
stream2.stop_stream()
stream2.close()
p.terminate()
然后我们将两个函数放在main
中,并(尝试)同时启动
if __name__=='__main__':
CHUNK = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 2 #stereo
RATE = 44100
RECORD_SECONDS = 5 #record chunks of 5 sec
TOTAL_RECORD_NUMBER = 5 # total chunks to record and play
AUDIO_DELAY = 5.0 #playback delay in seconds
x = 0
while x < TOTAL_RECORD_NUMBER:
#define audio file clip
AUDIO_FILE = "audio{0}.wav".format(x)
#initialize pyaudio
p = pyaudio.PyAudio()
#Kick off record audio function process
p1 = Process(target = record_audio(AUDIO_FILE))
p1.start()
#kick off play audio function process
p2 = Process(target = play_audio(AUDIO_FILE))
p2.start()
p1.join()
p2.join()
#increment record counter
x += 1
正如您所看到的,这些进程并没有同时产生。你可以进一步发展它
希望这能有所帮助。请在此处查看SO帖子:请在此处查看SO帖子: