ruby_speech 2.3.2-java → 2.4.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.
- checksums.yaml +4 -4
- data/.travis.yml +29 -8
- data/CHANGELOG.md +6 -0
- data/README.md +8 -8
- data/ext/ruby_speech/RubySpeechGRXMLMatcher.java +1 -1
- data/ext/ruby_speech/RubySpeechService.java +1 -1
- data/ext/ruby_speech/extconf.rb +1 -1
- data/lib/ruby_speech/grxml.rb +2 -0
- data/lib/ruby_speech/grxml/builtins.rb +18 -11
- data/lib/ruby_speech/grxml/grammar.rb +26 -4
- data/lib/ruby_speech/grxml/matcher.rb +1 -1
- data/lib/ruby_speech/ssml/break.rb +1 -2
- data/lib/ruby_speech/ssml/element.rb +13 -1
- data/lib/ruby_speech/ssml/mark.rb +0 -1
- data/lib/ruby_speech/ssml/prosody.rb +8 -5
- data/lib/ruby_speech/version.rb +1 -1
- data/ruby_speech.gemspec +13 -6
- data/spec/ruby_speech/grxml/builtins_spec.rb +22 -13
- data/spec/ruby_speech/grxml/grammar_spec.rb +134 -0
- data/spec/ruby_speech/grxml/matcher_spec.rb +44 -0
- data/spec/ruby_speech/ssml/break_spec.rb +27 -7
- data/spec/ruby_speech/ssml/prosody_spec.rb +21 -3
- data/spec/spec_helper.rb +8 -2
- data/spec/support/dtmf_helper.rb +14 -0
- metadata +108 -79
    
        checksums.yaml
    CHANGED
    
    | @@ -1,7 +1,7 @@ | |
| 1 1 | 
             
            ---
         | 
| 2 2 | 
             
            SHA1:
         | 
| 3 | 
            -
              metadata.gz:  | 
| 4 | 
            -
              data.tar.gz:  | 
| 3 | 
            +
              metadata.gz: 72228f3e968bcd511d58f2504272dda59b04bf83
         | 
| 4 | 
            +
              data.tar.gz: 8570fee51e92363c6096d4aeb9a58b13d16191aa
         | 
| 5 5 | 
             
            SHA512:
         | 
| 6 | 
            -
              metadata.gz:  | 
| 7 | 
            -
              data.tar.gz:  | 
| 6 | 
            +
              metadata.gz: 86362dede47c17045c9f6dd40f701acdf206d2ac67e6f459a4779a3fbd2090c57bdb36eb39e3f9c1aae474ff4a6e46b0bb46f3070ba314e85b942dd4da9dc36d
         | 
| 7 | 
            +
              data.tar.gz: 5fd3ced7cc8c94062a79ea106dac623be9e3de14f4526006c4f8cd6ab0c165b02f7c624543bffb1469ec05f7abd5118512ebf717c1767c357e525610150cdefd
         | 
    
        data/.travis.yml
    CHANGED
    
    | @@ -1,17 +1,38 @@ | |
| 1 1 | 
             
            language: ruby
         | 
| 2 2 |  | 
| 3 | 
            -
            rvm:
         | 
| 4 | 
            -
              - 1.9.3
         | 
| 5 | 
            -
              - 2.0.0
         | 
| 6 | 
            -
              - 2.1.0
         | 
| 7 | 
            -
              - jruby
         | 
| 8 | 
            -
              - rbx
         | 
| 9 | 
            -
              - ruby-head
         | 
| 10 3 | 
             
            matrix:
         | 
| 4 | 
            +
              include:
         | 
| 5 | 
            +
                - rvm: 1.9.3
         | 
| 6 | 
            +
                - rvm: 2.0.0
         | 
| 7 | 
            +
                - rvm: 2.1.0
         | 
| 8 | 
            +
                - rvm: 2.2.0
         | 
| 9 | 
            +
                - rvm: 2.3.0
         | 
| 10 | 
            +
                - rvm: rbx-2
         | 
| 11 | 
            +
                - rvm: rbx-3
         | 
| 12 | 
            +
                - rvm: ruby-head
         | 
| 13 | 
            +
                - rvm: jruby-1.7
         | 
| 14 | 
            +
                  jdk: openjdk7
         | 
| 15 | 
            +
                - rvm: jruby-1.7
         | 
| 16 | 
            +
                  jdk: oraclejdk8
         | 
| 17 | 
            +
                - rvm: jruby-head
         | 
| 18 | 
            +
                  jdk: oraclejdk8
         | 
| 19 | 
            +
                - rvm: jruby-9.1.13.0
         | 
| 20 | 
            +
                  jdk: openjdk7
         | 
| 21 | 
            +
                - rvm: jruby-9.1.13.0
         | 
| 22 | 
            +
                  jdk: oraclejdk8
         | 
| 11 23 | 
             
              allow_failures:
         | 
| 24 | 
            +
                - rvm: rbx-2
         | 
| 25 | 
            +
                - rvm: rbx-3
         | 
| 12 26 | 
             
                - rvm: ruby-head
         | 
| 27 | 
            +
            sudo: false
         | 
| 28 | 
            +
            addons:
         | 
| 29 | 
            +
              apt:
         | 
| 30 | 
            +
                packages:
         | 
| 31 | 
            +
                - libpcre3
         | 
| 32 | 
            +
                - libpcre3-dev
         | 
| 13 33 | 
             
            before_install:
         | 
| 14 | 
            -
              -  | 
| 34 | 
            +
              - gem install bundler
         | 
| 35 | 
            +
            env: JRUBY_OPTS="--server --debug -J-Xss1024k -J-Xmx652m -J-XX:+UseConcMarkSweepGC"
         | 
| 15 36 |  | 
| 16 37 | 
             
            notifications:
         | 
| 17 38 | 
             
              irc: "irc.freenode.org#adhearsion"
         | 
    
        data/CHANGELOG.md
    CHANGED
    
    | @@ -1,5 +1,11 @@ | |
| 1 1 | 
             
            # [develop](https://github.com/benlangfeld/ruby_speech)
         | 
| 2 2 |  | 
| 3 | 
            +
            # [2.4.0](https://github.com/benlangfeld/ruby_speech/compare/v2.3.2...v2.4.0) - [2018-02-23](https://rubygems.org/gems/ruby_speech/versions/2.4.0)
         | 
| 4 | 
            +
              * Feature: Permit percentage rate values for prosody tags
         | 
| 5 | 
            +
              * Bugfix: Rulerefs referenced n-levels deep under Rulerefs should be expanded.
         | 
| 6 | 
            +
              * Bugfix: Optimize performance of built-in number DTMF grammar
         | 
| 7 | 
            +
              * Bugfix: Fix handling of millisecond values
         | 
| 8 | 
            +
             | 
| 3 9 | 
             
            # [2.3.2](https://github.com/benlangfeld/ruby_speech/compare/v2.3.1...v2.3.2) - [2014-04-21](https://rubygems.org/gems/ruby_speech/versions/2.3.2)
         | 
| 4 10 | 
             
              * Bugfix: String nodes should take non-strings and cast to a string (`#to_s`)
         | 
| 5 11 | 
             
              * Bugfix: Cleanly handle NLSML with no input tag
         | 
    
        data/README.md
    CHANGED
    
    | @@ -1,8 +1,8 @@ | |
| 1 1 | 
             
            [](https://rubygems.org/gems/ruby_speech)
         | 
| 2 | 
            -
            [](http://travis-ci.org/adhearsion/ruby_speech)
         | 
| 3 | 
            +
            [](https://gemnasium.com/adhearsion/ruby_speech)
         | 
| 4 | 
            +
            [](https://codeclimate.com/github/adhearsion/ruby_speech)
         | 
| 5 | 
            +
            [](https://coveralls.io/r/adhearsion/ruby_speech)
         | 
| 6 6 |  | 
| 7 7 | 
             
            # RubySpeech
         | 
| 8 8 | 
             
            RubySpeech is a library for constructing and parsing Text to Speech (TTS) and Automatic Speech Recognition (ASR) documents such as [SSML](http://www.w3.org/TR/speech-synthesis), [GRXML](http://www.w3.org/TR/speech-grammar/) and [NLSML](http://www.w3.org/TR/nl-spec/). Such documents can be constructed to be processed by TTS and ASR engines, parsed as the result from such, or used in the implementation of such engines.
         | 
| @@ -331,7 +331,7 @@ document.best_interpretation # => { | |
| 331 331 | 
             
                    }
         | 
| 332 332 | 
             
            ```
         | 
| 333 333 |  | 
| 334 | 
            -
            Check out the [YARD documentation](http://rdoc.info/github/ | 
| 334 | 
            +
            Check out the [YARD documentation](http://rdoc.info/github/adhearsion/ruby_speech/master/frames) for more
         | 
| 335 335 |  | 
| 336 336 | 
             
            ## Features:
         | 
| 337 337 | 
             
            ### SSML
         | 
| @@ -374,10 +374,10 @@ Check out the [YARD documentation](http://rdoc.info/github/benlangfeld/ruby_spee | |
| 374 374 | 
             
            * `<lexicon/>`
         | 
| 375 375 |  | 
| 376 376 | 
             
            ## Links:
         | 
| 377 | 
            -
            * [Source](https://github.com/ | 
| 377 | 
            +
            * [Source](https://github.com/adhearsion/ruby_speech)
         | 
| 378 378 | 
             
            * [Documentation](http://rdoc.info/gems/ruby_speech/frames)
         | 
| 379 | 
            -
            * [Bug Tracker](https://github.com/ | 
| 380 | 
            -
            * [CI](https://travis-ci.org/#!/ | 
| 379 | 
            +
            * [Bug Tracker](https://github.com/adhearsion/ruby_speech/issues)
         | 
| 380 | 
            +
            * [CI](https://travis-ci.org/#!/adhearsion/ruby_speech)
         | 
| 381 381 |  | 
| 382 382 | 
             
            ## Note on Patches/Pull Requests
         | 
| 383 383 |  | 
    
        data/ext/ruby_speech/extconf.rb
    CHANGED
    
    | @@ -3,7 +3,7 @@ require 'mkmf' | |
| 3 3 | 
             
            $LIBS << " -lpcre"
         | 
| 4 4 |  | 
| 5 5 | 
             
            unless find_header('pcre.h')
         | 
| 6 | 
            -
              abort "-----\nPCRE is missing. You must install it as per the README @ https://github.com/ | 
| 6 | 
            +
              abort "-----\nPCRE is missing. You must install it as per the README @ https://github.com/adhearsion/ruby_speech\n-----"
         | 
| 7 7 | 
             
            end
         | 
| 8 8 |  | 
| 9 9 | 
             
            create_makefile 'ruby_speech/ruby_speech'
         | 
    
        data/lib/ruby_speech/grxml.rb
    CHANGED
    
    | @@ -4,6 +4,8 @@ require 'ruby_speech/grxml/element' | |
| 4 4 | 
             
            module RubySpeech
         | 
| 5 5 | 
             
              module GRXML
         | 
| 6 6 | 
             
                InvalidChildError = Class.new StandardError
         | 
| 7 | 
            +
                MissingReferenceError = Class.new StandardError
         | 
| 8 | 
            +
                ReferentialLoopError = Class.new StandardError
         | 
| 7 9 |  | 
| 8 10 | 
             
                GRXML_NAMESPACE = 'http://www.w3.org/2001/06/grammar'
         | 
| 9 11 |  | 
| @@ -57,7 +57,8 @@ module RubySpeech::GRXML::Builtins | |
| 57 57 | 
             
              # @option options [#to_i] :maxlength Maximum length for the string of digits.
         | 
| 58 58 | 
             
              # @option options [#to_i] :length Absolute length for the string of digits.
         | 
| 59 59 | 
             
              #
         | 
| 60 | 
            -
              # @return [RubySpeech::GRXML::Grammar] a grammar for interpreting  | 
| 60 | 
            +
              # @return [RubySpeech::GRXML::Grammar] a grammar for interpreting an integer
         | 
| 61 | 
            +
              #                                      response.
         | 
| 61 62 | 
             
              #
         | 
| 62 63 | 
             
              # @raise [ArgumentError] if any of the length attributes logically conflict
         | 
| 63 64 | 
             
              #
         | 
| @@ -118,22 +119,28 @@ module RubySpeech::GRXML::Builtins | |
| 118 119 | 
             
              def self.number(options = nil)
         | 
| 119 120 | 
             
                RubySpeech::GRXML.draw mode: :dtmf, root: 'number' do
         | 
| 120 121 | 
             
                  rule id: 'number', scope: 'public' do
         | 
| 121 | 
            -
                     | 
| 122 | 
            -
                      ruleref uri: '# | 
| 122 | 
            +
                    one_of do
         | 
| 123 | 
            +
                      item { ruleref uri: '#less_than_one' }
         | 
| 124 | 
            +
                      item { ruleref uri: '#one_or_more' }
         | 
| 123 125 | 
             
                    end
         | 
| 126 | 
            +
                  end
         | 
| 127 | 
            +
             | 
| 128 | 
            +
                  rule id: 'less_than_one' do
         | 
| 129 | 
            +
                    item { '*' }
         | 
| 130 | 
            +
                    item { ruleref uri: '#digit_series' }
         | 
| 131 | 
            +
                  end
         | 
| 132 | 
            +
             | 
| 133 | 
            +
                  rule id: 'one_or_more' do
         | 
| 134 | 
            +
                    item { ruleref uri: '#digit_series' }
         | 
| 124 135 | 
             
                    item repeat: '0-1' do
         | 
| 125 136 | 
             
                      item { '*' }
         | 
| 126 | 
            -
                      item | 
| 127 | 
            -
                        ruleref uri: '#digit'
         | 
| 128 | 
            -
                      end
         | 
| 137 | 
            +
                      item(repeat: '0-1') { ruleref uri: '#digit_series' }
         | 
| 129 138 | 
             
                    end
         | 
| 130 139 | 
             
                  end
         | 
| 131 140 |  | 
| 132 | 
            -
                  rule | 
| 133 | 
            -
             | 
| 134 | 
            -
             | 
| 135 | 
            -
                    end
         | 
| 136 | 
            -
                  end
         | 
| 141 | 
            +
                  rule(id: 'digit_series') { item(repeat: '1-') { ruleref uri: '#digit' } }
         | 
| 142 | 
            +
             | 
| 143 | 
            +
                  rule(id: 'digit') { one_of { 0.upto(9) { |d| item { d.to_s } } } }
         | 
| 137 144 | 
             
                end
         | 
| 138 145 | 
             
              end
         | 
| 139 146 |  | 
| @@ -113,17 +113,39 @@ module RubySpeech | |
| 113 113 | 
             
                  # Replaces rulerefs in the document with a copy of the original rule.
         | 
| 114 114 | 
             
                  # Removes all top level rules except the root rule
         | 
| 115 115 | 
             
                  #
         | 
| 116 | 
            +
                  # @raises [MissingReferenceError] if a ruleref references a rule that is
         | 
| 117 | 
            +
                  #                                 not defined.
         | 
| 118 | 
            +
                  # @raises [ReferentialLoopError] if rulerefs create a referencial cycle.
         | 
| 119 | 
            +
                  #
         | 
| 116 120 | 
             
                  # @return self
         | 
| 117 121 | 
             
                  #
         | 
| 118 122 | 
             
                  def inline!
         | 
| 119 | 
            -
                     | 
| 120 | 
            -
             | 
| 121 | 
            -
                       | 
| 123 | 
            +
                    previous_uris = {}
         | 
| 124 | 
            +
                    loop do
         | 
| 125 | 
            +
                      rule = nil
         | 
| 126 | 
            +
                      uris = {}
         | 
| 127 | 
            +
                      xpath('//ns:ruleref', ns: GRXML_NAMESPACE).each do |ref|
         | 
| 128 | 
            +
                        uri = ref[:uri].sub(/^#/, '')
         | 
| 129 | 
            +
                        uris[uri] = 1
         | 
| 130 | 
            +
                        rule = rule_with_id uri
         | 
| 131 | 
            +
                        unless rule
         | 
| 132 | 
            +
                          raise MissingReferenceError,
         | 
| 133 | 
            +
                                "Ruleref '##{uri}' is referenced but not defined"
         | 
| 134 | 
            +
                        end
         | 
| 135 | 
            +
                        ref.swap rule.dup.children
         | 
| 136 | 
            +
                      end
         | 
| 137 | 
            +
                      break unless rule
         | 
| 138 | 
            +
                      if previous_uris.keys.eql? uris.keys
         | 
| 139 | 
            +
                        raise ReferentialLoopError,
         | 
| 140 | 
            +
                              'GRXML document contains cycles with ruleref(s): ' <<
         | 
| 141 | 
            +
                              uris.keys.join(', ')
         | 
| 142 | 
            +
                      end
         | 
| 143 | 
            +
                      previous_uris = uris
         | 
| 122 144 | 
             
                    end
         | 
| 123 145 |  | 
| 124 146 | 
             
                    query = "./ns:rule[@id!='#{root}']"
         | 
| 125 147 | 
             
                    query += "|./ns:rule[@ns:id!='#{root}']" if Nokogiri.jruby?
         | 
| 126 | 
            -
                    non_root_rules = xpath query, : | 
| 148 | 
            +
                    non_root_rules = xpath query, ns: namespace_href
         | 
| 127 149 | 
             
                    non_root_rules.remove
         | 
| 128 150 |  | 
| 129 151 | 
             
                    self
         | 
| @@ -6,7 +6,7 @@ require 'ruby_speech/ruby_speech' | |
| 6 6 |  | 
| 7 7 | 
             
            if RUBY_PLATFORM =~ /java/
         | 
| 8 8 | 
             
              require 'jruby'
         | 
| 9 | 
            -
              com. | 
| 9 | 
            +
              com.adhearsion.ruby_speech.RubySpeechService.new.basicLoad(JRuby.runtime)
         | 
| 10 10 | 
             
            end
         | 
| 11 11 |  | 
| 12 12 | 
             
            module RubySpeech
         | 
| @@ -36,7 +36,7 @@ module RubySpeech | |
| 36 36 | 
             
                  # @return [Float]
         | 
| 37 37 | 
             
                  #
         | 
| 38 38 | 
             
                  def time
         | 
| 39 | 
            -
                     | 
| 39 | 
            +
                    get_time_attribute :time
         | 
| 40 40 | 
             
                  end
         | 
| 41 41 |  | 
| 42 42 | 
             
                  ##
         | 
| @@ -50,7 +50,6 @@ module RubySpeech | |
| 50 50 |  | 
| 51 51 | 
             
                  def <<(*args)
         | 
| 52 52 | 
             
                    raise InvalidChildError, "A Break cannot contain children"
         | 
| 53 | 
            -
                    super
         | 
| 54 53 | 
             
                  end
         | 
| 55 54 |  | 
| 56 55 | 
             
                  def eql?(o)
         | 
| @@ -23,9 +23,21 @@ module RubySpeech | |
| 23 23 |  | 
| 24 24 | 
             
                  private
         | 
| 25 25 |  | 
| 26 | 
            +
                  def get_time_attribute(key)
         | 
| 27 | 
            +
                    value = read_attr(key)
         | 
| 28 | 
            +
             | 
| 29 | 
            +
                    if value.nil?
         | 
| 30 | 
            +
                      nil
         | 
| 31 | 
            +
                    elsif value.end_with?('ms')
         | 
| 32 | 
            +
                      value.to_f / 1000
         | 
| 33 | 
            +
                    else
         | 
| 34 | 
            +
                      value.to_f
         | 
| 35 | 
            +
                    end
         | 
| 36 | 
            +
                  end
         | 
| 37 | 
            +
             | 
| 26 38 | 
             
                  def set_time_attribute(key, value)
         | 
| 27 39 | 
             
                    raise ArgumentError, "You must specify a valid #{key} (positive float value in seconds)" unless value.is_a?(Numeric) && value >= 0
         | 
| 28 | 
            -
                    self[key] = "#{value}s"
         | 
| 40 | 
            +
                    self[key] = value == value.round ? "#{value.to_i}s" : "#{(value * 1000).to_i}ms"
         | 
| 29 41 | 
             
                  end
         | 
| 30 42 | 
             
                end # Element
         | 
| 31 43 | 
             
              end # SSML
         | 
| @@ -102,27 +102,29 @@ module RubySpeech | |
| 102 102 | 
             
                  end
         | 
| 103 103 |  | 
| 104 104 | 
             
                  ##
         | 
| 105 | 
            -
                  # A change in the speaking rate for the contained text. Legal values are: a relative change or "x-slow", "slow", "medium", "fast", "x-fast", or "default". Labels "x-slow" through "x-fast" represent a sequence of monotonically non-decreasing speaking rates. When a number is used to specify a relative change it acts as a multiplier of the default rate. For example, a value of 1 means no change in speaking rate, a value of 2 means a speaking rate twice the default rate, and a value of 0.5 means a speaking rate of half the default rate. The default rate for a voice depends on the language and dialect and on the personality of the voice. The default rate for a voice should be such that it is experienced as a normal speaking rate for the voice when reading aloud text. Since voices are processor-specific, the default rate will be as well.
         | 
| 105 | 
            +
                  # A change in the speaking rate for the contained text. Legal values are: a relative change or "x-slow", "slow", "medium", "fast", "x-fast", or "default". Labels "x-slow" through "x-fast" represent a sequence of monotonically non-decreasing speaking rates. When a number is used to specify a relative change it acts as a multiplier of the default rate. For example, a value of 1 means no change in speaking rate, a value of 2 means a speaking rate twice the default rate, and a value of 0.5 means a speaking rate of half the default rate. Further, changes can be specified as percentages (e.g. '10%' or '+15%'), but these are the only string entries permitted. The default rate for a voice depends on the language and dialect and on the personality of the voice. The default rate for a voice should be such that it is experienced as a normal speaking rate for the voice when reading aloud text. Since voices are processor-specific, the default rate will be as well.
         | 
| 106 106 | 
             
                  #
         | 
| 107 | 
            -
                  # @return [Symbol, Float]
         | 
| 107 | 
            +
                  # @return [Symbol, Float, String]
         | 
| 108 108 | 
             
                  #
         | 
| 109 109 | 
             
                  def rate
         | 
| 110 110 | 
             
                    value = read_attr :rate
         | 
| 111 111 | 
             
                    return unless value
         | 
| 112 112 | 
             
                    if VALID_RATES.include?(value.to_sym)
         | 
| 113 113 | 
             
                      value.to_sym
         | 
| 114 | 
            +
                    elsif value.include? "%"
         | 
| 115 | 
            +
                      value
         | 
| 114 116 | 
             
                    else
         | 
| 115 117 | 
             
                      value.to_f
         | 
| 116 118 | 
             
                    end
         | 
| 117 119 | 
             
                  end
         | 
| 118 120 |  | 
| 119 121 | 
             
                  ##
         | 
| 120 | 
            -
                  # @param [Symbol, Numeric] v
         | 
| 122 | 
            +
                  # @param [Symbol, Numeric, String] v
         | 
| 121 123 | 
             
                  #
         | 
| 122 124 | 
             
                  # @raises ArgumentError if v is not either a positive Numeric or one of VALID_RATES
         | 
| 123 125 | 
             
                  #
         | 
| 124 126 | 
             
                  def rate=(v)
         | 
| 125 | 
            -
                    raise ArgumentError, "You must specify a valid rate ([positive-number](multiplier), #{VALID_RATES.map(&:inspect).join ', '})" unless (v.is_a?(Numeric) && v >= 0) || VALID_RATES.include?(v)
         | 
| 127 | 
            +
                    raise ArgumentError, "You must specify a valid rate ([positive-number](multiplier), #{VALID_RATES.map(&:inspect).join ', '})" unless (v.is_a?(Numeric) && v >= 0) || VALID_RATES.include?(v) || (v.is_a?(String) && v.include?("%"))
         | 
| 126 128 | 
             
                    self[:rate] = v
         | 
| 127 129 | 
             
                  end
         | 
| 128 130 |  | 
| @@ -132,7 +134,8 @@ module RubySpeech | |
| 132 134 | 
             
                  # @return [Integer]
         | 
| 133 135 | 
             
                  #
         | 
| 134 136 | 
             
                  def duration
         | 
| 135 | 
            -
                     | 
| 137 | 
            +
                    value = get_time_attribute :duration
         | 
| 138 | 
            +
                    value.round if value
         | 
| 136 139 | 
             
                  end
         | 
| 137 140 |  | 
| 138 141 | 
             
                  ##
         | 
    
        data/lib/ruby_speech/version.rb
    CHANGED
    
    
    
        data/ruby_speech.gemspec
    CHANGED
    
    | @@ -7,10 +7,10 @@ Gem::Specification.new do |s| | |
| 7 7 | 
             
              s.version     = RubySpeech::VERSION
         | 
| 8 8 | 
             
              s.authors     = ["Ben Langfeld"]
         | 
| 9 9 | 
             
              s.email       = ["ben@langfeld.me"]
         | 
| 10 | 
            -
              s.homepage    = "https://github.com/ | 
| 10 | 
            +
              s.homepage    = "https://github.com/adhearsion/ruby_speech"
         | 
| 11 11 | 
             
              s.summary     = %q{A Ruby library for TTS & ASR document preparation}
         | 
| 12 12 | 
             
              s.description = %q{Prepare SSML and GRXML documents with ease}
         | 
| 13 | 
            -
             | 
| 13 | 
            +
             | 
| 14 14 | 
             
              s.license = 'MIT'
         | 
| 15 15 |  | 
| 16 16 | 
             
              s.rubyforge_project = "ruby_speech"
         | 
| @@ -27,18 +27,25 @@ Gem::Specification.new do |s| | |
| 27 27 | 
             
                s.extensions = ['ext/ruby_speech/extconf.rb']
         | 
| 28 28 | 
             
              end
         | 
| 29 29 |  | 
| 30 | 
            -
              s.add_runtime_dependency %q<nokogiri>, ["~> 1.6"]
         | 
| 30 | 
            +
              s.add_runtime_dependency %q<nokogiri>, ["~> 1.6.0"]
         | 
| 31 31 | 
             
              s.add_runtime_dependency %q<activesupport>, [">= 3.0.7", "< 5.0.0"]
         | 
| 32 32 |  | 
| 33 33 | 
             
              s.add_development_dependency %q<bundler>, [">= 1.0.0"]
         | 
| 34 | 
            -
              s.add_development_dependency %q<rspec>, [" | 
| 35 | 
            -
              s.add_development_dependency %q< | 
| 34 | 
            +
              s.add_development_dependency %q<rspec>, ["~> 2.99.0"]
         | 
| 35 | 
            +
              s.add_development_dependency %q<rspec-its>, [">= 0"]
         | 
| 36 | 
            +
              s.add_development_dependency %q<ci_reporter>, ["~> 1.6"]
         | 
| 36 37 | 
             
              s.add_development_dependency %q<yard>, [">= 0.7.0"]
         | 
| 37 | 
            -
              s.add_development_dependency %q<rake>, [" | 
| 38 | 
            +
              s.add_development_dependency %q<rake>, ["< 11.0"]
         | 
| 38 39 | 
             
              s.add_development_dependency %q<guard>, [">= 0.9.0"]
         | 
| 39 40 | 
             
              s.add_development_dependency %q<guard-rspec>, [">= 0"]
         | 
| 41 | 
            +
              s.add_development_dependency %q<listen>, ["< 3.1.0"]
         | 
| 40 42 | 
             
              s.add_development_dependency %q<ruby_gntp>, [">= 0"]
         | 
| 41 43 | 
             
              s.add_development_dependency %q<guard-rake>, [">= 0"]
         | 
| 42 44 | 
             
              s.add_development_dependency %q<rake-compiler>, [">= 0"]
         | 
| 43 45 | 
             
              s.add_development_dependency %q<coveralls>, [">= 0"]
         | 
| 46 | 
            +
             | 
| 47 | 
            +
              if RUBY_VERSION < '2.0'
         | 
| 48 | 
            +
                s.add_development_dependency %q<term-ansicolor>, ["< 1.3.1"]
         | 
| 49 | 
            +
                s.add_development_dependency %q<tins>, ["~> 1.6.0"]
         | 
| 50 | 
            +
              end
         | 
| 44 51 | 
             
            end
         | 
| @@ -119,22 +119,31 @@ describe RubySpeech::GRXML::Builtins do | |
| 119 119 | 
             
                it { should not_match('#') }
         | 
| 120 120 | 
             
              end
         | 
| 121 121 |  | 
| 122 | 
            -
              describe  | 
| 122 | 
            +
              describe 'number' do
         | 
| 123 123 | 
             
                subject(:grammar) { described_class.number }
         | 
| 124 124 |  | 
| 125 | 
            -
                it { should match('0').and_interpret_as | 
| 126 | 
            -
                it { should match('123').and_interpret_as | 
| 127 | 
            -
                it { should match('1*01').and_interpret_as( | 
| 128 | 
            -
                it { should match('01*00').and_interpret_as( | 
| 129 | 
            -
                it  | 
| 130 | 
            -
             | 
| 131 | 
            -
             | 
| 132 | 
            -
                 | 
| 133 | 
            -
                it { should match(' | 
| 134 | 
            -
                it { should match(' | 
| 135 | 
            -
                it { should match(' | 
| 125 | 
            +
                it { should match('0').and_interpret_as 'dtmf-0' }
         | 
| 126 | 
            +
                it { should match('123').and_interpret_as 'dtmf-1 dtmf-2 dtmf-3' }
         | 
| 127 | 
            +
                it { should match('1*01').and_interpret_as dtmf_seq %w(1 star 0 1) }
         | 
| 128 | 
            +
                it { should match('01*00').and_interpret_as dtmf_seq %w(0 1 star 0 0) }
         | 
| 129 | 
            +
                it do
         | 
| 130 | 
            +
                  should match('100000000000*00')
         | 
| 131 | 
            +
                    .and_interpret_as dtmf_seq %w(1 0 0 0 0 0 0 0 0 0 0 0 star 0 0)
         | 
| 132 | 
            +
                end
         | 
| 133 | 
            +
                it { should match('0*08').and_interpret_as dtmf_seq %w(0 star 0 8) }
         | 
| 134 | 
            +
                it { should match('*59').and_interpret_as 'dtmf-star dtmf-5 dtmf-9' }
         | 
| 135 | 
            +
                it { should match('0*0').and_interpret_as 'dtmf-0 dtmf-star dtmf-0' }
         | 
| 136 | 
            +
                it { should match('10*5').and_interpret_as dtmf_seq %w(1 0 star 5) }
         | 
| 137 | 
            +
                it { should match('123*').and_interpret_as dtmf_seq %w(1 2 3 star) }
         | 
| 138 | 
            +
                it do
         | 
| 139 | 
            +
                  should match('123*2342').and_interpret_as dtmf_seq %w(1 2 3 star 2 3 4 2)
         | 
| 140 | 
            +
                end
         | 
| 136 141 |  | 
| 137 | 
            -
                it { should  | 
| 142 | 
            +
                it { should potentially_match '*' }
         | 
| 143 | 
            +
             | 
| 144 | 
            +
                it { should not_match '#' }
         | 
| 145 | 
            +
                it { should not_match '**' }
         | 
| 146 | 
            +
                it { should not_match '0123*456*789' }
         | 
| 138 147 | 
             
              end
         | 
| 139 148 |  | 
| 140 149 | 
             
              describe "phone" do
         | 
| @@ -232,6 +232,140 @@ module RubySpeech | |
| 232 232 | 
             
                      grammar.inline!.should == inline_grammar
         | 
| 233 233 | 
             
                      grammar.should == inline_grammar
         | 
| 234 234 | 
             
                    end
         | 
| 235 | 
            +
             | 
| 236 | 
            +
                    context 'nested' do
         | 
| 237 | 
            +
                      let :expected_doc do
         | 
| 238 | 
            +
                        RubySpeech::GRXML.draw mode: :dtmf, root: 'main' do
         | 
| 239 | 
            +
                          rule id: :main, scope: 'public' do
         | 
| 240 | 
            +
                            string "How about an oatmeal cookie?  You'll feel better."
         | 
| 241 | 
            +
                          end
         | 
| 242 | 
            +
                        end
         | 
| 243 | 
            +
                      end
         | 
| 244 | 
            +
             | 
| 245 | 
            +
                      context '1 level deep' do
         | 
| 246 | 
            +
                        subject do
         | 
| 247 | 
            +
                          RubySpeech::GRXML.draw mode: :dtmf, root: 'main' do
         | 
| 248 | 
            +
                            rule id: :main, scope: 'public' do
         | 
| 249 | 
            +
                              ruleref uri: '#rabbit_hole2'
         | 
| 250 | 
            +
                            end
         | 
| 251 | 
            +
                            rule id: 'rabbit_hole2' do
         | 
| 252 | 
            +
                              string "How about an oatmeal cookie?  You'll feel better."
         | 
| 253 | 
            +
                            end
         | 
| 254 | 
            +
                          end.inline
         | 
| 255 | 
            +
                        end
         | 
| 256 | 
            +
             | 
| 257 | 
            +
                        it { should eq expected_doc }
         | 
| 258 | 
            +
                      end
         | 
| 259 | 
            +
             | 
| 260 | 
            +
                      context '2 levels deep' do
         | 
| 261 | 
            +
                        subject do
         | 
| 262 | 
            +
                          RubySpeech::GRXML.draw mode: :dtmf, root: 'main' do
         | 
| 263 | 
            +
                            rule id: :main, scope: 'public' do
         | 
| 264 | 
            +
                              ruleref uri: '#rabbit_hole2'
         | 
| 265 | 
            +
                            end
         | 
| 266 | 
            +
                            rule id: 'rabbit_hole2' do
         | 
| 267 | 
            +
                              ruleref uri: '#rabbit_hole3'
         | 
| 268 | 
            +
                            end
         | 
| 269 | 
            +
                            rule id: 'rabbit_hole3' do
         | 
| 270 | 
            +
                              string "How about an oatmeal cookie?  You'll feel better."
         | 
| 271 | 
            +
                            end
         | 
| 272 | 
            +
                          end.inline
         | 
| 273 | 
            +
                        end
         | 
| 274 | 
            +
             | 
| 275 | 
            +
                        it { should eq expected_doc }
         | 
| 276 | 
            +
                      end
         | 
| 277 | 
            +
             | 
| 278 | 
            +
                      context '3 levels deep' do
         | 
| 279 | 
            +
                        subject do
         | 
| 280 | 
            +
                          RubySpeech::GRXML.draw mode: :dtmf, root: 'main' do
         | 
| 281 | 
            +
                            rule id: :main, scope: 'public' do
         | 
| 282 | 
            +
                              ruleref uri: '#rabbit_hole2'
         | 
| 283 | 
            +
                            end
         | 
| 284 | 
            +
                            rule id: 'rabbit_hole2' do
         | 
| 285 | 
            +
                              ruleref uri: '#rabbit_hole3'
         | 
| 286 | 
            +
                            end
         | 
| 287 | 
            +
                            rule id: 'rabbit_hole3' do
         | 
| 288 | 
            +
                              ruleref uri: '#rabbit_hole4'
         | 
| 289 | 
            +
                            end
         | 
| 290 | 
            +
                            rule id: 'rabbit_hole4' do
         | 
| 291 | 
            +
                              string "How about an oatmeal cookie?  You'll feel better."
         | 
| 292 | 
            +
                            end
         | 
| 293 | 
            +
                          end.inline
         | 
| 294 | 
            +
                        end
         | 
| 295 | 
            +
             | 
| 296 | 
            +
                        it { should eq expected_doc }
         | 
| 297 | 
            +
                      end
         | 
| 298 | 
            +
             | 
| 299 | 
            +
                      context 'in a self-referencial infinite loop' do
         | 
| 300 | 
            +
                        subject do
         | 
| 301 | 
            +
                          RubySpeech::GRXML.draw mode: :dtmf, root: 'main' do
         | 
| 302 | 
            +
                            rule id: :main, scope: 'public' do
         | 
| 303 | 
            +
                              ruleref uri: '#paradox'
         | 
| 304 | 
            +
                            end
         | 
| 305 | 
            +
                            rule id: 'paradox' do
         | 
| 306 | 
            +
                              ruleref uri: '#paradox'
         | 
| 307 | 
            +
                            end
         | 
| 308 | 
            +
                          end.inline
         | 
| 309 | 
            +
                        end
         | 
| 310 | 
            +
             | 
| 311 | 
            +
                        it 'should raise an Exception' do
         | 
| 312 | 
            +
                          expect { subject }
         | 
| 313 | 
            +
                            .to raise_error RubySpeech::GRXML::ReferentialLoopError
         | 
| 314 | 
            +
                        end
         | 
| 315 | 
            +
                      end
         | 
| 316 | 
            +
             | 
| 317 | 
            +
                      context 'in a cross-referencial infinite loop' do
         | 
| 318 | 
            +
                        subject do
         | 
| 319 | 
            +
                          RubySpeech::GRXML.draw mode: :dtmf, root: 'main' do
         | 
| 320 | 
            +
                            rule id: :main, scope: 'public' do
         | 
| 321 | 
            +
                              ruleref uri: '#007'
         | 
| 322 | 
            +
                            end
         | 
| 323 | 
            +
                            rule id: '007' do
         | 
| 324 | 
            +
                              one_of do
         | 
| 325 | 
            +
                                item do
         | 
| 326 | 
            +
                                  ruleref uri: '#bond'
         | 
| 327 | 
            +
                                end
         | 
| 328 | 
            +
                              end
         | 
| 329 | 
            +
                            end
         | 
| 330 | 
            +
                            rule id: 'bond' do
         | 
| 331 | 
            +
                              one_of do
         | 
| 332 | 
            +
                                item do
         | 
| 333 | 
            +
                                  ruleref uri: '#james_bond'
         | 
| 334 | 
            +
                                end
         | 
| 335 | 
            +
                              end
         | 
| 336 | 
            +
                            end
         | 
| 337 | 
            +
                            rule id: 'james_bond' do
         | 
| 338 | 
            +
                              one_of do
         | 
| 339 | 
            +
                                item do
         | 
| 340 | 
            +
                                  ruleref uri: '#007'
         | 
| 341 | 
            +
                                end
         | 
| 342 | 
            +
                              end
         | 
| 343 | 
            +
                            end
         | 
| 344 | 
            +
                          end.inline
         | 
| 345 | 
            +
                        end
         | 
| 346 | 
            +
             | 
| 347 | 
            +
                        it 'should raise an Exception' do
         | 
| 348 | 
            +
                          expect { subject }
         | 
| 349 | 
            +
                            .to raise_error RubySpeech::GRXML::ReferentialLoopError
         | 
| 350 | 
            +
                        end
         | 
| 351 | 
            +
                      end
         | 
| 352 | 
            +
             | 
| 353 | 
            +
                      context 'with an invalid-reference' do
         | 
| 354 | 
            +
                        subject do
         | 
| 355 | 
            +
                          RubySpeech::GRXML.draw mode: :dtmf, root: 'main' do
         | 
| 356 | 
            +
                            rule id: :main, scope: 'public' do
         | 
| 357 | 
            +
                              ruleref uri: '#lost'
         | 
| 358 | 
            +
                            end
         | 
| 359 | 
            +
                          end.inline
         | 
| 360 | 
            +
                        end
         | 
| 361 | 
            +
             | 
| 362 | 
            +
                        it 'should raise a descriptive exception' do
         | 
| 363 | 
            +
                          expect { subject }
         | 
| 364 | 
            +
                            .to raise_error RubySpeech::GRXML::MissingReferenceError,
         | 
| 365 | 
            +
                                            "Ruleref '#lost' is referenced but not defined"
         | 
| 366 | 
            +
                        end
         | 
| 367 | 
            +
                      end
         | 
| 368 | 
            +
                    end
         | 
| 235 369 | 
             
                  end
         | 
| 236 370 |  | 
| 237 371 | 
             
                  describe "#tokenize!" do
         | 
| @@ -516,6 +516,50 @@ module RubySpeech | |
| 516 516 | 
             
                      end
         | 
| 517 517 | 
             
                    end
         | 
| 518 518 |  | 
| 519 | 
            +
                    context "with a grammar that takes a a specific digit repeated within a range" do
         | 
| 520 | 
            +
                      let(:grammar) do
         | 
| 521 | 
            +
                        GRXML.draw :mode => :dtmf, :root => 'digits' do
         | 
| 522 | 
            +
                          rule :id => 'digits' do
         | 
| 523 | 
            +
                            item :repeat => 0..3 do
         | 
| 524 | 
            +
                              '6'
         | 
| 525 | 
            +
                            end
         | 
| 526 | 
            +
                          end
         | 
| 527 | 
            +
                        end
         | 
| 528 | 
            +
                      end
         | 
| 529 | 
            +
             | 
| 530 | 
            +
                      {
         | 
| 531 | 
            +
                        '' => '',
         | 
| 532 | 
            +
                        '6' => 'dtmf-6',
         | 
| 533 | 
            +
                        '66' => 'dtmf-6 dtmf-6',
         | 
| 534 | 
            +
                      }.each_pair do |input, interpretation|
         | 
| 535 | 
            +
                        it "should match '#{input}'" do
         | 
| 536 | 
            +
                          expected_match = GRXML::Match.new :mode           => :dtmf,
         | 
| 537 | 
            +
                                                            :confidence     => 1,
         | 
| 538 | 
            +
                                                            :utterance      => input,
         | 
| 539 | 
            +
                                                            :interpretation => interpretation
         | 
| 540 | 
            +
                          subject.match(input).should == expected_match
         | 
| 541 | 
            +
                        end
         | 
| 542 | 
            +
                      end
         | 
| 543 | 
            +
             | 
| 544 | 
            +
                      {
         | 
| 545 | 
            +
                        '666' => 'dtmf-6 dtmf-6 dtmf-6',
         | 
| 546 | 
            +
                      }.each_pair do |input, interpretation|
         | 
| 547 | 
            +
                        it "should maximally match '#{input}'" do
         | 
| 548 | 
            +
                          expected_match = GRXML::MaxMatch.new :mode        => :dtmf,
         | 
| 549 | 
            +
                                                            :confidence     => 1,
         | 
| 550 | 
            +
                                                            :utterance      => input,
         | 
| 551 | 
            +
                                                            :interpretation => interpretation
         | 
| 552 | 
            +
                          subject.match(input).should == expected_match
         | 
| 553 | 
            +
                        end
         | 
| 554 | 
            +
                      end
         | 
| 555 | 
            +
             | 
| 556 | 
            +
                      %w{6666 7}.each do |input|
         | 
| 557 | 
            +
                        it "should not match '#{input}'" do
         | 
| 558 | 
            +
                          subject.match(input).should == GRXML::NoMatch.new
         | 
| 559 | 
            +
                        end
         | 
| 560 | 
            +
                      end
         | 
| 561 | 
            +
                    end
         | 
| 562 | 
            +
             | 
| 519 563 | 
             
                    context "with a grammar that takes a a specific digit repeated within a range, followed by specific digit" do
         | 
| 520 564 | 
             
                      let(:grammar) do
         | 
| 521 565 | 
             
                        GRXML.draw :mode => :dtmf, :root => 'digits' do
         | 
| @@ -21,14 +21,28 @@ module RubySpeech | |
| 21 21 | 
             
                  end
         | 
| 22 22 |  | 
| 23 23 | 
             
                  describe "from a document" do
         | 
| 24 | 
            -
                    let(:document) { '<break strength="strong" time="3"/>' }
         | 
| 25 | 
            -
             | 
| 26 24 | 
             
                    subject { Element.import document }
         | 
| 27 25 |  | 
| 28 | 
            -
                     | 
| 26 | 
            +
                    context 'with time of 3' do
         | 
| 27 | 
            +
                      let(:document) { '<break strength="strong" time="3"/>' }
         | 
| 29 28 |  | 
| 30 | 
            -
             | 
| 31 | 
            -
             | 
| 29 | 
            +
                      it { should be_instance_of Break }
         | 
| 30 | 
            +
             | 
| 31 | 
            +
                      its(:strength)  { should == :strong }
         | 
| 32 | 
            +
                      its(:time)      { should eql 3.0 }
         | 
| 33 | 
            +
                    end
         | 
| 34 | 
            +
             | 
| 35 | 
            +
                    context 'with time of 4s' do
         | 
| 36 | 
            +
                      let(:document) { '<break time="4s"/>' }
         | 
| 37 | 
            +
             | 
| 38 | 
            +
                      its(:time)      { should eql 4.0 }
         | 
| 39 | 
            +
                    end
         | 
| 40 | 
            +
             | 
| 41 | 
            +
                    context 'with time of 5555ms' do
         | 
| 42 | 
            +
                      let(:document) { '<break time="5555ms"/>' }
         | 
| 43 | 
            +
             | 
| 44 | 
            +
                      its(:time)      { should eql 5.555 }
         | 
| 45 | 
            +
                    end
         | 
| 32 46 | 
             
                  end
         | 
| 33 47 |  | 
| 34 48 | 
             
                  describe "#strength" do
         | 
| @@ -51,10 +65,16 @@ module RubySpeech | |
| 51 65 | 
             
                  end
         | 
| 52 66 |  | 
| 53 67 | 
             
                  describe "#time" do
         | 
| 54 | 
            -
                    context "with a valid value" do
         | 
| 68 | 
            +
                    context "with a valid whole seconds value of 3" do
         | 
| 55 69 | 
             
                      before { subject.time = 3 }
         | 
| 56 70 |  | 
| 57 | 
            -
                      its(:time) { should  | 
| 71 | 
            +
                      its(:time) { should eql 3.0 }
         | 
| 72 | 
            +
                    end
         | 
| 73 | 
            +
             | 
| 74 | 
            +
                    context "with a valid fractional seconds value of 3.5" do
         | 
| 75 | 
            +
                      before { subject.time = 3.5 }
         | 
| 76 | 
            +
             | 
| 77 | 
            +
                      its(:time) { should eql 3.5 }
         | 
| 58 78 | 
             
                    end
         | 
| 59 79 |  | 
| 60 80 | 
             
                    context "with a negative value" do
         | 
| @@ -16,7 +16,7 @@ module RubySpeech | |
| 16 16 | 
             
                    its(:contour)   { should == 'something' }
         | 
| 17 17 | 
             
                    its(:range)     { should == '20Hz' }
         | 
| 18 18 | 
             
                    its(:rate)      { should == 2 }
         | 
| 19 | 
            -
                    its(:duration)  { should  | 
| 19 | 
            +
                    its(:duration)  { should eql 10 }
         | 
| 20 20 | 
             
                    its(:volume)    { should == :loud }
         | 
| 21 21 | 
             
                  end
         | 
| 22 22 |  | 
| @@ -35,7 +35,7 @@ module RubySpeech | |
| 35 35 | 
             
                    its(:contour)   { should == 'something' }
         | 
| 36 36 | 
             
                    its(:range)     { should == '20Hz' }
         | 
| 37 37 | 
             
                    its(:rate)      { should == 2 }
         | 
| 38 | 
            -
                    its(:duration)  { should  | 
| 38 | 
            +
                    its(:duration)  { should eql 10 }
         | 
| 39 39 | 
             
                    its(:volume)    { should == :loud }
         | 
| 40 40 | 
             
                  end
         | 
| 41 41 |  | 
| @@ -149,6 +149,24 @@ module RubySpeech | |
| 149 149 | 
             
                      it "with a negative value" do
         | 
| 150 150 | 
             
                        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)")
         | 
| 151 151 | 
             
                      end
         | 
| 152 | 
            +
             | 
| 153 | 
            +
                      describe "with a percentage" do
         | 
| 154 | 
            +
                        before { subject.rate = "22.5%" }
         | 
| 155 | 
            +
             | 
| 156 | 
            +
                        its(:rate) { should == "22.5%" }
         | 
| 157 | 
            +
                      end
         | 
| 158 | 
            +
             | 
| 159 | 
            +
                      describe "with a percentage and a plus sign" do
         | 
| 160 | 
            +
                        before { subject.rate = "+22.5%" }
         | 
| 161 | 
            +
             | 
| 162 | 
            +
                        its(:rate) { should == "+22.5%" }
         | 
| 163 | 
            +
                      end
         | 
| 164 | 
            +
             | 
| 165 | 
            +
                      describe "with a percentage and a minus sign" do
         | 
| 166 | 
            +
                        before { subject.rate = "-22.5%" }
         | 
| 167 | 
            +
             | 
| 168 | 
            +
                        its(:rate) { should == "-22.5%" }
         | 
| 169 | 
            +
                      end
         | 
| 152 170 | 
             
                    end
         | 
| 153 171 | 
             
                  end
         | 
| 154 172 |  | 
| @@ -156,7 +174,7 @@ module RubySpeech | |
| 156 174 | 
             
                    context "with a valid value" do
         | 
| 157 175 | 
             
                      before { subject.duration = 3 }
         | 
| 158 176 |  | 
| 159 | 
            -
                      its(:duration) { should  | 
| 177 | 
            +
                      its(:duration) { should eql 3 }
         | 
| 160 178 | 
             
                    end
         | 
| 161 179 |  | 
| 162 180 | 
             
                    context "with a negative value" do
         | 
    
        data/spec/spec_helper.rb
    CHANGED
    
    | @@ -1,8 +1,14 @@ | |
| 1 | 
            -
             | 
| 1 | 
            +
            # encoding: utf-8
         | 
| 2 | 
            +
            # frozen_string_literal: true
         | 
| 2 3 |  | 
| 3 | 
            -
            require  | 
| 4 | 
            +
            require "coveralls"
         | 
| 4 5 | 
             
            Coveralls.wear!
         | 
| 5 6 |  | 
| 7 | 
            +
            %w{
         | 
| 8 | 
            +
              rspec/its
         | 
| 9 | 
            +
              ruby_speech
         | 
| 10 | 
            +
            }.each { |f| require f }
         | 
| 11 | 
            +
             | 
| 6 12 | 
             
            Dir[File.dirname(__FILE__) + "/support/**/*.rb"].each {|f| require f}
         | 
| 7 13 |  | 
| 8 14 | 
             
            schema_file_path = File.expand_path File.join(__FILE__, '../../assets/synthesis.xsd')
         | 
| @@ -0,0 +1,14 @@ | |
| 1 | 
            +
            # encoding: utf-8
         | 
| 2 | 
            +
            # frozen_string_literal: true
         | 
| 3 | 
            +
             | 
| 4 | 
            +
            #
         | 
| 5 | 
            +
            # Convert a simple DTMF string from "1 star 2" to "dtmf-1 dtmf-star dtmf-2".
         | 
| 6 | 
            +
            #
         | 
| 7 | 
            +
            # @param [Array] sequence A set of DTMF keys, such as `%w(1 star 2)`.
         | 
| 8 | 
            +
            #
         | 
| 9 | 
            +
            # @return [String] A string with "dtmf-" prefixed for each DTMF element.
         | 
| 10 | 
            +
            #                  Example: "dtmf-1 dtmf-star dtmf-2".
         | 
| 11 | 
            +
            #
         | 
| 12 | 
            +
            def dtmf_seq(sequence)
         | 
| 13 | 
            +
              sequence.map { |d| "dtmf-#{d}" }.join ' '
         | 
| 14 | 
            +
            end
         | 
    
        metadata
    CHANGED
    
    | @@ -1,203 +1,231 @@ | |
| 1 1 | 
             
            --- !ruby/object:Gem::Specification
         | 
| 2 2 | 
             
            name: ruby_speech
         | 
| 3 3 | 
             
            version: !ruby/object:Gem::Version
         | 
| 4 | 
            -
              version: 2. | 
| 4 | 
            +
              version: 2.4.0
         | 
| 5 5 | 
             
            platform: java
         | 
| 6 6 | 
             
            authors:
         | 
| 7 7 | 
             
            - Ben Langfeld
         | 
| 8 8 | 
             
            autorequire:
         | 
| 9 9 | 
             
            bindir: bin
         | 
| 10 10 | 
             
            cert_chain: []
         | 
| 11 | 
            -
            date:  | 
| 11 | 
            +
            date: 2018-02-24 00:00:00.000000000 Z
         | 
| 12 12 | 
             
            dependencies:
         | 
| 13 13 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 14 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 15 | 
            +
                requirements:
         | 
| 16 | 
            +
                - - "~>"
         | 
| 17 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 18 | 
            +
                    version: 1.6.0
         | 
| 14 19 | 
             
              name: nokogiri
         | 
| 20 | 
            +
              prerelease: false
         | 
| 21 | 
            +
              type: :runtime
         | 
| 15 22 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 16 23 | 
             
                requirements:
         | 
| 17 | 
            -
                - - ~>
         | 
| 24 | 
            +
                - - "~>"
         | 
| 18 25 | 
             
                  - !ruby/object:Gem::Version
         | 
| 19 | 
            -
                    version:  | 
| 26 | 
            +
                    version: 1.6.0
         | 
| 27 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 20 28 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 21 29 | 
             
                requirements:
         | 
| 22 | 
            -
                - -  | 
| 30 | 
            +
                - - ">="
         | 
| 23 31 | 
             
                  - !ruby/object:Gem::Version
         | 
| 24 | 
            -
                    version:  | 
| 32 | 
            +
                    version: 3.0.7
         | 
| 33 | 
            +
                - - "<"
         | 
| 34 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 35 | 
            +
                    version: 5.0.0
         | 
| 36 | 
            +
              name: activesupport
         | 
| 25 37 | 
             
              prerelease: false
         | 
| 26 38 | 
             
              type: :runtime
         | 
| 27 | 
            -
            - !ruby/object:Gem::Dependency
         | 
| 28 | 
            -
              name: activesupport
         | 
| 29 39 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 30 40 | 
             
                requirements:
         | 
| 31 | 
            -
                - -  | 
| 41 | 
            +
                - - ">="
         | 
| 32 42 | 
             
                  - !ruby/object:Gem::Version
         | 
| 33 43 | 
             
                    version: 3.0.7
         | 
| 34 | 
            -
                - - <
         | 
| 44 | 
            +
                - - "<"
         | 
| 35 45 | 
             
                  - !ruby/object:Gem::Version
         | 
| 36 46 | 
             
                    version: 5.0.0
         | 
| 47 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 37 48 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 38 49 | 
             
                requirements:
         | 
| 39 | 
            -
                - -  | 
| 50 | 
            +
                - - ">="
         | 
| 40 51 | 
             
                  - !ruby/object:Gem::Version
         | 
| 41 | 
            -
                    version:  | 
| 42 | 
            -
                - - <
         | 
| 43 | 
            -
                  - !ruby/object:Gem::Version
         | 
| 44 | 
            -
                    version: 5.0.0
         | 
| 45 | 
            -
              prerelease: false
         | 
| 46 | 
            -
              type: :runtime
         | 
| 47 | 
            -
            - !ruby/object:Gem::Dependency
         | 
| 52 | 
            +
                    version: 1.0.0
         | 
| 48 53 | 
             
              name: bundler
         | 
| 54 | 
            +
              prerelease: false
         | 
| 55 | 
            +
              type: :development
         | 
| 49 56 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 50 57 | 
             
                requirements:
         | 
| 51 | 
            -
                - -  | 
| 58 | 
            +
                - - ">="
         | 
| 52 59 | 
             
                  - !ruby/object:Gem::Version
         | 
| 53 60 | 
             
                    version: 1.0.0
         | 
| 61 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 54 62 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 55 63 | 
             
                requirements:
         | 
| 56 | 
            -
                - -  | 
| 64 | 
            +
                - - "~>"
         | 
| 57 65 | 
             
                  - !ruby/object:Gem::Version
         | 
| 58 | 
            -
                    version:  | 
| 66 | 
            +
                    version: 2.99.0
         | 
| 67 | 
            +
              name: rspec
         | 
| 59 68 | 
             
              prerelease: false
         | 
| 60 69 | 
             
              type: :development
         | 
| 61 | 
            -
            - !ruby/object:Gem::Dependency
         | 
| 62 | 
            -
              name: rspec
         | 
| 63 70 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 64 71 | 
             
                requirements:
         | 
| 65 | 
            -
                - -  | 
| 72 | 
            +
                - - "~>"
         | 
| 66 73 | 
             
                  - !ruby/object:Gem::Version
         | 
| 67 | 
            -
                    version:  | 
| 74 | 
            +
                    version: 2.99.0
         | 
| 75 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 68 76 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 69 77 | 
             
                requirements:
         | 
| 70 | 
            -
                - -  | 
| 78 | 
            +
                - - ">="
         | 
| 71 79 | 
             
                  - !ruby/object:Gem::Version
         | 
| 72 | 
            -
                    version: ' | 
| 80 | 
            +
                    version: '0'
         | 
| 81 | 
            +
              name: rspec-its
         | 
| 73 82 | 
             
              prerelease: false
         | 
| 74 83 | 
             
              type: :development
         | 
| 75 | 
            -
            - !ruby/object:Gem::Dependency
         | 
| 76 | 
            -
              name: ci_reporter
         | 
| 77 84 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 78 85 | 
             
                requirements:
         | 
| 79 | 
            -
                - -  | 
| 86 | 
            +
                - - ">="
         | 
| 80 87 | 
             
                  - !ruby/object:Gem::Version
         | 
| 81 | 
            -
                    version:  | 
| 88 | 
            +
                    version: '0'
         | 
| 89 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 82 90 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 83 91 | 
             
                requirements:
         | 
| 84 | 
            -
                - -  | 
| 92 | 
            +
                - - "~>"
         | 
| 85 93 | 
             
                  - !ruby/object:Gem::Version
         | 
| 86 | 
            -
                    version: 1.6 | 
| 94 | 
            +
                    version: '1.6'
         | 
| 95 | 
            +
              name: ci_reporter
         | 
| 87 96 | 
             
              prerelease: false
         | 
| 88 97 | 
             
              type: :development
         | 
| 89 | 
            -
            - !ruby/object:Gem::Dependency
         | 
| 90 | 
            -
              name: yard
         | 
| 91 98 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 92 99 | 
             
                requirements:
         | 
| 93 | 
            -
                - -  | 
| 100 | 
            +
                - - "~>"
         | 
| 94 101 | 
             
                  - !ruby/object:Gem::Version
         | 
| 95 | 
            -
                    version:  | 
| 102 | 
            +
                    version: '1.6'
         | 
| 103 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 96 104 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 97 105 | 
             
                requirements:
         | 
| 98 | 
            -
                - -  | 
| 106 | 
            +
                - - ">="
         | 
| 99 107 | 
             
                  - !ruby/object:Gem::Version
         | 
| 100 108 | 
             
                    version: 0.7.0
         | 
| 109 | 
            +
              name: yard
         | 
| 101 110 | 
             
              prerelease: false
         | 
| 102 111 | 
             
              type: :development
         | 
| 103 | 
            -
            - !ruby/object:Gem::Dependency
         | 
| 104 | 
            -
              name: rake
         | 
| 105 112 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 106 113 | 
             
                requirements:
         | 
| 107 | 
            -
                - -  | 
| 114 | 
            +
                - - ">="
         | 
| 108 115 | 
             
                  - !ruby/object:Gem::Version
         | 
| 109 | 
            -
                    version:  | 
| 116 | 
            +
                    version: 0.7.0
         | 
| 117 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 110 118 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 111 119 | 
             
                requirements:
         | 
| 112 | 
            -
                - -  | 
| 120 | 
            +
                - - "<"
         | 
| 113 121 | 
             
                  - !ruby/object:Gem::Version
         | 
| 114 | 
            -
                    version: '0'
         | 
| 122 | 
            +
                    version: '11.0'
         | 
| 123 | 
            +
              name: rake
         | 
| 115 124 | 
             
              prerelease: false
         | 
| 116 125 | 
             
              type: :development
         | 
| 117 | 
            -
            - !ruby/object:Gem::Dependency
         | 
| 118 | 
            -
              name: guard
         | 
| 119 126 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 120 127 | 
             
                requirements:
         | 
| 121 | 
            -
                - -  | 
| 128 | 
            +
                - - "<"
         | 
| 122 129 | 
             
                  - !ruby/object:Gem::Version
         | 
| 123 | 
            -
                    version:  | 
| 130 | 
            +
                    version: '11.0'
         | 
| 131 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 124 132 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 125 133 | 
             
                requirements:
         | 
| 126 | 
            -
                - -  | 
| 134 | 
            +
                - - ">="
         | 
| 127 135 | 
             
                  - !ruby/object:Gem::Version
         | 
| 128 136 | 
             
                    version: 0.9.0
         | 
| 137 | 
            +
              name: guard
         | 
| 129 138 | 
             
              prerelease: false
         | 
| 130 139 | 
             
              type: :development
         | 
| 140 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 141 | 
            +
                requirements:
         | 
| 142 | 
            +
                - - ">="
         | 
| 143 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 144 | 
            +
                    version: 0.9.0
         | 
| 131 145 | 
             
            - !ruby/object:Gem::Dependency
         | 
| 146 | 
            +
              requirement: !ruby/object:Gem::Requirement
         | 
| 147 | 
            +
                requirements:
         | 
| 148 | 
            +
                - - ">="
         | 
| 149 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 150 | 
            +
                    version: '0'
         | 
| 132 151 | 
             
              name: guard-rspec
         | 
| 152 | 
            +
              prerelease: false
         | 
| 153 | 
            +
              type: :development
         | 
| 133 154 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 134 155 | 
             
                requirements:
         | 
| 135 | 
            -
                - -  | 
| 156 | 
            +
                - - ">="
         | 
| 136 157 | 
             
                  - !ruby/object:Gem::Version
         | 
| 137 158 | 
             
                    version: '0'
         | 
| 159 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 138 160 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 139 161 | 
             
                requirements:
         | 
| 140 | 
            -
                - -  | 
| 162 | 
            +
                - - "<"
         | 
| 141 163 | 
             
                  - !ruby/object:Gem::Version
         | 
| 142 | 
            -
                    version:  | 
| 164 | 
            +
                    version: 3.1.0
         | 
| 165 | 
            +
              name: listen
         | 
| 143 166 | 
             
              prerelease: false
         | 
| 144 167 | 
             
              type: :development
         | 
| 145 | 
            -
            - !ruby/object:Gem::Dependency
         | 
| 146 | 
            -
              name: ruby_gntp
         | 
| 147 168 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 148 169 | 
             
                requirements:
         | 
| 149 | 
            -
                - -  | 
| 170 | 
            +
                - - "<"
         | 
| 150 171 | 
             
                  - !ruby/object:Gem::Version
         | 
| 151 | 
            -
                    version:  | 
| 172 | 
            +
                    version: 3.1.0
         | 
| 173 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 152 174 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 153 175 | 
             
                requirements:
         | 
| 154 | 
            -
                - -  | 
| 176 | 
            +
                - - ">="
         | 
| 155 177 | 
             
                  - !ruby/object:Gem::Version
         | 
| 156 178 | 
             
                    version: '0'
         | 
| 179 | 
            +
              name: ruby_gntp
         | 
| 157 180 | 
             
              prerelease: false
         | 
| 158 181 | 
             
              type: :development
         | 
| 159 | 
            -
            - !ruby/object:Gem::Dependency
         | 
| 160 | 
            -
              name: guard-rake
         | 
| 161 182 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 162 183 | 
             
                requirements:
         | 
| 163 | 
            -
                - -  | 
| 184 | 
            +
                - - ">="
         | 
| 164 185 | 
             
                  - !ruby/object:Gem::Version
         | 
| 165 186 | 
             
                    version: '0'
         | 
| 187 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 166 188 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 167 189 | 
             
                requirements:
         | 
| 168 | 
            -
                - -  | 
| 190 | 
            +
                - - ">="
         | 
| 169 191 | 
             
                  - !ruby/object:Gem::Version
         | 
| 170 192 | 
             
                    version: '0'
         | 
| 193 | 
            +
              name: guard-rake
         | 
| 171 194 | 
             
              prerelease: false
         | 
| 172 195 | 
             
              type: :development
         | 
| 173 | 
            -
            - !ruby/object:Gem::Dependency
         | 
| 174 | 
            -
              name: rake-compiler
         | 
| 175 196 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 176 197 | 
             
                requirements:
         | 
| 177 | 
            -
                - -  | 
| 198 | 
            +
                - - ">="
         | 
| 178 199 | 
             
                  - !ruby/object:Gem::Version
         | 
| 179 200 | 
             
                    version: '0'
         | 
| 201 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 180 202 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 181 203 | 
             
                requirements:
         | 
| 182 | 
            -
                - -  | 
| 204 | 
            +
                - - ">="
         | 
| 183 205 | 
             
                  - !ruby/object:Gem::Version
         | 
| 184 206 | 
             
                    version: '0'
         | 
| 207 | 
            +
              name: rake-compiler
         | 
| 185 208 | 
             
              prerelease: false
         | 
| 186 209 | 
             
              type: :development
         | 
| 187 | 
            -
            - !ruby/object:Gem::Dependency
         | 
| 188 | 
            -
              name: coveralls
         | 
| 189 210 | 
             
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 190 211 | 
             
                requirements:
         | 
| 191 | 
            -
                - -  | 
| 212 | 
            +
                - - ">="
         | 
| 192 213 | 
             
                  - !ruby/object:Gem::Version
         | 
| 193 214 | 
             
                    version: '0'
         | 
| 215 | 
            +
            - !ruby/object:Gem::Dependency
         | 
| 194 216 | 
             
              requirement: !ruby/object:Gem::Requirement
         | 
| 195 217 | 
             
                requirements:
         | 
| 196 | 
            -
                - -  | 
| 218 | 
            +
                - - ">="
         | 
| 197 219 | 
             
                  - !ruby/object:Gem::Version
         | 
| 198 220 | 
             
                    version: '0'
         | 
| 221 | 
            +
              name: coveralls
         | 
| 199 222 | 
             
              prerelease: false
         | 
| 200 223 | 
             
              type: :development
         | 
| 224 | 
            +
              version_requirements: !ruby/object:Gem::Requirement
         | 
| 225 | 
            +
                requirements:
         | 
| 226 | 
            +
                - - ">="
         | 
| 227 | 
            +
                  - !ruby/object:Gem::Version
         | 
| 228 | 
            +
                    version: '0'
         | 
| 201 229 | 
             
            description: Prepare SSML and GRXML documents with ease
         | 
| 202 230 | 
             
            email:
         | 
| 203 231 | 
             
            - ben@langfeld.me
         | 
| @@ -205,10 +233,10 @@ executables: [] | |
| 205 233 | 
             
            extensions: []
         | 
| 206 234 | 
             
            extra_rdoc_files: []
         | 
| 207 235 | 
             
            files:
         | 
| 208 | 
            -
            - .gitignore
         | 
| 209 | 
            -
            - .hound.yml
         | 
| 210 | 
            -
            - .rspec
         | 
| 211 | 
            -
            - .travis.yml
         | 
| 236 | 
            +
            - ".gitignore"
         | 
| 237 | 
            +
            - ".hound.yml"
         | 
| 238 | 
            +
            - ".rspec"
         | 
| 239 | 
            +
            - ".travis.yml"
         | 
| 212 240 | 
             
            - CHANGELOG.md
         | 
| 213 241 | 
             
            - Gemfile
         | 
| 214 242 | 
             
            - Guardfile
         | 
| @@ -244,6 +272,7 @@ files: | |
| 244 272 | 
             
            - lib/ruby_speech/nlsml.rb
         | 
| 245 273 | 
             
            - lib/ruby_speech/nlsml/builder.rb
         | 
| 246 274 | 
             
            - lib/ruby_speech/nlsml/document.rb
         | 
| 275 | 
            +
            - lib/ruby_speech/ruby_speech.jar
         | 
| 247 276 | 
             
            - lib/ruby_speech/ssml.rb
         | 
| 248 277 | 
             
            - lib/ruby_speech/ssml/audio.rb
         | 
| 249 278 | 
             
            - lib/ruby_speech/ssml/break.rb
         | 
| @@ -293,11 +322,11 @@ files: | |
| 293 322 | 
             
            - spec/ruby_speech/ssml_spec.rb
         | 
| 294 323 | 
             
            - spec/ruby_speech_spec.rb
         | 
| 295 324 | 
             
            - spec/spec_helper.rb
         | 
| 325 | 
            +
            - spec/support/dtmf_helper.rb
         | 
| 296 326 | 
             
            - spec/support/grammar_matchers.rb
         | 
| 297 327 | 
             
            - spec/support/match_examples.rb
         | 
| 298 328 | 
             
            - spec/support/matchers.rb
         | 
| 299 | 
            -
             | 
| 300 | 
            -
            homepage: https://github.com/benlangfeld/ruby_speech
         | 
| 329 | 
            +
            homepage: https://github.com/adhearsion/ruby_speech
         | 
| 301 330 | 
             
            licenses:
         | 
| 302 331 | 
             
            - MIT
         | 
| 303 332 | 
             
            metadata: {}
         | 
| @@ -307,17 +336,17 @@ require_paths: | |
| 307 336 | 
             
            - lib
         | 
| 308 337 | 
             
            required_ruby_version: !ruby/object:Gem::Requirement
         | 
| 309 338 | 
             
              requirements:
         | 
| 310 | 
            -
              - -  | 
| 339 | 
            +
              - - ">="
         | 
| 311 340 | 
             
                - !ruby/object:Gem::Version
         | 
| 312 341 | 
             
                  version: '0'
         | 
| 313 342 | 
             
            required_rubygems_version: !ruby/object:Gem::Requirement
         | 
| 314 343 | 
             
              requirements:
         | 
| 315 | 
            -
              - -  | 
| 344 | 
            +
              - - ">="
         | 
| 316 345 | 
             
                - !ruby/object:Gem::Version
         | 
| 317 346 | 
             
                  version: '0'
         | 
| 318 347 | 
             
            requirements: []
         | 
| 319 348 | 
             
            rubyforge_project: ruby_speech
         | 
| 320 | 
            -
            rubygems_version: 2. | 
| 349 | 
            +
            rubygems_version: 2.6.14
         | 
| 321 350 | 
             
            signing_key:
         | 
| 322 351 | 
             
            specification_version: 4
         | 
| 323 352 | 
             
            summary: A Ruby library for TTS & ASR document preparation
         | 
| @@ -353,7 +382,7 @@ test_files: | |
| 353 382 | 
             
            - spec/ruby_speech/ssml_spec.rb
         | 
| 354 383 | 
             
            - spec/ruby_speech_spec.rb
         | 
| 355 384 | 
             
            - spec/spec_helper.rb
         | 
| 385 | 
            +
            - spec/support/dtmf_helper.rb
         | 
| 356 386 | 
             
            - spec/support/grammar_matchers.rb
         | 
| 357 387 | 
             
            - spec/support/match_examples.rb
         | 
| 358 388 | 
             
            - spec/support/matchers.rb
         | 
| 359 | 
            -
            has_rdoc:
         |