天天看點

使用TensorFlow進行語音識别.js – 語音指令

作者:AI中國
使用TensorFlow進行語音識别.js – 語音指令

當我還是個孩子的時候,幾乎每個超級英雄都有一台語音控制的計算機。是以你可以想象我第一次遇到Alexa對我來說是一次深刻的經曆。我心裡的孩子非常高興和興奮。當然,然後我的工程直覺開始發揮作用,我分析了這些裝置是如何工作的。

事實證明,他們有神經網絡來處理這個複雜的問題。事實上,神經網絡大大簡化了這個問題,以至于今天使用Python在計算機上制作這些應用程式之一非常容易。但情況并非總是如此。第一次嘗試是在 1952 年進行的。由三位貝爾實驗室研究人員撰寫。

他們建立了一個具有10個單詞詞彙的單揚聲器數字識别系統。然而,到1980年代,這一數字急劇增長。詞彙量增長到20,000個單詞,第一批商業産品開始出現。Dragon Dictate是首批此類産品之一,最初售價為9,000美元。Alexa今天更實惠,對吧?

但是,今天我們可以在浏覽器中使用Tensorflo.js執行語音識别。在本文中,我們将介紹:

  1. 遷移學習
  2. 語音識别如何工作?
  3. 示範
  4. 使用Tensorflow實作.js

1. 遷移學習

從曆史上看,圖像分類是普及深度神經網絡的問題,尤其是視覺類型的神經網絡——卷積神經網絡(CNN)。今天,遷移學習用于其他類型的機器學習任務,如NLP和語音識别。我們不會詳細介紹什麼是 CNN 以及它們是如何工作的。然而,我們可以說CNN在2012年打破了ImageNet大規模視覺識别挑戰賽(ILSVRC)的記錄後得到了普及。

該競賽評估大規模對象檢測和圖像分類的算法。他們提供的資料集包含 1000 個圖像類别和超過 1 萬張圖像。圖像分類算法的目标是正确預測對象屬于哪個類。自2年以來。本次比賽的每位獲勝者都使用了CNN。

使用TensorFlow進行語音識别.js – 語音指令

訓練深度神經網絡可能具有計算性和耗時性。要獲得真正好的結果,您需要大量的計算能力,這意味着大量的GPU,這意味着......嗯,很多錢。當然,您可以訓練這些大型架構并在雲環境中獲得SOTA結果,但這也非常昂貴。

有一段時間,這些架構對普通開發人員不可用。然而,遷移學習的概念改變了這種情況。特别是,對于這個問題,我們今天正在解決 - 圖像分類。今天,我們可以使用最先進的架構,這些架構在 ImageNet 競賽中獲勝,這要歸功于遷移學習和預訓練模型。

1.1 預訓練模型

此時,人們可能會想知道“什麼是預訓練模型?從本質上講,預訓練模型是以前在大型資料集(例如 ImageNet 資料集)上訓練的儲存網絡 。 有兩種方法可以使用它們。您可以将其用作開箱即用的解決方案,也可以将其與遷移學習一起使用。 由于大型資料集通常用于某些全局解決方案,是以您可以自定義預先訓練的模型并将其專門用于某些問題。

通過這種方式,您可以利用一些最著名的神經網絡,而不會在訓練上浪費太多時間和資源。此外,您還可以 通過修改所選圖層的行為來微調這些模型。整個想法圍繞着使用較低層的預訓練CNN模型,并添加額外的層,這些層将為特定問題定制架構。

使用TensorFlow進行語音識别.js – 語音指令

從本質上講,嚴肅的遷移學習模型通常由兩部分組成。我們稱它們為骨幹和頭腦。 主幹通常是在 ImageNet 資料集上預先訓練的深度架構,沒有頂層。Head 是圖像分類模型的一部分,用于預測自定義類。

這些層将添加到預訓練模型的頂部。有了這些系統,我們有兩個階段:瓶頸和教育訓練階段。在瓶頸階段,特定資料集的圖像通過主幹架構運作,并存儲結果。在訓練階段,來自主幹的存儲輸出用于訓練自定義層。

使用TensorFlow進行語音識别.js – 語音指令

有幾個領域适合使用預先訓練的模型,語音識别就是其中之一。此模型稱為語音指令識别器。從本質上講,它是一個JavaScript子產品,可以識别由簡單英語單詞組成的口語指令。

預設詞彙“18w”包括以下單詞:從“零”到“九”、“向上”、“向下”、“向左”、“向右”、“開始”、“停止”、“是”、“否”的數字。還提供其他類别的“未知單詞”和“背景噪音”。除了已經提到的“18w”字典之外,還有更小的字典“directional4w”可用。它隻包含四個方向詞(“上”、“下”、“左”、“右”)。

2. 語音識别如何工作?

當涉及到神經網絡和音頻的組合時,有很多方法。語音通常使用某種遞歸神經網絡或LSTM來處理。但是,語音指令識别器使用稱為卷積神經網絡的簡單體系結構,用于小占用量關鍵字發現。

這種方法基于我們在上一篇文章中研究的圖像識别和卷積神經網絡。乍一看,這可能會令人困惑,因為音頻是一個跨時間的一維連續信号,而不是 2D 空間問題。

2.1 譜圖

此體系結構使用頻譜圖。這是信号頻率頻譜随時間變化的視覺表示。從本質上講,定義了單詞應該适合的時間視窗。

這是通過将音頻信号樣本分組到段來完成的。完成此操作後,将分析頻率的強度,并定義具有可能單詞的段。然後将這些片段轉換為頻譜圖,例如用于單詞識别的單通道圖像:

使用TensorFlow進行語音識别.js – 語音指令

然後,使用這種預處理制作的圖像被饋送到多層卷積神經網絡中。

3. 示範

您可能已經注意到,此頁面要求您允許使用麥克風。這是因為我們在此頁面中嵌入了實作示範。為了使此示範正常工作,您必須允許它使用麥克風。

使用TensorFlow進行語音識别.js – 語音指令

現在,您可以使用指令“向上”,“向下”,“向左”和“右”在下面的畫布上繪制。繼續嘗試一下:

4. 使用TensorFlow實作.js

4.1 網頁檔案

首先,讓我們看一下我們實作的 index.html 檔案。在上一篇文章中,我們介紹了幾種安裝TensorFlow.js的方法。其中之一是将其內建到HTML檔案的腳本标記中。這也是我們在這裡的做法。除此之外,我們需要為預訓練的模型添加一個額外的腳本标記。以下是索引.html的外觀:

<html>
  <head>    
    <script src="https://unpkg.com/@tensorflow/[email protected]/dist/tf.js"></script>
    <script src="https://unpkg.com/@tensorflow-models/[email protected]/dist/speech-commands.min.js"></script>
  </head>
  <body>
    <section class='title-area'>
        <h1>TensorFlow.js Speech Recognition</h1>
        <p class='subtitle'>Using pretrained models for speech recognition</p>
    </section>
    <canvas id="canvas" width="1000" height="800" style="border:1px solid #c3c3c3;"></canvas>
    <script src="script.js"></script>
  </body>
</html>           

包含此實作的 JavaScript 代碼位于 script.js 中。此檔案應與 index.html 檔案位于同一檔案夾中。為了運作整個過程,您所要做的就是在浏覽器中打開索引.html并允許它使用您的麥克風。

4.2 腳本檔案

現在,讓我們檢查整個實作所在的 script.js 檔案。以下是主運作函數的外觀:

async function run() {
 recognizer = speechCommands.create('BROWSER_FFT', 'directional4w');
 await recognizer.ensureModelLoaded();

 var canvas = document.getElementById("canvas");
 var contex = canvas.getContext("2d");
 contex.lineWidth = 10;
 contex.lineJoin = 'round';
 
 var positionx = 400;
 var positiony = 500;

 predict(contex, positionx, positiony);
}           

在這裡我們可以看到應用程式的工作流程。首先,我們建立模型的執行個體并将其配置設定給全局變量識别器。我們使用“directional4w”字典,因為我們隻需要“up”,“down”,“left”和“right”指令。

然後我們等待模型加載完成。如果您的網際網路連接配接速度較慢,這可能需要一些時間。完成後,我們初始化執行繪圖的畫布。最後,調用預測方法。以下是該函數内部發生的情況:

function calculateNewPosition(positionx, positiony, direction)
{
    return {
        'up' : [positionx, positiony - 10],
        'down': [positionx, positiony + 10],
        'left' : [positionx - 10, positiony],
        'right' : [positionx + 10, positiony],
        'default': [positionx, positiony]
    }[direction];
}

function predict(contex, positionx, positiony) {
 const words = recognizer.wordLabels();
 recognizer.listen(({scores}) => {
   scores = Array.from(scores).map((s, i) => ({score: s, word: words[i]}));
   scores.sort((s1, s2) => s2.score - s1.score);

    var direction = scores[0].word;
    var [x1, y1] = calculateNewPosition(positionx, positiony, direction);

    contex.moveTo(positionx,positiony);
    contex.lineTo(x1, y1);
    contex.closePath();
    contex.stroke();

    positionx = x1;
    positiony = y1;
 }, {probabilityThreshold: 0.75});
}           

這種方法正在做繁重的工作。從本質上講,它運作一個無限循環,其中識别器正在傾聽您正在說的話。請注意,我們正在使用參數 probabilityThreshold。

此參數定義是否應調用回調函數。實質上,僅當最大機率分數大于此門檻值時,才會調用回調函數。當我們得到這個詞時,我們就得到了我們應該畫的方向。

使用TensorFlow進行語音識别.js – 語音指令

然後我們使用函數 calculateNewPosition 計算線尾的坐标。該步長為 10 像素,這意味着行的長度将為 10 像素。您可以同時使用機率門檻值和此長度值。獲得新坐标後,我們使用畫布繪制線條。就是這樣。很簡單,對吧?

結論

在本文中,我們看到了如何輕松使用預先訓練的 TensorFlow.js 模型。它們是一些簡單應用程式的良好起點。我們甚至建構了一個此類應用程式的示例,您可以使用它使用語音指令進行繪制。這很酷,可能性是無窮無盡的。當然,您可以進一步訓練這些模型,獲得更好的結果,并将它們用于更複雜的解決方案。這意味着,您可以真正利用遷移學習。然而,這是另一個時代的故事。

原文标題:Speech Recognition with TensorFlow.js – Voice Commands

原文連結:https://rubikscode.net/2022/05/11/drawing-with-voice-speech-recognition-with-tensorflow-js/

作者:Nikola M. Zivkovic

編譯:LCR

繼續閱讀