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

news/2024/11/15 4:56:03/

声音无处不在,在计算机应用中也是。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命令即可:

python">pip install sounddevice

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

如何使用

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

播放音频

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

python">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库录制音频。以下代码示例展示了如何录制一段音频:

python">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库还提供了其他一些实用的功能。以下是一些其他示例:

获取音频设备信息

python">import sounddevice as sd# 获取音频设备信息
# 使用sounddevice库的query_devices函数查询音频设备信息
# info变量存储查询到的音频设备信息
info = sd.query_devices()# 打印音频设备信息
# 将查询到的音频设备信息打印到控制台
# 信息包括设备索引、名称、主机API、最大输出和输入通道数等
print(info)

实时音频处理

python">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库还提供了一些高级功能,如同步播放和录制、音频数据同步、自定义回调函数等。以下是一些高级用法的示例:

同步播放和录制

python">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()函数录制音频。最后,我们关闭音频流并保存录制到的音频数据。

自定义回调函数

python">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.ppmy.cn/news/1445086.html

相关文章

React的路由

1. 什么是前端路由 一个路径 path 对应一个组件 component 当我们在浏览器中访问一个 path 的时候,path 对应的组件会在页面中进行渲染 2. 创建路由开发环境 # 使用CRA创建项目 npm create-react-app react-router-pro# 安装最新的ReactRouter包 npm i react-ro…

docker-compose docker的批量管理工具

安装 apt-get install docker-compose -y # 查看版本 docker-compose -v设置容器自启动:–restartalways docker run -it -d --restartalways nginx:1.16docker-compose.yml配置文件,该文件的缩进必须是三个空格,使用的是yaml语法。 versi…

3d模型合并怎么样不丢材质?---模大狮模型网

在3D设计中,合并模型是常见的操作,它可以帮助设计师将多个单独的模型组合成一个,从而简化场景并提高渲染效率。然而,合并模型时常常会面临一个棘手的问题:如何确保合并后的模型不丢失原有的材质?本文将探讨如何在合并…

全面解析平台工程与 DevOps 的区别与联系

平台工程的概念非常流行,但很多开发人员仍然不清楚它是如何实际运作的,这是非常正常的。 平台工程是与 DevOps 并行吗?还是可以相互替代?或者 DevOps 和平台工程是两个完全不同的概念? 一种比较容易将两者区分开来的方…

KVM安装Ubuntu24.04简要坑点以及优点

本机环境是ubuntu22.04的环境,然后是8核16线程 ssd是500的 目前对于虚拟机的选择,感觉kvm确实会更加流畅,最重要的一点是简洁,然后实际安装效果也比较的好,如果对于速度方面希望快一点,并且流畅一点的话这…

使用Keil移植工程时修改单片机型号参数

系列文章目录 STM32单片机系列专栏 C语言术语和结构总结专栏 当使用Keil对STM32系列单片机开发时,如果使用的是库函数,那么不同型号单片机的工程项目文件是可以直接移植的。只需要按照下面的步骤修改对应的芯片,就可以直接将工程移植过去&a…

java连锁美业收银系统源码-美业SaaS系统【微信小程序端】功能及应用场景介绍

博弈美业管理系统源码 连锁多门店美业收银系统源码 多门店管理 / 会员管理 / 预约管理 / 排班管理 / 商品管理 / 促销活动 PC管理后台、手机APP、iPad APP、微信小程序 ( 需要系统演示视频可联系观看 ) ▶ 顾客微信小程序端: 场景名称 场…

视频输入c++ 调用 libtorch推理

1、支持GPU情况 libtorch 支持GPU情况比较奇怪,目前2.3 版本需要在链接器里面加上以下命令,否则不会支持gpu -INCLUDE:?ignore_this_library_placeholderYAHXZ 2 探测是否支持 加一个函数看你是否支持torch,不然不清楚,看到…