其他分享
首页 > 其他分享> > 浅谈语音技术(ASR/TTS/质检/声纹)

浅谈语音技术(ASR/TTS/质检/声纹)

作者:互联网

文章目录

1. 写在前面

  由于工作和爱好原因,近几年都在做人工智能这个领域的项目,下面结合个人的经验,梳理了语音这一块的一些知识,希望能够给到大家一些参考和帮助。

2. 语音合成 TTS

(1) 基本概念

  TTS是Text To Speech的缩写,即“从文本到语音”,是人机对话的一部分,让机器能够说话。

(2) 效果评估方法

  一般对TTS评估,有个指标称为MOS分,在MOS方法中,0分代表最差的质量,5分为最高分。目前百度、阿里、讯飞大概在4.5分左右。

  常用的MOS分评价方法包括主观MOS分评价和客观MOS分评价。

  主观MOS分采用ITU-T P.800和P.830建议书,由不同的人分别对原始语料和经过系统处理后有衰退的语料进行主观感觉对比,得出MOS分,最后求平均值。

  而客观MOS评价则采用ITU-T P.862建议书提供的PESQ(Perceptual Evaluation of Speech Quality)方法,由专门的仪器(如Agilent的VQT测试仪)或软件进行测试。

  目前,影响MOS水平最大的因素为语音编码方案,其次为频繁切换、LAPD压缩和质量(RxQual)。总之,在目前语音编码不变的前提下,合理控制过覆盖,并减少频繁切换,尽量提升网络质量(RxQual),从而提高部分MOS水平。

(3) 音色与定制

  声音是有版权的,如果希望定制某个声优或名人的音色的话,需要有10小时左右几千句话的语料,成本大概在20w左右。

  当然市面上也有让你录制几句话,就能够发出和你一样声音的产品,仔细听就能发现,发音只是点像,但不会太细致。

(4) 发音规则

  在这里先介绍:语音合成标记语言(SSML:Speech Synthesis Markup Language),它是W3C的语音接口框架的一部分,是关于语音应用和在万维网上构建语音应用的一套规范,通过SSML,人们可以更多的通过移动电话、桌面计算机和其他设备来聆听合成语音,把计算和信息传输延伸到全球每个角落。

  对于多音字、数字、电话号码等,不同场景下发音规则不一样,例如阿里tts可以支持SSML语法,动态调整TTS的发音,但是实际使用中发现,各家语音厂商支持的SSML语法还有细微差别,这就对于希望灵活切换语音引擎这件事情,变得不那么顺畅。

  从SSML语法上看,灵活性由客户端自由控制,但是对于细分领域,就需要对TTS的语音引擎进行调整,从服务端进行调整,目前有部分语音厂商也做了这块的优化,据说阿里今年也会出。

3. 语音识别 ASR

(1) 基本概念

  语音识别(Automatic Speech Recognition)是以语音为研究对象,通过语音信号处理和模式识别让机器自动识别和理解人类口述的语。语音识别技术就是让机器通过识别和理解过程把语音信号转变为相应的文本或命令的高技术。语音识别是一门涉及面很广的交叉学科,它与声学、语音学、语言学、信息理论、模式识别理论以及神经生物学等学科都有非常密切的关系。

  关于采样率,一般模拟电话系统传输的语音的采样率是8000Hz,数据通道的采样率是16000Hz,在相同条件下ASR效果与采样率正相关。

(2) ASR效果影响因素

  目前大厂的一些ASR引擎,在理想环境下准确率能够达到98%,什么样的环境是理想环境呢?下面我们介绍影响ASR效果主要因素,分别是:口音、噪音、专业术语。当然在真实环境中,一般准确率在90%左右,做语音项目较多的团队会发现,实际情况下,如果说话人语速过快和过慢,也会影响ASR的识别效果,给大家一个正常语速的参考标准:2~6个字/秒,在这个指标以外的语速下,ASR的识别效果会有较大的出入。

口音

  在普通话的ASR引擎中,带有方言/口音的,会出现识别效果不好的情况,这是因为使用的是普通话的语音语料进行的声学模型训练,所以很多语音厂商开始搜集方言数据,进行方言模型的训练,目前很多大厂也已经出了部分特定方言的ASR引擎。

  但是在真实应用场景下,是无法判断用户说的是普通话还是其他什么地方的方言,所以,在多方言+普通话语音引擎的支持下,会先对用户说的话进行分类,再根据分类情况,调用适当的引擎来提高ASR的效果,这块细节只知道一些皮毛,所以不做过多的分析,如有出入,还请指出。

噪音

  根据之前的经验,在安静环境、使用普通日常用语的情况下,知名大厂和小公司的ASR引擎,语音识别准确率差别不太大,嘈杂环境下,语音识别的准确率就会有不小的差异。

  一些做车载ASR的,会搜集发动机等车内噪音,进行处理和训练,会在车载场景有很好的效果。

  对于呼叫中心来说,坐席与用户通话的时候,用户那边噪音情况复杂多样,很难进行专门的噪音处理。

专业术语

  ASR识别的结果,本身是一个概率计算,生僻词等出现的概率会小一些,对于专业术语多的场景,对未进行优化的语音引擎,识别效果自然会降低。对于这部分的优化方案,在后面第4小节中会详细介绍。

VAD

  对于实时的人机交互场景下,VAD也是语音识别效果的一个影响因素。

  VAD的全称是:Voice Activity Detection (语音激活检测/端点检测),语音端点检测一般用于鉴别音频信号当中的语音出现(speech presence)和语音消失(speech absence)。

  前端点检测

  在人机交互中,用于检测说话人最开始说话的事件,一般情况下这个事件会触发ASR的拾音,前端点检测效果的好坏会影响用户说话的前面1-2个字,在实际使用过程中,对于语义理解会有一定的影响。

  后端点检测

  在人机交互中,用于检测说话人说话结束的事件,用户说完一句话之后静音长度超过该值,即本句结束,目前阿里官方实时语音识别的文档中,合法参数范围200ms~2000ms,默认值800ms,可参考。

  如果后端点检测时间设置过长,会出现人机交互过程中,用户直观感受是机器人的反应较慢,因为在后端点检测完成后,会调用NLP的接口,反馈后再调用TTS服务进行语音播报,这个过程是串行的,所以合理的设置对用户体验影响较大。

(3) 效果评估方法

  语音识别准确率的常用度量指标:

  这两种指标都是用编辑距离(Levenshtein distance)来衡量的,即计算语音识别结果文本和标注文本的编辑距离。

  中文ASR常用字错率CER;而英文中单词为最小单位,因此常用词错率WER,不过CER与WER核心的计算方法一样。

  我在梳理WER/CER的过程中,发现网上不少帖子中对WER/CER的概念是混用的,不过根据实际的内容描述,基本都是讲的CER。

  下面我们重点介绍CER,计算公式如下:

CER = (S+D+I)/N

其中:

  所以,CER值的范围是[0, 无穷大)。

  可以看出,CER的分子的计算其实就是编辑距离(Levenshtein distance),其公式如下:

下面给出一段实现的python代码:

import re
"""
清洗所有字符
"""
def clean(text):
    
    return re.sub("[\s+\.\!\/_,$%^*(+\"\')]+|[+——()?【】“”!,: 。?、~@#¥%……&∶*()]+", "", text)

"""
编辑距离
编辑距离又称Levenshtein距离,是指两个字串之间,由一个转成另一个所需的最少编辑操作次数。
许可的编辑操作包括将一个字符替换成另一个字符,插入一个字符,删除一个字符。一般来说,
编辑距离越小,两个串的相似度越大。
"""
def edit_distance(chars, other_chars):
    w, h = len(chars), len(other_chars)  # 计算出长和宽
    array = [[0 for _ in range(h + 1)] for _ in range(w + 1)]  # 初始化
    for i in range(w + 1):
        for j in range(h + 1):
            array[i][j] = i + j if i == 0 or j == 0 else min(array[i - 1][j - 1], array[i - 1][j], array[i][j - 1]) + 1
            array[i][j] = array[i - 1][j - 1] if chars[i - 1] == other_chars[j - 1] else array[i][j]
    return array[w][h]

print(edit_distance('我吃饭了', '我正在吃饭')) # 3
    
"""
二次封装,通过CER计算错误率后,计算出ASR的准确率
"""
def get_asr_precision_by_cer(text, asr_result):
    text = clean(text)
    asr_result = clean(asr_result)
    ISD_count = edit_distance(text, asr_result)
    total_count = len(text)
    return 1 - round((ISD_count/total_count),4)

print(get_asr_precision_by_wer('我吃饭了', '我吃饭了')) # 1.0
print(get_asr_precision_by_wer('我吃饭了', '全部错误')) # 0.0
print(get_asr_precision_by_wer('我吃饭了', '天下雨了')) # 0.25
print(get_asr_precision_by_wer('我吃饭了', '我没吃饭')) # 0.5

  这里也分享一篇写WER/CER存在缺陷的文章:https://awni.github.io/speech-recognition/ ,感兴趣的也可以看看。

  讲完WER/CER,顺便提一下SER,句子识别错误率,SER表述为句子中如果有一个词识别错误,那么这个句子被认为识别错误,句子识别错误的的个数,除以总的句子个数即为SER。

  SER计算公式如下:

SER = sentences with at least one word error / total of sentences

(4) ASR效果提升方案

声学模型(AM)

  声学模型是指与声音相关的部分。

  对于口音这种问题,一般使用声学模型的方案进行优化,如果要独立训练一种新的方言模型,一家具备语音技术的公司,语料准备与标注等数据相关的投入都会在百万级别(85-90%准确率),同时语料的准备和标注,还需要找专业的人员进行标注。一般这种方式的成本是比较高的,投入需考虑实际成本。

语言模型(LM)

  语言模型是指与文本内容相关的部分。

  对于通过语言模型来提高ASR准确率,可以通过大量的文本信息进行训练,例如阿里就提供了语言模型的训练平台,需要导入以句子为单位的专业术语语料,进行语言模型的训练,同时支持热词的导入,提高对于特定术语的选择概率。

  这种方式相对成本会低一些,不过热词的数量不建议过多。

4. 语音质检

(1) 基本概念

  目前行业大部分情况下提到的语音质检是指录音质检,现在新兴的质检称为语音实时质检,他们之间的区别主要是事中质检和事后质检,实际质检过程中能做的事情和用到的技术基本一致,我们这里主要讨论录音质检。

  语音质检是为了促进企业营销、市场开拓,提高客户满意度、完善客户服务,同时对客服人员工作的考评。呼叫中心产生庞大的电话录音,就需要对这些录音进行质检,检测客服人员是否使用规范用语、是否服务到位,满足客户所需。

(2) 质检效果

  既然是录音质检,那么说明语音文件经保存到本地了,假定一个呼叫中心1天100个坐席,1个坐席每天算4-5h的实际通话录音,每个小时的录音在60Mb,每天录音文件占用的存储空间也是巨大的,一般呼叫中心会保存3年录音,那么实际存储的录音肯定会进行压缩。

  一般压缩后的录音文件,ASR的效果会降低,无优化的情况下,ASR识别准确率在60-70%是正常的,优化后,能达到80%-85%已经是效果很好的了。

(3) 质检方法

语音关键词检索

  通过对语音引擎转写后的结果,进行文本的关键词/正则表达式的匹配,根据检索条件的配置,触发对应的质检结果,反馈到质检平台中。

语音分析

  根据不同声道的语音情况,对坐席的语速/声音大小/是否存在抢话等进行检测,触发对应的质检结果后,反馈到质检平台中。

情感识别

  情感识别分为2种,一种是文本情绪识别,另一种是语音的情绪识别,可以通过规则配置,将特定的情绪进行配置,触发质检规则后,能够在质检平台看到实际的情况。

5. 声纹识别

(1) 基本概念

  声纹识别是生物识别技术的一种,也称为说话人识别,包括说话人辨认和说话人确认。声纹识别就是把声信号转换成电信号,再用计算机进行识别。不同的任务和应用会使用不同的声纹识别技术,如缩小刑侦范围时可能需要辨认技术,而银行交易时则需要确认技术。

(2) 优缺点

优点

  声纹识别应用有一些特殊的优势:

缺点

  声纹识别的应用有一些缺点,比如同一个人的声音具有易变性,易受身体状况、年龄、情绪等的影响;比如不同的麦克风和信道对识别性能有影响;比如环境噪音对识别有干扰;又比如混合说话人的情形下人的声纹特征不易提取;

(3) 分类

  声纹识别分两类:

  前者用来判断某段语音是若干人中的哪一个所说的,是“多选一”问题(当然如果涉及到多人说话情况下的多人声纹识别,则为“多选多”问题,也归于说话人辨认)。后者用以确认某段语音是否是指定的某个人所说的,是“一对一判别”问题。

(4) 评估指标

等错误率 EER

  在讲EER前先介绍两个重要参数:

  错误拒绝率FRR是拒绝真正说话人而造成的错误,举个例子,用你感冒了,这个时候你的声音有一些变化,此时使用声纹识别就无法通过认证,称为错误拒绝,错误拒绝率高则系统安全性高,一般在银行错误拒绝率高。

  错误接受率FAR是接受集外说话人而造成的错误,举个例子,你的手机被陌生人捡到了,陌生人用他的声音打电话给银行进行声纹验证,本不该认证通过的但是认证通过了,错误接受率高则系统不安全。一般在应用中特定人的语音唤醒场景中错误接受率高。

FRR/FAR关系

  如上图所示,FRRFAR阈值相互影响且为负相关,所以对于阈值的设定要根据场景进行针对性的设置。

  两者相等的值称为等错率(Equal Error Rate, EER)。

  在现有的技术水平下,两者无法同时达到最小,需要调整阈值来满足不同应用的需求,比如在需要“易用性”的情况下,可以让错误拒绝率低一些,此时错误接受率会增加,从而安全性降低;在对“安全性”要求高的情况下,可以让错误接受率低一些,此时错误拒绝率会增加,从而易用性降低。前者可以概括为“宁错勿漏”,而后者可以“宁漏勿错”。我们把真正阈值的调整称为“操作点”调整。好的系统应该允许对操作点的自由调整。

响应时间

  所谓响应时间是指,从用户开始说话,到能够识别到说话人角色情况的时间,一般情况下,和说话人说的内容,说话人说话的时间有关系。

  在实际场景中,声纹识别分为 1:1,1:N,N:N 的情况,这三种情况的声纹识别,接口响应时间依次是正向指数级别增长的关系,当然,对于计算和比较这些逻辑,在技术上是有提高响应速度的优化方案的。

  在声纹识别中,一般分为文本相关与文本无无关的识别,基本情况如下:

  文本相关:一般用数字密码,在注册时,用户根据应用要求读对应的数字,一般情况下,会将1/7去掉(因为读音类似),然后实际应用中,随机生成一段验证码,让用户读出来,进行声纹识别,这种方法的好处是,在很短的时间内就能够识别出说话人的声纹结果,一般在2秒以上就能识别到不错准确率的声纹结果了。

  文本无关:一般说话人在5~15秒左右,能够识别出说话人在声纹库中的具体的角色,准确率能够达到90%左右。

以上内容以参加语音技术培训为框架,结合了平时的项目经验,同时也查询了一些资料进行梳理的,如有不准确的地方,希望指正。

标签:ASR,浅谈,声纹,CER,语音,声纹识别,质检,识别
来源: https://blog.csdn.net/initiallht/article/details/115307845