具有單語言自動語音識別,具有單詞級的時間戳和信心。
Whisper是一組由OpenAI訓練的多語言,強大的語音識別模型,可實現最先進的語言。對耳語模型進行了訓練,可以預測語音段上的近似時間戳(大多數情況下,具有1秒的精度),但它們最初不能預測單詞時間戳。該存儲庫提出了一個實現,以預測單詞時間戳,並在使用耳語模型轉錄時對語音段進行更準確的估計。此外,將置信度得分分配給每個單詞和每個段。
該方法基於Jong Wook Kim的筆記本表明,該筆記本的動態時間翹曲(DTW)應用於交叉注意權重。此筆記本有一些補充:
whisper-timestamped能夠處理長的文件,幾乎沒有其他內存。 whisper-timestamped是openai-whisper Python包的擴展,旨在與任何版本的openai-whisper兼容。它提供更有效/準確的單詞時間戳以及這些其他功能:
免責聲明:請注意,此擴展名用於實驗目的,可能會對性能產生重大影響。我們對其使用產生的任何問題或低效率概不負責。
恢復單詞級時間戳的另一種相關方法涉及使用預測字符的WAV2VEC模型,如Whisperx中成功實現。但是,這些方法具有基於跨注意權重的方法(例如whisper_timestamped )中的幾個缺點。這些缺點包括:
一種不需要其他模型的替代方法是查看每次(子)單詞令牌估計的時間戳令牌的概率。例如,在whisper.cpp和穩定-TS中實現了這一點。但是,這種方法缺乏魯棒性,因為在每個單詞之後,尚未對耳語模型進行訓練以輸出有意義的時間戳。耳語模型僅在預測一定數量的單詞(通常在句子的末尾)後才預測時間戳,並且在這種情況之外的時間戳的概率分佈可能不准確。在實踐中,這些方法可以產生在某些時期完全不同步的結果(我們觀察到了這一點,尤其是在有叮噹音樂的情況下)。同樣,耳語模型的時間戳精度往往會被舍入到1秒鐘(如許多視頻字幕),這對於單詞來說太不准確了,並且達到更好的準確性是棘手的。
要求:
python3 (更高或等於3.7的版本,建議至少3.9)ffmpeg (請參閱在耳語存儲庫上安裝的說明)您可以通過使用PIP安裝whisper-timestamped :
pip3 install whisper-timestamped或通過克隆此存儲庫並運行安裝:
git clone https://github.com/linto-ai/whisper-timestamped
cd whisper-timestamped/
python3 setup.py install如果要繪製音頻時間戳和單詞之間的對齊(如本節中),則還需要matplotlib:
pip3 install matplotlib如果您想使用VAD選項(在運行Whisper模型之前進行語音活動檢測),則還需要Torchaudio和OnnxRuntime:
pip3 install onnxruntime torchaudio如果您想從擁抱面樞紐中使用固定的耳語模型,您還需要變形金剛:
pip3 install transformers可以使用以下方式構建大約9GB的碼頭圖像
git clone https://github.com/linto-ai/whisper-timestamped
cd whisper-timestamped/
docker build -t whisper_timestamped:latest .如果您沒有GPU(或不想使用它),則無需安裝CUDA依賴項。然後,您應該只需安裝光線的輕型版本,然後再安裝Whisper-Timestamp,例如:
pip3 install
torch==1.13.1+cpu
torchaudio==0.13.1+cpu
-f https://download.pytorch.org/whl/torch_stable.html也可以使用以下方式構建約3.5GB的特定Docker圖像:
git clone https://github.com/linto-ai/whisper-timestamped
cd whisper-timestamped/
docker build -t whisper_timestamped_cpu:latest -f Dockerfile.cpu .使用PIP時,可以使用以下方式將庫更新到最新版本:
pip3 install --upgrade --no-deps --force-reinstall git+https://github.com/linto-ai/whisper-timestamped
可以通過運行來使用特定版本的openai-whisper ,例如:
pip3 install openai-whisper==20230124在Python中,您可以使用whisper_timestamped.transcribe()函數,該函數類似於whisper.transcribe() :
import whisper_timestamped
help ( whisper_timestamped . transcribe ) whisper.transcribe()的主要區別在於,輸出將包含所有片段的關鍵"words" ,並帶有單詞的啟動和終點位置。請注意,該詞將包括標點符號。請參見下面的示例。
此外,默認的解碼選項不同於有效的解碼(貪婪解碼而不是梁搜索,而沒有溫度採樣的後備)。要具有與whisper相同的默認值,請使用beam_size=5, best_of=5, temperature=(0.0, 0.2, 0.4, 0.6, 0.8, 1.0) 。
還有與單詞對齊相關的其他選項。
通常,如果您導入whisper_timestamped ,而不是在python腳本中whisper ,並使用transcribe(model, ...) model.transcribe(...)不是模型。
import whisper_timestamped as whisper
audio = whisper . load_audio ( "AUDIO.wav" )
model = whisper . load_model ( "tiny" , device = "cpu" )
result = whisper . transcribe ( model , audio , language = "fr" )
import json
print ( json . dumps ( result , indent = 2 , ensure_ascii = False ))請注意,您可以使用whisper_timestamped的load_model方法使用HuggingFace或本地文件夾中的Finetuned Wishper模型。例如,如果您想使用hisper-large-v2-nob,則只需進行以下操作:
import whisper_timestamped as whisper
model = whisper . load_model ( "NbAiLab/whisper-large-v2-nob" , device = "cpu" )
# ...您也可以在命令行上使用whisper_timestamped ,類似於whisper 。請參閱幫助:
whisper_timestamped --help whisper CLI的主要區別是:
--output_dir .對於耳語默認。--verbose True用於竊竊私語。--accurate (這是--beam_size 5 --temperature_increment_on_fallback 0.2 --best_of 5 )。--compute_confidence啟用/禁用每個單詞的置信分數計算。--punctuations_with_words決定是否應包含標點符號。一個示例命令使用tiny模型處理多個文件並在當前文件夾中輸出結果,默認情況下是用竊竊私語來處理的,如下:
whisper_timestamped audio1.flac audio2.mp3 audio3.wav --model tiny --output_dir .
請注意,您可以使用HuggingFace或本地文件夾的微調耳語模型。例如,如果您想使用竊竊私語-V2-NOB模型,則可以簡單地執行以下操作:
whisper_timestamped --model NbAiLab/whisper-large-v2-nob <...>
除了主要的transcribe功能外,hisper-Timestamped還提供了一些實用功能:
remove_non_speech使用語音活動檢測(VAD)從音頻中刪除非語音段。
from whisper_timestamped import remove_non_speech
audio_speech , segments , convert_timestamps = remove_non_speech ( audio , vad = "silero" )load_model從給定名稱或路徑上加載耳語模型,包括對HuggingFace的微調模型的支持。
from whisper_timestamped import load_model
model = load_model ( "NbAiLab/whisper-large-v2-nob" , device = "cpu" )請注意,您可以使用plot_word_alignment選項whisper_timestamped.transcribe() python函數或whisper_timestamped cli的--plot選項,以查看每個段的單詞對齊單詞。

whisper_timestamped.transcribe()函數的輸出是Python詞典,可以使用CLI以JSON格式查看。
可以在測試/JSON_SCHEMA.JSON中看到JSON模式。
這是一個示例輸出:
whisper_timestamped AUDIO_FILE.wav --model tiny --language fr{
"text" : " Bonjour! Est-ce que vous allez bien? " ,
"segments" : [
{
"id" : 0 ,
"seek" : 0 ,
"start" : 0.5 ,
"end" : 1.2 ,
"text" : " Bonjour! " ,
"tokens" : [ 25431 , 2298 ],
"temperature" : 0.0 ,
"avg_logprob" : -0.6674491882324218 ,
"compression_ratio" : 0.8181818181818182 ,
"no_speech_prob" : 0.10241222381591797 ,
"confidence" : 0.51 ,
"words" : [
{
"text" : " Bonjour! " ,
"start" : 0.5 ,
"end" : 1.2 ,
"confidence" : 0.51
}
]
},
{
"id" : 1 ,
"seek" : 200 ,
"start" : 2.02 ,
"end" : 4.48 ,
"text" : " Est-ce que vous allez bien? " ,
"tokens" : [ 50364 , 4410 , 12 , 384 , 631 , 2630 , 18146 , 3610 , 2506 , 50464 ],
"temperature" : 0.0 ,
"avg_logprob" : -0.43492694334550336 ,
"compression_ratio" : 0.7714285714285715 ,
"no_speech_prob" : 0.06502953916788101 ,
"confidence" : 0.595 ,
"words" : [
{
"text" : " Est-ce " ,
"start" : 2.02 ,
"end" : 3.78 ,
"confidence" : 0.441
},
{
"text" : " que " ,
"start" : 3.78 ,
"end" : 3.84 ,
"confidence" : 0.948
},
{
"text" : " vous " ,
"start" : 3.84 ,
"end" : 4.0 ,
"confidence" : 0.935
},
{
"text" : " allez " ,
"start" : 4.0 ,
"end" : 4.14 ,
"confidence" : 0.347
},
{
"text" : " bien? " ,
"start" : 4.14 ,
"end" : 4.48 ,
"confidence" : 0.998
}
]
}
],
"language" : " fr "
}如果未指定語言(例如,CLI中的--language fr ),您將找到一個具有語言概率的其他鍵:
{
...
"language" : " fr " ,
"language_probs" : {
"en" : 0.027954353019595146 ,
"zh" : 0.02743500843644142 ,
...
"fr" : 0.9196318984031677 ,
...
"su" : 3.0119704064190955e-08 ,
"yue" : 2.2565967810805887e-05
}
}transcribe_timestamped(model, audio, **kwargs)使用耳語模型轉錄音頻併計算單詞級時間戳。
model :耳語模型實例用於轉錄的耳語模型。
audio :聯合[str,np.ndarray,torch.tensor]要轉錄音頻文件的路徑,或者作為numpy陣列或pytorch張量的音頻波形。
language :str,可選(默認值:無)音頻的語言。如果沒有,將執行語言檢測。
task :str,默認“轉錄”要執行的任務:“轉錄”語音識別或“翻譯”以翻譯為英語。
vad :聯合[bool,str,列表[元組[float,float]]],可選(默認值:false)是否使用語音活動檢測(VAD)來刪除非語音段。可以:
detect_disfluencies :bool,默認錯誤是否在轉錄中檢測和標記分裂(猶豫,填充單詞等)。
trust_whisper_timestamps :bool,默認情況下,是否依靠耳語的時間戳來初始段位置。
compute_word_confidence :bool,默認情況下,是否要計算單詞的置信度得分。
include_punctuation_in_confidence :bool,默認錯誤是否在計算單詞置信度時是否包括標點符號概率。
refine_whisper_precision :float,默認值0.5在幾秒鐘內,要精煉竊竊私語段位置多少。必須是0.02的倍數。
min_word_duration :float,默認值為0.02單詞的最小持續時間,以秒為單詞。
plot_word_alignment :bool或str,默認錯誤是否繪製每個段的單詞對齊。如果是字符串,請將繪圖保存到給定文件。
word_alignement_most_top_layers :int,可選(默認值:無)用於單詞對齊的頂層數量。如果沒有,請使用所有層。
remove_empty_words :bool,默認為false是否刪除段末尾沒有持續時間的單詞。
naive_approach :bool,默認錯誤力量解碼兩次的天真方法(一次轉錄,一次進行對齊)。
use_backend_timestamps :BOOL,默認錯誤是否使用後端提供的單詞時間戳(Openai-Whisper或Transformers),而不是由竊竊私語timestamp的更複雜的啟發式方法計算出的。
temperature :聯合[float,list [float]],抽樣默認溫度0.0溫度。可以是單個價值或後備溫度的列表。
compression_ratio_threshold :float,默認2.4如果GZIP壓縮比高於此值,請將解碼視為失敗。
logprob_threshold :float,默認值-1.0如果平均日誌概率低於此值,請將解碼視為失敗。
no_speech_threshold :float,默認的0.6概率閾值<| nospeech |>令牌。
condition_on_previous_text :bool,默認情況下,是否提供先前的輸出作為下一個窗口的提示。
initial_prompt :str,可選(默認值:無)可選文本,以作為第一個窗口的提示提供。
suppress_tokens :str,默認“ -1”逗號分隔的令牌ID列表,以抑制採樣期間。
fp16 :Bool,可選(默認值:無)是否在FP16 Precision中執行推斷。
verbose :布爾或無,默認為false是否顯示要解碼為控制台的文本。如果為true,請顯示所有細節。如果是錯誤的,則顯示最小的細節。如果沒有,則不顯示任何內容。
包含的字典:
text :str-完整的轉錄文本segments :列表[dict] - 段詞典列表,每個詞典包含:id :int-細分IDseek :INT-在音頻文件中啟動位置(在樣本中)start :float-段的開始時間(以秒為單位)end :浮點 - 段的結束時間(以秒為單位)text :str-段的抄錄文本tokens :列表[int] - 該細分的令牌IDtemperature :浮點 - 該細分市場的溫度avg_logprob :float-段的平均日誌概率compression_ratio :float-段的壓縮比no_speech_prob :float-細分市場中無語音的概率confidence :浮點 - 該細分市場的信心評分words :列表[dict] - 單詞詞典列表,每個詞典包含:start :float-單詞的開始時間(以秒為單位)end :float-單詞的結尾時間(以秒為單位)text :str-單詞文字confidence :浮點 - 單詞的置信度得分(如果計算)language :str-檢測或指定語言language_probs :DICS-語言檢測概率(如果適用) RuntimeError :如果VAD方法未正確安裝或配置。ValueError :如果refine_whisper_precision不是0.02的正倍。AssertionError :如果音頻持續時間短於預期,或者段數的數量不一致。 naive_approach參數可用於調試或處理特定音頻特徵時有用,但可能比默認方法慢。use_efficient_by_default為True時,默認情況下將某些參數(例如best_of , beam_size和temperature_increment_on_fallback設置為none,以進行更有效的處理。remove_non_speech(audio, **kwargs)使用語音活動檢測(VAD)從音頻中刪除非語音段。
audio :TORCH.TENSOR音頻數據作為Pytorch張量。
use_sample :bool,默認為false,如果為true,請在樣本中返回開始和結束時間,而不是秒。
min_speech_duration :FLOAT,默認情況下,語音段的最小持續時間為幾秒鐘。
min_silence_duration :float,默認的1秒鐘內靜音段的最小持續時間。
dilatation :浮動,默認為0.5,要在幾秒鐘內將VAD檢測到的每個語音段放大多少。
sample_rate :int,默認音頻的默認樣本率。
method :str或列表[元組[float,float]],使用默認的“ Silero” VAD方法。可以是“ Silero”,“ Auditok”或時間戳列表。
avoid_empty_speech :bool,默認為false如果為true,請避免返回空的語音段。
plot :聯合[bool,str],默認為false,如果為true,請繪製VAD結果。如果是字符串,請將繪圖保存到給定文件。
包含元組:
ImportError :如果未安裝所需的VAD庫(例如,審核)。ValueError :如果指定了無效的VAD方法。 load_model(name, device=None, backend="openai-whisper", download_root=None, in_memory=False)從給定名稱或路徑上加載耳語模型。
name :模型的str名稱或模型路徑。可以:
device :Union [Str,Torch.device],可選(默認:無)可以使用的設備。如果沒有,請使用CUDA如果可用,則使用CPU。
backend :STR,默認“ openai-whisper”後端使用。 “變形金剛”或“ openai-whisper”。
download_root :str,可選(默認值:無)root文件夾以下載該模型。如果沒有,請使用默認下載root。
in_memory :bool,默認錯誤是否將模型權重預加載到主機內存中。
加載的耳語模型。
ValueError :如果指定了無效的後端。ImportError :如果使用“變形金剛”後端時未安裝變壓器庫。RuntimeError :如果無法從指定源找到或下載模型。OSError :如果有問題,請閱讀模型文件或訪問指定的路徑。 get_alignment_heads(model, max_top_layer=3)獲取給定模型的對齊頭。
model :耳語模型實例的耳語模型,該模型要檢索對齊頭。
max_top_layer :INT,默認情況下3個最多要考慮對齊頭的頂層數量。
代表對齊頭的稀疏張量。
以下功能可用於為各種文件格式編寫成績單:
write_csv(transcript, file, sep=",", text_first=True, format_timestamps=None, header=False)將成績單數據寫入CSV文件。
transcript :列表[dict]筆錄段詞典列表。
file :類似文件的對象文件,將CSV數據寫入。
sep :str,默認為“”,用於在CSV文件中使用的分隔符。
text_first :bool,默認為true,如果為true,請在開始/結束時間之前寫入文本列。
format_timestamps :可呼叫,可選(默認值:無)函數以格式化時間戳值。
header :union [bool,list [str]],默認為false,如果為true,請寫入默認標題。如果列表,請用作自定義標頭。
IOError :如果有問題寫入指定文件。ValueError :如果成績單數據不採用預期格式。 format_timestamps參數允許定制時間戳值的格式,這可能有助於特定的用例或數據分析要求。 write_srt(transcript, file)將成績單數據寫入SRT(子幕字幕)文件。
transcript :列表[dict]筆錄段詞典列表。
file :類似文件的對象文件,將SRT數據寫入。
IOError :如果有問題寫入指定文件。ValueError :如果成績單數據不採用預期格式。 write_vtt(transcript, file)將成績單數據寫入VTT(WebVTT)文件。
transcript :列表[dict]筆錄段詞典列表。
file :類似文件的對象文件,將VTT數據寫入。
IOError :如果有問題寫入指定文件。ValueError :如果成績單數據不採用預期格式。 write_tsv(transcript, file)將成績單數據寫入TSV(TAB分隔值)文件。
transcript :列表[dict]筆錄段詞典列表。
file :類似文件的對象文件,將TSV數據寫入。
IOError :如果有問題寫入指定文件。ValueError :如果成績單數據不採用預期格式。 以下是默認情況下未啟用但可能會改善結果的一些選項。
如前所述,默認情況下禁用了一些解碼選項,以提高效率。但是,這可能會影響轉錄的質量。要運行具有提供良好轉錄的最佳機會的選項,請使用以下選項。
results = whisper_timestamped . transcribe ( model , audio , beam_size = 5 , best_of = 5 , temperature = ( 0.0 , 0.2 , 0.4 , 0.6 , 0.8 , 1.0 ), ...)whisper_timestamped --accurate ...當給出一段沒有言語的細分市場時,耳語模型可以“幻覺”文本。在使用耳語模型轉錄之前,可以通過將VAD和將語音段粘合在一起來避免使用。竊竊私語可以通過whisper-timestamped 。
results = whisper_timestamped . transcribe ( model , audio , vad = True , ...)whisper_timestamped --vad True ...默認情況下,使用的VAD方法為Silero。但是可以使用其他方法,例如Silero或Auditok的早期版本。引入了這些方法,因為最新版本的Silero VAD可能會在某些音頻上有很多錯誤的警報(在沉默中檢測到語音)。
results = whisper_timestamped . transcribe ( model , audio , vad = "silero:v3.1" , ...)
results = whisper_timestamped . transcribe ( model , audio , vad = "auditok" , ...)whisper_timestamped --vad silero:v3.1 ...
whisper_timestamped --vad auditok ...為了觀看VAD結果,您可以使用whisper_timestamped cli的--plot選項,或plot_word_alignment選項的whisper_timestamped.transcribe() python函數。它將在輸入音頻信號上顯示VAD結果如下(x軸以秒為單位):
| vad =“ silero:v4.0” | vad =“ silero:v3.1” | vad =“ auditok” |
|---|---|---|
![]() | ![]() | ![]() |
耳語模型傾向於消除言語爆發(填充單詞,猶豫,重複等)。如果沒有預防措施,未轉錄的漏洞將影響以下單詞的時間戳:單詞開頭的時間戳實際上將是分裂開始的時間戳。 whisper-timestamped可以避免這種啟發式方法。
results = whisper_timestamped . transcribe ( model , audio , detect_disfluencies = True , ...)whisper_timestamped --detect_disfluencies True ...重要:請注意,當使用這些選項時,可能會出現在轉錄中,以特殊的“ [*] ”字出現。
如果您在研究中使用它,請引用回購:
@misc { lintoai2023whispertimestamped ,
title = { whisper-timestamped } ,
author = { Louradour, J{'e}r{^o}me } ,
journal = { GitHub repository } ,
year = { 2023 } ,
publisher = { GitHub } ,
howpublished = { url{https://github.com/linto-ai/whisper-timestamped} }
}以及Openai Whisper紙:
@article { radford2022robust ,
title = { Robust speech recognition via large-scale weak supervision } ,
author = { Radford, Alec and Kim, Jong Wook and Xu, Tao and Brockman, Greg and McLeavey, Christine and Sutskever, Ilya } ,
journal = { arXiv preprint arXiv:2212.04356 } ,
year = { 2022 }
}和動態時間彎曲的本文:
@article { JSSv031i07 ,
title = { Computing and Visualizing Dynamic Time Warping Alignments in R: The dtw Package } ,
author = { Giorgino, Toni } ,
journal = { Journal of Statistical Software } ,
year = { 2009 } ,
volume = { 31 } ,
number = { 7 } ,
doi = { 10.18637/jss.v031.i07 }
}