CTC 강제정렬기
v0.2
커뮤니티에 대한 저의 기여에 감사한다면 github에서 프로젝트에 별표를 표시해 주세요(오른쪽 상단 참조).
이 Python 패키지는 Hugging Face의 사전 훈련된 모델을 사용하여 텍스트와 오디오 간의 강제 정렬을 수행하는 효율적인 방법을 제공합니다. 정확한 정렬을 위해 Wav2Vec2, HuBERT 및 MMS 모델의 기능을 활용하므로 음성 말뭉치를 생성하는 강력한 도구가 됩니다.
토큰 삽입 빈도, 세그먼트 병합을 위한 병합 임계값 등을 제어합니다.pip install git+https://github.com/MahmoudAshraf97/ctc-forced-aligner.git
ctc-forced-aligner --audio_path " path/to/audio.wav " --text_path " path/to/text.txt " --language " eng " --romanize
논쟁 | 설명 | 기본 |
---|---|---|
--audio_path | 오디오 파일 경로 | 필수의 |
--text_path | 텍스트 파일의 경로 | 필수의 |
--language | ISO 639-3 코드의 언어 | 필수의 |
--romanize | 기본 모델을 사용할 때 필요한 비라틴어 스크립트 또는 언어에 관계없이 다국어 모델에 대해 로마자 표기를 활성화합니다. | 거짓 |
--split_size | 정렬 세분성: "문장", "단어" 또는 "문자" | "단어" |
--star_frequency | 토큰의 빈도: "세그먼트" 또는 "가장자리" | "가장자리" |
--merge_threshold | 세그먼트 병합을 위한 병합 임계값 | 0.00 |
--alignment_model | 정렬 모델의 이름 | MahmoudAshraf/mms-300m-1130-forced-aligner |
--compute_dtype | 추론을 위한 dtype 계산 | "플로트32" |
--batch_size | 추론을 위한 배치 크기 | 4 |
--window_size | 오디오 청킹을 위한 창 크기(초) | 30 |
--context_size | 초 단위로 청크 간 겹침 | 2 |
--attn_implementation | 주의 구현 | "열렬한" |
--device | 추론에 사용할 장치: "cuda" 또는 "cpu" | 사용 가능한 경우 "cuda", 그렇지 않으면 "cpu" |
# Align an English audio file with the text file
ctc-forced-aligner --audio_path " english_audio.wav " --text_path " english_text.txt " --language " eng " --romanize
# Align a Russian audio file with romanized text
ctc-forced-aligner --audio_path " russian_audio.wav " --text_path " russian_text.txt " --language " rus " --romanize
# Align on a sentence level
ctc-forced-aligner --audio_path " audio.wav " --text_path " text.txt " --language " eng " --split_size " sentence " --romanize
# Align using a model with native vocabulary
ctc-forced-aligner --audio_path " audio.wav " --text_path " text.txt " --language " ara " --alignment_model " jonatasgrosman/wav2vec2-large-xlsr-53-arabic "
import torch
from ctc_forced_aligner import (
load_audio ,
load_alignment_model ,
generate_emissions ,
preprocess_text ,
get_alignments ,
get_spans ,
postprocess_results ,
)
audio_path = "your/audio/path"
text_path = "your/text/path"
language = "iso" # ISO-639-3 Language code
device = "cuda" if torch . cuda . is_available () else "cpu"
batch_size = 16
alignment_model , alignment_tokenizer = load_alignment_model (
device ,
dtype = torch . float16 if device == "cuda" else torch . float32 ,
)
audio_waveform = load_audio ( audio_path , alignment_model . dtype , alignment_model . device )
with open ( text_path , "r" ) as f :
lines = f . readlines ()
text = "" . join ( line for line in lines ). replace ( " n " , " " ). strip ()
emissions , stride = generate_emissions (
alignment_model , audio_waveform , batch_size = batch_size
)
tokens_starred , text_starred = preprocess_text (
text ,
romanize = True ,
language = language ,
)
segments , scores , blank_token = get_alignments (
emissions ,
tokens_starred ,
alignment_tokenizer ,
)
spans = get_spans ( tokens_starred , segments , blank_token )
word_timestamps = postprocess_results ( text_starred , spans , stride , scores )
정렬 결과는 JSON 형식의 다음 정보가 포함된 파일에 저장됩니다.
text
: 정렬된 텍스트입니다.segments
: 각각 해당 텍스트 세그먼트의 시작 및 종료 시간을 포함하는 세그먼트 목록입니다.{
"text" : " This is a sample text to be aligned with the audio. " ,
"segments" : [
{
"start" : 0.000 ,
"end" : 1.234 ,
"text" : " This "
},
{
"start" : 1.234 ,
"end" : 2.567 ,
"text" : " is "
},
{
"start" : 2.567 ,
"end" : 3.890 ,
"text" : " a "
},
{
"start" : 3.890 ,
"end" : 5.213 ,
"text" : " sample "
},
{
"start" : 5.213 ,
"end" : 6.536 ,
"text" : " text "
},
{
"start" : 6.536 ,
"end" : 7.859 ,
"text" : " to "
},
{
"start" : 7.859 ,
"end" : 9.182 ,
"text" : " be "
},
{
"start" : 9.182 ,
"end" : 10.405 ,
"text" : " aligned "
},
{
"start" : 10.405 ,
"end" : 11.728 ,
"text" : " with "
},
{
"start" : 11.728 ,
"end" : 13.051 ,
"text" : " the "
},
{
"start" : 13.051 ,
"end" : 14.374 ,
"text" : " audio. "
}
]
}
기여를 환영합니다! 자유롭게 문제를 열거나 풀 요청을 제출해 주세요.
본 프로젝트는 BSD 라이선스를 따르며, 기본 모델에는 CC-BY-NC 4.0 라이선스가 적용되어 있으니 상업적 이용시 반드시 다른 모델을 사용하시기 바랍니다.
이 프로젝트는 FAIR MMS 팀의 작업을 기반으로 합니다.