BrainScript HTKMLF 판독기

경고

HTKMLFReader는 사용되지 않으며 HTK MLF 및 기능 역직렬 변환기( cf. 읽기 권한자 이해 및 확장)로 대체되고 있습니다. 네트워크에 대해 사용하세요.

HTKMLFReader는 일반적으로 음성 인식 작업, 특히 HTK(Hidden Markov Model Toolkit) 도구 모음과 관련된 파일을 읽는 데이터 판독기입니다. 판독기는 HTK 구문에서 파일("스크립트" 파일), 파일("모델 레이블 파일")로 알려진 레이블 파일 및 보관 파일로 scp 알려진 기능 파일의 목록인 두 가지 유형의 파일을 입력으로 mlf 사용할 수 있습니다.

HTKMLFReader는 데이터 세트의 HTK 정의 형식을 사용하므로 HTK Book과 같은 HTK 기본 사항을 숙지하는 것이 좋습니다.

CNTK 여러 입력 및 출력이 있는 네트워크를 포함하여 임의 토폴로지로 네트워크를 빌드하는 데 사용할 수 있으므로 HTKMLFReader는 하나 이상의 파일과 MLF 파일을 처리할 scp 수 있습니다. HTKMLFReader의 일반적인 사용 예는 다음과 같습니다.

    reader = [
        readerType = "HTKMLFReader"
        readMethod = "blockRandomize"
        miniBatchMode = "partial"
        randomize = "17280000"
        features = [
            dim = 792
            scpFile = "$ScpDir$\TIMIT.train.scp.fbank.fullpath"
        ]
        labels = [
            mlfFile = "$MlfDir$\TIMIT.train.align_cistate.mlf.cntk"
            labelDim = 183
            labelMappingFile = "$MlfDir$\TIMIT.statelist"
        ]
    ]

HTKMLFReader에는 다음과 같은 구성 매개 변수가 있습니다.

  • readMethod: 네트워크 학습 중에 처리를 위해 기능 파일을 메모리로 읽는 데 사용되는 메서드입니다. blockRandomize 설정 readMethod 하면 데이터를 큰 블록으로 나눈 다음 블록의 순서와 블록 내의 데이터 순서를 임의로 지정합니다. 각 블록의 데이터는 기능 파일에서 직접 읽고 더 이상 사용되지 않을 때 RAM에서 해제됩니다. 이 blockRandomize 옵션에는 아래에 설명된 보관 파일이 필요합니다. 또한 아래에 설명된 대로 읽기 메서드와 함께 frameMode = "false"blockRandomize 사용하면 프레임이 아닌 발화에 대해 임의로 적용됩니다. 이는 학습 예제의 순차적 특성을 유지하는 것이 필요한 경우 되풀이 아키텍처와 함께 사용하는 데 적합합니다. 대안은 rollingWindow 모든 기능 파일을 읽고 하나의 큰 임시 이진 파일에 디스크에 저장하는 것입니다. 그런 다음 이 파일의 데이터에 대해 큰 롤링 창을 실행하고 창 내의 데이터를 임의로 지정하여 데이터를 임의로 지정합니다. 이 메서드는 보관 파일을 사용할 수 없는 경우에만 사용해야 하며 프레임 모드에서만 작동합니다. 기본 메서드는 .입니다 blockRandomize.

  • pageFilePath: 기능의 임시 페이지 파일을 저장할 위치를 지정합니다. 기본적으로 시스템 제공 임시 파일을 사용합니다.

  • randomize: 임의화 창 크기를 지정합니다. CNTK 샘플링할 데이터에 대해 이 크기의 롤링 창을 사용합니다. 이 롤링 창 내의 샘플만 디스크에서 로드되고 필요한 경우에만 RAM에 보관됩니다. 프로덕션 크기 음성 모음에 권장되는 설정은 48시간입니다. 즉, 지정합니다 17280000. 매개 변수는 randomize 두 가지 특수 값 auto 또는 none.을 이해합니다. none 는 임의화를 완전히 사용하지 않도록 설정하며, 출력 데이터를 평가하거나 쓰는 데 유용합니다. auto 는 전체 모음을 RAM으로 읽습니다. 이는 일반적으로 수천 시간의 음성으로 구성된 프로덕션 크기 데이터 집합에 적합하지 않거나 바람직하지 않습니다.

  • minibatchMode: partial 또는 full이 옵션은 요청된 크기의 전체 미니배치를 구성할 프레임이 충분하지 않은 경우 마지막 미니배치를 처리하는 방법을 결정합니다. 기본값은 partial학습 Epoch의 더 작은 최종 미니배치에서 나머지 프레임을 사용하는 것입니다. 이 full 옵션은 전체 미니바치만 처리합니다.

위의 예제에는 판독기에서 처리 중인 두 가지 데이터 원본, HTK 기능 파일 목록 형식의 기능 및 HTK MLF 파일 형식의 레이블이 있습니다. 기능과 레이블은 모두 계산 네트워크의 노드(이 경우 각각 입력 및 출력 노드)에 해당합니다. featureslabels SimpleNetworkBuilder에서 사용하는 기본 이름이지만 네트워크가 NDL(네트워크 설명 언어)을 사용하여 디자인된 경우 각각 네트워크에 해당 노드가 있는 한 모든 이름을 사용할 수 있습니다.

연속 값 기능(예: MFCC 또는 log mel filterbank 계수)을 지정하려면 구성 블록에 다음 매개 변수를 포함해야 합니다.

  • scpFile: 처리할 파일 목록입니다. 파일은 HTK 호환 파일이어야 하며 표준 형식 또는 "보관" 형식으로 지정할 수 있습니다. 아카이브 사용에 대한 자세한 내용은 아래에 설명되어 있습니다.

  • dim: 원하는 컨텍스트 창을 사용하여 전체 기능 벡터 차원을 지정하는 정수입니다. 예를 들어 72차원 기능(24차원 필터뱅크 기능과 델타 및 델타-델타 계수)이 있고 네트워크가 11프레임을 컨텍스트 창으로 처리하도록 설계된 경우 지정된 차원은 792여야 합니다. 대칭 컨텍스트 창만 지원됩니다.

해당 레이블(예: 음소 또는 senone 레이블)을 지정하려면 다음 매개 변수를 지정하는 구성 블록을 사용해야 합니다.

  • mlfFile: 파일에 지정된 scp 모든 발화의 레이블을 포함하는 HTK 스타일 mlf 파일입니다.

  • labelDim: 레이블 집합의 총 카디널리티입니다.

  • labelMappingFile: 파일에 표시된 모든 레이블을 한 줄당 하나씩 나열하는 파일의 mlf 경로입니다.

파일에 나열 scp 된 파일에서 읽은 기능이나 파일에서 읽은 레이블에 대해 추가 판독기 블록을 사용하여 여러 입력 및 출력을 지정할 수 있습니다 mlf . 예를 들어 네트워크에서 화자 ID와 senone 레이블을 모두 예측하는 다중 작업 학습 시나리오에서 사용자는 화자 ID에 해당하는 레이블이 포함된 파일을 포함하는 mlf 추가 블록을 지정합니다. 마찬가지로 MFCC 및 PLP 기능과 같이 여러 입력이 있는 네트워크의 경우 추가 기능 블록이 사용됩니다.

RNN 또는 LSTM과 같은 되풀이 구조의 경우 HTKMLFReader에 추가 구성 옵션이 있습니다.

  • frameMode: true 또는 false판독기가 프레임 수준 또는 발화 수준에서 데이터를 임의로 지정해야 하는지 여부입니다. true 설정 frameMode 은 기본값이며 임시 연결 없이 네트워크를 학습하는 데 적합합니다. 순차 정보를 학습하도록 설계된 네트워크의 경우(예: RNN)로 설정false해야 합니다. 즉, frameMode 발화가 임의로 지정되지만 발화 내에서 적절한 시퀀스가 유지됩니다. 읽기 메서드에서 blockRandomize 만 작동합니다.

  • nbruttsineachrecurrentiter: 되풀이 구조가 있는 네트워크의 효율적인 학습을 위해 함께 처리할 발화 수를 지정합니다. 기본값은 120에서 30 미만의 값이면 GPU의 효율성이 크게 저하됩니다.

  • truncated: true 또는 false입니다. 이렇게 하면 잘린 BPTT를 사용할 수 있습니다.

HTK에서 사용되는 표준 scp 및 파일과 mlf CNTK 사용되는 파일 간에는 몇 가지 작은 차이점이 있다는 점에 유의해야 합니다.

특히 파일에는 mlf 분류에 사용되는 실제 기호가 포함되어야 합니다. 연속 음성 인식의 경우 이는 일반적으로 senones(physicalHMMstates)에 해당하는 레이블을 의미합니다. 그러나 HVite는 일반적으로 논리적 HMM 상태 이름만 포함하는 강제 맞춤 중에 생성 mlf 됩니다. 따라서 이를 CNTK mlf 사용 mlf 하려면 논리적 상태 이름을 해당 senone 레이블로 바꾸기 위해 사후 처리해야 합니다. 또는 HVite를 수정하여 senone 레이블을 직접 작성해야 합니다.

HTKMLFReader에서 처리되는 파일은 scp 두 가지 종류 중 하나일 수 있습니다. 즉, 각 줄이 실제 기능 파일에 해당하는 표준 형식 또는 각 줄에 논리적 이름이 포함되고 시작 및 끝 프레임으로 정의된 더 큰 물리적 파일의 세그먼트를 참조하는 별칭 형식 중 하나일 수 있습니다. 논리적 이름은 파일에서 mlf 해당 레이블을 식별하는 데 사용됩니다. 파일이 개별적으로 저장되더라도 첫 번째 경우와 같이 별칭이 지정된 형식은 파일 자체를 열지 않고도 파일의 시작 및 끝 프레임 scp 에 대한 정보를 사용하여 발화 길이를 결정하기 때문에 항상 읽기 메서드와 함께 blockRandomize 사용해야 합니다. 이 경우 시작 프레임은 0이어야 하고 끝 프레임은 발화 길이에서 1을 뺀 값과 같아야 합니다. 또한 여러 입력 및/또는 출력의 경우 모든 scp 파일과 mlf 파일에 논리적 이름이 공통적으로 있도록 별칭이 지정된 형식도 사용해야 합니다. rollingWindow 대신 읽기 메서드를 사용하는 blockRandomize경우 시작 및 끝 프레임 정보를 생략할 수 있습니다.

다음은 2개의 기능 입력(이 경우 MFCC 및 PLP 기능) 및 mlf 음소 상태에 해당하는 1개의 출력이 있는 네트워크에 적합한 TIMIT 모음에 대한 예제 코드 조각 scp 및 파일입니다.

이 파일에는 scp 다음 구문을 사용하여 처리할 모든 파일이 나열됩니다.

id=pathname

이 형식의 CNTK 전용 확장(원래 HTK에서 찾을 수 없음)은 파일이 기능 옆에 있을 때 scp CNTK 보다 편리한 상대 경로 이름 구문을 허용한다는 것입니다.

id=.../filename

여기서 ... 파일의 디렉터리를 참조합니다 scp .

MFCC 기능에 대한 파일에는 scp 다음과 같은 항목이 포함되어 있습니다.

train-dr1-fcjf0-si1027.mfc=//hostname/data/TIMIT/mfc/train/dr1/fcjf0/train-dr1-fcjf0-si1027.mfc[0,306]

train-dr1-fcjf0-si1657.mfc=//hostname/data/TIMIT/mfc/train/dr1/fcjf0/train-dr1-fcjf0-si1657.mfc[0,281]

train-dr1-fcjf0-si648.mfc=//hostname/data/TIMIT/mfc/train/dr1/fcjf0/train-dr1-fcjf0-si648.mfc[0,359]

scp PLP 기능에 대한 파일은 비슷하지만 다른 물리적 파일을 가리킵니다. 두 scp 파일의 논리적 루트 이름은 동일합니다.

train-dr1-fcjf0-si1027.plp=//hostname/data/TIMIT/plp/train/dr1/fcjf0/train-dr1-fcjf0-si1027. plp[0,306]

train-dr1-fcjf0-si1657.plp=//hostname/data/TIMIT/plp/train/dr1/fcjf0/train-dr1-fcjf0-si1657. plp[0,281]

train-dr1-fcjf0-si648.plp=//hostname/data/TIMIT/plp/train/dr1/fcjf0/train-dr1-fcjf0-si648.plp [0,359]

파일은 mlf 다음 구문을 사용하여 레이블을 나열합니다.

#!MLF!#
"id"
labelBegin1 labelEnd1 label1
labelBegin2 labelEnd2 label1

...

.
"id"
labelBegin1 labelEnd1 label1
labelBegin2 labelEnd2 label1

...

.

...

여기서는 각 입력 파일당 (점)으로 . 종료된 섹션과 각 섹션 내의 토큰당 한 줄이 있습니다. 레이블 시간은 시간 기반 10e-7에 지정되고 음성 프레임은 일반적으로 10e-2있으므로 인덱스에 매번 0을 추가하려면 5개의 0 이 필요합니다.

CNTK 파일의 한 섹션 내에서 처음 세 개의 열*만 읽고 나머지는 무시한다는 것을 유의 mlp 해야 합니다. 예제 mlf 파일에서도 논리 이름을 'scp'' 파일과 공유합니다. 코드 조각은 다음과 같습니다.

#!MLF!#
"train-dr1-fcjf0-si1027.rec"
0 200000 h#_s2 -136.655975 h# -589.680481 h#
200000 400000 h#_s3 -145.780716
400000 800000 h#_s4 -307.243774
800000 1200000 q_s2 -349.529327 q -897.429504 q
1200000 1500000 q_s3 -280.568817
1500000 1800000 q_s4 -267.331390
1800000 1900000 iy_s2 -76.825096 iy -673.892883 iy
1900000 2400000 iy_s3 -305.832458
2400000 2800000 iy_s4 -291.235352

이제 파일 이라고 chunk 도 하는 보관 파일에 대해 설명합니다. CNTK 모든 독자에게 청크 개념을 사용하며, 이는 절대적으로 다른 것을 의미하므로 혼동을 피하기 위해 아래에 설명된 파일과 관련하여 청크라는 용어를 사용하지 않고보관 파일이라고 부릅니다.

보관 파일은 기본적으로 샘플 크기와 샘플 수를 포함하는 12 바이트 헤더가 있는 열 주 행렬 float32입니다. 일반적으로 특히 시작으로 사용하기가 더 쉽습니다. 파일의 예상 헤더는 아래를 통해 정의됩니다 struct .

struct fileheader
{
    int nsamples;
    int sampperiod;
    short sampsize;
    short sampkind;
}

여기서

  • sampsize는 벡터의 크기(바이트)입니다.=4 * feature dimension
  • sampkind 는 기능 유형(MFCC, PLP 등)의 숫자 식별자입니다. CNTK 무시합니다. HTK에서 파일을 만들지 않은 경우 이 값을 9(USER)로 설정할 수 있습니다. and
  • sampperiod이어야 100000 합니다(CNTK 오류 메시지의 경우를 제외하고 대부분 이 값을 무시함).

마지막으로, 대부분의 음성 인식 애플리케이션에서 연속 값 기능은 입력으로 사용되고 불연속 범주 레이블은 출력으로 사용된다는 점에 유의해야 합니다. 그러나 HTKMLFReader는 데이터를 노드 이름과 연결하기만 하고 이 데이터가 사용되는 방식에는 독립적입니다. 예를 들어 mlf 적절한 화자 ID 레이블 파일을 사용하여 화자 ID 기능의 원 핫 벡터를 네트워크에 대한 입력으로 생성할 수 있습니다.