ASR项目实战-架构设计
一般而言,业务诉求作为架构设计的输入。
需求清单
对于语音识别产品而言,需满足的需求,举例如下:
功能需求
- 文件转写。
- 长文件转写,时长大于60秒,小于X小时,X可以指定为5。
- 短文件转写,时长小于60秒。
- 实时语音识别。
- 长语音识别,时长大于60秒,小于Y小时,Y可以指定为5。
- 短语音识别,时长小于60秒。
- 支持多个语种。
- 其它功能需求,比如:
- 前处理
- 支持多种音频文件格式。
- 支持多种采样率和位深。
- 支持去回声和抗噪。
- 支持在音频文件中处理多个声道。
- 中间处理
- 支持VAD。
- 支持区分音频文件中的多个讲话人。
- 支持输出文本对应的时间偏移。
- 支持使用热词提高字准率。
- 后处理
- 支持输出标点符号。
- 支持输出拼音类语言的大、小写。
- 支持数字、符号的归一化处理。
- 前处理
非功能需求
- 集成多个合作伙伴。
- 云云对接,即将请求转发给合作伙伴开放在公网的API服务,通过公网API访问的形式集成其语音识别能力。
- 集成软件包,即将合作伙伴的语音识别服务部署在相同的机房内,通过内网API访问的方式集成其语音识别能力。
- 集成算法库,集成合作伙伴的语音识别能力。
- 集成算法模型,基于相同的算法库,合作伙伴提供模型,进而集成其语音识别能力。
- 控制并发路数。
- 通过接口接入的基础设施,限制并发TPS。
- 基于当前可用的并发路数,限制可以接入的请求数量。
- 基于各个应用的业务推广情况,定义并发路数的最低、最高配额,保证基本的并发路数。
- 基于各个应用的业务实际情况,定义调用量的最高配额,控制调用量。
- 支持扩容。
- 通过扩容硬件的方式,增加服务能力。
- 针对某具体应用的实际情况,通过扩容,满足其业务诉求。
- 针对某具体业务场景的实际情况,通过扩容,满足其业务诉求。
技术指标
- 文件转写场景下的时延类指标,比如
- 转写比,即端到端处理时长与语音文件时长的比值。这个指标不是越小越好,需结合投入的硬件成本综合考虑,定义符合预期的指标目标值。
- 语音识别场景下的时延类指标,比如
- 首字时延
- 尾字时延
- 蹦字时延
- 模型文件的大小,影响如下:
- 决定了软件包版本构建的时间、安装服务的时间、启动服务的时间,是影响版本交付效率的直观因素。
- 模型文件占用的空间越大,则加载模型后,进程占用的内存空间则越大。这对硬件规格和技术方案、部署方案有直接的影响。
- 一定载荷下可提供的并发路数。
运营类需求
- 支持记录具体应用使用语音识别服务的业务调用量。
- 支持基于调用量,对具体应用进行计费。
运维类需求
- 提供日志,比如:
- 提供业务调试日志。
- 提供接口访问日志。
- 提供监控能力。
- 提供对基础设施的监控,比如CPU使用率、内存使用率、硬盘使用率等,以及必要的告警。
- 提供对业务组件的监控,比如进程是否存在,进程的CPU、内存使用率等,以及必要的告警。
- 提供对关键业务指标的监控,比如当前各服务实例在用、可用的并发路数,各业务可用、在用的并发路数等。
安全类需求
- 在云服务API层面增加保护,比如:
- 提供鉴权能力。
- 提供参数校验能力。
- 抵御DOS攻击的能力。
- 对用户数据的管理,包括但不限于:
- 使用安全通道传输用户数据。
- 使用加密方式保存用户数据。
- 允许用户删除数据。
- 允许用户指定数据的保存周期。
- 用户未提供数据保存周期时,系统支持自动删除。
架构方案
基于前述举例列出的需求,整体方案中包括如下组件:
- 业务类组件
- 接入网关
- 安全网关
- 业务网关
- 算法服务
- 支撑类组件
- 运维服务
- 运营服务
- 开发者服务
接入网关
主要职责有:
- 对外提供安全协议的请求通道,比如HTTPS。
- 限制业务请求的速率。
- 基于协议规则的请求流控。
安全网关
主要的职责是对外部发来的请求进行鉴权,拦截非法请求。
当鉴权通过时,补充必要的数据字段,比如应用标识等。
业务网关
主要的职责有:
- 对请求消息中的字段,进行校验,从而拦截非法请求。
- 依据请求消息,依据一定的业务规则,选择合适的算法服务来提供服务。
- 依据一定的业务规则,从指定的算法服务的集群中,挑选一个实例来提供服务。
- 记录业务调用量。
- 记录计费数据。
- 记录必要的运维数据。
- 记录必要的调试日志。
- 基于业务规则的请求流控。
算法服务
算法服务,提供语音识别的基本能力。
依据与合作伙伴的协作方式,算法服务包含如下类型:
- 云云集成,请求转发至合作伙伴开放在公网的API服务。
- 软件包集成,合作伙伴的软件包和自有的组件部署在相同的基础设施上,算法服务与其通过内网API的方式集成。
- 算法库集成,使用JNI方式,算法服务集成合作伙伴提供的算法库文件。
- 算法模型集成,算法服务集成模型,提供服务。
运维管理服务
主要职责是供运维人员管理、分析业务系统运行情况,包含的内容比较广,比如:
- 软件仓库
- 部署管理
- 配置管理
- 运维数据管理
- 采集系统
- 离线监控系统
- 在线监控系统
- 告警系统
运营服务
主要职责是供产品、运营人员分析业务运行现状,比如:
- 运营数据管理
- 采集系统
- 报表系统
- 告警系统
开发者服务
主要职责是供开发者管理业务的运行情况,比如:
- 订阅服务
- 计费报表
技术决策点
划分业务组件中各个组件的职责时,存在一些决策点,对设计方案存在影响,因此需要深入考虑。
语音识别过程可以划分为前、中、后三阶段的处理操作,依据前述架构方案,结合业务场景,需要思考这三个阶段在分别哪个业务组件上交付。
关于前处理
对于实时语音识别,假如使用手机作为录音设备,则可以限定录制时使用的音频文件格式、采样频率、位深、声道的数量,去回声和搞噪可以交给录音设备来完成,因此不涉及复杂的前处理。
对于文件转写,则无法限定音频数据文件的录制设备、文件格式、采样频率、位深、声道数量、录制环境等,因此需要支持前处理。相关的前处理特性,可能的实现位置有业务网关或者算法服务。
假如前处理在业务网关组件上实现,则下载文件、提取音频时长、记录计费数据、记录计量数据、基于业务规则的请求流控等可以一并实现。前处理的音频文件,需要将上传至公共存储,由算法服务下载。
本方案的优点:
- 在业务网关层面可以实现文件有效性的检查,避免将非法文件传递至算法服务,浪费算法服务器的算力。
- 在业务网关层面实现基于业务规则的请求流控,提前拦截非法请求,避免浪费算法服务的算力。
本方案的缺点:
- 业务网关和算法服务需要通过存储服务来传递音频文件,算法服务多了一次下载文件的操作。
假如前处理在算法服务上实现,业务网关组件只需转发请求,而下载文件、提取音频时长、记录计费数据、记录计量数据、基于业务规则的请求流控等特性均需要在算法服务来实现。
本方案的优点:
- 只涉及一次下载文件的操作。
本方案的缺点:
- 算法服务组件的数量比较多,假如音频文件保存在公网的存储服务上,则均需要开放外网访问权限。
- 对于文件有效性的检查延迟到了算法服务组件,恶意的请求可能会占用算法服务的算力资源。
- 基于业务规则的请求流控延迟到了算法服务组件,同样占用了算法服务的算力资源。
关于提取音频文件中音频数据的时长,处理音频文件中多个声道,目前比较简单的方案是使用开源软件FFmpeg来实现。但这款软件存在一些问题,比如:
- License非商业友好。
- 处理音频文件时,比较消耗CPU。
- 为支持某些特定的音频格式时,需要增加一些额外的编码、解码库,编译FFmpeg的过程比较曲折。此外,音频格式涉及到的开源软件,其License可能非商业友好。此外,部分项目的代码比较旧,长期无人维护,遇到问题时会比较尴尬。
- 偶尔会不稳定,对音频文件执行操作时会失败,但事后使用相同的音频文件重现问题时,发现问题无法复现。
关于后处理
语音识别的结果中没有标点符号,作为书面形式阅读时会增加很多障碍,不同的句读可能会产生不同的理解,从而出现不必要的歧义。对于中文而言,这个现象尤其严重。因此为了提升可读性,需要在语音识别输出的结果进行处理,增加必要的标点符号,比如句号、逗号、探号、问号等。
对于拼音类语言,比如英语、法语等,相同的单词在不同场景下,其大小写形式可能会不同,比如the President和the president,前者指代现总统,而后者仅为泛指。为了提升可读性,需要对语音识别输出的结果进行处理,增加合理的大、小写形式。
对于数字、单位等词汇,语音识别的结果中均表示为文字,与通常使用的书面表达形式不同,阅读体验比较差,因此有必要依据一定的规则或者场景将其还原为常见的表达形式,改善阅读体验。
针对上述三个特性,决策点有:
- 实现方案,使用机器学习模型实现,还是使用代码基于一定的规则来实现。
- 实现位置,在业务网关实现,还是在算法服务实现。
ASR项目实战-架构设计的更多相关文章
- Java 18套JAVA企业级大型项目实战分布式架构高并发高可用微服务电商项目实战架构
Java 开发环境:idea https://www.jianshu.com/p/7a824fea1ce7 从无到有构建大型电商微服务架构三个阶段SpringBoot+SpringCloud+Solr ...
- WCF项目的架构设计
本文将介绍以WCF开发项目为主的架构设计,主要从类库的分类和代码的结构. 下面将以一个WCF实例做具体的介绍.此项目底层是一个Windows Service,WCF服务Hosted在此Windows ...
- Redis缓存项目应用架构设计二
一.概述 由于架构设计一里面如果多平台公用相同Key的缓存更改配置后需要多平台上传最新的缓存配置文件来更新,比较麻烦,更新了架构设计二实现了缓存配置的集中管理,不过这样有有了过于中心化的问题,后续在看 ...
- python-django电商项目-需求分析架构设计数据库设计_20191115
python-django电商项目需求分析 1.用户模块 1)注册页 注册时校验用户名是否已被注册. 完成用户信息的注册. 给用户的注册邮箱发送邮件,用户点击邮件中的激活链接完成用户账户的激活. 2) ...
- 第91讲:Akka第一个案例动手实战架构设计
我们来看一下Akka的一个简单的wordcount的案例架构设计 从图中我们可以看出,不同的行我们是交给不同的actor进行入理的,每行首先进行map操作,识别出每个单词,然后交给reduce步骤的a ...
- Redis缓存项目应用架构设计一
一些项目整理出的项目中引入缓存的架构设计方案,希望能帮助你更好地管理项目缓存,作者水平有限,如有不足还望指点. 一.基础结构介绍 项目中对外提供方法的是CacheProvider和MQProvider ...
- vue项目的架构设计完善详解
vue项目构建vuex+mock层 vue项目添加jsBridge(与原生交互的) vue项目添加代码格式化
- 微信小程序全面实战,架构设计 && 躲坑攻略(小程序入门捷径教程)
最近集中开发了两款微信小程序,分别是好奇心日历(每天一条辞典+一个小投票)和好奇心日报(轻量版),直接上图: Paste_Image.png 本文将结合具体的实战经验,主要介绍微信小程序的基础知识.开 ...
- 架构设计的UML图形思考
本篇紧接着上一篇 基本OOP知识 ,介绍高焕堂老师的第二讲. 架构设计的UML图形思考.本篇最重要的是三个词语:图形.思考.UML. 架构师的作用体现主要在项目开发前期.在整个项目还没有完毕的时 ...
- Python NLP完整项目实战教程(1)
一.前言 打算写一个系列的关于自然语言处理技术的文章<Python NLP完整项目实战>,本文算是系列文章的起始篇,为了能够有效集合实际应用场景,避免为了学习而学习,考虑结合一个具体的项目 ...
随机推荐
- 解密Linux中的通用块层:加速存储系统,提升系统性能
通用块层 通用块层是Linux中的一个重要组件,用于管理不同块设备的统一接口,减少不同块设备的差异带来的影响.它位于文件系统和磁盘驱动之间,类似于Java中的适配器模式,让我们无需关注底层实现,只需提 ...
- DHorse v1.4.0 发布,基于 k8s 的发布平台
版本说明 新增特性 提供Fabric8客户端操作k8s(预览)的功能,可以通过指定-Dkubernetes-client=fabric8参数开启: Vue.React应用增加Pnpm.Yarn的构建方 ...
- LDA主题模型讲解及代码Python实现
目录 1. LDA主题模型详解 1.1 Beta/Dirichlet 分布的一个性质 1.2 LDA-math-MCMC 1.2.1 重要理解 1.3 Gibbs Sampling 2. 所需工具库 ...
- JUC并发编程(3)—锁中断机制
目录 1.什么是中断 2.源码解读(中断的相关API) 3.如何使用中断标识停止线程 学习视频:https://www.bilibili.com/video/BV1ar4y1x727 1.什么是中断 ...
- 记录一次gcc的编译
在deepin23上编译gcc13.2 deepin20素以软件版本过老被人诟病,换成最新的deepin23之后情况大有好转,但是gcc版本为11.2,鄙人对此仍有意见,所以特意研究了如何编译一份较新 ...
- 【matplotlib 实战】--直方图
直方图,又称质量分布图,用于表示数据的分布情况,是一种常见的统计图表. 一般用横轴表示数据区间,纵轴表示分布情况,柱子越高,则落在该区间的数量越大.构建直方图时,首先首先就是对数据划分区间,通俗的说即 ...
- [CISCN 2019华东南]Web11
看到下面connection 里面的内容有一点像抓包出来的 就抓包试试 似乎感觉也没有什么用 看到这个东西,那么就想到改IP 添加X-Forwarded-For:127.0.0.1 发现这个IP随着我 ...
- iframe用的场景
iframe可用在以下几个场景中: 1:典型系统结构,左侧是功能树,右侧就是一些常见的table或者表单之类的.为了每一个功能,单独分离出来,采用iframe. 2:ajax上传文件. 3:加载别的网 ...
- c#中工厂模式详解
总体介绍: 工厂模式主要有三种类型:简单工厂.工厂方法和抽象工厂,该模式用于封装和管理对象的创建,是一种创建型模式. 万物皆对象,创建对象时必然需要new该对象,当需要更改对象时,需要把项目中 ...
- 一起来探索CSS中margin属性的奥秘吧!!
作者:WangMin 格言:努力做好自己喜欢的每一件事 众所周知 margin属性 是用来声明当前所设置或者指定元素所有外边距的宽度,或者设置各边上外边距的宽度.一直以来我认为它是一个很简单的属性,但 ...