导读 近年来,58同城AI Lab一直聚焦在对话式AI(Conversational AI)领域,自2017年9月研发智能客服开始,我们先后打造了智能外呼、语音质检、智能呼入、语音识别、语音合成等产品和能力。对话式AI的核心是智能语音语义技术,包括语音识别、语义理解、语音合成,2021年,我们将这些产品统一升级为"灵犀"智能语音语义平台,AI销售助手就平台重要应用之一。AI销售助手能够大幅提升销售工作效率,而自然的音色、舒适的节奏和熟悉的口音都可以进一步提升机器人的对话效果,为此我们研发了多说话人多口音的声音克隆服务。
今天的介绍分为五个部分:
1. AI销售助手的背景介绍
2. 基于真实对话数据的少样本声音克隆
3. 多口音口语风格自然度优化
4. 声音克隆服务部署
5. 未来规划
分享嘉宾|周维 58同城AI Lab语音算法负责人
编辑整理|徐谦 阿里巴巴
文字校队|李瑶
出品社区|DataFun
本文转载自DataFun社区公众号:AI销售助手中的声音克隆技术。
01
AI销售助手的背景介绍
58同城是一个生活服务平台,包含房产、招聘、汽车和本地生活四大板块。B端的商家会在平台上发帖。用户浏览帖子后,会和商家进行交流,并且达成成单。在平台内部,销售扮演着非常重要的角色,他会去联系潜在客户,邀请他们成为商家,在平台上进行发帖。
在传统的销售流程中,销售人员会分为两个组。第一部分是商机组。销售人员会从商机库中申领商机。商机可以理解为我们的客户或者用户,我们的人工销售会给他们打电话,如果判断他们是一个有正向意向的商机,则认为是一个转出商机,会再交给销售组的同事来进一步跟进,直至最后的成单。
销售助手引入之后,主要替代商机组的人工销售的工作。它会自动的去商机库中申领商机。通过利用多轮对话的技术和客户来进行语音交流,并且自动会判断出哪些商机是可以转出的,交给销售组。这一过程大大提升了销售的工作效率。
如何评价销售助手的外呼效果呢?首先我们将商机分成三层。第一层是拨打商机,即机器人拨打电话的这一部分的商机或者客户。如果有一些客户接听了电话,并且表达出了正向意向,被机器人识别到了,那我们就认为它是一个转出商机。针对这部分转出商机,我们进行人工抽样标注。如果是人工判断其确实是一个正向意向的商机的话,则认为它是一个合规商机。
我们用拨打合规率来评价机器人的外呼效果。拨打合规率为接听率、接听转出率、和转出合规率三个指标的乘积。其中的接听率和转出合规率与机器人的对话能力的直接关系不大,所以我们使用接听转出率来对我们的外呼效果进行评价。
影响接听转出率的因素主要有以下四个:
首先是商机质量,如果商机本身就有很高的意向,那么它的转出率一定是非常高的。
第二是话术内容,一套好的话术内容,可以更好地引导用户来表达出它的意愿。
第三是对话能力,如果机器人能够更准确地理解对方的意图,并且给出迅速的反应,也会更好地引导他们表达出自己的意愿。
最后是语音的表达能力。我们线上的话术,一部分是采取人工录音的形式,还有一大部分是采用语音合成的。语音合成对我们的外呼效果也有着一定的影响。比如听感比较偏机械,还是更加近于真实的人声;偏朗读风格,还是偏口语化;是否与对话另一头的用户有着相同的口音等等,这些对我们整体的外呼效果都有一定的影响。
在介绍我们的声音克隆方案之前,先听一个案例。这个案例是使用真实的销售语音数据克隆出来的一个具有成都口音风格的机器人和真实用户的对话,其中女声为克隆音,对应的对话内容见上图。
接下来,介绍基于真实对话数据进行少样本声音克隆的方案。
02
基于真实对话数据的少样本声音克隆
简单介绍一下语音合成的基本流程。首先,输入的待合成文本会经过一个前端文本分析的模块,进行文本归一化、分词、注音等工作,将文字转化成音素和韵律表达的序列。这个序列再经过声学模型,转化成频谱,最后再经过声码器,转化成我们听到的语音。
训练一套TTS系统,需要准备文本到语音的Pair对的数据。我们线上的语音数据包括电话平台、呼叫中心、直播和短视频等来源。对销售助手来说,选择使用呼叫中心中的电话销售的音频进行克隆。同时,线上的部分话术是有人工录音来支持的,其中部分人工录音数据,也会被用来训练模型。在采样率选择方面,由于我们实际真实的数据是电话信道的8k采样率,而外呼录音是16k的,所以我们最终的克隆的采样率选择了16k。
使用真实的数据来进行克隆,存在着很多噪音、发音不稳定、数据量不稳定等问题,这就涉及到了数据筛选和预处理的逻辑。
在数据预处理时,首先将一段真实的音频经过VAD来提取出人声的部分。然后从中抽取2秒到10秒时长的音频片段,将它们上采样到16k,用一个音质筛选模型做音质打分。我们使用了一个开源的音质打分模型,它具有五个维度。我们选择前两个维度,筛选出分数超过3分的数据,认为是相对比较优质的数据。
打分之后,进行音色的挑选。目前针对32个带口音的城市,每个城市会挑选出4-5个真实销售的音色来进行声音克隆。挑选完之后的音频片段,用ASR跑出文本和标点,再进行人工校对。人工校对完之后,对整体的音频做一个响度的归一化,让音量保持在同一个水平上。最后,用MFA对齐工具获得每一个音素对应的duration,用于模型训练。
这是目前线上所有音色的分布图。这个柱状图中,横轴表示音色,纵轴表示这个音色对应的训练数据的时长。目前音色数据量分布是非常不均匀的。最高的时长大概是在1小时左右,最低的时长只有20秒。其中橙色部分是包含口音的部分。
1小时的音频的克隆效果如下:
20秒的音色对应的克隆效果如下:
可以看到,不管音频时长是1小时还是20秒,都可以克隆出一个相对比较稳定的声音。
上面就是关于数据预处理的部分,接下来介绍前端文本分析的流程。
首先,对于输入的文本会做一个文本归一化的处理,主要是针对英文以及数字进行转写。接下来,是分词和注音的部分,最后是韵律分析。
韵律分析,主要是使用分词和标点来控制,分为三种停顿级别。一级停顿代表分词,在句子里面用#1来表示。二级停顿代表逗号或者顿号这样的基础标点,用#2来表示。三级停顿是像句子结尾的句号这种符号,用#3来表示。
在声学模型选择方面,在我们的实验下,Tacotron2模型的多说话人表现不稳定,存在一定的吞音的现象,且推理性能较差。因此我们选择使用FastSpeech2模型。
我们在FastSpeech2的模型基础上,做了多说话人的改进。我们使用了Speaker Embedding的方案,用Embedding当中的一个向量来表示一个对应的说话人的音色,并将其Concat到Encoder之后。
线上部署测试方面,FastSpeech2相比于Tacotron2的合成实时率有94%的提升。
关于声码器的部分,我们选择了Multi-Band MelGAN模型。训练时,使用合成谱混合上音频的原始谱,训练出来音频的音质会更加稳定。
在实际使用时,我们遇到了长句合成效果不稳定的问题。上图列出了一段将近300字的文字。在合成时,加粗的部分有一些明显的发音问题。前面部分则比较稳定。
为了解决这个长句的问题,我们首先将长的句子按照最大长度的配置来进行切分。切分成多个短句之后,将这些短句一起输入给声学模型进行推理,得到每个片段对应的频谱。同时对长度做Mask,经过FastSpeech当中的一个扩帧的模块,将它变成一个频谱级别的Mask,再作用于我们合成出来的频谱。最后将拼接的频谱再交给声码器合成音频。这样合成的长句音频会比较稳定。
关于TTS模型的评测,我们选择使用三个维度的指标来进行评测。首先是可懂度,表示录音内容的理解难度,5分代表完全可以听懂,1分表示基本上无法听懂。自然度代表音频的质量,包括噪声的情况。上面两个表格,是外呼录音来克隆出来的5个音色。可以发现,在自然度和可懂度上基本都在4分以上,且与人工录音的自然度是非常接近的。
关于说话人相似度,我们分别使用合成音和人工录音,与人工的参照录音进行对比计算相似度。结果是合成音和人工录音的相似度非常接近,说明克隆出来的音色与原始说话人音色是非常相似的。
从这三个维度上看,目前的克隆效果已经非常接近人工的水平了。但是它在实际外呼的效果怎么样呢?我们可以回到最开始提到的这个接听转出率的评价指标上来看。
我们在线上对克隆音和人工录音的这两个话术进行AB测试,发现克隆音相对于人工录音来说,转出率有明显的下降。也就是说,虽然我们听感上自然度与人工录音相接近,但是实际外呼的水平还是有一定差距。
经过分析,我们总结了4点问题。前两点还是音质和稳定性的问题。我们克隆出来的声音,细听的话和人工声相比还是有一定差距的。另外两点,一是口语词的问题,因为在人工录音的时候,我们会要求其根据我们的话术自由发挥,录音员会插入很多的口语词,甚至将句式改编成他自己比较擅长的句式来录制。我们在合成的时候,则是按照原本的比较书面化的文字来合成的,这样就会导致外呼效果变差。最后一个原因是口音的问题,我们经过人工的带口音和不带口音在对应城市进行外呼对比,发现使用相似相关口音来进行外呼,接听转出率效果要高3%左右。这也是我们后续关于稳定性优化的一些工作。
03
多口音口语风格自然度优化
接下来,介绍关于多口音和说话口语风格下的自然度优化。这一部分主要分为三个模块。首先是对于音质的优化;第二是对于发音和文本相关稳定性的优化;最后是使用文本风格迁移来进行口音化和口语化的工作。
我们可以将音质问题,总结为两类。首先是训练数据本身,因为我们是真实数据的场景,训练数据本身包含着一定的噪声。第二种情况是我们训练数据没有问题,但是模型因为一些机制引入了一些噪音。
接下来会分别展开介绍。
首先是针对外呼录音数据,有些人在录音的时候可能会开着窗,外面会是马路,会有很多的环境噪音,或者是在会议室中有混响。针对混响相对严重,噪音相对比较轻的情况,我们先对这批训练数据进行去噪和去混响处理,然后直接拿这一批数据来训练我们的模型。对于噪音相对来说比较严重的数据则直接删除。降噪处理后,合成音质的提升比较明显。
关于模型降噪,其主要解决的问题是真实销售录音当中的真实的环境噪声。针对这个问题,首先从真实销售录音当中分离出噪音的部分,同时假设外呼录音是干净的音频。我们将这部分真实噪音叠加在我们的外呼噪音上,来进行声学模型的训练,再用干净的外呼录音的音频来训练声码器,使声码器具备一定的降噪能力。
接下来是关于模型引入噪声的部分。这里有一个典型的问题,就是Trim Silence的问题。在训练声学模型时,通常会在训练的时候选择用Trim Silence将前后的长段的静音给剪掉,保证前后的静音对应的duration是一个相对稳定的值。我们在一开始训练的时候,会选择在对齐之后的训练过程中做Trim Silence。这会导致它的对齐的duration会变得不准确,从而导致我们合成出来的录音有发音不准和突发噪音的问题。而解决办法就是直接用Trim Silence对原始的数据全部先进行一遍处理,得到数据之后,再进行重新对齐,然后再拿来训练。这样调整完之后的效果相对来说就会比较稳定。
除此之外,我们还进行了一些其他方面的音质优化工作,比如超分辨率和HIFI-GAN,但超分辨率会引入额外“电流“噪音,HIFI-GAN的收益不明显且模型较大,均未采用。
以上就是音质方面的优化,接下来介绍一下发音稳定性方面的工作。
2. 发音与稳定性优化
所谓稳定性,指的是随着文本的变化,模型合成的音色和韵律一致性是较强的,且发音清晰,而少样本克隆出来的文本稳定性较差。针对这个问题,我们首先是想到使用GRL,也就是梯度反转层,来将我们说话人的信息和文本的信息进行解耦,从而实现更好的音色之间的迁移,但最终在我们的数据上面的效果并不是特别的显著。
第二个部分,是声学模型的调整,我们将FastSpeech2中的encoder结构,从Transformer换成Conformer,那么它的发音咬字会更加清晰一些,这在真实数据四川口音克隆上的优化效果更加明显。
接下来介绍一下我们关于口语化的工作。
3.文本风格迁移
为什么人工录音要比合成声音更加自然?前文中有提到,人工在录制话术的时候,是有一定自由发挥的空间的,可能会插入很多的口语词、笑声、换气声,包括一些犯错的情况,这些会使录音听起来就会更加像人,更加自然。同时,人工录音的停顿和韵律的节奏也会比较好一些。
而针对不同的口音,在文字当中是需要有不同的表现的。比如对于东北话中的“干哈、隔哪儿呢”,四川话中的“啥子、没得”,这些如果在文字当中不体现,模型是没有办法合成出来的。下面视频中列出三个录音以及其对应的文字,从上到下分别是:书面化文本、口语化改写之后的文本、口语化改写后在去掉口语词的文本,可以直观地感受一下口语化改写后的效果。
所以我们希望有一个模型可以实现自动对书面化文本做口语化改写的功能,同时能按照不同说话人的风格以及口音来进行改写。我们选择使用具备多任务能力的PromptCLUE来作为基础模型来训练,在构造prompt的时候,我们会尽量融合更多的语音相关任务。
右边这张图,就是我们构造的模型的一个简单的示例。基础模型是T5,第一个绿色的CASE就是我们关于口语化风格迁移的工作。前半部分是prompt的,后半部分是我们输入的文本。模型的输出是我们经过口语化后的文本。
在执行这个任务的同时,为了提升模型的泛化能力,我们也加入了很多跟语音相关的其它任务,比如文本纠错、口语顺滑,以及正则化和反正则化。我们希望这个模型可以处理多种语音任务。
在构造数据方面,我们选择在prompt当中去插入不同音色和不同口音的标识,以实现同一句话做不同风格的迁移。比如“把下面句子用629成都风格口语化改写“,其中的629为说话人ID。口语风格化迁移后的效果如下面视频所示。
可以感受到,进行了风格化迁移之后,自然度有了明显的提升,对于口音音色则更加明显。接下来我们看一下进行了音质和风格化优化之后的实际外呼效果如何。
在新模型上线之后,效果有着明显的提升,甚至超过了人工录音的效果。尤其是对于口音城市,口音克隆音相比普通话的人工录音,有着显著的提升。同时,在普通话城市,我们使用普通话,通过调节一些文本内容,外呼效果也达到了非常显著的提升。
04
声音克隆服务部署
声音克隆的部署拆成了两个服务,首先就是前段文本分析的服务,然后是后端的声学模型和声码器服务。
在后端的服务中,我们把声学模型和声码器打包在同一个模型当中,然后用TF Serving来进行部署。经过我们对于不同长度的文本进行测试,目前合成的平均实时率在0.02左右。
最后介绍一下关于可控能力的开发。
首先是语速方面。我们是直接把FastSpeech2当中的duration,乘以相应的倍数来进行控制。音调,是直接对前端的注音模块,直接修改其注音结果来进行修复。
对于停顿控制,如果直接去修改FastSpeech当中的duration,训练出来的停顿时长是不准确的,并且整体的合成效果会受到影响,因此我们在前端对于输入文本想要停顿的位置,插入一个希望停顿的时长,比如2.5秒,然后在相应的频谱中插入静音段,最后经过声码器就会有一个非常准确的停顿。
05
未来规划
最后分享一下关于未来的规划。主要有两个方向。
第一个方向就是希望合成的结果更加自然。首先是音质方面,因为我们的数据本身就是含噪的,合成音的音质还是会受到影响,我们会在这个方面继续探索。另外就是一致性的持续优化。
第二个方向就是让克隆更加高效,压缩克隆新音色需要的训练时间,同时会尝试更多zero-shot的方式。
上图中也列举了我们其它一些相关工作,欢迎大家关注我们的两个公众号。我们会不定期地将我们的工作以文章的形式发布在公众号上。
06
A:方言口语风格迁移方面,我们的target就是我们ASR的结果了。因为这个是非常准确的带口语词的文本。关于文本化的部分,也就是偏向于书面化的这一部分,我们是用了大模型,比如ChatGPT,包括我们自己内部的大模型来进行改写。因为这样的大模型做书面化的改写效果是比较好的。比如我们可以让它将方言的文本改成普通话,不带口语词的这种文本表述,它可以非常准确地做一些改写,而且还是自带数据增强的效果。这就是我们主要的数据构造方式。
Q2:会专门采购高品质的语料和音频录音来辅助基础模型训练吗?这个噪声数据是通过人工来过滤吗?
A:我们是没有采购高品质的语料的,基本上都是挖掘出来的语料,以及线上人工录音的语料。噪音部分,数据过滤的这部分数据是人工进行处理的。因为需要根据不同的这个噪音的程度来控制这个降噪的一个幅度。所以这部分的操作是首先通过人工分类来进行人工去噪的。
Q3:改写的质量怎么样去控制?
A:改写的质量主要是通过训练数据来控制。因为finetune的时候其实会有很大的不稳定性。我们目前针对口语化任务,使用了十万个训练数据来进行训练。同时在prompt上面,我们也是做了非常多的多样化的处理。比如prompt的句式进行一定的改写,来增加它的稳定性。目前来看,我们使用下来,大意是没有特别大的出入的,只是每次改写的质量可能会存在一定的不稳定因素。这一部分也是需要我们不断地去通过数据,通过finetune的一些技巧来进行优化。
Q4:请介绍一下应用层面,比如神奇面试间的一些训练模型,这块有相关的内容吗?
A:神奇面试间训练模型,指的是TTS模型的话,我们用的都是同一套的多说话人的模型。我们的框架是基于tensorflow的。然后其他的框架的话,比如说paddle speech,或者是wetts,其实效果都是不错的。
Q5:口语和方言,合成用的基模型也需要口音和口语、方言的语料去训练吗?
A:要想合成带方言的这样的音色,就必须要用方言的语料来进行训练。我们也是通过从线上数据去挖掘,从不同的城市挑选出比较典型的同时大部分人能听得懂的方言来进行训练。
今天的分享就到这里,谢谢大家。
作者简介
周维,58同城TEG-AI Lab语音算法部负责人,负责语音识别、语音合成算法研发。2016年硕士毕业于中国科学院大学,毕业后参与对话式AI产品方向创业,2018年5月加入58同城,曾先后参与智能客服、智能外呼、智能写稿等AI项目的NLP算法研发,2019年开始主攻语音算法方向,带领团队从0到1自主研发58同城语音处理引擎中的语音算法。
相关工作
本文分享自微信公众号 - 58技术(architects_58)。
如有侵权,请联系 support@oschina.cn 删除。
本文参与“OSC源创计划”,欢迎正在阅读的你也加入,一起分享。