譯者| 李睿
審校| 孫淑娟
本文將簡要概述語音辨識技術及其常見應用,並示範一個免費的語音到文字的API,該API可用於以MP3和WAV檔案格式轉錄音訊。這個示範將包括逐步指令使用「即運行Node.js程式碼」範例呼叫這個API。
人們通常將語音辨識技術視為當代科技領域的一個相對較新的補充,而這只是事實。語音辨識技術已經存在了半個多世紀,從上世50年代初的一些先驅公司開發的功能有限的數位/文字辨識系統開始。 ,儘管語音辨識技術有著悠久的歷史,過去十年來在智慧消費性設備領域得到了廣泛應用,但語音辨識仍然是當今市場上較為抽象的技術之一。這是因為各種語音辨識技術都跨越了電腦科學、計算語言學和數學/統計學等領域,需要各個領域的大量輸入才能獲得準確的語音到文字結果。
在(非常)高的層級上,為了讓語音辨識技術實施其最基本的任務,必須先對給定的音訊檔案進行預處理以優化其品質。然後將其分解為更小的分量訊號並進行排序。這些經過排序的信號必須足夠小,以便數學模型可以將其與某些音素(結合在一起生成單詞的特定於語言的聲音;例如“eeee”或“ahhh”噪音)匹配,這有助於與該語言中的片語或句子進行比較。歸根結底,語音辨識服務的目標很簡單:盡可能準確地猜測錄製的音訊中使用了哪些單詞,並不斷改進和擴展其語言資料庫,直到猜測達到可接受的準確性水平。
這個複雜且固有的有限資訊猜測系統甚至使最基本的語音辨識服務也依賴語言和方言,因為它們依賴音訊品質。語言、口音、詞彙的變化以及背景噪音的存在都會產生邊界,這對於單一語音到文本模型很難克服。此外,這種複雜性反映了一個基本事實,即語音辨識服務是高度資源密集型的,依賴龐大且不斷增長的參考資料集進行語音比較,需要相當大的運算能力才能有效利用這些資料集。這些因素共同使得訓練一個全新的語音到文字模型成為一項艱鉅的任務。
語音辨識在很大程度上是由於在更大的技術市場上出現了一些無所不在的創新,尤其是近乎無限的雲端運算資料存儲解決方案的成長,語音辨識已成為人們現在在日常生活中認識到的高效且有用的消費者服務。人們可以直接採用手機、固定電話和辦公室設備進行溝通和對話,以自動查詢所需的信息,記錄和組織自己的想法供以後使用,以及聽到大聲宣讀的短信,等等。
目前,消費者應用只是語音辨識技術應用的冰山一角。語音識別的許多相互關聯的過程的進步創造了擴展音訊轉錄輸出的機會,並鼓勵越來越多的商業應用程式進行語音到文字轉換。在人們的周圍有很多這樣的例子。許多虛擬會議平台現在使用語音辨識服務(通常是即時的)對團隊簡報進行轉錄,產生的文字可以方便地儲存給任何可能錯過會議的人。聊天機器人利用語音辨識幫助人們在手機上進行選擇,這些對話中轉錄的音訊可以用於其他用途:為未來更好的客戶服務實踐提供資訊。人們可能參加的講座、訪談、演講和其他演講活動可以透過個人設備進行錄製和轉錄,以消除人工抄錄筆記的工作。例如,這些轉錄可以透過自然語言處理(NLP)模型進行處理,以從轉錄文本中尋找以前看不到(或聽不到)的見解。
值得一提的是,實用的內容調節和搜尋引擎優化功能也可以從可擴展的語音到文字分析服務中獲得——而這次是在企業資料儲存環境中獲得。考慮到大多數用戶端上傳內容的不可靠性,自動轉錄上傳到網站的音訊檔案可以輕鬆調節父級音訊檔案的語言,以確保其對所有聽眾安全(例如查看是否包含極有爭議的語言、仇恨言論或任何形式的對個人或團體的騷擾)。這顯著減少了內容審核人員的工作量,並提高了其效率。這些相同的轉錄檔案也可以用於產生有用的關鍵字,使音訊檔案更容易從大型資料庫中搜尋和檢索。
將語音辨識作為一項服務加以利用的一種方法是透過包含Cloudmersive語音到文字API。該API目前支援MP3或WAV格式,並採用深度學習人工智慧模型提供高精確度的音訊轉錄。其API參數非常簡單,只需要輸入音訊檔案和Cloudmersive API金鑰(API金鑰可以透過在其網站上註冊一個免費帳戶來獲得,該帳戶每月最多產生800個API呼叫)。以下將示範如何使用互補Node.js程式碼段建構API呼叫。
第一步是安裝Node.js SDK。這可以透過執行以下命令來做到:
<span style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">npm</span> <span style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">install</span> <span style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">cloudmersive</span><span style="color: rgb(215, 58, 73); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">-</span><span style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">speech</span><span style="color: rgb(215, 58, 73); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">-</span><span style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">api</span><span style="color: rgb(215, 58, 73); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">-</span><span style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">client</span> <span style="color: rgb(215, 58, 73); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">--</span><span style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">save</span>
另外,可以將以下這一程式碼片段加入其軟體包中。
<span style="color: rgb(102, 153, 0); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">"dependencies"</span>: {<br><span style="color: rgb(102, 153, 0); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">"cloudmersive-speech-client"</span>: <span style="color: rgb(102, 153, 0); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">"^1.1.5"</span><br>}
安裝完成後,可以使用下列程式碼區塊建構API呼叫。此時,需要確保已準備好以下參數:
(1)MP3或WAV音訊檔案。
(2)CloudMersive API金鑰。
<span style="color: rgb(215, 58, 73); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">var</span> <span style="color: rgb(0, 92, 197); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">CloudmersiveSpeechApiClient</span> <span style="color: rgb(215, 58, 73); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">=</span> <span style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">require</span>(<span style="color: rgb(102, 153, 0); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">'cloudmersive-speech-api-client'</span>);<br><span style="color: rgb(215, 58, 73); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">var</span> <span style="color: rgb(0, 92, 197); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">defaultClient</span> <span style="color: rgb(215, 58, 73); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">=</span> <span style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">CloudmersiveSpeechApiClient</span>.<span style="color: rgb(0, 92, 197); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">ApiClient</span>.<span style="color: rgb(0, 92, 197); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">instance</span>;<br><span style="color: rgb(106, 115, 125); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">// Configure API key authorization: Apikey</span><br><span style="color: rgb(215, 58, 73); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">var</span> <span style="color: rgb(0, 92, 197); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">Apikey</span> <span style="color: rgb(215, 58, 73); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">=</span> <span style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">defaultClient</span>.<span style="color: rgb(0, 92, 197); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">authentications</span>[<span style="color: rgb(102, 153, 0); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">'Apikey'</span>];<br><span style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">Apikey</span>.<span style="color: rgb(0, 92, 197); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">apiKey</span> <span style="color: rgb(215, 58, 73); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">=</span> <span style="color: rgb(102, 153, 0); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">'YOUR API KEY'</span>;<br><span style="color: rgb(215, 58, 73); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">var</span> <span style="color: rgb(0, 92, 197); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">apiInstance</span> <span style="color: rgb(215, 58, 73); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">=</span> <span style="color: rgb(215, 58, 73); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">new</span> <span style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">CloudmersiveSpeechApiClient</span>.<span style="color: rgb(0, 92, 197); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">RecognizeApi</span>();<br><span style="color: rgb(215, 58, 73); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">var</span> <span style="color: rgb(0, 92, 197); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">speechFile</span> <span style="color: rgb(215, 58, 73); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">=</span> <span style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">Buffer</span>.<span style="color: rgb(0, 92, 197); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">from</span>(<span style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">fs</span>.<span style="color: rgb(0, 92, 197); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">readFileSync</span>(<span style="color: rgb(102, 153, 0); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">"C:\temp\inputfile"</span>).<span style="color: rgb(0, 92, 197); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">buffer</span>); <span style="color: rgb(106, 115, 125); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">// File | Speech file to perform the operation on.Common file formats such as WAV, MP3 are supported.</span><br><span style="color: rgb(215, 58, 73); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">var</span> <span style="color: rgb(0, 92, 197); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">callback</span> <span style="color: rgb(215, 58, 73); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">=</span> <span style="color: rgb(215, 58, 73); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">function</span>(<span style="color: rgb(0, 92, 197); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">error</span>, <span style="color: rgb(0, 92, 197); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">data</span>, <span style="color: rgb(0, 92, 197); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">response</span>) {<br><span style="color: rgb(215, 58, 73); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">if</span> (<span style="color: rgb(0, 92, 197); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">error</span>) {<br><span style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">console</span>.<span style="color: rgb(0, 92, 197); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">error</span>(<span style="color: rgb(0, 92, 197); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">error</span>);<br>} <span style="color: rgb(215, 58, 73); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">else</span> {<br><span style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">console</span>.<span style="color: rgb(0, 92, 197); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">log</span>(<span style="color: rgb(102, 153, 0); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">'API called successfully. Returned data: '</span> <span style="color: rgb(215, 58, 73); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">+</span> <span style="color: rgb(0, 92, 197); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">data</span>);<br>}<br>};<br><span style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">apiInstance</span>.<span style="color: rgb(0, 92, 197); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">recognizeFile</span>(<span style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">speechFile</span>, <span style="color: rgb(89, 89, 89); margin: 0px; padding: 0px; background: none 0% 0% / auto repeat scroll padding-box border-box rgba(0, 0, 0, 0);">callback</span>);
這樣就完成了API的構建,無需進一步的程式碼段。成功的API呼叫將傳回包含API轉錄結果的Textresult字串。務必記住的是,輸入檔案中的音訊品質將對API創建準確轉錄的能力產生重大影響,因此建議在實施此操作之前盡可能預處理和優化音訊品質。
原文標題:#How to Leverage Speech-to-Text With Node.js#,作者:Brian O'Neill
以上是如何利用Node.js將語音轉換為文字的詳細內容。更多資訊請關注PHP中文網其他相關文章!