gpt4 book ai didi

Python: win32com.client.getevents ("SAPI.SpSharedRecoContext") 返回 None

转载 作者:行者123 更新时间:2023-12-01 05:46:40 38 4
gpt4 key购买 nike

我已经下载了一段代码,展示了如何使用 Python 2.7.3 解释器在 Windows 7 上使用 Windows Speech API (SAPI 5.1),并在我的系统上安装了 PyWin32 Build 218。代码一切都很好:

from win32com.client import constants
import win32com.client
import pythoncom

"""Sample code for using the Microsoft Speech SDK 5.1 via COM in Python.
Requires that the SDK be installed; it's a free download from
http://microsoft.com/speech
and that MakePy has been used on it (in PythonWin,
select Tools | COM MakePy Utility | Microsoft Speech Object Library 5.1).

After running this, then saying "One", "Two", "Three" or "Four" should
display "You said One" etc on the console. The recognition can be a bit
shaky at first until you've trained it (via the Speech entry in the Windows
Control Panel."""
class SpeechRecognition:
""" Initialize the speech recognition with the passed in list of words """
def __init__(self, wordsToAdd):
# For text-to-speech
self.speaker = win32com.client.Dispatch("SAPI.SpVoice")
# For speech recognition - first create a listener
self.listener = win32com.client.Dispatch("SAPI.SpSharedRecognizer")
# Then a recognition context
self.context = self.listener.CreateRecoContext()
# which has an associated grammar
self.grammar = self.context.CreateGrammar()
# Do not allow free word recognition - only command and control
# recognizing the words in the grammar only
self.grammar.DictationSetState(0)
# Create a new rule for the grammar, that is top level (so it begins
# a recognition) and dynamic (ie we can change it at runtime)
# self.wordsRule = self.grammar.Rules.Add("wordsRule",constants.SRATopLevel + constants.SRADynamic, 0)

# Clear the rule (not necessary first time, but if we're changing it
# dynamically then it's useful)
# self.wordsRule.Clear()
self.wordsRule = self.grammar.Rules.Add("wordsRule",1)
self.wordsRule.Clear()
# And go through the list of words, adding each to the rule
[ self.wordsRule.InitialState.AddWordTransition(None, word) for word in wordsToAdd ]
# Set the wordsRule to be active
self.grammar.Rules.Commit()
self.grammar.CmdSetRuleState("wordsRule", 1)
# Commit the changes to the grammar
self.grammar.Rules.Commit()
# And add an event handler that's called back when recognition occurs
self.eventHandler = ContextEvents(self.context)
# Announce we've started using speech synthesis
self.say("Started successfully")
"""Speak a word or phrase"""
def say(self, phrase):
self.speaker.Speak(phrase)


"""The callback class that handles the events raised by the speech object.
See "Automation | SpSharedRecoContext (Events)" in the MS Speech SDK
online help for documentation of the other events supported. """
class ContextEvents(win32com.client.getevents("SAPI.SpSharedRecoContext")):
"""Called when a word/phrase is successfully recognized -
ie it is found in a currently open grammar with a sufficiently high
confidence"""
def OnRecognition(self, StreamNumber, StreamPosition, RecognitionType, Result):
newResult = win32com.client.Dispatch(Result)
print "You said: ",newResult.PhraseInfo.GetText()

if __name__=='__main__':
wordsToAdd = [ "One", "Two", "Three", "Four" ]
speechReco = SpeechRecognition(wordsToAdd)
while 1:
pythoncom.PumpWaitingMessages()

但是我得到了这个异常:类 ContextEvents(win32com.client.getevents("SAPI.SpSharedRecoContext")):TypeError:调用元类基时出错无法创建“NoneType”实例

我在网上搜索了一下,我唯一想到的是: TypeError: Error when calling the metaclass bases

这没有帮助,所以我搜索了更多,并对部分代码做了一些调查,所以我发现 win32com.client.getevents("SAPI.SpSharedRecoContext") retuens None ,因此当它被用作基础时类,该异常被抛出。

那么,问题出在哪里呢?我该如何解决这个问题?否则我可以使用任何其他方式使用 SAPI 5.1 进行语音识别吗?

注意:我知道 SpeechPy 项目,但我必须使用 Windows API。

谢谢。

最佳答案

您忘记运行 MakePy。
如果您安装了 pyWin32,它也会安装 PythonWin。

打开PythonWin,然后选择工具| COM MakePy 实用程序 |微软语音对象库5.4

关于Python: win32com.client.getevents ("SAPI.SpSharedRecoContext") 返回 None,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15879802/

38 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com