使用 TensorFlow 构建 AI 赋能的音乐库
2020 年 1 月 16 日
腾讯 QQ 音乐音频工程团队客座文章

简介

QQ 音乐是腾讯音乐娱乐集团(TME)旗下的音乐流媒体服务,我们在全球拥有 8 亿+ 用户。我们拥有庞大的音乐库,其中包含大量的专辑和现场音乐,以音频和视频格式提供。基于 TensorFlow,我们能够通过实施许多机器学习算法来有效管理音乐库,以实现自动音乐标签、音乐评估、声音分离、音乐缺陷检测和修复等等。在本文中,我们想与您分享我们如何构建这样一个 AI 赋能的音乐库以及我们使用 TensorFlow 的经验。

使用 TensorFlow 构建训练框架

基于 TensorFlow,我们专门为音频构建了一个 ML 训练框架,用于执行特征提取、模型构建、训练策略和在线部署。它利用了 TensorFlow 提供的许多高级 API,这便于我们进行算法实现。
图 1:基于 tf.estimator 的训练框图

特征提取

为了处理音频相关任务,我们首先需要提取音频特征。这里我们主要使用 tf.signal 中的高级信号处理 API,它提供了常见的 STFT、MFCC 和其他特征提取功能。如果我们使用 tf.py_func(),它以 numpy 数组作为输入并以 numpy 数组作为输出,我们甚至可以将其他音频处理工具(如 librosa)包装成 TensorFlow 图中的一个操作。以下代码片段构建了一个简单的 TensorFlow 图,它调用 librosa 库作为计算图中的一个操作来读取和提取特征
def _load_wav(filename, gt_rate=16000):
    try:
        data, _ = librosa.load(filename, sr=gt_rate)
    except Exception as e:
        raise ('the file %s  catch the exception...'%filename)
    #T0DO
    features =......
    #T0DO
    return features
read_wav = lambda x: tf.py_func(partial(_load_wav, gt_rate=gt_rate),  [x], tf.float32)
我们使用 tf.data 将提取的特征转换为 TFRecord 文件或张量,以直接馈送到我们的模型进行训练。具体来说,我们使用 tf.data.Dataset.map() 函数将一个数据集元素映射到另一个数据集元素,以便像下面这样并行处理数据。然后,我们使用 dataset.filter(lambda XXX).map(lambda XXX).apply(XXX) 来执行其他数据转换。
def audio_dataset_from_fileslist(path=None, num_parallel_calls=4, gt_rate=16000):
    fn_dset = load_fileslist(path)
    read_wav = lambda x: tf.py_func(partial(_load_wav, gt_rate=gt_rate), 
                                           [x], 
                                           tf.float32)
    audio_dset = fn_dset.map(read_wav, 
                                  num_parallel_calls=num_parallel_calls)
    return audio_dset

模型构建

我们使用 tf.keras 等高级 TensorFlow API 来构建我们的神经网络,而无需像低级 API 那样手动定义每个卷积层中的权重。一些预训练模型甚至可以直接使用或快速定制以满足我们的需求。同时,以这种方式微调现有模型非常方便。

训练策略

在模型训练过程中,我们定义数据输入、模型输出、损失函数、梯度下降方法,然后将它们组合在一起进行训练。TensorFlow 提供了 tf.estimator 模块作为高级 API 来封装整个 ML 生命周期:训练、评估、预测和导出模型以进行部署。该模块提供了丰富的外部接口,例如 input_fn 和 model_fn;前者为训练提供输入数据作为小批量,而后者构建用于训练、评估和预测的计算图。然后,我们可以直接调用 train() 进行训练,evaluate() 进行评估,predict() 进行预测。但更重要的是,它提供了各种分布式训练策略:单机多 GPU、多机多 GPU 等等。通过使用分布式策略,我们可以用最少的代码更改将我们现有的模型和训练代码分布到多台机器/GPU 上进行训练。最后,模型文件可以导出为 Protobuf、SavedModel 或 FlatBuffers(用于 TensorFlow Lite)以部署在各种地方。整个工作流程如图 1 所示。

模型部署

我们模型中的权重保存在 protobuf 格式中,并使用 TensorFlow Serving 作为部署工具。TensorFlow Serving 可以通过异步调用实现高吞吐量/可用性,并自动批处理推理请求以最大限度地利用我们宝贵的 GPU 资源。我们将经过训练的模型部署在我们的 Nvidia P40 GPU 上,每个 GPU 的性能都得到了充分利用。

示例用例

音乐标签

音乐标签,也称为音乐分类,是指使用音乐信息检索 (MIR) 技术根据音乐的类型、情绪、场景等对音乐进行标签。音乐标签非常有价值,因为它们可以帮助用户更好地理解音乐,并促进个性化推荐。

音乐标签可以应用于以下场景
  1. 构建音乐频道
  2. 形成在线音乐电台
  3. 提高音乐库的标签覆盖率,构建智能音乐库
  4. 根据用户的个人兴趣推荐音乐
在我们的案例中,音乐标签可以描述为一个两阶段过程:使用标记数据训练分类模型,并使用新/未见数据测试模型。分类模型的精确率和召回率指标必须都很好,考虑到我们音乐库的庞大规模和多样性,这是一项巨大的挑战。此外,为了努力消除人工参与标签过程,我们采用了深度学习来创建更准确和更稳健的分类系统。
我们对其他方法的主要改进是
  1. 使用基于音频内容和歌词组合特征的分类模型来提高音乐分类的准确性。图 2 是我们的音频分类系统的框图
    图 2:音频分类训练框图
  2. 我们没有使用深度学习中传统的 多类分类,而是使用二元分类甚至多级二元分类,来显着提高精确率和召回率。下图显示了 2 级分类的示例,以获取目标标签“流行钢琴”
    图 3:多级二元分类系统

声音分离

声音分离,也称为人声分离,是一种将人声和背景音乐分离的技术。它旨在将音乐录音分解成两条轨道:一条轨道为人声,另一条轨道为伴奏音乐。
图 4:频域声音分离
在音乐领域,声音分离有着广泛的应用。例如
  1. 生成高质量伴奏以构建伴奏库
  2. 使用提取的人声进行声纹识别、声音转换、声音校正模板、智能 MIDI 等
  3. 与 ASR(自动语音识别)技术结合使用,可以生成歌词、对齐歌词,甚至自动创建音乐歌词时间戳文件,如下面的图 5 所示
图 5:基于声音分离生成歌词时间戳
声音分离是音乐信息检索 (MIR) 文献中一个非常热门的研究课题,年度比赛(如 SiSec MUS Challenge)吸引了越来越多的参赛队伍。我们构建了一个 CRNN(卷积递归神经网络)模型,如图 6 所示。它是 U-Net 模型的一个变体,它使用了一个卷积自动编码器,并带有额外的跳跃连接,将编码阶段丢失的详细信息带回解码阶段。该模型可以在我们音乐库中的大量纯伴奏和人声数据集上进行训练。值得注意的是,我们的模型不会直接输出伴奏或人声;相反,它输出相应的理想比率掩码 (IRM),然后使用它来乘以原始信号的频谱特征以获得所需的伴奏或人声。
图 6:基于编码器-解码器架构的 CRNN 模型

缺陷检测

缺陷检测是指识别对用户听觉体验产生负面影响的异常音乐片段。缺陷检测的目的是替换或修复我们音乐库中的缺陷。此外,它可以防止有缺陷的音频文件首先进入我们的音乐库。因此,它对于我们音乐库的音质至关重要,进而带来出色的产品体验和强大的 QQ 音乐品牌。
图 7 显示了由于历史原因(如网络传输错误或编解码器问题)导致的歌曲中的一些有缺陷的音频片段。因此,绝对有必要检测歌曲中的此类缺陷。所涉及的主要技术是基于 3 种人类注释的声音事件检测 (SED)
  1. 强标签:每个事件都标记了开始时间和结束时间
  2. 弱标签:每个事件都没有时间信息,也称为存在/不存在标签
  3. 顺序标签:没有开始/结束时间信息的事件序列
但是,强标签对于人类注释者来说,无论是人工成本还是经济成本都是非常高的,因此我们开发了一个基于卷积递归神经网络 (CRNN) 的弱监督架构,并使用弱标签(存在/不存在标签)。我们使用弱标签的 SED 技术可以表述为一个 多示例学习 (MIL) 问题。从高层面上看,我们的 CRNN 模型预测每帧每个声音事件类型的概率。池化函数将帧级概率聚合到每个声音事件类型的录音级概率,然后我们可以根据录音级概率预测整首歌曲是否包含缺陷。
最后,我们使用 TensorFlow Serving 部署我们的模型,以便扫描整个音乐库。
图 7:缺陷检测过程

音乐修复

由于录音设备的限制(如手机录音)或背景环境干扰,音乐库中存在带有噪音的异常歌曲,从而引入了噪声信号,例如咔嗒声、背景噪音等等。
特别是,一些用户生成内容(UGC)天生包含影响聆听体验的噪声。因此,我们应该采取技术措施过滤掉这些噪声信号,这可以有效地恢复和增强音质,从而提升QQ音乐的娱乐体验。音乐修复可以在云端或移动设备上部署,以实现对噪声信号的实时过滤。
从宏观角度来看,我们对有缺陷音频进行修复的方式是提取STFT线性幅度谱,然后将其输入到CRNN模型中。整个模型训练框图如图8所示。
图8:音频降噪训练框图
需要注意的是,该模型输出IRM(理想比率掩码,也称为时频掩码),它预测乘性时频掩码,如图9所示。然后我们将预测的掩码与输入的时频特征相乘,得到预测的时频输出。换句话说,我们将预测的IRM与噪声信号的混合幅度谱相乘,得到干净的、无噪声的幅度谱,以恢复音频。由于我们的算法需要实时性,我们主要集中在估计STFT变换后复数谱的幅度,同时复用原始噪声音频的相位。研究人员开始扩展他们的研究,涵盖相位信息,并提出了新的方法,如相位敏感掩码(PSM)和复数理想比率掩码(cIRM),用于估计干净音频的相位。我们将在未来探索这些新方法。
图9:基于IRM的音频降噪

结论

本文讨论了我们如何采用TensorFlow构建一个AI增强型音乐库,并说明了如何构建深度学习训练模型来解决QQ音乐中几个与音频相关的挑战。
未来,我们将继续探索“音乐与AI”领域,包括歌词生成、AI音乐创作、音频指纹、音乐识别和哼唱查询。TensorFlow在开发所有这些智能音乐解决方案中发挥着重要作用,这将帮助我们为超过8亿用户提供最佳的音乐体验。

参考文献

  1. Rafii Z, Liutkus A, Stoter FR, Mimilakis SI, FitzGerald D, Pardo B. An overview of lead and accompaniment separation in music. IEEE/ACM Transactions on Audio, Speech and Language Processing (TASLP). 2018 Aug 1;26(8):1307-35.
  2. Wang D, Chen J. Supervised speech separation based on deep learning: An overview. IEEE/ACM Transactions on Audio, Speech, and Language Processing. 2018 May 30;26(10):1702-26.
  3. Virtanen, Tuomas, Mark D. Plumbley, and Dan Ellis, eds. Computational analysis of sound scenes and events. Heidelberg: Springer, 2018.
  4. B McFee, J Salamon, JP Bello.Adaptive pooling operators for weakly labeled sound event detection.IEEE/ACM Transactions on Audio, 2018.
下一篇文章
Building An AI-Empowered Music Library with TensorFlow

腾讯QQ音乐音频工程团队客座文章

简介 QQ音乐是腾讯音乐娱乐集团(TME)旗下的音乐流媒体服务,我们在全球拥有超过8亿用户。我们拥有一个庞大的音乐库,其中包含大量专辑和现场音乐,以音频和视频格式提供。依托TensorFlow,我们能够有效地管理音乐库……