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:
1
2
|
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模块,可以方便显示出来读取过程,如下:
1
2
3
|
* recording
100 % |██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 172 / 172 [ 00 : 03 < 00 : 00 , 43.40it / s]
* done recording
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
|
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,显示播放进度条,如下:
1
|
100 % |██████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████████| 172 / 172 [ 00 : 03 < 00 : 00 , 43.40it / s]
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
"""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).以回调方式播放音频
当需要在执行其他程序时同时播放音频,可以使用回调的方式播放,示例代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
|
"""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上手教程详解,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对服务器之家网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!
原文链接:https://www.cnblogs.com/xiaosongshine/p/11088358.html