从零搭建音乐识别系统(二)音频特征提取

从零搭建音乐识别系统(一)整体功能介绍_程大海的博客-CSDN博客

从零搭建音乐识别系统(二)音频特征提取_程大海的博客-CSDN博客_音乐特征提取

从零搭建音乐识别系统(三)音乐分类模型_程大海的博客-CSDN博客

从零搭建音乐识别系统(四)embedding特征提取模型_程大海的博客-CSDN博客

从零搭建音乐识别系统(五)embedding特征提取模型验证_程大海的博客-CSDN博客

 代码地址:GitHub - xxcheng0708/AudioEmbeddingExtraction: Extract audio embedding feature by metric learning


        在前面的总体功能概述中提到了,这个系统会训练两个模型,一个是音乐分类模型,用来判断是否是音乐片段,一个是embedding特征提取模型,用来提取音频的embedding特征向量。

分类模型数据集(AudioSet数据集):

        在这里,对于分类模型的训练,我们采用开源的AudioSet数据集。AudioSet数据集是一个用于声音分类的数据集,其中包含了各种类别的声音,如音乐,唱歌,哼唱,演讲,钢琴等,每个音频片段的长度都是10秒,具体可以去官网看一下介绍。而我们要训练的是一个二分类模型,只要能够区分音频片段是不是音乐片段就行,所以,我们把AudioSet数据集一分为二,把和音乐相关的所有类别作为音乐类,其余类别作为其他类。用这两个类别来训练分类模型。

embedding模型数据集(歌曲数据集):

        对于训练embedding模型的数据集,就使用常见的歌曲MP3文件就行,没啥好说的。

音频梅尔频谱特征提取:

        对于AudioSet数据集和MP3歌曲数据集,我们统一都使用梅尔频谱把音频文件向量化,将每10秒的音频文件转换为[64, 1001]大小的矩阵。具体实现代码如下:

# coding:utf-8
import librosa
import os
import numpy as np
import resampy


DEFAULT_FS = 32000


def read_audio_file(filename, sampleRate=DEFAULT_FS):
    """
    读取音频文件,如果采样率不为DEFAULT_FS,则重采样
    :param filename:
    :return:
    """
    try:
        y, sr = librosa.load(filename, sr=None)
        # 如果音频原始的采样率与预设的不一致,则对音频进行重采样
        if sr != sampleRate:
            y_44k = resampy.resample(y, sr, sampleRate)
            sr_44k = sampleRate
        else:
            y_44k = y
            sr_44k = sampleRate
        return y_44k, sr_44k
    except EOFError as e:
        print(filename)
    return None, None


def split_audio(x, split_duration=5, step_duration=3):
    """
    按照时域长度对音频片段进行滑窗拆分
    :param x:
    :param split_duration: 滑窗大小
    :param step_duration: 滑窗步长
    :return:
    """
    try:
        std_duration = split_duration * DEFAULT_FS
        std_step = step_duration * DEFAULT_FS
        d_len = x.shape[1]

        if x.shape[1] < std_duration:
            out = np.repeat(x, std_duration // x.shape[1] + 1, axis=1)
            print("out.shape: {}".format(out.shape))
            return [out[:, :std_duration]]
        else:
            result = []
            for s_len in range(0, d_len, std_step):
                print("s_len: {}".format(s_len))
                if d_len - s_len < std_duration:
                    new_data_array = x[:, -std_duration:]
                else:
                    new_data_array = x[:, s_len:s_len + std_duration]
                result.append(new_data_array)
            return result
    except Exception as e:
        # raise Exception(e)
        print(e)
    return None


def music_mel_frequency(x, fs):
    """
    计算梅尔频谱
    :param x:
    :param fs:
    :return:
    """
    mel_spectrogram_librosa = librosa.feature.melspectrogram(y=x, sr=fs, n_fft=1024, hop_length=320, n_mels=64,
                                                             fmin=50, fmax=14000, power=1)
    print('shape: {}'.format(mel_spectrogram_librosa.shape), 'max : ', np.max(mel_spectrogram_librosa), 'min: ', np.min(mel_spectrogram_librosa))
    mel_spectrogram_librosa_db = librosa.power_to_db(mel_spectrogram_librosa, ref=1, top_db=120)
    print('shape: {}'.format(mel_spectrogram_librosa_db.shape), 'db max : ', np.max(mel_spectrogram_librosa_db), 'db min: ', np.min(mel_spectrogram_librosa_db))
    spectrogram = mel_spectrogram_librosa_db
    return spectrogram


def audio_dataset_mel_spec(audio_path, out_path):
    """
    计算音频文件的梅尔频谱特征
    :param audio_path:
    :param out_path:
    :return:
    """
    audio_list = os.listdir(audio_path)
    for audio_name in audio_list:
        print("audio_name-1: {}".format(audio_name))
        audio_base_name = os.path.splitext(os.path.basename(audio_name))[0]
        dest_path = os.path.join(out_path, audio_base_name)
        if os.path.exists(dest_path) is False:
            os.makedirs(dest_path)

        if audio_name.endswith("mp3"):
            audio_file_path = os.path.join(audio_path, audio_name)
            audio, fs = read_audio_file(audio_file_path, sampleRate=DEFAULT_FS)
            if audio is None:
                continue

            audio = audio[np.newaxis, :]
            result = split_audio(audio, split_duration=10, step_duration=10)
            print("len result: {}".format(len(result)))

            for i, res in enumerate(result):
                x = np.squeeze(res)
                mel_spectrogram_librosa_db = music_mel_frequency(x, fs)
                print("mel_spectrogram_librosa_db: {}".format(mel_spectrogram_librosa_db.shape))

                np.save(os.path.join(dest_path, "{}_{}.npy".format(audio_base_name, i)), mel_spectrogram_librosa_db)


if __name__ == '__main__':
    # (64, 1001)
    audio_path = "./music"
    out_path = "./feature"
    audio_dataset_mel_spec(audio_path, out_path)

        基于上述音频梅尔频谱提取代码,设置不同的提取参数,分别提取AudioSet数据集和歌曲数据集的梅尔频谱数据。将每10秒音频片段提取[64, 1001]大小的矩阵。

AudioSet数据集梅尔频谱提取

        由于AudioSet数据集中每段音频的长度只有10秒,所以直接将每段音频提取得到一个[64, 1001]大小的数据矩阵。

歌曲数据集梅尔频谱提取

        歌曲数据集是用来训练embedding特征提取模型的,我们在后续会采用度量学习的方法来训练embedding特征提取模型。度量学习也是监督学习方法,训练数据也有各自的类别,度量学习的目标是使属于同一类别ID的样本的embedding之间的相似性高于不同类别样本embedding的相似性,从而通过相似性来完成识别的目标。对应到音乐识别就是,通过度量学习训练出来的音乐embedding模型,使得相同或者相似的歌曲片段之间的embedding相似度高于不同歌曲之间的相似度。关于度量学习的相关方法介绍,可以看一下我之前的文章。

        由于音频数据是时序数据,如何进行数据采样才能满足度量学习的训练数据要求,即同一类别的训练数据之间具有更高的相似性?参考google 2017年的论文《Now Playing: Continuous low-power music recognition》,我们对于一首歌曲,从歌曲中间的任意位置开始,我们以250ms为间隔,在5秒内连续采样20个持续时间为10秒的音乐片段,作为从一首歌曲中采集的训练数据,对应到上面的特征提取方法中就是把split_audio函数的参数设置为split_duration=10, step_duration=0.25。这样采集到的20个音乐片段相互之间具有50%~97.5%不等的重合度,我们认为这样的音乐片段之间是高度相似的。

        这样,对于每首歌曲文件,我们就可以提取得到20个[64, 1001]大小的矩阵作为训练数据。

  • 5
    点赞
  • 17
    收藏
    觉得还不错? 一键收藏
  • 12
    评论
### 回答1: 要搭建2023年的语音识别系统,我们可以选择使用虚拟专用服务器(VPS)来实现。首先,我们需要选择合适的VPS提供商,确保其提供稳定可靠的网络连接和高性能的硬件设备。 在选择VPS时,我们需要考虑服务器的主要配置,如CPU、内存和存储容量。对于语音识别系统,我们需要选择具有足够计算能力和存储空间的服务器,以便能够处理大量的语音数据和运行识别算法。 一旦我们获得了合适的VPS,我们可以通过远程登录服务器来开始搭建语音识别系统。首先,我们需要安装操作系统和相关的开发环境,如Python和深度学习框架TensorFlow或PyTorch。 接下来,我们需要准备训练数据集来训练语音识别模型。这些数据集可以是公开可用的语音数据集,也可以是自己收集的数据。我们可以使用开源的语音识别模型或自己构建模型,具体选择取决于需求和实际情况。 一旦训练好模型,我们就可以编写代码来实现语音识别功能。这包括音频数据的预处理、特征提取和模型推理等步骤。我们可以使用各种现有的语音识别算法和技术来优化系统的性能和准确度。 最后,我们可以将搭建好的语音识别系统部署到VPS上,并配置域名和SSL证书等来确保安全性和可访问性。同时,我们需要监控系统的运行情况,及时进行调整和优化,以提供高质量的语音识别服务。 总之,通过选择合适的VPS,安装必要的软件和开发环境,训练模型并进行代码实现,最后将系统部署并监控运行,我们可以搭建出2023年的语音识别系统。这将为用户带来更智能化、高效率的语音交互体验。 ### 回答2: VPS 2023搭建语音识别是一个非常可行的选择。语音识别是一项基于人工智能的技术,通过对人的语音进行分析和处理,将语音转化为文本形式。 首先,为了搭建语音识别系统,我们需要一个VPS(Virtual Private Server,虚拟私有服务器)。VPS是一种基于云计算的虚拟服务器,提供了高性能的计算资源和稳定的网络连接。我们可以选择一款适合我们需求的VPS服务商,并购买一台VPS。确保VPS的配置满足我们对语音识别系统的要求。 其次,我们需要选择一个合适的语音识别引擎。目前市场上有许多优秀的开源语音识别引擎可供选择,例如百度开放平台的“百度语音识别”,Google Cloud的“Google语音识别”等。根据我们的需求和预算,选择一个适合的语音识别引擎。 然后,我们需要在VPS上搭建语音识别系统。具体步骤是:首先,安装操作系统和必要的依赖库;然后,下载和安装选择的语音识别引擎;接着,配置和调试语音识别引擎,确保其正常运行;最后,根据需要,可以进一步进行性能优化和功能定制。 最后,我们可以通过编写程序或使用API接口对语音识别系统进行调用。例如,我们可以开发一个移动应用程序,将用户的语音输入发送到VPS上的语音识别系统进行处理,并将识别结果返回给用户。这样,用户就可以通过语音与应用程序进行交互,实现更加智能和便捷的功能。 通过以上步骤,我们可以成功搭建一个具备语音识别能力的系统。这样的系统可以应用在许多场景中,例如语音助手、语音翻译、语音搜索等,为用户提供更好的用户体验和服务。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值