写点什么

实时语音视频通话 SDK 如何实现听声辨位

2017 年 11 月 06 日

通过听声音可以辨别声源的位置,这是我们习以为常的生活认知。从技术的角度来说,听声辨位其实真的一点都不简单。我们人类应该感谢上天的造化,赋予我们一双巧夺天工的耳朵,让我们可以毫不费力地做到听声辨位。在语音视频实时通信的世界里,要实现听声辨位,却是要耗费一番心思的事情。

双耳效应

关于人耳听声辨位的原理,这里不再赘述。有需要了解的同学请自行搜索“双耳效应”问度娘。简单地来说,听声辨位的基础是左右耳朵从同一声源获得的声音信息有细微的差别:

  1. 到达左右耳朵的时间不一样
  2. 在左右耳朵空间上的相位不一样
  3. 音色(频率)不一样
  4. 音级(波幅)不一样

人脑和双耳就是根据这两组声音信息的细微区别,判断出声源的位置的。

人类的双耳在自然环境进行听声辨位,已经有过数百万年的实战经验,以至于我们认为这是理所当然的事情。然而,随着科技的发展,我们习以为常的认知遇到了突而其来的挑战。

二十世纪初遇到的第一个有代表性的挑战是留声机。立体声技术较好地为模拟声音解决了立体音效的问题。基础的立体声技术是采用两个麦克风进行拾音,获得两组波形独立的声音信号,然后进行独立的处理,在播放的时候采用两个扬声器独立地播放这两组声音信号。这样,从播放端的角度来说,用户听到的是声音本身的立体音效和用户周遭空间的立体音效的叠加,能够达到听声辨位的效果。

二十一世纪的前二十年,语音视频实时通信遇到了移动互联网,立体声技术也遇到技术限制。这些技术限制其实和应用场景有关系。

听声辨位的应用场景

第一个要提的是游戏场景,如果不是最重要,也是最重要之一。游戏可以分为竞技类的和休闲类的。两类游戏对听声辨位的要求也不尽相同。

竞技类的游戏,包括众多玩家耳熟能详的 MMORPG、MOBA 和 FPS。玩过 CS 的同学都知道,在虚拟场景中是能听到周遭其它玩家的脚步声的, 听声辨位很多时候比视野更加有效地帮助玩家判断其它玩家在哪里,这往往是杀敌制胜和脱险保命的关键手段。现在实时游戏语音技术可以让玩家在 CS 中和队友一边并肩作战一边对话沟通。如果玩家通过游戏语音通话判断出队友的位置和通过游戏系统声音判断出队友的位置不一致,以至于造成判断错误,在分秒必争的虚拟枪战中,这可是致命的误导。要让游戏系统声音反映的虚拟位置和游戏语音通话反映的虚拟位置一致,其实是蛮难的。游戏系统和游戏语音 SDK 是完全独立和解耦的,游戏系统的声音产生涉及到游戏服务器和客户端的协同,游戏语音 SDK 的语音是从远端用户传输过来,考虑到两个独立系统和网络传输,两个者之间的步调要保持一致是十分有挑战的任务。

休闲类的游戏包括棋牌等人数较少节奏较慢的游戏,通过游戏语音边玩边聊天是一个刚性的社交需求。请各位闭眼想象,你和其它三个好友在线上打麻将,同时通过语音唠叨家常。如果你能够通过听左、右和前方三个人的声音,分辨出他们就像是坐在你左、右和前方三个位置,音效体验一下子就爆表了。狼人杀游戏更加不在话下,这种完全依托语音会话建立起来的社交游戏,如果能够通过听声音就能辨别出讲话的人的方位,闭着眼睛去感觉,就像是一伙朋友围着圆桌面对面的玩狼人杀游戏呢。

第二个对听声辨位有需求的场景是在线教育的小班课堂。举一个比较具体的例子,在线少儿英语小班课,应该是对线上互动要求最高的一种在线课堂形态,没有之一。小朋友的注意力不容易集中,对课堂趣味性和互动性的要求特别高。如果小朋友能够通过听声感觉到老师就坐在正前方讲台的位置,其它小朋友坐在前后座位各个方位,由远而近多个距离层次都有小朋友,就像是在真实的摆满书桌的教室里面的声音效果一样,这样无疑是大大增强了小朋友的注意力集中程度。

其它的一些应用场景,比如说语音社交、视频社交和互动直播,听声辨位的效果也会让用户感到惊艳。如果你加入 houseparty 的视频聊天房间,能听到参加趴踢的朋友分布在你前后左右的各个位置,那种沉浸式的听音感觉会让你像是整个人一下子投入到趴踢的人群中去。

这些应用场景即构 ZEGO 都有丰富的客户案例,即构 ZEGO 的听声辨位技术能让用户在这些应用场景里获得 360 度空间感的听声体验。然而,客户越来越苛刻的需求,驱使着即构 ZEGO 不断的去打磨和升级其听声辨位技术,来给予用户最优的体验。

移动终端的处理能力分秒不停地飞速发展,5G 的推出如果不出意外也会在 2019 年到来,加上 VR/AR 技术的日渐成熟,沉浸式的语音视频实时互动通信将会成为一种生活方式。当你带着 VR 头显,环顾 360 度都看到远端的朋友的视频影像的时候,你是不是也期待他们的声音听起来也像是从他们看起来的那个位置传过来一样?到那时候,听声辨位技术也会成为这种生活方式的必备支柱。

硬件条件的限制

上面对应用场景的展望和抒情有点太超前了,我们稍微回到 2017 年下半年的现实中来。虽然梦想很美好,但是现实很残酷,现在手机硬件条件还存在诸多限制。

目前,绝大部分的手机采集声音的麦克风只有一个。当然有朋友反对说,iPhone 不是有好几个麦克风吗?其实采集语音的麦克风还是只有一个,其它的麦克风是用来做噪声抑制的。一个麦克风采集到的声音就是单声道的,不会产生立体声的效果,也就是不会让你听声音就能辨别出声源的位置。

目前,绝大部分的手机只有一个扬声器,只有少数的手机是支持立体声的。这里要区别分一下,打电话的时候听电话那个喇叭不是扬声器,点了免提键后手机不需要贴到耳朵边的时候发出声音的那个喇叭才是扬声器,播放音乐的时候发声音的喇叭也就是扬声器。既然只有一个扬声器,那么不管声音信号是不是立体声的,播放出来的声音效果都是单声道的。在渲染的时候,应用程序把声音数据放到一个缓冲区,操作系统把声音数据取出来播放,如果只有一个扬声器的话,巧妇难为无米之炊,臣妾也表示办不到,即使是立体声信号也会被降级为单声道播放。当然,耳机线有左右两个喇叭,插入耳机线以后,手机就支持立体声播放了。

单声道虚拟成立体声

如果发送端采用外部采集,采集的设备有两个麦克风,或者本身就是立体声麦克风,那么采集进来的声音信号就是立体声的。立体声信号包含两组独立的波形,由于这两组波形有相关性,可以一起编码传输,在接收端解码以后再独立地渲染,最终获得立体声的效果。

如果发送端采用手机的唯一麦克风,采集进来的声音信号就是单声道的。如果要在接收端获得立体声的效果,就要把单声道的声音信号虚拟成立体声的。不是说巧妇难为无米之炊吗?这里也不完全是“无米”,毕竟还是有一组单声道波形数据的。

具体的做法是,首先对声音传播路径进行建模,然后输入原始的波形数据,还有距离 d 和角度 a 两个参数,模型会输出两个独立的波形,代表左右声道的声音信号。这两个波形和原始的波形作比较,在相位,音色和音调都有所调整,尽量地逼近原始波形在自然环境中传播到用户的左右耳朵后形成的两个不同的波形。这两个波形有相关性,因此一起编码后的带宽是小于每一个波形带宽的两倍。虚拟立体声信号数据到达接收端以后,结果解码就可以得到两个独立的波形声音信号数据。如果是在手机扬声器播放出来,效果还是单声道的,如果通过耳机播放出来,就能呈现出立体声的效果,用户可以听出声音的空间感,并且依此进行听声辨位。

把单声道波形虚拟成两个独立的立体声波形,是在目前移动端硬件限制条件下的一个技术处理手段。虚拟立体声的处理可以在发送端进行,也可以在接收端进行。在哪里进行虚拟化,要看具体的场景需要。如果有混音的需求,也就是要把语音信号和背景音乐混合在一起的话,那么比较适合在发送端来做虚拟立体声;如果没有混音的需求,那么比较适合在接收端做虚拟立体声。背景音乐一般是立体声的,而且是在发送端输入的。如果需要进行混音,而混音必须要在发送端进行,那么背景音乐和语音信号都要是立体声才能对应得混合。因此,虚拟立体声必须要发送端完成,然后虚拟出来的语音立体声才能和背景音的立体声混合,混合好以后再把立体声信号进行编码传输,最后到了接收端解码以后就可以把立体声播放出来。如果不需要进行混音,那么可以把单声道声音信号直接编码发送,接收端收到后进行解码,再把单声道声音信号虚拟成立体声,这样传输的带宽就可以做到最低。

当互动直播遇到立体声

随着硬件的快速更新换代,在不远的将来,手机很可能会支持立体声,拥有双麦克风(考虑到手机的物理尺寸较小,笔者严重怀疑双麦克风的效果)和双扬声器。也许你会觉得这是普大喜奔的好事情,再也不用费脑去搞虚拟立体声了,然而有个现实要让你心碎:即使手机支持立体声,在进行互动直播或者互动语音视频通话的时候,手机依然只能采用单声道采集,因此,还是要继续搞虚拟立体声,这是跑不掉的事情。为什么在互动直播的时候只能采取单声道而不能采取立体声呢?下图展示了使用立体声手机进行回声消除的逻辑,大家看一下此图就理解互动直播不能采取立体声的缘由了。

(点击放大图像)

参照上图,我们看一下语音数据的是如何流动的:

  1. 远端的左右两个麦克风分别采集左右声道的语音数据;
  2. 近端的左右两个扬声器分别播放左右声道的语音数据;
  3. 近端左边的扬声器发出的声音经过回声馈路会被近端左右的两个麦克风采集进去;
  4. 近端右边的扬声器和#3 同理;
  5. 近端左边的麦克风采集进来的声音信号包括了左右两个扬声器产生的回声;
  6. 近端右边的麦克风和#5 同理;
  7. 对左边麦克风采集的声音进行回声消除的时候,除了参考远端左声道声音信号消除左边扬声器产生的回声,还要参考远端右声道声音信号消除右边扬声器产生的回声;
  8. 对右边的麦克风采集的声音进行回声消除和 7 同理。

也就是说,对左边麦克风采集进来的声音要消除左右两个扬声器产生的回声,对右边麦克风采集进来的声音进行回声消除也同理,总共要进行四次回声消除,并且要从每一个麦克风采集进来的声音信号里消除两个扬声器造成的回声,计算量一下子变成单声道情形的四倍,复杂度更是远超四倍。同等条件下,立体声回声消除的效果比起单声道回声消除的效果差。目前业界的实践表明,立体声回声消除的效果并不理想。因此,在涉及到互动直播或者互动语音视频实时通话的场景,还是要使用单声道采集和渲染比较能简单而且能保障效果。

结语

听声辨位是人们在自然环境中习以为常的事情,语音视频实时通信的愿景就是要在互联网上完美地还原自然环境的通话场景,这也是即构 ZEGO 孜孜不倦地追求的使命。随着 AR/VR 的发展,沉浸式的语音和视频消费方式成为常态,在进行语音视频实时通话的时候,人们也会要求能够做到听声辨位,在游戏语音、语音社交、视频社交、视频会议和在线教育等场景,会有广泛的需求和应用。

作者介绍

冼牛(微信 xianniu1216,邮箱 noahxian@zego.im,电话 13266561305),即构科技资深语音视频专家,北京邮电大学计算机硕士,香港大学工商管理硕士,多年从事语音视频云服务技术研究,专注互动直播技术、语音视频社交和实时游戏语音。

感谢徐川对本文的审校。

2017 年 11 月 06 日 16:551058

评论

发布
暂无评论
发现更多内容

Android模块化开发实践

vivo互联网技术

android 架构 开发 项目实战 模块

在?进来看看新一季周边到底做点啥?【话题讨论】

气气

话题讨论

Golang:再谈生产者消费者模型

Regan Yue

Go 协程 8月日更

Java NIO在接口自动化中应用

FunTester

Java nio 接口测试 测试开发

后Kubernetes时代的虚拟机管理技术之kubevirt篇

谐云

虚拟机 #Kubernetes#

一分钟学会使用ApiPost中的全局参数和目录参数

CodeNongXiaoW

前端 测试 后端 接口工具

以区块链为基础 通证经济是下一代互联网的数字经济

CECBC区块链专委会

国产接口调试工具ApiPost中的内置变量

Proud lion

前端 测试 后端 Postman 开发工具

区块链+物联网设备,能产生什么反应?

CECBC区块链专委会

🏆「作者推荐」Java技术专题-JDK/JVM的新储君—GraalVM和Quarkus

李浩宇/Alex

Java JVM GraalVM 8月日更

零基础入门:基于开源WebRTC,从0到1实现实时音视频聊天功能

JackJiang

音视频 WebRTC 即时通讯 IM

【虚拟机专栏】智能合约执行引擎的前世今生

趣链科技

带头撸抽奖系统,DDD + RPC 开发分布式架构!

小傅哥

DDD 小傅哥 架构设计 springboot 抽奖系统

打造数字人民币的大运应用场景

CECBC区块链专委会

手撸二叉树之二叉树的坡度

HelloWorld杰少

8月日更

带你梳理Jetty自定义ProxyServlet实现反向代理服务

华为云开发者社区

容器 k8s jetty Servlet引擎 ProxyServlet

Go- 函数参数和返回值

HelloBug

Go 函数 参数 返回值

KubeCube开源:魔方六面,降阶Kubernetes落地应用

网易数帆

开源 Kubernetes 容器云 KubeCube

云小课 | 详解华为云独享型负载均衡如何计费

华为云开发者社区

负载均衡 华为云 弹性负载均衡 独享型ELB实例 独享型负载均衡

GraphQL设计思想

Ryan Zheng

graphql

最小二乘法,了解一下?

华为云开发者社区

数据 数据处理 计算 最小二乘法 数学工具

使用mock.js给前端生成需要的数据

与风逐梦

前端 后端 开发工具

NameServer 核心原理解析

SH的全栈笔记

RocketMQ 消息队列 NameServer

protocol buffer的高效编码方式

程序那些事

Java protobuf 程序那些事

多样数字人民币钱包来袭,阻力与动力并存

CECBC区块链专委会

模块一作业

北海

架构实战营

从lowcode看下一代前端应用框架

百度Geek说

前端 lowcode

传统到敏捷的转型中,谁更适合做Scrum Master?

华为云开发者社区

Scrum 敏捷 团队 项目经理 Scrum Master

6种常用Bean拷贝工具一览

码农参上

8月日更 对象拷贝

web技术分析| 一篇前端图像处理秘籍

anyRTC开发者

前端 音视频 WebRTC web技术分享

来了!《中国移动2021智能硬件质量报告》正式发布

Geek_459987

开源中间件技术学习路线

开源中间件技术学习路线

实时语音视频通话SDK如何实现听声辨位-InfoQ