如何在树莓派STT+TTS程序中添加非命令词错误提示?
树莓派STT/TTS程序功能修复:非命令词触发Error提示
问题说明
我有一个运行在树莓派上的STT(语音转文字)与TTS(文字转语音)结合的程序,目前已实现当识别器无法检测到词汇时播放“error”提示。我们将特定词汇设为命令词,对应保存并播放指定MP3文件。现需添加功能:当识别器成功识别到非命令词时,触发与异常块中相同的“error”提示。尝试用elif实现时,出现错误提示持续播放的问题。
问题分析
- 原代码使用多个独立
if判断命令词,未处理非命令词的分支逻辑 - 冗余的
if command == command判断无实际作用 - 播放音频后未等待播放完成,易导致循环中重复触发播放操作
- 命令词匹配逻辑未做统一分支处理,非命令词场景无对应执行逻辑
修改后的代码
import RPi.GPIO as GPIO import time import sys import speech_recognition as sr import pyttsx3 from gtts import gTTS import os from pygame import mixer import traceback GPIO.setmode(GPIO.BCM) GPIO.setup(2 ,GPIO.IN) prev_input = 1 mixer.init() listener = sr.Recognizer() engine = pyttsx3.init() voices = engine.getProperty("voices") rate = engine.getProperty("rate") engine.setProperty("rate", 180) def talk(text): engine.say(text) engine.runAndWait() def play_error(): # 封装error播放逻辑,减少重复代码 tts = gTTS(text="error", lang="en") filename = "error.mp3" tts.save(filename) mixer.music.load(filename) mixer.music.play() # 等待音频播放完成,避免重复触发 while mixer.music.get_busy(): time.sleep(0.1) while True: input_pin = GPIO.input(2) # 检测GPIO引脚上升沿(按键按下触发) if ((not prev_input) and input_pin): try: with sr.Microphone() as source: print('You can speak now') talk("You can speak now") listener.phrase_threshold = 2 audio = listener.listen(source, 8) command = listener.recognize_google(audio).lower() # 转小写避免大小写匹配问题 print(command) # 用if-elif-else处理命令词匹配逻辑 command_handled = False if command == "hello": print("good morning") tts = gTTS(text="good morning", lang="en") filename = "goodmorning.mp3" tts.save(filename) mixer.music.load(filename) mixer.music.play() command_handled = True elif command == "hey": print("hi there") tts = gTTS(text="hi there", lang="en") filename = "hithere.mp3" tts.save(filename) mixer.music.load(filename) mixer.music.play() command_handled = True elif command == "yes": print("no") tts = gTTS(text="no", lang="en") filename = "no.mp3" tts.save(filename) mixer.music.load(filename) mixer.music.play() command_handled = True # 未匹配到任何命令词,触发error提示 if not command_handled: play_error() # 等待当前音频播放完成 while mixer.music.get_busy(): time.sleep(0.1) except Exception: traceback.print_exc() play_error() prev_input = input_pin time.sleep(0.05)
关键改动说明
- 将原独立
if改为if-elif结构,确保命令词匹配逻辑互斥,避免重复执行 - 新增
command_handled标记,统一判断是否匹配到命令词,未匹配则触发error提示 - 封装
play_error()函数,减少重复代码,同时添加播放完成等待逻辑,解决持续播放问题 - 将识别结果转小写,避免因语音识别返回大小写不一致导致的匹配失败
- 在命令词处理后添加音频播放等待,确保一次触发只执行一次音频播放
内容的提问来源于stack exchange,提问作者curiousprogrammer23
相关产品推荐
相关产品推荐

