龙自如编程者

10 投票
1 回答
5875 浏览
提问于 2025-04-15 23:25

有没有办法把Dragon NaturallySpeaking(DNS)这个语音识别软件放进一个事件驱动的程序里?我的老板希望我能用DNS来记录用户的语音输入,但不想把它显示在屏幕上,而是直接保存成XML文件。我研究了好几天,但我找不到不使用(非常贵的)SDK的方法,甚至不知道即使用了SDK是否能成功。

微软有一个功能,可以写一个(Python)程序,让它的语音识别器等到检测到说话的事件后再处理。这还可以提供一些替代短语的建议,记录下.wav文件以备后用。示例代码:

spEngine = MsSpeech()
spEngine.setEventHandler(RecoEventHandler(spEngine.context))

class RecoEventHandler(SpRecoContext):
def OnRecognition(self, StreamNumber, StreamPosition, RecognitionType, Result):
    res = win32com.client.Dispatch(Result)
    phrase = res.PhraseInfo.GetText()
    #from here I would save it as XML

    # write reco phrases
    altPhrases = reco.Alternates(NBEST)
    for phrase in altPhrases:
        nodePhrase = self.doc.createElement(TAG_PHRASE)

我似乎无法让DNS做到这一点。我能做到的最接近的方式是:

while keepGoing == True:
    yourWords = raw_input("Your input: ")
    transcript_el = createTranscript(doc, "user", yourWords)
    speech_el.appendChild(transcript_el)
    if yourWords == 'bye':
        break

这甚至有个糟糕的副作用,就是让用户在每句话后都得说“换行”!这根本不是理想的解决方案!有没有办法让DNS像微软的语音识别那样工作呢?

顺便说一下,我知道逻辑上的解决办法就是直接换成微软的语音识别,但我们就假设一下,这不是一个选项。

更新 - 有人买过SDK吗?觉得它有用吗?

1 个回答

8

解决方案:下载 Natlink - http://qh.antenna.nl/unimacro/installation/installation.html。这个工具的使用灵活性没有 SAPI 高,但基本功能都能满足我的需求。此外,提醒一下,Natlink 和 Python 需要在你电脑上的所有用户账户下都下载,否则它可能无法正常工作。它支持所有版本的 Python,除了 2.4。

下载后,所有支持的命令的文档可以在 C:\NatLink\NatLink\MiscScripts\natlink.txt 找到。文档的最上面有所有更新的信息。

示例代码:

#make sure DNS is running before you start
if not natlink.isNatSpeakRunning():
  raiseError('must start up Dragon NaturallySpeaking first!')
  shutdownServer()
  return
#connect to natlink and load the grammer it's supposed to recognize
natlink.natConnect()
loggerGrammar = LoggerGrammar()
loggerGrammar.initialize()
if natlink.getMicState() == 'off':
   natlink.setMicState('on')
userName = 'Danni'
natlink.openUser(userName)
#natlink.waitForSpeech() continuous loop waiting for input. 
#Results are sent to gotResultsObject method of the logger grammar
natlink.waitForSpeech()
natlink.natDisconnect()

这段代码比我实际使用的版本简化了很多,但我希望你能明白大概意思。现在唯一的问题是,我还得回到 Natlink 创建的那个小窗口,点击“关闭”,才能安全退出程序。如果能有办法从 Python 里直接让这个窗口关闭,而不使用超时参数,那就太好了。

撰写回答