ruby_speech 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,63 @@
1
+ <?xml version="1.0" encoding="UTF-8"?>
2
+ <xsd:schema targetNamespace="http://www.w3.org/2001/10/synthesis"
3
+ xmlns:xsd="http://www.w3.org/2001/XMLSchema"
4
+ xmlns="http://www.w3.org/2001/10/synthesis" elementFormDefault="qualified">
5
+ <xsd:annotation>
6
+ <xsd:documentation>SSML 1.0 Schema (20040615)</xsd:documentation>
7
+ </xsd:annotation>
8
+ <xsd:annotation>
9
+ <xsd:documentation>Copyright 1998-2004 W3C (MIT, ERCIM, Keio),
10
+ All Rights Reserved. Permission to use, copy, modify and
11
+ distribute the SSML schema and its accompanying documentation
12
+ for any purpose and without fee is hereby granted in
13
+ perpetuity, provided that the above copyright notice and this
14
+ paragraph appear in all copies. The copyright holders make no
15
+ representation about the suitability of the schema for any purpose.
16
+ It is provided "as is" without expressed or implied warranty.
17
+ </xsd:documentation>
18
+ </xsd:annotation>
19
+
20
+ <xsd:import namespace="http://www.w3.org/XML/1998/namespace"
21
+ schemaLocation="xml.xsd"/>
22
+ <xsd:redefine schemaLocation="synthesis-core.xsd">
23
+
24
+ <xsd:annotation>
25
+ <xsd:documentation>restriction: version and attributes on speak mandatory</xsd:documentation>
26
+ </xsd:annotation>
27
+ <xsd:complexType name="speak" mixed="true">
28
+ <xsd:complexContent>
29
+ <xsd:restriction base="speak">
30
+ <xsd:group ref="speak.class"/>
31
+ <xsd:attribute name="version" type="version.datatype" use="required"/>
32
+ <xsd:attribute ref="xml:lang" use="required"/>
33
+ </xsd:restriction>
34
+ </xsd:complexContent>
35
+ </xsd:complexType>
36
+
37
+ <xsd:annotation>
38
+ <xsd:documentation>restriction: src attribute on audio is mandatory</xsd:documentation>
39
+ </xsd:annotation>
40
+ <xsd:complexType name="audio" mixed="true">
41
+ <xsd:complexContent>
42
+ <xsd:restriction base="audio">
43
+ <xsd:group ref="descAndSentenceAndStructure.class"/>
44
+ <xsd:attribute name="src" type="xsd:anyURI" use="required"/>
45
+ </xsd:restriction>
46
+ </xsd:complexContent>
47
+ </xsd:complexType>
48
+
49
+
50
+ <xsd:annotation>
51
+ <xsd:documentation>restriction: name attribute on mark is mandatory</xsd:documentation>
52
+ </xsd:annotation>
53
+ <xsd:complexType name="mark">
54
+ <xsd:complexContent>
55
+ <xsd:restriction base="mark">
56
+ <xsd:attribute name="name" type="xsd:token" use="required"/>
57
+ </xsd:restriction>
58
+ </xsd:complexContent>
59
+ </xsd:complexType>
60
+
61
+ </xsd:redefine>
62
+
63
+ </xsd:schema>
data/assets/xml.xsd ADDED
@@ -0,0 +1,287 @@
1
+ <?xml version='1.0'?>
2
+ <?xml-stylesheet href="../2008/09/xsd.xsl" type="text/xsl"?>
3
+ <xs:schema targetNamespace="http://www.w3.org/XML/1998/namespace"
4
+ xmlns:xs="http://www.w3.org/2001/XMLSchema"
5
+ xmlns ="http://www.w3.org/1999/xhtml"
6
+ xml:lang="en">
7
+
8
+ <xs:annotation>
9
+ <xs:documentation>
10
+ <div>
11
+ <h1>About the XML namespace</h1>
12
+
13
+ <div class="bodytext">
14
+ <p>
15
+ This schema document describes the XML namespace, in a form
16
+ suitable for import by other schema documents.
17
+ </p>
18
+ <p>
19
+ See <a href="http://www.w3.org/XML/1998/namespace.html">
20
+ http://www.w3.org/XML/1998/namespace.html</a> and
21
+ <a href="http://www.w3.org/TR/REC-xml">
22
+ http://www.w3.org/TR/REC-xml</a> for information
23
+ about this namespace.
24
+ </p>
25
+ <p>
26
+ Note that local names in this namespace are intended to be
27
+ defined only by the World Wide Web Consortium or its subgroups.
28
+ The names currently defined in this namespace are listed below.
29
+ They should not be used with conflicting semantics by any Working
30
+ Group, specification, or document instance.
31
+ </p>
32
+ <p>
33
+ See further below in this document for more information about <a
34
+ href="#usage">how to refer to this schema document from your own
35
+ XSD schema documents</a> and about <a href="#nsversioning">the
36
+ namespace-versioning policy governing this schema document</a>.
37
+ </p>
38
+ </div>
39
+ </div>
40
+ </xs:documentation>
41
+ </xs:annotation>
42
+
43
+ <xs:attribute name="lang">
44
+ <xs:annotation>
45
+ <xs:documentation>
46
+ <div>
47
+
48
+ <h3>lang (as an attribute name)</h3>
49
+ <p>
50
+ denotes an attribute whose value
51
+ is a language code for the natural language of the content of
52
+ any element; its value is inherited. This name is reserved
53
+ by virtue of its definition in the XML specification.</p>
54
+
55
+ </div>
56
+ <div>
57
+ <h4>Notes</h4>
58
+ <p>
59
+ Attempting to install the relevant ISO 2- and 3-letter
60
+ codes as the enumerated possible values is probably never
61
+ going to be a realistic possibility.
62
+ </p>
63
+ <p>
64
+ See BCP 47 at <a href="http://www.rfc-editor.org/rfc/bcp/bcp47.txt">
65
+ http://www.rfc-editor.org/rfc/bcp/bcp47.txt</a>
66
+ and the IANA language subtag registry at
67
+ <a href="http://www.iana.org/assignments/language-subtag-registry">
68
+ http://www.iana.org/assignments/language-subtag-registry</a>
69
+ for further information.
70
+ </p>
71
+ <p>
72
+ The union allows for the 'un-declaration' of xml:lang with
73
+ the empty string.
74
+ </p>
75
+ </div>
76
+ </xs:documentation>
77
+ </xs:annotation>
78
+ <xs:simpleType>
79
+ <xs:union memberTypes="xs:language">
80
+ <xs:simpleType>
81
+ <xs:restriction base="xs:string">
82
+ <xs:enumeration value=""/>
83
+ </xs:restriction>
84
+ </xs:simpleType>
85
+ </xs:union>
86
+ </xs:simpleType>
87
+ </xs:attribute>
88
+
89
+ <xs:attribute name="space">
90
+ <xs:annotation>
91
+ <xs:documentation>
92
+ <div>
93
+
94
+ <h3>space (as an attribute name)</h3>
95
+ <p>
96
+ denotes an attribute whose
97
+ value is a keyword indicating what whitespace processing
98
+ discipline is intended for the content of the element; its
99
+ value is inherited. This name is reserved by virtue of its
100
+ definition in the XML specification.</p>
101
+
102
+ </div>
103
+ </xs:documentation>
104
+ </xs:annotation>
105
+ <xs:simpleType>
106
+ <xs:restriction base="xs:NCName">
107
+ <xs:enumeration value="default"/>
108
+ <xs:enumeration value="preserve"/>
109
+ </xs:restriction>
110
+ </xs:simpleType>
111
+ </xs:attribute>
112
+
113
+ <xs:attribute name="base" type="xs:anyURI"> <xs:annotation>
114
+ <xs:documentation>
115
+ <div>
116
+
117
+ <h3>base (as an attribute name)</h3>
118
+ <p>
119
+ denotes an attribute whose value
120
+ provides a URI to be used as the base for interpreting any
121
+ relative URIs in the scope of the element on which it
122
+ appears; its value is inherited. This name is reserved
123
+ by virtue of its definition in the XML Base specification.</p>
124
+
125
+ <p>
126
+ See <a
127
+ href="http://www.w3.org/TR/xmlbase/">http://www.w3.org/TR/xmlbase/</a>
128
+ for information about this attribute.
129
+ </p>
130
+ </div>
131
+ </xs:documentation>
132
+ </xs:annotation>
133
+ </xs:attribute>
134
+
135
+ <xs:attribute name="id" type="xs:ID">
136
+ <xs:annotation>
137
+ <xs:documentation>
138
+ <div>
139
+
140
+ <h3>id (as an attribute name)</h3>
141
+ <p>
142
+ denotes an attribute whose value
143
+ should be interpreted as if declared to be of type ID.
144
+ This name is reserved by virtue of its definition in the
145
+ xml:id specification.</p>
146
+
147
+ <p>
148
+ See <a
149
+ href="http://www.w3.org/TR/xml-id/">http://www.w3.org/TR/xml-id/</a>
150
+ for information about this attribute.
151
+ </p>
152
+ </div>
153
+ </xs:documentation>
154
+ </xs:annotation>
155
+ </xs:attribute>
156
+
157
+ <xs:attributeGroup name="specialAttrs">
158
+ <xs:attribute ref="xml:base"/>
159
+ <xs:attribute ref="xml:lang"/>
160
+ <xs:attribute ref="xml:space"/>
161
+ <xs:attribute ref="xml:id"/>
162
+ </xs:attributeGroup>
163
+
164
+ <xs:annotation>
165
+ <xs:documentation>
166
+ <div>
167
+
168
+ <h3>Father (in any context at all)</h3>
169
+
170
+ <div class="bodytext">
171
+ <p>
172
+ denotes Jon Bosak, the chair of
173
+ the original XML Working Group. This name is reserved by
174
+ the following decision of the W3C XML Plenary and
175
+ XML Coordination groups:
176
+ </p>
177
+ <blockquote>
178
+ <p>
179
+ In appreciation for his vision, leadership and
180
+ dedication the W3C XML Plenary on this 10th day of
181
+ February, 2000, reserves for Jon Bosak in perpetuity
182
+ the XML name "xml:Father".
183
+ </p>
184
+ </blockquote>
185
+ </div>
186
+ </div>
187
+ </xs:documentation>
188
+ </xs:annotation>
189
+
190
+ <xs:annotation>
191
+ <xs:documentation>
192
+ <div xml:id="usage" id="usage">
193
+ <h2><a name="usage">About this schema document</a></h2>
194
+
195
+ <div class="bodytext">
196
+ <p>
197
+ This schema defines attributes and an attribute group suitable
198
+ for use by schemas wishing to allow <code>xml:base</code>,
199
+ <code>xml:lang</code>, <code>xml:space</code> or
200
+ <code>xml:id</code> attributes on elements they define.
201
+ </p>
202
+ <p>
203
+ To enable this, such a schema must import this schema for
204
+ the XML namespace, e.g. as follows:
205
+ </p>
206
+ <pre>
207
+ &lt;schema . . .>
208
+ . . .
209
+ &lt;import namespace="http://www.w3.org/XML/1998/namespace"
210
+ schemaLocation="http://www.w3.org/2001/xml.xsd"/>
211
+ </pre>
212
+ <p>
213
+ or
214
+ </p>
215
+ <pre>
216
+ &lt;import namespace="http://www.w3.org/XML/1998/namespace"
217
+ schemaLocation="http://www.w3.org/2009/01/xml.xsd"/>
218
+ </pre>
219
+ <p>
220
+ Subsequently, qualified reference to any of the attributes or the
221
+ group defined below will have the desired effect, e.g.
222
+ </p>
223
+ <pre>
224
+ &lt;type . . .>
225
+ . . .
226
+ &lt;attributeGroup ref="xml:specialAttrs"/>
227
+ </pre>
228
+ <p>
229
+ will define a type which will schema-validate an instance element
230
+ with any of those attributes.
231
+ </p>
232
+ </div>
233
+ </div>
234
+ </xs:documentation>
235
+ </xs:annotation>
236
+
237
+ <xs:annotation>
238
+ <xs:documentation>
239
+ <div id="nsversioning" xml:id="nsversioning">
240
+ <h2><a name="nsversioning">Versioning policy for this schema document</a></h2>
241
+ <div class="bodytext">
242
+ <p>
243
+ In keeping with the XML Schema WG's standard versioning
244
+ policy, this schema document will persist at
245
+ <a href="http://www.w3.org/2009/01/xml.xsd">
246
+ http://www.w3.org/2009/01/xml.xsd</a>.
247
+ </p>
248
+ <p>
249
+ At the date of issue it can also be found at
250
+ <a href="http://www.w3.org/2001/xml.xsd">
251
+ http://www.w3.org/2001/xml.xsd</a>.
252
+ </p>
253
+ <p>
254
+ The schema document at that URI may however change in the future,
255
+ in order to remain compatible with the latest version of XML
256
+ Schema itself, or with the XML namespace itself. In other words,
257
+ if the XML Schema or XML namespaces change, the version of this
258
+ document at <a href="http://www.w3.org/2001/xml.xsd">
259
+ http://www.w3.org/2001/xml.xsd
260
+ </a>
261
+ will change accordingly; the version at
262
+ <a href="http://www.w3.org/2009/01/xml.xsd">
263
+ http://www.w3.org/2009/01/xml.xsd
264
+ </a>
265
+ will not change.
266
+ </p>
267
+ <p>
268
+ Previous dated (and unchanging) versions of this schema
269
+ document are at:
270
+ </p>
271
+ <ul>
272
+ <li><a href="http://www.w3.org/2009/01/xml.xsd">
273
+ http://www.w3.org/2009/01/xml.xsd</a></li>
274
+ <li><a href="http://www.w3.org/2007/08/xml.xsd">
275
+ http://www.w3.org/2007/08/xml.xsd</a></li>
276
+ <li><a href="http://www.w3.org/2004/10/xml.xsd">
277
+ http://www.w3.org/2004/10/xml.xsd</a></li>
278
+ <li><a href="http://www.w3.org/2001/03/xml.xsd">
279
+ http://www.w3.org/2001/03/xml.xsd</a></li>
280
+ </ul>
281
+ </div>
282
+ </div>
283
+ </xs:documentation>
284
+ </xs:annotation>
285
+
286
+ </xs:schema>
287
+
@@ -0,0 +1,15 @@
1
+ %w{
2
+ active_support/dependencies/autoload
3
+ active_support/core_ext/object/blank
4
+ active_support/core_ext/numeric/time
5
+ niceogiri
6
+ }.each { |f| require f }
7
+
8
+ module RubySpeech
9
+ extend ActiveSupport::Autoload
10
+
11
+ autoload :Version
12
+
13
+ autoload :SSML
14
+ autoload :XML
15
+ end
@@ -0,0 +1,24 @@
1
+ module RubySpeech
2
+ module SSML
3
+ extend ActiveSupport::Autoload
4
+
5
+ autoload :Break
6
+ autoload :Element
7
+ autoload :Emphasis
8
+ autoload :Prosody
9
+ autoload :SayAs
10
+ autoload :Speak
11
+ autoload :Voice
12
+
13
+ InvalidChildError = Class.new StandardError
14
+
15
+ def self.draw(&block)
16
+ Nokogiri::XML::Document.new.tap do |doc|
17
+ doc << Speak.new.tap do |speak|
18
+ block_return = speak.instance_eval(&block) if block_given?
19
+ speak << block_return if block_return.is_a?(String)
20
+ end
21
+ end.to_s
22
+ end
23
+ end # SSML
24
+ end # RubySpeech
@@ -0,0 +1,71 @@
1
+ module RubySpeech
2
+ module SSML
3
+ ##
4
+ # The break element is an empty element that controls the pausing or other prosodic boundaries between words. The use of the break element between any pair of words is optional. If the element is not present between words, the synthesis processor is expected to automatically determine a break based on the linguistic context. In practice, the break element is most often used to override the typical automatic behavior of a synthesis processor.
5
+ #
6
+ # http://www.w3.org/TR/speech-synthesis/#S3.2.3
7
+ #
8
+ class Break < Element
9
+
10
+ VALID_STRENGTHS = [:none, :'x-weak', :weak, :medium, :strong, :'x-strong'].freeze
11
+
12
+ ##
13
+ # Create a new SSML break element
14
+ #
15
+ # @param [Hash] atts Key-value pairs of options mapping to setter methods
16
+ #
17
+ # @return [Break] an element for use in an SSML document
18
+ #
19
+ def self.new(atts = {}, &block)
20
+ super 'break', atts, &block
21
+ end
22
+
23
+ ##
24
+ # This attribute is used to indicate the strength of the prosodic break in the speech output. The value "none" indicates that no prosodic break boundary should be outputted, which can be used to prevent a prosodic break which the processor would otherwise produce. The other values indicate monotonically non-decreasing (conceptually increasing) break strength between words. The stronger boundaries are typically accompanied by pauses. "x-weak" and "x-strong" are mnemonics for "extra weak" and "extra strong", respectively.
25
+ #
26
+ # @return [Symbol]
27
+ #
28
+ def strength
29
+ read_attr :strength, :to_sym
30
+ end
31
+
32
+ ##
33
+ # @param [Symbol] the strength. Must be one of VALID_STRENGTHS
34
+ #
35
+ # @raises ArgumentError if s is not one of VALID_STRENGTHS
36
+ #
37
+ def strength=(s)
38
+ raise ArgumentError, "You must specify a valid strength (#{VALID_STRENGTHS.map(&:inspect).join ', '})" unless VALID_STRENGTHS.include? s
39
+ write_attr :strength, s
40
+ end
41
+
42
+ ##
43
+ # Indicates the duration of a pause to be inserted in the output in seconds or milliseconds. It follows the time value format from the Cascading Style Sheets Level 2 Recommendation [CSS2], e.g. "250ms", "3s".
44
+ #
45
+ # @return [Float]
46
+ #
47
+ def time
48
+ read_attr :time, :to_f
49
+ end
50
+
51
+ ##
52
+ # @param [Numeric] t the time as a positive value in seconds
53
+ #
54
+ # @raises ArgumentError if t is nota positive numeric value
55
+ #
56
+ def time=(t)
57
+ raise ArgumentError, "You must specify a valid time (positive float value in seconds)" unless t.is_a?(Numeric) && t >= 0
58
+ write_attr :time, "#{t}s"
59
+ end
60
+
61
+ def <<(*args)
62
+ raise InvalidChildError, "A Break cannot contain children"
63
+ super
64
+ end
65
+
66
+ def eql?(o)
67
+ super o, :strength, :time
68
+ end
69
+ end # Break
70
+ end # SSML
71
+ end # RubySpeech