本文深入探讨前处理环节。

首先介绍一些基本的名词,比如

  • 文件名后缀
  • 文件格式
  • 音频格式
  • 采样率和位深

预备知识

文件名后缀、文件格式和音频格式

常见的音频文件,比如.wav.mp3.m4a.wma等,这些都代表什么?

仅仅是这类音频文件的后缀而已,不一定和音频文件的编码、音频数据的编码相关。

举例说明:

  • 比如.pcm
  • 比如.wav,一般保存的是带有wav规范文件头的,PCM格式的音频。
  • 比如.mp3,指的是保存Moving Picture Experts Group Audio Layer III格式的音频数据的文件。
  • 比如.m4a,和前两个后缀不同,并没有名为m4a的规范,实际指的是保存MPEG-4格式的音频数据的文件。虽然没有以.mp4为结尾,但实际上和.mp4文件遵循了相同的规范,仅仅是由于APPLE的数码产品大热,才让m4a流行起来。而m4a文件存储数据时,可以保存AAC格式编码的音频数据,也可以保存mp3格式编码的音频数据。
  • 比如.wma,微软公司出品,在Windows上可用的音频文件。

从上述介绍可知,各种文件的格式,和音频数据自身的格式,可以不同。了解到这一点,很重要。

一些参考资料:

采样率和位深

采样率,即1秒种之内,采集数据的频率。比如:

  • 电话录音一般为8K,即1秒钟内采集8000次。
  • CD音质为44.1KHZ,即1秒钟内采集441000次。

    显然,采样频率越高,采集到的数据量越大,丢失的信息越少,越接近于原始数据。

位深,即每个采集点,使用多少个二进制位来表达,常见的有:

  • 8位,对应1个字节。
  • 16位,对应2个字节。
  • 24位,对应3个字节。

    显然,位深越大,针对单个采集点的数据,表达的范围越大,越准确。

从抽象的角度看,人的声音,可以理解为信号,而信号可以通过FFT变换,转换为各种波的迭加。理解这一点,很重要。

人的声音,对于大数人而言,发音频率一般在4K以内,基于前述人声可使用信号来表达的理论,使用8K的采样频率,可以满足常见的诉求。

一些参考资料:

声道

相关的词汇有环绕立体声、左右声道等。

通常而言,一个收音设备可以产生一个声道的数据。对于高端会议、电影、流行音乐等,一般会有多个收音设备同时采集数据,因此在同一份音频文件中会产生多个声道。

这非常有助于还原现场的音效,给人以身临其境的美妙体验。

前处理的实现

ASR项目实战-产品分析提到了ASR的前处理过程,包括如下几个环节:

  • 多音频格式的支持
  • 重采样
  • 多声道的处理
  • 降噪和去回声

对于上述多音频格式的支持重采样的支持多声道的支持,简单、有效、低成本的方法,可以使用FFmpeg来实现,有很多资料可以查阅。

不过在将FFmpeg应用到产品里时,特别需要关注其License的相关说明,以及如下文档:

从而选择恰当的集成方式。

ASR项目实战-产品分析所介绍,降噪和去回声一般在收音设备上实现,较少通过软件来实现。主要原因是相关算法比较复杂,导致普通的交付团队会判定投入产出比太低。

对于多声道的处理,这里再多说几句。

分析Google的Speech To Text云服务API的文档,可以发现Google在多声道处理上有独到之处,提供了识别多声道的开关,同时允许指定要处理的声道的数量,代价是每个声道的处理,均要收费。

假如开发者传递的音频里存有多个声道,调用API时:

  • 没有开启声道的识别,则只处理第一个声道的音频数据。
  • 开启了声道的识别,但只指定了一个声道,则仅处理第一个声道的音频数据。
  • 开启了声道的识别,指定了多个声道,则将处理多个声道的音频数据。

对于云服务工程化交付团队而言,多声道的处理,存在一些让人纠结的地方,值得仔细思量,如下:

  1. 关于识别的时效性。假如开发者要求识别音频数据中多个声道的数据,那么工程团队首先需要将多个声道的数据抽取出来,保存至不同的音频文件中,接下来的识别有两个选项:

    1. 串行处理。将多个音频文件按照声道的顺序追加在一起,作为一个任务,提交给传递给引擎识别。这时总体的识别时长会变长,可能影响开发者使用API的体验。
    2. 并行处理。将多个音频文件,提交不同的识别任务。对开发者而言,识别的时长和单声道的音频文件类似。但对云服务团队而言,对任务调度、资源管理、结果组装即是一个考验。
  2. 关于识别结果的组装。对于接口如何定义,有比较大的挑战。
  3. 关于计费。Google的策略是一个声道即收一份钱。这里有一个问题,对于处理失败的音频,是否要收费。
    1. 假如识别失败时不收费,工程交付团队在实施时,需要区分识别成功、失败的场景,并做相应的记录,否则无法满足计费的要求。这个策略会引入一个问题,对于某些恶意人群,可能会反复提交存在问题的音频,导致算法引擎处理失败,这会占用云服务的资源,但却不必付出代价。
    2. 假如识别失败时仍然收费,对于工程交付团队而言,这个策略比较容易实现。唯一的问题在于,需要引导开发者乐意为识别失败的场景付费。

ASR项目实战-前处理的更多相关文章

  1. Asp.Net Core 项目实战之权限管理系统(4) 依赖注入、仓储、服务的多项目分层实现

    0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...

  2. 给缺少Python项目实战经验的人

    我们在学习过程中最容易犯的一个错误就是:看的多动手的少,特别是对于一些项目的开发学习就更少了! 没有一个完整的项目开发过程,是不会对整个开发流程以及理论知识有牢固的认知的,对于怎样将所学的理论知识应用 ...

  3. 【腾讯Bugly干货分享】React Native项目实战总结

    本文来自于腾讯bugly开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/577e16a7640ad7b4682c64a7 “8小时内拼工作,8小时外拼成长 ...

  4. Asp.Net Core 项目实战之权限管理系统(0) 无中生有

    0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...

  5. Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端

    0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...

  6. Asp.Net Core 项目实战之权限管理系统(2) 功能及实体设计

    0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...

  7. Asp.Net Core 项目实战之权限管理系统(3) 通过EntityFramework Core使用PostgreSQL

    0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...

  8. Asp.Net Core 项目实战之权限管理系统(5) 用户登录

    0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...

  9. Asp.Net Core 项目实战之权限管理系统(6) 功能管理

    0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...

  10. Asp.Net Core 项目实战之权限管理系统(7) 组织机构、角色、用户权限

    0 Asp.Net Core 项目实战之权限管理系统(0) 无中生有 1 Asp.Net Core 项目实战之权限管理系统(1) 使用AdminLTE搭建前端 2 Asp.Net Core 项目实战之 ...

随机推荐

  1. SQL Server关于AlwaysOn的理解-读写分离的误区(一)

    前言 很多人认为AlwaysOn在同步提交模式下数据是实时同步的,也就是说在主副本写入数据后可以在辅助副本立即查询到.因此期望实现一个彻底的读写分离策略,即所有的写语句在主副本上,所有的只读语句分离到 ...

  2. 6.swagger完善:界面显示注释+多版本控制

    周末,写点简单的水一下. 新版本的vs创建项目的时候可以选择自带一个swagger.然而这只是基本的swagger功能. 几个接口无所谓啦,随着接口越来越多,就这么丢给你,一时间也会懵逼,所以这篇文章 ...

  3. Hyper-V安装Ubuntu16.04,连接网络的设置

    使用Windows10自带的Hyper-V安装Ubuntu. 进入系统界面后,无法连接网络. 1.首先确定安装虚拟机的网络设置 2.在Wlan属性分享页面中选取对应的网络设置,然后回到属性页面勾选Hy ...

  4. C++的extern关键字在HotSpot VM中的重要应用

    extern关键字有两个用处: (1)extern在C/C++语言中表示函数和全局变量作用范围(可见性)的关键字,这个关键字会告诉编译器,其声明的函数和变量可以在本模块或其它模块中使用. (2)在C+ ...

  5. 记录 Ucharts 的使用

    1.开启 2d 渲染 线上运行开启 canvas2d 可以解决图表显示问题 <qiun-data-charts canvas2d .../> canvasId 可以不传,官方内置生成随机字 ...

  6. MySQL系列之MyCat——架构图、准备、安装、配置文件、垂直分表、MyCAT核心特性——分片(水平拆分)、范围分片、枚举分片、Mycat全局表、E-R分片

    文章目录 1. MyCAT基础架构图 2. MyCAT基础架构准备 2.1 环境准备: 2.2 删除历史环境: 2.3 创建相关目录初始化数据 2.4 准备配置文件和启动脚本 2.5 修改权限,启动多 ...

  7. RocketMQ版控制台,在左侧

    打开IntelliJ IDEA,创建一个Java工程. 在pom.xml文件中添加以下依赖引入Java SDK的依赖库.   <dependency> <groupId>org ...

  8. 在 Rust 中实现 Repository 仓储模式

    前言 单位上有个 Rust 项目,orm 选型很长时间都没定下来,故先设计了抽象的仓储层方便写业务逻辑. 设计抽象接口 抽象只读接口,仅读取使用,目前需求仅用查询 id.查询全部和按名称搜索,当然理应 ...

  9. python - networker api

    Getting Started,概述   NetWorker REST API is an interface that provides programmatic access to the Net ...

  10. 手撕Vue-查找指令和模板

    接着上一篇文章,我们已经实现了提取元素到内存的过程,接下来我们要实现的是查找指令和模板. 大致的思路是这样的: 遍历所有的节点 需要判断当前遍历到的节点是一个元素还是一个文本 如果是一个元素, 我们需 ...