CTCDecode adalah implementasi CTC (Klasifikasi Temporal Connectionist) Decoding pencarian balok untuk pytorch. Kode C ++ dipinjam secara bebas dari Deepspeech Paddle Dayung. Ini termasuk dukungan pencetak gol swappable yang memungkinkan pencarian balok standar, dan decoding berbasis Kenlm. Jika Anda baru mengenal konsep CTC dan Beam Search, silakan kunjungi bagian sumber daya di mana kami menautkan beberapa tutorial yang menjelaskan mengapa mereka dibutuhkan.
Perpustakaan sebagian besar mandiri dan hanya membutuhkan Pytorch. Membangun perpustakaan C ++ membutuhkan GCC atau dentang. Dukungan pemodelan bahasa Kenlm juga disertakan secara opsional, dan diaktifkan secara default.
Instalasi di bawah ini juga berfungsi untuk 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 adalah token yang Anda gunakan untuk melatih model Anda. Mereka harus berada dalam urutan yang sama dengan output Anda. Misalnya jika token Anda adalah huruf bahasa Inggris dan Anda menggunakan 0 sebagai token kosong Anda, maka Anda akan lulus dalam daftar ("_ ABCDEFGHIJKLMOPQRSUVWXYZ") sebagai argumen Anda untuk labelmodel_path adalah jalur menuju model bahasa Kenlm eksternal Anda (LM). Default tidak ada.alpha yang terkait dengan probabilitas LMS. Berat 0 berarti LM tidak berpengaruh.beta yang terkait dengan jumlah kata dalam balok kami.cutoff_top_n dalam pemangkasan. Hanya karakter cutoff_top_n teratas dengan probabilitas tertinggi dalam vocab yang akan digunakan dalam pencarian balok.cutoff_prob dalam pemangkasan. 1.0 berarti tidak ada pemangkasan.beam_width ini mengontrol seberapa luas pencarian balok. Nilai yang lebih tinggi lebih mungkin untuk menemukan balok atas, tetapi mereka juga akan membuat pencarian balok Anda lebih lambat secara eksponensial. Selain itu, semakin lama output Anda, semakin banyak waktu balok besar. Ini adalah parameter penting yang mewakili tradeoff yang perlu Anda buat berdasarkan dataset dan kebutuhan Anda.num_processes Pejabat batch menggunakan pekerja num_processes. Anda mungkin ingin melewati jumlah CPU yang dimiliki komputer Anda. Anda dapat menemukan ini dalam python dengan import multiprocessing kemudian n_cpus = multiprocessing.cpu_count() . Default 4.blank_id Ini harus menjadi indeks token kosong CTC (mungkin 0).log_probs_input Jika output Anda telah melewati softmax dan mewakili probabilitas, ini harus salah, jika mereka melewati logsoftmax dan mewakili kemungkinan log negatif, Anda harus lulus benar. Jika Anda tidak memahami ini, jalankan print(output[0][0].sum()) , jika itu adalah angka negatif, Anda mungkin memiliki NLL dan perlu lulus, jika jumlahnya menjadi ~ 1.0 Anda harus lulus salah. False default.decodeoutput harus menjadi aktivasi output dari model Anda. Jika output Anda telah melewati lapisan softmax, Anda tidak perlu mengubahnya (kecuali mungkin untuk transpos), tetapi jika output Anda mewakili kemungkinan log negatif (log mentah), Anda harus melewatkannya melalui torch.nn.functional.softmax log_probs_input=False . Output Anda harus batchsize x n_timesteps x n_labels sehingga Anda mungkin perlu mengubahnya sebelum meneruskannya ke decoder. Perhatikan bahwa jika Anda meneruskan hal -hal dalam urutan yang salah, pencarian balok mungkin masih akan berjalan, Anda hanya akan mendapatkan kembali hasil omong kosong.decode 4 hal dikembalikan dari decode
beam_results - Bentuk: Batchsize x n_beams x n_timesteps Batch yang berisi serangkaian karakter (ini adalah int, Anda masih perlu memecahkan kode kembali ke teks Anda) yang mewakili hasil dari pencarian balok yang diberikan. Perhatikan bahwa balok hampir selalu lebih pendek dari jumlah total waktu, dan data tambahan tidak masuk akal, jadi untuk melihat balok atas (sebagai label int) dari item pertama dalam batch, Anda perlu menjalankan beam_results[0][0][:out_len[0][0]] .beam_scores - Bentuk: Batchsize x n_beams Batch dengan skor CTC perkiraan setiap balok (lihat kode di sini untuk info lebih lanjut). Jika ini benar, Anda bisa mendapatkan kepercayaan model bahwa balok itu benar dengan p=1/np.exp(beam_score) .timesteps - Bentuk: Batchsize x n_beams Timestep di mana karakter output ke -n memiliki probabilitas puncak. Dapat digunakan sebagai penyelarasan antara audio dan transkrip.out_lens - bentuk: Batchsize x n_beams. out_lens[i][j] adalah panjang dari JTH beam_result, dari item I dari batch Anda. 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 ])Dekoder online menyalin antarmuka CTCBEAMDECODER, tetapi membutuhkan status dan urutan IS_EOS_S.
Status digunakan untuk mengumpulkan urutan potongan, masing -masing sesuai dengan satu sumber data. IS_EOS_S memberi tahu decoder apakah potongan -potongan telah berhenti didorong ke keadaan yang sesuai.
Dapatkan balok atas untuk item pertama di Batch beam_results[0][0][:out_len[0][0]]
Dapatkan 50 balok teratas untuk item pertama di batch Anda
for i in range ( 50 ):
print ( beam_results [ 0 ][ i ][: out_len [ 0 ][ i ]]) Catatan, ini akan menjadi daftar INT yang membutuhkan decoding. Anda mungkin sudah memiliki fungsi untuk memecahkan kode dari int ke teks, tetapi jika tidak, Anda dapat melakukan sesuatu seperti itu. "".join[labels[n] for n in beam_results[0][0][:out_len[0][0]]] menggunakan label yang Anda lewati ke CTCBeamDecoder