ruby_speech 0.2.2 → 0.3.0
Sign up to get free protection for your applications and to get access to all the features.
- data/.gitignore +1 -0
- data/CHANGELOG.md +3 -0
- data/README.md +75 -0
- data/assets/grammar-core.xsd +317 -0
- data/assets/grammar.xsd +37 -0
- data/assets/synthesis-core.xsd +4 -1
- data/lib/ruby_speech/grxml/element.rb +107 -0
- data/lib/ruby_speech/grxml/grammar.rb +126 -0
- data/lib/ruby_speech/grxml/item.rb +135 -0
- data/lib/ruby_speech/grxml/one_of.rb +42 -0
- data/lib/ruby_speech/grxml/rule.rb +84 -0
- data/lib/ruby_speech/grxml/ruleref.rb +80 -0
- data/lib/ruby_speech/grxml/tag.rb +36 -0
- data/lib/ruby_speech/grxml/token.rb +38 -0
- data/lib/ruby_speech/grxml.rb +25 -0
- data/lib/ruby_speech/ssml/element.rb +2 -2
- data/lib/ruby_speech/version.rb +1 -1
- data/lib/ruby_speech.rb +1 -0
- data/spec/ruby_speech/grxml/grammar_spec.rb +156 -0
- data/spec/ruby_speech/grxml/item_spec.rb +160 -0
- data/spec/ruby_speech/grxml/one_of_spec.rb +50 -0
- data/spec/ruby_speech/grxml/rule_spec.rb +125 -0
- data/spec/ruby_speech/grxml/ruleref_spec.rb +55 -0
- data/spec/ruby_speech/grxml/tag_spec.rb +41 -0
- data/spec/ruby_speech/grxml/token_spec.rb +47 -0
- data/spec/ruby_speech/grxml_spec.rb +251 -0
- data/spec/spec_helper.rb +9 -0
- data/spec/support/matchers.rb +47 -0
- metadata +47 -20
data/.gitignore
CHANGED
data/CHANGELOG.md
CHANGED
data/README.md
CHANGED
@@ -18,6 +18,7 @@ speak = RubySpeech::SSML.draw do
|
|
18
18
|
end
|
19
19
|
end
|
20
20
|
end
|
21
|
+
|
21
22
|
speak.to_s
|
22
23
|
```
|
23
24
|
|
@@ -44,6 +45,66 @@ Once your `Speak` is fully prepared and you're ready to send it off for processi
|
|
44
45
|
|
45
46
|
You may also then need to call `to_s`.
|
46
47
|
|
48
|
+
|
49
|
+
Contruct a GRXML (SGR) document like this:
|
50
|
+
|
51
|
+
```ruby
|
52
|
+
require 'ruby_speech'
|
53
|
+
|
54
|
+
grammy = RubySpeech::GRXML.draw do
|
55
|
+
self.mode = 'dtmf'
|
56
|
+
self.root = 'digits'
|
57
|
+
rule id: 'digits' do
|
58
|
+
one_of do
|
59
|
+
0.upto(9) {|d| item { d.to_s } }
|
60
|
+
end
|
61
|
+
end
|
62
|
+
|
63
|
+
rule id: 'pin', scope: 'public' do
|
64
|
+
one_of do
|
65
|
+
item do
|
66
|
+
item repeat: '4' do
|
67
|
+
ruleref uri: '#digit'
|
68
|
+
end
|
69
|
+
"#"
|
70
|
+
end
|
71
|
+
item do
|
72
|
+
"* 9"
|
73
|
+
end
|
74
|
+
end
|
75
|
+
end
|
76
|
+
end
|
77
|
+
|
78
|
+
grammy.to_s
|
79
|
+
```
|
80
|
+
|
81
|
+
which becomes
|
82
|
+
|
83
|
+
```xml
|
84
|
+
<grammar xmlns="http://www.w3.org/2001/06/grammar" version="1.0" xml:lang="en-US" mode="dtmf" root="digits">
|
85
|
+
<rule id="digits">
|
86
|
+
<one-of>
|
87
|
+
<item>0</item>
|
88
|
+
<item>1</item>
|
89
|
+
<item>2</item>
|
90
|
+
<item>3</item>
|
91
|
+
<item>4</item>
|
92
|
+
<item>5</item>
|
93
|
+
<item>6</item>
|
94
|
+
<item>7</item>
|
95
|
+
<item>8</item>
|
96
|
+
<item>9</item>
|
97
|
+
</one-of>
|
98
|
+
</rule>
|
99
|
+
<rule id="pin" scope="public">
|
100
|
+
<one-of>
|
101
|
+
<item><item repeat="4"><ruleref uri="#digit"/></item>#</item>
|
102
|
+
<item>* 9</item>
|
103
|
+
</one-of>
|
104
|
+
</rule>
|
105
|
+
</grammar>
|
106
|
+
```
|
107
|
+
|
47
108
|
Check out the [YARD documentation](http://rdoc.info/github/benlangfeld/ruby_speech/master/frames) for more
|
48
109
|
|
49
110
|
## Features:
|
@@ -56,6 +117,15 @@ Check out the [YARD documentation](http://rdoc.info/github/benlangfeld/ruby_spee
|
|
56
117
|
* `<break/>`
|
57
118
|
* `<audio/>`
|
58
119
|
|
120
|
+
### GRXML
|
121
|
+
* Document construction
|
122
|
+
* `<item/>`
|
123
|
+
* `<one-of/>`
|
124
|
+
* `<rule/>`
|
125
|
+
* `<ruleref/>`
|
126
|
+
* `<tag/>`
|
127
|
+
* `<token/>`
|
128
|
+
|
59
129
|
## TODO:
|
60
130
|
### SSML
|
61
131
|
#### Document Structure
|
@@ -69,6 +139,11 @@ Check out the [YARD documentation](http://rdoc.info/github/benlangfeld/ruby_spee
|
|
69
139
|
* `<mark/>`
|
70
140
|
* `<desc/>`
|
71
141
|
|
142
|
+
### GRXML
|
143
|
+
* `<meta/>` and `<metadata/>`
|
144
|
+
* `<example/>`
|
145
|
+
* `<lexicon/>`
|
146
|
+
|
72
147
|
|
73
148
|
## Links:
|
74
149
|
* [Source](https://github.com/benlangfeld/ruby_speech)
|
@@ -0,0 +1,317 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
<xsd:schema xmlns:xsd="http://www.w3.org/2001/XMLSchema" elementFormDefault="qualified">
|
3
|
+
<xsd:annotation>
|
4
|
+
<xsd:documentation>SRGS 1.0 Core Schema (20031204)</xsd:documentation>
|
5
|
+
</xsd:annotation>
|
6
|
+
<xsd:annotation>
|
7
|
+
<xsd:documentation>
|
8
|
+
Copyright 1998-2003 W3C (MIT, ERCIM, Keio),
|
9
|
+
All Rights Reserved. Permission to use, copy, modify and
|
10
|
+
distribute the SRGS core schema and its accompanying documentation
|
11
|
+
for any purpose and without fee is hereby granted in
|
12
|
+
perpetuity, provided that the above copyright notice and this
|
13
|
+
paragraph appear in all copies. The copyright holders make no
|
14
|
+
representation about the suitability of the schema for any purpose.
|
15
|
+
It is provided "as is" without expressed or implied warranty.
|
16
|
+
</xsd:documentation>
|
17
|
+
</xsd:annotation>
|
18
|
+
<xsd:import namespace="http://www.w3.org/XML/1998/namespace"
|
19
|
+
schemaLocation="xml.xsd"/>
|
20
|
+
<!--<xsd:import namespace="http://www.w3.org/XML/1998/namespace"
|
21
|
+
schemaLocation="http://www.w3.org/2001/xml.xsd"/>-->
|
22
|
+
<xsd:annotation>
|
23
|
+
<xsd:documentation>General Datatypes</xsd:documentation>
|
24
|
+
</xsd:annotation>
|
25
|
+
<xsd:annotation>
|
26
|
+
<xsd:documentation>Grammar-specific datatypes</xsd:documentation>
|
27
|
+
</xsd:annotation>
|
28
|
+
<xsd:simpleType name="tag">
|
29
|
+
<xsd:restriction base="xsd:string"/>
|
30
|
+
</xsd:simpleType>
|
31
|
+
<xsd:simpleType name="example">
|
32
|
+
<xsd:restriction base="xsd:string"/>
|
33
|
+
</xsd:simpleType>
|
34
|
+
<xsd:simpleType name="Id.datatype">
|
35
|
+
<xsd:annotation>
|
36
|
+
<xsd:documentation>
|
37
|
+
does not expression the constraint that NULL VOID GARBAGE are illegal as rule name
|
38
|
+
</xsd:documentation>
|
39
|
+
</xsd:annotation>
|
40
|
+
<xsd:restriction base="xsd:ID">
|
41
|
+
<xsd:pattern value="[^.:\-]+"/>
|
42
|
+
</xsd:restriction>
|
43
|
+
</xsd:simpleType>
|
44
|
+
<xsd:simpleType name="Scope.datatype">
|
45
|
+
<xsd:restriction base="xsd:NMTOKEN">
|
46
|
+
<xsd:enumeration value="private"/>
|
47
|
+
<xsd:enumeration value="public"/>
|
48
|
+
</xsd:restriction>
|
49
|
+
</xsd:simpleType>
|
50
|
+
<xsd:simpleType name="Special.datatype">
|
51
|
+
<xsd:restriction base="xsd:NMTOKEN">
|
52
|
+
<xsd:enumeration value="NULL"/>
|
53
|
+
<xsd:enumeration value="VOID"/>
|
54
|
+
<xsd:enumeration value="GARBAGE"/>
|
55
|
+
</xsd:restriction>
|
56
|
+
</xsd:simpleType>
|
57
|
+
<xsd:simpleType name="Repeat-prob.datatype">
|
58
|
+
<xsd:restriction base="xsd:decimal">
|
59
|
+
<xsd:minInclusive value="0.0"/>
|
60
|
+
<xsd:maxInclusive value="1.0"/>
|
61
|
+
</xsd:restriction>
|
62
|
+
</xsd:simpleType>
|
63
|
+
<xsd:simpleType name="Repeat.datatype">
|
64
|
+
<xsd:annotation>
|
65
|
+
<xsd:documentation>
|
66
|
+
does not expression the constraint in n-m that m must be greater than n
|
67
|
+
</xsd:documentation>
|
68
|
+
</xsd:annotation>
|
69
|
+
<xsd:restriction base="xsd:string">
|
70
|
+
<xsd:pattern value="[0-9]+"/>
|
71
|
+
<xsd:pattern value="[0-9]+-([0-9]+)?"/>
|
72
|
+
<xsd:pattern value="([0-9]+)?-[0-9]+"/>
|
73
|
+
</xsd:restriction>
|
74
|
+
</xsd:simpleType>
|
75
|
+
<xsd:simpleType name="Weight.datatype">
|
76
|
+
<xsd:restriction base="xsd:string">
|
77
|
+
<xsd:pattern value="[0-9]+[.]?"/>
|
78
|
+
<xsd:pattern value="([0-9]+)?[.][0-9]+"/>
|
79
|
+
</xsd:restriction>
|
80
|
+
</xsd:simpleType>
|
81
|
+
<xsd:simpleType name="Tag-format.datatype">
|
82
|
+
<xsd:restriction base="xsd:anyURI"/>
|
83
|
+
</xsd:simpleType>
|
84
|
+
<xsd:simpleType name="Version.datatype">
|
85
|
+
<xsd:restriction base="xsd:NMTOKEN"/>
|
86
|
+
</xsd:simpleType>
|
87
|
+
<xsd:simpleType name="Root.datatype">
|
88
|
+
<xsd:annotation>
|
89
|
+
<xsd:documentation>does not expression the constraint that NULL VOID GARBAGE
|
90
|
+
are illegal as rule name</xsd:documentation>
|
91
|
+
</xsd:annotation>
|
92
|
+
<xsd:restriction base="xsd:IDREF">
|
93
|
+
<xsd:pattern value="[^.:\-]+"/>
|
94
|
+
</xsd:restriction>
|
95
|
+
</xsd:simpleType>
|
96
|
+
<xsd:simpleType name="Mode.datatype">
|
97
|
+
<xsd:restriction base="xsd:NMTOKEN">
|
98
|
+
<xsd:enumeration value="voice"/>
|
99
|
+
<xsd:enumeration value="dtmf"/>
|
100
|
+
</xsd:restriction>
|
101
|
+
</xsd:simpleType>
|
102
|
+
<xsd:simpleType name="Type.datatype">
|
103
|
+
<xsd:restriction base="xsd:string"/>
|
104
|
+
</xsd:simpleType>
|
105
|
+
<xsd:annotation>
|
106
|
+
<xsd:documentation>Grammar Attributes</xsd:documentation>
|
107
|
+
</xsd:annotation>
|
108
|
+
<xsd:attributeGroup name="Tag-format.attrib">
|
109
|
+
<xsd:annotation>
|
110
|
+
<xsd:documentation/>
|
111
|
+
</xsd:annotation>
|
112
|
+
<xsd:attribute name="tag-format" type="Tag-format.datatype"/>
|
113
|
+
</xsd:attributeGroup>
|
114
|
+
<xsd:attributeGroup name="Version.attrib">
|
115
|
+
<xsd:annotation>
|
116
|
+
<xsd:documentation/>
|
117
|
+
</xsd:annotation>
|
118
|
+
<xsd:attribute name="version" type="Version.datatype"/>
|
119
|
+
</xsd:attributeGroup>
|
120
|
+
<xsd:attributeGroup name="Mode.attrib">
|
121
|
+
<xsd:annotation>
|
122
|
+
<xsd:documentation/>
|
123
|
+
</xsd:annotation>
|
124
|
+
<xsd:attribute name="mode" type="Mode.datatype" default="voice"/>
|
125
|
+
</xsd:attributeGroup>
|
126
|
+
<xsd:attributeGroup name="Root.attrib">
|
127
|
+
<xsd:annotation>
|
128
|
+
<xsd:documentation/>
|
129
|
+
</xsd:annotation>
|
130
|
+
<xsd:attribute name="root" type="Root.datatype"/>
|
131
|
+
</xsd:attributeGroup>
|
132
|
+
<xsd:attributeGroup name="Special.attrib">
|
133
|
+
<xsd:annotation>
|
134
|
+
<xsd:documentation/>
|
135
|
+
</xsd:annotation>
|
136
|
+
<xsd:attribute name="special" type="Special.datatype"/>
|
137
|
+
</xsd:attributeGroup>
|
138
|
+
<xsd:attributeGroup name="Repeat-prob.attrib">
|
139
|
+
<xsd:annotation>
|
140
|
+
<xsd:documentation/>
|
141
|
+
</xsd:annotation>
|
142
|
+
<xsd:attribute name="repeat-prob" type="Repeat-prob.datatype"/>
|
143
|
+
</xsd:attributeGroup>
|
144
|
+
<xsd:attributeGroup name="Repeat.attrib">
|
145
|
+
<xsd:annotation>
|
146
|
+
<xsd:documentation/>
|
147
|
+
</xsd:annotation>
|
148
|
+
<xsd:attribute name="repeat" type="Repeat.datatype"/>
|
149
|
+
</xsd:attributeGroup>
|
150
|
+
<xsd:attributeGroup name="Type.attrib">
|
151
|
+
<xsd:annotation>
|
152
|
+
<xsd:documentation/>
|
153
|
+
</xsd:annotation>
|
154
|
+
<xsd:attribute name="type" type="Type.datatype"/>
|
155
|
+
</xsd:attributeGroup>
|
156
|
+
<xsd:attributeGroup name="Weight.attrib">
|
157
|
+
<xsd:annotation>
|
158
|
+
<xsd:documentation/>
|
159
|
+
</xsd:annotation>
|
160
|
+
<xsd:attribute name="weight" type="Weight.datatype"/>
|
161
|
+
</xsd:attributeGroup>
|
162
|
+
<xsd:attributeGroup name="Id.attrib">
|
163
|
+
<xsd:annotation>
|
164
|
+
<xsd:documentation/>
|
165
|
+
</xsd:annotation>
|
166
|
+
<xsd:attribute name="id" type="Id.datatype" use="required"/>
|
167
|
+
</xsd:attributeGroup>
|
168
|
+
<xsd:attributeGroup name="Scope.attrib">
|
169
|
+
<xsd:annotation>
|
170
|
+
<xsd:documentation/>
|
171
|
+
</xsd:annotation>
|
172
|
+
<xsd:attribute name="scope" type="Scope.datatype" default="private"/>
|
173
|
+
</xsd:attributeGroup>
|
174
|
+
<xsd:attributeGroup name="Token.attribs">
|
175
|
+
<xsd:annotation>
|
176
|
+
<xsd:documentation/>
|
177
|
+
</xsd:annotation>
|
178
|
+
<xsd:attribute ref="xml:lang"/>
|
179
|
+
</xsd:attributeGroup>
|
180
|
+
<xsd:attributeGroup name="One-of.attribs">
|
181
|
+
<xsd:annotation>
|
182
|
+
<xsd:documentation/>
|
183
|
+
</xsd:annotation>
|
184
|
+
<xsd:attribute ref="xml:lang"/>
|
185
|
+
</xsd:attributeGroup>
|
186
|
+
<xsd:attributeGroup name="Item.attribs">
|
187
|
+
<xsd:annotation>
|
188
|
+
<xsd:documentation/>
|
189
|
+
</xsd:annotation>
|
190
|
+
<xsd:attributeGroup ref="Repeat-prob.attrib"/>
|
191
|
+
<xsd:attributeGroup ref="Repeat.attrib"/>
|
192
|
+
<xsd:attributeGroup ref="Weight.attrib"/>
|
193
|
+
<xsd:attribute ref="xml:lang"/>
|
194
|
+
</xsd:attributeGroup>
|
195
|
+
<xsd:attributeGroup name="Grammar.attribs">
|
196
|
+
<xsd:annotation>
|
197
|
+
<xsd:documentation/>
|
198
|
+
</xsd:annotation>
|
199
|
+
<xsd:attributeGroup ref="Tag-format.attrib"/>
|
200
|
+
<xsd:attributeGroup ref="Version.attrib"/>
|
201
|
+
<xsd:attribute ref="xml:lang"/>
|
202
|
+
<xsd:attribute ref="xml:base"/>
|
203
|
+
<xsd:attributeGroup ref="Root.attrib"/>
|
204
|
+
<xsd:attributeGroup ref="Mode.attrib"/>
|
205
|
+
</xsd:attributeGroup>
|
206
|
+
<xsd:attributeGroup name="Ruleref.attribs">
|
207
|
+
<xsd:annotation>
|
208
|
+
<xsd:documentation/>
|
209
|
+
</xsd:annotation>
|
210
|
+
<xsd:attributeGroup ref="Type.attrib"/>
|
211
|
+
<xsd:attribute name="uri" type="xsd:anyURI"/>
|
212
|
+
<xsd:attributeGroup ref="Special.attrib"/>
|
213
|
+
</xsd:attributeGroup>
|
214
|
+
<xsd:attributeGroup name="Rule.attribs">
|
215
|
+
<xsd:annotation>
|
216
|
+
<xsd:documentation/>
|
217
|
+
</xsd:annotation>
|
218
|
+
<xsd:attributeGroup ref="Id.attrib"/>
|
219
|
+
<xsd:attributeGroup ref="Scope.attrib"/>
|
220
|
+
</xsd:attributeGroup>
|
221
|
+
<xsd:attributeGroup name="Lexicon.attribs">
|
222
|
+
<xsd:annotation>
|
223
|
+
<xsd:documentation/>
|
224
|
+
</xsd:annotation>
|
225
|
+
<xsd:attribute name="uri" type="xsd:anyURI" use="required"/>
|
226
|
+
<xsd:attributeGroup ref="Type.attrib"/>
|
227
|
+
</xsd:attributeGroup>
|
228
|
+
<xsd:attributeGroup name="Meta.attribs">
|
229
|
+
<xsd:annotation>
|
230
|
+
<xsd:documentation/>
|
231
|
+
</xsd:annotation>
|
232
|
+
<xsd:attribute name="name" type="xsd:NMTOKEN"/>
|
233
|
+
<xsd:attribute name="content" type="xsd:string" use="required"/>
|
234
|
+
<xsd:attribute name="http-equiv" type="xsd:NMTOKEN"/>
|
235
|
+
</xsd:attributeGroup>
|
236
|
+
<xsd:annotation>
|
237
|
+
<xsd:documentation>Content Models</xsd:documentation>
|
238
|
+
</xsd:annotation>
|
239
|
+
<xsd:group name="rule-expansion">
|
240
|
+
<xsd:choice>
|
241
|
+
<xsd:element name="token" type="token"/>
|
242
|
+
<xsd:element name="ruleref" type="ruleref"/>
|
243
|
+
<xsd:element name="item" type="item"/>
|
244
|
+
<xsd:element name="one-of" type="one-of"/>
|
245
|
+
<xsd:element name="tag" type="tag"/>
|
246
|
+
</xsd:choice>
|
247
|
+
</xsd:group>
|
248
|
+
<xsd:complexType name="ruleref">
|
249
|
+
<xsd:attributeGroup ref="Ruleref.attribs"/>
|
250
|
+
</xsd:complexType>
|
251
|
+
<xsd:complexType name="token" mixed="true">
|
252
|
+
<xsd:annotation>
|
253
|
+
<xsd:documentation>does not expression the constraint that empty content is illegal
|
254
|
+
</xsd:documentation>
|
255
|
+
</xsd:annotation>
|
256
|
+
<xsd:attributeGroup ref="Token.attribs"/>
|
257
|
+
</xsd:complexType>
|
258
|
+
<xsd:complexType name="one-of">
|
259
|
+
<xsd:sequence maxOccurs="unbounded">
|
260
|
+
<xsd:element name="item" type="item"/>
|
261
|
+
</xsd:sequence>
|
262
|
+
<xsd:attributeGroup ref="One-of.attribs"/>
|
263
|
+
</xsd:complexType>
|
264
|
+
<xsd:complexType name="item" mixed="true">
|
265
|
+
<xsd:group ref="rule-expansion" minOccurs="0" maxOccurs="unbounded"/>
|
266
|
+
<xsd:attributeGroup ref="Item.attribs"/>
|
267
|
+
</xsd:complexType>
|
268
|
+
<xsd:complexType name="rule" mixed="true">
|
269
|
+
<xsd:choice minOccurs="0" maxOccurs="unbounded">
|
270
|
+
<xsd:group ref="rule-expansion"/>
|
271
|
+
<xsd:element name="example" type="example"/>
|
272
|
+
</xsd:choice>
|
273
|
+
<xsd:attributeGroup ref="Rule.attribs"/>
|
274
|
+
</xsd:complexType>
|
275
|
+
<xsd:complexType name="lexicon">
|
276
|
+
<xsd:attributeGroup ref="Lexicon.attribs"/>
|
277
|
+
</xsd:complexType>
|
278
|
+
<xsd:complexType name="meta">
|
279
|
+
<xsd:attributeGroup ref="Meta.attribs"/>
|
280
|
+
</xsd:complexType>
|
281
|
+
<xsd:complexType name="metadata">
|
282
|
+
<xsd:choice minOccurs="0" maxOccurs="unbounded">
|
283
|
+
<xsd:any namespace="##other" processContents="lax"/>
|
284
|
+
</xsd:choice>
|
285
|
+
<xsd:anyAttribute namespace="##any" processContents="strict"/>
|
286
|
+
</xsd:complexType>
|
287
|
+
|
288
|
+
<xsd:group name="grammar.class">
|
289
|
+
<xsd:annotation>
|
290
|
+
<xsd:documentation>grammar content model</xsd:documentation>
|
291
|
+
</xsd:annotation>
|
292
|
+
<xsd:sequence>
|
293
|
+
<xsd:choice minOccurs="0" maxOccurs="unbounded">
|
294
|
+
<xsd:element name="lexicon" type="lexicon"/>
|
295
|
+
<xsd:element name="meta" type="meta"/>
|
296
|
+
<xsd:element name="metadata" type="metadata"/>
|
297
|
+
<xsd:element name="tag" type="tag"/>
|
298
|
+
</xsd:choice>
|
299
|
+
<xsd:choice minOccurs="0" maxOccurs="unbounded">
|
300
|
+
<xsd:element name="rule" type="rule"/>
|
301
|
+
</xsd:choice>
|
302
|
+
</xsd:sequence>
|
303
|
+
</xsd:group>
|
304
|
+
|
305
|
+
<xsd:complexType name="grammar">
|
306
|
+
<xsd:annotation>
|
307
|
+
<xsd:documentation>grammar type with grammar content model and attributes</xsd:documentation>
|
308
|
+
</xsd:annotation>
|
309
|
+
<xsd:group ref="grammar.class"/>
|
310
|
+
<xsd:attributeGroup ref="Grammar.attribs"/>
|
311
|
+
</xsd:complexType>
|
312
|
+
|
313
|
+
<xsd:annotation>
|
314
|
+
<xsd:documentation>Global Elements</xsd:documentation>
|
315
|
+
</xsd:annotation>
|
316
|
+
<xsd:element name="grammar" type="grammar"/>
|
317
|
+
</xsd:schema>
|
data/assets/grammar.xsd
ADDED
@@ -0,0 +1,37 @@
|
|
1
|
+
<?xml version="1.0" encoding="UTF-8"?>
|
2
|
+
|
3
|
+
<xsd:schema targetNamespace="http://www.w3.org/2001/06/grammar"
|
4
|
+
xmlns="http://www.w3.org/2001/06/grammar"
|
5
|
+
xmlns:xsd="http://www.w3.org/2001/XMLSchema"
|
6
|
+
elementFormDefault="qualified">
|
7
|
+
<xsd:annotation>
|
8
|
+
<xsd:documentation>SRGS 1.0 Schema (20031204)</xsd:documentation>
|
9
|
+
</xsd:annotation>
|
10
|
+
<xsd:annotation>
|
11
|
+
<xsd:documentation>Copyright 1998-2003 W3C (MIT, ERCIM, Keio),
|
12
|
+
All Rights Reserved. Permission to use, copy, modify and
|
13
|
+
distribute the SRGS schema and its accompanying documentation
|
14
|
+
for any purpose and without fee is hereby granted in
|
15
|
+
perpetuity, provided that the above copyright notice and this
|
16
|
+
paragraph appear in all copies. The copyright holders make no
|
17
|
+
representation about the suitability of the schema for any purpose.
|
18
|
+
It is provided "as is" without expressed or implied warranty.
|
19
|
+
</xsd:documentation>
|
20
|
+
</xsd:annotation>
|
21
|
+
|
22
|
+
<xsd:redefine schemaLocation="grammar-core.xsd">
|
23
|
+
<xsd:annotation>
|
24
|
+
<xsd:documentation>restricted grammar type so that version attribute is mandatory</xsd:documentation>
|
25
|
+
</xsd:annotation>
|
26
|
+
<xsd:complexType name="grammar">
|
27
|
+
<xsd:complexContent>
|
28
|
+
<xsd:restriction base="grammar">
|
29
|
+
<xsd:group ref="grammar.class"/>
|
30
|
+
<xsd:attribute name="version" type="Version.datatype" use="required"/>
|
31
|
+
</xsd:restriction>
|
32
|
+
</xsd:complexContent>
|
33
|
+
</xsd:complexType>
|
34
|
+
</xsd:redefine>
|
35
|
+
|
36
|
+
|
37
|
+
</xsd:schema>
|
data/assets/synthesis-core.xsd
CHANGED
@@ -20,7 +20,10 @@ It is provided "as is" without expressed or implied warranty.
|
|
20
20
|
<xsd:documentation>Importing dependent namespaces</xsd:documentation>
|
21
21
|
</xsd:annotation>
|
22
22
|
<xsd:import namespace="http://www.w3.org/XML/1998/namespace"
|
23
|
-
schemaLocation="
|
23
|
+
schemaLocation="xml.xsd"/>
|
24
|
+
|
25
|
+
<!--<xsd:import namespace="http://www.w3.org/XML/1998/namespace"
|
26
|
+
schemaLocation="http://www.w3.org/2001/xml.xsd"/>-->
|
24
27
|
<xsd:annotation>
|
25
28
|
<xsd:documentation>General Datatypes</xsd:documentation>
|
26
29
|
</xsd:annotation>
|
@@ -0,0 +1,107 @@
|
|
1
|
+
require 'active_support/core_ext/class/attribute'
|
2
|
+
|
3
|
+
module RubySpeech
|
4
|
+
module GRXML
|
5
|
+
class Element < Niceogiri::XML::Node
|
6
|
+
@@registrations = {}
|
7
|
+
|
8
|
+
class_attribute :registered_ns, :registered_name
|
9
|
+
|
10
|
+
# Register a new stanza class to a name and/or namespace
|
11
|
+
#
|
12
|
+
# This registers a namespace that is used when looking
|
13
|
+
# up the class name of the object to instantiate when a new
|
14
|
+
# stanza is received
|
15
|
+
#
|
16
|
+
# @param [#to_s] name the name of the node
|
17
|
+
#
|
18
|
+
def self.register(name)
|
19
|
+
self.registered_name = name.to_s
|
20
|
+
self.registered_ns = GRXML_NAMESPACE
|
21
|
+
@@registrations[[self.registered_name, self.registered_ns]] = self
|
22
|
+
end
|
23
|
+
|
24
|
+
# Find the class to use given the name and namespace of a stanza
|
25
|
+
#
|
26
|
+
# @param [#to_s] name the name to lookup
|
27
|
+
#
|
28
|
+
# @return [Class, nil] the class appropriate for the name
|
29
|
+
def self.class_from_registration(name)
|
30
|
+
@@registrations[[name.to_s, GRXML_NAMESPACE]]
|
31
|
+
end
|
32
|
+
|
33
|
+
# Import an XML::Node to the appropriate class
|
34
|
+
#
|
35
|
+
# Looks up the class the node should be then creates it based on the
|
36
|
+
# elements of the XML::Node
|
37
|
+
# @param [XML::Node] node the node to import
|
38
|
+
# @return the appropriate object based on the node name and namespace
|
39
|
+
def self.import(node)
|
40
|
+
return node.content if node.is_a?(Nokogiri::XML::Text)
|
41
|
+
klass = class_from_registration(node.element_name)
|
42
|
+
if klass && klass != self
|
43
|
+
klass.import node
|
44
|
+
else
|
45
|
+
new.inherit node
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
# Inherit the attributes and children of an XML::Node
|
50
|
+
#
|
51
|
+
# @param [XML::Node] node the node to inherit
|
52
|
+
# @return [self]
|
53
|
+
def inherit(node)
|
54
|
+
inherit_attrs node.attributes
|
55
|
+
node.children.each do |c|
|
56
|
+
self << c.dup
|
57
|
+
end
|
58
|
+
self
|
59
|
+
end
|
60
|
+
|
61
|
+
def self.new(element_name, atts = {}, &block)
|
62
|
+
super(element_name) do |new_node|
|
63
|
+
atts.each_pair { |k, v| new_node.send :"#{k}=", v }
|
64
|
+
block_return = new_node.instance_eval &block if block_given?
|
65
|
+
new_node << new_node.encode_special_chars(block_return) if block_return.is_a?(String)
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
def children
|
70
|
+
super.map { |c| Element.import c }
|
71
|
+
end
|
72
|
+
|
73
|
+
def embed(other)
|
74
|
+
case other
|
75
|
+
when String
|
76
|
+
self << encode_special_chars(other)
|
77
|
+
when Grammar
|
78
|
+
other.children.each do |child|
|
79
|
+
self << child
|
80
|
+
end
|
81
|
+
when Element
|
82
|
+
self << other
|
83
|
+
else
|
84
|
+
raise ArgumentError, "Can only embed a String or an GRXML element"
|
85
|
+
end
|
86
|
+
end
|
87
|
+
|
88
|
+
def method_missing(method_name, *args, &block)
|
89
|
+
const_name = method_name.to_s.sub('ssml', '').titleize.gsub(' ', '')
|
90
|
+
const = GRXML.const_get const_name
|
91
|
+
if const && self.class::VALID_CHILD_TYPES.include?(const)
|
92
|
+
if const == String
|
93
|
+
self << encode_special_chars(args.first)
|
94
|
+
else
|
95
|
+
self << const.new(*args, &block)
|
96
|
+
end
|
97
|
+
else
|
98
|
+
super
|
99
|
+
end
|
100
|
+
end
|
101
|
+
|
102
|
+
def eql?(o, *args)
|
103
|
+
super o, :content, :children, *args
|
104
|
+
end
|
105
|
+
end # Element
|
106
|
+
end # GRXML
|
107
|
+
end # RubySpeech
|