ssml_builder 1.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA1:
3
+ metadata.gz: b6275634506fb3476e569a6b0cd789d8fc7a9462
4
+ data.tar.gz: c20cea303828a8d84c8764d40d482d2ad6be889f
5
+ SHA512:
6
+ metadata.gz: 30af32c16859e824e531f197eee273de962af05093dcea91f94ae45e5040fa2a6e94dda0b9d5f0a361119380d008560862b5cec004097a67c51924272369a479
7
+ data.tar.gz: 5a1b4610510873be755789c0afb1b32e50f8e9787106f51106bcc56ffc0dc7d3e1fa89fde50f9d2ecd70224e8dd0869ba907c6af5e5460c6c7bb5a994e03c3fc
data/Gemfile ADDED
@@ -0,0 +1,4 @@
1
+ source 'https://rubygems.org'
2
+
3
+ # Specify your gem's dependencies in alexa_rubykit.gemspec
4
+ gemspec
@@ -0,0 +1,22 @@
1
+ Copyright (c) 2017 Paul McMahon
2
+
3
+ MIT License
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining
6
+ a copy of this software and associated documentation files (the
7
+ "Software"), to deal in the Software without restriction, including
8
+ without limitation the rights to use, copy, modify, merge, publish,
9
+ distribute, sublicense, and/or sell copies of the Software, and to
10
+ permit persons to whom the Software is furnished to do so, subject to
11
+ the following conditions:
12
+
13
+ The above copyright notice and this permission notice shall be
14
+ included in all copies or substantial portions of the Software.
15
+
16
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17
+ EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19
+ NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20
+ LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21
+ OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22
+ WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
@@ -0,0 +1,570 @@
1
+ # SSML Builder (for Amazon Alexa)
2
+
3
+ This gem implements a full suite of tools for working with SSML particularly with Amazon's Alexa. For full SSML documentation, please see:
4
+ [Amazon SSML Reference](https://developer.amazon.com/public/solutions/alexa/alexa-skills-kit/docs/speech-synthesis-markup-language-ssml-reference)
5
+
6
+ ## Installation
7
+
8
+ ### For Ruby Projects:
9
+
10
+ Add this line to your application's Gemfile:
11
+
12
+ ```ruby
13
+ gem 'ssml_builder'
14
+ ```
15
+
16
+ And then execute:
17
+
18
+ $ bundle
19
+
20
+ Or install it yourself as:
21
+
22
+ $ gem install ssml_builder
23
+
24
+ ## Usage
25
+
26
+ This Gem provides methods to generate ssml strings using the core Builder module as well as providing an extension of the string class if that usage is preferred.
27
+
28
+ ### SsmlBuilder::Builder
29
+
30
+ #### Basic Usage
31
+
32
+ ```ruby
33
+ require 'ssml_builder'
34
+ ssml_builder = SsmlBuilder::Builder.new
35
+ ssml_builder.say("Hello, how are you today?")
36
+ ssml_builder.pause("1s")
37
+ ssml_builder.p("This is a new paragraph.")
38
+
39
+ ssml_buider.ssml
40
+ # Output: "<speak>Hello, how are you today? <break time=\"1s\"/><p>This is a new paragraph.</p></speak>"
41
+ ```
42
+
43
+ #### Available Commands
44
+
45
+ * [say](#say)
46
+ * [paragraph](#paragraph)
47
+ * [p](#p)
48
+ * [sentence](#sentence)
49
+ * [rate](#rate)
50
+ * [pitch](#pitch)
51
+ * [volume](#volume)
52
+ * [pause](#pause)
53
+ * [break](#break)
54
+ * [emphasis](#emphasis)
55
+ * [audio](#audio)
56
+ * [spell_out](#spell_out)
57
+ * [characters](#characters)
58
+ * [cardinal](#cardinal)
59
+ * [number](#number)
60
+ * [ordinal](#ordinal)
61
+ * [digits](#digits)
62
+ * [fraction](#fraction)
63
+ * [unit](#unit)
64
+ * [date](#date)
65
+ * [time](#time)
66
+ * [telephone](#telephone)
67
+ * [phone](#phone)
68
+ * [address](#address)
69
+ * [interjection](#interjection)
70
+ * [expletive](#expletive)
71
+ * [sub](#sub)
72
+ * [whisper](#whisper)
73
+ * [amazon_verb](#amazon_verb)
74
+ * [amazon_participle](#amazon_participle)
75
+ * [amazon_noun](#amazon_noun)
76
+ * [amazon_sense](#amazon_sense)
77
+ * [phoneme](#phoneme)
78
+
79
+ ##### say
80
+
81
+ parameters
82
+ - string
83
+
84
+ ```ruby
85
+ require 'ssml_builder'
86
+ ssml_builder = SsmlBuilder::Builder.new
87
+ ssml_builder.say("Hello, how are you today?")
88
+
89
+ ssml_buider.ssml
90
+ # Output: "<speak>Hello, how are you today?</speak>"
91
+ ```
92
+
93
+ ##### paragraph
94
+
95
+ parameters
96
+ - string
97
+
98
+ ```ruby
99
+ require 'ssml_builder'
100
+ ssml_builder = SsmlBuilder::Builder.new
101
+ ssml_builder.paragraph("Hello, how are you today?")
102
+
103
+ ssml_buider.ssml
104
+ # Output: "<speak><p>Hello, how are you today?</p></speak>"
105
+ ```
106
+
107
+ ##### p
108
+
109
+ Alias for [paragraph](#paragraph)
110
+
111
+ ##### sentence
112
+
113
+ parameters
114
+ - string
115
+
116
+ ```ruby
117
+ require 'ssml_builder'
118
+ ssml_builder = SsmlBuilder::Builder.new
119
+ ssml_builder.sentence("Hello, how are you today?")
120
+
121
+ ssml_buider.ssml
122
+ # Output: "<speak><s>Hello, how are you today?</s></speak>"
123
+ ```
124
+
125
+ ##### rate
126
+
127
+ parameters
128
+ - string
129
+ - rate
130
+ - optional, default: "medium"
131
+ - can be integer or string
132
+ - valid text inputs: "x-slow", "slow", "medium", "fast", "x-fast"
133
+
134
+ ```ruby
135
+ require 'ssml_builder'
136
+ ssml_builder = SsmlBuilder::Builder.new
137
+ ssml_builder.rate("Text",90)
138
+
139
+ ssml_buider.ssml
140
+ # Output: "<speak><prosody rate=\"90%\">Text</prosody></speak>"
141
+ ```
142
+
143
+ ##### pitch
144
+
145
+ parameters
146
+ - string
147
+ - pitch
148
+ - optional, default: "medium"
149
+ - can be integer, float, or string
150
+ - minimum -33.3
151
+ - maximum 50
152
+ - valid text inputs: "x-low", "low", "medium", "high", "x-high"
153
+
154
+ ```ruby
155
+ require 'ssml_builder'
156
+ ssml_builder = SsmlBuilder::Builder.new
157
+ ssml_builder.pitch("Text",50)
158
+
159
+ ssml_buider.ssml
160
+ # Output: "<speak><prosody pitch=\"+50%\">Text</prosody></speak>"
161
+ ```
162
+
163
+ ##### volume
164
+
165
+ parameters
166
+ - string
167
+ - volume
168
+ - optional, default: "medium"
169
+ - can be integer, float, or string
170
+ - maximum 4.08
171
+ - valid text inputs: "silent", "x-soft", "soft", "medium", "loud", "x-loud"
172
+
173
+ ```ruby
174
+ require 'ssml_builder'
175
+ ssml_builder = SsmlBuilder::Builder.new
176
+ ssml_builder.volume("Text",2.3)
177
+
178
+ ssml_buider.ssml
179
+ # Output: "<speak><prosody volume=\"+2.3dB\">Text</prosody></speak>"
180
+ ```
181
+
182
+ ##### pause
183
+
184
+ parameters
185
+ - string
186
+ - optional, default: "medium"
187
+ - can be text time such as: "1s", "100ms", etc.
188
+ - valid text inputs: "none", "x-weak", "weak", "medium", "strong", "x-strong"
189
+
190
+ ```ruby
191
+ require 'ssml_builder'
192
+ ssml_builder = SsmlBuilder::Builder.new
193
+ ssml_builder.pause("1s")
194
+
195
+ ssml_buider.ssml
196
+ # Output: "<speak><break time=\"1s\"/></speak>"
197
+ ```
198
+
199
+ ##### break
200
+
201
+ Alias for [pause](#pause)
202
+
203
+ ##### emphasis
204
+
205
+ parameters
206
+ - string
207
+ - emphasis
208
+ - optional, default: "moderate"
209
+ - valid text inputs: "reduced", "moderate", "strong"
210
+
211
+ ```ruby
212
+ require 'ssml_builder'
213
+ ssml_builder = SsmlBuilder::Builder.new
214
+ ssml_builder.emphasis("Text","strong")
215
+
216
+ ssml_buider.ssml
217
+ # Output: "<speak><emphasis level=\"strong\">Text</emphasis></speak>"
218
+ ```
219
+
220
+ ##### audio
221
+
222
+ parameters
223
+ - url
224
+ - [SSML Audio Guidelines](https://developer.amazon.com/public/solutions/alexa/alexa-skills-kit/docs/speech-synthesis-markup-language-ssml-reference#audio)
225
+
226
+ ```ruby
227
+ require 'ssml_builder'
228
+ ssml_builder = SsmlBuilder::Builder.new
229
+ ssml_builder.audio("http://s3.audio.file.com/audio.mp3")
230
+
231
+ ssml_buider.ssml
232
+ # Output: "<speak><audio src=\"http://s3.audio.file.com/audio.mp3\"/></speak>"
233
+ ```
234
+
235
+ ##### spell_out
236
+
237
+ parameters
238
+ - string
239
+
240
+ ```ruby
241
+ require 'ssml_builder'
242
+ ssml_builder = SsmlBuilder::Builder.new
243
+ ssml_builder.spell_out("Spelling")
244
+
245
+ ssml_buider.ssml
246
+ # Output: "<speak><say-as interpret-as=\"spell-out\">Spelling</say-as></speak>"
247
+ ```
248
+
249
+ ##### characters
250
+
251
+ parameters
252
+ - string
253
+
254
+ ```ruby
255
+ require 'ssml_builder'
256
+ ssml_builder = SsmlBuilder::Builder.new
257
+ ssml_builder.characters("Spelling")
258
+
259
+ ssml_buider.ssml
260
+ # Output: "<speak><say-as interpret-as=\"characters\">Spelling</say-as></speak>"
261
+ ```
262
+
263
+ ##### cardinal
264
+
265
+ parameters
266
+ - string
267
+
268
+ ```ruby
269
+ require 'ssml_builder'
270
+ ssml_builder = SsmlBuilder::Builder.new
271
+ ssml_builder.cardinal("10")
272
+
273
+ ssml_buider.ssml
274
+ # Output: "<speak><say-as interpret-as=\"cardinal\">10</say-as></speak>"
275
+ ```
276
+
277
+ ##### number
278
+
279
+ parameters
280
+ - string
281
+
282
+ ```ruby
283
+ require 'ssml_builder'
284
+ ssml_builder = SsmlBuilder::Builder.new
285
+ ssml_builder.number("10")
286
+
287
+ ssml_buider.ssml
288
+ # Output: "<speak><say-as interpret-as=\"number\">10</say-as></speak>"
289
+ ```
290
+
291
+ ##### ordinal
292
+
293
+ parameters
294
+ - string
295
+
296
+ ```ruby
297
+ require 'ssml_builder'
298
+ ssml_builder = SsmlBuilder::Builder.new
299
+ ssml_builder.ordinal("10")
300
+
301
+ ssml_buider.ssml
302
+ # Output: "<speak><say-as interpret-as=\"ordinal\">10</say-as></speak>"
303
+ ```
304
+
305
+ ##### digits
306
+
307
+ parameters
308
+ - string
309
+
310
+ ```ruby
311
+ require 'ssml_builder'
312
+ ssml_builder = SsmlBuilder::Builder.new
313
+ ssml_builder.digits("10")
314
+
315
+ ssml_buider.ssml
316
+ # Output: "<speak><say-as interpret-as=\"digits\">10</say-as></speak>"
317
+ ```
318
+
319
+ ##### fraction
320
+
321
+ parameters
322
+ - string
323
+
324
+ ```ruby
325
+ require 'ssml_builder'
326
+ ssml_builder = SsmlBuilder::Builder.new
327
+ ssml_builder.fraction("3/20")
328
+
329
+ ssml_buider.ssml
330
+ # Output: "<speak><say-as interpret-as=\"fraction\">3/20</say-as></speak>"
331
+ ```
332
+
333
+ ##### unit
334
+
335
+ parameters
336
+ - string
337
+
338
+ ```ruby
339
+ require 'ssml_builder'
340
+ ssml_builder = SsmlBuilder::Builder.new
341
+ ssml_builder.unit("10 meters")
342
+
343
+ ssml_buider.ssml
344
+ # Output: "<speak><say-as interpret-as=\"unit\">10meters</say-as></speak>"
345
+ ```
346
+
347
+ ##### date
348
+
349
+ parameters
350
+ - year
351
+ - string or integer
352
+ - nil to leave out
353
+ - month
354
+ - string or integer
355
+ - nil to leave out
356
+ - day
357
+ - string or integer
358
+ - nil to leave out
359
+
360
+ ```ruby
361
+ require 'ssml_builder'
362
+ ssml_builder = SsmlBuilder::Builder.new
363
+ ssml_builder.date("2017",nil,10)
364
+
365
+ ssml_buider.ssml
366
+ # Output: "<speak><say-as interpret-as=\"date\">2017??10</say-as></speak>"
367
+ ```
368
+
369
+ ##### time
370
+
371
+ parameters
372
+ - string
373
+
374
+ ```ruby
375
+ require 'ssml_builder'
376
+ ssml_builder = SsmlBuilder::Builder.new
377
+ ssml_builder.time("2'")
378
+
379
+ ssml_buider.ssml
380
+ # Output: "<speak><say-as interpret-as=\"time\">2'</say-as></speak>"
381
+ ```
382
+
383
+ ##### telephone
384
+
385
+ parameters
386
+ - string
387
+
388
+ ```ruby
389
+ require 'ssml_builder'
390
+ ssml_builder = SsmlBuilder::Builder.new
391
+ ssml_builder.telephone("1234567890")
392
+
393
+ ssml_buider.ssml
394
+ # Output: "<speak><say-as interpret-as=\"telephone\">1234567890</say-as></speak>"
395
+ ```
396
+
397
+ ##### phone
398
+
399
+ Alias for [telephone](#telephone)
400
+
401
+ ##### address
402
+
403
+ parameters
404
+ - string
405
+
406
+ ```ruby
407
+ require 'ssml_builder'
408
+ ssml_builder = SsmlBuilder::Builder.new
409
+ ssml_builder.address("342 W 1st St")
410
+
411
+ ssml_buider.ssml
412
+ # Output: "<speak><say-as interpret-as=\"address\">342 W 1st St</say-as></speak>"
413
+ ```
414
+
415
+ ##### interjection
416
+
417
+ parameters
418
+ - string
419
+
420
+ ```ruby
421
+ require 'ssml_builder'
422
+ ssml_builder = SsmlBuilder::Builder.new
423
+ ssml_builder.interjection("Wow!")
424
+
425
+ ssml_buider.ssml
426
+ # Output: "<speak><say-as interpret-as=\"interjection\">Wow!</say-as></speak>"
427
+ ```
428
+
429
+ ##### expletive
430
+
431
+ parameters
432
+ - string
433
+
434
+ ```ruby
435
+ require 'ssml_builder'
436
+ ssml_builder = SsmlBuilder::Builder.new
437
+ ssml_builder.expletive("Curse Word")
438
+
439
+ ssml_buider.ssml
440
+ # Output: "<speak><say-as interpret-as=\"expletive\">Curse Word</say-as></speak>"
441
+ ```
442
+
443
+ ##### sub
444
+
445
+ parameters
446
+ - string
447
+ - alias
448
+
449
+ ```ruby
450
+ require 'ssml_builder'
451
+ ssml_builder = SsmlBuilder::Builder.new
452
+ ssml_builder.sub("Al","aluminum")
453
+
454
+ ssml_buider.ssml
455
+ # Output: "<speak><sub alias=\"aluminum\">Al</sub></speak>"
456
+ ```
457
+
458
+ ##### whisper
459
+
460
+ parameters
461
+ - string
462
+
463
+ ```ruby
464
+ require 'ssml_builder'
465
+ ssml_builder = SsmlBuilder::Builder.new
466
+ ssml_builder.whisper("Be very quiet")
467
+
468
+ ssml_buider.ssml
469
+ # Output: "<speak><amazon:effect name=\"whispered\">Be very quiet</amazon:effect></speak>"
470
+ ```
471
+
472
+ ##### amazon_verb
473
+
474
+ parameters
475
+ - string
476
+
477
+ ```ruby
478
+ require 'ssml_builder'
479
+ ssml_builder = SsmlBuilder::Builder.new
480
+ ssml_builder.amazon_verb("read")
481
+
482
+ ssml_buider.ssml
483
+ # Output: "<speak><w role=\"amazon:VB\">read</w></speak>"
484
+ ```
485
+
486
+ ##### amazon_participle
487
+
488
+ parameters
489
+ - string
490
+
491
+ ```ruby
492
+ require 'ssml_builder'
493
+ ssml_builder = SsmlBuilder::Builder.new
494
+ ssml_builder.amazon_participle("read")
495
+
496
+ ssml_buider.ssml
497
+ # Output: "<speak><w role=\"amazon:VBD\">read</w></speak>"
498
+ ```
499
+
500
+ ##### amazon_noun
501
+
502
+ parameters
503
+ - string
504
+
505
+ ```ruby
506
+ require 'ssml_builder'
507
+ ssml_builder = SsmlBuilder::Builder.new
508
+ ssml_builder.amazon_noun("bath")
509
+
510
+ ssml_buider.ssml
511
+ # Output: "<speak><w role=\"amazon:NN\">bath</w></speak>"
512
+ ```
513
+
514
+ ##### amazon_sense
515
+
516
+ parameters
517
+ - string
518
+ - sense
519
+ - integer
520
+ - [Sense Documentation](https://developer.amazon.com/public/solutions/alexa/alexa-skills-kit/docs/speech-synthesis-markup-language-ssml-reference#w)
521
+
522
+ ```ruby
523
+ require 'ssml_builder'
524
+ ssml_builder = SsmlBuilder::Builder.new
525
+ ssml_builder.amazon_sense("bass",1)
526
+
527
+ ssml_buider.ssml
528
+ # Output: "<speak><w role=\"SENSE_1\">bass</w></speak>"
529
+ ```
530
+
531
+ ##### phoneme
532
+
533
+ [Amazon Phoneme Documentation](https://developer.amazon.com/public/solutions/alexa/alexa-skills-kit/docs/speech-synthesis-markup-language-ssml-reference#phoneme)
534
+
535
+ parameters
536
+ - string
537
+ - alphabet
538
+ - string
539
+ - ph
540
+ - string
541
+
542
+ ```ruby
543
+ require 'ssml_builder'
544
+ ssml_builder = SsmlBuilder::Builder.new
545
+ ssml_builder.phoneme("pecan","ipa","pɪˈkɑːn")
546
+
547
+ ssml_buider.ssml
548
+ # Output: "<speak><phoneme alphabet=\"ipa\" ph=\"pɪˈkɑːn\">pecan</phoneme></speak>"
549
+ ```
550
+
551
+ ### String
552
+
553
+
554
+ ## Troubleshooting
555
+
556
+
557
+ ## Contributing
558
+
559
+ 1. Fork it
560
+ 2. Create your feature branch (`git checkout -b my-new-feature`)
561
+ 3. Commit your changes (`git commit -am 'Add some feature'`)
562
+ 4. Push to the branch (`git push origin my-new-feature`)
563
+ 5. Create a new Pull Request
564
+
565
+ Please make sure to write specs for any new features!
566
+
567
+ # Team Members
568
+ - "Paul McMahon"
569
+ - Email: <colpan@sircolpaniusjackson.com>
570
+ - Twitter: [@colpanius](https://twitter.com/colpanius)
@@ -0,0 +1 @@
1
+ require "bundler/gem_tasks"
@@ -0,0 +1,12 @@
1
+ require 'ssml_builder/builder'
2
+ require 'ssml_builder/version'
3
+ require 'ssml_builder/core_extensions/string'
4
+
5
+ module SsmlBuilder
6
+
7
+ # Prints the Gem version.
8
+ def self.print_version
9
+ p SsmlBuilder::VERSION
10
+ end
11
+
12
+ end
@@ -0,0 +1,216 @@
1
+ module SsmlBuilder
2
+
3
+ class Builder
4
+ attr_reader :ssml_content
5
+
6
+ def initialize
7
+ @ssml_content = ""
8
+ end
9
+
10
+ def say(string)
11
+ space_precheck
12
+ @ssml_content += remove_characters(string)
13
+ end
14
+
15
+ def paragraph(string)
16
+ @ssml_content += "<p>" + remove_characters(string) + "</p>"
17
+ end
18
+
19
+ def p(string)
20
+ # ALIAS for paragraph
21
+ paragraph(string)
22
+ end
23
+
24
+ def sentence(string)
25
+ @ssml_content += "<s>" + remove_characters(string) + "</s>"
26
+ end
27
+
28
+ def rate(string,rate = "medium")
29
+ space_precheck
30
+ if !["x-slow", "slow", "medium", "fast", "x-fast"].include?(rate)
31
+ rate = (rate.to_i > 20 ? rate.to_i : 20).to_s + "%"
32
+ end
33
+ @ssml_content += "<prosody rate=\"" + rate + "\">" + remove_characters(string) + "</prosody>"
34
+ end
35
+
36
+ def pitch(string,pitch = "medium")
37
+ space_precheck
38
+ if !["x-low", "low", "medium", "high", "x-high"].include?(pitch)
39
+ pitch = pitch.to_f > -33.3 ? pitch.to_f : -33.3
40
+ pitch = (pitch.to_f < 50.0 ? pitch : 50.0)
41
+ pitch = pitch > 0 ? "+%g%" % ("%.2f" % pitch) : "%g%" % ("%.2f" % pitch)
42
+ end
43
+ @ssml_content += "<prosody pitch=\"" + pitch + "\">" + remove_characters(string) + "</prosody>"
44
+ end
45
+
46
+ def volume(string,volume = "medium")
47
+ space_precheck
48
+ if !["silent", "x-soft", "soft", "medium", "loud", "x-loud"].include?(volume)
49
+ volume = volume.to_f < 4.08 ? volume.to_f : 4.08
50
+ volume = volume > 0 ? "+%gdB" % ("%.2f" % volume) : "%gdB" % ("%.2f" % volume)
51
+ end
52
+ @ssml_content += "<prosody volume=\"" + volume + "\">" + remove_characters(string) + "</prosody>"
53
+ end
54
+
55
+ def prosody
56
+ # UNKOWN HOW I WANT TO USE
57
+ end
58
+
59
+ def pause(length = "medium")
60
+ space_precheck
61
+ if ["none", "x-weak", "weak", "medium", "strong", "x-strong"].include?(length.downcase)
62
+ @ssml_content += "<break strength=\"" + length.downcase + "\"/>"
63
+ else
64
+ @ssml_content += "<break time=\"" + length + "\"/>"
65
+ end
66
+ end
67
+
68
+ def break(length = "medium")
69
+ # ALIAS for pause
70
+ pause(length)
71
+ end
72
+
73
+ def emphasis(string,level = "moderate")
74
+ space_precheck
75
+ @ssml_content += "<emphasis level=\"" + level + "\">" + string + "</emphasis>"
76
+ end
77
+
78
+ def audio(url)
79
+ space_precheck
80
+ @ssml_content += "<audio src=\"" + url + "\"/>"
81
+ end
82
+
83
+ def spell_out(string)
84
+ space_precheck
85
+ @ssml_content += "<say-as interpret-as=\"spell-out\">" + string + "</say-as>"
86
+ end
87
+
88
+ def characters(string)
89
+ space_precheck
90
+ @ssml_content += "<say-as interpret-as=\"characters\">" + string + "</say-as>"
91
+ end
92
+
93
+ def cardinal(string)
94
+ space_precheck
95
+ @ssml_content += "<say-as interpret-as=\"cardinal\">" + string + "</say-as>"
96
+ end
97
+
98
+ def number(string)
99
+ space_precheck
100
+ @ssml_content += "<say-as interpret-as=\"number\">" + string + "</say-as>"
101
+ end
102
+
103
+ def ordinal(string)
104
+ space_precheck
105
+ @ssml_content += "<say-as interpret-as=\"ordinal\">" + string + "</say-as>"
106
+ end
107
+
108
+ def digits(string)
109
+ space_precheck
110
+ @ssml_content += "<say-as interpret-as=\"digits\">" + string + "</say-as>"
111
+ end
112
+
113
+ def fraction(string)
114
+ space_precheck
115
+ @ssml_content += "<say-as interpret-as=\"fraction\">" + string + "</say-as>"
116
+ end
117
+
118
+ def unit(string)
119
+ space_precheck
120
+ @ssml_content += "<say-as interpret-as=\"unit\">" + string.gsub(/ /,'') + "</say-as>"
121
+ end
122
+
123
+ def date(year = nil, month = nil, day = nil)
124
+ space_precheck
125
+ year = year.nil? ? "????" : year.to_s
126
+ month = month.nil? ? "??" : month.to_s.rjust(2, '0')
127
+ day = day.nil? ? "??" : day.to_s.rjust(2, '0')
128
+ @ssml_content += "<say-as interpret-as=\"date\">" + year + month + day + "</say-as>"
129
+ end
130
+
131
+ def time(string)
132
+ space_precheck
133
+ @ssml_content += "<say-as interpret-as=\"time\">" + string + "</say-as>"
134
+ end
135
+
136
+ def telephone(string)
137
+ space_precheck
138
+ @ssml_content += "<say-as interpret-as=\"telephone\">" + string + "</say-as>"
139
+ end
140
+
141
+ def phone(string)
142
+ # ALIAS of telephone
143
+ telephone(string)
144
+ end
145
+
146
+ def address(string)
147
+ space_precheck
148
+ @ssml_content += "<say-as interpret-as=\"address\">" + string + "</say-as>"
149
+ end
150
+
151
+ def interjection(string)
152
+ space_precheck
153
+ @ssml_content += "<say-as interpret-as=\"interjection\">" + string + "</say-as>"
154
+ end
155
+
156
+ def expletive(string)
157
+ space_precheck
158
+ @ssml_content += "<say-as interpret-as=\"expletive\">" + string + "</say-as>"
159
+ end
160
+
161
+ def sub(string,alias_str)
162
+ space_precheck
163
+ @ssml_content += "<sub alias=\"" + alias_str + "\">" + string + "</sub>"
164
+ end
165
+
166
+ def whisper(string)
167
+ if !string.nil? && !string.empty?
168
+ space_precheck
169
+ @ssml_content += "<amazon:effect name=\"whispered\">" + string + "</amazon:effect>"
170
+ end
171
+ end
172
+
173
+ def amazon_verb(string)
174
+ space_precheck
175
+ @ssml_content += "<w role=\"amazon:VB\">" + string + "</w>"
176
+ end
177
+
178
+ def amazon_participle(string)
179
+ space_precheck
180
+ @ssml_content += "<w role=\"amazon:VBD\">" + string + "</w>"
181
+ end
182
+
183
+ def amazon_noun(string)
184
+ space_precheck
185
+ @ssml_content += "<w role=\"amazon:NN\">" + string + "</w>"
186
+ end
187
+
188
+ def amazon_sense(string,sense = 1)
189
+ space_precheck
190
+ @ssml_content += "<w role=\"SENSE_" + sense.to_s + "\">" + string + "</w>"
191
+ end
192
+
193
+ def phoneme(string,alphabet = "ipa",ph = "")
194
+ space_precheck
195
+ @ssml_content += "<phoneme alphabet=\"" + alphabet + "\" ph=\"" + ph + "\">" + string + "</phoneme>"
196
+ end
197
+
198
+ def ssml
199
+ return "<speak>" + @ssml_content + "</speak>"
200
+ end
201
+
202
+ private
203
+
204
+ def remove_characters(string)
205
+ return string.gsub(/['"`]/,'')
206
+ end
207
+
208
+ def space_precheck
209
+ if !@ssml_content.empty? && @ssml_content[-1] != " "
210
+ @ssml_content += " "
211
+ end
212
+ end
213
+
214
+ end
215
+
216
+ end
@@ -0,0 +1,171 @@
1
+ module SsmlBuilder::String
2
+
3
+ def ssml_say
4
+ return ssml_remove_special_characters(self)
5
+ end
6
+
7
+ def ssml_paragraph
8
+ return "<p>" + ssml_remove_special_characters(self) + "</p>"
9
+ end
10
+
11
+ def ssml_p
12
+ # ALIAS for paragraph
13
+ return self.ssml_paragraph
14
+ end
15
+
16
+ def ssml_sentence
17
+ return "<s>" + ssml_remove_special_characters(self) + "</s>"
18
+ end
19
+
20
+ def ssml_rate(rate = "medium")
21
+ if !["x-slow", "slow", "medium", "fast", "x-fast"].include?(rate)
22
+ rate = (rate.to_i > 20 ? rate.to_i : 20).to_s + "%"
23
+ end
24
+ return "<prosody rate=\"" + rate + "\">" + ssml_remove_special_characters(self) + "</prosody>"
25
+ end
26
+
27
+ def ssml_pitch(pitch = "medium")
28
+ if !["x-low", "low", "medium", "high", "x-high"].include?(pitch)
29
+ pitch = pitch.to_f > -33.3 ? pitch.to_f : -33.3
30
+ pitch = (pitch.to_f < 50.0 ? pitch : 50.0)
31
+ pitch = pitch > 0 ? "+%g%" % ("%.2f" % pitch) : "%g%" % ("%.2f" % pitch)
32
+ end
33
+ return "<prosody pitch=\"" + pitch + "\">" + ssml_remove_special_characters(self) + "</prosody>"
34
+ end
35
+
36
+ def ssml_volume(volume = "medium")
37
+ if !["silent", "x-soft", "soft", "medium", "loud", "x-loud"].include?(volume)
38
+ volume = volume.to_f < 4.08 ? volume.to_f : 4.08
39
+ volume = volume > 0 ? "+%gdB" % ("%.2f" % volume) : "%gdB" % ("%.2f" % volume)
40
+ end
41
+ return "<prosody volume=\"" + volume + "\">" + ssml_remove_special_characters(self) + "</prosody>"
42
+ end
43
+
44
+ def ssml_prosody
45
+ # UNKOWN HOW I WANT TO USE
46
+ end
47
+
48
+ def ssml_pause(length = "medium")
49
+ if ["none", "x-weak", "weak", "medium", "strong", "x-strong"].include?(length.downcase)
50
+ return "<break strength=\"" + length.downcase + "\"/>"
51
+ else
52
+ return "<break time=\"" + length + "\"/>"
53
+ end
54
+ end
55
+
56
+ def ssml_break(length = "medium")
57
+ # ALIAS for ssml_pause
58
+ return self.ssml_pause(length)
59
+ end
60
+
61
+ def ssml_emphasis(level = "moderate")
62
+ return "<emphasis level=\"" + level + "\">" + self + "</emphasis>"
63
+ end
64
+
65
+ def ssml_audio
66
+ return "<audio src=\"" + self + "\"/>"
67
+ end
68
+
69
+ def ssml_spell_out
70
+ return "<say-as interpret-as=\"spell-out\">" + self + "</say-as>"
71
+ end
72
+
73
+ def ssml_characters
74
+ return "<say-as interpret-as=\"characters\">" + self + "</say-as>"
75
+ end
76
+
77
+ def ssml_cardinal
78
+ return "<say-as interpret-as=\"cardinal\">" + self + "</say-as>"
79
+ end
80
+
81
+ def ssml_number
82
+ return "<say-as interpret-as=\"number\">" + self + "</say-as>"
83
+ end
84
+
85
+ def ssml_ordinal
86
+ return "<say-as interpret-as=\"ordinal\">" + self + "</say-as>"
87
+ end
88
+
89
+ def ssml_digits
90
+ return "<say-as interpret-as=\"digits\">" + self + "</say-as>"
91
+ end
92
+
93
+ def ssml_fraction
94
+ return "<say-as interpret-as=\"fraction\">" + self + "</say-as>"
95
+ end
96
+
97
+ def ssml_unit
98
+ return "<say-as interpret-as=\"unit\">" + self.gsub(/ /,'') + "</say-as>"
99
+ end
100
+
101
+ def ssml_date
102
+ return "<say-as interpret-as=\"date\">" + self + "</say-as>"
103
+ end
104
+
105
+ def ssml_time
106
+ return "<say-as interpret-as=\"time\">" + self + "</say-as>"
107
+ end
108
+
109
+ def ssml_telephone
110
+ return "<say-as interpret-as=\"telephone\">" + self + "</say-as>"
111
+ end
112
+
113
+ def ssml_phone
114
+ # ALIAS of telephone
115
+ return self.ssml_telephone
116
+ end
117
+
118
+ def ssml_address
119
+ return "<say-as interpret-as=\"address\">" + self + "</say-as>"
120
+ end
121
+
122
+ def ssml_interjection
123
+ return "<say-as interpret-as=\"interjection\">" + self + "</say-as>"
124
+ end
125
+
126
+ def ssml_expletive
127
+ return "<say-as interpret-as=\"expletive\">" + self + "</say-as>"
128
+ end
129
+
130
+ def ssml_sub(alias_str)
131
+ return "<sub alias=\"" + alias_str + "\">" + self + "</sub>"
132
+ end
133
+
134
+ def ssml_whisper
135
+ return "<amazon:effect name=\"whispered\">" + self + "</amazon:effect>"
136
+ end
137
+
138
+ def ssml_amazon_verb
139
+ return "<w role=\"amazon:VB\">" + self + "</w>"
140
+ end
141
+
142
+ def ssml_amazon_participle
143
+ return "<w role=\"amazon:VBD\">" + self + "</w>"
144
+ end
145
+
146
+ def ssml_amazon_noun
147
+ return "<w role=\"amazon:NN\">" + self + "</w>"
148
+ end
149
+
150
+ def ssml_amazon_sense(sense = 1)
151
+ return "<w role=\"SENSE_" + sense.to_s + "\">" + self + "</w>"
152
+ end
153
+
154
+ def ssml_phoneme(alphabet = "ipa",ph = "")
155
+ return "<phoneme alphabet=\"" + alphabet + "\" ph=\"" + ph + "\">" + self + "</phoneme>"
156
+ end
157
+
158
+ def to_ssml
159
+ return "<speak>" + self + "</speak>"
160
+ end
161
+
162
+ private
163
+
164
+ def ssml_remove_special_characters(string)
165
+ return string.gsub(/['"`]/,'')
166
+ end
167
+ end
168
+
169
+ class String
170
+ include SsmlBuilder::String
171
+ end
@@ -0,0 +1,3 @@
1
+ module SsmlBuilder
2
+ VERSION = '1.0.0'
3
+ end
metadata ADDED
@@ -0,0 +1,120 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: ssml_builder
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Paul McMahon
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2017-06-22 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: bundler
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '1.7'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '1.7'
27
+ - !ruby/object:Gem::Dependency
28
+ name: rake
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - ">="
32
+ - !ruby/object:Gem::Version
33
+ version: '0'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - ">="
39
+ - !ruby/object:Gem::Version
40
+ version: '0'
41
+ - !ruby/object:Gem::Dependency
42
+ name: rspec
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '3.2'
48
+ - - ">="
49
+ - !ruby/object:Gem::Version
50
+ version: 3.2.0
51
+ type: :development
52
+ prerelease: false
53
+ version_requirements: !ruby/object:Gem::Requirement
54
+ requirements:
55
+ - - "~>"
56
+ - !ruby/object:Gem::Version
57
+ version: '3.2'
58
+ - - ">="
59
+ - !ruby/object:Gem::Version
60
+ version: 3.2.0
61
+ - !ruby/object:Gem::Dependency
62
+ name: rspec-mocks
63
+ requirement: !ruby/object:Gem::Requirement
64
+ requirements:
65
+ - - "~>"
66
+ - !ruby/object:Gem::Version
67
+ version: '3.2'
68
+ - - ">="
69
+ - !ruby/object:Gem::Version
70
+ version: 3.2.0
71
+ type: :development
72
+ prerelease: false
73
+ version_requirements: !ruby/object:Gem::Requirement
74
+ requirements:
75
+ - - "~>"
76
+ - !ruby/object:Gem::Version
77
+ version: '3.2'
78
+ - - ">="
79
+ - !ruby/object:Gem::Version
80
+ version: 3.2.0
81
+ description: Gem for building SSML messages for Amazon Alexa
82
+ email:
83
+ - colpan@sircolpaniusjackson.com
84
+ executables: []
85
+ extensions: []
86
+ extra_rdoc_files: []
87
+ files:
88
+ - Gemfile
89
+ - LICENSE.txt
90
+ - README.md
91
+ - Rakefile
92
+ - lib/ssml_builder.rb
93
+ - lib/ssml_builder/builder.rb
94
+ - lib/ssml_builder/core_extensions/string.rb
95
+ - lib/ssml_builder/version.rb
96
+ homepage: https://github.com/colpan/ssml_builder
97
+ licenses:
98
+ - MIT
99
+ metadata: {}
100
+ post_install_message:
101
+ rdoc_options: []
102
+ require_paths:
103
+ - lib
104
+ required_ruby_version: !ruby/object:Gem::Requirement
105
+ requirements:
106
+ - - ">="
107
+ - !ruby/object:Gem::Version
108
+ version: '0'
109
+ required_rubygems_version: !ruby/object:Gem::Requirement
110
+ requirements:
111
+ - - ">="
112
+ - !ruby/object:Gem::Version
113
+ version: '0'
114
+ requirements: []
115
+ rubyforge_project:
116
+ rubygems_version: 2.4.5.1
117
+ signing_key:
118
+ specification_version: 4
119
+ summary: Gem for building SSML messages for Amazon Alexa
120
+ test_files: []