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 02 Python
Python模拟三级菜单效果
Sep 11 Python
python中itertools模块zip_longest函数详解
Jun 12 Python
python 对字典按照value进行排序的方法
May 09 Python
python实现连连看辅助之图像识别延伸
Jul 17 Python
使用Python实现文字转语音并生成wav文件的例子
Aug 08 Python
Python使用Tkinter实现转盘抽奖器的步骤详解
Jan 06 Python
Python读取二进制文件代码方法解析
Jun 22 Python
Python Request类源码实现方法及原理解析
Aug 17 Python
python利用google翻译方法实例(翻译字幕文件)
Sep 21 Python
OpenCV中resize函数插值算法的实现过程(五种)
Jun 05 Python
Python django中如何使用restful框架
Jun 23 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/10 PHP
php遍历目录与文件夹的多种方法详解
2013/11/14 PHP
thinkphp中memcache的用法实例
2014/11/29 PHP
从wamp到xampp的升级之路
2015/04/08 PHP
微信网页授权(OAuth2.0) PHP 源码简单实现
2016/08/29 PHP
jquery Firefox3.5中操作select的问题
2009/07/10 Javascript
JavaScript 常用函数
2009/12/30 Javascript
JQuery里面的几种选择器 查找满足条件的元素$("#控件ID")
2011/08/23 Javascript
form表单action提交的js部分与html部分
2014/01/07 Javascript
window.print打印指定div指定网页指定区域的方法
2014/08/04 Javascript
在JavaScript中重写jQuery对象的方法实例教程
2014/08/25 Javascript
实践中学习AngularJS表单
2016/03/21 Javascript
jQuery ajaxSubmit 实现ajax提交表单局部刷新
2016/07/04 Javascript
浅谈js中的三种继承方式及其优缺点
2016/08/10 Javascript
Vue.js做select下拉列表的实例(ul-li标签仿select标签)
2018/03/02 Javascript
vue移动端路由切换实例分析
2018/05/14 Javascript
JavaScript 预解析的4种实现方法解析
2019/09/03 Javascript
javascript实现支付宝滑块验证码效果
2020/07/24 Javascript
python删除过期文件的方法
2015/05/29 Python
使用Python通过win32 COM实现Word文档的写入与保存方法
2018/05/08 Python
对python 多线程中的守护线程与join的用法详解
2019/02/18 Python
python二元表达式用法
2019/12/04 Python
解决python pandas读取excel中多个不同sheet表格存在的问题
2020/07/14 Python
Python 高效编程技巧分享
2020/09/10 Python
Canvas波浪花环的示例代码
2020/08/21 HTML / CSS
Timex手表官网:美国运动休闲手表品牌
2017/01/28 全球购物
印度购物网站:TATA CLiQ
2017/11/23 全球购物
delegate与普通函数的区别
2014/01/22 面试题
初中美术教学反思
2014/01/29 职场文书
员工晚婚的请假条
2014/02/08 职场文书
食品安全承诺书范文
2014/08/29 职场文书
户外活动总结
2015/02/04 职场文书
农村婚礼司仪主持词
2015/06/29 职场文书
素质教育学习心得体会
2016/01/19 职场文书
vue中this.$http.post()跨域和请求参数丢失的解决
2022/04/08 Vue.js
mysql幻读详解实例以及解决办法
2022/06/16 MySQL