最近我对使用Windows语音识别宏尝试一些XML和Javascript感兴趣。这是我对这两种语言的第一次体验,但由于我确实有一个小的编程历史,我认为我可以潜入。到目前为止它已经相当不错。但是现在我正在尝试为我的宏实现更深层次的交互性,我开始遇到错误,我无法在网上找到解释,所以我来到这里寻求你的帮助。
这是给我带来问题的宏:
<command>
<listenFor>Whats the weather like in [CityName]</listenFor>
<script language="JScript">
<![CDATA[
var xml_doc = new ActiveXObject("Microsoft.XMLDOM");
xml_doc.async = false;
xml_doc.load("http://api.openweathermap.org/data/2.5/weather?q={[CityName]}&mode=xml");
var city = xml_doc.getElementByTagName("city").getAttribute("name");
var temperature = xml_doc.getElementByTagName("temperature");
Application.Speak(city);
]]>
</script>
</command>
这是错误消息:
Error compiling grammar for speech Macros:
"AI-base.WSRMac"
==========
Line 40: 80045048 - Invalid rule reference to <RULEREF NAME="CityName" REFID=""/>
==========
00001:
00002: <GRAMMAR LANGID="0409">
...
...
...
00038: <RULE NAME="Rule_8">
00039: <P>
00040: <p>Whats the weather like in </p><ruleref name="CityName" propname="CityName" />
00041: </P>
00042: </RULE>
00043: <RULE name="build:namedDictation"><dictation min="1" max="10"/></RULE>
00044: </GRAMMAR>
我正在尝试使用此宏来获取用户的城市名称并获取该位置的天气,将其输出几个变量然后让它以我喜欢的格式告诉我天气。
有人可以解释一下我做错了什么以及如何解决它?
提前致谢:) -Dirk
答案 0 :(得分:1)
据我所知,WSR宏没有预定义的“CityName”属性。我看到的使用'CityName'的示例定义了具有适当属性的命名城市列表。例如,Weather.WSRMac示例具有
<listenForList name="CityName" propname="zipCode">
<item propval="45255">Cincinnati</item>
<item propval="98075">Sammamish</item>
<item propval="98052">Redmond</item>
<item propval="98004">Bellevue</item>
<item propval="98101">Seattle</item>
</listenForList>
你需要做类似的事情。
如果您需要未解释的字符串,可以尝试
<rule name="CityName">
<Dictation PROPID="Dictation" Min="1" Max="5"/>
</rule>
要在运行时检索内容,您应该能够使用
xml_doc.load("http://api.openweathermap.org/data/2.5/weather?q={[CityName.Dictation]}&mode=xml");
WSR Macros Wiki几乎所有这些内容都可用,尤其是Rule Generators上的部分;有关SAPI 5 XML语法的详细信息也在MSDN上。