Можно ли использовать один и тот же декодер для нескольких файлов wav в Pocketsphinx (Python)? У меня есть следующий фрагмент кода, очень стандартный, за исключением того, что я дважды вызываю декодер для одного и того же файла. Однако результаты не одинаковы. Я также дважды пытался использовать декодер для разных файлов, и результаты различаются в зависимости от порядка, в котором я вызываю файлы - первый файл декодируется правильно, а второй файл декодируется неправильно. Кроме того, это происходит только в том случае, если есть некоторый вывод из первого файла - если в первом файле нет слов, то второй файл декодируется нормально. Это заставляет меня поверить, что декодер каким-то образом модифицируется после декодирования одного файла. Я прав в этом? Есть ли способ сбросить декодер или вообще заставить его работать для нескольких файлов? Кажется, здесь следует привести пример: https://github.com/cmusphinx/pocketsphinx/blob/master/swig/python/test/decoder_test.py.
config = ps.Decoder.default_config()
config.set_string('-hmm', os.path.join(MODELDIR, 'en-US/acoustic-model'))
config.set_string('-lm', os.path.join(MODELDIR, 'en-US/language-model.lm.bin'))
config.set_string('-dict', os.path.join(MODELDIR, 'en-US/pronounciation-dictionary.dict'))
config.set_string('-logfn', 'pocketsphinxlog')
decoder = ps.Decoder(config)
wavname16_1 = os.path.join(DATADIR, 'arctic_a0001.wav')
# Decode streaming data.
decoder.start_utt()
stream = open(wavname16_1, 'rb')
while True:
buf = stream.read(1024)
if buf:
decoder.process_raw(buf, False, False)
else:
break
decoder.end_utt()
stream.close()
words = [(seg.word, seg.prob) for seg in decoder.seg()]
print words
wavname16_2 = os.path.join(DATADIR, 'arctic_a0002.wav')
decoder.start_utt()
stream = open(wavname16_2, 'rb')
while True:
buf = stream.read(1024)
if buf:
decoder.process_raw(buf, False, False)
else:
break
decoder.end_utt()
stream.close()
words = [(seg.word, seg.prob) for seg in decoder.seg()]
print "arctic2: " + words
РЕДАКТИРОВАТЬ. Дополнительная информация:
Если arctic_a0001.wav http://festvox.org/cmu_arctic/cmu_arctic/cmu_us_bdl_arctic/wav/arctic_a0001.wav, arctic_a0002.wav — это http://festvox.org/cmu_arctic/cmu_arctic/cmu_us_bdl_arctic/wav/arctic_a0002.wav, а словарь представляет собой одну строку:
of AH V
тогда текущий выход:
arctic1: [('<s>', 1), ('of', 1), ('of', -12001), ('<sil>', 0), ('of', -16211), ('<sil>', -1205), ('of', -13991), ('of', 0), ('<sil>', 0), ('of', -31232), ('</s>', 0)]
arctic2: [('<s>', -3), ('[SPEECH]', -725), ('<sil>', -1), ('[SPEECH]', -6), ('<sil>', -20), ('of', -6162), ('[SPEECH]', -397), ('</s>', 0)]
но если мы их переключим, вывод станет
arctic2: [('<s>', 0), ('of', 0), ('<sil>', 0), ('of', -29945), ('<sil>', -20), ('of', -26004), ('of', 0), ('of', 0), ('<sil>', 0), ('of', -84868), ('of', -35690), ('</s>', 0)]
arctic1: [('<s>', -3), ('of', -14886), ('of', -30237), ('<sil>', 0), ('of', -22103), ('of', 1), ('<sil>', 0), ('of', -30795), ('of', -65040), ('</s>', 0)]
поэтому выходы arctic1 и arctic2 зависят от порядка. Кроме того, если мы используем arctic1 дважды, результат будет
[('<s>', 1), ('of', 1), ('of', -12001), ('<sil>', 0), ('of', -16211), ('<sil>', -1205), ('of', -13991), ('of', 0), ('<sil>', 0), ('of', -31232), ('</s>', 0)]
[('<s>', 1), ('of', -24424), ('of', -24554), ('<sil>', 2), ('[SPEECH]', -37257), ('of', -37008), ('<sil>', -461), ('of', -20422), ('of', 0), ('<sil>', 0), ('of', -3570), ('[SPEECH]', -42), ('</s>', 0)]
Может быть, проблема в том, что я не использую start_stream()? Я не уверен, как мне его использовать. Даже если я использую decoder.start_stream() (непосредственно перед decoder.start_utt()), вывод будет другим — он станет
[('<s>', 1), ('of', 1), ('of', -12001), ('<sil>', 0), ('of', -16211), ('<sil>', -1205), ('of', -13991), ('of', 0), ('<sil>', 0), ('of', -31232), ('</s>', 0)]
[('<s>', -2), ('of', -33113), ('of', -29715), ('<sil>', 1), ('[SPEECH]', -37258), ('of', -37009), ('<sil>', -461), ('of', -20422), ('of', 0), ('<sil>', 0), ('of', -3570), ('[SPEECH]', -42), ('</s>', 0)]
Если вам нужен весь журнал, здесь (http://pastebin.com/2dNeyS1x) находится журнал для arctic1 до arctic2, а здесь (http://pastebin.com/Nkvj2G0g) журнал arctic2 до arctic1, а здесь это журнал для arctic1 два раза подряд с start_stream (http://pastebin.com/HWq6j7X2), и вот лог для arctic1 два раза подряд без start_stream (http://pastebin.com/MsadW4nh).