最新消息:雨落星辰是一个专注网站SEO优化、网站SEO诊断、搜索引擎研究、网络营销推广、网站策划运营及站长类的自媒体原创博客

naturallyspeaking - Reoccurring waitForSpeech dialogue issue from dragonfly2Natlink - Stack Overflow

programmeradmin0浏览0评论

I’ve been working on a speech dictation implementation for several days and have finally achieved functional speech recognition. The system successfully transcribes my voice input; however, it consistently triggers the waitForSpeech dialogue popup. I’m uncertain why this occurs, given that the dictation itself operates correctly.

Additionally, the popup triggers the Windows system error sound, which is disruptive. In previous iterations of this code, I attempted to suppress the popup. While this was partially successful, it’s not an optimal solution, as the popup continues to open and close intermittently even after I’ve finished speaking, suggesting underlying issues with my approach.

I've also tried patching the issue from my script but that just broke dictation.

I’ve reviewed the available documentation, which appears limited, and sought assistance from three different AI tools to troubleshoot the problem. Despite these efforts, the issue persists, leading me to suspect that my initial implementation may be flawed. I assume others have successfully implemented similar functionality without encountering this behaviour.

Could someone provide insight into what might be causing the waitForSpeech popup to appear unnecessarily, and suggest a more robust approach to prevent it? Any guidance or references to relevant documentation would be greatly appreciated.

import time
import logging
import platform
from dragonfly import Grammar, Dictation, CompoundRule, get_engine
import natlink

# Configure logging for debugging purposes.
logging.basicConfig(
    level=logging.DEBUG, format="%(asctime)s - %(levelname)s - %(message)s"
)

# Explicitly connect to Natlink
try:
    natlink.natConnect()
    logging.info("Successfully connected to Natlink")
except Exception as e:
    logging.error("Failed to connect to Natlink: %s", str(e))
    raise  # Exit if connection fails

engine = get_engine("natlink")  # Use Dragon NaturallySpeaking instead of SAPI5

if engine:
    logging.info("Engine name: %r" % engine.name)
else:
    print("No engine has been initialized.")
    logging.error("No engine has been initialized.")
    raise SystemExit

def check_environment():
    os_name = platform.system()
    logging.info("Platform: %s", os_name)
    if os_name.lower() == 'windows':
        logging.info("Running on Windows.")
    else:
        logging.info("Not running on Windows. Some features may not be available.")
    
    if hasattr(engine, "mic_state"):
        logging.info("Current microphone state: %s", engine.mic_state)
    else:
        logging.info("Mic state attribute not available in this NatLink/engine version.")
    
    if hasattr(natlink, 'getNatLinkUserDirectory'):
        try:
            user_dir = natlink.getNatLinkUserDirectory()
            logging.info("NatLink user directory: %s", user_dir)
        except Exception as e:
            logging.error("Could not get NatLink user directory: %s", e)
    else:
        logging.info("NatLink does not have 'getNatLinkUserDirectory'. Skipping that check.")

class DictationRule(CompoundRule):
    spec = "<dictated_words>"  # Match any speech and assign it to dictated_words
    extras = [Dictation("dictated_words")]

    def _process_recognition(self, node, extras):
        logging.info("Processing recognition...")
        words = str(extras["dictated_words"])
        if not words or words.strip() == "":
            logging.info("Recognition triggered but no words were captured")
            return
        print("Recognized: %s" % words)
        logging.info(words)

def main():
    check_environment()
    
    grammar = Grammar("dictation_logger", engine=engine)
    dictation_rule = DictationRule()
    grammar.add_rule(dictation_rule)
    grammar.load()

    logging.info("Loading Dragonfly grammar for dictation logging...")
    logging.info("Grammar loaded and listening for dictation...")

    try:
        while True:
            time.sleep(0.2)
            engine.do_recognition()
    except KeyboardInterrupt:
        logging.info("Keyboard interrupt received. Unloading grammar and exiting...")
        grammar.unload()
        natlink.natDisconnect()  # Explicitly disconnect from Natlink
        logging.info("Disconnected from Natlink and exiting...")

if __name__ == "__main__":
    main()
发布评论

评论列表(0)

  1. 暂无评论