前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >『开发技巧』Python音频操作工具PyAudio上手教程

『开发技巧』Python音频操作工具PyAudio上手教程

作者头像
小宋是呢
发布2019-06-27 14:52:18
4.7K1
发布2019-06-27 14:52:18
举报
文章被收录于专栏:深度应用深度应用深度应用

『开发技巧』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/

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2019年06月26日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 『开发技巧』Python音频操作工具PyAudio上手教程
    • 0.引子
      • 1.简介
        • 2.安装
          • 3.示例
            • Reference:
        相关产品与服务
        命令行工具
        腾讯云命令行工具 TCCLI 是管理腾讯云资源的统一工具。使用腾讯云命令行工具,您可以快速调用腾讯云 API 来管理您的腾讯云资源。此外,您还可以基于腾讯云的命令行工具来做自动化和脚本处理,以更多样的方式进行组合和重用。
        领券
        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档