日韩久久久精品,亚洲精品久久久久久久久久久,亚洲欧美一区二区三区国产精品 ,一区二区福利

MyVoix2.0.js 源碼分析 WebSpeech與WebAudio篇

系統(tǒng) 1899 0

楔 子

  隨著移動(dòng)互聯(lián)網(wǎng)時(shí)代的開啟,各種移動(dòng)設(shè)備走進(jìn)了我們的生活。無論是日常生活中人手一部的手機(jī),還是夜跑者必備的各種智能腕帶,亦或者是充滿未來科技感的google glass云云,它們正漸漸改變著我們的生活習(xí)慣以及用戶交互習(xí)慣。觸摸屏取代了實(shí)體按鍵,Siri開始慢慢釋放我們的雙手,而leap motion之類的硬件更是讓我們徹底不需要接觸IT設(shè)備便能通過手勢(shì)控制它們。在這樣的大背景下,前端的交互將涉及越來越多元的交叉學(xué)科,我們正如十幾年前人們經(jīng)歷Css的誕生一樣,見證著一場(chǎng)帶動(dòng)整個(gè)行業(yè)乃至社會(huì)的變革。

?

放下IE6正如你放下table布局

  如果現(xiàn)今你的工作還只是每天嚴(yán)謹(jǐn)?shù)厝ゼ嫒軮E6,那么是時(shí)候起身遙望身邊的風(fēng)景了,HTML5已經(jīng)遠(yuǎn)遠(yuǎn)不只是那些漸變和圓角了。這篇博文中,我會(huì)像大家介紹 Web Speech Web Audio 兩組API,這是MyVoix.js框架的核心組成部分,在早前好幾個(gè)版本的chrome這就已經(jīng)實(shí)現(xiàn),你可以通過webkit前綴調(diào)用他們。

Web Speech

  WebSpeech API是由 Speech API Community Group 發(fā)布,主要功能是將語音輸入轉(zhuǎn)換成文字,如果你能加上一個(gè)語義分析的服務(wù)器,那它就是一個(gè)Siri。你也可以簡(jiǎn)單地把它理解成一個(gè)可編程的input語音輸入框(如下代碼)。

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

  在Siri剛剛出世的那個(gè)年代,上面這行代碼就是前端界讓屌絲變高富帥的利器,老板才不知道你才寫了一行代碼就搞出一個(gè)語音輸入框(偷偷在input上加過x-webkit-speech的同學(xué)們請(qǐng)點(diǎn)贊)。但是,僅僅一個(gè)輸入框標(biāo)簽顯然不能滿足程序員們那熊熊燃燒對(duì)代碼的控制欲,于是Web Speech應(yīng)運(yùn)而生。

  再回到代碼,要使用webSpeech API我們首先要?jiǎng)?chuàng)建一個(gè)window.webkitSpeechRecognition對(duì)象。

      
        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實(shí)例后,有幾個(gè)參數(shù)需要我們配置。

  continuous:如果置為false,那么當(dāng)實(shí)例start之后,若沒有輸入或者輸入錯(cuò)誤就會(huì)立刻返回。這里需要等到有意義的輸入才返回,所以我們置為true。

  interimResults:如果設(shè)置為true,那么在onresult的時(shí)候就會(huì)不斷有分析過程中的單詞返回。這里只需要最后的分析結(jié)果,所以置為false。

  lang:這個(gè)是語言,大家應(yīng)該都看的懂。

  maxAlternatives:設(shè)置的是每個(gè)result最大的SpeechRecognitionAlternatives。

  接下來我們調(diào)用實(shí)例的start方法就會(huì)開啟SpeechdRecognition的監(jiān)聽。但是在此之前還需要指定實(shí)例的onresult事件,語音分析完成后的單詞會(huì)傳入這個(gè)方法。

      
         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中對(duì)于單詞事件的綁定有自己的架構(gòu),之后的博文有機(jī)會(huì)會(huì)詳述。

Web Audio

? ? ? 搞定了語音識(shí)別,接下來我們就需要獲得麥克風(fēng)的輸入信號(hào),以便實(shí)現(xiàn)MyVoix中的繪制波形功能。如果你用javascript調(diào)用過攝像頭,那你一定用過navigator.webkitGetUserMedia這個(gè)東西,Web Audio中獲取麥克風(fēng)的音源數(shù)據(jù)就需要用到它。先看一下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有點(diǎn)類似,你需要鏈接一堆堆的東西。進(jìn)一步分析代碼:

      navigator.webkitGetUserMedia({audio:
      
        true
      
      },
      
        function
      
      
        (e){

    
      
      
        //
      
      
        success callback
      
      
        //
      
      
        ... 
      
      

},
      
        function
      
      
        (){

    
      
      
        //
      
      
        error callback
      
      
        //
      
      
        ... 
      
      

};
    

  第一步使用webkitGetUserMedia對(duì)象調(diào)用本地麥克風(fēng),主要代碼在成功回調(diào)函數(shù)中實(shí)現(xiàn)。

      
        var
      
       context = 
      
        new
      
      
         webkitAudioContext(),

    audioInput 
      
      = context.createMediaStreamSource(e);
    

  之后我們需要建立一個(gè)webkitAudioContext實(shí)例,通過該實(shí)例可以創(chuàng)建許多有用的元件。這里通過createMediaStreamSource方法和getUserMedia成功回調(diào)函數(shù)中的參數(shù)可以創(chuàng)建一個(gè)輸入源。 通過一層層的傳遞可以最終連接到context.destination這個(gè)輸出位置。我們簡(jiǎn)單過一下MyVoix中用到的幾個(gè)節(jié)點(diǎn):

  analyser:這個(gè)一看就是分析音源用的,具體一般用在聲音可視化上。

  splitter:此節(jié)點(diǎn)用以聲道轉(zhuǎn)換,在MyVoix中我們用它把音源變成了左右兩個(gè)聲道。

  javascriptNode:這個(gè)節(jié)點(diǎn)我們用來進(jìn)行javascript級(jí)別的監(jiān)聽處理。通過onaudioprocess函數(shù),在每次聲音完成采樣的時(shí)候,調(diào)用我們繪制波形的函數(shù),并最終通過它連接到輸出端。

  在MyVoix2.0中,大致就只用到了以上幾個(gè)AudioContext創(chuàng)造的節(jié)點(diǎn)。通過類似的方法加入其他節(jié)點(diǎn),Web Audio還可以實(shí)現(xiàn)聲音在3D空間中定位播放等功能。

尾 聲

  本文介紹了在MyVoix中用到的兩個(gè)核心的技術(shù),通過這篇博文希望大家對(duì)語音技術(shù)在html端的實(shí)現(xiàn)有大致的了解。我們?cè)趫@子里寫作,不用像魯迅先生一樣戰(zhàn)斗,卻也盼著技術(shù)推進(jìn)這個(gè)時(shí)代。

?

? ? ?? myvoix源碼地址

轉(zhuǎn)發(fā)請(qǐng)注明出處 http://www.cnblogs.com/Arthus/p/3889457.html

MyVoix2.0.js 源碼分析 WebSpeech與WebAudio篇


更多文章、技術(shù)交流、商務(wù)合作、聯(lián)系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號(hào)聯(lián)系: 360901061

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點(diǎn)擊下面給點(diǎn)支持吧,站長(zhǎng)非常感激您!手機(jī)微信長(zhǎng)按不能支付解決辦法:請(qǐng)將微信支付二維碼保存到相冊(cè),切換到微信,然后點(diǎn)擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對(duì)您有幫助就好】

您的支持是博主寫作最大的動(dòng)力,如果您喜歡我的文章,感覺我的文章對(duì)您有幫助,請(qǐng)用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長(zhǎng)會(huì)非常 感謝您的哦!!!

發(fā)表我的評(píng)論
最新評(píng)論 總共0條評(píng)論
主站蜘蛛池模板: 黄龙县| 昆明市| 绥阳县| 罗田县| 平顶山市| 丰顺县| 桃园县| 尉犁县| 楚雄市| 北流市| 孝义市| 富蕴县| 阿瓦提县| 开远市| 宁化县| 盈江县| 东源县| 和林格尔县| 奉节县| 正定县| 勐海县| 高雄县| 华池县| 柳州市| 怀安县| 连云港市| 达拉特旗| 安义县| 九寨沟县| 和林格尔县| 北宁市| 建瓯市| 新蔡县| 蒙山县| 社旗县| 松原市| 宁海县| 澳门| 张家界市| 景宁| 会东县|