我正在使用Raspberry Pi上的语音界面制作智能镜像。有两个单独的脚本,一个用于语音控制,另一个用于GUI。我正试图在RPi启动时启动它们。问题是只有GUI脚本启动。我可以从终端手动运行SR脚本,但我无法自动启动它。到目前为止,我已经尝试过:
- 使用crontab启动
- 使用rc.local
启动- 使用OS.SYSTEM
启动另一个脚本- 使用POPEN从另一个脚本启动一个脚本
- 使用bash脚本启动另一个脚本
- 使用bash脚本启动时启动
- 仅在加载LXDE后启动
- 启动一个单独的脚本来启动它们
每个场景只会将脚本发送到无限错误循环中。 以下是简化代码:
#!/usr/bin/env python
from os import environ, path, system
import pyaudio
import time
import sys
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/MERLINv3.lm'))
config.set_string('-dict', path.join(MODELDIR, 'MERLIN/MERLINv3.dic'))
config.set_string('-logfn', '/dev/null')
decoder = Decoder(config)
def getKWord():
try:
stream.start_stream()
in_speech_bf = False
decoder.start_utt()
while True:
buf = stream.read(4096)
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()
stream.stop_stream()
#system('mpg321 /home/pi/MERLIN_main/process_sounds/Beep_low.mp3')
return str(decoder.hyp().hypstr)
system('mpg321 /home/pi/MERLIN_main/process_sounds/Beep_low.mp3')
else:
decoder.end_utt()
stream.stop_stream()
print('PocketSphinx could not decode')
return "Pocketsphinx could not decode. Try again"
decoder.end_utt()
except:
print('PocketSphinx had an error')
return "Oops. Pocketsphinx had an error"
p = pyaudio.PyAudio()
stream = p.open(format=pyaudio.paInt16, channels=1, rate=16000, input=True, frames_per_buffer=4096)
try:
print ("say something")
while True:
kword=getKWord()
system('mpg321 /home/pi/MERLIN_main/process_sounds/Beep_hi.mp3')
# do stuff
time.sleep(.1)
except KeyboardInterrupt:
sys.exit()
错误在getKWord()中,并且是[Errno -9988] Stream Closed
循环只是一遍又一遍地吐出来。 我知道这不是一个代码问题,因为它在我使用Terminal启动它的时候几天没有问题。我只是无法让它在启动时启动。 到目前为止没有任何工作。提前感谢您的建议。