当前位置:   article > 正文

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

一款非常不错的音频录制播放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库播放音频。以下代码示例展示了如何播放一个音频文件:

  1. import sounddevice as sd
  2. import numpy as np
  3. # 导入soundfile库用于读取音频文件
  4. import soundfile as sf
  5. # 加载音频数据
  6. # 使用soundfile库的read函数读取音频文件 'audio_file.wav'
  7. # data变量存储音频数据,fs变量存储采样率
  8. data, fs = sf.read('audio_file.wav')
  9. # 播放音频
  10. # 使用sounddevice库的play函数播放音频数据
  11. # data参数为要播放的音频数据,fs参数为音频数据的采样率
  12. sd.play(data, fs)
  13. # 等待播放完成
  14. # 使用sounddevice库的wait函数等待音频播放完成
  15. sd.wait()
在这个示例中,我们首先使用sf.read()函数加载音频文件,然后使用sd.play()函数播放音频,最后使用sd.wait()函数等待播放完成。

录制音频

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

  1. import sounddevice as sd
  2. import numpy as np
  3. # 设置录制参数
  4. # fs表示采样率,即每秒采集的样本点数
  5. fs = 44100  # 采样率为44100Hz,通常为CD音质
  6. # duration表示录制音频的时长,单位为秒
  7. duration = 5  # 录制时长为5秒
  8. # 开始录制
  9. # 打印提示信息,通知用户录制即将开始
  10. print('开始录制')
  11. # 调用sd.rec函数开始录制音频
  12. # int(duration * fs)计算需要录制的样本点总数
  13. # samplerate=fs指定采样率为fs
  14. # channels=2指定录制通道数为2,即立体声
  15. recording = sd.rec(int(duration * fs), samplerate=fs, channels=2)
  16. # sd.wait()等待录制完成
  17. sd.wait()
  18. # 保存录制到的音频数据
  19. # 使用numpy的save函数将录制到的音频数据保存到文件中
  20. # 'recording.npy'是保存文件的名称,recording是包含音频数据的numpy数组
  21. np.save('recording.npy', recording)

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

其他示例

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

获取音频设备信息

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

实时音频处理

  1. import sounddevice as sd
  2. import numpy as np
  3. # 定义回调函数
  4. # 回调函数在音频流处理音频数据时被调用
  5. def callback(indata, outdata, frames, time, status):
  6.     # 如果有状态信息,则打印出来
  7.     if status:
  8.         print(status)
  9.     # 将输入数据复制到输出数据
  10.     # 这里的操作实现了简单的音频回环,即直接将输入的音频数据输出
  11.     outdata[:] = indata
  12. # 创建一个音频流
  13. # channels=2指定音频流的通道数为2,即立体声
  14. # callback=callback指定音频流的回调函数为上面定义的callback函数
  15. with sd.Stream(channels=2, callback=callback):
  16.     # sd.sleep(10000)让程序在音频流开启的情况下运行10000毫秒
  17.     sd.sleep(10000)

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

高级用法

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

同步播放和录制

  1. import sounddevice as sd
  2. import numpy as np
  3. # 设置采样率和录制时长
  4. fs = 44100  # 采样率,通常为CD音质的44100Hz
  5. duration = 5  # 录制时长,单位为秒
  6. # 创建一个同步的音频流
  7. # samplerate=fs指定采样率为fs
  8. # channels=2指定音频流的通道数为2,即立体声
  9. stream = sd.Stream(samplerate=fs, channels=2)
  10. # 打开音频流
  11. # 准备好音频设备进行数据交换
  12. stream.start()
  13. # 播放和录制
  14. # 打印提示信息,通知用户即将开始播放和录制
  15. print('开始播放和录制')
  16. # 创建随机噪声作为输入数据,用于播放
  17. input_data = np.random.randn(int(duration * fs), 2)
  18. # 创建一个全零数组,用于存储录制到的音频数据
  19. output_data = np.zeros((int(duration * fs), 2))
  20. # 将输入数据写入音频流,进行播放
  21. stream.write(input_data)
  22. # 从音频流读取数据,进行录制
  23. stream.read(output_data)
  24. # 停止音频流
  25. # 停止音频流的数据交换
  26. stream.stop()
  27. # 关闭音频流,释放资源
  28. stream.close()
  29. # 保存录制到的音频数据
  30. # 使用numpy的save函数将录制到的音频数据保存到文件中
  31. # 'sync_recording.npy'是保存文件的名称,output_data是包含音频数据的numpy数组
  32. np.save('sync_recording.npy', output_data)


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

自定义回调函数

  1. import sounddevice as sd
  2. import numpy as np
  3. # 定义自定义回调函数
  4. # 回调函数在音频流处理音频数据时被调用
  5. def custom_callback(indata, outdata, frames, time, status):
  6.     # 如果有状态信息,则打印出来
  7.     if status:
  8.         print(status)
  9.     # 对输入的音频数据进行处理
  10.     # 将音量减半,通过将indata数组中的每个元素乘以0.5来实现
  11.     processed_data = indata * 0.5
  12.     # 将处理后的音频数据输出
  13.     # 将处理后的音频数据赋值给outdata数组
  14.     outdata[:] = processed_data
  15. # 创建一个音频流
  16. # channels=2指定音频流的通道数为2,即立体声
  17. # callback=custom_callback指定音频流的回调函数为上面定义的custom_callback函数
  18. with sd.Stream(channels=2, callback=custom_callback):
  19.     # sd.sleep(10000)让程序在音频流开启的情况下运行10000毫秒
  20.     sd.sleep(10000)
在这个示例中,我们自定义了一个回调函数custom_callback(),该函数对输入的音频数据进行处理,然后将处理后的音频数据输出。我们使用sd.Stream()函数创建一个音频流,并将自定义的回调函数作为参数传递给音频流。

总结

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

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/532107
推荐阅读
相关标签
  

闽ICP备14008679号