CTCDECODE는 Pytorch에 대한 CTC (Connectionist Temporal Classification) 빔 검색 디코딩의 구현입니다. C ++ 코드는 패들 패들의 DeepSpeech에서 자유롭게 빌렸다. 표준 빔 검색을 가능하게하는 스왑 가능한 득점자 지원 및 Kenlm 기반 디코딩이 포함됩니다. CTC 및 Beam Search의 개념을 처음 접하는 경우 필요한 이유를 설명하는 몇 가지 자습서를 연결하는 리소스 섹션을 방문하십시오.
도서관은 대체로 독립적이며 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 )CTCBeamDecoder 에 입력labels 모델을 훈련시키는 데 사용한 토큰입니다. 그들은 당신의 출력과 같은 순서가되어야합니다. 예를 들어, 토큰이 영어 문자이고 빈 토큰으로 0을 사용한 경우 라벨에 대한 논쟁으로 목록 ( "_ abcdefghijklmopqrstuvwxyz")을 전달할 수 있습니다.model_path 는 외부 Kenlm 언어 모델 (LM)의 경로입니다. 기본값은 없다.alpha 가중치. 0의 무게는 LM이 효과가 없다는 것을 의미합니다.beta 무게.cutoff_top_n 가지 치기의 컷오프 번호. 어휘에서 확률이 가장 높은 상단 컷오프 _top_n 문자 만 빔 검색에 사용됩니다.cutoff_prob 컷오프 확률. 1.0은 가지 치기가 없음을 의미합니다.beam_width 빔 검색이 얼마나 광범위한 지 제어합니다. 높은 값은 상단 빔을 찾을 가능성이 높지만 빔 검색이 기하 급수적으로 느려집니다. 또한 출력이 길수록 큰 빔이 더 많이 걸립니다. 이것은 데이터 세트 및 요구 사항을 기반으로하는 트레이드 오프를 나타내는 중요한 매개 변수입니다.num_processes NUM_PROCESSES 작업자를 사용하여 배치를 병렬화합니다. 컴퓨터가 가지고있는 CPU 수를 전달하고 싶을 것입니다. import multiprocessing 과 n_cpus = multiprocessing.cpu_count() 와 함께 파이썬에서 찾을 수 있습니다. 기본 4.blank_id 이것은 CTC blank 토큰의 색인이어야합니다 (아마도 0).log_probs_input 출력이 softmax를 통과하고 확률을 나타내는 경우, 이것은 거짓이어야합니다. logsoftmax를 통과하고 부정적인 로그 가능성을 나타내면 true를 통과해야합니다. 이것을 이해하지 못하면 print(output[0][0].sum()) , 음수 인 경우 아마도 nll이 있고 true를 전달해야합니다. ~ 1.0으로 합쳐야합니다. 기본 거짓.decode 메소드에 입력output 모델의 출력 활성화 여야합니다. 출력이 SoftMax 레이어를 통과 한 경우 변경할 필요가 없지만 (전환을 제외하고) output 음의 로그 가능성 (원시 로그)을 나타내는 경우 추가 torch.nn.functional.softmax 를 통과 log_probs_input=False 합니다. 출력은 배치 크기 x n_timesteps x n_labels이어야하므로 디코더로 전달하기 전에 전환해야 할 수도 있습니다. 당신이 잘못된 순서로 물건을 전달하면 빔 검색이 여전히 실행될 것입니다. 아마도 말도 안되는 결과를 얻을 수 있습니다.decode 방법의 출력 decode 에서 4 가지가 반환됩니다
beam_results 모양 : Batchsize X N_BEAMS X N_TIMESTES 주어진 빔 검색의 결과를 나타냅니다. 빔은 총 타임 스텝 수보다 거의 항상 짧고 추가 데이터는 감도가 아니므로 배치의 첫 번째 항목에서 상단 빔 (int 레이블)을 볼 수 있으려면 beam_results[0][0][:out_len[0][0]] 실행해야합니다.beam_scores 모양 : 배치 크기 X N_BEAM 각 빔의 대략적인 CTC 점수가있는 배치 (자세한 내용은 여기에 코드를 참조하십시오). 이것이 사실이라면, 빔이 p=1/np.exp(beam_score) 로 빔이 정확하다는 모델의 신뢰를 얻을 수 있습니다.timesteps - 모양 : Batchsize x n_beam 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에서 텍스트로 디코딩하는 기능이있을 수 있지만 그렇지 않으면 같은 일을 할 수 있습니다. "".join[labels[n] for n in beam_results[0][0][:out_len[0][0]]] CTCBeamDecoder 에 전달한 라벨을 사용하여