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中用于求最小值的min()方法
May 15 Python
简单讲解Python中的字符串与字符串的输入输出
Mar 13 Python
详解Python中表达式i += x与i = i + x是否等价
Feb 08 Python
Python set常用操作函数集锦
Nov 15 Python
Django 路由控制的实现代码
Nov 08 Python
pytorch多进程加速及代码优化方法
Aug 19 Python
python实现静态服务器
Sep 05 Python
python的slice notation的特殊用法详解
Dec 27 Python
基于Tensorflow批量数据的输入实现方式
Feb 05 Python
Python新手学习函数默认参数设置
Jun 03 Python
python工具快速为音视频自动生成字幕(使用说明)
Jan 27 Python
python读取excel数据并且画图的实现示例
Feb 08 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开发中的错误收集,不定期更新。
2011/02/03 PHP
Centos下升级php5.2到php5.4全记录(编译安装)
2015/04/03 PHP
SESSION存放在数据库用法实例
2015/08/08 PHP
php生成短网址/短链接原理和用法实例分析
2020/05/29 PHP
自定义的一个简单时尚js下拉选择框
2013/11/20 Javascript
js判断undefined类型,undefined,null, 的区别详细解析
2013/12/16 Javascript
深入理解JQuery中的事件与动画
2016/05/18 Javascript
angular分页指令操作
2017/01/09 Javascript
详解Vue生命周期的示例
2017/03/10 Javascript
Vue网页html转换PDF(最低兼容ie10)的思路详解
2017/08/24 Javascript
jQuery实现模拟搜索引擎的智能提示功能简单示例
2019/01/27 jQuery
json字符串对象转换代码实例
2019/09/28 Javascript
javascript读取本地文件和目录方法详解
2020/08/06 Javascript
[01:24:51]2014 DOTA2华西杯精英邀请赛 5 25 LGD VS NewBee第二场
2014/05/26 DOTA
Python yield使用方法示例
2013/12/04 Python
部署Python的框架下的web app的详细教程
2015/04/30 Python
Python基础学习之常见的内建函数整理
2017/09/06 Python
Python实现输出程序执行进度百分比的方法
2017/09/16 Python
python+flask实现API的方法
2018/11/21 Python
pyhanlp安装介绍和简单应用
2019/02/22 Python
python gensim使用word2vec词向量处理中文语料的方法
2019/07/05 Python
使用OpenCV获取图片连通域数量,并用不同颜色标记函
2020/06/04 Python
使用sklearn对多分类的每个类别进行指标评价操作
2020/06/11 Python
餐饮业的创业计划书范文
2013/12/26 职场文书
农民工工资承诺书范文
2014/03/31 职场文书
求职意向书
2014/04/01 职场文书
食品安全工作方案
2014/05/07 职场文书
办公室文员工作自我鉴定
2014/09/19 职场文书
高校师德师风自我剖析材料
2014/09/29 职场文书
2015毕业生实习工作总结
2014/12/12 职场文书
大学生个人学年总结
2015/02/15 职场文书
毕业感言怎么写
2015/07/31 职场文书
团结友爱主题班会
2015/08/13 职场文书
十大最强电系宝可梦,阿尔宙斯电系之一,第七被称为雷神
2022/03/18 日漫
python 离散点图画法的实现
2022/04/01 Python
cypress测试本地web应用
2022/06/01 Javascript