大連哪家公司做網(wǎng)站網(wǎng)絡(luò)推廣的調(diào)整和優(yōu)化
為了實(shí)現(xiàn)持續(xù)監(jiān)聽麥克風(fēng)并在檢測(cè)到聲音時(shí)進(jìn)行轉(zhuǎn)錄,我們可以將流的監(jiān)聽時(shí)間設(shè)置為無(wú)限長(zhǎng)。通過(guò)使用一個(gè)音量門限來(lái)檢測(cè)是否有聲音,然后進(jìn)行轉(zhuǎn)錄。
安裝依賴
確保安裝必要的庫(kù):
pip install torch torchaudio openai-whisper sounddevice numpy
代碼實(shí)現(xiàn)
import torch
import whisper
import sounddevice as sd
import numpy as np# 加載預(yù)訓(xùn)練的 Whisper 模型
model = whisper.load_model("base")# 設(shè)置模型為評(píng)估模式
model.eval()# 定義流式解碼函數(shù)
def stream_decode(audio_buffer, sample_rate=16000):audio_tensor = torch.tensor(audio_buffer).float()result = model.transcribe(audio_tensor, fp16=False)return result['text']# 音頻緩沖區(qū)和其他參數(shù)
buffer_size = 16000 # 每個(gè)音頻塊的大小(1秒)
audio_buffer = np.zeros(buffer_size * 10, dtype=np.float32) # 預(yù)留10秒緩沖區(qū)
buffer_offset = 0
silence_threshold = 0.01 # 聲音門限# 麥克風(fēng)回調(diào)函數(shù)
def callback(indata, frames, time, status):global audio_buffer, buffer_offsetif status:print(status, flush=True)# 計(jì)算當(dāng)前音頻塊的音量volume_norm = np.linalg.norm(indata) * 10if volume_norm > silence_threshold:# 將新音頻數(shù)據(jù)復(fù)制到緩沖區(qū)audio_buffer[buffer_offset:buffer_offset+frames] = indata[:, 0]buffer_offset += frames# 當(dāng)緩沖區(qū)達(dá)到或超過(guò)設(shè)定的大小時(shí)進(jìn)行處理if buffer_offset >= buffer_size:text = stream_decode(audio_buffer[:buffer_size])print(f"Transcription: {text}", flush=True)# 移動(dòng)緩沖區(qū)的數(shù)據(jù)audio_buffer = np.roll(audio_buffer, -buffer_size)buffer_offset -= buffer_sizeelse:# 如果檢測(cè)到的音量低于門限,將緩沖區(qū)位置重置buffer_offset = 0# 啟動(dòng)麥克風(fēng)流
def start_streaming():stream = sd.InputStream(callback=callback, channels=1, samplerate=16000, blocksize=buffer_size)with stream:print("Listening...")while True:sd.sleep(1000) # 繼續(xù)監(jiān)聽# 開始流式解碼
start_streaming()
代碼說(shuō)明
-
依賴加載:
torch
和torchaudio
用于音頻處理和模型推理。whisper
是 OpenAI 的 Whisper 模型的庫(kù),用于加載和使用預(yù)訓(xùn)練模型。sounddevice
用于從麥克風(fēng)捕獲實(shí)時(shí)音頻。numpy
用于音頻數(shù)據(jù)處理。
-
流式解碼函數(shù)
stream_decode
:- 接受音頻緩沖區(qū)并使用 Whisper 模型進(jìn)行解碼。
- 返回解碼后的文本。
-
音頻緩沖區(qū)和參數(shù)設(shè)置:
buffer_size
定義每個(gè)音頻塊的大小,這里設(shè)置為1秒(16000個(gè)樣本)。audio_buffer
是一個(gè)大小為10秒的預(yù)留緩沖區(qū)。buffer_offset
用于跟蹤當(dāng)前緩沖區(qū)的位置。silence_threshold
是音量門限,用于檢測(cè)有無(wú)聲音。
-
麥克風(fēng)回調(diào)函數(shù)
callback
:- 從麥克風(fēng)捕獲音頻數(shù)據(jù)并將其存儲(chǔ)到緩沖區(qū)中。
- 計(jì)算當(dāng)前音頻塊的音量,如果音量超過(guò)門限,則將音頻數(shù)據(jù)添加到緩沖區(qū),并進(jìn)行解碼處理。
- 解碼后打印轉(zhuǎn)錄結(jié)果,并移動(dòng)緩沖區(qū)的數(shù)據(jù)以準(zhǔn)備處理下一個(gè)音頻塊。
- 如果音量低于門限,將緩沖區(qū)位置重置。
-
啟動(dòng)麥克風(fēng)流
start_streaming
:- 使用
sounddevice.InputStream
創(chuàng)建一個(gè)音頻流,并在回調(diào)函數(shù)中處理音頻數(shù)據(jù)。 - 啟動(dòng)流并持續(xù)運(yùn)行,通過(guò)
while True
循環(huán)保持監(jiān)聽狀態(tài)。
- 使用
這個(gè)示例代碼展示了如何實(shí)現(xiàn)持續(xù)監(jiān)聽麥克風(fēng),并在檢測(cè)到聲音時(shí)進(jìn)行實(shí)時(shí)轉(zhuǎn)錄。你可以根據(jù)實(shí)際需求進(jìn)一步優(yōu)化音量門限和緩沖區(qū)處理邏輯,以提高性能和準(zhǔn)確性。