我目前正在用PyTorch和torchaudio训练一个分类器。为此,我遵循了以下教程:https://towardsdatascience.com/audio-deep-learning-made-simple-sound-classification-step-by-step-cebc936bbe5
这一切工作起来就像一个魅力和我的分类器现在能够成功地分类.wav文件。然而,我想把这变成一个实时分类器,也能够分类录音从麦克风/环回输入。
为此,我希望不必将记录保存到.wav文件中以再次加载它,而是直接向分类器提供内存中的记录。
本教程使用torchaudio的.load函数加载.wav文件并返回波形和采样率,如下所示:
sig, sr = torchaudio.load(audio_file)
现在回环是非常必要的,由于pyaudio显然还不支持回环设备(除了一个很可能过时的fork),我偶然发现了声卡:https://soundcard.readthedocs.io/en/latest/
我发现这段代码产生了我的扬声器环回录音:
speakers = sc.all_speakers()
# get the current default speaker on your system:
default_speaker = sc.default_speaker()
# get a list of all microphones:v
mics = sc.all_microphones(include_loopback=True)
# get the current default microphone on your system:
default_mic = mics[0]
with default_mic.recorder(samplerate=148000) as mic, \
default_speaker.player(samplerate=148000) as sp:
print("Recording...")
data = mic.record(numframes=1000000)
print("Done...Stop your sound so you can hear playback")
time.sleep(5)
sp.play(data)
但是现在我当然不想用.play函数播放这个音频,而是把它传递给torchaudio/分类器。由于我是音频处理领域的新手,我不知道如何把这个数据转换成一个合适的格式,类似于torchaudio返回的格式。根据声卡的文档,数据有以下格式:
- 数据将以帧×通道float 32 numpy数组的形式返回 *
作为最后的手段,也许保存到内存中的.wav文件,然后用torchaudio阅读它是可能的?任何帮助都是感激不尽的。提前感谢!
1条答案
按热度按时间wj8zmpe11#
根据文档,你将得到一个
numpy
的形状帧×通道阵列。对于立体声麦克风,这将是(N,2)
,对于单声道麦克风,这将是(N,1)
。torch
load
函数的输出基本上就是这样:sig
是原始信号,sr
是采样率。您已经为麦克风指定了采样率(因此sr = 148000
),您只需将numpy原始信号转换为torch
Tensor,公式如下:只需检查维度是否相似,它可能类似于
(2,N)
与torchaudio.load()
,在这种情况下,只需重塑Tensor: