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删除windows垃圾文件的方法
Jul 14 Python
使用python检测主机存活端口及检查存活主机
Oct 12 Python
Python中基本的日期时间处理的学习教程
Oct 16 Python
python实时分析日志的一个小脚本分享
May 07 Python
Python爬虫之xlml解析库(全面了解)
Aug 08 Python
解决PyCharm的Python.exe已经停止工作的问题
Nov 29 Python
PyCharm配置mongo插件的方法
Nov 30 Python
python加密解密库cryptography使用openSSL生成的密匙加密解密
Feb 11 Python
python 解压、复制、删除 文件的实例代码
Feb 26 Python
python中使用you-get库批量在线下载bilibili视频的教程
Mar 10 Python
Django 用户登陆访问限制实例 @login_required
May 13 Python
理解python中装饰器的作用
Jul 21 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
YB217、YB235、YB400浅听
2021/03/02 无线电
解析func_num_args与func_get_args函数的使用
2013/06/24 PHP
PHP使用JSON和将json还原成数组
2015/02/12 PHP
PHP统计数值数组中出现频率最多的10个数字的方法
2015/04/20 PHP
php将字符串随机分割成不同长度数组的方法
2015/06/01 PHP
php使用curl模拟浏览器表单上传文件或者图片的方法
2018/11/10 PHP
PHP时间戳和日期相互转换操作实例小结
2018/12/18 PHP
深入分析PHP设计模式
2020/06/15 PHP
js 返回时间戳所对应的具体时间
2010/07/20 Javascript
js中的屏蔽的使用示例
2013/07/30 Javascript
php读取sqlite数据库入门实例代码
2014/06/25 Javascript
详解JavaScript异步编程中jQuery的promise对象的作用
2016/05/03 Javascript
JavaScript数据结构中栈的应用之表达式求值问题详解
2017/04/11 Javascript
Angular在模板驱动表单中自定义校验器的方法
2017/08/09 Javascript
基于VUE移动音乐WEBAPP跨域请求失败的解决方法
2018/01/16 Javascript
nginx+vue.js实现前后端分离的示例代码
2018/02/12 Javascript
在vue项目中使用codemirror插件实现代码编辑器功能
2019/08/27 Javascript
js实现计算器功能
2020/08/10 Javascript
OpenLayers3实现对地图的基本操作
2020/09/28 Javascript
使用python搭建Django应用程序步骤及版本冲突问题解决
2013/11/19 Python
Python中的anydbm模版和shelve模版使用指南
2015/07/09 Python
Python实现简单生成验证码功能【基于random模块】
2018/02/10 Python
在django模板中实现超链接配置
2019/08/21 Python
详解Django配置优化方法
2019/11/18 Python
教你使用Sublime text3搭建Python开发环境及常用插件安装另分享Sublime text3最新激活注册码
2020/11/12 Python
Python更改pip镜像源的方法示例
2020/12/01 Python
用css3写出气球样式的示例代码
2017/09/11 HTML / CSS
css3 实现滚动条美化效果的实例代码
2021/01/06 HTML / CSS
世界最大的票务市场:viagogo
2017/02/16 全球购物
LVMH旗下最大的奢侈品网站平台:24S
2020/05/24 全球购物
什么是会话Bean
2015/05/14 面试题
公共艺术专业自荐信
2014/09/01 职场文书
电影地道战观后感
2015/06/04 职场文书
《鸟的天堂》教学反思
2016/02/19 职场文书
golang 在windows中设置环境变量的操作
2021/04/29 Golang
Python-OpenCV教程之图像的位运算详解
2021/06/21 Python