如何将Dragon NaturallySpeaking的所有输入重定向到Python?(使用Natlink)

6 投票
1 回答
1298 浏览
提问于 2025-04-17 09:18

我现在正在写一个人工智能程序,它可以接收来自Dragon NaturallySpeaking的输入(使用Natlink),处理这些输入,然后返回语音输出。我已经创建了一个接收器GrammarBase,可以捕捉Dragon的所有输入,并将其发送给我的解析器。

    class Receiver(GrammarBase):

        gramSpec = """ <start> exported = {emptyList}; """

        def initialize(self):
            self.load(self.gramSpec, allResults = 1)
            self.activateAll()

        def gotResultsObject(self, recogType, resObj):
            if recogType == 'reject':
                inpt, self.best_guess = [], []
            else:
                inpt = extract_words(resObj)
                inpt = process_input(inpt) # Forms a list of possible interpretations
                self.best_guess = resObj.getWords(0)
            self.send_input(inpt)

        def send_input(self, inpt):
            send = send_to_parser(inpt) # Sends first possible interpretation to parser
            try:
                while True:
                    send.next() # Sends the next possible interpretation if the first is rejected
            except StopIteration: # If all interpretations are rejected, try sending the input to Dragon
                try:
                    recognitionMimic(parse(self.best_guess))
                except MimicFailed: # If that fails too, execute all_failed
                    all_failed()

这段代码按预期工作,但有几个问题:

  1. Dragon在将输入发送给我的程序之前会先处理这些输入。比如说,如果我说“打开谷歌浏览器”,它会先打开谷歌浏览器,然后再把输入发送给Python。有没有办法在不先处理的情况下直接把输入发送给Python呢?

  2. 当我调用waitForSpeech()时,会弹出一个消息框,显示Python解释器在等待输入。有没有办法(为了美观和方便)让这个消息框不显示,而是在用户长时间没有说话后,直接结束语音收集的过程呢?

谢谢!

1 个回答

3

关于你第一个问题,DNS在内部处理命令时,会使用“打开...”这个说法。这意味着DNS会先理解这个语音指令并执行命令,而在natlink有机会处理之前就已经完成了。解决这个问题的办法就是把你的natlink语法中的“打开...”改成“触发...”或者其他DNS没有使用的说法(除了“触发...”)。

一些natlink的开发者会在speechcomputing.com上交流,你可以去那里寻求更好的帮助。

祝你好运!

撰写回答