处理音频--pyaudio

    • 前言
    • 安装
    • 读写音频文件
      • play
      • record
      • wired
      • playcallback
      • Wirecallback
    • 外部应用
    • 总结

前言

很久之前写过一个将文本转成语音的,借助了一个名为pyttsx的库。具体使用可以参考下面的链接。

http://blog.csdn.net/marksinoberg/article/details/52137547

今天再来分享一个处理音频的博文。接住百度的语音接口,差不多可以方便的将音频转成文字了。

安装

安装的过程比较麻烦一点,不是说安装的步骤,而是找到能用的库不是很容易。

目标库: pyaudio。

但是奈何我的Python版本是36,而pip是安装不了的。找了很多资料,最后还是在pypi上找到了兼容的版本。

读写音频文件

官网上给了几个小例子,个人觉得不错。拿来分享一下。

play

"""PyAudio Example: Play a WAVE file."""

import pyaudio
import wave
import sys

CHUNK = 1024

if len(sys.argv) < 2:
    print("Plays a wave file.\n\nUsage: %s filename.wav" % sys.argv[0])
    sys.exit(-1)

wf = wave.open(sys.argv[1], ‘rb‘)

p = pyaudio.PyAudio()

stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),
                channels=wf.getnchannels(),
                rate=wf.getframerate(),
                output=True)

data = wf.readframes(CHUNK)

while data != ‘‘:
    stream.write(data)
    data = wf.readframes(CHUNK)

stream.stop_stream()
stream.close()

p.terminate()

保存为play.py

然后可以再terminal中来尝试一下。当然了,前提是先准备一个 .wav音频文件。

Python play.py 3.12.wav

然后不出意外的话,就可以听到电脑播放的音频了。

record

有了读的,那么再来个记录的吧。

"""PyAudio example: Record a few seconds of audio and save to a WAVE file."""

import pyaudio
import wave

CHUNK = 1024
FORMAT = pyaudio.paInt16
CHANNELS = 2
RATE = 44100
RECORD_SECONDS = 5
WAVE_OUTPUT_FILENAME = "output.wav"

p = pyaudio.PyAudio()

stream = p.open(format=FORMAT,
                channels=CHANNELS,
                rate=RATE,
                input=True,
                frames_per_buffer=CHUNK)

print("* recording")

frames = []

for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
    data = stream.read(CHUNK)
    frames.append(data)

print("* done recording")

stream.stop_stream()
stream.close()
p.terminate()

wf = wave.open(WAVE_OUTPUT_FILENAME, ‘wb‘)
wf.setnchannels(CHANNELS)
wf.setsampwidth(p.get_sample_size(FORMAT))
wf.setframerate(RATE)
wf.writeframes(b‘‘.join(frames))
wf.close()

保存为record.py

然后运行下面的命令。

Python record.py

代码中声明的是5秒的记录时长,这一点可以根据自己的需要来进行动态的修改。然后程序运行结束之后,就会在同一级目录下得到一个output.wav 的音频文件。

wired

刚才那俩小例子要么一个读,要么一个记录。那么要是既想读,然后再看下结果的需求呢?可以这么来实现。

"""
PyAudio Example: Make a wire between input and output (i.e., record a
few samples and play them back immediately).
"""

import pyaudio

CHUNK = 1024
WIDTH = 2
CHANNELS = 2
RATE = 44100
RECORD_SECONDS = 5

p = pyaudio.PyAudio()

stream = p.open(format=p.get_format_from_width(WIDTH),
                channels=CHANNELS,
                rate=RATE,
                input=True,
                output=True,
                frames_per_buffer=CHUNK)

print("* recording")

for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
    data = stream.read(CHUNK)
    stream.write(data, CHUNK)

print("* done")

stream.stop_stream()
stream.close()

p.terminate()

保存为wire.py

然后运行下面的命令

Python wire.py

就可以记录一个5秒的实现了。

play(callback)

搞定了上面三个小例子,做出自己的东西也不是什么难事了。基本上可以满足自己的需求。但是官网上还给了更加优雅的方式,那就是使用回调函数。除此之外很重要的一点就是callback方式是noblocking的。

官网的api解释如下:

Note that in “blocking mode”, each pyaudio.Stream.write() or pyaudio.Stream.read() blocks until all the given/requested frames have been played/recorded. Alternatively, to generate audio data on the fly or immediately process recorded audio data, use the “callback mode” outlined below.
"""
PyAudio Example: Make a wire between input and output (i.e., record a
few samples and play them back immediately).
"""

import pyaudio

CHUNK = 1024
WIDTH = 2
CHANNELS = 2
RATE = 44100
RECORD_SECONDS = 5

p = pyaudio.PyAudio()

stream = p.open(format=p.get_format_from_width(WIDTH),
                channels=CHANNELS,
                rate=RATE,
                input=True,
                output=True,
                frames_per_buffer=CHUNK)

print("* recording")

for i in range(0, int(RATE / CHUNK * RECORD_SECONDS)):
    data = stream.read(CHUNK)
    stream.write(data, CHUNK)

print("* done")

stream.stop_stream()
stream.close()

p.terminate()

其实也没啥特殊的地方了,就是代码看起来更加精简了。

Wire(callback)

"""
PyAudio Example: Make a wire between input and output (i.e., record a
few samples and play them back immediately).

This is the callback (non-blocking) version.
"""

import pyaudio
import time

WIDTH = 2
CHANNELS = 2
RATE = 44100

p = pyaudio.PyAudio()

def callback(in_data, frame_count, time_info, status):
    return (in_data, pyaudio.paContinue)

stream = p.open(format=p.get_format_from_width(WIDTH),
                channels=CHANNELS,
                rate=RATE,
                input=True,
                output=True,
                stream_callback=callback)

stream.start_stream()

while stream.is_active():
    time.sleep(0.1)

stream.stop_stream()
stream.close()

p.terminate()
License

外部应用

下面拿一个小例子入手,实时的测试一下音频转文字。因为本人没有百度语音服务的权限,所以在网上搜索了一个key。在这里感谢下面的这个链接。

https://github.com/luyishisi/python_yuyinduihua

话不多说, 上例子吧。

# coding: utf8

# @Author: 郭 璞
# @File: baiduyuyinshibie.py
# @Time: 2017/5/10
# @Contact: [email protected]
# @blog: http://blog.csdn.net/marksinoberg
# @Description: 百度语音识别接口调用
import wave
import requests
import json

def get_token():
    apiKey = "。。。GBOtpg22ZSGAU"
    secretKey = "44。。。e34936227d4a19dc2"

    auth_url = "https://openapi.baidu.com/oauth/2.0/token?grant_type=client_credentials&client_id=" + apiKey + "&client_secret=" + secretKey
    response = requests.get(url=auth_url)
    jsondata = response.text
    return json.loads(jsondata)[‘access_token‘]

def use_cloud(token, wavefile):
    fp = wave.open(wavefile, ‘rb‘)
    # 已经录好音的音频片段内容
    nframes = fp.getnframes()
    filelength = nframes*2
    audiodata = fp.readframes(nframes)

    # 百度语音接口的产品ID
    cuid = ‘71XXXX663‘
    server_url = ‘http://vop.baidu.com/server_api‘ + ‘?cuid={}&token={}‘.format(cuid, token)
    headers = {
        ‘Content-Type‘: ‘audio/pcm; rete=8000‘,
        ‘Content-Length‘: ‘{}‘.format(filelength),
    }

    response = requests.post(url=server_url, headers=headers, data=audiodata)
    return response.text if response.status_code==200 else ‘Something Wrong!‘

if __name__ == ‘__main__‘:
    access_token = get_token()
    print(access_token)
    result = use_cloud(token=access_token, wavefile=‘./output.wav‘)
    print(result)

音频文件借助了上面第二个例子中录制的音频。

我说的话是: 345
# 由于在图书馆,所以不敢太大声,要是用标准的普通话,相信准确度可能会更高一点。

然后运行的结果就是下面这样的了。

可以看出请求成功,返回的结果里面包含了相应的文本内容。虽然不是很准确,但是也还算可以吧。

总结

最后来总结一下,今天貌似净拿人家的东西了,虽然自己整合了一下。但是还远远不够啊。其实结合这个语音接口可以做出很多更加好玩的功能的。



参考链接:

聊天机器人

GitHub机器人聊天参考源码

pyaudio官方文档

pyaudio官网

PyPI宝库

时间: 2024-10-14 08:32:28

处理音频--pyaudio的相关文章

痞子衡嵌入式:语音处理工具pzh-speech诞生记(4)- 音频录播实现(PyAudio)

大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是语音处理工具pzh-py-speech诞生之音频录播实现. 音频录播是pzh-py-speech的主要功能,pzh-py-speech借助的是Python自带wave库以及第三方PyAudio库来实现的音频播放和录制功能,今天痞子衡为大家介绍音频录播在pzh-py-speech中是如何实现的. 一.wave简介 wave是python标准库,其可以实现wav音频文件的读写,并且能解析wav音频的参数.pzh-py-speech借助w

使用PYaudio录制音频和视频(自己)

参考:https://blog.csdn.net/zhaoyun_zzz/article/details/84341801 音频录制:简洁版 import pyaudioimport waveimport timeimport sys CHUNK = 1024FORMAT = pyaudio.paInt16CHANNELS = 2RATE = 44100RECORD_SECONDS = 5000WAVE_OUTPUT_FILENAME = "output.wav" p = pyaudi

Python 调用pyaudio库录制以及播放wav音频文件

1.Pyaudio简介 PyAudio 是语音处理的 Python 库,提供了比较丰富的功能. 2.功能 python的Pyaud模块可以调用电脑的麦克风或音响进行录音,音频播放,生成wav文件等. wave是录音是用的标准的WINDOWS文件格式,扩展名为WAV,数据本身的格式为PCM或压缩型,属于无损音乐格式的一种. 3.Pyaudio安装 pip install pyaudio 推荐使用清华源哦,速度快 pip install pyaudio -i https://pypi.tuna.ts

python音频处理相关类库

一.eyeD3 以下是eyed3的官方介绍 eyeD3 is a Python tool for working with audio files, specifically mp3 files containing ID3 metadata (i.e. song info). It provides a command-line tool (eyeD3) and a Python library (import eyed3) that can be used to write your own

python音频处理用到的操作

作者:桂. 时间:2017-05-03  12:18:46 链接:http://www.cnblogs.com/xingshansi/p/6799994.html 前言 本文主要记录python下音频常用的操作,以.wav格式文件为例.其实网上有很多现成的音频工具包,如果仅仅调用,工具包是更方便的. 1.批量读取.wav文件名: import os filepath = "./data/" #添加路径 filename= os.listdir(filepath) #得到文件夹下的所有文

python的音频处理库

本文和大家分享的主要是python开发中常用的几个音频处理库,一起来看看吧,希望对大家有所帮助. 一.eyeD3 直接在google上搜索python mp3 process ,推荐比较多的就是这个第三方库了.先来看看官方介绍吧. 简单来说,eyeD3 这个库只要是用来处理MP3文件的,特别是带ID3 metadata的文件(一般MP3文件都会带有一些额外信息, 比如说歌手.专辑 之类的,后面会说怎么提取这些信息).eyeD3 提供了两种使用方法,一种是使用command line 直接在命令行

用pyaudio做一个声控打开浏览器的小程序

声控打开浏览器思路很简单:通过麦克风录音产生一个音频文件-->通过调用百度大脑的api识别音频文件中的语音并返回字符串-->通过对字符串的处理使浏览器做出反应 通过麦克风录音并产生wav文件: CHUNK = 1024 FORMAT = pyaudio.paInt16 RATE = 8000 //一般8000的采样率能识别出人说的话 CHANNELS = 1 record_second = 5 //先设定好几个重要的待处理参数 def record_wav(to_dir=None): if t

介绍几个python的音频处理库

一.eyeD3 直接在google上搜索python mp3 process ,推荐比较多的就是这个第三方库了.先来看看官方介绍吧. About eyeD3 is a Python tool for working with audio files, specifically mp3 files containing ID3 metadata (i.e. song info). It provides a command-line tool (eyeD3) and a Python librar

[python] 2、python使用pyaudio进行录音,及其在python虚拟环境virtualenv中安装遇到的问题

1.pyaudio安装大背景 最近在做智能音箱,需要编写声音拾取代码,我先是百度两篇比较常见的用python进行录音的操作的文章: python写一个录音小程序:http://blog.csdn.net/yexiaohhjk/article/details/73132562 利用百度语言识别API实现语音识别python:http://blog.csdn.net/yexiaohhjk/article/details/73134815 发现需要用到pyaudio,然后在其官网找到如何安装:http