如果早知道,音频也可以自动化......

文摘   游戏   2024-02-02 18:00   浙江  

我们在测试过程中经常遇到各种各样的音频问题,比如起跳和落地声音没有了、冲刺脚步声缺一只脚、武器声音不停、VO忽大忽小等。音频作为游戏的一个重要组成部分,在测试时却比较容易被忽视或无法充分测试。本文探索了针对音频的自动化测试,可以帮助我们快速发现音频中的一些问题。


01 前言

作为一个FPS游戏玩家,一般会有三种情况让我急得想骂人:

其一、卡了!

其二、挂!

其三、怎么没声啊!

前两种暂且不在本文的讨论范围内,第三种情况一旦出现,对游戏的体验会产生极大的负面影响。下面列举几个最近的音频相关bug。

1.

APEX音频丢失

脚步声远近有问题,队友脚步忽大忽小,枪声、技能音效丢失等各种乱七八糟的问题。

2.

守望先锋响度异常

OW2上线的时候就有的问题,个别英雄大招台词音量明显比其他人大一截,倒也没影响游戏性,就是非常吵。


3.

边境音频错误

播放了错误的音频和音效残留问题。

4.

R6S音频丢失

游戏内声音直接没了,基本属于是可以摘了耳机自由自在地玩了。

FPS游戏中,信息收集就像一个自行车,前轮是画面,后轮是声音,缺了一个直接就成了独轮车了。毕竟,能够听到逼真的枪声、爆炸声和其他环境声音,是游戏体验的重要组成部分之一。但是,如果游戏中出现了缺失、重复或低质量的音频,那么玩家将很快失去兴趣,甚至可能会怀疑游戏的质量和制作水平。

我们在测试的时候也经常遇到过各种各样的音频问题,比如起跳和落地声音没有了、冲刺脚步声缺一只脚、武器声音不停、VO忽大忽小等。一般来说这种问题都会有相对应的测试用例,测试的时候戴上耳机注意听一下基本就能发现绝大多数的问题。但是相对于功能表现来说,音频是很容易被忽视的一个点,有的时候可能刚好没带耳机,或者在关注一些表现的时候,声音上的问题就被错过了。因此,我们可以把音频也尝试加入自动化检查流程,让一些音频问题在上班之前就开始检查。

02 流程总览

我们的可以在日常的自动化中附加一个音频自动化测试的流程。

在项目组中,我们在日常自动化测试的脚本中插入录制指令函数,在某些状态下录制我们的音频文件;

在所有自动化测试脚本都结束之后,统一按照文件名来进行相似度分析(我们选取的base可以通过版本控制来管理,每日录制的就无所谓了)。

分析结束后结果会附在自动化报告中,QA在看自动化报告的时候需要重点关注相似度数据异常的音频片段和其对应的状态。目前项目组这边采纳了八种参数,其中满足两种情况的一种我们就认为这个音频是正常的:

1.所有数据在85以上;

2.小于85以下数据不超过2项且存在95以上的数据;

03 具体操作步骤

我们以检查某一把枪的枪声,比如AK47为例,来介绍一下流程中步骤的具体操作


1.

录制音频

首先,我们要先做到能够正确地录制AK47在游戏内的开火声音,并且是能够在自动化脚本中发起录制音频的请求。

最开始录制使用的方法是利用windows自带的立体声混响搭建声卡回环并使用python的Soundcard库进行录制,但是实际录制出来的音质确实垃圾,基本属于是用不了的声音文件。

从我们的需求来说,录制这块不一定非得自己去实现,用那些现成的命令行工具也可以满足我们的需求。于是我又去找了一些支持命令行调用的录制工具。最后使用了fmedia这个工具搭配VBCable虚拟声卡来实现调用命令行实现游戏内录的方法。

这个流程其实很好理解,我们把输出设备和输入设备都设置成我们的虚拟声卡,游戏的声音就会通过这张虚拟声卡播放出来,而这个虚拟声卡的输出又连接着输入设备,也就是他的麦克风,这样我们使用音频录制工具来录制麦克风就能达成录制游戏内声音的目的了。

我们基本是在游戏客户端内发起录制的,比如说自动化脚本执行到AK开火的时候录制一下音频。lua虽然也能直接调用命令行工具,但是调用的时候会弹小黑框,即便你开了Log、已经有黑框了也依旧会卡一下。我们的需求是在游戏进行自动化测试的时候能够在自动化脚本中调用一些函数来进行录制,这边用的方案是本地利用python来起一个简单的http服务器,通过客户端发http请求的方式来通过命令行调用录制程序进行录音,这样就避免了录制卡顿的问题,并且也可以控制文件名和录制时长。
我们可以在自动化脚本中插入录制命令函数,在控制AK47开火的同时进行音频录制,样本的话第一次跑的时候录制然后听一下没啥问题之后放到Base里作为基准就行了。

2.

特征提取

既然是要对比两个音频的相似度,那肯定是要找一些能比较的点的,这个比较的点就是音频的特征值

特征值就像是一个人的标志,它能够代表这个人的某些重要特征或个性。比如,一个人的身高、体重、眼睛颜色、头发颜色等都可以作为他的特征值。同样的,对于音频数据来说,它也有自己的特征,比如像音频的频率和时长等。

总的来说,特征值就是数据中那些重要的标志,能够代表数据的某些特征或属性,它们可以帮助我们更好地理解和处理数据,也是机器学习模型的重要输入。

下面介绍几个常用的特征值:

(1)Mel频率倒谱系数(Mel Frequency Cepstrum Coefficient,MFCC)

MFCC是一种用于语音处理的技术,它可以将语音波形转换为数字特征,就像我们可以用字母和数字来描述一段话一样。这些数字特征可以用于许多语音相关的任务,例如语音识别、说话人识别等。MFCC的方法是通过模拟人耳对声音的感知方式,将声音信号在频域上进行分析,并提取出一些关键的频率特征。这些特征可以用来表示语音信号的语音学特征,从而提高语音处理的效果。

(2)短时能量

短时能量是一种音频特征,用于描述短时间内音频信号的强度或能量大小。通俗地讲,就是用来衡量音频中瞬间的音量大小。它通常通过将音频信号分成许多小块(称为帧),并计算每个帧的能量来计算。在音频处理和分析中,短时能量是一种常用的特征,可用于声音检测、语音识别、音频压缩等应用。

(3)频率

频率指的是某个事件或现象在一定时间内重复发生的次数,通常用赫兹(Hz)来表示。可以理解为,频率就是一个东西震动或者变化的速度快慢,比如声音的高低音调、电信号的频率等。我们可以通过测量事件在单位时间内发生的次数,来确定其频率大小。

(4)时频分析

时频分析是一种用来描述信号在时间和频率上变化的方法。简单来说,它可以告诉我们一个信号在不同时间和不同频率上的强弱程度或者变化情况。比如说,当我们听到一首歌曲时,时频分析可以帮助我们理解音频中音乐元素的变化,比节奏、旋律和音调等。

当然以上知识都需要回去复习一些数学基础知识,尤其是这个傅里叶变换

看到上面的一些东西,你可能会就觉得:“哎呀这么多数学的东西,死去的回忆开始攻击我了”。先别急,我们实际在开发过程中并不需要去写这么多计算式,python的很多科学计算库都已经替我们封装好了,直接用现成的轮子就好了。

下面登场的是音频分析超好用的轮子——librosa

librosa是一个基于Python的音频和音乐信号处理库,它提供了许多常用的音频特征提取方法、音频分析工具和音频可视化工具。librosa旨在为音乐信息检索、音频信号处理、音乐分类、声音分析等领域的研究人员和开发人员提供一个易于使用的工具。

librosa的主要功能包括:

  • 音频文件读取和写入:librosa可以读取和写入多种音频文件格式,如WAV、MP3、FLAC等。

  • 特征提取:librosa提供了许多常用的音频特征提取方法,如MFCC、Mel频率谱、色度图、节拍跟踪等。

  • 音频分析:librosa提供了许多音频分析工具,如节拍跟踪、音高估计、音频源分离等。

  • 可视化工具:librosa提供了许多音频可视化工具,如波形显示、频谱显示、色度图显示等。

具体API自己查看手册就好,有了这个库我们开发调试就变得又快又方便了。

3.

相似度度量

上个部分我们了解了常用的几个特征值,使用我们的librosa或者其他库就可以取到录制下来的音频数据的特征值了。在有了特征值之后,就可以简单地对两个特征值进行比较了。

(1)余弦距离

余弦距离是一种用来比较两个向量之间相似度的方法,其值越小意味着两个向量越相似。余弦距离是通过计算两个向量之间的夹角余弦值来衡量它们之间的相似度。具体来说,余弦距离等于两个向量之间的夹角余弦值的余弦值。

余弦距离的取值范围是0到1之间。当两个向量完全相同时,余弦距离为0;当两个向量完全不同时,余弦距离为1。余弦距离越小,表示两个向量之间的相似度越高。

(2)欧几里得距离

欧几里得距离是一种用来计算两个向量之间的距离的方法,它也被称为直线距离。在二维平面上,欧几里得距离就是两个点之间的直线距离。在三维空间中,欧几里得距离就是两个点之间的空间距离。

(3)互相关函数

互相关函数是一种用于衡量两个信号相似性的方法。互相关函数可以接受两个信号作为输入,并计算它们之间的相似性值。可以通过设置对齐方式来控制信号的对齐方式,常用的对齐方式包括完全对齐、仅计算重叠部分和保持信号长度等。

(4)差分函数

差分函数可以用来计算序列中相邻元素之间的差值,它可以接受一个序列作为输入,并返回一个新的序列,其中每个元素表示原始序列中相邻元素的差值。

当然了,这部分虽然也涉及了很多的数学知识,但是仍旧不用为计算的问题头疼。sklearn、scipy这些科学计算库已经封装好我们需要的很多函数了,直接调用就能解决我们的需求了。

04 实际操作

了解了上述知识,我们就可以依照这个流程来进行开发调试了。

录制和加载没什么好说的,直接照着上文的方法干就完了,主要的难点还是在分析上。

分析的话需要先配置一些环境,这边建议用conda+jupyter来搞。调试过程中建议使用vscode+jupyter插件,写和调试都比在网页上的方便。

实现的思路都在刚才的知识点里了,无非是加载两段音频,进行预处理后提取特征值并计算相似度,大家感兴趣的可以动手实践一下。

我们可以对AK47的枪声进行检查来进行实际操作一下,流程就是在自动化脚本中控制开火并录制音频、将音频扔进分析脚本进行分析并计算数据、根据数据结果进行分析。在整套流程开发完之后,我们只需要看看最后计算出的数据即可。
在理想状态下,两段相同的音频计算出的结果会是无限接近100%的,但是有的时候可能因为各种奇怪问题,比如卡了一下,导致两端音频在解析成数组的时候并不是百分百相同的。所以我们可以把标准放得稍微宽泛一些,各项指标都达到85以上(所有数据都比较正常)或低于85的指标只有几项且有多项指标达到95以上(个别数据异常但存在极大值)我们就视作两段音频是一样的。比如AK47音频丢失了或者配成了其他枪声差距比较大的枪,各项数据都会非常低,我们就可以通过自动化的手段发现这个枪的音频问题。
05 结语

FPS游戏中,音频既是游戏的重要组成部分,又是游戏体验的重要因素之一。因此,保证游戏中音频的质量和准确性至关重要。

在测试的过程中,音频自动化检查可以帮助我们快速发现音频中的问题,如缺失的音频不匹配的音频等。同时,音频自动化检查还可以避免一些人为错误和疏漏,提高游戏的整体质量。虽然自动化检查可以帮助我们发现一些音频上的问题,但它并不能完全替代人耳去听。因此,在实际测试工作中仍然要注意音频相关的问题,以确保音频的质量和准确性。

项目组内的声音自动化还在起步阶段,很多东西都是处于待验证的状态。但是作为一个玩家来说,我相信这套系统能尽可能地避免一些音频的问题。







推荐阅读



从“盒装产品”到“实时服务”的思维转变


谈谈测试开发的产品思维



 

都看到这里了,点个赞再走吧~

网易雷火测试中心
雷火测试中心致力于提供高质、高效的质量保障服务,建设成为国内顶尖的测试团队!
 最新文章