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

发布于:2024-04-30 ⋅ 阅读:(34) ⋅ 点赞:(0)

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