Any to Any 实时变声的实现与落地丨RTC Dev Meetup
前言
「语音处理」是实时互动领域中非常重要的一个场景,在「RTC Dev Meetup丨语音处理在实时互动领域的技术实践和应用」活动中,来自声网、微软和数美的技术专家,围绕该话题进行了相关分享。
本文基于声网音频体验算法专家冯建元在活动中分享内容整理。
01 基于传统音效的实时变声算法的困境
1、变声改变的是什么
■图 1
要通过发音来识别一个人,有很多维度需要考虑。
首先,每个人的发音腔体各有不同,口腔的张合以及喉部的声带震动,都可能有个体声学方面的区别,这导致由于每个人的发音有不同的音色,在此基础上运用语言进行表达,就可能产生不同的韵律;其次,每个人所处的房间不同,也可能会伴有不同的混响,对识别造成影响;此外,有时通过变声唱歌,可能还需要乐器配合以及一些乐理知识。
而且,我们在感知声音的时候,也会受心理影响,同一个声音,有的人可能会觉得有磁性,但有些人可能会觉得比较粗糙。心理感知根据个人经历的不同,也会有些区别。
2、人为什么会有不同的音色
那么在实时场景下,如何实时变化声音呢?当韵律较长时,虽然我们无法改变遣词造句,但可以改变发音腔体的音色,因为它对实时性的要求比较高。
举例来说,比如“今天是几号”这样一句话,可以把这些字拆成一些音素,比如“今”可以拆成 “J” 和“in” 这两个音素,它是一个浊音,可以由声带震动发出声音,此时每个人的音色区别比较大;而“是”是一个清音,通过唇齿的气流形式实现,对于这个字来说,每个人的音色区别比较小。这是为什么呢?
■图 2
本质上来说,声带的震动频率决定了发音的音调高低。不同的人通过不同的声带震动频率发同样一个音,其音色在浊音上会有很大的不同。比如上面的例子,“今天几号”这几个字,不同的人发音可能会有比较大的区别,而“是”这个字可能区别就比较小。
传统的变身算法也是从这个角度来考虑,不同的人有不同的基频,根据声带振动频率不同,可以调整基频的分布。不同的基频会有不同的谐波,谐波就是基频的倍数。这样就可以通过变调方式来改变声音。
■图 3
在发不同的音时,嘴巴的开合程度决定了发音腔体的共振情况,开合程度的不同会导致不同频响的增强或削弱,如果和口腔的共振频率达到同一频率,频段就会被增强,不同则会被削弱。这就是共振峰的原理。从浊音的角度来说,声带震动产生基频,基频会有相应的谐波,谐波在不同频率的分布由腔体的开合来决定。这样,改变基频和频响的分布就可以对音色有所调整。
3、基于传统音效的变声
传统算法其实就是通过不同的效果器对不同的发音维度进行调整,图 4 所示为传统算法常用的效果器,比如变调,现在变调的算法大部分都是通过 pitch shifting 把基频和谐波向上或者向下扩展。在这种情况下,shift 操作会同时改变共振峰,使声音都根据频谱的能量向上或者向下移动,从而改变人的基频发声。
女生的基频比较高,而男生的基频比较低,通过这个方法就可以使两者的基频方向一致。但是男女发音时的口腔开合也会随字的变化而变化,仅仅改变基频不能做到完美的声音转变。比如电影《神偷奶爸》,其中的小黄人说的是西班牙语,由于基频提高它变成了小孩子的声音,但是这并不自然,还需要均衡器进行调节。
前面的例子在变调的时候只改变了基频,其实共振峰和频响可以通过均衡器或者共振峰滤波器来进行调整,这些也是调整音色的关键模块。另外,经过美声训练的人在唱歌或者说话的时候,高频音较多,发音比较饱满,从这个角度来说,可以通过激励器对其谐波进行增强。
■图 4
传统算法大部分都是通过效果器的串联链路,从不同的维度对声音进行改变。常用的效果器软件包括 MorphVOX PRO 或者 voicemod,它们有不同的效果器,通过调整参数就可以产生不同的人物特征。选择音效其实就是不同效果器的叠加,每个人说话的声音最后变声出来也都是不一样的,因为基础位置就不一样,所以很难把所有人的声音都变成一样的,但是可以做方向性的调整。
我使用 MorphVOX 软件进行了男变女或者女变男的跨性别变化,在男声变女声的时候,使用默认的选项进行调整就有变成了小黄人的感觉。如果使女声变成男声,发现声音听上去有点憨,像鼻音比较重的情况。出现这种情况是因为女声变成男声的时候需要降调,使整个频谱往下进行压缩,这样很多高频信息就丢失了。
可见,传统的效果器都有各自的缺陷,导致变化不那么准确。要想得到比较好听的声音,传统的链路方式都需要手动改变参数,无法做到精准的音色变换,而如果仅使用预设值进行调整,音色变换的效果并不理想。另外,每个人的声音想变成另外一个指定的人是一件很难的事情,可能只有专业的调音师才能做到。
02 ASR+TTS=VC?基于 AI 的实时变声可能性探索
1、ASR
传统变声有很多局限性,那么基于 AI 的方式能否改善实时的变声效果呢?我们知道,ASR 技术可以实现语音转文字的功能,其实在进行变声的时候,也需要对语义信息进行保留,只进行整体的调整可能出现漏字或者表达意义存在错误的情况。
如图 5 所示,现在有很多的识别框架,比如 hybrid(框架)的 Kaldi 等,这种框架会通过声学模型、发音词典以及语言模型等对声音转换进行综合的判定,要同时满足发音正确和语言合理两个条件。
■图 5
从这个角度来说,它是一个解释性比较强的链路,同时也便于搭建,因为有很多现成的发音词典、语言模型可以使用。它也存在一定的缺点,就是解码过程比较复杂,这种框架包含多个模型,如果其中一个出现问题,那么在识别的时候就会出现偏差。
针对这一问题出现了很多端到端语音识别框架,比如 Espnet,其准确率从通用模型的角度来说,在数据充足的情况下,能做到比 hybrid 更好的识别效果。而且其训练流程也比较简单,不像 hybrid 框架,需要训练声学模型、语言模型,然后进行解码。这种框架只需要语音和文本数据配对,然后直接进行端到端训练就可以了。但是它的缺点也很明显,因为要进行端到端的训练,所以其要求更高,需要更大的训练集以及更准确的标注。另外,不同的场景可能需要定制,所要求的数据更多,如果是端到端的模型,则可能没有较好的语料进行训练。
目前从变声的角度来说,其实不一定要识别文本,只要准确识别音素即可,这是与 ASR 模型的区别。
2、TTS
ASR 可以识别发音,那么同样一个音,由不同的人发出,就需要用到 TTS。对于这一点,也有很多现成的框架可以使用,过程无非是把 ASR 提取到的文本进行归一化处理,然后进行频谱预测,再通过声码器生成声音,如图 6 所示。谷歌的 Tacontron、微软的 Fastspeech 都对这一功能进行了实践,能够以较低的延迟合成语音。对于图 6 的链路来说,Fastspeech 也可以直接跳过声码器部分直接生成语音,也就是说,直接从文本到语音就可以做到这一部分的 end to end 的生成。这样,结合 ASR 加 TTS 的形式,就可以实现变声。
■图 6
TTS 中的声码器技术其实已经比较成熟,它所做的工作其实就是,从一个压缩的频谱信息预测语音,图 7 展示了不同声码器的 mushra scores,它可以理解为发音转化的自然度,作为转换是否自然的评判。
我们可以看到,像 wnet 或者 wRNN 这种基于主点生成的声码器,在语音合成上已经取得了比较好的效果,能够和真人的声音从自然度上来说没有太大的区别。另外,Hifi-GAN 或者 Mel-GAN 在实时性比较好的情况下,也能够达到类似 WaveRNN 的效果。声码器技术发展到现在,已经达到了较好的语音生成效果,成为变声效果器的前提。
■图 7
3、VC
通过 ASR+TTS 的串联方式实现声音转换的基本步骤如图 8 所示,Speaker A 说一段话,然后通过 ASR 提取跟说话人无关的文字或音素信息,再利用 TTS 技术转换成 Speaker B 的音色进行还原,以实现变声。
■图8
对于这条链路,如果声音只能由一个人变成另外一个人,就是 One-to-one 的形式。而 ASR 其实跟说话人是无关的,如果是这样的情况,就可以做到 Any-to-one。也就是说,ASR 模型无论 Speaker 是谁,都能识别出准确的文字,使所有人都变成 Speaker B。而变声的终极目标是变成 Any-to-any 的形式,就是说一个模型可以把任何人的声音变成任意一种声音,进行变声能力的扩展。
我们知道,很多端到端的模型,像 CycleGAN、StarGAN 或者 VAEGAN 等,可以实现在有限集合中进行声音变换,使训练集中的人能够在 group 中互相转换,但这也是其设计的局限性所在,如果能够切换 TTS 的音色,就可能解决声音的可定制性,使其变成任何一个人的声音。可见,ASR + TTS 等于 VC 的理论实际上是可以实现的。
如果想变成 Any-to-any 的形式,需要一个快捷的方式,不能每添加一个人,就对整个模型重新进行训练。这就需要借鉴可迁移学习的思想。图 9 展示的是基于迁移学习的语音生成方式。
■图 9
迁移学习的思想就是,通过 speaker encoder 模块对目标音色进行 embedding 操作,以提取音色的特征,然后把特征放到语音生成模块 synthesizer 中,这样就可以进行不同音色的语音生成。这其实是谷歌之前的发现,他们将 speaker encoder 模块加入 TTS 中,就可以实现不同的音色变化,当添加新的 ID,也就是说话人时,只需要识别说话人的一段一分钟或几十秒的语料,就可以提取 speaker 的特征,生成相应的音色。这种思想其实就是迁移学习的方法。
现在有很多不同的 speaker encoding 方法,比如 I-vector、X-vector、谷歌的 GE2E (generalized end to end) 这种主要偏向 loss 设计的模型,以及中文(比较好)的 Deep Speaker、韩文(比较好)的 RawNet 等。因此,我们就可以把它拆开来,除了 ASR 和 TTS,再加入这个 speaker encoder 模块来进行调整,实现目标说话人的音色,做到 Any-to-any 了。
03 实时变声系统的算法实现
1、实时变声系统的算法框架
接下来看一看实时变声系统是怎样实现的,如图 10 所示,将目标说话人的小段语料加入声纹识别(speaker encoding 部分),获取声纹特征,同时经过语音识别模块提取音素特征。然后在频谱转换模块,进行频谱特征的生成,再通过声码器得到语音。
■图 10
其实整个过程存在 offline 和 online 的区别,声纹识别模块可以通过 offline training 实现。这里的主要难点在于:
①实时变声要考虑算力以及实时性。就算力而言,语音识别、频谱转换和声码器,即使采用目前业内最快的算法,其算力也都在GFLOPS 量级,如果是在手机上部署,很可能无法去实现,但是在服务器上可以实现。
②就实时性而言,在实时的沟通过程中,如果变声花费了很长的延迟,则可能会导致沟通时需要很长的时间进行反应,在 RTC 环境下这种情况出现的频率较多。这就要求端到端的延迟尽可能小,一般来说不能超过 1 秒,如果超过 1 秒,会感觉到变声有明显的延迟效应。当然,端到端的延迟还包括编解码、采集播放等链路上的延迟,最终,整个算法的延迟就不能高于 400 毫秒。
③要做到 Any-to-any 的变声,则变声效果是否稳定、错字率是否足够低也是很有挑战的方向。语音识别的错字率在 5% 左右就已经是比较好的效果了,如果希望错字率更低,则可能需要更大的模型或者更有针对性的场景。另外,音色的相似度取决于声纹识别模块是否能准确地提取音色,这也是一个巨大的挑战。
2、实时变声系统
其实不同的语音识别框架、声纹识别框架以及声码器框架可以自由地进行组合,形成一套完整的变声系统。但是为了将算法延迟降到 400 毫秒,可能考虑更多的是声纹系统的部署。如图 11 所示的例子,在部署实时变声系统的时候,我们会考虑究竟是在云端进行变声,还是在端侧实现,这两套链路其实是有各自的优缺点。首先看在云端上进行变声的优缺点。
■图 11
如果在云端做变声,则需要在本地进行 speaker 的音频采集,然后经过 APM 声音处理模块去除降噪、回声等。接下来进行语音的编解码,语音经过编码之后会传输到服务器进行变声。这部分因为受到网络的影响,可能需要引入 NetEQ 模块进行抗弱网,进行解码后再变声。变声之后的音频还需要进行编码再传到 listener 端,listener 也会引入 NetEQ 模块进行抗弱网,然后解码和播放。
这种形式比端侧实现变声增加了 NetEQ 和服务器上编解码的过程,如果是在没有弱网的情况下,它控制的延迟可能增加 30~40 毫秒。但是如果是在有弱网的情况下,为了抗丢包,延迟可能就会达到 100 毫秒或者 200 毫秒,甚至更高。
云端变声的优点非常明显,就是在服务器上变声的算力要求比较低,在部署的时候,可以用更好的声码器、ASR 或者频谱转换通过算力来提升音质。如果是从端侧来考虑,则可以把变声放到发送端,因为接收端可能不止一个,只要在发送端做一次变声就可以,这样就省掉了 NetEQ 和 Codec 在服务器上进行的转换,其他链路上的延迟跟云端部署是一样的。如果从这个角度来考虑,端到端的方式即使没有变声,它在一般情况下可以做到 400 毫秒左右的延迟,加上算法 400 毫秒的延迟,端侧变声的延迟将小于 800 毫秒,能够在很大程度上降低实时传输过程中的延迟消耗,使沟通更加顺畅。
端侧变声还受到算力的影响。前面提到,端侧的效率在 GFLOPS 量级,比如 iPhone X 或者是更新的版本中有 GPU 处理芯片,这种情况在端上也是可以实现实时计算的,但是模型算力还是不能太大。
04 Demo 展示与应用场景
■图12
接下来介绍通过前面提到的链路进行变声的 Demo 的效果,以及它的应用场景。Demo 是一段男女的对话。在虚拟社交中,其实发出的声音与人物本身不一定是符合的,比如女生想用男生的形象表达,如果声音没有改变,则可能跟男生的形象不符,产生性别的错位。通过 Demo 变声前后的对比可以发现,为了解决这个问题,可以采用变声效果实现人物和发音的对应。另外,刚才的对话也没有因为变声而遭到打断。
1、实时变声的应用场景
那么变声会在什么样的场景下使用呢?其实变声无论是在元语聊这种 MetaChat 场景,还是传统的直播语聊中,都有用武之地。比如在聊天的时候,可能需要对虚拟形象进行定制,包括更换形象或声音等,以提升沉浸感。如果你是萌妹的形象,但是使用浑厚的声音,可能很快就会被人识别出来。又比如在游戏中,如果你能用目标人物的声音,则会有更多的代入感。
另外,现在还出现了很多虚拟数字人的场景,很多明星都会通过给自己定制虚拟的形象进行直播,不需要自己进入直播间,其他人通过后台的模拟就可以常态化的 24 小时的直播。语聊房场景的代表就是线上剧本杀,使用者在进行角色演绎的时候,会有不同的场景代入,也就需要不同的声线切换,通过变声就可以实现。
2、更好的实时变声效果
就目前的实时变身效果来说,还有很多的方向可以进行优化。这里举几个例子,大家可以讨论。首先,前面提到,为了保证实时性,只是通过改变说话人音色这一维度进行了调整,其实通过说话人的抑扬顿挫或者发音情感的表达还可以提升识别的相似性。因此,在满足实时性要求的情况下,可以进行更多的探索,将表达的特征更多地放到变声效果器中。
其次,就声码器来说,需要更小的算力以及更好的效果。其实现在的声码器,从自然度来说,已经能够有比较好的表现,但是对于逐点生成的声码器而言,在算力上仍有很大的挑战。因此算力和效果需要得到均衡,并在均衡的基础上获得更加合适的声码器。
另外,更为鲁棒的音素提取模块也是目前困扰 ASR 语音识别的一大难题。在噪声或者复杂场景下,除了人声之外还有别的声音,这会影响语音识别的效果。对于这种情况,可以引入降噪模块提取人声,也可以通过研发对噪声更鲁棒的音素提取模块,使其在噪声中识别出人声。我们在沟通的时候,不管是 ASR 还是变声,还可能会遇到多语种的问题,比如中文中间夹带英文,甚至引用日文等,在这种情况下,就会存在多语种识别的问题,也就是 code-switch,针对这一问题目前还没有完美的解决方案,是今后可以提升的方向。
最后,硬件决定了能够部署的模型的上限能够复杂到怎样的程度。如果在端上有更好的硬件进行部署,就可以在降低端到端延迟的同时实现更好的变声效果。这也是未来需要关注的一个方向。
05 问答环节
1、对于实时变声有什么方法可以有效降低延迟?
我们在做实时变声,尤其是在还需要互动的时候,首先,最好是在云端上进行部署,这样可以降低在服务器进行传输和抗弱网的时候带来的延迟。其次,在做算法的同时,比如进行实时的流式 ASR 会有 lookahead,就比如说我们往后要多看几帧,才能够保证它的识别性准确性。对于这部分,无论是 ASR、TTS 还是频谱转换,都需要控制 lookahead 的 量,让它能够在保证实时性的同时,不至于对效果产生过大的影响。从实践上来说,能够把整体的算法延迟控制到 400 毫秒以内,具体分到每个模块,估计在 100 毫秒左右。
2、Any-to-any 变声的功能在哪里可以体验?个人可以使用吗?
这部分还在打磨阶段,但是我们已经有 demo 可以体验了。最近几个月内会发布 demo 供大家体验。
3、小白如果想系统化学习音频,有比较好的学习资源或者学习路径推荐吗?
我之前跟极客时间合作了“搞定音频技术”的栏目。我发现说其实音频这个领域可能确实有点小众,但它涉及的领域却又非常多。大家可以在网上找一些资源系统化地学习,除了音频本身,其实还包括音频的 3A 处理(音频链路处理)、声学和基于 AI 的技术。
可以先从这几个角度寻找相关的资料,互相融合学习,效果会比较好。
Any to Any 实时变声的实现与落地丨RTC Dev Meetup的更多相关文章
- 实时语音趣味变声,大叔变声“妙音娘子”Get一下
欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由腾讯游戏云 发表于云+社区专栏 游戏社交化是近年来游戏行业发展的重要趋势,如何提高游戏的社交属性已成为各大游戏厂商游戏策划的重要组成部 ...
- 微信变声器(WeChat Voice)会是营销新利器吗
微信变声器(WeChat Voice)2.0 Android版开始内测了,时间从2015年5月20日 - 2015年6月20日,使用微信变声器改变你的声音,并分享给好友! 无论你是想装可爱还是恶搞,微 ...
- 音频算法之小黄人变声 附完整C代码
前面提及到<大话音频变声原理 附简单示例代码>与<声音变调算法PitchShift(模拟汤姆猫) 附完整C++算法实现代码> 都稍微讲过变声的原理和具体实现. 大家都知道,算法 ...
- FMOD变声如何捕获并存储处理音效之后的数据
类似AVAudioEngine的功能,一个Engine可以将N个connect连接(串联和并联)在一起,这样来实现多个输入源,多层处理效果的混合输出.实现这个所需功能也是通过这样的方案来实现的.也就是 ...
- Python实现变声器功能,萝莉音御姐音都有的哦
登录百度AL开发平台 在控制台选择语音合成 创建应用 填写应用信息 在应用列表获取(Appid.API Key.Secret Key) 6. 安装pythonsdk 安装使用Python SDK有如下 ...
- C# NAudio 变声
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.T ...
- 抠脚大叔如何改变性别,Python实现变声器功能
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 乔柯 PS:如有需要Python学习资料的小伙伴可以加点击下方链接 ...
- 浅谈短视频APP的发展趋势
2014年6月20日,在AppAnnie最新发布5月应用指数中,美拍荣登“非游戏类iOS榜单”全球下载量第一位置,成为全球iOS应用商店最热门APP.能在<AppAnnie应用指数>这份A ...
- AliCloudDenoise 语音增强算法:助力实时会议系统进入超清音质时代
近些年,随着实时通信技术的发展,在线会议逐渐成为人们工作中不可或缺的重要办公工具,据不完全统计,线上会议中约有 75% 为纯语音会议,即无需开启摄像头和屏幕共享功能,此时会议中的语音质量和清晰度对线上 ...
- ASM:《X86汇编语言-从实模式到保护模式》第9章:实模式下中断机制和实时时钟
中断是处理器一个非常重要的工作机制.第9章是讲中断在实模式下如何工作,第17章是讲中断在保护模式下如何工作. ★PART1:外部硬件中断 外部硬件中断是通过两个信号线引入处理器内部的,这两条线分别叫N ...
随机推荐
- maven安装在idea中报错
java.lang.RuntimeException: java.lang.RuntimeException: org.codehaus.plexus.component.repository.exc ...
- 视觉里程计1-SLAMCP7
--20.11.27 在CP2里面讲到,视觉SLAM主要分为视觉前端以及优化后端,后端也被称为视觉里程计(VO).根据相邻图像的信息,估计粗略的相机运动,给后端提供较好的初始值.VO的实现方法按是否需 ...
- if __name__ == '__main__':中的语句无法执行
在pycarm中我们用了pytest或unittest框架写测试用例,我们如果我们在最后加上if name == 'main':,如以下代码所示.最后我们右键点击运行的时候是不会执行**if name ...
- 等级保护2.0 三级-Linux 测评指导书
等级保护2.0 三级-Linux 测评指导书 1.1安全计算环境 1.1.1身份鉴别 1.1.2访问控制 1.1.4入侵防范 1.1.5恶意代码防范 ...
- node16 以上版本不能安装 node-sass
最近多次遇到这个问题,node16+版本安装或者初始化带有node-sass和sass-loader包的项目报错. 方法一: 卸载旧版本的node-sass和sass-loader,安装sass和sa ...
- Floyd算法求最短路径
floyd算法用于求图中各个点到其它点的最短路径,无论其中经过多少个中间点.该算法的核心理念是基于动态规划, 不断更新最短距离,遍历所有的点. 知识基础:图的邻接矩阵表示: 如图是一个简单图,从A开始 ...
- 01. JavaScript基础知识
一.JavaScript简介 JavaScript 是一门解释型编程语言,解释型编程语言指代码不需要手动编译,而是通过解释器边解释边执行.所以,要运行 JS,我们需要在计算机中安装 JS 的解释器 ...
- docker 配置 anaconda + jupyter notebook 纪要
首先,pull官方的镜像,名字叫:continuumio/anaconda3 首先的首先,如果默认还是需要sudo运行docker命令,可以考虑把当前用户加入到docker组(usermod -aG ...
- RabbitMQ博文收藏
RabbitMQ基本概念 消息队列之 RabbitMQ
- Android Studio查看指定APP日志
1.启动Android Studio 2.View->Tool Windows->Terminal 3.在底部输入monitor 4.Android Devices Monitor新窗 ...