ruby_speech 2.1.0-java
Sign up to get free protection for your applications and to get access to all the features.
- 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,17 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module RubySpeech
|
4
|
+
module GRXML
|
5
|
+
describe MaxMatch do
|
6
|
+
it_behaves_like "match"
|
7
|
+
|
8
|
+
it { should be_a Match }
|
9
|
+
|
10
|
+
describe "equality" do
|
11
|
+
it "should never be equal to a MaxMatch" do
|
12
|
+
described_class.new.should_not eql(Match.new)
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module RubySpeech
|
4
|
+
module GRXML
|
5
|
+
describe NoMatch do
|
6
|
+
describe "equality" do
|
7
|
+
it "should be equal to another NoMatch" do
|
8
|
+
NoMatch.new.should == NoMatch.new
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should not equal a match" do
|
12
|
+
NoMatch.new.should_not == Match.new
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,49 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module RubySpeech
|
4
|
+
module GRXML
|
5
|
+
describe OneOf do
|
6
|
+
its(:name) { should == 'one-of' }
|
7
|
+
|
8
|
+
it 'registers itself' do
|
9
|
+
Element.class_from_registration(:'one-of').should == OneOf
|
10
|
+
end
|
11
|
+
|
12
|
+
describe "from a document" do
|
13
|
+
let(:document) { '<one-of> <item>test</item> </one-of>' }
|
14
|
+
|
15
|
+
subject { Element.import document }
|
16
|
+
|
17
|
+
it { should be_instance_of OneOf }
|
18
|
+
end
|
19
|
+
|
20
|
+
describe "#language" do
|
21
|
+
before { subject.language = 'fr-CA' }
|
22
|
+
|
23
|
+
its(:language) { should == 'fr-CA' }
|
24
|
+
end
|
25
|
+
|
26
|
+
describe "<<" do
|
27
|
+
it "should accept Item" do
|
28
|
+
lambda { subject << Item.new }.should_not raise_error
|
29
|
+
end
|
30
|
+
|
31
|
+
it "should raise InvalidChildError with non-acceptable objects" do
|
32
|
+
lambda { subject << 1 }.should raise_error(InvalidChildError, "A OneOf can only accept Item as children")
|
33
|
+
end
|
34
|
+
end
|
35
|
+
|
36
|
+
describe "comparing objects" do
|
37
|
+
it "should be equal if the language (when specified) is the same" do
|
38
|
+
OneOf.new(:language => "jp").should == OneOf.new(:language => "jp")
|
39
|
+
end
|
40
|
+
|
41
|
+
describe "when the language is different" do
|
42
|
+
it "should not be equal" do
|
43
|
+
OneOf.new(:language => "jp").should_not == OneOf.new(:content => "fr-CA")
|
44
|
+
end
|
45
|
+
end
|
46
|
+
end
|
47
|
+
end # OneOf
|
48
|
+
end # GRXML
|
49
|
+
end # RubySpeech
|
@@ -0,0 +1,17 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module RubySpeech
|
4
|
+
module GRXML
|
5
|
+
describe PotentialMatch do
|
6
|
+
describe "equality" do
|
7
|
+
it "should be equal to another PotentialMatch" do
|
8
|
+
PotentialMatch.new.should == PotentialMatch.new
|
9
|
+
end
|
10
|
+
|
11
|
+
it "should not equal a match" do
|
12
|
+
PotentialMatch.new.should_not == Match.new
|
13
|
+
end
|
14
|
+
end
|
15
|
+
end
|
16
|
+
end
|
17
|
+
end
|
@@ -0,0 +1,125 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module RubySpeech
|
4
|
+
module GRXML
|
5
|
+
describe Rule do
|
6
|
+
subject { Rule.new :id => 'one', :scope => 'public' }
|
7
|
+
|
8
|
+
its(:name) { should == 'rule' }
|
9
|
+
|
10
|
+
its(:id) { should == :one }
|
11
|
+
its(:scope) { should == :public }
|
12
|
+
|
13
|
+
it 'registers itself' do
|
14
|
+
Element.class_from_registration(:rule).should == Rule
|
15
|
+
end
|
16
|
+
|
17
|
+
describe "from a document" do
|
18
|
+
let(:document) { '<rule id="one" scope="public"> <item /> </rule>' }
|
19
|
+
|
20
|
+
subject { Element.import document }
|
21
|
+
|
22
|
+
it { should be_instance_of Rule }
|
23
|
+
|
24
|
+
its(:id) { should == :one }
|
25
|
+
its(:scope) { should == :public }
|
26
|
+
end
|
27
|
+
|
28
|
+
describe "#language" do
|
29
|
+
before { subject.language = 'jp' }
|
30
|
+
|
31
|
+
its(:language) { should == 'jp' }
|
32
|
+
end
|
33
|
+
|
34
|
+
describe "#id" do
|
35
|
+
before { subject.id = :main }
|
36
|
+
|
37
|
+
its(:id) { should == :main }
|
38
|
+
|
39
|
+
context "without an id" do
|
40
|
+
before { subject.id = nil }
|
41
|
+
pending
|
42
|
+
end
|
43
|
+
|
44
|
+
context "with a non-unique id" do
|
45
|
+
pending 'this should probably go into the grammar spec'
|
46
|
+
end
|
47
|
+
end
|
48
|
+
|
49
|
+
describe "#scope" do
|
50
|
+
before { subject.scope = :public }
|
51
|
+
|
52
|
+
its(:scope) { should == :public }
|
53
|
+
|
54
|
+
it "with a valid scope" do
|
55
|
+
lambda { subject.scope = :public }.should_not raise_error
|
56
|
+
lambda { subject.scope = :private }.should_not raise_error
|
57
|
+
end
|
58
|
+
|
59
|
+
it "with an invalid scope" do
|
60
|
+
lambda { subject.scope = :something }.should raise_error(ArgumentError, "A Rule's scope can only be 'public' or 'private'")
|
61
|
+
end
|
62
|
+
end
|
63
|
+
|
64
|
+
describe "comparing objects" do
|
65
|
+
it "should be equal if the content, language, id, and scope are the same" do
|
66
|
+
Rule.new(:language => 'jp', :id => :main, :scope => :public, :content => "hello").should == Rule.new(:language => 'jp', :id => :main, :scope => :public, :content => "hello")
|
67
|
+
end
|
68
|
+
|
69
|
+
describe "when the content is different" do
|
70
|
+
it "should not be equal" do
|
71
|
+
Rule.new(:content => "Hello").should_not == Rule.new(:content => "Hello there")
|
72
|
+
end
|
73
|
+
end
|
74
|
+
|
75
|
+
describe "when the language is different" do
|
76
|
+
it "should not be equal" do
|
77
|
+
Rule.new(:language => "jp").should_not == Rule.new(:language => "esperanto")
|
78
|
+
end
|
79
|
+
end
|
80
|
+
|
81
|
+
describe "when the id is different" do
|
82
|
+
it "should not be equal" do
|
83
|
+
Rule.new(:id => :main).should_not == Rule.new(:id => :dtmf)
|
84
|
+
end
|
85
|
+
end
|
86
|
+
|
87
|
+
describe "when the scope is different" do
|
88
|
+
it "should not be equal" do
|
89
|
+
Rule.new(:scope => :public).should_not == Rule.new(:scope => :private)
|
90
|
+
end
|
91
|
+
end
|
92
|
+
end
|
93
|
+
|
94
|
+
describe "<<" do
|
95
|
+
it "should accept String" do
|
96
|
+
lambda { subject << 'anything' }.should_not raise_error
|
97
|
+
end
|
98
|
+
|
99
|
+
it "should accept OneOf" do
|
100
|
+
lambda { subject << OneOf.new }.should_not raise_error
|
101
|
+
end
|
102
|
+
|
103
|
+
it "should accept Item" do
|
104
|
+
lambda { subject << Item.new }.should_not raise_error
|
105
|
+
end
|
106
|
+
|
107
|
+
it "should accept Ruleref" do
|
108
|
+
lambda { subject << Ruleref.new }.should_not raise_error
|
109
|
+
end
|
110
|
+
|
111
|
+
it "should accept Tag" do
|
112
|
+
lambda { subject << Tag.new }.should_not raise_error
|
113
|
+
end
|
114
|
+
|
115
|
+
it "should accept Token" do
|
116
|
+
lambda { subject << Token.new }.should_not raise_error
|
117
|
+
end
|
118
|
+
end
|
119
|
+
|
120
|
+
it "should raise ArgumentError with any other scope" do
|
121
|
+
lambda { Rule.new :id => 'one', :scope => 'invalid_scope' }.should raise_error(ArgumentError, "A Rule's scope can only be 'public' or 'private'")
|
122
|
+
end
|
123
|
+
end # Rule
|
124
|
+
end # GRXML
|
125
|
+
end # RubySpeech
|
@@ -0,0 +1,55 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module RubySpeech
|
4
|
+
module GRXML
|
5
|
+
describe Ruleref do
|
6
|
+
subject { Ruleref.new :uri => '#testrule' }
|
7
|
+
|
8
|
+
its(:name) { should == 'ruleref' }
|
9
|
+
its(:uri) { should == '#testrule' }
|
10
|
+
|
11
|
+
it 'registers itself' do
|
12
|
+
Element.class_from_registration(:ruleref).should == Ruleref
|
13
|
+
end
|
14
|
+
|
15
|
+
describe "from a document" do
|
16
|
+
let(:document) { '<ruleref uri="#one" />' }
|
17
|
+
|
18
|
+
subject { Element.import document }
|
19
|
+
|
20
|
+
it { should be_instance_of Ruleref }
|
21
|
+
|
22
|
+
its(:uri) { should == '#one' }
|
23
|
+
end
|
24
|
+
|
25
|
+
describe "#special" do
|
26
|
+
subject { Ruleref.new }
|
27
|
+
|
28
|
+
context "with reserved values" do
|
29
|
+
it "with a valid value" do
|
30
|
+
lambda { subject.special = :NULL }.should_not raise_error
|
31
|
+
lambda { subject.special = :VOID }.should_not raise_error
|
32
|
+
lambda { subject.special = 'GARBAGE' }.should_not raise_error
|
33
|
+
end
|
34
|
+
it "with an invalid value" do
|
35
|
+
lambda { subject.special = :SOMETHINGELSE }.should raise_error
|
36
|
+
end
|
37
|
+
end
|
38
|
+
end
|
39
|
+
|
40
|
+
describe "#uri" do
|
41
|
+
it "allows implict, explicit and external references" do
|
42
|
+
lambda { subject.uri = '#dtmf' }.should_not raise_error
|
43
|
+
lambda { subject.uri = '../test.grxml' }.should_not raise_error
|
44
|
+
lambda { subject.uri = 'http://grammar.example.com/world-cities.grxml#canada' }.should_not raise_error
|
45
|
+
end
|
46
|
+
end
|
47
|
+
|
48
|
+
describe "only uri or special can be specified" do
|
49
|
+
it "should raise an error" do
|
50
|
+
lambda { subject << Ruleref.new(:uri => '#test', :special => :NULL) }.should raise_error(ArgumentError, "A Ruleref can only take uri or special")
|
51
|
+
end
|
52
|
+
end
|
53
|
+
end # Ruleref
|
54
|
+
end # GRXML
|
55
|
+
end # RubySpeech
|
@@ -0,0 +1,41 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module RubySpeech
|
4
|
+
module GRXML
|
5
|
+
describe Tag do
|
6
|
+
its(:name) { should == 'tag' }
|
7
|
+
|
8
|
+
it 'registers itself' do
|
9
|
+
Element.class_from_registration(:tag).should == Tag
|
10
|
+
end
|
11
|
+
|
12
|
+
describe "from a document" do
|
13
|
+
let(:document) { '<tag>hello</tag>' }
|
14
|
+
|
15
|
+
subject { Element.import document }
|
16
|
+
|
17
|
+
it { should be_instance_of Tag }
|
18
|
+
|
19
|
+
its(:content) { should == 'hello' }
|
20
|
+
end
|
21
|
+
|
22
|
+
describe "comparing objects" do
|
23
|
+
it "should be equal if the content is the same" do
|
24
|
+
Tag.new(:content => "hello").should == Tag.new(:content => "hello")
|
25
|
+
end
|
26
|
+
|
27
|
+
describe "when the content is different" do
|
28
|
+
it "should not be equal" do
|
29
|
+
Tag.new(:content => "Hello").should_not == Tag.new(:content => "Hello there")
|
30
|
+
end
|
31
|
+
end
|
32
|
+
end
|
33
|
+
|
34
|
+
describe "<<" do
|
35
|
+
it "should accept String" do
|
36
|
+
lambda { subject << 'anything' }.should_not raise_error
|
37
|
+
end
|
38
|
+
end
|
39
|
+
end # Tag
|
40
|
+
end # GRXML
|
41
|
+
end # RubySpeech
|
@@ -0,0 +1,62 @@
|
|
1
|
+
require 'spec_helper'
|
2
|
+
|
3
|
+
module RubySpeech
|
4
|
+
module GRXML
|
5
|
+
describe Token do
|
6
|
+
its(:name) { should == 'token' }
|
7
|
+
|
8
|
+
it 'registers itself' do
|
9
|
+
Element.class_from_registration(:token).should == Token
|
10
|
+
end
|
11
|
+
|
12
|
+
describe "from a document" do
|
13
|
+
let(:document) { '<token>hello</token>' }
|
14
|
+
|
15
|
+
subject { Element.import document }
|
16
|
+
|
17
|
+
it { should be_instance_of Token }
|
18
|
+
|
19
|
+
its(:content) { should == 'hello' }
|
20
|
+
end
|
21
|
+
|
22
|
+
describe "#language" do
|
23
|
+
before { subject.language = 'jp' }
|
24
|
+
|
25
|
+
its(:language) { should == 'jp' }
|
26
|
+
end
|
27
|
+
|
28
|
+
describe "#normalize_whitespace" do
|
29
|
+
it "should remove leading & trailing whitespace and collapse multiple spaces down to 1" do
|
30
|
+
element = Element.import '<token> Welcome to San Francisco </token>'
|
31
|
+
|
32
|
+
element.normalize_whitespace
|
33
|
+
|
34
|
+
element.content.should == 'Welcome to San Francisco'
|
35
|
+
end
|
36
|
+
end
|
37
|
+
|
38
|
+
describe "comparing objects" do
|
39
|
+
it "should be equal if the content is the same" do
|
40
|
+
Token.new(:content => "hello").should == Token.new(:content => "hello")
|
41
|
+
end
|
42
|
+
|
43
|
+
describe "when the content is different" do
|
44
|
+
it "should not be equal" do
|
45
|
+
Token.new(:content => "Hello").should_not == Token.new(:content => "Hello there")
|
46
|
+
end
|
47
|
+
end
|
48
|
+
end
|
49
|
+
|
50
|
+
describe "<<" do
|
51
|
+
it "should accept String" do
|
52
|
+
lambda { subject << 'anything' }.should_not raise_error
|
53
|
+
end
|
54
|
+
|
55
|
+
it "should allow chaining" do
|
56
|
+
subject << 'foo' << 'bar'
|
57
|
+
subject.content.should == 'foobar'
|
58
|
+
end
|
59
|
+
end
|
60
|
+
end # Token
|
61
|
+
end # GRXML
|
62
|
+
end # RubySpeech
|