资源技术动态Python实现录音和播放功能

Python实现录音和播放功能

2019-09-27 | |  94 |   0

原标题:Python实现录音和播放功能     来源: AI柠檬  [ AI柠檬博主 ]      

原文链接:https://blog.ailemon.me/2019/08/13/python-implement-audio-recorder-and-player/#more-1451



我们在需要跟用户使用语音进行交互的场景中,经常需要使用到录音的功能,比如网络语音通话和语音助手等,而完整的从底层实现录音功能往往是相当困难的,通常通过调用相关API来实现。这里我们介绍一种使用Python(3.x)中的PyAudio软件包来实现录音的方法。


需要安装的python软件包


○ pyaudio

wave


步骤


首先,我们需要导入软件包,并指定需要用到的相关参数,比如采样率,采样通道数和采样位宽等。


import wavefrom pyaudio import PyAudio,paInt16


framerate=16000

NUM_SAMPLES=2000

channels=1

sampwidth=2

TIME=10


然后,我们先写一个用于将已经录制好的wave音频保存到文件的函数,这里就用到了“wave”这个软件包,其中,每个成员函数的意思就是其字面意思,按照其方法调用即可。


def save_wave_file(filename,data):

    '''save the data to the wavfile'''

    wf=wave.open(filename,'wb')

    wf.setnchannels(channels)

    wf.setsampwidth(sampwidth)

    wf.setframerate(framerate)

    wf.writeframes(b"".join(data))

    wf.close()


接下来,就是核心的录音模块,这里要使用“pyaudio”这个包它会在内存中打开一个音频输入流,将从录音设备中采集到的声波信号持续读入内存,当一定时间录音结束后,就将录制好的声音写出到硬盘中。


def my_record():

    pa=PyAudio()

    stream=pa.open(format = paInt16,channels=1,

                   rate=framerate,input=True,

                   frames_per_buffer=NUM_SAMPLES)

    my_buf=[]

    count=0

    while count<TIME*8:#控制录音时间

        string_audio_data = stream.read(NUM_SAMPLES)

        my_buf.append(string_audio_data)

        count+=1

        print('.')

    save_wave_file('01.wav',my_buf)

    stream.close()


然后,我们还可以写一个函数来播放刚才录制的音频文件,其实就跟前面几步刚好反过来,前面是先用pyaudio录音,再用wave写到文件,这里先用wave从文件中读入内存,再用pyaudio写到输出流中,由音响设备来播放声音。我们可以设置一个固定大小的chunk块来做缓冲。播放完毕后,需要将文件的输入流和音频的输出流关闭,以解除资源占用。


chunk=2014

def play():

    wf=wave.open(r"01.wav",'rb')

    p=PyAudio()

    stream=p.open(format=p.get_format_from_width(wf.getsampwidth()),channels=

    wf.getnchannels(),rate=wf.getframerate(),output=True)

    while True:

        data=wf.readframes(chunk)

        if data=="":break

        stream.write(data)

    stream.close()

    p.terminate()


最后,只要在启动运行的时候,分别调用上述函数,就可以实现录音和播放的功能了。


if __name__ == '__main__':

    my_record()

    print('Over!') 

    play() 

THE END

免责声明:本文来自互联网新闻客户端自媒体,不代表本网的观点和立场。

合作及投稿邮箱:E-mail:editor@tusaishared.com

上一篇:语言生成实战:自己训练能讲“人话”的神经网络

下一篇:练手扎实基本功必备:非结构文本特征提取方法

用户评价
全部评价

热门资源

  • 应用笔画宽度变换...

    应用背景:是盲人辅助系统,城市环境中的机器导航...

  • GAN之根据文本描述...

    一些比较好玩的任务也就应运而生,比如图像修复、...

  • 端到端语音识别时...

    从上世纪 50 年代诞生到 2012 年引入 DNN 后识别效...

  • 人体姿态估计的过...

    人体姿态估计是计算机视觉中一个很基础的问题。从...

  • 谷歌发布TyDi QA语...

    为了鼓励对多语言问答技术的研究,谷歌发布了 TyDi...