You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在树莓派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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 02:27:44