背景介绍声纹检索,顾名思义,就是说话人识别,通过声音来验证或识别说话人的声音。声纹识别的关键步骤是语音矢量化,即将说话人的声音转化为结构化的矢量。阿里云AnalyticDB矢量版提供了声纹验证和检索的解决方案。用户只需要简单的几条SQL命令,三步就可以搭建出一套高精度的声纹检索和验证服务。声纹识别技术1)声纹检索演示图1为AnalyticDB矢量数据库声纹检索系统的演示界面。为了方便用户体验,我们将380人的语音信息转化为向量存储在系统中。目前的演示系统分为两部分。第一部分是检索部分。用户输入录制的声音文件或用户现场录制并上传声音文件,提交给声纹数据库进行声音匹配检索。第二部分是注册部分。用户可以将自己的声音注册并上传到当前的声纹数据库中,方便后期的查询和验证。在后面的章节中,我们分别介绍各个功能。图1声纹演示系统图2上传一段S0004的测试音频“BAC009S0004W0486.wav”到声纹数据库中检索,可以看到TOP1结果S0004会显示在最上面。图2.查询语音图3为声纹登记系统,用户可以在后台声纹库中登记自己的声音,方便检索。例如,用户韩超将自己的语音(长度只有7s)注册到当前系统。当前系统支持无文字注册,用户说什么都可以注册。图3.注册声音图4演示了用户现场录制声音,将其上传到系统并进行搜索。例如,“韩超”将5秒的语音录入声纹系统进行检索。“寒潮”的声音之前已经注册过,当前系统可以看到排在第一位的是“寒潮”的声音。图4.录音和调取语音目前,声纹演示我们使用1:N的演示结果,可以在会议室进行身份识别,通过语音可以找到相关的会议发言人。目前对于身份验证,这种1:1的演示,我们只需要将距离限制在550以内,就可以方便的进行身份验证。2)应用架构总体设计阿里云声纹数据库检索系统框架总体架构如图5所示,AnalyticDB(声纹数据库)负责整个声纹检索应用的所有结构化信息(用户注册ID,用户名),和其他用户信息)和非结构化信息(语音生成的向量)存储和查询。在查询过程中,用户通过声纹提取模型将语音转化为向量,在AnalyticDB中进行查询。系统返回相关用户信息和l2向量距离[5]。声音提取模型的训练和测试将在下一章讲解。图5.声纹检索库3)系统精度声纹系统目前正在论证中,使用GMM-UMB模型提取的i-vector作为检索向量[3]。此外,我们还训练了更准确的深度学习声纹识别模型(x-vector[4])。此外,还可以针对特定场景进行声纹模型训练,如电话通话场景、手机APP场景、嘈杂噪音场景等相关场景。想了解更多可以加我们群了解更多。在学术界常用的数据集(Aishall.v1[1]数据集和TIMIT[2]数据集)上声纹识别的准确率(1:N)(>99.5%,见表1)。表1.Top1精度测试结果构建声纹系统的三个步骤第一步是初始化。当前系统实现语音转矢量功能。用户将前端获取的语音通过POST请求发送至阿里云服务系统,选择对应的声纹模型,将语音转化为对应的向量。importrequestsimportjsonimportnumpyasnp#sound:Sound二进制文件。#model_id:模型ID。defget_vector(sound,model_id='i-vector'):url='http://47.111.21.183:18089/demo/vdb/v1/retrieve'd={'resource':sound,'model_id':model_id}r=requests.post(url,data=d)js=json.loads(r.text)returnnp.array(js['emb'])#读取用户文件。file='xxx.wav'data=f.read()print(get_vector(data))f.close()在初始化过程中,用户创建相关的用户声纹表。同时,在表的向量列中加入向量索引,加快查询速度。目前的声纹模型输出的是一个400维的向量,所以索引参数dim设置为400。--创建用户声纹表CREATETABLEperson_voiceprint_detection_table(idserialprimarykey,namevarchar,voiceprint_featurefloat4[]);--创建向量索引CREATEINDEXperson_voiceprint_detection_table_idxONperson_voiceprint_detection_tableUSINGann(voiceprint_feature)WITH(distance,measure=400,measure=L2pq_段=40);第二步是注册用户语音。在注册过程中,注册用户并在当前系统中插入一条记录。--在当前系统注册用户“张三”。--通过HTTP服务将声纹转化为相关向量。INSERTINTOperson_voiceprint_detection_table(name,voiceprint_feature)SELECT'张三',array[-0.017,-0.032,...]::float4[])第三步是检索或验证用户的声音。声纹门锁验证(1:1验证):在验证系统中,系统会获取用户的身份信息(user_id),计算输入语音向量与用户在声纹库中的语音向量的距离。一般情况下,系统会设置一个距离阈值(threshold=550)。如果向量之间的距离大于该阈值,则验证失败。如果小于阈值,则声纹验证成功。--声纹门锁检测(1:1)验证SELECTid,--用户id信息名称,--用户名l2_distance(voiceprint_feature,ARRAY[-0.017,-0.032,...]::float4[])ASdistance--vectordistanceFROMperson_voiceprint_detection_table--用户语音表WHEREdistance
