一款 NOW 直播音频采集质量的测试工具

作者:陈兴

导语

针对主播反馈的NOW音质变差问题,在分析原因后,设计了一套测试方案并实现了自动化。对主播的采集音量,主播采集频率范围,两项重要参数进行量化监控。本文章对问题背景以及实现原理进行分享。

音质测试工具介绍

1. 这是什么工具:

界面:

工具支持一键测试,自动执行测试,测试结束后自动分析,并绘制分析结果。

测试项:

1) 用于测试直播观众端,收听到的音量大小,量化并直观显示音量大小; 2) 用于测试直播主播端,采集声音的频率范围,量化并直观显示截止频率;

结果显示:

上半部分为音量幅值波形图,可见音量最大值以及平均值;

下半部分为频谱分析图,可见最大幅值(dB),以及截止频率值。

2. 解决什么问题:

1、问题背景:

NOW直播iOS 1.12发布后,有主播投诉音质变差。

对问题进行重现后,确认问题原因为两方面:麦克风采集音量变小、采集频率范围变小。

那么为什么我们的测试人员在功能测试过程中没有发现呢?

主要是下面几个原因:1)音量大还是小每个人感受都不一样,判断偏主观;2)办公室太嘈杂有噪音干扰;3)测试时没敢大声说话,所以声音小也是理所当然。

2、解决方案:

那么接下来的问题就是,应该用什么样的测试方法,对音质进行测试,避免这类问题再犯。

方案1:

从测试人员未发现问题的原因来看,我们可以这么处理:

1) 邀请多人对音量大小进行体验,并对比先前版本; 2) 测试时,寻找安静环境进行测试; 3) 找个安静又没人的地方,敞开嗓子放声测试;

这个方案,显然操作成本太高,明显不是一个技术人员应该用的最优方案。

方案2:

音视频实验室对已有成熟的音质打分方案,可以拿过来用。

测试原理大致如下:

1) PC端输出标准测试音源; 2) 通过3.5mm音频线,直连主播端手机麦克风插孔,输入测试音频; 3) 通过3.5mm音频线,观众端将耳机孔直连PC,将观众端收到的音频输出给PC; 4) PC端对比音频源与接收音频,使用PESQ评判差异情况,进行打分。

这个方案,要得到准确的音质打分值,需事先调节输出音量到某合适值,且打分值和要测试的音量大小并无直接关系;此外打分值也无法体现出问题的采集频宽范围。故该方案不适用我们的问题场景。

方案3(实际解决方案):

于是乎只能自己撸起袖子加油干,设计了如下测试方案。

1) 制作标准测试音频,音频内容为1khz的正弦波、0~24kHz的扫频正弦波,时长5s即可; 2) PC端外接扬声器播放测试音频; 3) 主播端通过外置麦克风采集播放的测试音频; 4) 通过3.5mm音频线,观众端将耳机孔直连PC,将观众端收到的音频输出给PC; 5) PC对接收到的音频信号进行分析:音频波形振幅(获取音量大小),音频频谱(获取采集频宽)。

这样,方案3就能够量化出主播采集音量的大小、采集频率范围,正是我们想要测试方案。

3. 如何使用工具:

测试拓扑搭建:

1) 测试PC为笔记本,将测试音频通过音箱播放(音箱播放音量固定为50%); 2) 主播端通过自带麦克风进行音频采集(音箱与采集手机位置固定为50cm); 3) 观众端耳机输出口,使用3.5mm音频线直连到笔记本麦克风输入口;

文件夹说明:

5s_1khz.wav、5s_24khz.wav为测试音频源,AudioTest.exe为测试程序。

软件界面说明:

打开AudioTest.exe后,测试仅需一键点击“start”按钮,即可启动测试。

测试约15s结束,测试完成后生成测试结果文件,并显示结果。

测试结果说明:

1) 上图为根据接收到的音频,绘制的波形图:

a.横轴为时间轴,纵轴为对应时刻音频振幅; b.音频波形的最大振幅参见max volume,平均振幅参见avg volume; c.振幅越高,对应音量越大。

2) 下图为接收到的音频,频谱分析结果:

a.横轴为频率值,纵轴为该频点上对应的幅值(已转化为dB); b.频域上,截止频率参见图示绿线的截止处频率值,最大幅值参见max freq amplitude; c.频域上的幅值越高,对应音量越大,截止频率越高,高频成分丢失越少音质越好。

4. 工具自动化原理

方案3测试过程中,如果手动操作的话,需要干下面这些事情:

  1. 制作测试音频源
  2. 设定PC播放音量
  3. PC端开始播放后,需要同步启动录音
  4. 将录音结果文件,导入到CoolEdit,查看最大振幅(平均振幅没法看)
  5. 使用CoolEdit选取分析的音频段,进行FFT变换分析频谱,查看采集的频宽

以上这些环节,CoolEdit需要一定学习成本,即便学习后,操作起来也比较费时。

所以打算将以上环节打包起来,做成一个可以“一键测试”的小工具。

各个关键环节,自动化实现方案如下:

1) 制作测试音频源

使用CoolEdit生成测试音频。

生成1khz正弦波,设定时长为5s,用于音量大小的测试;

生成0~24khz的扫频正弦波,设定时长5s,用于截止频率的测试;

2) 设定PC播放音量

可通过python中的ctypes模块,调用系统音量设置dll文件,设置PC的播放音量。

3) PC端开始播放后,需要同步启动录音

声音的播放,可以通过python的wave模块完成,通过设定对应的音频参数后,将音频源文件写入声卡buffer中即可。

声音的录制,可以通过pyaudio模块,设定对应的音频编码参数后,读取声卡中音频数据写入到音频结果文件中即可。

使用Threading模块,开两个线程同时处理,播放的同时同步在录音。

4) 将录音结果文件,导入到CoolEdit,查看最大振幅

查看最大振幅以及平均值,可以通过numpy模块,导入音频输入,方便的计算出来。

5) 使用CoolEdit选取分析的音频段,进行FFT变换分析频谱,查看采集的频宽

同样的,numpy同样支持做FFT的计算。

截取对应的音频段进行FFT运算,将结果去除共轭,并转化单位为dB后,即可用于绘制结果。

6) 结果绘图

使用matplotlib进行处理即可。

7) 一键测试

界面只需要一个按钮,使用tk进行界面设计,一键完成测试。

原创声明,本文系作者授权云+社区发表,未经许可,不得转载。

如有侵权,请联系 yunjia_community@tencent.com 删除。

编辑于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏张善友的专栏

Using sqlite with .NET

The other day I found that there is a .NET wrapper for sqlite. sqlite is a very ...

2488
来自专栏xingoo, 一个梦想做发明家的程序员

windows程序设计-第四章 system1.c

/*---------------------------------------------------- SYSMETS1.C -- System M...

26310
来自专栏跟着阿笨一起玩NET

[C#]工具类—FTP上传下载

  不错的文章:http://www.cnblogs.com/greatverve/archive/2012/03/03/csharp-ftp.html

1541
来自专栏闻道于事

商城项目整理(三)JDBC增删改查

商品表的增加,修改,删除,订单表的增加,确认,用户表的查看,日志表的增加,查看 商品表建表语句: 1 create table TEST.GOODS_TABL...

5885
来自专栏积累沉淀

Hive2.0.0操作HBase 1.2.1报错解决

首先看错  org.apache.hive.service.cli.HiveSQLException: Failed to open new session: ...

2549
来自专栏跟着阿笨一起玩NET

GB2312转换成UTF-8与utf_8转换成GB2312

2271
来自专栏互联网开发者交流社区

WinForm之窗体应用程序

2053
来自专栏Pulsar-V

C#下各种获取时间的姿势

直接贴代码吧 DateTime dt = DateTime.Now; Label1.Text = dt.ToString();//2005-11-5 13:21...

3396
来自专栏海说

Java应用中常见的JDBC连接字符串(SQLite、MySQL、Oracle、Sybase、SQLServer、DB2)

Java应用中常见的JDBC连接字符串 Java应用中连接数据库是不可或缺的,于是便整理一些可能用到的JDBC的jar包及其相匹配的URL,以备日后查阅。 1)...

2950
来自专栏菩提树下的杨过

MSDN官方的ASP.Net异步页面的经典示例代码

示例1.演示异步获取一个网址的内容,处理后显示在OutPut这一Label上 using System; using System.Web; using S...

2125

扫码关注云+社区