【Python 第三方库】sounddevice

2024-01-25 00:00:00

目录:

sounddevice 模块介绍

sounddevice 是基于 PortAudio 的音频处理模块,用于音频的录制和播放。

安装依赖:

$ pip install sounddevice

为了进行音频数据处理,通常还需要安装 NumPy:

$ pip install numpy

打印所有可用的音频设备

import sounddevice as sd

print(sd.query_devices())  # 打印所有可用的音频设备

#   0 Dubbing Virtual Device , Core Audio (1 in, 1 out)
#   1 27B1G5, Core Audio (0 in, 2 out)
#   2 HECATE G2无线版, Core Audio (0 in, 2 out)
#   3 HECATE G2无线版, Core Audio (1 in, 0 out)
# > 4 MacBook Pro麦克风, Core Audio (1 in, 0 out)
# < 5 MacBook Pro扬声器, Core Audio (0 in, 2 out)
#   6 Microsoft Teams Audio, Core Audio (1 in, 1 out)

我的机器总共有 7 个可用的音频设备,输出结果中:

  • > 表示默认输入设备,< 表示默认输出设备;
  • 1 in 表示输入声道有 1 个,2 out 表示输出声道有 2 个。

录制音频

使用 sd.rec() 函数可以轻松实现录制音频。

import sounddevice as sd
from scipy.io import wavfile

# 设置录音参数
duration = 5      # 录制时长(秒)
fs = 44100        # 采样率(Hz),CD音质
channels = 1      # 声道数,2 为立体声

print("开始录制...")
# 开始录音,blocking=True 会阻塞直到录音完成
recording = sd.rec(int(duration * fs), 
                   samplerate=fs, 
                   channels=channels, 
                   dtype='float64', 
                   blocking=True)
print("录制结束。")

# 保存为WAV文件
wavfile.write('my_recording.wav', fs, recording)

代码中使用了 scipy 库,scipy 是一个基于 NumPy 构建的开源 Python 库,提供了丰富的函数和算法,涵盖数值积分、优化、线性代数、信号处理、统计等多个科学计算领域,在这里的目的是将声音信息保存为 WAV 文件。

使用如下命令安装依赖:

$ pip install scipy

我第一次运行时报了如下错误:

sounddevice.PortAudioError: Error opening InputStream: Invalid number of channels [PaErrorCode -9998]

原因是代码里设置了 channels=2,表示输入设备使用双声道,但是我机器的默认输入设备是 MacBook Pro麦克风, Core Audio (1 in, 0 out),这里的 1 in 表示只有 1 个声道,重新设置 channels=1,可以正常录入声音,并在同级目录保存为 my_recording.wav 文件。

播放音频

使用 sd.play() 函数播放音频。

import sounddevice as sd
import numpy as np

# 生成一段 440H 的正弦波作为示例音频数据
fs = 44100
length = 5
t = np.linspace(0, length, int(fs * length))
audio_data = np.sin(2 * np.pi * 440 * t)  # 440Hz 正弦波

print("开始播放...")
# 播放音频,block=False 表示异步播放,不阻塞主程序
sd.play(audio_data, fs, blocking=False)
sd.wait()  # 等待播放完成
print("播放结束。")

上面示例使用 numpy 创建了音频数据从而进行播放,也可以选择直接播放音频文件。

import sounddevice as sd
import scipy.io.wavfile as wavfile

sample_rate, data = wavfile.read('my_recording.wav')
sd.play(data, sample_rate)
sd.wait()

返回首页

本文总阅读量  次
皖ICP备17026209号-3
总访问量: 
总访客量: