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.
- data/.gitignore +7 -0
- data/.rspec +3 -0
- data/CHANGELOG.md +2 -0
- data/Gemfile +4 -0
- data/LICENSE.md +20 -0
- data/README.md +76 -0
- data/Rakefile +22 -0
- data/assets/synthesis-core.xsd +442 -0
- data/assets/synthesis.xsd +63 -0
- data/assets/xml.xsd +287 -0
- data/lib/ruby_speech.rb +15 -0
- data/lib/ruby_speech/ssml.rb +24 -0
- data/lib/ruby_speech/ssml/break.rb +71 -0
- data/lib/ruby_speech/ssml/element.rb +26 -0
- data/lib/ruby_speech/ssml/emphasis.rb +53 -0
- data/lib/ruby_speech/ssml/prosody.rb +180 -0
- data/lib/ruby_speech/ssml/say_as.rb +109 -0
- data/lib/ruby_speech/ssml/speak.rb +57 -0
- data/lib/ruby_speech/ssml/voice.rb +125 -0
- data/lib/ruby_speech/version.rb +3 -0
- data/lib/ruby_speech/xml.rb +7 -0
- data/lib/ruby_speech/xml/language.rb +13 -0
- data/ruby_speech.gemspec +31 -0
- data/spec/ruby_speech/ssml/break_spec.rb +85 -0
- data/spec/ruby_speech/ssml/emphasis_spec.rb +100 -0
- data/spec/ruby_speech/ssml/prosody_spec.rb +286 -0
- data/spec/ruby_speech/ssml/say_as_spec.rb +61 -0
- data/spec/ruby_speech/ssml/speak_spec.rb +123 -0
- data/spec/ruby_speech/ssml/voice_spec.rb +188 -0
- data/spec/ruby_speech/ssml_spec.rb +65 -0
- data/spec/spec_helper.rb +20 -0
- data/spec/support/matchers.rb +45 -0
- metadata +232 -0
data/ruby_speech.gemspec
ADDED
@@ -0,0 +1,31 @@
|
|
1
|
+
# -*- encoding: utf-8 -*-
|
2
|
+
$:.push File.expand_path("../lib", __FILE__)
|
3
|
+
require "ruby_speech/version"
|
4
|
+
|
5
|
+
Gem::Specification.new do |s|
|
6
|
+
s.name = "ruby_speech"
|
7
|
+
s.version = RubySpeech::VERSION
|
8
|
+
s.authors = ["Ben Langfeld"]
|
9
|
+
s.email = ["ben@langfeld.me"]
|
10
|
+
s.homepage = "https://github.com/mojolingo/ruby_speech"
|
11
|
+
s.summary = %q{A ruby library for TTS & ASR document preparation}
|
12
|
+
s.description = %q{Prepare SSML and GRXML documents with ease}
|
13
|
+
|
14
|
+
s.rubyforge_project = "ruby_speech"
|
15
|
+
|
16
|
+
s.files = `git ls-files`.split("\n")
|
17
|
+
s.test_files = `git ls-files -- {test,spec,features}/*`.split("\n")
|
18
|
+
s.executables = `git ls-files -- bin/*`.split("\n").map{ |f| File.basename(f) }
|
19
|
+
s.require_paths = ["lib"]
|
20
|
+
|
21
|
+
s.add_runtime_dependency %q<niceogiri>, [">= 0.0.4"]
|
22
|
+
s.add_runtime_dependency %q<activesupport>, [">= 3.0.7"]
|
23
|
+
|
24
|
+
s.add_development_dependency %q<bundler>, ["~> 1.0.0"]
|
25
|
+
s.add_development_dependency %q<rspec>, ["~> 2.3.0"]
|
26
|
+
s.add_development_dependency %q<ci_reporter>, [">= 1.6.3"]
|
27
|
+
s.add_development_dependency %q<yard>, ["~> 0.6.0"]
|
28
|
+
s.add_development_dependency %q<rake>, [">= 0"]
|
29
|
+
s.add_development_dependency %q<mocha>, [">= 0"]
|
30
|
+
s.add_development_dependency %q<i18n>, [">= 0"]
|
31
|
+
end
|
@@ -0,0 +1,85 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module RubySpeech
|
4
|
+
module SSML
|
5
|
+
describe Break do
|
6
|
+
its(:name) { should == 'break' }
|
7
|
+
|
8
|
+
describe "setting options in initializers" do
|
9
|
+
subject { Break.new :strength => :strong, :time => 3.seconds }
|
10
|
+
|
11
|
+
its(:strength) { should == :strong }
|
12
|
+
its(:time) { should == 3.seconds }
|
13
|
+
end
|
14
|
+
|
15
|
+
describe "#strength" do
|
16
|
+
before { subject.strength = :strong }
|
17
|
+
|
18
|
+
its(:strength) { should == :strong }
|
19
|
+
|
20
|
+
it "with a valid level" do
|
21
|
+
lambda { subject.strength = :none }.should_not raise_error
|
22
|
+
lambda { subject.strength = :'x-weak' }.should_not raise_error
|
23
|
+
lambda { subject.strength = :weak }.should_not raise_error
|
24
|
+
lambda { subject.strength = :medium }.should_not raise_error
|
25
|
+
lambda { subject.strength = :strong }.should_not raise_error
|
26
|
+
lambda { subject.strength = :'x-strong' }.should_not raise_error
|
27
|
+
end
|
28
|
+
|
29
|
+
it "with an invalid strength" do
|
30
|
+
lambda { subject.strength = :something }.should raise_error(ArgumentError, "You must specify a valid strength (:none, :\"x-weak\", :weak, :medium, :strong, :\"x-strong\")")
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe "#time" do
|
35
|
+
context "with a valid value" do
|
36
|
+
before { subject.time = 3.seconds }
|
37
|
+
|
38
|
+
its(:time) { should == 3.seconds }
|
39
|
+
end
|
40
|
+
|
41
|
+
context "with a negative value" do
|
42
|
+
it do
|
43
|
+
lambda { subject.time = -3.seconds }.should raise_error(ArgumentError, "You must specify a valid time (positive float value in seconds)")
|
44
|
+
end
|
45
|
+
end
|
46
|
+
|
47
|
+
context "with an invalid value" do
|
48
|
+
it do
|
49
|
+
lambda { subject.time = 'blah' }.should raise_error(ArgumentError, "You must specify a valid time (positive float value in seconds)")
|
50
|
+
end
|
51
|
+
end
|
52
|
+
end
|
53
|
+
|
54
|
+
describe "<<" do
|
55
|
+
it "should always raise InvalidChildError" do
|
56
|
+
lambda { subject << 'anything' }.should raise_error(InvalidChildError, "A Break cannot contain children")
|
57
|
+
end
|
58
|
+
end
|
59
|
+
|
60
|
+
describe "comparing objects" do
|
61
|
+
it "should be equal if the content, strength and base uri are the same" do
|
62
|
+
Break.new(strength: :strong, time: 1.second, content: "Hello there").should == Break.new(strength: :strong, time: 1.second, content: "Hello there")
|
63
|
+
end
|
64
|
+
|
65
|
+
describe "when the content is different" do
|
66
|
+
it "should not be equal" do
|
67
|
+
Break.new(content: "Hello").should_not == Break.new(content: "Hello there")
|
68
|
+
end
|
69
|
+
end
|
70
|
+
|
71
|
+
describe "when the strength is different" do
|
72
|
+
it "should not be equal" do
|
73
|
+
Break.new(strength: :strong).should_not == Break.new(strength: :weak)
|
74
|
+
end
|
75
|
+
end
|
76
|
+
|
77
|
+
describe "when the time is different" do
|
78
|
+
it "should not be equal" do
|
79
|
+
Break.new(time: 1.second).should_not == Break.new(time: 2.seconds)
|
80
|
+
end
|
81
|
+
end
|
82
|
+
end
|
83
|
+
end # Break
|
84
|
+
end # SSML
|
85
|
+
end # RubySpeech
|
@@ -0,0 +1,100 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module RubySpeech
|
4
|
+
module SSML
|
5
|
+
describe Emphasis do
|
6
|
+
its(:name) { should == 'emphasis' }
|
7
|
+
|
8
|
+
describe "setting options in initializers" do
|
9
|
+
subject { Emphasis.new :level => :strong }
|
10
|
+
|
11
|
+
its(:level) { should == :strong }
|
12
|
+
end
|
13
|
+
|
14
|
+
describe "#level" do
|
15
|
+
before { subject.level = :strong }
|
16
|
+
|
17
|
+
its(:level) { should == :strong }
|
18
|
+
|
19
|
+
it "with a valid level" do
|
20
|
+
lambda { subject.level = :strong }.should_not raise_error
|
21
|
+
lambda { subject.level = :moderate }.should_not raise_error
|
22
|
+
lambda { subject.level = :none }.should_not raise_error
|
23
|
+
lambda { subject.level = :reduced }.should_not raise_error
|
24
|
+
end
|
25
|
+
|
26
|
+
it "with an invalid level" do
|
27
|
+
lambda { subject.level = :something }.should raise_error(ArgumentError, "You must specify a valid level (:strong, :moderate, :none, :reduced)")
|
28
|
+
end
|
29
|
+
end
|
30
|
+
|
31
|
+
describe "comparing objects" do
|
32
|
+
it "should be equal if the content and level are the same" do
|
33
|
+
Emphasis.new(level: :strong, content: "Hello there").should == Emphasis.new(level: :strong, content: "Hello there")
|
34
|
+
end
|
35
|
+
|
36
|
+
describe "when the content is different" do
|
37
|
+
it "should not be equal" do
|
38
|
+
Emphasis.new(content: "Hello").should_not == Emphasis.new(content: "Hello there")
|
39
|
+
end
|
40
|
+
end
|
41
|
+
|
42
|
+
describe "when the level is different" do
|
43
|
+
it "should not be equal" do
|
44
|
+
Emphasis.new(level: :strong).should_not == Emphasis.new(level: :reduced)
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
describe "<<" do
|
50
|
+
it "should accept String" do
|
51
|
+
lambda { subject << 'anything' }.should_not raise_error
|
52
|
+
end
|
53
|
+
|
54
|
+
it "should accept Audio" do
|
55
|
+
pending
|
56
|
+
lambda { subject << Audio.new }.should_not raise_error
|
57
|
+
end
|
58
|
+
|
59
|
+
it "should accept Break" do
|
60
|
+
lambda { subject << Break.new }.should_not raise_error
|
61
|
+
end
|
62
|
+
|
63
|
+
it "should accept Emphasis" do
|
64
|
+
lambda { subject << Emphasis.new }.should_not raise_error
|
65
|
+
end
|
66
|
+
|
67
|
+
it "should accept Mark" do
|
68
|
+
pending
|
69
|
+
lambda { subject << Mark.new }.should_not raise_error
|
70
|
+
end
|
71
|
+
|
72
|
+
it "should accept Phoneme" do
|
73
|
+
pending
|
74
|
+
lambda { subject << Phoneme.new }.should_not raise_error
|
75
|
+
end
|
76
|
+
|
77
|
+
it "should accept Prosody" do
|
78
|
+
lambda { subject << Prosody.new }.should_not raise_error
|
79
|
+
end
|
80
|
+
|
81
|
+
it "should accept SayAs" do
|
82
|
+
lambda { subject << SayAs.new(:interpret_as => :foo) }.should_not raise_error
|
83
|
+
end
|
84
|
+
|
85
|
+
it "should accept Sub" do
|
86
|
+
pending
|
87
|
+
lambda { subject << Sub.new }.should_not raise_error
|
88
|
+
end
|
89
|
+
|
90
|
+
it "should accept Voice" do
|
91
|
+
lambda { subject << Voice.new }.should_not raise_error
|
92
|
+
end
|
93
|
+
|
94
|
+
it "should raise InvalidChildError with non-acceptable objects" do
|
95
|
+
lambda { subject << 1 }.should raise_error(InvalidChildError, "An Emphasis can only accept String, Audio, Break, Emphasis, Mark, Phoneme, Prosody, SayAs, Sub, Voice as children")
|
96
|
+
end
|
97
|
+
end
|
98
|
+
end # Emphasis
|
99
|
+
end # SSML
|
100
|
+
end # RubySpeech
|
@@ -0,0 +1,286 @@
|
|
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
|
+
describe "#pitch" do
|
20
|
+
context "with a pre-defined value" do
|
21
|
+
before { subject.pitch = :medium }
|
22
|
+
|
23
|
+
its(:pitch) { should == :medium }
|
24
|
+
|
25
|
+
it "with a valid value" do
|
26
|
+
lambda { subject.pitch = :'x-low' }.should_not raise_error
|
27
|
+
lambda { subject.pitch = :low }.should_not raise_error
|
28
|
+
lambda { subject.pitch = :medium }.should_not raise_error
|
29
|
+
lambda { subject.pitch = :high }.should_not raise_error
|
30
|
+
lambda { subject.pitch = :'x-high' }.should_not raise_error
|
31
|
+
lambda { subject.pitch = :default }.should_not raise_error
|
32
|
+
end
|
33
|
+
|
34
|
+
it "with an invalid value" do
|
35
|
+
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)")
|
36
|
+
end
|
37
|
+
end
|
38
|
+
|
39
|
+
context "with a Hertz value" do
|
40
|
+
describe "with a valid value" do
|
41
|
+
before { subject.pitch = '440Hz' }
|
42
|
+
|
43
|
+
its(:pitch) { should == '440Hz' }
|
44
|
+
end
|
45
|
+
|
46
|
+
it "with a negative value" do
|
47
|
+
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)")
|
48
|
+
end
|
49
|
+
|
50
|
+
it "when missing 'hz'" do
|
51
|
+
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)")
|
52
|
+
end
|
53
|
+
end
|
54
|
+
end
|
55
|
+
|
56
|
+
describe "#contour" do
|
57
|
+
before { subject.contour = "blah" }
|
58
|
+
|
59
|
+
its(:contour) { should == "blah" }
|
60
|
+
end
|
61
|
+
|
62
|
+
describe "#range" do
|
63
|
+
context "with a pre-defined value" do
|
64
|
+
before { subject.range = :medium }
|
65
|
+
|
66
|
+
its(:range) { should == :medium }
|
67
|
+
|
68
|
+
it "with a valid value" do
|
69
|
+
lambda { subject.range = :'x-low' }.should_not raise_error
|
70
|
+
lambda { subject.range = :low }.should_not raise_error
|
71
|
+
lambda { subject.range = :medium }.should_not raise_error
|
72
|
+
lambda { subject.range = :high }.should_not raise_error
|
73
|
+
lambda { subject.range = :'x-high' }.should_not raise_error
|
74
|
+
lambda { subject.range = :default }.should_not raise_error
|
75
|
+
end
|
76
|
+
|
77
|
+
it "with an invalid value" do
|
78
|
+
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)")
|
79
|
+
end
|
80
|
+
end
|
81
|
+
|
82
|
+
context "with a Hertz value" do
|
83
|
+
describe "with a valid value" do
|
84
|
+
before { subject.range = '440Hz' }
|
85
|
+
|
86
|
+
its(:range) { should == '440Hz' }
|
87
|
+
end
|
88
|
+
|
89
|
+
it "with a negative value" do
|
90
|
+
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)")
|
91
|
+
end
|
92
|
+
|
93
|
+
it "when missing 'hz'" do
|
94
|
+
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)")
|
95
|
+
end
|
96
|
+
end
|
97
|
+
end
|
98
|
+
|
99
|
+
describe "#rate" do
|
100
|
+
context "with a pre-defined value" do
|
101
|
+
before { subject.rate = :medium }
|
102
|
+
|
103
|
+
its(:rate) { should == :medium }
|
104
|
+
|
105
|
+
it "with a valid value" do
|
106
|
+
lambda { subject.rate = :'x-slow' }.should_not raise_error
|
107
|
+
lambda { subject.rate = :slow }.should_not raise_error
|
108
|
+
lambda { subject.rate = :medium }.should_not raise_error
|
109
|
+
lambda { subject.rate = :fast }.should_not raise_error
|
110
|
+
lambda { subject.rate = :'x-fast' }.should_not raise_error
|
111
|
+
lambda { subject.rate = :default }.should_not raise_error
|
112
|
+
end
|
113
|
+
|
114
|
+
it "with an invalid value" do
|
115
|
+
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)")
|
116
|
+
end
|
117
|
+
end
|
118
|
+
|
119
|
+
context "with a multiplier value" do
|
120
|
+
describe "with a valid value" do
|
121
|
+
before { subject.rate = 1.5 }
|
122
|
+
|
123
|
+
its(:rate) { should == 1.5 }
|
124
|
+
end
|
125
|
+
|
126
|
+
it "with a negative value" do
|
127
|
+
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)")
|
128
|
+
end
|
129
|
+
end
|
130
|
+
end
|
131
|
+
|
132
|
+
describe "#duration" do
|
133
|
+
context "with a valid value" do
|
134
|
+
before { subject.duration = 3.seconds }
|
135
|
+
|
136
|
+
its(:duration) { should == 3.seconds }
|
137
|
+
end
|
138
|
+
|
139
|
+
context "with a negative value" do
|
140
|
+
it do
|
141
|
+
lambda { subject.duration = -3.seconds }.should raise_error(ArgumentError, "You must specify a valid duration (positive float value in seconds)")
|
142
|
+
end
|
143
|
+
end
|
144
|
+
|
145
|
+
context "with an invalid value" do
|
146
|
+
it do
|
147
|
+
lambda { subject.duration = 'blah' }.should raise_error(ArgumentError, "You must specify a valid duration (positive float value in seconds)")
|
148
|
+
end
|
149
|
+
end
|
150
|
+
end
|
151
|
+
|
152
|
+
describe "#volume" do
|
153
|
+
context "with a pre-defined value" do
|
154
|
+
before { subject.volume = :medium }
|
155
|
+
|
156
|
+
its(:volume) { should == :medium }
|
157
|
+
|
158
|
+
it "with a valid value" do
|
159
|
+
lambda { subject.volume = :silent }.should_not raise_error
|
160
|
+
lambda { subject.volume = :'x-soft' }.should_not raise_error
|
161
|
+
lambda { subject.volume = :soft }.should_not raise_error
|
162
|
+
lambda { subject.volume = :medium }.should_not raise_error
|
163
|
+
lambda { subject.volume = :loud }.should_not raise_error
|
164
|
+
lambda { subject.volume = :'x-loud' }.should_not raise_error
|
165
|
+
lambda { subject.volume = :default }.should_not raise_error
|
166
|
+
end
|
167
|
+
|
168
|
+
it "with an invalid value" do
|
169
|
+
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)")
|
170
|
+
end
|
171
|
+
end
|
172
|
+
|
173
|
+
context "with a multiplier" do
|
174
|
+
describe "with a valid value" do
|
175
|
+
before { subject.volume = 1.5 }
|
176
|
+
|
177
|
+
its(:volume) { should == 1.5 }
|
178
|
+
end
|
179
|
+
|
180
|
+
it "with a negative value" do
|
181
|
+
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)")
|
182
|
+
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)")
|
183
|
+
end
|
184
|
+
end
|
185
|
+
end
|
186
|
+
|
187
|
+
describe "comparing objects" do
|
188
|
+
it "should be equal if the content, strength and base uri are the same" do
|
189
|
+
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")
|
190
|
+
end
|
191
|
+
|
192
|
+
describe "when the content is different" do
|
193
|
+
it "should not be equal" do
|
194
|
+
Prosody.new(content: "Hello").should_not == Prosody.new(content: "Hello there")
|
195
|
+
end
|
196
|
+
end
|
197
|
+
|
198
|
+
describe "when the pitch is different" do
|
199
|
+
it "should not be equal" do
|
200
|
+
Prosody.new(pitch: :medium).should_not == Prosody.new(pitch: :high)
|
201
|
+
end
|
202
|
+
end
|
203
|
+
|
204
|
+
describe "when the contour is different" do
|
205
|
+
it "should not be equal" do
|
206
|
+
Prosody.new(contour: 'foo').should_not == Prosody.new(contour: 'bar')
|
207
|
+
end
|
208
|
+
end
|
209
|
+
|
210
|
+
describe "when the range is different" do
|
211
|
+
it "should not be equal" do
|
212
|
+
Prosody.new(range: '20Hz').should_not == Prosody.new(range: '30Hz')
|
213
|
+
end
|
214
|
+
end
|
215
|
+
|
216
|
+
describe "when the rate is different" do
|
217
|
+
it "should not be equal" do
|
218
|
+
Prosody.new(rate: 2).should_not == Prosody.new(rate: 3)
|
219
|
+
end
|
220
|
+
end
|
221
|
+
|
222
|
+
describe "when the duration is different" do
|
223
|
+
it "should not be equal" do
|
224
|
+
Prosody.new(duration: 10.seconds).should_not == Prosody.new(duration: 20.seconds)
|
225
|
+
end
|
226
|
+
end
|
227
|
+
|
228
|
+
describe "when the volume is different" do
|
229
|
+
it "should not be equal" do
|
230
|
+
Prosody.new(volume: :loud).should_not == Prosody.new(volume: :soft)
|
231
|
+
end
|
232
|
+
end
|
233
|
+
end
|
234
|
+
|
235
|
+
describe "<<" do
|
236
|
+
it "should accept String" do
|
237
|
+
lambda { subject << 'anything' }.should_not raise_error
|
238
|
+
end
|
239
|
+
|
240
|
+
it "should accept Audio" do
|
241
|
+
pending
|
242
|
+
lambda { subject << Audio.new }.should_not raise_error
|
243
|
+
end
|
244
|
+
|
245
|
+
it "should accept Break" do
|
246
|
+
lambda { subject << Break.new }.should_not raise_error
|
247
|
+
end
|
248
|
+
|
249
|
+
it "should accept Emphasis" do
|
250
|
+
lambda { subject << Emphasis.new }.should_not raise_error
|
251
|
+
end
|
252
|
+
|
253
|
+
it "should accept Mark" do
|
254
|
+
pending
|
255
|
+
lambda { subject << Mark.new }.should_not raise_error
|
256
|
+
end
|
257
|
+
|
258
|
+
it "should accept Phoneme" do
|
259
|
+
pending
|
260
|
+
lambda { subject << Phoneme.new }.should_not raise_error
|
261
|
+
end
|
262
|
+
|
263
|
+
it "should accept Prosody" do
|
264
|
+
lambda { subject << Prosody.new }.should_not raise_error
|
265
|
+
end
|
266
|
+
|
267
|
+
it "should accept SayAs" do
|
268
|
+
lambda { subject << SayAs.new(:interpret_as => :foo) }.should_not raise_error
|
269
|
+
end
|
270
|
+
|
271
|
+
it "should accept Sub" do
|
272
|
+
pending
|
273
|
+
lambda { subject << Sub.new }.should_not raise_error
|
274
|
+
end
|
275
|
+
|
276
|
+
it "should accept Voice" do
|
277
|
+
lambda { subject << Voice.new }.should_not raise_error
|
278
|
+
end
|
279
|
+
|
280
|
+
it "should raise InvalidChildError with non-acceptable objects" do
|
281
|
+
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")
|
282
|
+
end
|
283
|
+
end
|
284
|
+
end # Prosody
|
285
|
+
end # SSML
|
286
|
+
end # RubySpeech
|