# RubySpeech
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.
## Dependencies
### pcre (except on JRuby)
#### On OSX with Homebrew
```
brew install pcre
```
#### On Ubuntu/Debian
```
sudo apt-get install libpcre3 libpcre3-dev
```
#### On CentOS
```
sudo yum install pcre-devel
```
## Installation
gem install ruby_speech
## Ruby Version Compatability
* CRuby 1.9.3+ (1.9.2 is unofficially supported, but not regularly tested)
* JRuby 1.7+
## Library
### SSML
RubySpeech provides a DSL for constructing SSML documents like so:
```ruby
require 'ruby_speech'
speak = RubySpeech::SSML.draw do
voice gender: :male, name: 'fred' do
string "Hi, I'm Fred. The time is currently "
say_as interpret_as: 'date', format: 'dmy' do
"01/02/1960"
end
end
end
speak.to_s
```
becomes:
```xml
Hi, I'm Fred. The time is currently 01/02/1960
```
Once your `Speak` is fully prepared and you're ready to send it off for processing, you must call `to_doc` on it to add the XML header:
```xml
Hi, I'm Fred. The time is currently 01/02/1960
```
You may also then need to call `to_s`.
### GRXML
Construct a GRXML (SRGS) document like this:
```ruby
require 'ruby_speech'
grammy = RubySpeech::GRXML.draw mode: :dtmf, root: 'pin' do
rule id: 'digit' do
one_of do
('0'..'9').map { |d| item { d } }
end
end
rule id: 'pin', scope: 'public' do
one_of do
item do
item repeat: '4' do
ruleref uri: '#digit'
end
"#"
end
item do
"* 9"
end
end
end
end
grammy.to_s
```
which becomes
```xml
0123456789#* 9
```
#### Grammar matching
It is possible to match some arbitrary input against a GRXML grammar, like so:
```ruby
require 'ruby_speech'
>> grammar = RubySpeech::GRXML.draw mode: :dtmf, root: 'pin' do
rule id: 'digit' do
one_of do
('0'..'9').map { |d| item { d } }
end
end
rule id: 'pin', scope: 'public' do
one_of do
item do
item repeat: '4' do
ruleref uri: '#digit'
end
"#"
end
item do
"* 9"
end
end
end
end
matcher = RubySpeech::GRXML::Matcher.new grammar
>> matcher.match '*9'
=> #
>> matcher.match '1234#'
=> #
>> matcher.match '5678#'
=> #
>> matcher.match '1111#'
=> #
>> matcher.match '111'
=> #
```
### NLSML
[Natural Language Semantics Markup Language](http://tools.ietf.org/html/draft-ietf-speechsc-mrcpv2-27#section-6.3.1) is the format used by many Speech Recognition engines and natural language processors to add semantic information to human language. RubySpeech is capable of generating and parsing such documents.
It is possible to generate an NLSML document like so:
```ruby
require 'ruby_speech'
nlsml = RubySpeech::NLSML.draw grammar: 'http://flight' do
interpretation confidence: 0.6 do
input "I want to go to Pittsburgh", mode: :speech
instance do
airline do
to_city 'Pittsburgh'
end
end
end
interpretation confidence: 0.4 do
input "I want to go to Stockholm"
instance do
airline do
to_city "Stockholm"
end
end
end
end
nlsml.to_s
```
becomes:
```xml
I want to go to Pittsburgh
Pittsburgh
I want to go to Stockholm
Stockholm
```
It's also possible to parse an NLSML document and extract useful information from it. Taking the above example, one may do:
```ruby
document = RubySpeech.parse nlsml.to_s
document.match? # => true
document.interpretations # => [
{
confidence: 0.6,
input: { mode: :speech, content: 'I want to go to Pittsburgh' },
instance: { airline: { to_city: 'Pittsburgh' } }
},
{
confidence: 0.4,
input: { content: 'I want to go to Stockholm' },
instance: { airline: { to_city: 'Stockholm' } }
}
]
document.best_interpretation # => {
confidence: 0.6,
input: { mode: :speech, content: 'I want to go to Pittsburgh' },
instance: { airline: { to_city: 'Pittsburgh' } }
}
```
Check out the [YARD documentation](http://rdoc.info/github/benlangfeld/ruby_speech/master/frames) for more
## Features:
### SSML
* Document construction
* ``
* ``
* ``
* ``
* ``
* ``
* `` and ``
* ``
* ``
#### Misc
* ``
* ``
### GRXML
* Document construction
* ``
* ``
* ``
* ``
* ``
* ``
### NLSML
* Document construction
* Simple data extraction from documents
## TODO:
### SSML
* ``
* `` and ``
### GRXML
* `` and ``
* ``
* ``
## Links:
* [Source](https://github.com/benlangfeld/ruby_speech)
* [Documentation](http://rdoc.info/gems/ruby_speech/frames)
* [Bug Tracker](https://github.com/benlangfeld/ruby_speech/issues)
* [CI](https://travis-ci.org/#!/benlangfeld/ruby_speech)
## Note on Patches/Pull Requests
* Fork the project.
* Make your feature addition or bug fix.
* Add tests for it. This is important so I don't break it in a future version unintentionally.
* Commit, do not mess with rakefile, version, or history.
* If you want to have your own version, that is fine but bump version in a commit by itself so I can ignore when I pull
* Send me a pull request. Bonus points for topic branches.
## Copyright
Copyright (c) 2013 Ben Langfeld. MIT licence (see LICENSE for details).