網(wǎng)站備案號有什么用國內(nèi)永久免費的云服務(wù)器
鶴壁市浩天電氣有限公司
2026/01/24 08:30:53
網(wǎng)站備案號有什么用,國內(nèi)永久免費的云服務(wù)器,響應(yīng)式網(wǎng)頁設(shè)計針對的終端有哪些,模板支架圖片#x1f92f; 前言#xff1a;為什么 Whisper 還不夠#xff1f;
OpenAI 的 Whisper 模型在 ASR#xff08;自動語音識別#xff09;領(lǐng)域已經(jīng)是天花板級別的存在#xff0c;它能聽懂極其模糊的口音和多國語言。 但是#xff0c;Whisper 原生不支持 Speaker Diarization… 前言為什么 Whisper 還不夠OpenAI 的 Whisper 模型在 ASR自動語音識別領(lǐng)域已經(jīng)是天花板級別的存在它能聽懂極其模糊的口音和多國語言。但是Whisper 原生不支持 Speaker Diarization說話人日記/分離。它只能把音頻變成文字卻無法告訴你這段文字是誰說的。為了解決這個問題我們需要引入Pyannote.audio。這是一個基于 PyTorch 的開源音頻分析工具包它的專長就是**“聽聲辨人”**。我們要做的就是把這兩個模型“縫合”起來。? 一、 架構(gòu)設(shè)計雙管齊下我們的系統(tǒng)處理流程如下音頻輸入一段包含多個人說話的會議錄音。路徑 A (Whisper)負責(zé)聽內(nèi)容輸出(開始時間, 結(jié)束時間, 文本)。路徑 B (Pyannote)負責(zé)聽聲紋輸出(開始時間, 結(jié)束時間, 說話人ID)。對齊融合 (Alignment)根據(jù)時間戳將兩邊的結(jié)果匹配起來。系統(tǒng)流水線 (Mermaid):聲紋分割 (Pyannote)內(nèi)容識別 (Whisper)1. 輸入音頻2. 輸出文本段1. 輸入音頻2. 輸出時間軸3. 時間戳匹配3. 時間戳匹配4. 最終結(jié)果會議錄音 (.wav/.mp3)OpenAI Whisper 模型Text Segments (Time Text)Pyannote.audio 模型Speaker Timeline (Time ID)對齊算法 (Alignment)[00:01] SPEAKER_00: 大家好
[00:05] SPEAKER_01: 你好? 二、 環(huán)境準備Hugging Face 授權(quán)注意Pyannote 的模型是受保護的你需要先申請權(quán)限。注冊 Hugging Face 賬號。訪問 pyannote/speaker-diarization-3.1 并點擊同意用戶協(xié)議。訪問 pyannote/segmentation-3.0 同樣點擊同意。在 Hugging Face 設(shè)置頁創(chuàng)建一個Access Token (Read)。安裝依賴# 安裝 PyTorch (根據(jù)你的 CUDA 版本選擇)pipinstalltorch torchvision torchaudio# 安裝核心庫pipinstallopenai-whisper pyannote.audio 三、 代碼實戰(zhàn)縫合手術(shù)我們將編寫一個 Python 腳本自動完成上述流程。1. 加載模型importwhisperfrompyannote.audioimportPipelineimporttorch# 1. 配置 Hugging Face TokenHF_TOKEN你的_HUGGING_FACE_TOKEN_寫在這里# 2. 加載 Whisper (負責(zé)轉(zhuǎn)文字)# 推薦使用 large-v3 獲得最佳中文效果顯存不夠可用 medium 或 smallprint(正在加載 Whisper...)devicecudaiftorch.cuda.is_available()elsecpuasr_modelwhisper.load_model(large-v3,devicedevice)# 3. 加載 Pyannote (負責(zé)分角色)print(正在加載 Pyannote...)diarization_pipelinePipeline.from_pretrained(pyannote/speaker-diarization-3.1,use_auth_tokenHF_TOKEN).to(torch.device(device))print(? 模型加載完畢)2. 執(zhí)行識別與分離AUDIO_FILEmeeting_record.wav# --- Step A: Whisper 轉(zhuǎn)錄 ---print(正在進行語音識別...)# word_timestampsTrue 對于對齊非常重要asr_resultasr_model.transcribe(AUDIO_FILE,word_timestampsTrue)print(f識別完成共{len(asr_result[segments])}個片段)# --- Step B: Pyannote 聲紋分割 ---print(正在進行說話人分析...)# 自動通過 hook 進行處理diarization_resultdiarization_pipeline(AUDIO_FILE)print(聲紋分割完成)# 打印一下 Pyannote 的原始結(jié)果看看# for turn, _, speaker in diarization_result.itertracks(yield_labelTrue):# print(fstart{turn.start:.1f}s stop{turn.end:.1f}s speaker_{speaker})3. 核心算法時間戳對齊 (Alignment)這是最難的一步。Whisper 給出的片段是基于“句子”的而 Pyannote 給出的片段是基于“說話狀態(tài)”的。兩者的時間戳肯定對不上。我們需要計算“Whisper 片段”與“Pyannote 片段”的時間重疊面積誰重疊最多這就話就是誰說的。importpandasaspddefalign_results(whisper_segments,pyannote_diarization):final_output[]# 遍歷 Whisper 識別出的每一句話forseginwhisper_segments:startseg[start]endseg[end]textseg[text]# 在 Pyannote 的結(jié)果中尋找這段時間內(nèi)誰說話最久# 利用 Pyannote 的 crop 功能截取這段時間speakers_in_segmentpyannote_diarization.crop_later_than(start).crop_earlier_than(end)# 統(tǒng)計每個 Speaker 的說話時長speaker_duration{}forturn,_,speakerinspeakers_in_segment.itertracks(yield_labelTrue):# 計算當(dāng)前 turn 和 segment 的交集時長intersection_startmax(start,turn.start)intersection_endmin(end,turn.end)durationmax(0,intersection_end-intersection_start)ifduration0:speaker_duration[speaker]speaker_duration.get(speaker,0)duration# 找出時長最長的 Speakerifspeaker_duration:best_speakermax(speaker_duration,keyspeaker_duration.get)else:best_speakerUnknownfinal_output.append({start:start,end:end,speaker:best_speaker,text:text})returnfinal_output# --- 執(zhí)行對齊 ---resultsalign_results(asr_result[segments],diarization_result)# --- 打印最終漂亮的會議紀要 ---print(
會議紀要生成中...
)forlineinresults:# 格式化時間 00:00m_start,s_startdivmod(line[start],60)time_strf[{int(m_start):02d}:{int(s_start):02d}]print(f{time_str}{line[speaker]}:{line[text]}) 四、 進階優(yōu)化讓它更像商業(yè)軟件上述代碼只是 MVP最小可行性產(chǎn)品。要真的好用還要解決以下問題1. 顯存爆炸怎么辦Whisperlarge-v3需要約 10GB 顯存。優(yōu)化使用WhisperX或Faster-Whisper庫。它們采用了 CTranslate2 和 INT8 量化顯存占用減半速度快 5 倍且 WhisperX 內(nèi)置了更精準的強行對齊Forced Alignment功能。2. 說話人總是變來變?nèi)yannote 可能會把同一個人在不同時間段識別成SPEAKER_01和SPEAKER_05。優(yōu)化在pipeline中設(shè)置num_speakers參數(shù)如果你知道有幾個人參會或者提取聲紋 Embedding 進行聚類合并。3. 實時處理Whisper 和 Pyannote 都是處理靜態(tài)文件的。如果要做實時直播字幕需要使用流式處理 (Streaming)架構(gòu)這需要引入 VAD (語音活動檢測) 切片難度指數(shù)級上升。 總結(jié)通過不到 100 行代碼我們省去了購買“訊飛聽見”或“Otter.ai”會員的錢。更重要的是這是完全私有化部署的。對于保密級別高的公司會議數(shù)據(jù)不出本地安全感拉滿。Next Step:嘗試將這段腳本封裝成一個 Streamlit Web 界面讓你的同事只需要上傳 MP3就能下載 Excel 格式的對話記錄