一款非常不错的音频录制播放Python库

声音无处不在,在计算机应用中也是。Python拥有丰富的库来处理声音,sounddevice就是其中一个非常实用的库。本文将介绍sounddevice库的特点、工作原理以及使用方式,帮助你大家理解和运用这个库。

简介

sounddevice是一个Python库,用于播放和录制音频。它提供了一个简单的接口,使得在Python中处理音频数据变得更简单和容易。sounddevice库基于PortAudio库,支持多种音频接口和设备,可以在多种操作系统上运行,包括Windows和macOS。

特点

sounddevice库具有以下特点:

  • 简单易用:sounddevice提供了简洁的API,使得在Python中播放和录制音频变得非常简单。

  • 支持多种音频设备:sounddevice支持多种音频接口和设备,可以轻松地选择和切换不同的音频设备。

  • 实时音频处理:sounddevice支持实时音频处理,可以实时地播放和录制音频数据,方便进行实时的音频处理和分析。

工作原理

sounddevice库的工作原理主要基于PortAudio库。PortAudio是一个跨平台的音频I/O库,它提供了一致的API,使得在不同的平台上进行音频处理变得非常容易。sounddevice库通过调用PortAudio库的API,实现了在Python中播放和录制音频的功能。

当使用sounddevice库播放音频时,首先需要将音频数据加载到内存中,然后通过sounddevice库提供的函数将音频数据发送给PortAudio库,最后由PortAudio库将音频数据发送给音频设备进行播放。

当使用sounddevice库录制音频时,首先需要指定音频设备的采样率、通道数等参数,然后通过sounddevice库提供的函数从音频设备获取音频数据,最后将获取到的音频数据保存到文件中或者进行进一步的处理。

安装

安装sounddevice库非常简单,只需要使用pip命令即可:

pip install sounddevice

这会自动下载并安装sounddevice库以及其依赖的库。

如何使用

下面将通过一些示例来介绍如何使用sounddevice库。

播放音频

首先,我们来学习如何使用sounddevice库播放音频。以下代码示例展示了如何播放一个音频文件:

import sounddevice as sd
import numpy as np
# 导入soundfile库用于读取音频文件
import soundfile as sf

# 加载音频数据
# 使用soundfile库的read函数读取音频文件 'audio_file.wav'
# data变量存储音频数据,fs变量存储采样率
data, fs = sf.read('audio_file.wav')

# 播放音频
# 使用sounddevice库的play函数播放音频数据
# data参数为要播放的音频数据,fs参数为音频数据的采样率
sd.play(data, fs)

# 等待播放完成
# 使用sounddevice库的wait函数等待音频播放完成
sd.wait()
在这个示例中,我们首先使用sf.read()函数加载音频文件,然后使用sd.play()函数播放音频,最后使用sd.wait()函数等待播放完成。

录制音频

接下来,我们来学习如何使用sounddevice库录制音频。以下代码示例展示了如何录制一段音频:

import sounddevice as sd
import numpy as np

# 设置录制参数
# fs表示采样率,即每秒采集的样本点数
fs = 44100  # 采样率为44100Hz,通常为CD音质
# duration表示录制音频的时长,单位为秒
duration = 5  # 录制时长为5秒

# 开始录制
# 打印提示信息,通知用户录制即将开始
print('开始录制')
# 调用sd.rec函数开始录制音频
# int(duration * fs)计算需要录制的样本点总数
# samplerate=fs指定采样率为fs
# channels=2指定录制通道数为2,即立体声
recording = sd.rec(int(duration * fs), samplerate=fs, channels=2)

# sd.wait()等待录制完成
sd.wait()

# 保存录制到的音频数据
# 使用numpy的save函数将录制到的音频数据保存到文件中
# 'recording.npy'是保存文件的名称,recording是包含音频数据的numpy数组
np.save('recording.npy', recording)

在这个示例中,我们首先设置了录制参数,包括采样率和录制时长,然后使用sd.rec()函数开始录制,最后使用np.save()函数保存录制到的音频数据。

其他示例

除了播放和录制音频,sounddevice库还提供了其他一些实用的功能。以下是一些其他示例:

获取音频设备信息

import sounddevice as sd

# 获取音频设备信息
# 使用sounddevice库的query_devices函数查询音频设备信息
# info变量存储查询到的音频设备信息
info = sd.query_devices()

# 打印音频设备信息
# 将查询到的音频设备信息打印到控制台
# 信息包括设备索引、名称、主机API、最大输出和输入通道数等
print(info)


实时音频处理

import sounddevice as sd
import numpy as np

# 定义回调函数
# 回调函数在音频流处理音频数据时被调用
def callback(indata, outdata, frames, time, status):
    # 如果有状态信息,则打印出来
    if status:
        print(status)
    # 将输入数据复制到输出数据
    # 这里的操作实现了简单的音频回环,即直接将输入的音频数据输出
    outdata[:] = indata

# 创建一个音频流
# channels=2指定音频流的通道数为2,即立体声
# callback=callback指定音频流的回调函数为上面定义的callback函数
with sd.Stream(channels=2, callback=callback):
    # sd.sleep(10000)让程序在音频流开启的情况下运行10000毫秒
    sd.sleep(10000)

在这个示例中,我们定义了一个回调函数callback(),该函数会实时地处理音频数据。然后使用sd.Stream()函数创建一个音频流,将回调函数作为参数传递给音频流,最后使用sd.sleep()函数让程序运行一段时间。在这段时间内,音频流会不断地调用回调函数处理音频数据。

高级用法

sounddevice库还提供了一些高级功能,如同步播放和录制、音频数据同步、自定义回调函数等。以下是一些高级用法的示例:

同步播放和录制

import sounddevice as sd
import numpy as np

# 设置采样率和录制时长
fs = 44100  # 采样率,通常为CD音质的44100Hz
duration = 5  # 录制时长,单位为秒

# 创建一个同步的音频流
# samplerate=fs指定采样率为fs
# channels=2指定音频流的通道数为2,即立体声
stream = sd.Stream(samplerate=fs, channels=2)

# 打开音频流
# 准备好音频设备进行数据交换
stream.start()

# 播放和录制
# 打印提示信息,通知用户即将开始播放和录制
print('开始播放和录制')
# 创建随机噪声作为输入数据,用于播放
input_data = np.random.randn(int(duration * fs), 2)
# 创建一个全零数组,用于存储录制到的音频数据
output_data = np.zeros((int(duration * fs), 2))
# 将输入数据写入音频流,进行播放
stream.write(input_data)
# 从音频流读取数据,进行录制
stream.read(output_data)

# 停止音频流
# 停止音频流的数据交换
stream.stop()
# 关闭音频流,释放资源
stream.close()

# 保存录制到的音频数据
# 使用numpy的save函数将录制到的音频数据保存到文件中
# 'sync_recording.npy'是保存文件的名称,output_data是包含音频数据的numpy数组
np.save('sync_recording.npy', output_data)


在这个示例中,我们创建了一个同步的音频流,然后使用stream.write()函数播放音频,使用stream.read()函数录制音频。最后,我们关闭音频流并保存录制到的音频数据。

自定义回调函数

import sounddevice as sd
import numpy as np

# 定义自定义回调函数
# 回调函数在音频流处理音频数据时被调用
def custom_callback(indata, outdata, frames, time, status):
    # 如果有状态信息,则打印出来
    if status:
        print(status)
    # 对输入的音频数据进行处理
    # 将音量减半,通过将indata数组中的每个元素乘以0.5来实现
    processed_data = indata * 0.5
    # 将处理后的音频数据输出
    # 将处理后的音频数据赋值给outdata数组
    outdata[:] = processed_data

# 创建一个音频流
# channels=2指定音频流的通道数为2,即立体声
# callback=custom_callback指定音频流的回调函数为上面定义的custom_callback函数
with sd.Stream(channels=2, callback=custom_callback):
    # sd.sleep(10000)让程序在音频流开启的情况下运行10000毫秒
    sd.sleep(10000)
在这个示例中,我们自定义了一个回调函数custom_callback(),该函数对输入的音频数据进行处理,然后将处理后的音频数据输出。我们使用sd.Stream()函数创建一个音频流,并将自定义的回调函数作为参数传递给音频流。

总结

sounddevice库是一个非常实用的Python库,它提供了简单易用的API,使得在Python中播放和录制音频变得非常容易。无论是播放音频文件、录制声音,还是进行实时的音频处理,sounddevice都能提供很好的支持。通过本文的介绍,希望你帮助你了解和掌握这个Python库。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/583406.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AI图书推荐:基于AI的商业数据分析应用

《基于AI的商业数据分析应用》(AI-Based Data Analytics: Applications for Business Management)的作者是Kiran Chaudhary、 Mansaf Alam。 本书涵盖了与营销和商业分析相关的各种主题。它探讨了组织如何通过使用数据分析及时做出更好的决策来增加利润。…

verilog分析task的接口设计,证明这种写法:assign {a,b,c,d} = links;

verilog分析task的接口设计,证明这种写法:assign {a,b,c,d} links; 1,task在状态机中的使用好处:2,RTL设计3,测试testbench4,波形分析,正确! 参考文献: 1&am…

蓝牙核心规范(core Specification)与应用规范(Profile)

加zkhengyang可申请加入蓝牙音频研究开发交流答疑群(课题组),赠送实际蓝牙耳机项目核心开发资料, 我们看到的大部分资料对于蓝牙协议分层一般是核心规范。 射频,基带,链路管理属于蓝牙硬件模块(一般由硬件实现比如FPGA) 逻辑链…

MongoDB数据库迁移的两种办法

在做系统运维时,经常需要对数据库进行迁移,今天这里分享一下MongoDB数据库数据迁移的办法。两种方法 方法1 利用NoSQLBooster for MongoDB直接复制粘贴 这种方法,适合在windows电脑上,可以直接访问原始和目标两个MongoDB库的。优…

Burp自定义插件实现请求拦截

在安全测试时,经常需要对请求进行拦截以及配置管理,以便过滤域名或路径的请求。例如:被测对象会不断收集信息(例如IP地址、设备信息)通过HTTP传给服务端。本文将介绍如何使用Burp Suite的扩展插件,通过开发…

释放Stable Diffusion 无限可能

最近在整理大语言模型的系列内容,Stable Diffusion 是我下一篇博客的主题。关注 Stable Diffusion,是因为它是目前最受欢迎和影响力最大的多模态生成模型之一。Stable Diffusion 于 2022 年 8 月发布,主要用于根据文本的描述产生详细图像&…

微服务使用SockJs+Stomp实现Websocket 前后端实例 | Vuex形式断开重连、跨域等等问题踩坑(二)

大家好,我是程序员大猩猩。 上次我们实践了,Java后端如何完成SockJSStomp的配置实现。 微服务使用SockJsStomp实现Websocket 前后端实例 | Vuex形式断开重连、跨域等等问题踩坑(一) 那么今天我们做一下web vue端的是如何来实现…

android studio拍照功能问题解决

1.点击拍照功能直接闪退 2.拍照后不能选择确认键,无法保存 上述是在android studio做项目中经常会使用到模拟器或真机的拍照功能时主要遇到的两个问题。 解决方法: 1.直接闪退问题: if(Build.VERSION.SDK_INT>Build.VERSION_CODES.N)…

谈谈进些年的BLE开发项目

加zkhengyang可申请加入蓝牙音频研究开发交流答疑群(课题组) 最早接触BLE项目是在做一款女性按摩器产品上,所谓的生活用品,用的是TI CC2640,资料齐全,上手快,配合手机app通讯开发,当然这个是单模的蓝牙芯…

学习C语言的指针

有一阵没更新了,因为最近比较繁忙,所以更新比较慢,还在慢慢学习 话不多说,开始今天的内容,聊一聊C语言指针。 很多小伙伴可能会被指针这个名字吓到,觉得很难,实际上确实有点难,但是…

cesium教程

环境搭建 vscode安装Visual Studio Code - Code Editing. Redefined nodejs安装Node.js — Run JavaScript Everywhere cesium源码下载编译 cesium官网下载源码https://cesium.com/downloads/ 解压下载的源码 VsCode打开远吗,找到index.html,右键打开 Open wit…

职场人是如何被拉开差距的?

事实上,职场人的差距从第一天就拉开了。 心理学里有一个词,叫做“首因效应,说的是人们在第一次接触时形成的印象,将会决定后续认知的基调。 入职第一天,从自我介绍开始,展示自己的特长,给大家…

unity项目《样板间展示》开发:菜单界面

unity项目《样板间展示》开发:菜单界面 前言UI菜单创建逻辑实现结语 前言 这是这个项目demo教程的最后一节,这节是菜单界面部分的创建 UI菜单创建 创建一个新的场景,在Scene文件中右键选择Create->Scene,创建新的场景 在场景…

【服务器部署篇】Linux下快速安装Jenkins

作者介绍:本人笔名姑苏老陈,从事JAVA开发工作十多年了,带过刚毕业的实习生,也带过技术团队。最近有个朋友的表弟,马上要大学毕业了,想从事JAVA开发工作,但不知道从何处入手。于是,产…

Elasticsearch实现hotel索引库自动补全、拼音搜索功能

Elasticsearch实现hotel索引库自动补全、拼音搜索功能 在这里边我们有两个字段需要用拼音分词器,一个name字段,一个all字段。 然后我们还需要去实现自动补全,而自动补全对应的字段必须使用completion类型。目前我们酒店里面所有的字段都采用的…

暴雨信息| AI“速”不可挡,倒逼算力巨变!

「 “当某一天人工智能的智慧超越人类,你会发现人工智能将会以迅雷不及掩耳之势改变世界,那个改变是不可逆的,极其迅速。” 」 暴雨信息副董事长孙辉在“IPF2024”上的这个观点,正是当今世界在AI影响下急速前行的真实写照。 记得…

高压、单通道、轨对轨输入输出功率运算放大器RS8471

RS8471是一款高压、单通道、轨对轨输入输出的功率运算放大器,它的工作电压范围在4.5V到24V,最大峰值输出电流2.5A,失调电压为3mV,增益带宽积为25MHz,并提供65V/us的高压摆率,确保输出信号快速建立”,这些特…

[Java EE] 多线程(五):单例模式与阻塞队列

1. 单例模式 单例模式是校招中最长考的设计模式之一,首先我们来谈一谈什么是设计模式: 设计模式就好像象棋中的棋谱一样,如果红方走了什么样的局势,黑方就有一定地固定地套路,来应对这样的局势,按照固定地套路来,可以保证在该局势下不会吃亏. 软件开发也是同样的道理,有很多…

(十二)Servlet教程——HttpServletResponse接口

HttpServletResponse接口继承自ServletResponse接口,HttpServletResponse用来封装HTTP响应消息,简称response对象。 每次请求一个Servlet,Servlet容器就会针对每次请求创建一个response对象,并把它作为参数传递给Servlet的service…

Linux网络-文件传输协议之FTP服务(附带命令及截图)

目录 一.FTP简介 二.FTP的数据模式 1.主动模式 2.被动模式 3.两种模式比较 三.安装配置vsftpd 1.安装vsftpd 1.1.安装前关闭防火墙 1.2.安装vsftpd 1.3.查看 1.4.备份 2.配置 3.重启后生效 四.相关实验 1.以win为例 1.1.设置并测试测试连通性 1.2.在终端里创建…
最新文章