HTK3.4程序员手册(1.1)--HTK中的wav文件格式
by 云龙
1.1.1 HTK中的Wav文件格式
HTK3.4支持wav文件格式称为HTK格式。头部为HTKhdr结构,占12个字节。无头的wav文件。默认16000Hz,单声道(mono),16位。Motorola PCM(MSB,LSB)格式。平时通过Cool Edit录制的语音是wav带文件头的Intel PCM(LSB,MSB)格式。
Wav文件格式有两种,Motorola PCM(MSB,LSB)格式和Intel PCM(LSB,MSB)格式。Motorola PCM(MSB,LSB)格式是采用Big Endian方式存储。Intel PCM(LSB,MSB)格式是采用Little Endian的方式存储。那么如何将Intel PCM(LSB,MSB)的Little Endian转换为Big Endian格式呢?
//将Intel PCM(LSB,MSB)的Little Endian转换为Big Endian格式
int ConvertIntelPCMtoMotorolaPCM(int Src,int *Dst){
int Low8 = (Src&0xFF)<<8;
int High8 = (Src&0xFF00)>>8;
int New16 = Low8 | High8 ;
*Dst = New16;
return 1;
}
HTK3.4支持的wav文件格式(无头的wav文件。默认16000Hz,单声道(mono),16位。Motorola PCM(MSB,LSB)格式)又是怎么样的呢?
HTK3.4中的HTK Header结构:
typedef struct { /* HTK File Header */
int32 nSamples; //4字节,语音样本数。一个样本16byte。
int32 sampPeriod; //4字节,一个样本持续的时间(百ns)。/* Sample period in 100ns units */
short sampSize; //2字节,一个语音样本占的字节数。16byte=2字节
short sampKind; //2字节,种类。这里=0
} HTKhdr;
注意:HTK中写到文件的时候要把字节位置颠倒。比如nSamples的1-4字节写为4-1位置。
HTK3.4中读取HTKhdr的函数:
/* EXPORT ReadHTKHeader: get header from HTK file, return false not HTK */
Boolean ReadHTKHeader(FILE *f, long *nSamp, long *sampP, short *sampS,
short *kind, Boolean *bSwap)
{
HTKhdr hdr;
int n = sizeof hdr; //n=12
if (fread(&hdr, 1, n, f) != n)
return FALSE;
if (!natReadOrder && vaxOrder){
*bSwap = TRUE;
}else{
*bSwap=MustSwap(UNKNOWNSO);
}
if (*bSwap){
SwapInt32(&hdr.nSamples); //将颠倒的byte倒回来,下同