『开发技巧』Python音频操作工具PyAudio上手教程
『开发技巧』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
笔记:
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:
『开发技巧』Python音频操作工具PyAudio上手教程的更多相关文章
- 『开发技巧』Keras自定义对象(层、评价函数与损失)
1.自定义层 对于简单.无状态的自定义操作,你也许可以通过 layers.core.Lambda 层来实现.但是对于那些包含了可训练权重的自定义层,你应该自己实现这种层. 这是一个 Keras2.0 ...
- 『深度应用』一小时教你上手MaskRCNN·Keras开源实战(Windows&Linux)
0. 前言介绍 开源地址:https://github.com/matterport/Mask_RCNN 个人主页:http://www.yansongsong.cn/ MaskRCNN是何凯明基于以 ...
- 『开发技术』GPU训练加速原理(附KerasGPU训练技巧)
0.深入理解GPU训练加速原理 我们都知道用GPU可以加速神经神经网络训练(相较于CPU),具体的速度对比可以参看我之前写的速度对比博文: [深度应用]·主流深度学习硬件速度对比(CPU,GPU,TP ...
- 『开发技术』Windows极简安装使用face_recognition
face_recognition是一个强大.简单.易上手的人脸识别开源项目,并且配备了完整的开发文档和应用案例,特别是兼容树莓派系统.此项目是世界上最简洁的人脸识别库,你可以使用Python和命令行工 ...
- 『开发技术』Ubuntu与Windows如何查看CPU&GPU&内存占用量
0 序·简介 在使用Ubuntu或者Windows执行一些复杂数据运算时,需要关注下CPU.GPU以及内存占用量,如果数据运算超出了负荷,会产生难以预测的错误.本文将演示如何用简单地方式,实时监控Ub ...
- 『电脑技巧』破解Win7/Win8登录密码
Pic via baidu 0x 00 破解思路 用户的明文密码经过单向Hash加密生成Hash散列,Hash散列又被加密存放在系统盘\Windiws\System32\config文件下 要获得明文 ...
- 『电脑技巧』浅谈Win7的文件共享设置
随着移动存储设备的普及,很少有小伙伴喜欢使用局域网“文件共享”这一捷径了 而且自从XP之后,Windows系列主机共享设置貌似比较麻烦 虽然事实并不是看上去那样(Win7也很Easy的说 = =) 现 ...
- 『开发技术』Docker开发教程(一)安装与测试(Windows 家庭版)
0.前言 针对其他系统和版本,Docker都很容易安装,可以参考官方教程:https://docs.docker.com/docker-hub/ 由于Windows10家庭版无法安装docker,因此 ...
- Python中logging快速上手教程
本文使用得日志需要导入logging模块和logging.handlers模块,即 import logging import logging.handlers ''' author = " ...
随机推荐
- Django之模板过滤器
Django 模板过滤器也是我们在以后基于 Django 网站开发过程中会经常遇到的,如显示格式的转换.判断处理等.以下是 Django 过滤器列表,希望对为大家的开发带来一些方便. 一.形式:小写 ...
- How to use WinSCP with public key authentication
http://www.techrepublic.com/blog/it-security/how-to-use-winscp-with-public-key-authentication/ ...
- 【u003】计算概率
Time Limit: 1 second Memory Limit: 128 MB [问题描述] 小明有n个长度不一的小木棍,这些木棍的长度都是正整数.小明的父亲想和小明做一个游戏.他规定一个整数长度 ...
- Indy10 控件的使用(2)TidTCpServer组件学习
以下来自英文原版帮助文件,文桓英语不好,翻译了老半天.有错误的地方见谅,别骂我. TIdTCPServer = class(TIdComponent) Description TIdTCPServer ...
- 【t051】图书管理
Time Limit: 1 second Memory Limit: 128 MB [问题描述] 图书管理是一件十分繁杂的工作,在一个图书馆中每天都会有许多新书加入.为了更方便的管理图书(以便于帮助想 ...
- 面试无忧之Zookeeper总结心得
为什么需要分布式系统 l 单机系统已经无法满足业务需要 l 高性能硬件价格昂贵 分布式系统带来哪些问题 l 集群中节点数据一致性问题 l 集群产生分区 l 负载问题 l 幂等性问题 l 可用性问题 l ...
- <模拟电子学习1>Multisim 12.0 结构和仿真51最小的单芯片系统
周围环境: 系统环境: win7 64位置 软件平台:Multisim 12.0 目的: 刚毕业,可是模电知识也忘得差点儿相同了,加之自己想搞搞硬件设计.假设仅仅是看模电书.不实践,还是终觉浅.当做兴 ...
- 仿照Android的池化技术
/** * 仿照Android池化技术 * @author fgtian * */ public class ObjectCacheTest { public static class ObjectI ...
- CUDA一维纹理内存
纹理一词来源于GPU图形世界,GPU通用并行计算"盗用"了纹理一词,定义了一个纹理内存的概念.纹理内存缓存在 设备上,在某些情况下能减少对内存的请求并降低内存带宽的使用,是专门为那 ...
- lzugis——Arcgis Server for JavaScript API在自己的定义InfoWindow
你看到这个标题嫌烦.因为我最近一直与研究问题,相关文章使这些也可以只,同时要读我文章的朋友.我的文章能够给你带来帮助. 在相关的内部的前两篇文章,达到InfoWindow经div实现的东西,成Info ...