前言

今天开始进入近期系列文章的第一篇,如何用 Python 来实现录音功能。

在开始"造轮子"之前,个人一直强调一个观点,如果有些东西已经有了,不妨直接去 github 上搜,用现成的就好。关于这个想法,其实 github 上已经有人实现了。

但是有些细节点,和我想的不太一样。所以呢,我还是决定自己体验一波流程,顺便踩踩坑,毕竟是从兴趣出发。

而在上篇文章留言区中,有个小伙伴也提出,其实在去年,就已经用树莓派实现了这系列的功能,我觉得还是蛮有意思的一件事。

下面进入正题。

环境准备

开始之前,先要介绍的是今天的主角,PyAudio。

这款第三方库,是一个跨平台音频库。

跨平台的性质,不用多说了吧!就是多面兼容你的系统,不论你是用的 windows 、mac、linux,它都是支持的。

安装命令如下: pip install PyAudio

mac的同志们,需要注意下,安装的时候可能会报错,安装如下即可。

brew install portaudio

完备的第三方库都会有对应的文档,地址如下:

https://people.csail.mit.edu/hubert/pyaudio/docs/#pyaudio

录音功能实现

先来介绍一下,如何使用它来进行录制音频功能!

PS: 音频方面的东西,我之前也没过多了解,近期写了 PyAudio 库的代码实现后才发现,要想明白代码的含义,还要有一些音频方面的知识作为前置储蓄,所以下面我会结合代码去通俗讲解,若有哪里不对的地方,欢迎评论区留言指出!

先来看代码。

设定参数:

CHUNK = 1024  # 每个缓冲区的帧数FORMAT = pyaudio.paInt16  # 采样位数CHANNELS = 1  # 单声道RATE = 44100  # 采样频率

设定具体实现的参数,分别有 缓冲区帧数、采样位数、声道模式、采样频率。

具体实现录音代码:

def record_audio(wave_out_path, record_second):    """ 录音功能 """    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')  # 打开 wav 文件。    wf.setnchannels(CHANNELS)  # 声道设置    wf.setsampwidth(p.get_sample_size(FORMAT))  # 采样位数设置    wf.setframerate(RATE)  # 采样频率设置    for _ in range(0, int(RATE * record_second / CHUNK)):        data = stream.read(CHUNK)        wf.writeframes(data)  # 写入数据    stream.stop_stream()  # 关闭流    stream.close()    p.terminate()    wf.close()

先用正常代码逻辑思维解释下,其中涉及到的专业名词,继续往下看,后面会有相应的解释。

首先对 pyaudio 库进行实例化。用其生成的实例化对象对数据流进行相应的打开,也就是 open 函数。在这块,分别传入了参数,采样位数、声道、采样频率,以及最后的缓冲区帧数。

调用 Python 自带的 wave 库,再次进行写入 wav 的相关设置。此处的操作类似 Python 写 txt ,只不过多了点音频设置而已。

采样频率 * 音频秒数/ 每个缓冲区帧数 ,得到的就是你要写入多少个块缓冲区的数量。最终,只需要每次循环写入固定的 1024,一共循环得出的多少个块缓冲区。即可得到最终的数据。

这里的公式计算,如果在不了解下述基础概念之前,是很难理解的。

音频基础知识普及

看了上面的代码解释,是不是一脸懵逼。来普及下所涉及到的专业名词。

首先, wav 和 mp3 的后缀结尾,有什么不同?

其次,关键的名词解释。

采样位数:可以理解数字音频设备处理声音的解析度,即对声音的辨析度。就像表示颜色的位数一样(8位表示256种颜色,16位表示65536种颜色),有8位,16位等。这个数越大,解析度就越高,录制和回放的声音也就越真实。

采样频率:就是对声音信息1秒钟采样多少次,以记录成数字信息。如CD音频是44.1KHz采样率,它对声音以每秒44100次的频率来记录信息。原则上采样率越高,声音的质量越好。

截取了一段百度百科的例子,关于采样频率的设定,代码中选择的即 44100 Hz 。

每个缓冲区帧数:通俗的举个例子,你手里有 102400 块钱,现在要上交给女朋友。但是,你心想一口气全给她,怕撑爆了她的钱包。于是你定了一个值,每次只给她 1024 元。

这里的 1024 元即每个缓存区的帧数。你想全部上交,需要几次才能完成呢?是不是得重复上交这个动作 100 次!此时,这里的 100 次,便对应了上述代码的循环次数,即公式算出来的有多少个块缓存区

弄懂音频基础知识后,再去回看代码,你会发现那些参数的意义就一目了然了。

播放功能实现

有了以上知识点,对于读文件来说,就相当 easy 了!直接放上核心代码:

def play_audio(wave_input_path):    p = pyaudio.PyAudio()  # 实例化    wf = wave.open(wave_input_path, 'rb')  # 读 wav 文件    stream = p.open(format=p.get_format_from_width(wf.getsampwidth()),                    channels=wf.getnchannels(),                    rate=wf.getframerate(),                    output=True)    data = wf.readframes(CHUNK)  # 读数据    while len(data) > 0:        stream.write(data)        data = wf.readframes(CHUNK)    stream.stop_stream()  # 关闭资源    stream.close()    p.terminate()

读文件的话,没有什么可讲的,我是直接从官方文档的例子中 copy 的,修改了一下相应的参数,即可实现。

总结

总的来说,音频的操作,Python中的 PyAudio 库是非常友好的,当然,经过各种查阅资料,发现在写入音频文件时,不同人有不同的写法,而文中的这套公式算法,应该是较为简洁的一种。

老规矩,有想要本章全部源码的同学,后台回复 音频 ,即可获得地址。

文中关于音频的解释,哪里有错误,欢迎评论区留言指出!

python计算wav的语谱图_Python实现电脑录音(含音频基础知识讲解)相关推荐

  1. python录音详解_Python实现电脑录音(含音频基础知识讲解)

    咪哥杂谈 本篇阅读时间约为 6 分钟. 1 前言 今天开始进入近期系列文章的第一篇,如何用 Python 来实现录音功能. 在开始"造轮子"之前,个人一直强调一个观点,如果有些东西 ...

  2. python实现录音并去燥_Python实现电脑录音(含音频基础知识讲解)

    Python实现电脑录音(含音频基础知识讲解) 前言 今天开始进入近期系列文章的第一篇,如何用 Python 来实现录音功能. 在开始"造轮子"之前,个人一直强调一个观点,如果有些 ...

  3. python人像录制加声音_Python实现电脑录音(含音频基础知识讲解)

    Python实现电脑录音(含音频基础知识讲解) 前言 今天开始进入近期系列文章的第一篇,如何用 Python 来实现录音功能. 在开始"造轮子"之前,个人一直强调一个观点,如果有些 ...

  4. Python实现电脑录音(含音频基础知识讲解)

    咪哥杂谈 本篇阅读时间约为 6 分钟. 1 前言 今天开始进入近期系列文章的第一篇,如何用 Python 来实现录音功能. 在开始"造轮子"之前,个人一直强调一个观点,如果有些东西 ...

  5. python实现绘制信号序列语谱图

    python实现绘制信号序列语谱图 功能:绘制信号序列语谱图 代码: import numpy as np # 导入音频及绘图显示包 import librosa.display # 导入绘图工作的函 ...

  6. python语言可以处理数据文件吗_Python语言读取Marc后处理文件基础知识.pdf

    Python语言读取Marc后处理文件基础知识 基于 python 的焊接后处理 知识要点:  Python 语言  Python 模块功能  PyPost 后处理模块  PyPost 模块函 ...

  7. 【python数据挖掘课程】二十二.Basemap地图包安装入门及基础知识讲解

    这是<Python数据挖掘课程>系列文章,也是我上课内容及书籍中的一个案例.本文主要讲述Matplotlib子包,负责地图绘制,即Basemap扩展包.在做数据挖掘或可视化分析时,常常需要 ...

  8. python画图标题为蓝色_python绘制语谱图怎么设置成黄蓝色

    展开全部 语音的时域分析和频32313133353236313431303231363533e59b9ee7ad9431333431333937域分析是语音分析的两种重要方法,但是都存在着局限性.时域 ...

  9. python将批量音频信号(wav)转化为语谱图并保存(jpg/png)

    python将批量音频信号(wav)转化为语谱图并保存(jpg/png) 1. 导入需要的函数库 import numpy as np import wave import matplotlib.py ...

最新文章

  1. 自动禁止ssh的root登陆
  2. Design Pattern - Prototype(C#)
  3. WEBPACK 入门
  4. javascript变量提前声明
  5. C++ Primer 5th笔记(chap 16 模板和泛型编程)默认模板实参
  6. BZOJ 1432 [ZJOI2009]Function
  7. 【java】Windows7 下环境变量设置
  8. sql视图能使用触发器吗_冰箱买回家能立即使用吗 冰箱买回家要放多久能使用【详解】...
  9. Python PIL支持的图像文件格式
  10. HTML请选择编程,html – 设计选择标记
  11. 【word论文排版教程4】样式的应用
  12. python xy 2.7下载_pythonxy 安装
  13. Linux征途服务端启动,linux征途之系统开机流程
  14. MATLAB学习笔记之矩阵和数组1.1(mathematic)
  15. 计划扑克(Planning Poker)
  16. netty 通道接口定义
  17. JavaScript实现读秒按钮,按钮计时器,倒计时结束方可点击按钮(setInterval,clearInterval)
  18. matlab正负序分离模块,一种自适应宽频带正负序分离方法与流程
  19. 将matlab中工作去的数据保存为.mat文件
  20. 云计算年度点评2015-2016

热门文章

  1. EyeQ进展The Evolution of EyeQ
  2. 使用Runtime执行推理(C++)
  3. NSight Compute 用户手册(中)
  4. 情感分析:基于循环神经网络
  5. Mobileye 自动驾驶策略(一)
  6. 亿级商品详情页架构演进技术解密
  7. Android 自定义View (入门 篇) 的使用
  8. You must reset your password using ALTER USER statement before executing thi
  9. Educational Round 66 题解
  10. 2022-2028年中国车载充电机行业深度调研及投资前景预测报告