Python音频操作工具PyAudio上手教程详解


Posted in Python onJune 26, 2019

Python音频操作工具PyAudio上手教程详解

0.引子

当需要使用Python处理音频数据时,使用python读取与播放声音必不可少,下面介绍一个好用的处理音频PyAudio工具包。

PyAudio是Python开源工具包,由名思义,是提供对语音操作的工具包。提供录音播放处理等功能,可以视作语音领域的OpenCv。

1.简介

PyAudio为跨平台音频I / O库 PortAudio 提供 Python 绑定。使用PyAudio,您可以轻松地使用Python在各种平台上播放和录制音频,例如GNU / Linux,Microsoft Windows和Apple Mac OS X / macOS。

PyAudio的灵感来自:

  • pyPortAudio / fastaudio :PortAudio  v18  API的Python绑定。
  •  tkSnack :Tcl / Tk和Python的跨平台声音工具包。

2.安装

目前的版本是 PyAudio v0.2.11 。在大多数平台上使用pip安装PyAudio。对于v0.2.9之前的版本,PyAudio分发安装二进制文件,这些文件 存档在这里 。

微软Windows

使用 pip 安装:

python -m pip install pyaudio

笔记:

  • 如果pip尚未与您的Python安装捆绑在一起,请 在此处 获取 。
  • pip将获取并安装PyAudio轮(预先打包的二进制文件)。目前,有车轮兼容Python 2.7,3.4,3.5和3.6 的 官方发行版 。对于这些版本,可以使用32位和64位车轮。
  • 这些二进制文件包括使用MinGW构建的PortAudio v19 v190600_20161030。它们仅支持Windows MME API, 包括对DirectX,ASIO等的支持。如果需要支持未包含的API,则需要编译PortAudio和PyAudio。 Apple Mac OS X.

使用 Homebrew 安装必备的portaudio库,然后使用pip安装PyAudio:

brew install portaudio 
pip install pyaudio

笔记:

  • 如果尚未安装,请下载  Homebrew 。
  • pip将下载PyAudio源代码并为您的Python版本构建它。
  • Homebrew和构建PyAudio还需要安装Xcode命令行工具( 更多信息 )。

Debian / Ubuntu

使用包管理器安装PyAudio:

sudo apt-get install python-pyaudio python3-pyaudio

如果没有最新版本的PyAudio,请使用pip安装它:

pip install pyaudio

笔记:

  • pip将下载PyAudio源并为您的系统构建它。请务必事先安装portaudio库开发包( portaudio19-dev )和python开发包( python-all-dev )。
  • 为了更好地隔离系统包,请考虑在virtualenv中 安装PyAudio 。

 PyAudio来源

源代码可从Python Package Index(PyPI)下载: pypi.python.org/pypi/PyAudio 。

或克隆git存储库:

git clone  https://people.csail.mit.edu/hubert/git/pyaudio.git

要从源代码构建PyAudio,您还需要构建 PortAudio v19 。有关为各种平台构建PyAudio的一些说明,请参阅 编译提示 。要使用Microsoft Visual Studio构建PyAudio,请查看Sebastian Audet的 说明 。

3.示例

1).采集音频

下面以一段代码演示如何从计算机麦克风采集一段音频,采集音频时长 4s,保存文件 output.wav

使用了tqdm模块,可以方便显示出来读取过程,如下:

* recording
100%|??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????| 172/172 [00:03<00:00, 43.40it/s] 
* done recording
import pyaudio
import wave
from tqdm import tqdm
def record_audio(wave_out_path,record_second):
  CHUNK = 1024
  FORMAT = pyaudio.paInt16
  CHANNELS = 2
  RATE = 44100
  p = pyaudio.PyAudio()
  stream = p.open(format=FORMAT,
          channels=CHANNELS,
          rate=RATE,
          input=True,
          frames_per_buffer=CHUNK)
  wf = wave.open(wave_out_path, 'wb')
  wf.setnchannels(CHANNELS)
  wf.setsampwidth(p.get_sample_size(FORMAT))
  wf.setframerate(RATE)
  print("* recording")
  for i in tqdm(range(0, int(RATE / CHUNK * record_second))):
    data = stream.read(CHUNK)
    wf.writeframes(data)
  print("* done recording")
  stream.stop_stream()
  stream.close()
  p.terminate()
  wf.close()
record_audio("output.wav",record_second=4)

要使用PyAudio,首先使用 pyaudio.PyAudio()

(1)实例化PyAudio ,它设置portaudio系统。

要录制或播放音频,请使用 pyaudio.PyAudio.open()

(2)在所需设备上打开所需音频参数的流。这设置了 pyaudio.Stream 播放或录制音频。

通过使用流式传输 pyaudio.Stream.write() 音频数据或使用流式传输音频数据来播放音频  pyaudio.Stream.read()

(3)请注意,在“阻止模式”中,每个 pyaudio.Stream.write() 或  pyaudio.Stream.read() 阻止直到所有给定/请求的帧都被播放/记录。或者,要动态生成音频数据或立即处理录制的音频数据,请使用下面概述的“回调模式”。

使用 pyaudio.Stream.stop_stream() 暂停播放/录制,并 pyaudio.Stream.close() 终止流。(4)

最后,使用 pyaudio.PyAudio.terminate() (5)终止portaudio会话

2).播放音频

下面使用播放的功能来播放1)中保存的音频 output.wav

通过tqdm,显示播放进度条,如下:

100%|??????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????????| 172/172 [00:03<00:00, 43.40it/s]
"""PyAudio Example: Play a WAVE file."""
import pyaudio
import wave
from tqdm import tqdm
def play_audio(wave_path):
  CHUNK = 1024
  wf = wave.open(wave_path, 'rb')
  # instantiate PyAudio (1)
  p = pyaudio.PyAudio()
  # open stream (2)
  stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
          channels=wf.getnchannels(),
          rate=wf.getframerate(),
          output=True)
  # read data
  data = wf.readframes(CHUNK)
  # play stream (3)
  datas = []
  while len(data) > 0:
    data = wf.readframes(CHUNK)
    datas.append(data)
  for d in tqdm(datas):
    stream.write(d)
  # stop stream (4)
  stream.stop_stream()
  stream.close()
  # close PyAudio (5)
  p.terminate()
play_audio("output.wav")

2).以回调方式播放音频

当需要在执行其他程序时同时播放音频,可以使用回调的方式播放,示例代码如下:

"""PyAudio Example: Play a WAVE file."""
import pyaudio
import wave
from tqdm import tqdm
import time
def play_audio_callback(wave_path):
  CHUNK = 1024
  wf = wave.open(wave_path, 'rb')
  # instantiate PyAudio (1)
  p = pyaudio.PyAudio()
  def callback(in_data, frame_count, time_info, status):
    data = wf.readframes(frame_count)
    return (data, pyaudio.paContinue)
  # open stream (2)
  stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
          channels=wf.getnchannels(),
          rate=wf.getframerate(),
          output=True,
          stream_callback=callback)
  # read data
  stream.start_stream()
  while stream.is_active():
    time.sleep(0.1)
  # stop stream (4)
  stream.stop_stream()
  stream.close()
  # close PyAudio (5)
  p.terminate()
play_audio_callback("output.wav")

Reference:

1. http://people.csail.mit.edu/hubert/pyaudio/

总结

以上所述是小编给大家介绍的Python音频操作工具PyAudio上手教程详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
Python socket编程实例详解
May 27 Python
python 安装virtualenv和virtualenvwrapper的方法
Jan 13 Python
Python数据结构与算法之完全树与最小堆实例
Dec 13 Python
Python中作用域的深入讲解
Dec 10 Python
利用Python模拟登录pastebin.com的实现方法
Jul 12 Python
Python GUI学习之登录系统界面篇
Aug 21 Python
详解Django CAS 解决方案
Oct 30 Python
在jupyter notebook中调用.ipynb文件方式
Apr 14 Python
python + selenium 刷B站播放量的实例代码
Jun 12 Python
解决keras backend 越跑越慢问题
Jun 18 Python
如何快速一次性卸载所有python包(第三方库)呢
Oct 20 Python
详解win10下pytorch-gpu安装以及CUDA详细安装过程
Jan 28 Python
python3中类的继承以及self和super的区别详解
Jun 26 #Python
对Python中class和instance以及self的用法详解
Jun 26 #Python
Python中的支持向量机SVM的使用(附实例代码)
Jun 26 #Python
对python 中class与变量的使用方法详解
Jun 26 #Python
python 机器学习之支持向量机非线性回归SVR模型
Jun 26 #Python
python机器学习库scikit-learn:SVR的基本应用
Jun 26 #Python
Python Numpy 实现交换两行和两列的方法
Jun 26 #Python
You might like
PHP 服务器配置(使用Apache及IIS两种方法)
2009/06/01 PHP
php+mysql查询优化简单实例
2015/01/13 PHP
php  PATH_SEPARATOR判断当前服务器系统类型实例
2016/10/28 PHP
php使用lua+redis实现限流,计数器模式,令牌桶模式
2019/04/04 PHP
Thinkphp 框架扩展之数据库驱动常用方法小结
2020/04/23 PHP
PHP语言对接抖音快手小红书视频/图片去水印API接口源码
2020/08/11 PHP
一些常用的Javascript函数
2006/12/22 Javascript
js获得鼠标的坐标值的方法
2013/03/13 Javascript
用jQuery与JSONP轻松解决跨域访问的问题
2014/02/04 Javascript
JavaScript获取当前网页最后修改时间的方法
2015/04/03 Javascript
javaScript中with函数用法实例分析
2015/06/08 Javascript
基于JQuery实现图片轮播效果(焦点图)
2016/02/02 Javascript
bootstrap输入框组代码分享
2016/06/07 Javascript
bootstrap与Jquery UI 按钮样式冲突的解决办法
2016/09/23 Javascript
微信公众号  提示:Unauthorized API function 问题解决方法
2016/12/05 Javascript
浅谈vue2 单页面如何设置网页title
2017/11/08 Javascript
使用Jenkins部署React项目的方法步骤
2019/03/11 Javascript
vue实现放大镜效果
2020/09/17 Javascript
[11:12]2018DOTA2国际邀请赛寻真——绿色长城OpTic
2018/08/10 DOTA
如何在Python中编写并发程序
2016/02/27 Python
整理Python 常用string函数(收藏)
2016/05/30 Python
python中redis的安装和使用
2016/12/04 Python
浅谈机器学习需要的了解的十大算法
2017/12/15 Python
pygame编写音乐播放器的实现代码示例
2019/11/19 Python
浅谈opencv自动光学检测、目标分割和检测(连通区域和findContours)
2020/06/04 Python
AmazeUI底部导航栏与分享按钮的示例代码
2020/08/18 HTML / CSS
劳力士官方珠宝商:J.R. Dunn Jewelers
2018/09/29 全球购物
Nisbets法国:英国最大的厨房和餐饮设备供应商
2019/03/18 全球购物
法国包包和行李箱销售网站:Bagage24.fr
2020/03/24 全球购物
工作评语大全
2014/04/26 职场文书
2014国庆节餐厅促销活动策划方案
2014/09/16 职场文书
贫民窟的百万富翁观后感
2015/06/09 职场文书
幼儿教师继续教育培训心得体会
2016/01/19 职场文书
2016年乡镇七一建党节活动总结
2016/04/05 职场文书
mysql下的max_allowed_packet参数设置详解
2022/02/12 MySQL
python DataFrame中stack()方法、unstack()方法和pivot()方法浅析
2022/04/06 Python