首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >是否有可能播放一段正在进行的录音?

是否有可能播放一段正在进行的录音?
EN

Stack Overflow用户
提问于 2016-10-18 10:18:26
回答 1查看 805关注 0票数 1

我想记录下我的笔记本电脑的麦克风捕获的音频,然后说,经过一些延迟,播放它通过耳机连接到笔记本电脑。我尝试的是以10秒的批次记录输入的音频,作为背景处理&在录制了10秒的第一个音频剪辑之后,开始通过耳机在后台播放它。我面临的问题是,在录音结束时,我把所有的声音剪辑组合在一起,在停止一次录音和重新开始下一次输入的声音的过程中,一些声音样本丢失了。

那么,是否有可能让录音继续&在采集了一些样本之后,开始播放正在进行的录音?或者,在这个样本附近还有其他工作要做吗?

EN

回答 1

Stack Overflow用户

发布于 2016-10-20 19:21:35

如果您只想录制和播放,pyaudio有很好的基本示例这里

但是,如果您需要自定义记录和回放之间的延迟,那么根据复杂性和工作的不同,有不同的方法。

一种方法是记录和保存部分音频文件,并在录音和播放之间延迟一段时间后按顺序播放。

可以将小块保存到内存中的对象中(尽管我还没有尝试过)。

回放和录音可以是线程化的或衍生的,以同时运行。然而,我尝试了多处理,因为我没有多核CPU,所以它似乎无法工作。欢迎您进一步发展。

因此,正如前面讨论的,我们使用record_audio函数记录和保存大量音频文件。

代码语言:javascript
复制
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函数定义函数来播放音频块。

代码语言:javascript
复制
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中将两个函数放在一起,并(尝试)同时启动。

代码语言:javascript
复制
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

输出:

代码语言:javascript
复制
Python 2.7.9 (default, Dec 10 2014, 12:24:55) [MSC v.1500 32 bit (Intel)] on win32
Type "copyright", "credits" or "license()" for more information.
>>> ================================ RESTART ================================
>>> 
* recording audio clip:  audio0.wav
* sending data to audio file: audio0.wav
 *************************** playing back audio file: audio0.wav
* recording audio clip:  audio1.wav
* sending data to audio file: audio1.wav
 *************************** playing back audio file: audio1.wav
* recording audio clip:  audio2.wav
* sending data to audio file: audio2.wav
 *************************** playing back audio file: audio2.wav
* recording audio clip:  audio3.wav
* sending data to audio file: audio3.wav
 *************************** playing back audio file: audio3.wav
* recording audio clip:  audio4.wav
* sending data to audio file: audio4.wav
 *************************** playing back audio file: audio4.wav
>>> 

正如您所看到的,这些过程不是同时产生的。你可以进一步发展它。

希望这能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/40105581

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档