MyVoix2.0.js 源码分析 WebSpeech与WebAudio篇

摘要:
WebSpeech WebSpeech API由SpeechAPICommunityGroup发布。它的主要功能是将语音输入转换为文本。如果您可以添加语义分析服务器,它就是Siri。回到代码,要使用webSpeech API,我们首先需要创建一个窗口webkitSpeechRecognition对象。MaxAlternatives:为每个结果设置最大SpeedRecognition Alternativs。接下来,我们调用实例的start方法以启用SpeedRecognition的监视。

楔 子

  随着移动互联网时代的开启,各种移动设备走进了我们的生活。无论是日常生活中人手一部的手机,还是夜跑者必备的各种智能腕带,亦或者是充满未来科技感的google glass云云,它们正渐渐改变着我们的生活习惯以及用户交互习惯。触摸屏取代了实体按键,Siri开始慢慢释放我们的双手,而leap motion之类的硬件更是让我们彻底不需要接触IT设备便能通过手势控制它们。在这样的大背景下,前端的交互将涉及越来越多元的交叉学科,我们正如十几年前人们经历Css的诞生一样,见证着一场带动整个行业乃至社会的变革。

放下IE6正如你放下table布局

  如果现今你的工作还只是每天严谨地去兼容IE6,那么是时候起身遥望身边的风景了,HTML5已经远远不只是那些渐变和圆角了。这篇博文中,我会像大家介绍Web SpeechWeb Audio两组API,这是MyVoix.js框架的核心组成部分,在早前好几个版本的chrome这就已经实现,你可以通过webkit前缀调用他们。

Web Speech

  WebSpeech API是由Speech API Community Group发布,主要功能是将语音输入转换成文字,如果你能加上一个语义分析的服务器,那它就是一个Siri。你也可以简单地把它理解成一个可编程的input语音输入框(如下代码)。

<input type=”text” x-webkit-speech lang=”zh-CN” />

  在Siri刚刚出世的那个年代,上面这行代码就是前端界让屌丝变高富帅的利器,老板才不知道你才写了一行代码就搞出一个语音输入框(偷偷在input上加过x-webkit-speech的同学们请点赞)。但是,仅仅一个输入框标签显然不能满足程序员们那熊熊燃烧对代码的控制欲,于是Web Speech应运而生。

  再回到代码,要使用webSpeech API我们首先要创建一个window.webkitSpeechRecognition对象。

1 var _rec =new window.webkitSpeechRecognition();
2     _rec.continuous=true;
3     _rec.interimResults=false;
4     _rec.lang='en-US';
5     _rec.maxAlternatives=1;

  为了大家看的清楚,这里我稍稍修改了MyVoix中的源码。可以看到新建SpeechRecognition实例后,有几个参数需要我们配置。

  continuous:如果置为false,那么当实例start之后,若没有输入或者输入错误就会立刻返回。这里需要等到有意义的输入才返回,所以我们置为true。

  interimResults:如果设置为true,那么在onresult的时候就会不断有分析过程中的单词返回。这里只需要最后的分析结果,所以置为false。

  lang:这个是语言,大家应该都看的懂。

  maxAlternatives:设置的是每个result最大的SpeechRecognitionAlternatives。

  接下来我们调用实例的start方法就会开启SpeechdRecognition的监听。但是在此之前还需要指定实例的onresult事件,语音分析完成后的单词会传入这个方法。

 1 _rec.onresult=function(eve){
 2     var len = eve.results.length,
 3         i = eve.resultIndex,
 4     j = 0,
 5     listeners,
 6     command;
 7     for (i; i < len; i += 1) {
 8         if (eve.results[i].isFinal) {
 9         // get words
10         command = eve.results[i][0].transcript.replace(/^s+|s+$/g, '').toLowerCase();
11         if(console.log){
12             console.log(eve.results[i][0].transcript);   
13         }   
14         //your code here....       
15     }
16     }
17 };
18 _rec.start();            

  MyVoix中对于单词事件的绑定有自己的架构,之后的博文有机会会详述。

Web Audio

      搞定了语音识别,接下来我们就需要获得麦克风的输入信号,以便实现MyVoix中的绘制波形功能。如果你用javascript调用过摄像头,那你一定用过navigator.webkitGetUserMedia这个东西,Web Audio中获取麦克风的音源数据就需要用到它。先看一下MyVoix中的源码:

 1 navigator.webkitGetUserMedia({audio:true},function(e){
 2               var context = new webkitAudioContext(),
 3               javascriptNode = context.createScriptProcessor(2048, 1, 1),
 4            audioInput = context.createMediaStreamSource(e),
 5            analyser = context.createAnalyser(),
 6            splitter = context.createChannelSplitter();
 7            analyser.smoothingTimeConstant = 0.3;
 8            analyser.fftSize = 1024;             
 9            audioInput.connect(splitter);
10            splitter.connect(analyser,0,0);
11            analyser.connect(javascriptNode);
12            javascriptNode.connect (context.destination); 
13                             
14     javascriptNode.onaudioprocess = function(e) {        
15                       var array =  new Uint8Array(analyser.frequencyBinCount);
16                       analyser.getByteFrequencyData(array);
17                       var average = me.getAverageVolume(e.inputBuffer.getChannelData (0));
18                      if (average > 0) {
19                              me.changeNoise(average);
20                           me.changeFrequence(average);
21                      }
22     }
23 },function(){});

  初看之下,和WebGL有点类似,你需要链接一堆堆的东西。进一步分析代码:

navigator.webkitGetUserMedia({audio:true},function(e){
    //success callback
    //... 
},function(){
    //error callback
    //... 
};

  第一步使用webkitGetUserMedia对象调用本地麦克风,主要代码在成功回调函数中实现。

var context = new webkitAudioContext(),
    audioInput = context.createMediaStreamSource(e);

  之后我们需要建立一个webkitAudioContext实例,通过该实例可以创建许多有用的元件。这里通过createMediaStreamSource方法和getUserMedia成功回调函数中的参数可以创建一个输入源。 通过一层层的传递可以最终连接到context.destination这个输出位置。我们简单过一下MyVoix中用到的几个节点:

  analyser:这个一看就是分析音源用的,具体一般用在声音可视化上。

  splitter:此节点用以声道转换,在MyVoix中我们用它把音源变成了左右两个声道。

  javascriptNode:这个节点我们用来进行javascript级别的监听处理。通过onaudioprocess函数,在每次声音完成采样的时候,调用我们绘制波形的函数,并最终通过它连接到输出端。

  在MyVoix2.0中,大致就只用到了以上几个AudioContext创造的节点。通过类似的方法加入其他节点,Web Audio还可以实现声音在3D空间中定位播放等功能。

 

尾 声

  本文介绍了在MyVoix中用到的两个核心的技术,通过这篇博文希望大家对语音技术在html端的实现有大致的了解。我们在园子里写作,不用像鲁迅先生一样战斗,却也盼着技术推进这个时代。

      myvoix源码地址

  转发请注明出处http://www.cnblogs.com/Arthus/p/3889457.html

免责声明:文章转载自《MyVoix2.0.js 源码分析 WebSpeech与WebAudio篇》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇(转)iOS动画Core AnimationJVM自定义类加载器加载指定classPath下的所有class及jar下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

ZeroMQ示例(C/C++/PHP)详解三种模式

源自:https://blog.csdn.net/qq_16836151/article/details/521081521、应答模式2、均衡分配模式(推拉模式)3、发布订阅模式(天气预报) 提问-回答 让我们从简单的代码开始,一段传统的Hello World程序。我们会创建一个客户端和一个服务端,客户端发送Hello给服务端,服务端返回World。下文是...

解决IE中部分文件格式不能下载的问题(附MIME大全)

     昨天有同事突然反映说自己上传了一个文档下载不了,急忙上系统查看。发现是.xlsx文档,原来是office2007创建的文档。仔细查看了一下文件确实存在,但是查看的时候浏览器弹出提示:http 404错误。说不存在此文件路径。但是其他的文件比如xls,doc文件都是可以的。更奇怪的是在另外一台服务器上是不存在该问题的。      今天来到公司又想起...

实验 1 : Mininet 源码安装 和可视化拓扑工具

实验 1 : Mininet 源码安装 和可视化拓扑工具 一、 实验 目的 掌握 Mininet 的源码安装方法和 miniedit 可视化拓扑生成工具。 二 、实验 任务 使用源码安装 Mininet 的 2.3.0d6 版本,并使用可视化拓扑工具生成一个最简拓扑(1 台交换机连接 2 台主机)。 三 、 实验步骤 1. 实验环境 安装了...

vue 优化小技巧 之 require.context()

1、require.context() 回忆一下 当我们引入组件时   第一步 创建一个子组件   第二步 import ... form ...     第三步 components:{..}       第四步 页面使用 <...></...>   代码实现:                                 ...

Spring源码系列1

一、搭建源码环境 从Spring官网下载源码,我下载的是spring 4.3.26。 spring源码下载地址:https://github.com/spring-projects/spring-framework/releases spring发布包下载地址:https://repo.spring.io/release/org/springframewo...

从微信SDK看ProtoBuffer文件的生成

前言 Protocol Buffers (下面简称PB)是一种轻便高效的结构化数据存储格式,可以用于结构化数据串行化,很适合做数据存储或 RPC 数据交换格式。它可用于通讯协议、数据存储等领域的语言无关、平台无关、可扩展的序列化结构数据格式。它支持多种语言,比如C++,Java,C#,Python,JavaScript等等。目前它的最新版本是3.0.0。与...