ctcdecode
ctcdecode third party files
CTCDecode是CTC(連接派時間分類)梁搜索解碼的實現。 C ++代碼從槳槳的DeepSpeech中自由借來。它包括可交換得分手支持啟用標準光束搜索和基於KENLM的解碼。如果您是CTC和Beam搜索概念的新手,請訪問“資源”部分,在其中鏈接一些教程,以解釋為什麼需要它們。
該圖書館在很大程度上是獨立的,只需要Pytorch。構建C ++庫需要GCC或Clang。還可以選擇包括Kenlm語言建模支持,並默認啟用。
以下安裝也適用於Google Colab。
# get the code
git clone --recursive https://github.com/parlance/ctcdecode.git
cd ctcdecode && pip install . from ctcdecode import CTCBeamDecoder
decoder = CTCBeamDecoder (
labels ,
model_path = None ,
alpha = 0 ,
beta = 0 ,
cutoff_top_n = 40 ,
cutoff_prob = 1.0 ,
beam_width = 100 ,
num_processes = 4 ,
blank_id = 0 ,
log_probs_input = False
)
beam_results , beam_scores , timesteps , out_lens = decoder . decode ( output )CTCBeamDecoderlabels是您用來訓練模型的令牌。它們應該與您的輸出相同。例如,如果您的令牌是英文字母,並且您將0用作空白令牌,那麼您將通過列表(“ _ abcdefghijklmopqrstuvwxyz”)作為您的論點model_path是您外部KENLM語言模型(LM)的途徑。默認值無。alpha加權。重量為0表示LM無效。beta重量與我們光束內的單詞數相關。cutoff_top_n截止號碼。僅在Beam搜索中,只有最高概率的頂級cutoff_top_n字符才能使用。cutoff_prob截止概率。 1.0意味著沒有修剪。beam_width這控制了光束搜索的寬度。更高的值更有可能找到頂梁,但它們也會使您的光束搜索成倍緩慢。此外,輸出的時間越長,大型光束的時間就越多。這是一個重要的參數,代表您需要根據數據集和需求進行的權衡。num_processes工人平行批處理。您可能想傳遞計算機的CPU數量。您可以在python中找到它,然後import multiprocessing ,然後n_cpus = multiprocessing.cpu_count() 。默認4。blank_id這應該是CTC空白令牌的索引(可能為0)。log_probs_input如果您的輸出通過SoftMax並表示概率,則應該是錯誤的,如果它們通過LogSoftMax並表示負log可能性,則需要傳遞true。如果您不了解這一點,請運行print(output[0][0].sum()) ,如果是一個負數,則您可能會有NLL,並且需要通過True(如果總計為〜1.0),則應通過false。默認錯誤。decode方法的輸入output應為您的模型的輸出激活。如果您的輸出已經通過SoftMax層,則不需要更改(除了轉置除外),但是如果您的output代表負日誌可能性(原始logits),則您要么需要通過額外的torch.nn.functional.softmax將其傳遞給log_probs_input=False fords false fords false decdoder。您的輸出應進行批處理X n_timesteps x n_labels,因此您可能需要將其轉換為解碼器。請注意,如果您以錯誤的順序傳遞內容,那麼梁搜索可能仍會運行,您將獲得廢話結果。decode方法的輸出4件事從decode中返回
beam_results形狀:批處理x n_beams x n_timesteps包含一系列字符的批次(這些是ints,您仍然需要將它們解碼回文本),代表給定的光束搜索的結果。請注意,光束幾乎總是比時間步的總數短,並且附加數據是非敏感的,因此要查看批處理中的第一個項目的頂梁(作為int標籤),您需要運行beam_results[0][0][:out_len[0][0]] 。beam_scores形狀:批處理X n_beams批量,每個樑的CTC分數大致(在此處查看代碼以獲取更多信息)。如果這是真的,您可以相信模型對梁正確使用p=1/np.exp(beam_score)的信心。timesteps形狀:批處理x n_beams nth輸出字符具有峰值概率的時間步。可以用作音頻和筆錄之間的對齊。out_lens形狀:批處理x n_beams。 out_lens[i][j]是您批處理I項目的jth beam_result的長度。 from ctcdecode import OnlineCTCBeamDecoder
decoder = OnlineCTCBeamDecoder (
labels ,
model_path = None ,
alpha = 0 ,
beta = 0 ,
cutoff_top_n = 40 ,
cutoff_prob = 1.0 ,
beam_width = 100 ,
num_processes = 4 ,
blank_id = 0 ,
log_probs_input = False
)
state1 = ctcdecode . DecoderState ( decoder )
probs_seq = torch . FloatTensor ([ probs_seq ])
beam_results , beam_scores , timesteps , out_seq_len = decoder . decode ( probs_seq [:, : 2 ], [ state1 ], [ False ])
beam_results , beam_scores , timesteps , out_seq_len = decoder . decode ( probs_seq [:, 2 :], [ state1 ], [ True ])在線解碼器正在復制ctcbeamdecoder接口,但需要狀態和is_eos_s序列。
狀態用於累積與一個數據源相對應的塊序列。 IS_EOS_S告訴解碼器,這些塊是否已停止被推到相應的狀態。
獲取批處理beam_results[0][0][:out_len[0][0]]中第一項的頂梁
獲取批處理中第一項的前50個光束
for i in range ( 50 ):
print ( beam_results [ 0 ][ i ][: out_len [ 0 ][ i ]])請注意,這些將是需要解碼的INT列表。您可能已經有一個從INT到文本解碼的函數,但是如果沒有,則可以做類似的事情。 “”。使用您傳遞給CTCBeamDecoder的"".join[labels[n] for n in beam_results[0][0][:out_len[0][0]]]