簡體   English   中英

如何將本地html5錄制的音頻的float32Array格式轉換為Google語音轉文本服務的適當字節?

[英]How to convert the float32Array format of native html5 recorded audio to proper bytes for Google Speech-to-Text service?

如果您遵循此教程: https : //medium.com/ideas-at-igenius/delivering-a-smooth-cross-browser-speech-to-text-experience-b1e1f1f194a2,您將設法創建一個腳本處理器添加一個監聽器

scriptProcessor = inputPoint.context.createScriptProcessor(bufferSize, in_channels, out_channels)
//...
scriptProcessor.addEventListener('audioprocess', streamAudioData)

在回調內部,通過調用以下行: callback_param.inputBuffer.getChannelData(0)您將收到一個javascript Float32Array,通過查看數據,它似乎包含從-1.0到+1.0的浮點數

因此,將其流式傳輸到后端,然后將其流式傳輸到Google Speech-To-Text服務,您一無所獲(如預期)

至少在Python中,用於流式輸入的Google Speech-To-Text服務需要wav格式的字節字符串,其中包含指定頻率的聲音(即16000Hz)。 請注意,如果您在后端流式傳輸文件,則可以正常工作。

此轉換失敗:Float32Array-> Int16Array->字節字符串

有誰找到適合上述工作的適當轉換方式?

另外,您是否知道一種更簡單,更健壯的路徑:瀏覽器中的麥克風->通過websocket到后端服務器的數據流->向Google Speech-To-Input服務的數據流->按預期獲取響應?


編輯:為Google Speech API的識別配置添加python代碼

config = types.RecognitionConfig(
        encoding=enums.RecognitionConfig.AudioEncoding.LINEAR16,
        sample_rate_hertz=16000,
        language_code=self.language_code)

好的,做了一些挖掘,找到了具有適當信息的實際文檔

LINEAR16未壓縮的16位帶符號小尾數采樣(Linear PCM)。

關鍵部分是:

  • 每個樣本16位
  • 小端

因此,您需要做的是將浮點值( -1.0 ... 1.0-3278632767之間的整數。

沒有任何內置的JavaScript方法可以為您執行此操作。 你Float32Array和Int16Array之間的轉換不工作,因為你剛剛結束了近似值-101 您不能使用Int16Array的另一個原因是,它的字節序依賴於平台

您需要做的就是熟悉ArrayBuffers並使用DataView對其進行操作。 取每個樣本,做一些數學運算,寫字節,移到下一個樣本。 完成后,XHR和Fetch API均支持發送ArrayBuffer作為HTTP請求正文。 或者,您可以使用該ArrayBuffer實例化一個新的Blob並執行其他操作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM