手机k歌时人声与伴奏比例,全民k歌人声对齐怎么设置( 二 )


3、时间偏移要义
演唱时间偏移主要分成两大类,一类是演唱实时反馈的时间偏移,一类是混音对齐的时间偏移 。
演唱实时反馈的时间偏移,主要关注的是演唱时,人声与从耳机反馈回去(实时耳返)的声音之间的实时偏移 。这个偏移量一般我们要控制在30毫秒以下,如果在30毫秒以上,人唱歌的时候会受到一些影响;在50毫秒的时候,演唱就会变得非常困难 。混音对齐关注的是人声和伴奏能否以对齐的方式混合在一起 。

手机k歌时人声与伴奏比例,全民k歌人声对齐怎么设置

文章插图


这里介绍一个测试演唱实时反馈的方法 。找一个示波器,分别采样麦克风和耳机的声音信号,测试人员可以发出一些比较短促的声音,如敲击或是脉冲 。此时示波器上可以看到分别从麦克风采集出来的脉冲与从耳机得到脉冲,通过两个脉冲的时间差就能了解到演唱实时反馈的时间偏移量的大小 。
在安卓设备的系统中,各个厂家通常会做一些标识,”low_latency” tag 和”hardware.audio.pro” tag,这两个tag会告诉开发人员,手机的演唱实时反馈偏移量的大小 。”low_latency”关注的是在手机中播放一个声音,从需要播放到speaker真正发出声音来,偏移量的大小,一般是在45毫秒以下 。而audio.pro则是round trip的时间,通常在20毫秒以内 。
造成演唱实时反馈时间偏移的原因分为以下几种:计算性能导致的,系统性能导致的,处理缓冲区导致的时间偏移 。
4、安卓手机的优化处理


手机k歌时人声与伴奏比例,全民k歌人声对齐怎么设置

文章插图


上图为安卓手机处理声音的示意图,我们从Speaker输入声音,依次经过ADC,总线Bus,Driver,Audio Recorder,应用程序,再转回来整个一圈的处理时间,就是之前提到的round trip 时间 。除此之外,在应用层时我们还会将声音信号单独写出一个文件,用来进行后处理 。我们希望能将演唱实时反馈的延迟时间控制在30毫秒以内,然而在上述过程中的每个处理步骤都会花掉一些时间,一般情况下,audio flinger可能会花掉10~20毫秒,audio track可能会花掉20~40毫秒 。当然,根据设备的不同,实际耗时也会有所不同 。
手机k歌时人声与伴奏比例,全民k歌人声对齐怎么设置

文章插图


上图展示是我们所做的一种通用的耳返延迟优化方案,将之前上层的audio record和audio Track改成用Open SL来处理 。因为Open SL本身是稍微偏底层的接口,这样我们就可以避免掉不少延迟量,并且这个延迟量是相对稳定的 。针对相同型号的手机它们的差别并不是很大,并且在不同录制上面的差别也比较小 。
手机k歌时人声与伴奏比例,全民k歌人声对齐怎么设置

文章插图


上图是现有国产手机时间延迟的解决方案,因为它们手机延迟量的性能指标不满足需求,所以就找到了另外一种方式来绕过这个问题 。把一个声音从麦克风录进去,我们只进行半区的处理后保存下来 。耳返的声音从手机麦克风添加的旁路芯片直接出来,这种做法的延迟量能够控制的非常小,但芯片处理得到的耳返音效,甚至音量等因素,都很难控制 。并且每个厂商会有自己不同的方案,处理的情况也都各不相同,这也大大增加了应用程序上控制的难度 。另外,由于安卓手机型号碎片化的问题,需要我们一个一个去做,进展是还是比较缓慢的 。但我们仍然可以提供一些经验,比如说我们拿Open SL来处理IO,但是不要处理音效,在旁路添加C++ code来完成 。因为Open SL做音效存在较多问题,可能会快15~20毫秒,甚至会出现丢帧 。如果我们需要在耳返处理添加实时效果器,一定要保证效果器是实时的,处理本身的固定缓冲延迟尽可能小 。当效果器处理是大计算性能的话,我们要考虑让它走一个旁路来完成异步处理,只让湿声去走效果器,干声仍然直接按原路回来,这样的话,我们可以把这个延迟量控制的只是干声的延迟量 。在安卓上面可以用一些NEON指令做运算优化,在iOS上面会用DSP做计算的优化 。

推荐阅读