python实现播放音频和录音功能示例代码


Posted in Python onDecember 30, 2018

音频预处理

这一讲主要介绍些音频基本处理方式,为接下来的语音识别打基础。

三种播放音频的方式

使用 python 播放音频有以下几种方式:

os.system()

os.system(file) 调用系统应用来打开文件,file 可为图片或者音频文件。

缺点:要打开具体的应用,不能在后台播放音频。

pyaudio

安装:pip install pyaudio

官方提供了播放音频与录音的 api ,使用十分方便,只要把Filename更改为你的音频文件的文字,就可以播放音频了。

"""PyAudio Example: Play a WAVE file."""

import pyaudio
import wave


CHUNK = 1024
FILENAME = '你的音频文件'

def play(filename = FILENAME):
 wf = wave.open(filename, 'rb')

 p = pyaudio.PyAudio()

 stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
   channels=wf.getnchannels(),
   rate=wf.getframerate(),
   output=True)

 data = wf.readframes(CHUNK)

 while data != b'':
 stream.write(data)
 data = wf.readframes(CHUNK)

 stream.stop_stream()
 stream.close()

 p.terminate()

jupyter notebook

在 jupyer notebook 中播放音频可以使用以下函数:

import IPython.display as ipd
ipd.Audio(文件名)

几种读取音频的方式

python 有很多读取音频文件的方法,内置的库 wave ,科学计算库 scipy, 和方便易用的语音处理库 librosa。
下面将介绍分别使用这几种库读取音频文件:

安装:

  • wave 是内置库直接导入即可。
  • scipy: pip install scipy
  • librosa: pip install librosa

使用:

wave.open:

参数 path 为文件名,mode 为打开方式

以'rb'方式打开文件返回一个 Wave_read 对象,而以'wb'方式打开文件返回一个 Wave_write 对象。

scipy.io.wavfile:

参数 path 为文件名

返回 rate : 采样率(每秒采样点的个数),data : 音频数据

librosa.load:

参数 path 为文件名

返回 y 为音频数据,sr 为采样率

# read wav file from path
from scipy.io import wavfile
import librosa
import pyaudio

# wave
file = wave.open(path,'rb')
# wavfile
rate, data = wavfile.read(path)
# librosa
y, sr = librosa.load(path)

下面演示一个使用 wavfile 读取音频文件并且画出波形的例子:

首先要计算音频到底持续了多长时间,wave 的 shape 就是总的采样点个数,除以采样频率可以得到持续的总时间(秒),乘1000得到总持续时间(毫秒)。接着通过 np.linsapce 产生时间的序列,最后使用 matplotlib 画出图像。

from scipy.io import wavfile
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline

# 一秒采样数
sr, wave = wavfile.read('D://QQPCMgr/Desktop/python3/skip.wav')
sample_number = wave.shape[0]
total_time = int(sample_number / sr * 1000)
time_series = np.linspace(0,total_time,sample_number)
fig, ax = plt.subplots(1, 1)
ax.plot(time_series, wave)
ax.set_title('Time*Amplitude')
ax.set_xlabel('Time/ms')
ax.set_ylabel('Amplitude/dB')

python实现播放音频和录音功能示例代码

最后再借用 pyaudio 的 api 我们可以实现连续录音功能:

python 实现录音功能

其中,函数 multi_record每结束一次录音会询问 “是否进行下一次录音?”,按回车就可以进行下一次录音了。

import wave
import pyaudio
import matplotlib.pyplot as plt
import time

CHUNK = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 2
RATE = 44100
RECORD_SECONDS = 5


def record(filename='output.wav'):
 """官方录音教程
 """
 
 p = pyaudio.PyAudio()
 
 stream = p.open(format=FORMAT,
   channels=CHANNELS,
   rate=RATE,
   input=True,
   frames_per_buffer=CHUNK)
 
 print("* recording")
 
 frames = []

 for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
 data = stream.read(CHUNK)
 frames.append(data)
 
 print("* done recording")
 
 stream.stop_stream()
 stream.close()
 p.terminate()
 
 wf = wave.open(filename, 'wb')
 wf.setnchannels(CHANNELS)
 wf.setsampwidth(p.get_sample_size(FORMAT))
 wf.setframerate(RATE)
 wf.writeframes(b''.join(frames))
 wf.close()


def multi_record(num=3):
 """implement 多次录音"""
 for i in range(1,num+1):
 print('第{}次录音准备'.format(i))
 filename = 'record_{}.wav'.format(i)
 record(filename)
 time.sleep(second)
 _ = input('进行下一次录音?')


def main():
 multi_record()

if __name__ == '__main__':
 main()

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

Python 相关文章推荐
Python中的高级数据结构详解
Mar 27 Python
Python多线程编程(二):启动线程的两种方法
Apr 05 Python
python实现下载指定网址所有图片的方法
Aug 08 Python
利用python获取当前日期前后N天或N月日期的方法示例
Jul 30 Python
Python matplotlib 画图窗口显示到gui或者控制台的实例
May 24 Python
详解python中的json和字典dict
Jun 22 Python
Python箱型图处理离群点的例子
Dec 09 Python
Python日志syslog使用原理详解
Feb 18 Python
pyinstaller打包成无控制台程序时运行出错(与popen冲突的解决方法)
Apr 15 Python
使用keras根据层名称来初始化网络
May 21 Python
Python迭代器协议及for循环工作机制详解
Jul 14 Python
Python 利用argparse模块实现脚本命令行参数解析
Dec 28 Python
利用python实现简易版的贪吃蛇游戏(面向python小白)
Dec 30 #Python
python中partial()基础用法说明
Dec 30 #Python
python读取各种文件数据方法解析
Dec 29 #Python
python 读取鼠标点击坐标的实例
Dec 29 #Python
对python for 文件指定行读写操作详解
Dec 29 #Python
Python实现二维曲线拟合的方法
Dec 29 #Python
python修改txt文件中的某一项方法
Dec 29 #Python
You might like
php 信息采集程序代码
2009/03/17 PHP
PHP系列学习之日期函数使用介绍
2012/08/18 PHP
php session实现多级目录存放实现代码
2016/02/03 PHP
yii2 开发api接口时优雅的处理全局异常的方法
2019/05/14 PHP
tp5.1 框架路由操作-URL生成实例分析
2020/05/26 PHP
表单提交验证类
2006/07/14 Javascript
jquery实现输入框动态增减的实例代码
2013/07/14 Javascript
异步动态加载JS并运行(示例代码)
2013/12/13 Javascript
js中的for如何实现foreach中的遍历
2014/05/31 Javascript
js自定义鼠标右键的实现原理及源码
2014/06/23 Javascript
nodejs中操作mysql数据库示例
2014/12/20 NodeJs
JS实现自适应高度表单文本框的方法
2015/02/25 Javascript
jQuery右下角旋转环状菜单特效代码
2015/08/10 Javascript
JS实现仿新浪微博发布内容为空时提示功能代码
2015/08/19 Javascript
jQuery position() 函数详解以及jQuery中position函数的应用
2015/12/14 Javascript
JSON简介以及用法汇总
2016/02/21 Javascript
jQuery如何获取动态添加的元素
2016/06/24 Javascript
canvas红包照片实例分享
2017/02/28 Javascript
jQuery使用JSONP实现跨域获取数据的三种方法详解
2017/05/04 jQuery
基于jQuery和CSS3实现APPLE TV海报视差效果
2017/06/16 jQuery
webpack学习教程之publicPath路径问题详解
2017/06/17 Javascript
简单谈谈原生js的math对象
2017/06/27 Javascript
vue使用vue-i18n实现国际化的实现代码
2018/04/08 Javascript
JavaScript实现一个简易的计算器实例代码
2018/05/10 Javascript
es6中class类静态方法,静态属性,实例属性,实例方法的理解与应用分析
2020/02/15 Javascript
浅谈JavaScript中this的指向问题
2020/07/28 Javascript
Python实现微信消息防撤回功能的实例代码
2019/04/29 Python
python numpy 反转 reverse示例
2019/12/04 Python
修改Pandas的行或列的名字(重命名)
2019/12/18 Python
python如何求数组连续最大和的示例代码
2020/02/04 Python
python中逻辑与或(and、or)和按位与或异或(&、|、^)区别
2020/08/05 Python
HTML5视频播放插件 video.js介绍
2018/09/29 HTML / CSS
体育学院毕业生自荐信
2013/11/03 职场文书
2013届毕业生求职信范文
2013/11/20 职场文书
2016会计专业自荐信范文
2016/01/28 职场文书
python使用matplotlib绘制图片时x轴的刻度处理
2021/08/30 Python