Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/python-2.7/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 是否可以播放正在进行的录音?_Python_Python 2.7_Ubuntu_Audio - Fatal编程技术网

Python 是否可以播放正在进行的录音?

Python 是否可以播放正在进行的录音?,python,python-2.7,ubuntu,audio,Python,Python 2.7,Ubuntu,Audio,我想录下我的笔记本电脑麦克风捕捉到的音频,然后说延迟一段时间后,通过连接到笔记本电脑的耳机播放。我尝试的是以10秒为背景,分批录制传入音频&在录制完10秒的第一个音频片段后,开始通过耳机在背景中播放。我面临的问题是,在录音结束时,我合并了所有批次的声音片段,在停止一次录音和重新录制下一个传入声音的过程中,一些声音样本丢失 那么,有没有可能让录音继续&在采集了一些样本之后,开始播放正在进行的录音?或者是否有任何其他的工作可以解决此示例丢失的问题?如果您只想录制和播放,pyaudio有很好的基本示例

我想录下我的笔记本电脑麦克风捕捉到的音频,然后说延迟一段时间后,通过连接到笔记本电脑的耳机播放。我尝试的是以10秒为背景,分批录制传入音频&在录制完10秒的第一个音频片段后,开始通过耳机在背景中播放。我面临的问题是,在录音结束时,我合并了所有批次的声音片段,在停止一次录音和重新录制下一个传入声音的过程中,一些声音样本丢失


那么,有没有可能让录音继续&在采集了一些样本之后,开始播放正在进行的录音?或者是否有任何其他的工作可以解决此示例丢失的问题?

如果您只想录制和播放,
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帖子: