一 .使用CMUSphinx训练声学模型
CMUSphinx工具包中自带好几个高质量的声学模型。美语模型,法语,中文模型。这些模型是经过优化的,为了得到最佳的性能,大多数指令交互系统能直接用这些模型,甚至一些大词汇量的应用也能直接用他们。
除此之外,CMUSphinx提供了功能,能适应现存的模型,为了满足有些需要更高精度的需求。当你需要使用不同的录音环境,(比如近距离,远离麦克分或者通过通话过程中),这些情况下做适应结果都是不错的,或者当需要转换一种口音,比如美语和英语的转换,印度英语的使用等。自适应能满足这样的要求:那就是你需要在很短的时间内,支持一门新的语言,那么你只需要基于词典做出一个声学模型音素集到目标音素集的转换就可。
然而,在某些时候,当下的模型并没法用。比如手写识别中,或者其他语言的监测中。这些情况下,你需要重新训练你自己的声学模型。如下教程会指导你如何开始训练。
二 开始训练
训练之前,假设你有充足的数据:
- 用于单个人的指令应用,至少需要一小时录音,
- 用于很多人指令应用,需要200个录音人,每人5小时
- 用于单个人的听写,需要10小时他的录音
- 用于多个人的听写,需要200个说话人,每人50小时的录音
- 同时你要有这门语言的语音学知识,以及你有足够的比如一个月的时间,来训练模型
而如果你没有足够的数据,足够的时间,足够的经验,那么建议你还是做已有模型的自适应来满足你的要求。
数据准备
训练者需要知道,使用哪一个声音单元来学习参数,至少每个序列都要在你的训练集中出现。这个信息储存在transcript file中。
然后通过词典dictionary,其中对于每个单词都有相应的声音序列做了映射。
所以,除了语音数据,你还需要一个transcripts,和两个词典。一个中是每个单词到发音的对应表,以及一个中是不发音的单元的表,记为filler dictionay.
训练开始
训练之前需要准备如下两个目录
- etc
- your_db.dic - Phonetic dictionary
- your_db.phone - Phoneset file
- your_db.lm.DMP - Language model -语言模型
- your_db.filler - List of fillers
- your_db_train.fileids - List of files for training
- your_db_train.transcription - Transcription for training
- your_db_test.fileids - List of files for testing
- your_db_test.transcription - Transcription for testing
- wav
- speaker_1
- file_1.wav - Recording of speech utterance
- speaker_2
- file_2.wav
- speaker_1
Fileids (your_db_train.fileids and your_db_test.fileids中列出了语音数据的文件名。如果是多个人的录音,可以加上录音人的信息,注意文件名不要加上后缀。
speaker_1/file_1 speaker_2/file_2
Transcription file (your_db_train.transcription and your_db_test.transcription) 中列出了你的录音文本。句子前后加上<s>标签,末尾加上句子序号。
<s> hello world </s> (file_1) <s> foo bar </s> (file_2)
注意transcript中的行的序号和fileids中的序号要一致,如下,第二个句子放在第一位,就是个错误例子,会报错。
speaker_2/file_2 speaker_1/file_1 //Error! Do not create fileids file like this!录音文件,比如是MS WAV格式,采样率为16khz,16bit,mono单声道的录音用于桌面应用。8khz,16bit,mono录音用于电话应用。 注意这点,错误的语音格式,常常是错误的原因。
Speech recordings (wav files) Recording files must be in MS WAV format with specific sample rate - 16 kHz, 16 bit, mono for desktop application, 8kHz, 16bit, mono for telephone applications. Double-check that, wrong audio file format is the most common source of training issues. Audio files shouldn‘t be very long and shouldn‘t be very short. Optimal length is not less than 5 seconds and not more than 30 seconds. Amount of silence in the beginning of the utterance and in the end of the utterance should not exceed 0.2 second.
It‘s critical to have audio files in a specific format. Sphinxtrain does support some variety of sample rates but by default it‘s configured to train from 16khz 16bit mono files in MS WAV format. YOU NEED TO MAKE SURE THAT YOU RECORDINGS ARE AT A SAMPLING RATE OF 16 KHZ (or 8 kHz if you train a telephone model) IN MONO WITH SINGLE CHANNEL.
If you train from 8khz model you need to make sure you configured feature extraction properly.
Please note that you CAN NOT UPSAMPLE your audio, that means you can not train 16 khz model with 8khz data.
Audio format mismatch is the most common training problem.
Phonetic Dictionary (your_db.dict) should have one line per word with word following the phonetic transcription
HELLO HH AH L OW WORLD W AO R L D
If you need to find phonetic dictionary, read Wikipedia or a book on phonetics. If you are using existing phonetic dictionary. Do not use case-sensitive variants like “e” and “E”. Instead, all your phones must be different even in case-insensitive variation. Sphinxtrain doesn‘t support some special characters like ‘*‘ or ‘/‘ and supports most of others like “+” or “-” or “:” But to be safe we recommend you to use alphanumeric-only phone-set.
Replace special characters in the phone-set, like colons or dashes or tildes, with something alphanumeric. For example, replace “a~” with “aa” to make it alphanumeric only. Nowadays, even cell phones have gigabytes of memory on board. There is no sense in trying to save space with cryptic special characters.
There is one very important thing here. For a large vocabulary database, phonetic representation is more or less known; it‘s simple phones described in any book. If you don‘t have a phonetic book, you can just use the word‘s spelling and it gives very good results:
ONE O N E TWO T W O
For small vocabulary CMUSphinx is different from other toolkits. It‘s often recommended to train word-based models for small vocabulary databases like digits. But it only makes sense if your HMMs could have variable length. CMUSphinx does not support word models. Instead, you need to use a word-dependent phone dictionary:
ONE W_ONE AH_ONE N_ONE TWO T_TWO UH_TWO NINE N_NINE AY_NINE N_END_NINE
This is actually equivalent to word-based models and some times even gives better accuracy. Do not use word-based models with CMUSphinx.
Phoneset file (your_db.phone) should have one phone per line. The number of phones should match the phones used in the dictionary plus the special SIL phone for silence:
AH AX DH IX