『开发技巧』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的灵感来自:

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上手教程的更多相关文章

  1. 『开发技巧』Keras自定义对象(层、评价函数与损失)

    1.自定义层 对于简单.无状态的自定义操作,你也许可以通过 layers.core.Lambda 层来实现.但是对于那些包含了可训练权重的自定义层,你应该自己实现这种层. 这是一个 Keras2.0  ...

  2. 『深度应用』一小时教你上手MaskRCNN·Keras开源实战(Windows&Linux)

    0. 前言介绍 开源地址:https://github.com/matterport/Mask_RCNN 个人主页:http://www.yansongsong.cn/ MaskRCNN是何凯明基于以 ...

  3. 『开发技术』GPU训练加速原理(附KerasGPU训练技巧)

    0.深入理解GPU训练加速原理 我们都知道用GPU可以加速神经神经网络训练(相较于CPU),具体的速度对比可以参看我之前写的速度对比博文: [深度应用]·主流深度学习硬件速度对比(CPU,GPU,TP ...

  4. 『开发技术』Windows极简安装使用face_recognition

    face_recognition是一个强大.简单.易上手的人脸识别开源项目,并且配备了完整的开发文档和应用案例,特别是兼容树莓派系统.此项目是世界上最简洁的人脸识别库,你可以使用Python和命令行工 ...

  5. 『开发技术』Ubuntu与Windows如何查看CPU&GPU&内存占用量

    0 序·简介 在使用Ubuntu或者Windows执行一些复杂数据运算时,需要关注下CPU.GPU以及内存占用量,如果数据运算超出了负荷,会产生难以预测的错误.本文将演示如何用简单地方式,实时监控Ub ...

  6. 『电脑技巧』破解Win7/Win8登录密码

    Pic via baidu 0x 00 破解思路 用户的明文密码经过单向Hash加密生成Hash散列,Hash散列又被加密存放在系统盘\Windiws\System32\config文件下 要获得明文 ...

  7. 『电脑技巧』浅谈Win7的文件共享设置

    随着移动存储设备的普及,很少有小伙伴喜欢使用局域网“文件共享”这一捷径了 而且自从XP之后,Windows系列主机共享设置貌似比较麻烦 虽然事实并不是看上去那样(Win7也很Easy的说 = =) 现 ...

  8. 『开发技术』Docker开发教程(一)安装与测试(Windows 家庭版)

    0.前言 针对其他系统和版本,Docker都很容易安装,可以参考官方教程:https://docs.docker.com/docker-hub/ 由于Windows10家庭版无法安装docker,因此 ...

  9. Python中logging快速上手教程

    本文使用得日志需要导入logging模块和logging.handlers模块,即 import logging import logging.handlers ''' author = " ...

随机推荐

  1. js进阶 11-9/10/11 jquery创建和插入节点

    js进阶 11-9/10/11 jquery创建和插入节点 一.总结 一句话总结: 1.jquery插入节点8个方法? 内部之前,内部之后,之前,之后:各两个 append()和appendTo() ...

  2. xv6 gdb

    The "remote" target does not support "run". https://sourceware.org/gdb/onlinedoc ...

  3. 【hdu 2955】Robberies

    Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Submission(s) ...

  4. C语言递归实现二叉树的先序、中序、后序遍历

    #include <stdio.h> #include <stdlib.h> //*****二叉树的二叉链表存储表示*****// typedef struct BiNode ...

  5. 【codeforces 546A】Soldier and Bananas

    time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...

  6. python3 numpy API练习代码

    # -*- coding: utf-8 -*- import numpy as np; a=np.array([1,2,3,4,5,6]); print("数组是:",a) #数组 ...

  7. scala 主从构造器

    package cn.scala_base.oop.scalaclass /** * 构造器分为两种,一种是主构造器,另一种是从构造器,所有的从构造器必须在其方法体 * 的第一行调用主构造器 * * ...

  8. 【严肃脸】使用caffe实现色情图片的识别

    前言 前几天看到了雅虎开源了一个色情图片的识别模型新闻,上Github一看,是基于caffe的.试了试,模型效果很赞.Github地址:https://github.com/yahoo/open_ns ...

  9. js中的apply与call的用法与区别

    call 和 apply 都是为了改变某个函数运行时的 context 即上下文而存在的,换句话说,就是为了改变函数体内部 this 的指向.call 和 apply二者的作用完全一样,只是接受参数的 ...

  10. In partitioned databases, trading some consistency for availability can lead to dramatic improvements in scalability.

    In partitioned databases, trading some consistency for availability can lead to dramatic improvement ...