我是Python新手,正在编写一个简单的代码,在其中使用语音识别,每当我调用代码时都会得到语音响应。然而,python并没有结束它的运行。如何让python文件永远运行?我尝试使用 launchctl、while 循环和 nohup。但没有任何作用...我希望它像nodemon服务器一样运行,只有当我想发出命令来停止它时它才会停止。这是我的代码...
engine = p.init()
voices = engine.getProperty('voices')
engine.setProperty('voice', voices[1].id)
r = sr.Recognizer()
with sr.Microphone() as source:
text = r.listen(source)
try:
recognized_text = r.recognize_google(text)
print(recognized_text)
if recognized_text == '':
print('Do nothing')
elif recognized_text == 'Hello'
engine.say("Hi there!")
engine.runAndWait()
else:
print('Did not work: ' + recognized_text)
engine.say('Cannot understand you')
except sr.UnknownValueError as e:
print("Boss not speaking")
except sr.RequestError as e:
print("request error")
首先,您可以采取一些措施来改进此代码。例如,您的
else:
和 sr.UnknownValueError
执行相同的操作,因此不需要两者都使用。我建议摆脱else:
。其次,在 except 语句末尾不需要 as e
,因为你从来没有调用过 e
,所以它基本上是无用的。
此外,如果你制作一个名为
speak
的函数或其他同时运行 engine.say(audio)
和 engine.runAndWait()
的函数,那就更好了。
现在是主要问题。如果您希望这段代码永远运行,那么您所需要的只是一个 while 循环。然后,您可以简单地调用
break
来结束 while 循环。
我就是这样做的:
import speech_recognition as sr
import pyttsx3
engine = pyttsx3.init('sapi5')
voices = engine.getProperty('voices')
engine.setProperty('voice', voices[1].id)
rate = engine.getProperty('rate')
engine.setProperty('rate', rate-70)
volume = engine.getProperty('volume')
engine.setProperty('volume', 1)
#A Single Function
def speak(audio):
print(audio)
engine.say(audio)
engine.runAndWait()
i=0
n = 0
while (i<1):
r = sr.Recognizer()
with sr.Microphone() as source:
audio = r.adjust_for_ambient_noise(source)
n=(n+1)
print("Waiting For Voice Input...")
audio = r.listen(source)
# interprete audio (Google Speech Recognition)
try:
s = (r.recognize_google(audio))
message = (s.lower())
if message == '':
print('Do nothing')
elif message == 'hello':
speak("Hi there!")
elif ('goodbye') in message or ('power off') in message or ('bye') in message:
speak("goodbye")
break
# exceptions
except sr.UnknownValueError:
print("Retry")
except sr.RequestError as e:
print("Could not request results$; {0}".format(e))
try:
speak("Sir Bad Signal")
except:
print("Sir Bad Signal")
你真正需要的只是一个永远为真的条件。我将一个名为 i 的变量设置为 0,然后只要 i 小于 1 就运行 while 循环,这始终为 true,因为 i 设置为 0。
要结束代码,每当消息是再见时,我都会使用
break
。或者,您可以将 i 更改为 1,这也可以工作,因为 i 将不再小于 1。
此外,我将用户输入转换为小写。因此,您需要检查消息是否等于小写字符串。例如,
elif message == 'Hello'
不起作用,因为消息是小写的,但 elif message == 'hello'
起作用。
最后,我将麦克风调整为环境噪音,因为这样可以让麦克风更容易理解你在说什么。