Showing Posts From

Audio

基于ECS50数据集对PANNs语音分类模型进行的训练流程

本文使用ECS50数据集对语音检测和分类模型PANNs进行自定义训练的完整流程进行了记录。 ECS50数据集简介 在PANNs音频分类模型预研信息总结一文中,详细介绍了在语音分类应用中非常流行的模型PANNs,该模型使用Google的AudioSet数据集上进行了充分的训练,从而在不同种类的语音检测、辨识和分类应用上取得了非常好的效果。本文基于该模型(CNN14结构)的预训练文件Cnn14_mAP=0.431.pth,使用ECS-50语音数据集对预训练模型进行微调,使之适应ECS-50数据集的检测和分类需求。 ESC-50数据集包含有2000个环境录音文件,该数据集适用于环境声音分类的基准方法。数据集中的每个音频文件由5秒长的记录组成,可分为50个语义类,每个类型有40个示例,松散地分为5个主要类别: !image.png ECS-50数据集的下载地址:karolpiczak/ESC-50: ESC-50: Dataset for Environmental Sound Classification > 需要注意的是,ESC-50 数据集中的音频文件原始采样率是 44.1kHz,而 PANNs Cnn14 的预训练权重是基于 32kHz 的。 因此在读取这些音频文件送入模型训练时,必须强制重采样,从44.1Khz转换为32KHz。 ECS-50数据集的训练流程记录 客观的讲,PANNs模型对于自定义数据集的训练支持并不是很友好,所以需要自行设计和处理整个训练过程(数据集准备,模型检测头修改,训练流程)的各个阶段的处理流程。 训练数据集的准备 首先从以上ECS-50数据集的下载地址下载到这个数据集的压缩包,整个数据集有600多MB的样子。 然后基于Pytorch的Dataset类派生专门的ECS50数据集的Dataset类,在其中实现len和getitem接口。此处值得一提的是,因为PANNs模型是基于32KHz的音频文件进行训练的,所以此处在加载训练数据之前,需要把ECS50数据集的44.1KHz的音频文件转换为32KHz。 此外为了进一步规范化训练数据集中的音频数据长度,统一把训练数据集中的音频长度固定为5s,过长的音频文件直接截断,过短的因为文件则在后面补零。 CNN14检测头的修改 PANNs模型是在Google的AudioSet数据集的基础上进行设计和训练的,预训练文件Cnn14_mAP=0.431.pth对应的模型检测头支持527种音频分类。而ECS50数据集支持50种音频分类,因此要在训练之前对检测头部分进行修改,以适应ECS50数据集的要求。 整个过程分为以下步骤: - 首先基于PANNs模型源代码实例化一个Cnn14结构的模型,并加载预训练模型文件。 - 然后修改以上Cnn14模型的检测头部分,最后一层使用一个50个神经元的线性层替代之前默认的527神经元的线性层。 - 最后对新修改的检测头的线性层的权重参数进行初始化。 至此,预训练数据集和待训练的模型结构就准备好了。下一步就开始进行训练。 模型的训练 模型的训练流程的执行与普通的卷积神经网络模型的训练流程没有太大区别,需要注意的是:因为是分类模型,所以训练过程使用标准的交叉熵损失函数,优化器使用Adam。 训练过程中的log信息如下: 可以看到,经过30个epoch的训练以后,在验证集上的识别准确率达到了93.5%。训练完成后会自动把训练好的模型参数保存为cnn14_esc50_best.pth文件。 推理 最后基于以下代码对训练出来的模型进行推理测试: 参考资料 - karolpiczak/ESC-50: ESC-50: Dataset for Environmental Sound Classification

音频FFT计算流程总结与频谱图解读

本文总结了语音信号序列进行FFT计算其对应频谱的概率、参数总结以及计算流程,并提供了一个Python例子代码对一个wav文件进行频谱图的计算并进行解读。 语音信号FFT计算简介及其参数总结 众所周知,在时域中,音频信号是随着时间波动的压力值(即声压,表现为振幅的大小)。傅里叶变换原理证明了:任何周期性信号都可以分解为一系列不同振幅、频率和相位的正弦波/余弦波之和。因此,音频信号在时域中所表现出来的波动,也可以看做是由无数个不同频率、振幅和相位的正弦波叠加而成的。而对数字音频信号序列所进行的 FFT(快速傅里叶变换)计算,本质上就是从这个数字音频信号序列中提取出来与之对应的各种正弦波的组合,也就是所谓的频谱。 !image.png 对数字域中音频信号的离散时间序列所进行的FFT计算,包含的特性如下: - 对音频信号序列进行 FFT 计算的结果并不是连续的频率分析,而是将总频率范围(从 到音频采样率 )均匀地切割成 个小格子,每个格子被称为一个 Bin, 每个 Bin 的宽度为 。 - FFT 计算输出的结果是 复数。为了得到最终的频谱图,还需要对复数求取其幅度值(Magnitude):,这个幅度值代表了该频率分量在信号中的能量大小。 - 对于实数的音频信号序列,其 FFT 计算结果是对称的。也就是说,如果输入 1024 个音频采样点进行FFT计算,其输出的 1024 个复数中,前 512 个涵盖了 0 到 (奈奎斯特频率)的信息,后 512 个点只是前半部分的镜像。因此,在绘制频谱图时,通常只取前 个数据。 FFT计算结果与频域频点之间的对应关系 如上所述,对一个长度为 的音频序列所进行的FFT计算,其计算结果长度为 的复数序列,这个复数序列前半部分与后半部分呈现出镜像对称。FFT计算结果对应的整个频段为 ,因为整个计算结果序列前后镜像对称,因此这个频率范围均匀地切成了 份。 对于FFT计算的每个输出点(称为一个Bin)而言,其对应的频点计算公式为: 其中 是该复数在数组中的索引(从 0 开始)。如果采样率 ,FFT 长度 N = 1024: - Index 0: (直流分量 DC) - Index 1: - Index 2: - ... - Index 512: (奈奎斯特频率,即最高分析频率) 每个频点的幅度,对这个频点对应的复数求其幅度值:,这个幅度值代表了该频率分量在信号中的能量大小。 FFT运算的重点参数 音频序列进行FFT运算的重点参数如下:(可结合下面使用FFT进行频谱计算的流程来理解相关的参数) - FFT Size / Window Length / ():每一个音频采样帧参与计算的采样点数,通常取 2 的指数(如 512, 1024, 2048, 4096)。 - 采样率 (): 每秒钟对模拟信号采集的样本数,这个采集频率直接决定了频谱的带宽。根据奈奎斯特采样定律,采样样本序列能够分析的最高频率与采样频率之间的关系为 ,因此如果想要分析 的高频,采样率就必须大于 。 - Window:为了减少频谱泄露,必须在进行 FFT 计算之前给信号加窗。加窗的类型主要有:Hann,Hamming,Blackman。 - Hop Size:相邻两个 FFT 窗口之间滑动的距离。连续的两个音频帧重叠越多(Hop size越小),生成的频谱图在时间轴上越平滑,丢失的信息越少(因为窗函数会压低边缘能量,通过重叠可以补偿这一点)。但Hop 越小,同一个音频序列需要计算的帧数越多,计算成本线性增加。 音频采样帧Window Size、滑动窗口HopSize与连续两帧之间的Overlap Size的示意图如下所示: !image.png 语音信号频谱计算流程 对于一个语音文件,要生成与其对应的频谱图,通常需要包含以下步骤和流程。 语音信号的采集与分帧 音频采样设备(MIC)以固定的采样率 (如16K,32K,44.1K)进行模拟语音信号的采集,根据奈奎斯特采样定理,后续通过FFT能够计算和分析的最大频率对应于 。 此外,一段语音信号可能有几分钟长,直接对整个文件做 FFT 是没有意义的,因为语音信号的频率始终在随时间变化。因此,在进行FFT计算之前,要先将完整的语音信号序列切成许多小段,每一段称为一个音频帧 (Frame)。通常一个音频帧的长度为 N(实际上也就是进行一次FFT计算的点数,即FFT Size),取 2 的幂次方,如512,1024 或 2048。 当然,在分帧方面,连续两个音频帧会有一部分的重叠的,例如,第一个音频帧对应于0-1023区间的音频采样,第二个音频帧则对应于320-1352区间的音频采样,以此类推,直到整个音频文件的末尾。 加窗 经过分帧后的每一个音频帧,在进行FFT计算之前,还需要加窗。在对音频序列进行FFT计算时,如果不加窗,默认就是矩形窗,会导致频谱泄漏和混叠。加窗的目的是让一帧信号的幅度在两端渐变到 0,这样可以让频谱上的各个峰更细,不容易糊在一起,从而减轻频谱泄漏和混叠的影响。当然这样的话,一帧信号两端的部分会被削弱,没有像中央的部分那样得到重视。而弥补的办法就是两个连续的音频帧相互重叠。相邻两帧的起始位置的时间差叫做帧移(也就是Hop Size)。 下图为在语音信号处理过程中常用的窗函数: !image.png 所谓的加窗,就是把音频帧 与相同长度的窗函数帧 逐点相乘: 其结果就是,这一帧信号的首尾被平滑地压低到了 0,这样就强制实现了首尾衔接,消除了断层,避免信号序列起始点和结束点的幅值不一致导致的跳变。 FFT计算与频谱图 接下来就是对加窗后的数字信号序列进行FFT计算,在计算的过程中通过高效的蝶形运算(Butterfly Computation)方式,利用奇偶分解将原本 的计算量降低到 。 对于一个长度为 N 的音频数字序列,FFT 计算结果是相同长度 N 的复数序列。如前所述,因为音频数字序列中全部都是实数,这个长度为 N 的复数序列呈现出镜像对称。 然后计算每个频点的幅度值: ,这代表了该频率分量的强度。因为音频在各个频段上分布的能量跨度极大,必须通过对数映射(dB)的方式转换成分贝值来进行表示:。 最后,将每一帧计算出的频率分贝能量分布(纵轴,使用颜色表示能量大小)按时间顺序(横轴)排列起来,就得到了线性频谱图。 梅尔刻度频谱图 在数字音频领域中,如果是为了进行语音识别或音乐分析,通常会将普通的线性频率转换为梅尔刻度 (Mel Scale)。这是因为人类耳朵对低频的变化比高频更敏感,梅尔刻度能更好地模拟人类的听觉感知。 线性频谱图频率轴上的频率分布是均匀的,而梅尔刻度频谱图的频率轴是前疏后密的,其低频部分非常敏感,而在高频部分则非常压缩。人类的听觉是非线性的,对低频信号更为敏感,我们能轻易分辨出 和 的音高区别,但如果两个频率分别是 和 ,尽管它们同样相差 ,人耳几乎听不出任何区别。 > 梅尔刻度的定义就是为了让等距的梅尔频率变化在人类听觉上感受也是等距的。 从线性频谱图到梅尔频谱图的转换,并不是简单的坐标轴拉伸,而是通过一组梅尔滤波器组(Mel Filter Banks)对线性频率能量进行重新加权聚合。其大致工作流程是: 1. 首先在频谱上放置一系列三角形滤波器:在低频区,这些三角形很窄,排列很密;在高频区,这些三角形变得很宽,排列很稀疏。 2. 将一个音频帧整个频段的幅度数据与每一个三角形滤波器相乘并求和:第一个滤波器会收集低频区的能量,输出一个数值;最后一个很宽的滤波器会收集高频区一大片范围的能量,求和后输出一个数值。就得到了这个音频帧的梅尔刻度的能量分布。 3. 对所有的音频帧均作第二步处理,得到所有音频帧的在不同频段上的梅尔刻度能量分布。 最终,梅尔频谱图上的频点数量取决于梅尔滤波器组的个数,如果之前的线性频谱图中有 1024 个线性频点,通过 40 个梅尔滤波器后,只剩下 40 个梅尔频点。这样的话,梅尔频谱图的横坐标与线性频谱图相同,都等同于音频帧的个数;其纵坐标就变成了由低频到高频的梅尔滤波器组的数量40个。 语音信号频谱的计算示例 下面以语音分类模型(PANNs)代码自带的一个打电话语音文件R9_ZSCveAHg_7s.wav为例,使用torchlibrosa库中的Spectrogram和LogmelFilterBank分别进行线性频谱图和梅尔刻度频谱图的生成流程。 通过以上代码绘制的频谱图如下所示: !image.png 从上面的频谱图可以看到,无论是上方的线性频谱图,还是下方的梅尔刻度频谱图,其横坐标都是音频帧的索引。这个音频文件的长度是7s,采样率32KHz,单通道,总共包含有224000个采样(7s * 32000=224000)。FFT计算频谱的窗口大小为1024个音频采样点,音频帧间隔(Hop size)的样本数为320,因此最终整个wav文件的224000个音频采样被切分为701个(224000 / 320 +1=701)重叠的音频帧。因此,两个频谱图的横坐标都是连续701个音频帧。 线性频谱图的纵坐标方面,因为FFT计算频谱的窗口大小为1024个音频采样点,FFT计算得到的1024个频域结果,因为FFT计算结果是镜像对称的,所以线性频谱图的频点数量就是 . 采样率为32K,每个频点对应的频率就是: - Index 0: (直流分量 DC) - Index 1: - Index 2: - ... - Index 512: 梅尔频谱图是在线性频谱图的基础上生成,在代码中通过mel_bins参数设置梅尔滤波器组的数量为64,按照低频密集、高频稀疏的方式对线性频谱图各个频段的能量进行过滤和汇总,最终在梅尔刻度频谱图的纵坐标上形成64个从低频和高频的能量密度分布。 参考资料 - 语音信号处理中的“窗函数” - 凌逆战 - 博客园

音频3A处理简介:AEC,ANS,AGC

本系列文章完整的总结了消费类摄像头领域中针对音频进行处理的3A(AGC,AEC,ANS)概念理论及其工作原理进行总结,为该领域产品中音频效果的调优和问题接近打下基础。 在消费类摄像头领域中,相比与视频图像方面的3A(自动曝光AE Auto Exposure,自动白平衡AWB Auto White Balance以及自动对焦AF Auto Focus)处理,在对音频数据的处理上同样存在3A处理,也就是音频3A:自动增益控制AGC(Auto Gain Control),声学回声消除AEC(Acoustic Echo Cancellation),自动噪声抑制ANS(Auto Noise Suppression)。本文的目的就是尝试对以上音频3A处理的理论技术以及工作原理流程进行总结。 下图是一个典型的音频3A处理并通过服务器与远端进行语音双向通信交互的流程图: - 麦克风采集的数据,首先要结合收到对端的语音数据信息,识别出来其中的回声,利用AEC回声消除算法消除回声。 - 然后把经过回声消除的语音信息再经过ANS降噪处理过滤掉音频噪声,提升音频采集的品质。 - AGC则用于根据采集语音的幅度动态自适应的调整音频增益,把传输到对端的声音信号强度调整到合适的幅度。 - 对原始音频数据进行编码并通过网络和服务器传输到语音通信交互的对端。 - 对端收到语音信息后利用各种缓冲、丢包重传等机制对音频数据进行整理。 - 对端对收到的音频压缩数据进行解码,恢复出来原始音频数据。 - 最后再结合本地混音等的设置,把原始音频数据在扬声器上播放出来。 !image.png 总的来说,对于音频3A在一个全双工的双向音频对讲的应用中,一般的处理顺序是AEC回声消除最先处理,其次是ANS音频噪声抑制,最后是AGC自动增益控制环节。 声学回声消除AEC AEC要解决的问题则是在双向语音通话中(例如电话会议中),通话一端扬声器发出的声音(这个声音来自于通话的另一端)会被同一端的麦克风收集到,并传输到另外一端,这样就会造成双方说话的声音在两端之间反复回传后形成明显的回声的效果。 下图就是在双向全双工语音通话和电话会议中出现回声的示意图: !image.png 从以上的这个双向通话回音生成原理的示意图上可以看出,只有在双向全双工(也就是通话两端的麦克风和喇叭都保持打卡状态)语音通话的时候才会发生回声的问题。如果是半双工的话(类似于对讲机),是不存在回音及其回音消除问题的。因为,在半双工语音通话的情况下,同一时间只有一方的麦克风打开,而且通话过程中总是一方听完对方说的话以后,才会按下通话键向对方发送自己的语音,这样的话,每次某一方的麦克风打开时,他自己的喇叭是不会发出声音的,这样的话自然就不存在回声和回声消除的问题了。当然,这样的通信方式自然是比较低效的,因为同一时间只能有一方说话。 在具体的回声消除的应用场景中,又往往根据回声产生的路径,把回声分为两种类型: - 直接回声:也称为线性回声。是指远端传输过来的声音信号在本地端的喇叭上播放出来以后,没有经过任何反射和折射,直接被本地端的麦克风所采集的情况。这种直接回声不受环境影响,只与本地端的麦克风和喇叭之间的距离和位置有关,也因此回声产生的时间延迟相对比较好估计。 - 间接回声:也称为非线性回声。是指远端传过来的声音信号在本地端的喇叭上播放出来以后,还要经过本地端环境中的各种障碍物、墙面、地面等反射和折射回来以后,才会被本地端的麦克风所采集的情况。因此间接回声的大小与房间环境、布局甚至各种障碍物的声波吸收系数等均有关。当通话设备本身处于移动状态之下,喇叭和麦克风与回声环境各种障碍物的位置也就在始终变化中,回声的延迟也就是动态变化的,因此,这类回声相对不太好处理。 回声消除问题的处理逻辑 从回声所产生的流程上讲,通话双方A和B,A端的语音信号被A端的麦克风采集以后,传输给B端,在B端的喇叭播放出来以后,又重新被B端的麦克风所采集,与B端本身的语音信号叠加在一起,再传输给A端,这样A端就能在自己的喇叭中听到自己刚才所说的话。因此,整个过程中,A端是无辜的,出现回声问题是由于B端的麦克风在采集声音的时候,把自己的语音信号和喇叭播放出来的A端语音信号混合在一起,未作任何处理直接发给A端,导致A端出现回声问题。 !image.png 因此,回声问题的解决,就要从B端着手,在B端麦克风采集到音频数据后,要从其中识别和分离出来自己的语音信号和喇叭中播放的A端的语音信号,然后把麦克风采集的混合音频信号中的A端语音信号处理掉,只保留自己的语音信号,然后再发给A端。这就是针对这个问题需要在B端引入AEC回声消除模块的处理逻辑所在。 当然,因为A端和B端始终是在全双工双向语音通信之中,双方是对等的,那么在实践中就需要在两端同时分别加入各自的AEC回声消除功能和模块,在这个模块中把自己喇叭播放出来的对端语音信号从麦克风采集的混合信号中识别并消除掉。 回音消除的工作原理 如上所述,所谓的回音消除,就是在麦克风端接收到的混合信号中,把本地喇叭播放出来的远端语音信号识别出来,并且消除掉,确保只有本地的原始语音信号会被被传输到另外一端。那么针对这个设计需求,回音消除模块的实现上一般而言就存在以下四个模块。 1. 时延估计模块。 要把喇叭播放出来的远端语音信号消除掉,首先要能够从本地麦克风采集的混合信号中把该信号识别出来,并确定出来喇叭播放出来的远端语音信号和本地麦克风采集的语音信号之间的时间差。有了这个时间差,才能在后续的处理模块中准确的定位需要削弱的远端语言信号在麦克风采集数据中的位置。 那怎么才能找到两个语音信号(收到远端的语音信号数据,本地麦克风采集的语音信号数据)之间的时间差呢?答案是对两个语音信号做切片处理,分别针对分片的音频数据帧做傅里叶变换,得到其频谱数据,然后通过互功率谱等计算来比较二者在频域上的相似性,直到找到双方的音频数据的频谱表现在哪个切片上一致性最佳,就找到了双方的时间差。 2. 基于自适应滤波器的线性回声消除模块。 该模块是整个回声消除模块的核心所在。 在回声消除算法的具体实现中,以本地接收到的远端语音数据作为输入,通过动态迭代和更新自适应滤波的滤波器权重参数,使其输出信号尽可能接近真实的回声信号数据,最终从麦克风采集到的混合信号中减去自适应滤波器输出的预测回声数据,达到保留纯净本地语音数据的目标。 3. 非线性残留回声抑制模块。 以上基于自适应滤波器实现的线性回声消除模块,仅能消除声学路径的线性回声成分,但是无法完全消除非线性失真。因此,在使用自适应滤波器对线性回声进行过滤之后,就需要利用非线性模块,通过频域能量分析、动态增益控制等手段,进一步抑制残留的非线性回声。 4. 双向对讲检测模块。 该模块通过对远端语音数据以及本地麦克风采集的语音数据的动态监测,判断当前是只有一方在说话,还是双方都在说话。 因为如果双方同时对讲的情况下,本地麦克风采集的音频数据中就同时包含了双方的语音数据,在这种情况下,本地的语音信号就会被误判为回声的残留部分,导致滤波器参数错误更新。因此在算法通过双向对讲检测模块识别到双方正在处于双讲状态时,就会冻结滤波器权重的更新,避免算法因噪声干扰而发散。 而如果双向对讲检测模块检测到当前只有一方在说话时,就可以恢复对自适应滤波器的权重更新,并且提升滤波器的回声抑制强度,彻底消除残留回声,从而达到更好的对讲效果。 结合下图可以更好的理解完整的回音消除算法的实现,及其各个子模块在完整的回音消除流程中所起的作用。 !image.png 自动噪声抑制ANS 我们常用的手机、消费类摄像头等产品的麦克风所采集的原始声音信号中往往包含了比较多的背景噪音,不仅影响用户录音和回放的使用体验,而且这些噪声数据还会降低音频编码的压缩效率,因此有必要对音频底噪进行抑制处理,这就是ANS(Auto Noise Suppression)功能的用武之地。 > 音频3A中对于环境噪音的控制,除了以上的自动噪声抑制ANS技术以外,还存在一个主动噪声消除ANC(Active Noise Cancellation)的环节。ANS与ANC的区别主要在于,前者是采用被动降噪的方式,分析环境噪声中频率成分针对性的对其滤波处理,尽可能保留清晰的语音部分,并提高音质;而后者常见于目前市场上非常流行的主动降噪耳机,针对环境中存在的噪音,对噪声声波的频率相位等分析,产生与噪声相位相反的声音信号来实现噪声抵消的效果。因此两者主要的区别就在于,ANS采用被动滤波的方式进行降噪,ANC则采用主动产生与噪声波形相位相反的方式来实现与噪声的相互抵消。一般而言,在消费类摄像头领域中,对于摄像头麦克风所采集声音数据的处理只会用到ANS,因此本文仅关注ANS方式的被动降噪处理机制。 音频背景噪音的来源 一般来说,对于模拟系统来讲,噪声可产生于系统的各个环节之中,因此模拟系统更容易受到干扰而产生噪声,而对于数字设备而言,抗干扰和噪声的性能要好很多,噪声窜入的薄弱环节总是设备中的A/D、D/A转换部分。在消费类电子领域,从成本等角度考虑,目前模拟音频元件和处理电路仍然是应用中的主流,所以该类型产品中因为各种干扰所造成的背景噪声等方面的声音质量劣化往往是产品开发中的难点所在。 总的来讲,消费类Camera产品的音频噪声主要来源于以下几个方面: - 设备电子元器件运行中的固有噪声。例如,电子元器件(电容、电阻等)在高频运行下本身就会产生细微的白噪声,这些噪声很容易被附近灵敏度高的麦克风拾取、放大后变得清晰可闻。 - 电磁干扰。电路在高频开关切换的运行过程中,尤其设备内部空间中有无线通信电路功能运行时,所产生的高频电磁波辐射干扰,通过音频传输线路窜入模拟音频信号之中,从而产生电磁干扰噪声。 - 电源干扰和接地回路噪声。电源电路中的尖峰、脉冲、浪涌等,通过电源线路窜入音频线路,以及不同电路部分的地线接地电位差导致电流环路,这些电源和接地方面的噪声会对音频的小模拟信号产生显著影响。 从以上音频噪声的来源总结可以看到,这些音频噪声大多数来源于硬件设备相关的设计和实现,其中部分噪声来源是可以优化的,例如通过优化电源接地设计,以及调整布局改善音频线路处理模块的电磁干扰状况,但是不可否认的是,消费类电子产品的结构和电子设计方面的局限性,会导致部分干扰因素无法从硬件层面完全解决。此时就要想办法利用Audio Codec中的音频增强功能甚至软件层面上的音频噪声过滤算法来提升音频采集的质量。 噪声的典型分类及其处理 从总体上,音频背景噪声可以分为两类:平稳噪声和瞬时噪声。 平稳噪声的最大特点就是其统计特性((如均值、方差、频谱分布)不随时间变化。 - 平稳噪声在时域上,振幅波动较小,呈现出规律性分布(如高斯分布)。 - 在频域方面,其频谱连续且稳定,例如白噪声会覆盖全频带。 - 比较典型的平稳噪声场景包括:高斯白噪声、电子设备的热噪声、量化噪声、持续的背景环境噪声(如空调声、风扇声等)。 瞬时噪声则是突发性强、持续时间短(毫秒至秒级)的噪声,其统计特性一般会随时间剧烈变化。 - 在时域方面,瞬时噪声一般具有高幅值、短时间冲击的特性。 - 在频域方面,其能量一般集中在高频或者特定的频段。 - 典型的瞬时噪声包括脉冲噪声(敲击键盘声音、敲门声、开关)、机械冲击声、不规则的电磁干扰(如静电放电)等。 总的来讲,对于平稳噪声的处理,因为其统计特性及其频谱分布相对比较稳定,容易识别,因此可以根据噪声的频谱特性和具体的信号特征进行针对性抑制,相对容易处理。但是瞬时噪声在时域上突发性很强,而且频谱基本上总是和正常语音的频谱混叠在一起,很难进行抑制,因此技术上对于瞬时噪声如何有效的抑制缺乏好的解决方案。 典型的音频降噪算法:谱减法,自适应LMS滤波 下图是典型的音频降噪算法的处理流程图。无论是传统的信号处理算法,还是基于AI增强处理的思路,最终都是要对音频噪声的类型进行检测,对噪声模型进行建模,然后基于噪声的模型针对性的进行处理。 !image.png 以下以两个常用的传统音频数字信号处理模式的音频降噪算法,即谱减法和自适应LMS滤波法对音频降噪的流程进行解释和说明。 谱减法 谱减法是一种基于频域的噪声抑制技术,也就是通过对噪声频谱的估计和建模,在频域中从包含噪音的混合信号中减去噪声成分的处理方式。既然是基于频域的处理方式,那么总体的处理流程中,就不可避免地要使用FFT把时域中采集的音频采用数据序列转换成频域的频谱序列 ,在频域中进行处理后,再通过IFFT把处理后的信号转换回时域。这样的处理流程自然就涉及到加大的运算量。 谱减法的整体工作原理是,在语音静默段(也就是仅含噪声的时间里面)估计和建立噪声功率谱模板,然后从包含噪声信号在内的混合信号的功率谱中减去噪声模板的功率谱,从而达到只保留语音成分的目的。 基于谱减法进行音频噪声消除的工作流程大致如下: - 首先对音频在时域中的采样数据序列分片处理,分片的时长固定并与要计算FFT的点数相一致,例如在16KHz音频采样,进行512点FFT计算的情况下,以32ms为单位进行音频数据的分片,一个音频分片单位就是一个音频帧。 - 对这个音频帧进行FFT计算,得到其频谱数据。 - 通过一个独立的VAD检测模块,检测当前是否处于语音静默期。在当前处于语音静默期的情况下,基于当前通过FFT计算得到的频谱序列对噪声功率谱模板进行动态的更新,使之与当前的噪声频谱状态相一致。 - 针对当前音频帧的频谱数据序列,在频域执行谱减运算:也就是把当前音频帧的频谱数据,与当前噪声功率谱模块的同频数据进行相减,在当前音频帧的频谱上减去噪声的功率谱,得到仅保留通话语音成分的频域数据。 - 最后再通过IFFT把处理过的数据从频域转换回到时域,重新合并为音频数据序列,恢复为时域的连续音频采样信号。 自适应LMS滤波算法 不同于在频域工作的谱减法,LMS滤波算法是一种在时域工作的自适应滤波器算法,通过动态比较音频实时采样的数据序列与滤波器的输出,通过其计算误差迭代调整滤波器系数,来实现最小化期望信号与滤波器输出之间的均方误差。 自适应LMS滤波器主要有两个参数: - 滤波器阶数L:用于建模的噪声长度,用于匹配噪声的时间相关性。L越大,意味着对于每个音频采样的过滤会参考越多的历史采样数据,计算量也越大。典型值为64-256之间。 - 补偿μ:主要用于控制噪声变化跟踪的收敛速度和稳定性,典型值为0.001-0.01之间。 自适应LMS滤波算法的执行流程: - 首先把当前要进行过滤的音频采样数据input,以及该采样之前的L-1个历史音频采样数据放在缓冲区History中。 - 基于History历史缓冲区数据以及LMS滤波器的当前参数W,计算LMS滤波器的输出值Y:累加历史采样数据History[i]与滤波器参数W[i]的乘积。 - 计算当前音频采样数据input与以上计算出来的LMS滤波器输出Y的差值E,这个差值E就是经过LMS自适应过滤的值。 - 基于以上差值E、历史缓冲区中的采样数据History[i]、LMS滤波器的μ对滤波器系统的运行参数W[i]进行更新。 - 返回以上计算出来的差值E。 以下是一段进行自适应LMS滤波算法处理的参考代码,可以配合理解以上的执行流程: LMS自适应滤波算法在应用中还经常会配合双麦克风来实现更好的降噪效果。主麦克风靠近人的嘴部用于采集人说话的声音,副麦克风远离嘴部并放在噪声源附近(如耳机外侧)用于采集环境噪声,工作的过程中用副麦克风采集的环境噪声数据训练和更新LMS滤波器的参数,然后对主麦克风的音频采样数据进行过滤。这种方式对对周期性噪声(发动机声、风扇声)的抑制效果极佳。 - 当然,如果要使用主副麦克风的话,以上LMS过滤算法的执行流程和对应的代码,就需要增加一个参考音频信号(来自副麦克风)的采样序列,History和LMS滤波器的输出及其参数更新基于副麦克风的采样数据进行计算,对于主麦克风采样数据的过滤则使用主麦克风的采样数据减去LMS滤波器的输出即可。 从以上的谱减法和自适应LMS滤波算法的实现比较来看,谱减法要涉及到频域和时域之间的两次相互转换,因此数据的计算量是比较大的,但是对于一帧音频数据进行一次运算;而自适应LMS滤波算法是直接在时域中进行运算,但是针对每个采样都需要执行两次与滤波器阶数相同的浮点数运算,分别用于计算滤波器输出和更新滤波器的运行参数,所以如果滤波器阶数比较高的话,计算量也会比较可观。但是总的来说,后者对于计算资源的要求更低,更适合用于资源有限的嵌入式系统。 音频自动增益控制AGC 在音频通话和视频会议中,音频自动增益控制AGC模块的主要作用: - 稳定音频信号的输出电平。无论麦克风采集信号的强弱(如用户离麦克风远近程度不同),尽可能保证音频采集模块的输出音量保持相对一致,不会偏大造成消波,也不会偏小导致听不清楚。 - 动态适应音量采集的变化环境。即可以应对环境中噪音变化、设备差异(如不同麦克风灵敏度)、用户说话习惯差异,动态自动调整语音信号的强度,使得其输出保持在一个合适的水平。 在常见的消费类电子产品的音频编解码器Audio Codec的处理链路之中,AGC模块一般工作中经过ADC转换之后的数字域处理环节,通过DSP算法来实现动态调整语音信号数据增益的功能,这样的处理方式灵活性更好,并且可以与其他DSP算法如降噪、AEC等协同优化。当然,一些低端的Audio Codec(例如TLV320AIC3101)内部缺少丰富的数字音频处理功能,那么AGC模块也可以直接在模拟域对PGA的增益进行调节来实现自动增益控制的效果。如下图是TLV310AIC3101的AGC处理链路。 !image.png 另外,我们只有在音频信号的输入链路的处理中,也就是对麦克风采集语音信号的处理中,才会用到AGC动态调整增益来实现语音信号强度基本保持一致的效果;在音频信号的输出链路,也就是对扬声器播放语音信号的处理链路之中,一般是不需要AGC的,此时对于输出语音信号的大小通常由用户手动设置或系统音量管理,无需自动增益。 AGC音频处理链路与VAD模块 一般而言,从麦克风采集到的声音信号中,除了真正的我们想要保留的本地端语音信号以外,不可避免地还会包含有一定的噪声、双向对接状态下的回声等,而AGC既然是通过调整音频采样数据的增益来维持音量的稳定性,那么其要稳定的对象势必是尽可能去除了噪声和回声的本地端语音信号,这就是在音频3A链路中,应该把AGC放在AEC和ANS之后进行处理的原因所在,因为我们要进行音量自动增益控制的对象并不包含回声和噪声。 !image.png 以上的噪声和回声分别在ANS和AEC环节处理后,在AGC自动增益控制的处理流程中,还包含一个VAD(语音活动检测)模块用于决定何时启动音频采样数据的增益调整。VAD模块的主要目标就是对麦克风连续采集的语音信号区分为语音段与非语音段(如静默或背景噪声),只在语音段才会激活AGC对音频数据的增益进行动态控制,非语音段抑制增益调整或维持固定增益,防止放大噪声,避免AGC的动态增益调整对非语音信号产生负面影响。 VAD模块对于语音段和非语音段的判决,以音频帧为单位,对音频帧内音频采样数据的均方根能量进行统计,与VAD模块维护的动态本地噪声的能量进行比较,若当前帧能量高于动态噪声本底+固定偏移(如+3dB),可判定为语音段候选,再结合状态机控制机制(如连续多帧高于阈值判定为语音段,连续多帧低于阈值判定为非语音段),给出语音段和非语音段的最终判决。 AGC的处理流程 1.音频采样数据的预处理 如上所述,AGC工作在Audio Codec的数字域,也就是对麦克风采集信号经过ADC以及其他音频处理模块处理后的数字采样序列中执行自动增益处理的流程。在该环节,首先对连续的音频采样数据进行切片处理,把连续的音频数据切分为固定采样数量的音频帧,后续的AGC处理是以音频帧为单位。 在AGC的分帧处理上,一般会采用50%重叠的方式进行处理,即当前音频帧的前50%采样与上一个音频帧的后50%采样相同,以平滑音频帧的边界效应,避免两个连续的音频帧增益不同造成的突变。 2.VAD检测 如上所述,VAD模块通过比较当前音频的帧能量与噪声本底的能量,判断当前音频帧处于语音段还是非语音段。 AGC的流程中一般仅在语音段触发AGC增益调整。 3. 自动增益的计算阶段 自动增益的计算阶段要依赖于AGC模块的几个提前预设值: - 目标电平,也就是对于AGC模块的调整而言,期望AGC模块的输出能够达到的目标音量水平。 - 时间常数,表示增益调整的时间参数,用于控制增益调节的平滑度,避免声音音量忽大忽小。 在计算增益时,对当前音频帧的能量和目标电平进行比较,当当前帧能量高于目标电平时,应适当减小增益以避免音频采样数据叠加增益后过载;而如果当前帧能量低于目标电平,则增大增益提高音量的幅度。 针对信号的动态范围比较小(信号幅度的差异不大)的应用场景,一般就可以简单的选择线性增益调整模式:即根据当前音频帧的能量与目标电平的差异确定一个增益的大小,对所有的音频采样进行相同的增益调整。 而针对复杂信号环境(如突发噪声、多频段干扰),则需采用非线性增益的调整策略: - 动态范围压缩(DRC)。DRC是一种通过非线性增益调整信号动态范围的技术,不仅可以用于语音信号的处理,也广泛应用于通信系统和智能设备领域中。DRC的工作大致依赖于三个参数:threshold_low、threshold_high和ratio。其工作逻辑大概为:当音频采样的幅度和能量低于threshold_low阈值的时候,DRC就会设置比较低的增益以抑制噪声;当音频采样的幅度和能量在threshold_low和threshold_high之间的时候,DRC按照前面计算出来的目标增益对该音频采样进行设置;而当音频采样的幅度和能量大于threshold_high时,就按照ratio的设置,对这个音频采样的增益进行适当压缩,以避免出现消顶的问题。 - 多频段增益控制。首先通过FFT运算执行频带分割,把信号分为低频、中频、高频子带;然后对每个子带单独计算并调整增益,这样可以避免整体调整所导致的频谱失衡问题,整个处理方式有点类似于EQ的工作流程了,对于不同频段设置不同的增益,或者抑制,或者增强。 此外,自动增益计算和调整的时间常数则主要包含两种类型的时间参数,用于实现增益和调整后语音幅度的平滑和自然变化: - 启动时间(Attack Time):当音频信号的幅度突增时,快速降低增益(典型值20~100ms),防止出现瞬时过载的问题。 - 释放时间(Release Time):当信号幅度减弱时,则缓慢恢复增益(典型值100~2000ms)。 4.增益的应用阶段及其后处理 AGC处理的最后阶段,就是把计算阶段所计算出来的增益应用到当前音频帧的所有采样数据上。根据前一阶段采用线性或者非线性的增益计算策略,针对性的对音频采样设置一致或者不一致的增益。 此外,经过以上AGC处理以后的音频采样序列数据,还需要限制其幅值(如-1dBFS),防止DAC或扬声器过载;以及与前面阶段的AEC、ANS等音频处理模块反馈联动,实现对音频数据的稳定控制。 参考资料 - 音频自动增益控制 AGC 解决的问题及原理解析 - 知乎 - 回声消除(AEC)原理、算法及实战——AEC背景介绍-CSDN博客 - 音视频处理三剑客之 AEC:回声产生原因及回声消除原理_ZEGO即构科技的技术博客_51CTO博客 - 音频3A算法初步学习 - 令音频工作人员头疼的“噪声”来源及解决办法

G711音频压缩标准的实现详解

G.711是ITU-T所定义的一种音频压缩标准,广泛应用于电话通信网络和VoIP领域。在具体的实现上,G711的音频编解码又可以分为u-law(主要应用于北美和日本)和A-law(主要应用于欧洲和世界的其他地方)两种形式,在本文中分别进行说明。 G.711在电话通信应用中所定义的采样率是8KHz(需要明确的一点是,G.711音频编码算法本身并不限制采样率,这里的8KHz采样率是电话通信网络的兼容性要求,因此如果要考虑通话系统中不同厂家的设备之间的兼容性,应该采样标准所定义的8KHz。而如果只是要在通信两端使用G.711对音频数据进行编解码,不需要考虑与其他厂家设备的兼容性的话,完全可以采用更高的采样率。),音频的每次采样产生一个16bit的采样原始数据,这种情况下原始数据的码率就是8000Hz x 16bit = 128Kbps。G.711音频编码算法对音频采样的原始数据进行编码,每个音频采样的16bit数据会被压缩为8bit,压缩率为2:1,因此针对8KHz的采样率产生出来64Kbps的编码数据。 如上所述,G.711音频编解码算法的具体实现上主要有两种主要的编码方式:μ-law(北美和日本使用)和A-law(欧洲和其他地区使用)。无论是μ-law还是A-law,都是非线性量化方法,在进行音频数据编码时通过对数压缩来优化动态范围,这样可以使得在低音量时具有更高的精度,而在高音量时精度较低。 G.711 Alaw的理论及其实现 对于音频采样数据进行G.711 Alaw编码和解码的理论公式如下所示。其中A一般采用87.6的常数值,sgn(x)是取符号函数,x为正数时返回1,负数时返回-1;x为音频采样数据在(-1,1)之间的归一化值,即每个16bit音频采样数据的最高位为符号位,在按照下面的公式计算之前先把去掉符号位的15bit数据除以32768,再合并最高位的符号位得到(-1,1)的归一化数据。 编码公式: !image.png 解码公式: !image.png 下图是按照以上公式所画出来的音频采样归一化数据与经过alaw编码后的映射图。可以看到在音频采样值x比较小的时候,它在图中映射对应的F(x)的变化非常剧烈,x的微小变化就会导致F(x)的剧烈变化,因此在采样值较小的情况下,alaw的编码精度比较高。而在采样值比较大的情况下,F(x)的变化幅度就比较小了,采样精度相对也就比较差。 !image.png 按照以上所描述的G.711 Alaw音频编码流程的代码实现如下所示: 具体的实现中,首先调用normalize_16bit_to_float进行音频采样数据的归一化计算,把16bit采样数据归一化到(-1,1)之间;然后再调用a_law_encode进行编码,编码结果就是一个无符号的单字节数据。 但是如果按照以上公式进行alaw的编解码运算符的话,涉及到log等对数运算,这一点对于之前在电信领域早期的电话系统中硬件资源有限的情况,挑战很大。所以在alaw的具体实现上,为了节约宝贵的计算资源,一般采用十三折线法逼近alaw的理论曲线来降低计算复杂度。十三折线法通过分段线性逼近 A-law 的非线性特性,将输入信号的动态范围划分为多个区间,每个区间用一条直线来近似。这种方法既保留了 A-law 的非线性特性,又大大降低了计算复杂度。 !image.png 按照十三折线法进行alaw运算时,16bit音频采样数据首先要通过右移三位变成13bit数据,然后对这个13bit数据进行如下计算分别得到符号位(1bit)、指数部分(3bit)和尾数部分(4bit),最后组合为一个8bit数据: - 首先取13bit数据的最高位为符号位。将其取反得到s; - 通过对剩下的12bit数据进行判断,根据其bit1出现的最高位的位置决定指数部分的取值,从0b000-0b111,也就是指数位eee; - 从12bit数据最高的bit1位置向右取四个bit,也就是尾数位abcd; - 最后组合符号位、指数位和尾数位这三个部分为seeewxyz,编码完毕。 以上工作逻辑如下图所示: !image.png 以下是从音频采样的16bit数据进行G.711 Alaw压缩的代码片段。 G.711 ulaw的理论及其实现 G.711 ulaw压缩算法主要应用于北美和日本市场,编码的理论公式如下所示: !image.png - 进行以上计算之前,仍然要像alaw一样,先把16bit采样数据归一化到(-1,1)之间。 - 以上计算公式的输入为归一化到(-1,1)之间的16bit音频采样数据,输出则是音频采样压缩生成的8bit编码数据。 解码的公式如下图所示: !image.png - 以上计算公式的输入为G.711编码生成的8bit压缩数据,输出为(-1,1)区间范围的解码数据,具体要进行播放时需要重新映射为16bit的音频采样数据,通过audio codec播放出来。 在G.711 uLaw的具体实现上,与alaw的实现类似,同样采用折线法来逼近uLaw的曲线以减少计算的工作量。不同的是,alaw采用十三折线法,进行折线计算的数据是音频采样右移三位的13bit数据;而ulaw采用十五折线法,进行alaw的折线计算时首先对音频采样数据右移二位变成14bit数据。 十五折线法实现的流程可以基于下表来使用查表的方式来实现: !image.png 以音频采样数据经过右移2位后数据是1234为例,解释十五折线法具体的查表实现流程如下: - 首先通过查询上表取得区间范围值,查表可以得到1234位于以下区间: +2014 to +991 in 16 intervals of 64 - 根据以上的区间范围值得到其基础值为0xA0,间隔数interval为64 - 以上区间范围的初始值为2014,再当前值1234和区间范围初始值的差异为2014-1234=780 - 基于以上的差异值计算偏移值:780/间隔数=780/64,取整得到12 - 最终得到的输出为0xA0+12=0xAC。 可参考以下代码实现: 总结 - 无论是G.711a还是G.711u,实际上都是一种对于单个音频采样数据进行压缩的算法,两者在压缩的实现原理上,都是在小信号区域提供更高的量化精度,而在大信号区域减少量化精度,从而在有限的比特率下实现高效的语音编码。 - 尽管在电话领域中所采用的G.711音频编码要求固定的使用8K采样率(采样率固定为8K,码率固定为64Kbps),但是实际上对于G.711算法本身的实现而言,因为它是对单个音频采样数据进行的编码处理,算法本身对采样率并没有特定的要求。这里的8K采样率的要求只不过是为了满足音频通话的需求(4KHz对于大多数音频通话而言足够使用了),较低的采样率也意味着较低的计算工作量,所以通话双方都采用8KHz来进行采样和编解码的话兼容性就没有问题。而如果音频通信的两端能够通过其他机制自动识别采样率的话,使用G.711编码时完全可以采用更高的采样率,例如16KHz、32KHz等,只不过这样的话码率就会大一些。 - 至于alaw和ulaw计算中所采用的十三折线法或者十五折线法,同样是基于减少计算工作量的角度出发,采样折线拟合的方式去逼近alaw和ulaw的对数曲线,这一点与二三十年前电信通信领域中所采用的处理器具备的计算能力不足相关。如果处理器的计算资源不是瓶颈的话,直接采用对数运算来进行G.711编码当然也是没有任何问题。 参考资料 - 音频处理——G711标准详解_g711a和g711u区别-CSDN博客 - A律十三折线法G711编解码介绍_13折线a律编码-CSDN博客 - G.711编码原理 - 简书

Nuvoton ISD9160本地语音识别解决方案

Nuvoton的ISD9160处理器本身实际上只是一个基于ARM Cortex-M0核心的32bit通用低功耗处理器。与其他的ARM MCU相比,其最大的特色是内置有高精度的audio codec,因此比较适合应用于一些低成本音频录制和回放功能的产品应用场景。 - 最高运行主频50MHz,内置145KB Flash以及12KB SRAM。 ISD9160之所以能够实现本地语音识别的功能,除了它具备以上的硬件素质之外,最重要的是,第三方语音算法公司Cyberon专门开发的语音识别算法能够完整的运行在ISD9160上。并且Nuvoton基于该算法在ISD9160的基础上完成了一个完整的本地语音识别的解决方案。对于产品开发者而言,只需要做很少的工作就可以把本地语音识别的功能整合到自己的产品中。 !Untitled.png - 使用ISD9160进行语音类型产品开发的外围电路非常简单,麦克风和Speaker分别直接接到芯片的MIC和SPK引脚上,另外需要外接一个Flash用于保存需要通过Speaker播放的音频文件。再加上晶振、电源等就构成产品的完整电路图了。 - 如果需要把ISD9160作为音频识别方案,整合到一个更复杂的产品中,可以把ISD9160与其他的处理器使用串口连接,音频的采集、识别和播放功能全部交给ISD9160来进行处理,语音识别的结果通过串口发给其他处理器。 基于ISD9160进行语音识别功能的大致开发流程 1. 基于每个产品要支持的语音识别功能的需求,在产品定义的时候要首先确定好支持的语音命令列表(例如打开灯、开始录影等)。然后由芯唐基于客户选定的语音命令列表生产一个Bin文件(..pack.bin),这个文件到时候要烧录到ISD9160内部Flash的指定位置; 2. 在产品运行的过程中,ISD9160从麦克风上以16bit、16KHz采样率、Mono的音频格式进行音频采集,然后在其应用代码中把采集的音频数据送入Cyberon的算法进行识别,基于识别结果执行不同的指令; 3. 在产品的开发过程中,pack文件是Cyberon基于用户的语音命令列表来生成的。如果要提升语音命令识别的成功率和准确率,还需要产品开发者在开发过程中进行一些调优,这个调优的过程也就是该方案所说的Adaptation的过程。 !Untitled.png 实际上如果产品对于音频识别的正确率要求不是很苛刻,或者用户的发音足够规范,那么直接使用芯唐/Cyberon提供的Video Recognition模型文件(pack文件)就可以了。但是如果对语音识别率有更高的要求,开发者就需要基于原厂提供的pack文件进行更多的优化,具体而言就是使用Cyberon提供的软件工具进行进一步的算法模型调优工作。 Cyberon语音识别算法的运行要求 Cyberon的语音识别算法要能够正确的运行,对于送入算法的语音信号的信噪比有一定的要求:Cyberon要求语音信号的信噪比SNR大于10dB。 那么如何基于已经开发好的硬件进行Audio信号的信噪比,判断某种环境下的语音信号质量是否能够满足Cyberon的要求? - 视频课程中提供了一个大致的办法,需要用到几个软件工具: - Nuvoton在ISD9160上开发的一个Record_16kHz_PCM_Uart sample,这个sample烧写到ISD9160中以后,会从麦克风上采集16bit、16KHz采样率、Mono的音频数据,通过串口传输出去(波特率921600); - 对于测试音频数据的采集,需要关闭FW中MIC初始化的AGC功能,以避免AGC对于音量的影响; - Cyberon的VoiceRecorder,可以从串口接收以上sample发过来的音频数据,保存或者播放; - CoolEdit音频分析工具; - 测试流程:在ISD9160上运行Record_16kHz_PCM_Uart sample,然后在PC上打开VoiceRecorder,从串口接收并保存ISD9160的测试语音录音;然后对保存的语音文件使用CoolEdit进行分析,比较背景音和语音命令的信噪比平均值,大概就能了解这种测试场景下的语音命令是否能够正确识别; 语音识别算法的调优流程 语音识别算法正确率优化需要用到的软件: - Nuvoton Record_16kHz_PCM_Uart sample,可以从产品板上直接进行测试音频数据采集; - Voice Collector,与以上的Nuvoton Record_16kHz_PCM_Uart sample配合,基于产品板进行Voice Recognition模型训练音频文件的采集、保存的自动化流程; - AutoResampler,如果用于进行模型训练的音频数据是用其他工具采集到的,格式可能不符合模型训练工具的要求,就需要使用这个AutoResampler工具转换成标准的格式; - CSpotter Offline Modeling Tool,Voice Recognition模型的离线优化工具,基于前面从产品板上采集的训练音频数据,或者从其他来源转换的训练音频数据进行模型优化; 模型优化流程: !Untitled.png - 训练数据的采集和准备: - 基于产品板+Nuvoton Record_16kHz_PCM_Uart sample+Voice Collector,针对要支持的每条命令进行多次语音采集,采集后的语音会自动保存在Voice Collector指定的目录中; - 如果语音模型训练的数据来自于其他方式采集的音频,使用AutoResampler工具进行转换; - 把以上语音识别模型的训练数据,导入到Cyberon提供的CSpotter Offline Modeling Tool工具软件中,再针对每一条语音命令进行模型训练和对应参数的优化,通过这个Adaptation过程可以有效的提升识别率和降低误识别率。 其他优化策略: - 对于提升识别率而言,9160最多能够支持20条语音命令的识别,但如果产品中用不到这么多,可以把发音类似的语音指向同一个命令,可以有效提升识别率; - 对于降低误识别率而言,可以采用类似的思路,针对一些与实际语音命令发音相仿的语音,设置一个负数的rewared值,可以降低这个相仿语音所造成的误识别率; 回放音频文件的准备 除了应用于语音识别功能,在具体的产品设计中,可能也会用到ISD9160来播放一些固化到产品中的音频文件。 针对这些可以在产品中播放的音频文件,Nuvoton提供了一个Audio tool的工具来实现音频文件的转换和rom打包。 Audio tool可以实现把wav等格式的音频文件转换成md4格式的压缩音频数据,并把所有的md4音频数据打包成一个ROM包,后续把这个ROM包烧写到外部flash中,就可以在应用程序中指定音频文件的索引来播放对应的音频了。 - 也可以在keil中进行设置,在编译FW工程项目的时候自动调用audio tool进行音频格式转换以及音频文件打包的过程。 - wav格式的原始音频数据可以使用tts来生成,也可以使用上面的Record_16kHz_PCM_Uart sample+VoiceRecorder的方式自行录制。 参考资料 - Nuvoton ISD9160 Design Guide. - Nuvoton ISD9160语音识别开发教学视频.