2010-06-01 67 views
9

無論如何將Dragon NaturallySpeaking融入事件驅動程序?如果我使用DNS記錄用戶語音輸入而不寫入屏幕並將其直接保存到XML,我的老闆會非常喜歡它。我已經做了好幾天的研究,我看不到一個沒有(非常昂貴)SDK的情況下發生這種情況的方法,我甚至不知道它會起作用。Dragon NaturallySpeaking程序員

微軟有能力編寫一個(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執行Microsoft Speech的功能嗎?

僅供參考:我知道合乎邏輯的解決方案是簡單地切換到Microsoft Speech,但讓我們假設,只是爲了咧嘴笑和笑聲,這不是一種選擇。

更新 - 有人買過SDK嗎?你覺得它有用嗎?

+3

@WarrenP:這個人使用它的40%-60%的發展。確實,開箱即用並不有用,但是使用Natlink和VI/Emacs他有一個非常好的設置。 http://www.youtube.com/watch?v=8SkdfdXWYaI – 2013-09-05 15:44:05

+0

@WarrenP你甚至試過了嗎?我總是使用它,它比使用鍵盤快得多(即使我使用鍵盤,因爲我6意味着我有一個非常高的WPM)。對於編程,我同意它需要改進,但它仍然有用。請參閱[我們如何使用Dragon NaturallySpeaking更高效地編寫代碼?](http://productivity.stackexchange.com/q/3605/2476) – 2014-04-14 15:46:03

+0

我可以輸入120 WPM。我從來沒有見過英文文本到語音用戶達到40 WPM。定義HIGH wpm? – 2014-04-15 20:06:13

回答

8

解決方案:下載Natlink - http://qh.antenna.nl/unimacro/installation/installation.html 它不像SAPI那樣靈活,但它涵蓋了基本知識,並且我幾乎獲得了所需的一切。另外,需要爲計算機上的所有用戶下載它和Python,否則它將無法正常工作,並且適用於Python BUT 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.waitForSpeech()創建點擊'關閉',纔可以安全地退出程序。如果不使用超時參數來指示窗口關閉python的方式將非常棒。

相關問題