ruby_speech 2.1.0-java
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.
- data/.gitignore +12 -0
- data/.rspec +3 -0
- data/.travis.yml +17 -0
- data/CHANGELOG.md +144 -0
- data/Gemfile +3 -0
- data/Guardfile +9 -0
- data/LICENSE.md +20 -0
- data/README.md +314 -0
- data/Rakefile +34 -0
- data/assets/grammar-core.xsd +317 -0
- data/assets/grammar.xsd +37 -0
- data/assets/synthesis-core.xsd +445 -0
- data/assets/synthesis.xsd +63 -0
- data/assets/xml.xsd +287 -0
- data/ext/ruby_speech/RubySpeechGRXMLMatcher.java +64 -0
- data/ext/ruby_speech/RubySpeechService.java +23 -0
- data/ext/ruby_speech/extconf.rb +7 -0
- data/ext/ruby_speech/ruby_speech.c +97 -0
- data/lib/ruby_speech/generic_element.rb +169 -0
- data/lib/ruby_speech/grxml/element.rb +29 -0
- data/lib/ruby_speech/grxml/grammar.rb +189 -0
- data/lib/ruby_speech/grxml/item.rb +144 -0
- data/lib/ruby_speech/grxml/match.rb +16 -0
- data/lib/ruby_speech/grxml/matcher.rb +126 -0
- data/lib/ruby_speech/grxml/max_match.rb +6 -0
- data/lib/ruby_speech/grxml/no_match.rb +10 -0
- data/lib/ruby_speech/grxml/one_of.rb +31 -0
- data/lib/ruby_speech/grxml/potential_match.rb +10 -0
- data/lib/ruby_speech/grxml/rule.rb +73 -0
- data/lib/ruby_speech/grxml/ruleref.rb +69 -0
- data/lib/ruby_speech/grxml/tag.rb +29 -0
- data/lib/ruby_speech/grxml/token.rb +31 -0
- data/lib/ruby_speech/grxml.rb +39 -0
- data/lib/ruby_speech/nlsml/builder.rb +34 -0
- data/lib/ruby_speech/nlsml/document.rb +120 -0
- data/lib/ruby_speech/nlsml.rb +18 -0
- data/lib/ruby_speech/ruby_speech.jar +0 -0
- data/lib/ruby_speech/ssml/audio.rb +47 -0
- data/lib/ruby_speech/ssml/break.rb +62 -0
- data/lib/ruby_speech/ssml/desc.rb +24 -0
- data/lib/ruby_speech/ssml/element.rb +23 -0
- data/lib/ruby_speech/ssml/emphasis.rb +44 -0
- data/lib/ruby_speech/ssml/mark.rb +43 -0
- data/lib/ruby_speech/ssml/p.rb +25 -0
- data/lib/ruby_speech/ssml/phoneme.rb +72 -0
- data/lib/ruby_speech/ssml/prosody.rb +172 -0
- data/lib/ruby_speech/ssml/s.rb +25 -0
- data/lib/ruby_speech/ssml/say_as.rb +100 -0
- data/lib/ruby_speech/ssml/speak.rb +27 -0
- data/lib/ruby_speech/ssml/sub.rb +42 -0
- data/lib/ruby_speech/ssml/voice.rb +108 -0
- data/lib/ruby_speech/ssml.rb +39 -0
- data/lib/ruby_speech/version.rb +3 -0
- data/lib/ruby_speech/xml/language.rb +13 -0
- data/lib/ruby_speech/xml.rb +11 -0
- data/lib/ruby_speech.rb +36 -0
- data/ruby_speech.gemspec +42 -0
- data/spec/ruby_speech/grxml/grammar_spec.rb +341 -0
- data/spec/ruby_speech/grxml/item_spec.rb +192 -0
- data/spec/ruby_speech/grxml/match_spec.rb +15 -0
- data/spec/ruby_speech/grxml/matcher_spec.rb +688 -0
- data/spec/ruby_speech/grxml/max_match_spec.rb +17 -0
- data/spec/ruby_speech/grxml/no_match_spec.rb +17 -0
- data/spec/ruby_speech/grxml/one_of_spec.rb +49 -0
- data/spec/ruby_speech/grxml/potential_match_spec.rb +17 -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 +62 -0
- data/spec/ruby_speech/grxml_spec.rb +339 -0
- data/spec/ruby_speech/nlsml_spec.rb +353 -0
- data/spec/ruby_speech/ssml/audio_spec.rb +121 -0
- data/spec/ruby_speech/ssml/break_spec.rb +100 -0
- data/spec/ruby_speech/ssml/desc_spec.rb +57 -0
- data/spec/ruby_speech/ssml/emphasis_spec.rb +110 -0
- data/spec/ruby_speech/ssml/mark_spec.rb +53 -0
- data/spec/ruby_speech/ssml/p_spec.rb +96 -0
- data/spec/ruby_speech/ssml/phoneme_spec.rb +65 -0
- data/spec/ruby_speech/ssml/prosody_spec.rb +309 -0
- data/spec/ruby_speech/ssml/s_spec.rb +92 -0
- data/spec/ruby_speech/ssml/say_as_spec.rb +71 -0
- data/spec/ruby_speech/ssml/speak_spec.rb +166 -0
- data/spec/ruby_speech/ssml/sub_spec.rb +57 -0
- data/spec/ruby_speech/ssml/voice_spec.rb +200 -0
- data/spec/ruby_speech/ssml_spec.rb +285 -0
- data/spec/ruby_speech_spec.rb +124 -0
- data/spec/spec_helper.rb +21 -0
- data/spec/support/match_examples.rb +43 -0
- data/spec/support/matchers.rb +46 -0
- metadata +405 -0
|
@@ -0,0 +1,309 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
module RubySpeech
|
|
4
|
+
module SSML
|
|
5
|
+
describe Prosody do
|
|
6
|
+
its(:name) { should == 'prosody' }
|
|
7
|
+
|
|
8
|
+
describe "setting options in initializers" do
|
|
9
|
+
subject { Prosody.new :pitch => :medium, :contour => "something", :range => '20Hz', :rate => 2, :duration => 10.seconds, :volume => :loud }
|
|
10
|
+
|
|
11
|
+
its(:pitch) { should == :medium }
|
|
12
|
+
its(:contour) { should == 'something' }
|
|
13
|
+
its(:range) { should == '20Hz' }
|
|
14
|
+
its(:rate) { should == 2 }
|
|
15
|
+
its(:duration) { should == 10.seconds }
|
|
16
|
+
its(:volume) { should == :loud }
|
|
17
|
+
end
|
|
18
|
+
|
|
19
|
+
it 'registers itself' do
|
|
20
|
+
Element.class_from_registration(:prosody).should == Prosody
|
|
21
|
+
end
|
|
22
|
+
|
|
23
|
+
describe "from a document" do
|
|
24
|
+
let(:document) { '<prosody pitch="medium" contour="something" range="20Hz" rate="2" duration="10" volume="loud"/>' }
|
|
25
|
+
|
|
26
|
+
subject { Element.import document }
|
|
27
|
+
|
|
28
|
+
it { should be_instance_of Prosody }
|
|
29
|
+
|
|
30
|
+
its(:pitch) { should == :medium }
|
|
31
|
+
its(:contour) { should == 'something' }
|
|
32
|
+
its(:range) { should == '20Hz' }
|
|
33
|
+
its(:rate) { should == 2 }
|
|
34
|
+
its(:duration) { should == 10.seconds }
|
|
35
|
+
its(:volume) { should == :loud }
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
describe "#pitch" do
|
|
39
|
+
context "with a pre-defined value" do
|
|
40
|
+
before { subject.pitch = :medium }
|
|
41
|
+
|
|
42
|
+
its(:pitch) { should == :medium }
|
|
43
|
+
|
|
44
|
+
it "with a valid value" do
|
|
45
|
+
lambda { subject.pitch = :'x-low' }.should_not raise_error
|
|
46
|
+
lambda { subject.pitch = :low }.should_not raise_error
|
|
47
|
+
lambda { subject.pitch = :medium }.should_not raise_error
|
|
48
|
+
lambda { subject.pitch = :high }.should_not raise_error
|
|
49
|
+
lambda { subject.pitch = :'x-high' }.should_not raise_error
|
|
50
|
+
lambda { subject.pitch = :default }.should_not raise_error
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
it "with an invalid value" do
|
|
54
|
+
lambda { subject.pitch = :something }.should raise_error(ArgumentError, "You must specify a valid pitch (\"[positive-number]Hz\", :\"x-low\", :low, :medium, :high, :\"x-high\", :default)")
|
|
55
|
+
end
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
context "with a Hertz value" do
|
|
59
|
+
describe "with a valid value" do
|
|
60
|
+
before { subject.pitch = '440Hz' }
|
|
61
|
+
|
|
62
|
+
its(:pitch) { should == '440Hz' }
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
it "with a negative value" do
|
|
66
|
+
lambda { subject.pitch = "-100Hz" }.should raise_error(ArgumentError, "You must specify a valid pitch (\"[positive-number]Hz\", :\"x-low\", :low, :medium, :high, :\"x-high\", :default)")
|
|
67
|
+
end
|
|
68
|
+
|
|
69
|
+
it "when missing 'hz'" do
|
|
70
|
+
lambda { subject.pitch = "440" }.should raise_error(ArgumentError, "You must specify a valid pitch (\"[positive-number]Hz\", :\"x-low\", :low, :medium, :high, :\"x-high\", :default)")
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
|
|
75
|
+
describe "#contour" do
|
|
76
|
+
before { subject.contour = "blah" }
|
|
77
|
+
|
|
78
|
+
its(:contour) { should == "blah" }
|
|
79
|
+
end
|
|
80
|
+
|
|
81
|
+
describe "#range" do
|
|
82
|
+
context "with a pre-defined value" do
|
|
83
|
+
before { subject.range = :medium }
|
|
84
|
+
|
|
85
|
+
its(:range) { should == :medium }
|
|
86
|
+
|
|
87
|
+
it "with a valid value" do
|
|
88
|
+
lambda { subject.range = :'x-low' }.should_not raise_error
|
|
89
|
+
lambda { subject.range = :low }.should_not raise_error
|
|
90
|
+
lambda { subject.range = :medium }.should_not raise_error
|
|
91
|
+
lambda { subject.range = :high }.should_not raise_error
|
|
92
|
+
lambda { subject.range = :'x-high' }.should_not raise_error
|
|
93
|
+
lambda { subject.range = :default }.should_not raise_error
|
|
94
|
+
end
|
|
95
|
+
|
|
96
|
+
it "with an invalid value" do
|
|
97
|
+
lambda { subject.range = :something }.should raise_error(ArgumentError, "You must specify a valid range (\"[positive-number]Hz\", :\"x-low\", :low, :medium, :high, :\"x-high\", :default)")
|
|
98
|
+
end
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
context "with a Hertz value" do
|
|
102
|
+
describe "with a valid value" do
|
|
103
|
+
before { subject.range = '440Hz' }
|
|
104
|
+
|
|
105
|
+
its(:range) { should == '440Hz' }
|
|
106
|
+
end
|
|
107
|
+
|
|
108
|
+
it "with a negative value" do
|
|
109
|
+
lambda { subject.range = "-100Hz" }.should raise_error(ArgumentError, "You must specify a valid range (\"[positive-number]Hz\", :\"x-low\", :low, :medium, :high, :\"x-high\", :default)")
|
|
110
|
+
end
|
|
111
|
+
|
|
112
|
+
it "when missing 'hz'" do
|
|
113
|
+
lambda { subject.range = "440" }.should raise_error(ArgumentError, "You must specify a valid range (\"[positive-number]Hz\", :\"x-low\", :low, :medium, :high, :\"x-high\", :default)")
|
|
114
|
+
end
|
|
115
|
+
end
|
|
116
|
+
end
|
|
117
|
+
|
|
118
|
+
describe "#rate" do
|
|
119
|
+
context "with a pre-defined value" do
|
|
120
|
+
before { subject.rate = :medium }
|
|
121
|
+
|
|
122
|
+
its(:rate) { should == :medium }
|
|
123
|
+
|
|
124
|
+
it "with a valid value" do
|
|
125
|
+
lambda { subject.rate = :'x-slow' }.should_not raise_error
|
|
126
|
+
lambda { subject.rate = :slow }.should_not raise_error
|
|
127
|
+
lambda { subject.rate = :medium }.should_not raise_error
|
|
128
|
+
lambda { subject.rate = :fast }.should_not raise_error
|
|
129
|
+
lambda { subject.rate = :'x-fast' }.should_not raise_error
|
|
130
|
+
lambda { subject.rate = :default }.should_not raise_error
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
it "with an invalid value" do
|
|
134
|
+
lambda { subject.rate = :something }.should raise_error(ArgumentError, "You must specify a valid rate ([positive-number](multiplier), :\"x-slow\", :slow, :medium, :fast, :\"x-fast\", :default)")
|
|
135
|
+
end
|
|
136
|
+
end
|
|
137
|
+
|
|
138
|
+
context "with a multiplier value" do
|
|
139
|
+
describe "with a valid value" do
|
|
140
|
+
before { subject.rate = 1.5 }
|
|
141
|
+
|
|
142
|
+
its(:rate) { should == 1.5 }
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
it "with a negative value" do
|
|
146
|
+
lambda { subject.rate = -100 }.should raise_error(ArgumentError, "You must specify a valid rate ([positive-number](multiplier), :\"x-slow\", :slow, :medium, :fast, :\"x-fast\", :default)")
|
|
147
|
+
end
|
|
148
|
+
end
|
|
149
|
+
end
|
|
150
|
+
|
|
151
|
+
describe "#duration" do
|
|
152
|
+
context "with a valid value" do
|
|
153
|
+
before { subject.duration = 3.seconds }
|
|
154
|
+
|
|
155
|
+
its(:duration) { should == 3.seconds }
|
|
156
|
+
end
|
|
157
|
+
|
|
158
|
+
context "with a negative value" do
|
|
159
|
+
it do
|
|
160
|
+
lambda { subject.duration = -3.seconds }.should raise_error(ArgumentError, "You must specify a valid duration (positive float value in seconds)")
|
|
161
|
+
end
|
|
162
|
+
end
|
|
163
|
+
|
|
164
|
+
context "with an invalid value" do
|
|
165
|
+
it do
|
|
166
|
+
lambda { subject.duration = 'blah' }.should raise_error(ArgumentError, "You must specify a valid duration (positive float value in seconds)")
|
|
167
|
+
end
|
|
168
|
+
end
|
|
169
|
+
end
|
|
170
|
+
|
|
171
|
+
describe "#volume" do
|
|
172
|
+
context "with a pre-defined value" do
|
|
173
|
+
before { subject.volume = :medium }
|
|
174
|
+
|
|
175
|
+
its(:volume) { should == :medium }
|
|
176
|
+
|
|
177
|
+
it "with a valid value" do
|
|
178
|
+
lambda { subject.volume = :silent }.should_not raise_error
|
|
179
|
+
lambda { subject.volume = :'x-soft' }.should_not raise_error
|
|
180
|
+
lambda { subject.volume = :soft }.should_not raise_error
|
|
181
|
+
lambda { subject.volume = :medium }.should_not raise_error
|
|
182
|
+
lambda { subject.volume = :loud }.should_not raise_error
|
|
183
|
+
lambda { subject.volume = :'x-loud' }.should_not raise_error
|
|
184
|
+
lambda { subject.volume = :default }.should_not raise_error
|
|
185
|
+
end
|
|
186
|
+
|
|
187
|
+
it "with an invalid value" do
|
|
188
|
+
lambda { subject.volume = :something }.should raise_error(ArgumentError, "You must specify a valid volume ([positive-number](0.0 -> 100.0), :silent, :\"x-soft\", :soft, :medium, :loud, :\"x-loud\", :default)")
|
|
189
|
+
end
|
|
190
|
+
end
|
|
191
|
+
|
|
192
|
+
context "with a multiplier" do
|
|
193
|
+
describe "with a valid value" do
|
|
194
|
+
before { subject.volume = 1.5 }
|
|
195
|
+
|
|
196
|
+
its(:volume) { should == 1.5 }
|
|
197
|
+
end
|
|
198
|
+
|
|
199
|
+
it "with a negative value" do
|
|
200
|
+
lambda { subject.volume = -1.5 }.should raise_error(ArgumentError, "You must specify a valid volume ([positive-number](0.0 -> 100.0), :silent, :\"x-soft\", :soft, :medium, :loud, :\"x-loud\", :default)")
|
|
201
|
+
lambda { subject.volume = 100.5 }.should raise_error(ArgumentError, "You must specify a valid volume ([positive-number](0.0 -> 100.0), :silent, :\"x-soft\", :soft, :medium, :loud, :\"x-loud\", :default)")
|
|
202
|
+
end
|
|
203
|
+
end
|
|
204
|
+
end
|
|
205
|
+
|
|
206
|
+
describe "comparing objects" do
|
|
207
|
+
it "should be equal if the content, strength and base uri are the same" do
|
|
208
|
+
Prosody.new(:pitch => :medium, :contour => "something", :range => '20Hz', :rate => 2, :duration => 10.seconds, :volume => :loud, :content => "Hello there").should == Prosody.new(:pitch => :medium, :contour => "something", :range => '20Hz', :rate => 2, :duration => 10.seconds, :volume => :loud, :content => "Hello there")
|
|
209
|
+
end
|
|
210
|
+
|
|
211
|
+
describe "when the content is different" do
|
|
212
|
+
it "should not be equal" do
|
|
213
|
+
Prosody.new(:content => "Hello").should_not == Prosody.new(:content => "Hello there")
|
|
214
|
+
end
|
|
215
|
+
end
|
|
216
|
+
|
|
217
|
+
describe "when the pitch is different" do
|
|
218
|
+
it "should not be equal" do
|
|
219
|
+
Prosody.new(:pitch => :medium).should_not == Prosody.new(:pitch => :high)
|
|
220
|
+
end
|
|
221
|
+
end
|
|
222
|
+
|
|
223
|
+
describe "when the contour is different" do
|
|
224
|
+
it "should not be equal" do
|
|
225
|
+
Prosody.new(:contour => 'foo').should_not == Prosody.new(:contour => 'bar')
|
|
226
|
+
end
|
|
227
|
+
end
|
|
228
|
+
|
|
229
|
+
describe "when the range is different" do
|
|
230
|
+
it "should not be equal" do
|
|
231
|
+
Prosody.new(:range => '20Hz').should_not == Prosody.new(:range => '30Hz')
|
|
232
|
+
end
|
|
233
|
+
end
|
|
234
|
+
|
|
235
|
+
describe "when the rate is different" do
|
|
236
|
+
it "should not be equal" do
|
|
237
|
+
Prosody.new(:rate => 2).should_not == Prosody.new(:rate => 3)
|
|
238
|
+
end
|
|
239
|
+
end
|
|
240
|
+
|
|
241
|
+
describe "when the duration is different" do
|
|
242
|
+
it "should not be equal" do
|
|
243
|
+
Prosody.new(:duration => 10.seconds).should_not == Prosody.new(:duration => 20.seconds)
|
|
244
|
+
end
|
|
245
|
+
end
|
|
246
|
+
|
|
247
|
+
describe "when the volume is different" do
|
|
248
|
+
it "should not be equal" do
|
|
249
|
+
Prosody.new(:volume => :loud).should_not == Prosody.new(:volume => :soft)
|
|
250
|
+
end
|
|
251
|
+
end
|
|
252
|
+
end
|
|
253
|
+
|
|
254
|
+
describe "<<" do
|
|
255
|
+
it "should accept String" do
|
|
256
|
+
lambda { subject << 'anything' }.should_not raise_error
|
|
257
|
+
end
|
|
258
|
+
|
|
259
|
+
it "should accept Audio" do
|
|
260
|
+
lambda { subject << Audio.new }.should_not raise_error
|
|
261
|
+
end
|
|
262
|
+
|
|
263
|
+
it "should accept Break" do
|
|
264
|
+
lambda { subject << Break.new }.should_not raise_error
|
|
265
|
+
end
|
|
266
|
+
|
|
267
|
+
it "should accept Emphasis" do
|
|
268
|
+
lambda { subject << Emphasis.new }.should_not raise_error
|
|
269
|
+
end
|
|
270
|
+
|
|
271
|
+
it "should accept Mark" do
|
|
272
|
+
lambda { subject << Mark.new }.should_not raise_error
|
|
273
|
+
end
|
|
274
|
+
|
|
275
|
+
it "should accept P" do
|
|
276
|
+
lambda { subject << P.new }.should_not raise_error
|
|
277
|
+
end
|
|
278
|
+
|
|
279
|
+
it "should accept Phoneme" do
|
|
280
|
+
lambda { subject << Phoneme.new }.should_not raise_error
|
|
281
|
+
end
|
|
282
|
+
|
|
283
|
+
it "should accept Prosody" do
|
|
284
|
+
lambda { subject << Prosody.new }.should_not raise_error
|
|
285
|
+
end
|
|
286
|
+
|
|
287
|
+
it "should accept S" do
|
|
288
|
+
lambda { subject << S.new }.should_not raise_error
|
|
289
|
+
end
|
|
290
|
+
|
|
291
|
+
it "should accept SayAs" do
|
|
292
|
+
lambda { subject << SayAs.new(:interpret_as => :foo) }.should_not raise_error
|
|
293
|
+
end
|
|
294
|
+
|
|
295
|
+
it "should accept Sub" do
|
|
296
|
+
lambda { subject << Sub.new }.should_not raise_error
|
|
297
|
+
end
|
|
298
|
+
|
|
299
|
+
it "should accept Voice" do
|
|
300
|
+
lambda { subject << Voice.new }.should_not raise_error
|
|
301
|
+
end
|
|
302
|
+
|
|
303
|
+
it "should raise InvalidChildError with non-acceptable objects" do
|
|
304
|
+
lambda { subject << 1 }.should raise_error(InvalidChildError, "A Prosody can only accept String, Audio, Break, Emphasis, Mark, P, Phoneme, Prosody, SayAs, Sub, S, Voice as children")
|
|
305
|
+
end
|
|
306
|
+
end
|
|
307
|
+
end # Prosody
|
|
308
|
+
end # SSML
|
|
309
|
+
end # RubySpeech
|
|
@@ -0,0 +1,92 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
module RubySpeech
|
|
4
|
+
module SSML
|
|
5
|
+
describe S do
|
|
6
|
+
its(:name) { should == 's' }
|
|
7
|
+
|
|
8
|
+
describe "setting options in initializers" do
|
|
9
|
+
subject { S.new :language => 'jp' }
|
|
10
|
+
|
|
11
|
+
its(:language) { should == 'jp' }
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
it 'registers itself' do
|
|
15
|
+
Element.class_from_registration(:s).should == S
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
describe "from a document" do
|
|
19
|
+
let(:document) { '<s>foo</s>' }
|
|
20
|
+
|
|
21
|
+
subject { Element.import document }
|
|
22
|
+
|
|
23
|
+
it { should be_instance_of S }
|
|
24
|
+
its(:content) { should == 'foo' }
|
|
25
|
+
end
|
|
26
|
+
|
|
27
|
+
describe "comparing objects" do
|
|
28
|
+
it "should be equal if the content and language are the same" do
|
|
29
|
+
S.new(:language => 'jp', :content => "Hello there").should == S.new(:language => 'jp', :content => "Hello there")
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
describe "when the content is different" do
|
|
33
|
+
it "should not be equal" do
|
|
34
|
+
S.new(:content => "Hello").should_not == S.new(:content => "Hello there")
|
|
35
|
+
end
|
|
36
|
+
end
|
|
37
|
+
|
|
38
|
+
describe "when the language is different" do
|
|
39
|
+
it "should not be equal" do
|
|
40
|
+
S.new(:language => 'jp').should_not == S.new(:language => 'en')
|
|
41
|
+
end
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
describe "<<" do
|
|
46
|
+
it "should accept String" do
|
|
47
|
+
lambda { subject << 'anything' }.should_not raise_error
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
it "should accept Audio" do
|
|
51
|
+
lambda { subject << Audio.new }.should_not raise_error
|
|
52
|
+
end
|
|
53
|
+
|
|
54
|
+
it "should accept Break" do
|
|
55
|
+
lambda { subject << Break.new }.should_not raise_error
|
|
56
|
+
end
|
|
57
|
+
|
|
58
|
+
it "should accept Emphasis" do
|
|
59
|
+
lambda { subject << Emphasis.new }.should_not raise_error
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
it "should accept Mark" do
|
|
63
|
+
lambda { subject << Mark.new }.should_not raise_error
|
|
64
|
+
end
|
|
65
|
+
|
|
66
|
+
it "should accept Phoneme" do
|
|
67
|
+
lambda { subject << Phoneme.new }.should_not raise_error
|
|
68
|
+
end
|
|
69
|
+
|
|
70
|
+
it "should accept Prosody" do
|
|
71
|
+
lambda { subject << Prosody.new }.should_not raise_error
|
|
72
|
+
end
|
|
73
|
+
|
|
74
|
+
it "should accept SayAs" do
|
|
75
|
+
lambda { subject << SayAs.new(:interpret_as => :foo) }.should_not raise_error
|
|
76
|
+
end
|
|
77
|
+
|
|
78
|
+
it "should accept Sub" do
|
|
79
|
+
lambda { subject << Sub.new }.should_not raise_error
|
|
80
|
+
end
|
|
81
|
+
|
|
82
|
+
it "should accept Voice" do
|
|
83
|
+
lambda { subject << Voice.new }.should_not raise_error
|
|
84
|
+
end
|
|
85
|
+
|
|
86
|
+
it "should raise InvalidChildError with non-acceptable objects" do
|
|
87
|
+
lambda { subject << 1 }.should raise_error(InvalidChildError, "An S can only accept String, Audio, Break, Emphasis, Mark, Phoneme, Prosody, SayAs, Sub, Voice as children")
|
|
88
|
+
end
|
|
89
|
+
end
|
|
90
|
+
end # S
|
|
91
|
+
end # SSML
|
|
92
|
+
end # RubySpeech
|
|
@@ -0,0 +1,71 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
module RubySpeech
|
|
4
|
+
module SSML
|
|
5
|
+
describe SayAs do
|
|
6
|
+
subject { SayAs.new :interpret_as => 'one', :format => 'two', :detail => 'three' }
|
|
7
|
+
|
|
8
|
+
its(:name) { should == 'say-as' }
|
|
9
|
+
|
|
10
|
+
its(:interpret_as) { should == 'one' }
|
|
11
|
+
its(:format) { should == 'two' }
|
|
12
|
+
its(:detail) { should == 'three' }
|
|
13
|
+
|
|
14
|
+
it 'registers itself' do
|
|
15
|
+
Element.class_from_registration(:'say-as').should == SayAs
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
describe "from a document" do
|
|
19
|
+
let(:document) { '<say-as interpret-as="one" format="two" detail="three"/>' }
|
|
20
|
+
|
|
21
|
+
subject { Element.import document }
|
|
22
|
+
|
|
23
|
+
it { should be_instance_of SayAs }
|
|
24
|
+
|
|
25
|
+
its(:interpret_as) { should == 'one' }
|
|
26
|
+
its(:format) { should == 'two' }
|
|
27
|
+
its(:detail) { should == 'three' }
|
|
28
|
+
end
|
|
29
|
+
|
|
30
|
+
describe "comparing objects" do
|
|
31
|
+
it "should be equal if the content, interpret_as, format, age, variant, name are the same" do
|
|
32
|
+
SayAs.new(:interpret_as => 'jp', :format => 'foo', :detail => 'bar', :content => "hello").should == SayAs.new(:interpret_as => 'jp', :format => 'foo', :detail => 'bar', :content => "hello")
|
|
33
|
+
end
|
|
34
|
+
|
|
35
|
+
describe "when the content is different" do
|
|
36
|
+
it "should not be equal" do
|
|
37
|
+
SayAs.new(:interpret_as => 'jp', :content => "Hello").should_not == SayAs.new(:interpret_as => 'jp', :content => "Hello there")
|
|
38
|
+
end
|
|
39
|
+
end
|
|
40
|
+
|
|
41
|
+
describe "when the interpret_as is different" do
|
|
42
|
+
it "should not be equal" do
|
|
43
|
+
SayAs.new(:interpret_as => "Hello").should_not == SayAs.new(:interpret_as => "Hello there")
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
|
|
47
|
+
describe "when the format is different" do
|
|
48
|
+
it "should not be equal" do
|
|
49
|
+
SayAs.new(:interpret_as => 'jp', :format => 'foo').should_not == SayAs.new(:interpret_as => 'jp', :format => 'bar')
|
|
50
|
+
end
|
|
51
|
+
end
|
|
52
|
+
|
|
53
|
+
describe "when the detail is different" do
|
|
54
|
+
it "should not be equal" do
|
|
55
|
+
SayAs.new(:interpret_as => 'jp', :detail => 'foo').should_not == SayAs.new(:interpret_as => 'jp', :detail => 'bar')
|
|
56
|
+
end
|
|
57
|
+
end
|
|
58
|
+
end
|
|
59
|
+
|
|
60
|
+
describe "<<" do
|
|
61
|
+
it "should accept String" do
|
|
62
|
+
lambda { subject << 'anything' }.should_not raise_error
|
|
63
|
+
end
|
|
64
|
+
|
|
65
|
+
it "should raise InvalidChildError with non-acceptable objects" do
|
|
66
|
+
lambda { subject << Voice.new }.should raise_error(InvalidChildError, "A SayAs can only accept Strings as children")
|
|
67
|
+
end
|
|
68
|
+
end
|
|
69
|
+
end # SayAs
|
|
70
|
+
end # SSML
|
|
71
|
+
end # RubySpeech
|
|
@@ -0,0 +1,166 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
module RubySpeech
|
|
4
|
+
module SSML
|
|
5
|
+
describe Speak do
|
|
6
|
+
it { should be_a_valid_ssml_document }
|
|
7
|
+
|
|
8
|
+
its(:name) { should == 'speak' }
|
|
9
|
+
its(:language) { should == 'en-US' }
|
|
10
|
+
|
|
11
|
+
describe "setting options in initializers" do
|
|
12
|
+
subject { Speak.new :language => 'jp', :base_uri => 'blah' }
|
|
13
|
+
|
|
14
|
+
its(:language) { should == 'jp' }
|
|
15
|
+
its(:base_uri) { should == 'blah' }
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
it 'registers itself' do
|
|
19
|
+
Element.class_from_registration(:speak).should == Speak
|
|
20
|
+
end
|
|
21
|
+
|
|
22
|
+
describe "from a document" do
|
|
23
|
+
let(:document) { '<speak xmlns="http://www.w3.org/2001/10/synthesis" version="1.0" xml:lang="jp" xml:base="blah"/>' }
|
|
24
|
+
|
|
25
|
+
subject { Element.import document }
|
|
26
|
+
|
|
27
|
+
it { should be_instance_of Speak }
|
|
28
|
+
|
|
29
|
+
its(:language) { should == 'jp' }
|
|
30
|
+
its(:base_uri) { should == 'blah' }
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
describe "#language" do
|
|
34
|
+
before { subject.language = 'jp' }
|
|
35
|
+
|
|
36
|
+
its(:language) { should == 'jp' }
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
describe "#base_uri" do
|
|
40
|
+
before { subject.base_uri = 'blah' }
|
|
41
|
+
|
|
42
|
+
its(:base_uri) { should == 'blah' }
|
|
43
|
+
end
|
|
44
|
+
|
|
45
|
+
describe "comparing objects" do
|
|
46
|
+
it "should be equal if the content, language and base uri are the same" do
|
|
47
|
+
Speak.new(:language => 'en-GB', :base_uri => 'blah', :content => "Hello there").should == Speak.new(:language => 'en-GB', :base_uri => 'blah', :content => "Hello there")
|
|
48
|
+
end
|
|
49
|
+
|
|
50
|
+
describe "when the content is different" do
|
|
51
|
+
it "should not be equal" do
|
|
52
|
+
Speak.new(:content => "Hello").should_not == Speak.new(:content => "Hello there")
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
|
|
56
|
+
describe "when the language is different" do
|
|
57
|
+
it "should not be equal" do
|
|
58
|
+
Speak.new(:language => 'en-US').should_not == Speak.new(:language => 'en-GB')
|
|
59
|
+
end
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
describe "when the base URI is different" do
|
|
63
|
+
it "should not be equal" do
|
|
64
|
+
Speak.new(:base_uri => 'foo').should_not == Speak.new(:base_uri => 'bar')
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
|
|
68
|
+
describe "when the children are different" do
|
|
69
|
+
it "should not be equal" do
|
|
70
|
+
s1 = Speak.new
|
|
71
|
+
s1 << SayAs.new(:interpret_as => 'date')
|
|
72
|
+
s2 = Speak.new
|
|
73
|
+
s2 << SayAs.new(:interpret_as => 'time')
|
|
74
|
+
|
|
75
|
+
s1.should_not == s2
|
|
76
|
+
end
|
|
77
|
+
end
|
|
78
|
+
end
|
|
79
|
+
|
|
80
|
+
it "should allow creating child SSML elements" do
|
|
81
|
+
s = Speak.new
|
|
82
|
+
s.voice :gender => :male, :content => 'Hello'
|
|
83
|
+
expected_s = Speak.new
|
|
84
|
+
expected_s << Voice.new(:gender => :male, :content => 'Hello')
|
|
85
|
+
s.should == expected_s
|
|
86
|
+
end
|
|
87
|
+
|
|
88
|
+
describe "<<" do
|
|
89
|
+
it "should accept String" do
|
|
90
|
+
lambda { subject << 'anything' }.should_not raise_error
|
|
91
|
+
end
|
|
92
|
+
|
|
93
|
+
it "should accept Audio" do
|
|
94
|
+
lambda { subject << Audio.new }.should_not raise_error
|
|
95
|
+
end
|
|
96
|
+
|
|
97
|
+
it "should accept Break" do
|
|
98
|
+
lambda { subject << Break.new }.should_not raise_error
|
|
99
|
+
end
|
|
100
|
+
|
|
101
|
+
it "should accept Emphasis" do
|
|
102
|
+
lambda { subject << Emphasis.new }.should_not raise_error
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
it "should accept Mark" do
|
|
106
|
+
lambda { subject << Mark.new }.should_not raise_error
|
|
107
|
+
end
|
|
108
|
+
|
|
109
|
+
it "should accept P" do
|
|
110
|
+
lambda { subject << P.new }.should_not raise_error
|
|
111
|
+
end
|
|
112
|
+
|
|
113
|
+
it "should accept Phoneme" do
|
|
114
|
+
lambda { subject << Phoneme.new }.should_not raise_error
|
|
115
|
+
end
|
|
116
|
+
|
|
117
|
+
it "should accept Prosody" do
|
|
118
|
+
lambda { subject << Prosody.new }.should_not raise_error
|
|
119
|
+
end
|
|
120
|
+
|
|
121
|
+
it "should accept SayAs" do
|
|
122
|
+
lambda { subject << SayAs.new(:interpret_as => :foo) }.should_not raise_error
|
|
123
|
+
end
|
|
124
|
+
|
|
125
|
+
it "should accept Sub" do
|
|
126
|
+
lambda { subject << Sub.new }.should_not raise_error
|
|
127
|
+
end
|
|
128
|
+
|
|
129
|
+
it "should accept S" do
|
|
130
|
+
lambda { subject << S.new }.should_not raise_error
|
|
131
|
+
end
|
|
132
|
+
|
|
133
|
+
it "should accept Voice" do
|
|
134
|
+
lambda { subject << Voice.new }.should_not raise_error
|
|
135
|
+
end
|
|
136
|
+
|
|
137
|
+
it "should raise InvalidChildError with non-acceptable objects" do
|
|
138
|
+
lambda { subject << 1 }.should raise_error(InvalidChildError, "A Speak can only accept String, Audio, Break, Emphasis, Mark, P, Phoneme, Prosody, SayAs, Sub, S, Voice as children")
|
|
139
|
+
end
|
|
140
|
+
end
|
|
141
|
+
|
|
142
|
+
describe "#to_doc" do
|
|
143
|
+
it "should create an XML document from the grammar" do
|
|
144
|
+
subject.to_doc.should == subject.document
|
|
145
|
+
end
|
|
146
|
+
end
|
|
147
|
+
|
|
148
|
+
it "should allow concatenation" do
|
|
149
|
+
speak1 = Speak.new
|
|
150
|
+
speak1 << Voice.new(:name => 'frank', :content => "Hi, I'm Frank")
|
|
151
|
+
speak2 = Speak.new
|
|
152
|
+
speak2 << "Hello there"
|
|
153
|
+
speak2 << Voice.new(:name => 'millie', :content => "Hi, I'm Millie")
|
|
154
|
+
|
|
155
|
+
expected_concat = Speak.new
|
|
156
|
+
expected_concat << Voice.new(:name => 'frank', :content => "Hi, I'm Frank")
|
|
157
|
+
expected_concat << "Hello there"
|
|
158
|
+
expected_concat << Voice.new(:name => 'millie', :content => "Hi, I'm Millie")
|
|
159
|
+
|
|
160
|
+
concat = (speak1 + speak2)
|
|
161
|
+
concat.should == expected_concat
|
|
162
|
+
concat.to_s.should_not include('default')
|
|
163
|
+
end
|
|
164
|
+
end # Speak
|
|
165
|
+
end # SSML
|
|
166
|
+
end # RubySpeech
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
require 'spec_helper'
|
|
2
|
+
|
|
3
|
+
module RubySpeech
|
|
4
|
+
module SSML
|
|
5
|
+
describe Sub do
|
|
6
|
+
its(:name) { should == 'sub' }
|
|
7
|
+
|
|
8
|
+
describe "setting options in initializers" do
|
|
9
|
+
subject { Sub.new :alias => 'foo' }
|
|
10
|
+
|
|
11
|
+
its(:alias) { should == 'foo' }
|
|
12
|
+
end
|
|
13
|
+
|
|
14
|
+
it 'registers itself' do
|
|
15
|
+
Element.class_from_registration(:sub).should == Sub
|
|
16
|
+
end
|
|
17
|
+
|
|
18
|
+
describe "from a document" do
|
|
19
|
+
let(:document) { '<sub alias="foo"/>' }
|
|
20
|
+
|
|
21
|
+
subject { Element.import document }
|
|
22
|
+
|
|
23
|
+
it { should be_instance_of Sub }
|
|
24
|
+
|
|
25
|
+
its(:alias) { should == 'foo' }
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
describe "comparing objects" do
|
|
29
|
+
it "should be equal if the content and alias are the same" do
|
|
30
|
+
Sub.new(:alias => 'jp', :content => "Hello there").should == Sub.new(:alias => 'jp', :content => "Hello there")
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
describe "when the content is different" do
|
|
34
|
+
it "should not be equal" do
|
|
35
|
+
Sub.new(:content => "Hello").should_not == Sub.new(:content => "Hello there")
|
|
36
|
+
end
|
|
37
|
+
end
|
|
38
|
+
|
|
39
|
+
describe "when the alias is different" do
|
|
40
|
+
it "should not be equal" do
|
|
41
|
+
Sub.new(:alias => 'jp').should_not == Sub.new(:alias => 'en')
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
|
|
46
|
+
describe "<<" do
|
|
47
|
+
it "should accept String" do
|
|
48
|
+
lambda { subject << 'anything' }.should_not raise_error
|
|
49
|
+
end
|
|
50
|
+
|
|
51
|
+
it "should raise InvalidChildError with non-acceptable objects" do
|
|
52
|
+
lambda { subject << Voice.new }.should raise_error(InvalidChildError, "A Sub can only accept Strings as children")
|
|
53
|
+
end
|
|
54
|
+
end
|
|
55
|
+
end # Desc
|
|
56
|
+
end # SSML
|
|
57
|
+
end # RubySpeech
|