Gradio全解20——Streaming:流式傳輸的多媒體應用(3)——實時語音識別技術
- 本篇摘要
- 20. Streaming:流式傳輸的多媒體應用
- 20.3 實時語音識別技術
- 20.3.1 環境準備和開發步驟
- 1. 環境準備
- 2. ASR應用開發步驟(基于Transformers)
- 20.3.2 配置ASR模型
- 20.3.3 構建全上下文ASR演示系統
- 20.3.4 構建流式ASR演示系統
- 參考文獻:
本章目錄如下:
- 《Gradio全解20——Streaming:流式傳輸的多媒體應用(1)——流式傳輸音頻:魔力8號球》;
- 《Gradio全解20——Streaming:流式傳輸的多媒體應用(2)——構建對話式聊天機器人》;
- 《Gradio全解20——Streaming:流式傳輸的多媒體應用(3)——實時語音識別技術》;
- 《Gradio全解20——Streaming:流式傳輸的多媒體應用(4)——基于Groq的帶自動語音檢測功能的多模態Gradio應用》;
- 《Gradio全解20——Streaming:流式傳輸的多媒體應用(5)——基于WebRTC的攝像頭實時目標檢測》;
- 《Gradio全解20——Streaming:流式傳輸的多媒體應用(6)——構建視頻流目標檢測系統》。
本篇摘要
本章講述流式傳輸的應用,包括音頻、圖像和視頻格式的流式傳輸。
20. Streaming:流式傳輸的多媒體應用
本章講述流式傳輸的應用,包括音頻、圖像和視頻格式的流式傳輸。音頻應用包括流式傳輸音頻、構建音頻對話式聊天機器人、實時語音識別技術和自動語音檢測功能;圖像應用包括基于WebRTC的攝像頭實時目標檢測;視頻應用包括構建視頻流目標檢測系統。
20.3 實時語音識別技術
自動語音識別技術(Automatic speech recognition:ASR)作為機器學習中將語音信號轉換為文本的重要領域,正處于快速發展階段。當前ASR算法已普遍應用于智能手機設備,并逐步滲透到專業工作流程中,如醫護人員的數字助理系統。由于ASR算法直接面向終端用戶,所以必須確保其能夠實時準確處理各種語音特征(包括不同口音、音高及背景噪聲環境)。
通過Gradio平臺,開發者可快速構建ASR算法模型的演示系統,便于測試團隊驗證或通過麥克風等設備進行自主實時測試。本教程將通過兩部分演示如何將預訓練語音轉文本模型部署至Gradio交互界面:第一部分采用全上下文模式,即用戶完成整段錄音后才執行預測;第二部分將演示改造為流式處理模式,實現語音實時轉換功能。
20.3.1 環境準備和開發步驟
開始之前,先準備環境,比如安裝gradio、Transformers及ffmpeg等python包,再按照應用開發步驟進行實戰。
1. 環境準備
請確保已安裝gradio的Python包,同時本教程需要預訓練語音識別模型支持,我們還需要以下兩個ASR庫構建演示系統:Transformers(安裝命令:pip install torch transformers torchaudio),我們使用Transformers中Whisper模型實現語音識別;FFmpeg處理麥克風輸入文件,因為Transformers會自動安裝ffmpeg,所以建議至少安裝其中一個庫以便跟進教程。FFmpeg是領先的多媒體框架,能夠解碼、編碼、轉碼、復用、解復用、流式傳輸、過濾及播放幾乎所有人類與機器創建的媒體內容。該框架支持從最冷門的古老格式到最前沿的技術標準——無論這些格式是由標準委員會、開源社區還是商業公司設計,詳細信息請參閱:FFmpeg。
2. ASR應用開發步驟(基于Transformers)
實時語音識別(ASR)應用開發步驟全部基于Transformers,具體步驟如下:
- 配置ASR模型環境;
- 構建全上下文ASR演示系統;
- 構建流式ASR演示系統。
20.3.2 配置ASR模型
首先,需要準備一個ASR模型——可以是自行訓練的模型,或是下載預訓練模型。本教程將使用Whisper的預訓練ASR模型作為示例,以下是加載Hugging Face Transformers中Whisper模型的代碼:
from transformers import pipelinepl = pipeline("automatic-speech-recognition", model="openai/whisper-base.en")
配置完成!
20.3.3 構建全上下文ASR演示系統
然后,創建全上下文ASR演示,即用戶需完整錄制音頻后,系統才會調用ASR模型進行推理。利用Gradio實現這一功能非常簡單——只需基于上述pipeline對象創建處理函數即可。
具體實現將采用Gradio內置的Audio組件:輸入組件將接收用戶麥克風輸入并返回錄音文件路徑,輸出組件將使用標準Textbox組件顯示識別結果。代碼如下:
import gradio as gr
from transformers import pipeline
import numpy as nptranscriber = pipeline("automatic-speech-recognition", model="openai/whisper-base.en")def transcribe(audio):sr, y = audio# Convert to mono if stereoif y.ndim > 1:y = y.mean(axis=1)y = y.astype(np.float32)y /= np.max(np.abs(y))return transcriber({"sampling_rate": sr, "raw": y})["text"] demo = gr.Interface(transcribe,gr.Audio(sources="microphone"),"text",
)
demo.launch()
transcribe函數接受單一參數audio,這是一個用戶錄制的音頻numpy數組。管道對象期望音頻為float32格式,因此我們首先將其轉換為float32,然后使用transcriber提取轉錄文本。
此程序在Hugging Face的地址為:gradio/asr,演示截圖如下:
20.3.4 構建流式ASR演示系統
要實現流式處理,需進行以下配置調整:
- 在Audio組件中設置streaming=True以支持流式傳輸;
- 在Interface中啟用live=True參數以支持實時傳輸;
- 添加狀態存儲機制state以保存用戶音頻流。
具體實現代碼如下:
import gradio as gr
from transformers import pipeline
import numpy as nptranscriber = pipeline("automatic-speech-recognition", model="openai/whisper-base.en")
def transcribe(stream, new_chunk):sr, y = new_chunk# Convert to mono if stereoif y.ndim > 1:y = y.mean(axis=1)y = y.astype(np.float32)y /= np.max(np.abs(y))if stream is not None:stream = np.concatenate([stream, y])else:stream = yreturn stream, transcriber({"sampling_rate": sr, "raw": stream})["text"] demo = gr.Interface(transcribe,["state", gr.Audio(sources=["microphone"], streaming=True)],["state", "text"],live=True,
)
demo.launch()
請注意,我們現在有一個狀態變量,因為我們需要跟蹤所有音頻歷史。隨著接口運行,每次有新的小段音頻時,transcribe函數將會被調用,在狀態中跟蹤迄今為止所有的音頻記錄并將新音頻片段作為new_chunk;new_chunk經過處理后,將返回新的完整音頻并存儲回當前狀態,同時也返回轉錄文本。整個過程中,我們只需要簡單地將音頻拼接在一起,并對整個音頻調用轉錄器對象;也可以優化為其它更有效率的處理方式,比如每次接收到新音頻片段時,僅重新處理最后5秒的音頻。
現在,ASR模型將在用戶說話時進行推理!注意在進度條開始后錄音,運行截圖如下:
參考文獻:
- Streaming AI Generated Audio
- Run Inference on servers
- Spaces ZeroGPU: Dynamic GPU Allocation for Spaces