我一直在尝试使用pocketsphinx进行语音识别,但我总是遇到一个奇怪的错误。我的代码如下
#!/usr/bin/env python
from os import environ, path
import pyaudio
from pocketsphinx.pocketsphinx import *
from sphinxbase.sphinxbase import *
MODELDIR = "pocketsphinx/model"
DATADIR = "pocketsphinx/test/data"
# Create a decoder with certain model
config = Decoder.default_config()
config.set_string('-hmm', path.join(MODELDIR, 'en-us/en-us'))
config.set_string('-lm', path.join(MODELDIR, 'MERLIN/MERLINv1.lm'))
config.set_string('-dict', path.join(MODELDIR, 'MERLIN/MERLINv1.dic'))
decoder = Decoder(config)
p = pyaudio.PyAudio()
stream = p.open(format=pyaudio.paInt16, channels=1, rate=16000, input=True, frames_per_buffer=256)
stream.start_stream()
in_speech_bf = False
decoder.start_utt()
try:
while True:
buf = stream.read(256)
if buf:
decoder.process_raw(buf, False, False)
if decoder.get_in_speech() != in_speech_bf:
in_speech_bf = decoder.get_in_speech()
if not in_speech_bf:
decoder.end_utt()
print 'Result:', decoder.hyp().hypstr
decoder.start_utt()
else:
break
decoder.end_utt()
except:
print'Exception caught! Handeling...'
当我运行代码时,它应该等我说话,然后打印我认为我说的话,等到我再说话。 实际上,它会等待,打印,然后抛出错误并退出。
Result: DISPLAY CLOCK
Traceback (most recent call last):
File "SR_test.py", line 26, in <module>
buf = stream.read(256)
File "/usr/lib/python2.7/dist-packages/pyaudio.py", line 608, in read
return pa.read_stream(self._stream, num_frames, exception_on_overflow)
IOError: [Errno -9981] Input overflowed
我看了这个错误,建议是增加或减少块大小。我已经将块更改为256-2048无效。有谁知道如何解决这个问题?先感谢您。
顺便说一下,由于代码一直运行直到出错,我还试图用try-except子句欺骗它忽略错误。不幸的是,它只是打印我的声明并退出。
答案 0 :(得分:1)
它无法实时处理音频,因为你的CPU太慢,就像你试图在具有大量词汇量的覆盆子pi上运行一样。
您可以在pocketsphinx日志输出中看到确切的实时数字。
您需要获得更快的CPU,或者您也可以尝试优化解码器配置/词汇表,如tutorial to decoder tuning
中所述