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 11 Python
python实现查询苹果手机维修进度
Mar 16 Python
Python中动态获取对象的属性和方法的教程
Apr 09 Python
python3序列化与反序列化用法实例
May 26 Python
利用Python实现图书超期提醒
Aug 02 Python
简单谈谈Python中的反转字符串问题
Oct 24 Python
Collatz 序列、逗号代码、字符图网格实例
Jun 22 Python
Python 实现数据结构-堆栈和队列的操作方法
Jul 17 Python
python2和python3应该学哪个(python3.6与python3.7的选择)
Oct 01 Python
使用Python打造一款间谍程序的流程分析
Feb 21 Python
python批量替换文件名中的共同字符实例
Mar 05 Python
Python利用socket模块开发简单的端口扫描工具的实现
Jan 27 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
Windows下的PHP5.0安装配制详解
2006/09/05 PHP
dedecms 制作模板中使用的全局标记图文教程
2007/03/11 PHP
php中常用的预定义变量小结
2012/05/09 PHP
PHP针对字符串开头和结尾的判断方法
2016/07/11 PHP
基于php实现的验证码小程序
2016/12/13 PHP
深入浅析PHP的session反序列化漏洞问题
2017/06/15 PHP
Laravel 错误提示本地化的实现
2019/10/22 PHP
七种PHP开发环境搭建工具
2020/06/28 PHP
PHP 出现 http500 错误的解决方法
2021/03/09 PHP
我的javascript 函数链之演变
2011/04/07 Javascript
jquery将一个表单序列化为一个对象的方法
2013/12/02 Javascript
一个js控制的导航菜单实例代码
2013/12/03 Javascript
Javascript定义类(class)的三种方法详解
2015/03/13 Javascript
jquery插件之文字间歇自动向上滚动效果代码
2016/02/25 Javascript
AngularJS入门教程之与服务器(Ajax)交互操作示例【附完整demo源码下载】
2016/11/02 Javascript
简单实现node.js图片上传
2016/12/18 Javascript
vue+element+Java实现批量删除功能
2019/04/08 Javascript
Vue.js + Nuxt.js 项目中使用 Vee-validate 表单校验
2019/04/22 Javascript
[01:21:36]CHAOS vs Alliacne 2019国际邀请赛小组赛 BO2 第一场 8.15
2019/08/16 DOTA
Python中利用原始套接字进行网络编程的示例
2015/05/04 Python
python抽象基类用法实例分析
2015/06/04 Python
在python中使用xlrd获取合并单元格的方法
2018/12/26 Python
使用python实现kNN分类算法
2019/10/16 Python
python通过对字典的排序,对json字段进行排序的实例
2020/02/27 Python
Python使用OpenPyXL处理Excel表格
2020/07/02 Python
纯CSS3单页切换导航菜单界面设计的简单实现
2016/08/16 HTML / CSS
食品营养与检测应届生求职信
2013/11/08 职场文书
一年级学生期末评语
2014/04/21 职场文书
期中考试反思800字
2014/05/01 职场文书
学雷锋树新风演讲稿
2014/05/10 职场文书
体育教师求职信
2014/05/24 职场文书
小学教师个人总结
2015/02/05 职场文书
自主招生自荐信格式范文
2015/03/25 职场文书
2015年国庆节寄语
2015/08/17 职场文书
解决Navicat for MySQL 连接 MySQL 报2005错误的问题
2021/05/29 MySQL
CSS实现五种常用的2D转换
2021/12/06 HTML / CSS