Можно ли использовать один и тот же декодер в Pocketsphinx для нескольких файлов?

Можно ли использовать один и тот же декодер для нескольких файлов 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).


person user6003782    schedule 05.08.2016    source источник


Ответы (1)


Можно ли использовать один и тот же декодер для нескольких файлов wav в Pocketsphinx (Python)?

Да

У меня есть следующий фрагмент кода, очень стандартный, за исключением того, что я дважды вызываю декодер для одного и того же файла. Однако результаты не одинаковы.

Вам нужно вызвать decoder.start_stream() для второго файла, чтобы сбросить тайминги декодера.

Я также дважды пытался использовать декодер для разных файлов, и результаты различаются в зависимости от порядка, в котором я вызываю файлы - первый файл декодируется правильно, а второй файл декодируется неправильно. Кроме того, это происходит только в том случае, если есть некоторый вывод из первого файла - если в первом файле нет слов, то второй файл декодируется нормально.

Ну, могут быть разные вещи, которые влияют на результат. Без примера сложно сказать. Вам лучше предоставить образцы файлов и проблемный вывод, чтобы получить ответ на этот вопрос.

person Nikolay Shmyrev    schedule 05.08.2016
comment
Привет, я не смогу ответить на это до понедельника, потому что мои файлы на работе, но я просто хотел поблагодарить вас за такой быстрый ответ! - person user6003782; 06.08.2016
comment
Я отредактировал родительский пост, включив файлы примеров и вывод! Позвольте мне знать, если вам нужно что-нибудь еще. - person user6003782; 08.08.2016
comment
Я не вижу ничего плохого в логах. Результат может немного отличаться, т.к. декодер хранит внутреннее состояние (значение CMN), его можно увидеть в логах. Третья итерация должна быть такой же, как и вторая. - person Nikolay Shmyrev; 10.08.2016
comment
Спасибо, есть ли способ не сохранять внутреннее состояние/сделать его статичным? - person user6003782; 10.08.2016
comment
Пока нет способа - person Nikolay Shmyrev; 11.08.2016