🌘

喔优秀. Wow! Excellent!

用机器学习识别音频的例程

本文仅供参考。笔者明确声明,不对任何人完全或部分地依据本网站的全部或部分内容从事的任何事情和因其任何作为或不作为造成的后果承担任何责任。笔者不对任何可以通过此网站访问的第三方内容承担责任。

下面是一个用利用机器学习Python库识别音频的例程。

检查设备和软件

  • 您有一台 Linux PC。
  • PC 上安装有适合的NVIDIA GPU 或AMD GPU, 并安装有麦克风。
  • 确保设备驱动(内核模块)已正确安装。
  • 通过您喜爱的Python包管理工具在Linux 中安装pyalsaaudio、librosa、和fastai,这三个Python库及其相应依赖 。

用闲置计算机采集音频数据

请您启动一个Python Shell,输入并运行下列代码。您可能需要对代码做一些修改。

import wave
import time 
import aalsaaudio

#您可能需要将'hw:1'修改为自己的设备编号
inp = alsaaudio.PCM(alsaaudio.PCM_CAPTURE, alsaaudio.PCM_NORMAL, 
                    channels=1, rate=44100, format=alsaaudio.PCM_FORMAT_S16_LE, 
                    periodsize=11025, device='hw:1')

target = wave.open("sample.wav", 'wb')
    target.setnchannels(1)
    target.setframerate(44100)
    target.setsampwidth(2)
    for k in range(0, 5):
        l, data = inp.read()
        if l:
            target.writeframes(data)
            time.sleep(0.01)

通过上面的示例,您可以保存一段1.25秒的音频文件。

将音频数据转化为光谱图

请您启动一个Python Shell,输入并运行下列代码。您可能需要对代码做一些修改。

import librosa
import matplotlib

def melconvert(i_file, o_file):
    array, sr = librosa.load(i_file,sr=None)
    array = librosa.feature.melspectrogram(
                      y=array,
                      sr=sr,
                      n_fft=1024,
                      hop_length=430,
                      win_length=None,
                      center=True,
                      pad_mode="reflect",
                      power=2.0,
                      n_mels=128,
                      norm="slaney",
                      htk=True,
    )
    array = librosa.power_to_db(array)
    matplotlib.image.imsave(o_file, array[:128].T[:128].T)

melconvert("sample.wav", "sample.png")

通过上面的示例,您可以将先前保存的一段1.25秒的音频文件转化为一个分辩率为128x128的Mel光谱图。

训练自己的神经网络

您可能需要不少数据来训练自己的神经网络,若您没有许多空闲时间采集、转换并分析音频,可以下载NoiseTacticalDetection素材包用以评估或试验。素材包内含有两类音频的Mel光谱图,各含九十份文件。下面的示例将用NoiseTacticalDetection素材包训练神经网络。

一、常见的环境噪音的Mel光谱图。文件目录命名为Casual。

二、低频噪音的Mel光谱图。文件目录命名为LowFreq。

请您启动一个Python Shell,输入并运行下列代码。您可能需要对代码做一些修改。

from fastai.vision.all import *

#您可能需要将"NoiseTacticalDetection"修改为您素材包的存放目录
folder = "NoiseTacticalDetection"

dls = ImageDataLoaders.from_folder(folder,
                             valid_pct=0.5,
                             item_tfms = None)
learn = vision_learner(dls, resnet34, metrics = error_rate)
learn.fine_tune(5, 0.0004, freeze_epochs = 15)
learn.save("NTD")

通过上面的示例,您可以训练一个34层的神经网络,并将其保存为NTD.pth文件。

*上述示例训练的神经网络最终可能有20%至30%的错误率,您可能需要更多Mel光谱图来降低这个数值。请注意,由于素材相应音频并非为解决您的问题而录制,示例中训练的神经网络对您可能没有帮助。

用神经网络分析音频

请您启动一个Python Shell,输入并运行下列代码。您可能需要对代码做一些修改。

from fastai.vision.all import *
import time 
import librosa
import matplotlib

def melconvert(i_file, o_file):
    array, sr = librosa.load(i_file,sr=None)
    array = librosa.feature.melspectrogram(
                    y=array,
                    sr=sr,
                    n_fft=1024,
                    hop_length=430,
                    win_length=None,
                    center=True,
                    pad_mode="reflect",
                    power=2.0,
                    n_mels=128,
                    norm="slaney",
                    htk=True,
    )
    array = librosa.power_to_db(array)
    matplotlib.image.imsave(o_file, array[:128].T[:128].T)

import alsaaudio

#您可能需要将'hw:1'修改为自己的设备编号
inp = alsaaudio.PCM(alsaaudio.PCM_CAPTURE, alsaaudio.PCM_NORMAL, 
                channels=1, rate=44100, format=alsaaudio.PCM_FORMAT_S16_LE, 
                periodsize=11025, device='hw:1')

#您可能需要将"NoiseTacticalDetection"修改为您素材包的存放目录
folder = "NoiseTacticalDetection"

dls = ImageDataLoaders.from_folder(folder,
                                   valid_pct=0.5,
                                   item_tfms = None)
learn = vision_learner(dls, resnet34, metrics = error_rate)
learn.fine_tune(5, 0.0004, freeze_epochs = 15)
learn.load("NTD")

while True:
    target = wave.open("/tmp/sample.wav", 'wb')
    target.setnchannels(1)
    target.setframerate(44100)
    target.setsampwidth(2)
    for k in range(0, 5):
        l, data = inp.read()
        if l:
            target.writeframes(data)
            time.sleep(0.01)
    target.close()
    melconvert("/tmp/sample.wav","/tmp/sample.png")
    pred = learn.predict("/tmp/sample.png")[0]
    if pred == "LowFreq":
        #您需要自行编写method函数
        method()

通过上面的完整示例,您可以用您的神经网络,每间隔1.25秒识别您的设备录制的音频中的低频噪音并自动调用您的method函数。

参考文献

Deep Learning for Coders with Fastai and PyTorch: AI Applications Without a PhD

Programming PyTorch for Deep Learning: Creating and Deploying Deep Learning Applications

— Aug 22, 2023