如何将numpy数组(麦克风/回送输入)转换为PyTorch分类器的torchaudio波形

olmpazwi  于 2022-11-09  发布在  其他
关注(0)|答案(1)|浏览(185)

我目前正在用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阅读它是可能的?任何帮助都是感激不尽的。提前感谢!

wj8zmpe1

wj8zmpe11#

根据文档,你将得到一个numpy的形状帧×通道阵列。对于立体声麦克风,这将是(N,2),对于单声道麦克风,这将是(N,1)
torchload函数的输出基本上就是这样:sig是原始信号,sr是采样率。您已经为麦克风指定了采样率(因此sr = 148000),您只需将numpy原始信号转换为torchTensor,公式如下:

sig_mic = torch.tensor(data)

只需检查维度是否相似,它可能类似于(2,N)torchaudio.load(),在这种情况下,只需重塑Tensor:

sig_mic = torch.tensor(data).reshape((2, -1))

相关问题