龙自如编程者
有没有办法把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 个回答
解决方案:下载 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 里直接让这个窗口关闭,而不使用超时参数,那就太好了。