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 相关文章推荐
python3 模拟登录v2ex实例讲解
Jul 13 Python
Python连接phoenix的方法示例
Sep 29 Python
Python编程pygame模块实现移动的小车示例代码
Jan 03 Python
python读取xlsx的方法
Dec 25 Python
利用Python检测URL状态
Jul 31 Python
Python 实现文件读写、坐标寻址、查找替换功能
Sep 11 Python
PyCharm使用Docker镜像搭建Python开发环境
Dec 26 Python
python3光学字符识别模块tesserocr与pytesseract的使用详解
Feb 26 Python
tensorflow模型的save与restore,及checkpoint中读取变量方式
May 26 Python
Python把图片转化为pdf代码实例
Jul 28 Python
python之随机数函数的实现示例
Dec 30 Python
python 实现有道翻译功能
Feb 26 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
apache+php+mysql安装配置方法小结
2010/08/01 PHP
PHP按行读取文件时删除换行符的3种方法
2014/05/04 PHP
在Debian系统下配置LNMP的教程
2015/07/09 PHP
php 无限级分类 获取顶级分类ID
2016/03/13 PHP
php实现简单加入购物车功能
2017/03/07 PHP
异步动态加载js与css文件的js代码
2013/09/15 Javascript
ParseInt函数参数设置介绍
2014/01/02 Javascript
javascript读写json示例
2014/04/11 Javascript
jQuery截取指定长度字符串代码
2014/08/21 Javascript
详解JS面向对象编程
2016/01/24 Javascript
JS实现浏览上传文件的代码
2017/08/23 Javascript
javascript按钮禁用和启用的效果实例代码
2017/10/29 Javascript
vue2导航根据路由传值,而改变导航内容的实例
2017/11/10 Javascript
Angular2实现组件交互的方法分析
2017/12/19 Javascript
Vue 使用formData方式向后台发送数据的实现
2019/04/14 Javascript
vue2.0项目集成Cesium的实现方法
2019/07/30 Javascript
[04:49]期待西雅图之战 2016国际邀请赛中国区预选赛WINGS战队赛后采访
2016/06/29 DOTA
在Python的Flask框架中使用日期和时间的教程
2015/04/21 Python
python编程开发之类型转换convert实例分析
2015/11/13 Python
Python简单生成随机姓名的方法示例
2017/12/27 Python
使用pandas对矢量化数据进行替换处理的方法
2018/04/11 Python
python 通过类中一个方法获取另一个方法变量的实例
2019/01/22 Python
Pandas 重塑(stack)和轴向旋转(pivot)的实现
2019/07/22 Python
python中如何使用insert函数
2020/01/09 Python
使用 pytorch 创建神经网络拟合sin函数的实现
2020/02/24 Python
亚马逊西班牙购物网站:amazon西班牙
2017/03/06 全球购物
Halston Heritage官网:简洁的日装,稍显奢华的晚装
2018/11/20 全球购物
会计专业导师推荐信
2014/03/08 职场文书
聘任书模板
2014/03/29 职场文书
反洗钱宣传活动总结
2014/08/26 职场文书
邮政竞聘演讲稿
2014/09/03 职场文书
2015年教研员工作总结
2015/05/26 职场文书
幼儿园毕业典礼家长致辞
2015/07/29 职场文书
消防安全培训工作总结
2015/10/23 职场文书
MySQL完整性约束的定义与实例教程
2021/05/30 MySQL
PHP获取学生成绩的方法
2021/11/17 PHP