Fastwhisper + Pyannote 實現 ASR + 說話者識別

文章目錄

  • 前言
  • 一、faster-whisper簡單介紹
  • 二、pyannote.audio介紹
  • 三、faster-whisper + pyannote.audio 實現語者識別
  • 四、多說幾句


前言

最近在研究ASR相關的業務,也是調研了不少模型,踩了不少坑,ASR這塊,目前中文普通話效果最好的應該是阿里的modelscope上的中文模型了,英文的話,還是非whisper莫屬了,而且whisper很變態,粵語效果也還不錯,因此,如果實際業務中需要涉及到不同的語言,還是更推薦whisper多一點

一、faster-whisper簡單介紹

faster-whisper是使用CTranslate2OpenAIWhisper模型的重新實現,CTranslate2是一個用于Transformer模型的快速推理引擎。

在使用更少內存的情況下,該實現比openai/whisper在相同精度下快4倍。同時在CPUGPU上進行8位量化,可以進一步提高算法效率。

官方倉庫:https://github.com/SYSTRAN/faster-whisper

二、pyannote.audio介紹

pyannote.audio是一個用Python編寫的用于揚聲器diarization的開源工具包。基于PyTorch機器學習框架,它具有最先進的預訓練模型和管道,可以進一步對自己的數據進行微調,以獲得更好的性能。

官方倉庫:https://github.com/pyannote/pyannote-audio

三、faster-whisper + pyannote.audio 實現語者識別

實際上只要將二者的識別結果進行結合即可

from pyannote.core import Segmentdef get_text_with_timestamp(transcribe_res):timestamp_texts = []for item in transcribe_res:start = item.startend = item.endtext = item.text.strip()timestamp_texts.append((Segment(start, end), text))return timestamp_textsdef add_speaker_info_to_text(timestamp_texts, ann):spk_text = []for seg, text in timestamp_texts:spk = ann.crop(seg).argmax()spk_text.append((seg, spk, text))return spk_textdef merge_cache(text_cache):sentence = ''.join([item[-1] for item in text_cache])spk = text_cache[0][1]start = round(text_cache[0][0].start, 1)end = round(text_cache[-1][0].end, 1)return Segment(start, end), spk, sentencePUNC_SENT_END = [',', '.', '?', '!', ",", "。", "?", "!"]def merge_sentence(spk_text):merged_spk_text = []pre_spk = Nonetext_cache = []for seg, spk, text in spk_text:if spk != pre_spk and pre_spk is not None and len(text_cache) > 0:merged_spk_text.append(merge_cache(text_cache))text_cache = [(seg, spk, text)]pre_spk = spkelif text and len(text) > 0 and text[-1] in PUNC_SENT_END:text_cache.append((seg, spk, text))merged_spk_text.append(merge_cache(text_cache))text_cache = []pre_spk = spkelse:text_cache.append((seg, spk, text))pre_spk = spkif len(text_cache) > 0:merged_spk_text.append(merge_cache(text_cache))return merged_spk_textdef diarize_text(transcribe_res, diarization_result):timestamp_texts = get_text_with_timestamp(transcribe_res)spk_text = add_speaker_info_to_text(timestamp_texts, diarization_result)res_processed = merge_sentence(spk_text)return res_processeddef write_to_txt(spk_sent, file):with open(file, 'w') as fp:for seg, spk, sentence in spk_sent:line = f'{seg.start:.2f} {seg.end:.2f} {spk} {sentence}\n'fp.write(line)import torch
import whisper
import numpy as np
from pydub import AudioSegment
from loguru import logger
from faster_whisper import WhisperModel
from pyannote.audio import Pipeline
from pyannote.audio import Audiofrom common.error import ErrorCodemodel_path = config["asr"]["faster-whisper-large-v3"]# 測試音頻: https://isv-data.oss-cn-hangzhou.aliyuncs.com/ics/MaaS/ASR/test_audio/asr_speaker_demo.wav
audio = "./test/asr/data/asr_speaker_demo.wav"
asr_model = WhisperModel(model_path, device="cuda", compute_type="float16")
spk_rec_pipeline = Pipeline.from_pretrained("pyannote/speaker-diarization-3.1", use_auth_token="your huggingface token")
spk_rec_pipeline.to(torch.device("cuda"))asr_result, info = asr_model.transcribe(audio, language="zh", beam_size=5)
diarization_result = spk_rec_pipeline(audio)final_result = diarize_text(asr_result, diarization_result)
for segment, spk, sent in final_result:print("[%.2fs -> %.2fs] %s %s" % (segment.start, segment.end, sent, spk))

結果

[0.00s -> 9.80s] 非常高興能夠和幾位的話一起來討論互聯網企業如何決勝全球化新高地這個話題 SPEAKER_01
[9.80s -> 20.20s] 然后第二塊其實是游戲平臺所謂游戲平臺它主要是簡單來說就是一個商店家社區的這樣一個模式而這么多年 SPEAKER_03
[20.20s -> 35.70s] 我們隨著整個業務的拓張會發現跟阿里云有非常緊密的聯系因為剛開始偉光在介紹的時候也講阿里云也是阿里巴巴的云所以這個過程中一會兒也可以稍微展開跟大家講一下我們跟云是怎么一路走來的 SPEAKER_04
[35.70s -> 62.40s] 其實的確的話就對我們互聯網公司來說如果不能夠問當地的人口的話我想我們可能整個的就失去了后邊所有的動力不知道你們各位怎么看就是我們最大的這個問題是不是效率優先Yes or No然后如果是講一個最關鍵的你們是怎么來克服這一些挑戰的 SPEAKER_01
[62.40s -> 90.50s] 因為其實我們最近一直在做海外業務所以說我們碰到了一些問題可以一起分享出來給大家其實一起探討一下其實海外我們還是這個觀點說是無論你準備工作做得有多充分無論你有學習能力有多強你一個中國企業的負責人其實在出海的時候它整體還是一個強勢的是做的過程 SPEAKER_03
[90.50s -> 101.60s] 后來推到德國或者推到新加坡 印尼 越南等等這些地方每一個地方走過去都面臨的一個問題是建站的效率怎么樣能夠快速地把這個站點建起來 SPEAKER_04
[101.60s -> 122.90s] 一方面我們當初剛好從2014年剛好開始要出去的時候國內就是三個北上廣深但在海外要同時開服北美 美東 美西 歐洲 日本我還記得那個時候我們在海外如何去建立這種IDC的康碳建設基礎設施建設云服務的部署那都是一個全新的挑戰 SPEAKER_02

四、多說幾句

pyannote的模型都是從huggingface上下載下來的,所以沒有magic直接運行上面代碼可能會報443,自己想辦法搞定網絡問題。
地址:https://huggingface.co/pyannote/speaker-diarization-3.1

以上代碼即使你運行的時候把模型下載到緩存里了,偶爾還是會443,筆者猜測這玩意就算你下載下來了還是還是要聯網推理,所以,要部署到生產環境的同學最好還是使用離線加載。

pyannote離線加載模型的方式和之前NLP的模型不一樣,首先你需要配置的是config.yaml的路徑,請看:

spk_rec_pipeline = Pipeline.from_pretrained("./data/models/speaker-diarization-3.1/config.yaml")

只下載這一個模型是不行的哦,這個只是個config文件,你還要下載另外兩個模型:

https://huggingface.co/pyannote/wespeaker-voxceleb-resnet34-LM

https://huggingface.co/pyannote/segmentation-3.0

最后再修改下config.yaml里的模型路徑,參考我的:

在這里插入圖片描述

當這些都搞好后,你是不是以為完了?

正常來說應該不會有什么問題,但是我在服務器上碰到了如下問題:

在這里插入圖片描述

而且官方也有相關的issue:https://github.com/pyannote/pyannote-audio/issues/1599

我試了,在我服務器上是沒用的

有些人說是onnx模型有問題,比如說模型下載出了問題,我重新下載了好幾遍,都無法解決,所以如果真的是模型的問題,那應該就是pyannote官方push的模型有問題。還有說是Protobuf的問題的,我認為應該不是,最后我也沒找出問題在哪,所以最后我不用pyannote

但神奇的是,用Pipeline.from_pretrained("pyannote/speaker-diarization-3.1", use_auth_token="your huggingface token")直接從緩存里加載模型就沒問題,只是偶爾報443。

最后,祝大家好運。pyannote不行,完全可以用其他模型替代的,筆者推薦去modelscope上看看。

2024/03/04更新

離線加載的Protobuf問題已找到原因:確實是官方提供的模型有問題,官方倉庫提供的是pytorch模型,非onnx模型,從報錯也可以看的出來,我找了半天也沒找到onnx模型在哪里,應該可以自己從pytorch模型轉到onnx模型,還有個辦法是大家可以從https://modelscope.cn/models/manyeyes/speaker_recognition_task_models_onnx_collection/files下載,下載wespeaker開頭的onnx模型就可以了,然后放到wespeaker-voxceleb-resnet34-LM目錄下,如圖:

在這里插入圖片描述

然后再修改speaker-diarization-3.1下的config.yaml文件:

在這里插入圖片描述

至此,大功告成啦!這都不點贊收藏實在沒良心!!!

另外,實際上我發現用whisperx來實現,更方便,但推理速度慢一點。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/719519.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/719519.shtml
英文地址,請注明出處:http://en.pswp.cn/news/719519.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Scrapy與分布式開發(1.1):課程導學

Scrapy與分布式開發:從入門到精通,打造高效爬蟲系統 課程大綱 在這個專欄中,我們將一起探索Scrapy框架的魅力,以及如何通過Scrapy-Redis實現分布式爬蟲的開發。在本課程導學中,我們將為您簡要介紹課程的學習目標、內容…

Verilog Coding Styles For Improved Simulation Efficiency論文學習記錄

原文基于Verilog-XL仿真器,測試了以下幾種方式對仿真效率的影響。 1. 使用 Case 語句而不是 if / else if 語句 八選一多路選擇器 case 實現效率比 if / else if 提升 6% 。 2. 如果可以盡量不使用 begin end 語句 使用 begin end 的 ff 觸發器比不使用 begin end …

初學者學習51還是STM32

初學者學習51還是STM32 在嵌入式系統領域,51和STM32是兩種常見的單片機架構。對于初學者來說,選擇學習哪種架構可能會成為一個難題。本文將對初學者學習51和STM32進行比較,以幫助讀者做出明智的選擇。 1. 51架構 51架構是指Intel 8051系列…

深度相機xyz點云文件三維坐標和jpg圖像文件二維坐標的相互變換函數

深度相機同時拍攝xyz點云文件和jpg圖像文件。xyz文件里面包含三維坐標[x,y,z]和jpg圖像文件包含二維坐標[x,y],但是不能直接進行變換,需要一定的步驟來推演。 下面函數是通過box二維框[xmin, ymin, xmax, ymax, _, _ ]去截取xyz文件中對應box里面的點云…

MyCAT學習——在openEuler22.03中安裝MyCAT2(網盤下載版)

準備工作 因為MyCAT 2基于JDK 1.8開發。也需要在虛擬機中安裝JDK(JDK官網就能下載,我這提供一個捷徑) jdk-8u401-linux-x64.rpmhttps://pan.baidu.com/s/1ywcDsxYOmfZONpmH9oDjfw?pwdrhel下載對應的tar安裝包,以及對應的jar包 安裝程序包…

九州金榜|孩子厭學要怎么辦?

孩子從小學到初中再到高中,孩子出現厭學情緒很正常,但是孩子出現厭學情緒后,就必然會影響到孩子學習成績,孩子產生厭學情緒的原因有哪些呢?只有找準孩子厭學原因才能去幫助孩子怎樣去克服孩子厭學情緒,下面…

ajax請求servlet成功但接收不到返回數據問題

ajax請求servlet成功但接收不到返回數據問題 javaweb初學者,最近老師布置的課設,所有功能都完成了,唯獨ajax與servlet交互出現問題,無論怎么調試都收不到數據 查詢兩天無果,剛才無意間看到 Crabime前輩的文章才恍然大…

深入解析YOLO:實時目標檢測技術的革命者

深入解析YOLO:實時目標檢測技術的革命者 目標檢測作為計算機視覺領域的一個核心任務,一直以來都是研究的熱點。而YOLO(You Only Look Once)技術作為其中的杰出代表,以其獨特的處理方式和卓越的性能,成為了…

day34貪心算法 part03

1005. K 次取反后最大化的數組和 簡單 給你一個整數數組 nums 和一個整數 k ,按以下方法修改該數組: 選擇某個下標 i 并將 nums[i] 替換為 -nums[i] 。 重復這個過程恰好 k 次。可以多次選擇同一個下標 i 。 以這種方式修改數組后,返回數…

力扣棧隊列篇

以下思路來自代碼隨想錄以及官方題解。 文章目錄 232.用棧實現隊列225.用隊列實現棧20.有效的括號1047.刪除字符串中所有相鄰重復項150.逆波蘭表達式求值347.前K個高頻元素 232.用棧實現隊列 請你僅使用兩個棧實現先入先出隊列。隊列應當支持一般隊列支持的所有操作&#xff…

OSError: [WinError 1455] 頁面文件太小,無法完成操作。

[問題描述]:OSError: [WinError 1455] 頁面文件太小,無法完成操作。 原因1:線程數太大 方法:改小線程(workers)數。 原因2:虛擬內存太小或為0,調大虛擬內存。 方法:右鍵…

mysql索引過長Specialed key was too long的解決方法

在創建要給表的時候遇到一個有意思的問題,提示Specified key was too long; max key length is 767 bytes,從描述上來看,是Key太長,超過了指定的 767字節限制。通常出現在嘗試創建一個過長的唯一鍵(UNIQUE KEY&#xf…

Vue.js 實用技巧:深入理解 Vue.mixin

🤍 前端開發工程師、技術日更博主、已過CET6 🍨 阿珊和她的貓_CSDN博客專家、23年度博客之星前端領域TOP1 🕠 牛客高級專題作者、打造專欄《前端面試必備》 、《2024面試高頻手撕題》 🍚 藍橋云課簽約作者、上架課程《Vue.js 和 E…

uniapp真機運行的時候顯示同步資源失敗,未得到同步資源的授權,請停止運行后重新運行,并注意手機上的授權提示

1、問題 在添加清單文件之前,項目運行都是好好的,添加了清單項目以后,基座一打就報這個錯,并且手機在安裝基座的時候會提示解析包時失敗, 2、解決方案 打開我的清單文件,我發現我和官網寫的清單文件不一…

華為OD機試“HJ2計算某字符出現次數”不區分大小寫Java編程解答

描述 寫出一個程序,接受一個由字母、數字和空格組成的字符串,和一個字符,然后輸出輸入字符串中該字符的出現次數。(不區分大小寫字母) 數據范圍: 1≤n≤1000 輸入描述: 第一行輸入一個由字…

【Linux進程間通信】共享內存

【Linux進程間通信】共享內存 目錄 【Linux進程間通信】共享內存system V共享內存共享內存示意圖共享內存的數據結構共享內存函數將共享內存掛接到對應的進程將共享內存取消掛接釋放共享內存 共享內存的特性共享內存擴展共享內存配合管道進行使用 作者:愛寫代碼的剛…

用docker部署后端項目

一、搭建局域網 1.1、介紹前后端項目搭建 需要4臺服務器,在同一個局域網中 1.2、操作 # 搭建net-ry局域網,用于部署若依項目 net-ry:名字 docker network create net-ry --subnet172.68.0.0/16 --gateway172.68.0.1#查看 docker network ls…

Git 安全遠程訪問:SSH 密鑰對生成、添加和連接步驟解析

使用 SSH 密鑰對的 Git 安全遠程訪問:生成、添加和連接 SSH(Secure Shell)是一種用于安全遠程訪問的協議,它提供了加密通信和身份驗證機制。在使用 SSH 連接到遠程 Git 存儲庫時,您可以使用 SSH 密鑰對來確保安全性。…

3d模型合并后一片漆黑是什么原因,怎么解決---模大獅模型網

當合并多個3D模型后,發現整個合并后的模型顯示為一片漆黑通常是由以下幾個可能的原因導致的: 材質設置問題:合并后的模型可能存在材質設置錯誤,導致模型無法正確顯示。檢查每個模型的材質屬性,確保其正確設置&#xff…

老隋藍海項目有哪些?能賺錢嗎?

在創業的海洋中,每個人都渴望找到那片屬于自己的“藍海”,而“老隋藍海項目”便是許多人心中的那片未知海域。那么,老隋藍海項目究竟是指什么?它們又能否成為創業者的新財富之源? 藍海項目的定義 我們要明白,藍海項目通常指的是…