azure-tts 1.0.0

Sign up to get free protection for your applications and to get access to all the features.
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 8c79274a53effe752e008a7f1b734bbdb12723c44328b847fdeb65126c73c42f
4
+ data.tar.gz: cc45ae147e0e443471486380382cb0ddc1ac0798cf82f5befa80e0630a14e856
5
+ SHA512:
6
+ metadata.gz: 014fd74c519b328a561399dc7afcebe50cf0387171739887b323e7e8c6d986658407e441f596636ca340d4f89a977c00f6e28bfbb4727206bba832c69f2bbc95
7
+ data.tar.gz: 8a71e2b3109cf02fbf9ff9e3478347adb8d15d496ebb79c240297ca0af743459a9a129025dead2fb465e5e4d0016592a2b1cad352f47b53ce3c7bfacfd2af4ec
@@ -0,0 +1,42 @@
1
+ name: RubyGem
2
+
3
+ on: [push]
4
+
5
+ jobs:
6
+ test:
7
+ runs-on: ubuntu-latest
8
+ steps:
9
+ - name: Checkout
10
+ uses: actions/checkout@v1
11
+
12
+ - name: Set up Ruby 2.6
13
+ uses: actions/setup-ruby@v1
14
+ with:
15
+ ruby-version: 2.6.x
16
+ - name: Test
17
+ run: |
18
+ gem install bundler
19
+ bundle install --jobs 4 --retry 3
20
+ bundle exec rake
21
+
22
+ publish:
23
+ needs: test
24
+ runs-on: ubuntu-latest
25
+ steps:
26
+ - name: Checkout
27
+ uses: actions/checkout@v1
28
+ - name: Set up Ruby 2.6
29
+ uses: actions/setup-ruby@v1
30
+ with:
31
+ ruby-version: 2.6.x
32
+ - name: Publish
33
+ if: github.ref == 'refs/heads/master'
34
+ run: |
35
+ mkdir -p $HOME/.gem
36
+ touch $HOME/.gem/credentials
37
+ chmod 0600 $HOME/.gem/credentials
38
+ printf -- "---\n:rubygems_api_key: ${GEM_HOST_API_KEY}\n" > $HOME/.gem/credentials
39
+ gem build *.gemspec
40
+ gem push *.gem
41
+ env:
42
+ GEM_HOST_API_KEY: ${{secrets.RUBYGEMS_AUTH_TOKEN}}
@@ -0,0 +1,8 @@
1
+ /.bundle/
2
+ /.yardoc
3
+ /_yardoc/
4
+ /coverage/
5
+ /doc/
6
+ /pkg/
7
+ /spec/reports/
8
+ /tmp/
@@ -0,0 +1,11 @@
1
+ Style/StringLiterals:
2
+ EnforcedStyle: double_quotes
3
+
4
+ Metrics/LineLength:
5
+ Enabled: false
6
+
7
+ Style/ClassAndModuleChildren:
8
+ Enabled: false
9
+
10
+ Style/Documentation:
11
+ Enabled: false
data/Gemfile ADDED
@@ -0,0 +1,8 @@
1
+ # frozen_string_literal: true
2
+
3
+ source "https://rubygems.org"
4
+
5
+ git_source(:github) { |repo_name| "https://github.com/#{repo_name}" }
6
+
7
+ # Specify your gem's dependencies in azure-tts.gemspec
8
+ gemspec
@@ -0,0 +1,72 @@
1
+ PATH
2
+ remote: .
3
+ specs:
4
+ azure-tts (1.0.0)
5
+ faraday
6
+ faraday_middleware
7
+ ruby_speech
8
+
9
+ GEM
10
+ remote: https://rubygems.org/
11
+ specs:
12
+ activesupport (4.2.11.1)
13
+ i18n (~> 0.7)
14
+ minitest (~> 5.1)
15
+ thread_safe (~> 0.3, >= 0.3.4)
16
+ tzinfo (~> 1.1)
17
+ addressable (2.7.0)
18
+ public_suffix (>= 2.0.2, < 5.0)
19
+ coderay (1.1.2)
20
+ concurrent-ruby (1.1.5)
21
+ crack (0.4.3)
22
+ safe_yaml (~> 1.0.0)
23
+ faraday (0.15.4)
24
+ multipart-post (>= 1.2, < 3)
25
+ faraday_middleware (0.13.1)
26
+ faraday (>= 0.7.4, < 1.0)
27
+ hashdiff (1.0.0)
28
+ i18n (0.9.5)
29
+ concurrent-ruby (~> 1.0)
30
+ method_source (0.9.2)
31
+ mini_portile2 (2.4.0)
32
+ minitest (5.11.3)
33
+ minitest-around (0.5.0)
34
+ minitest (~> 5.0)
35
+ multi_json (1.13.1)
36
+ multipart-post (2.1.1)
37
+ nokogiri (1.10.4)
38
+ mini_portile2 (~> 2.4.0)
39
+ pry (0.12.2)
40
+ coderay (~> 1.1.0)
41
+ method_source (~> 0.9.0)
42
+ public_suffix (4.0.1)
43
+ rake (10.5.0)
44
+ ruby_speech (3.0.0)
45
+ activesupport (>= 3.0.7, < 5.0.0)
46
+ nokogiri (~> 1.8, >= 1.8.3)
47
+ safe_yaml (1.0.5)
48
+ thread_safe (0.3.6)
49
+ tzinfo (1.2.5)
50
+ thread_safe (~> 0.1)
51
+ vcr (2.9.3)
52
+ webmock (3.7.2)
53
+ addressable (>= 2.3.6)
54
+ crack (>= 0.3.2)
55
+ hashdiff (>= 0.4.0, < 2.0.0)
56
+
57
+ PLATFORMS
58
+ ruby
59
+
60
+ DEPENDENCIES
61
+ azure-tts!
62
+ bundler (~> 1.17)
63
+ minitest (~> 5.0)
64
+ minitest-around
65
+ multi_json
66
+ pry
67
+ rake (~> 10.0)
68
+ vcr
69
+ webmock
70
+
71
+ BUNDLED WITH
72
+ 1.17.2
@@ -0,0 +1,21 @@
1
+ The MIT License (MIT)
2
+
3
+ Copyright (c) 2019 Cristian Bica
4
+
5
+ Permission is hereby granted, free of charge, to any person obtaining a copy
6
+ of this software and associated documentation files (the "Software"), to deal
7
+ in the Software without restriction, including without limitation the rights
8
+ to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
9
+ copies of the Software, and to permit persons to whom the Software is
10
+ furnished to do so, subject to the following conditions:
11
+
12
+ The above copyright notice and this permission notice shall be included in
13
+ all copies or substantial portions of the Software.
14
+
15
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
16
+ IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
17
+ FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
18
+ AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
19
+ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
20
+ OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
21
+ THE SOFTWARE.
@@ -0,0 +1,55 @@
1
+ # Azure::TTS
2
+
3
+ Text-to-speech gem based using Azure Cognitive Speech Services.
4
+
5
+ Status: alpha (has just some basic testing)
6
+
7
+ ## Installation
8
+
9
+ Add this line to your application's Gemfile:
10
+
11
+ ```ruby
12
+ gem 'azure-tts'
13
+ ```
14
+
15
+ And then execute:
16
+
17
+ $ bundle
18
+
19
+ Or install it yourself as:
20
+
21
+ $ gem install azure-tts
22
+
23
+ ## Usage
24
+
25
+ Obtain a Cognitive Services Subscription key ([get a trial one here](https://azure.microsoft.com/try/cognitive-services/)). Read more about the Cognitive Services TTS [here](https://docs.microsoft.com/en-us/azure/cognitive-services/speech-service/rest-text-to-speech).
26
+
27
+ ```ruby
28
+
29
+ Azure::TTS.configure do |config|
30
+ config.region = "eastus"
31
+ config.api_key = "YOUR_SUBSCRIPTION_KEY"
32
+ end
33
+
34
+ Azure::TTS.voices # => returns a list of voices available in the region
35
+
36
+ Azure::TTS.(text: "Hello world!", locale: "en_US", gender: :female, neural: true)
37
+ Azure::TTS.(text: "Hello world!", locale: "en_US", gender: :female)
38
+ Azure::TTS.(text: "Hello world!", locale: "en_US", format: :audio_24khz_160kbitrate_mono_mp3)
39
+ ```
40
+
41
+ Note: see `constants.rb` for available formats.
42
+
43
+ ## Development
44
+
45
+ After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment.
46
+
47
+ To install this gem onto your local machine, run `bundle exec rake install`. To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and tags, and push the `.gem` file to [rubygems.org](https://rubygems.org).
48
+
49
+ ## Contributing
50
+
51
+ Bug reports and pull requests are welcome on GitHub at https://github.com/cristianbica/azure-tts.
52
+
53
+ ## License
54
+
55
+ The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT).
@@ -0,0 +1,12 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "bundler/gem_tasks"
4
+ require "rake/testtask"
5
+
6
+ Rake::TestTask.new(:test) do |t|
7
+ t.libs << "test"
8
+ t.libs << "lib"
9
+ t.test_files = FileList["test/**/*_test.rb"]
10
+ end
11
+
12
+ task default: :test
@@ -0,0 +1,37 @@
1
+ # frozen_string_literal: true
2
+
3
+ lib = File.expand_path("lib", __dir__)
4
+ $LOAD_PATH.unshift(lib) unless $LOAD_PATH.include?(lib)
5
+ require "azure/tts/version"
6
+
7
+ Gem::Specification.new do |spec|
8
+ spec.name = "azure-tts"
9
+ spec.version = Azure::TTS::VERSION
10
+ spec.authors = ["Cristian Bica"]
11
+ spec.email = ["cristian.bica@gmail.com"]
12
+
13
+ spec.summary = "Azure TTS"
14
+ spec.description = "Text-to-speech gem based using Azure Cognitive Speech Services."
15
+ spec.homepage = "https://github.com/cristianbica/azure-tts"
16
+ spec.license = "MIT"
17
+
18
+ spec.files = Dir.chdir(File.expand_path(__dir__)) do
19
+ `git ls-files -z`.split("\x0").reject { |f| f.match(%r{^(test|spec|features)/}) }
20
+ end
21
+ spec.bindir = "exe"
22
+ spec.executables = spec.files.grep(%r{^exe/}) { |f| File.basename(f) }
23
+ spec.require_paths = ["lib"]
24
+
25
+ spec.add_dependency "faraday"
26
+ spec.add_dependency "faraday_middleware"
27
+ spec.add_dependency "ruby_speech"
28
+
29
+ spec.add_development_dependency "bundler", "~> 1.17"
30
+ spec.add_development_dependency "minitest", "~> 5.0"
31
+ spec.add_development_dependency "minitest-around"
32
+ spec.add_development_dependency "pry"
33
+ spec.add_development_dependency "rake", "~> 10.0"
34
+ spec.add_development_dependency "vcr"
35
+ spec.add_development_dependency "webmock"
36
+ spec.add_development_dependency "multi_json"
37
+ end
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env ruby
2
+ # frozen_string_literal: true
3
+
4
+ require "bundler/setup"
5
+ require "azure/tts"
6
+ require "pry"
7
+
8
+ Pry.start
@@ -0,0 +1,8 @@
1
+ #!/usr/bin/env bash
2
+ set -euo pipefail
3
+ IFS=$'\n\t'
4
+ set -vx
5
+
6
+ bundle install
7
+
8
+ # Do any other automated setup that you need to do here
@@ -0,0 +1,56 @@
1
+ # frozen_string_literal: true
2
+
3
+ require "azure/tts/version"
4
+
5
+ require "faraday"
6
+ require "faraday_middleware"
7
+ require "ruby_speech"
8
+
9
+ require "azure/tts/constants"
10
+ require "azure/tts/errors"
11
+ require "azure/tts/api"
12
+ require "azure/tts/configuration"
13
+ require "azure/tts/token"
14
+ require "azure/tts/speaker"
15
+ require "azure/tts/voices"
16
+
17
+ module Azure
18
+ module TTS
19
+ include Azure::TTS::Constants
20
+
21
+ module_function
22
+
23
+ def config
24
+ @config ||= Configuration.new
25
+ end
26
+
27
+ def configure
28
+ yield(config)
29
+ reset
30
+ end
31
+
32
+ def voices
33
+ @voices ||= Voices.new
34
+ end
35
+
36
+ def speak(text:, voice: nil, locale: nil, gender: nil, neural: nil, format: :audio_24khz_160kbitrate_mono_mp3) # rubocop:disable Metrics/ParameterLists
37
+ voice ||= voices.find(locale: locale, gender: gender, neural: neural)
38
+ Speaker.new(text: text, voice: voice, format: format).speak
39
+ end
40
+
41
+ def token
42
+ @token ||= Token.new
43
+ @token.tap(&:refresh)
44
+ end
45
+
46
+ def api
47
+ @api ||= API.new
48
+ end
49
+
50
+ def reset
51
+ @api = nil
52
+ @voices = nil
53
+ @token = nil
54
+ end
55
+ end
56
+ end
@@ -0,0 +1,47 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Azure
4
+ module TTS
5
+ class API
6
+ include Constants
7
+
8
+ def config
9
+ Azure::TTS.config
10
+ end
11
+
12
+ def tokens
13
+ @tokens ||= Faraday.new(url: config.tokens_url, headers: { "Ocp-Apim-Subscription-Key" => config.api_key }) do |connection|
14
+ connection.adapter Faraday.default_adapter
15
+ end
16
+ end
17
+
18
+ def voices
19
+ @voices ||= Faraday.new(url: config.voices_url) do |connection|
20
+ connection.request :azure_tts_token_auth
21
+ connection.request :json
22
+ connection.response :json
23
+ connection.adapter Faraday.default_adapter
24
+ end
25
+ end
26
+
27
+ def tts
28
+ @tts ||= Faraday.new(url: config.tts_url) do |connection|
29
+ connection.request :azure_tts_token_auth
30
+ connection.adapter Faraday.default_adapter
31
+ end
32
+ end
33
+ end
34
+
35
+ class TokenAuthMiddleware < Faraday::Middleware
36
+ def initialize(app)
37
+ super(app)
38
+ end
39
+
40
+ def call(env)
41
+ env[:request_headers]["Authorization"] = "Bearer #{Azure::TTS.token}"
42
+ @app.call(env)
43
+ end
44
+ end
45
+ Faraday::Request.register_middleware azure_tts_token_auth: -> { TokenAuthMiddleware }
46
+ end
47
+ end
@@ -0,0 +1,28 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Azure
4
+ module TTS
5
+ class Configuration
6
+ include Azure::TTS::Constants
7
+
8
+ attr_accessor :api_key, :region, :default_voice, :default_audio_format
9
+
10
+ def initialize
11
+ @default_voice = ""
12
+ @default_audio_format = :audio_24khz_160kbitrate_mono_mp3
13
+ end
14
+
15
+ def tokens_url
16
+ format(TOKENS_URL, region: region)
17
+ end
18
+
19
+ def voices_url
20
+ format(VOICES_URL, region: region)
21
+ end
22
+
23
+ def tts_url
24
+ format(TTS_URL, region: region)
25
+ end
26
+ end
27
+ end
28
+ end
@@ -0,0 +1,48 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Azure
4
+ module TTS
5
+ module Constants
6
+ REGIONS = {
7
+ australiaeast: "Australia East",
8
+ canadacentral: "Canada Central",
9
+ centralus: "Central US",
10
+ eastasia: "East Asia",
11
+ eastus: "East US",
12
+ eastus2: "East US 2",
13
+ francecentral: "France Central",
14
+ centralindia: "India Central",
15
+ japaneast: "Japan East",
16
+ koreacentral: "Korea Central",
17
+ northcentralus: "North Central US",
18
+ northeurope: "North Europe",
19
+ southcentralus: "South Central US",
20
+ southeastasia: "Southeast Asia",
21
+ uksouth: "UK South",
22
+ westeurope: "West Europe",
23
+ westus: "West US",
24
+ westus2: "West US 2"
25
+ }.freeze
26
+
27
+ AUDIO_FORMATS = {
28
+ raw_16khz_16bit_mono_pcm: "raw-16khz-16bit-mono-pcm",
29
+ raw_8khz_8bit_mono_mulaw: "raw-8khz-8bit-mono-mulaw",
30
+ riff_8khz_8bit_mono_alaw: "riff-8khz-8bit-mono-alaw",
31
+ riff_8khz_8bit_mono_mulaw: "riff-8khz-8bit-mono-mulaw",
32
+ riff_16khz_16bit_mono_pcm: "riff-16khz-16bit-mono-pcm",
33
+ audio_16khz_128kbitrate_mono_mp3: "audio-16khz-128kbitrate-mono-mp3",
34
+ audio_16khz_64kbitrate_mono_mp3: "audio-16khz-64kbitrate-mono-mp3",
35
+ audio_16khz_32kbitrate_mono_mp3: "audio-16khz-32kbitrate-mono-mp3",
36
+ raw_24khz_16bit_mono_pcm: "raw-24khz-16bit-mono-pcm",
37
+ riff_24khz_16bit_mono_pcm: "riff-24khz-16bit-mono-pcm",
38
+ audio_24khz_160kbitrate_mono_mp3: "audio-24khz-160kbitrate-mono-mp3",
39
+ audio_24khz_96kbitrate_mono_mp3: "audio-24khz-96kbitrate-mono-mp3",
40
+ audio_24khz_48kbitrate_mono_mp3: "audio-24khz-48kbitrate-mono-mp3"
41
+ }.freeze
42
+
43
+ TOKENS_URL = "https://%<region>s.api.cognitive.microsoft.com/sts/v1.0/issueToken"
44
+ VOICES_URL = "https://%<region>s.tts.speech.microsoft.com/cognitiveservices/voices/list"
45
+ TTS_URL = "https://%<region>s.tts.speech.microsoft.com/cognitiveservices/v1"
46
+ end
47
+ end
48
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Azure
4
+ module TTS
5
+ class Error < StandardError; end
6
+
7
+ class RequestError < Error
8
+ attr_reader :response
9
+
10
+ def initialize(response)
11
+ @response = response
12
+ super(exception_message)
13
+ end
14
+
15
+ def exception_message # rubocop:disable Metrics/AbcSize
16
+ format(
17
+ "%<method>s request to %<url>s failed with status %<status>s (%<status_text>s). Response body: %<body>s",
18
+ method: response.env.method.to_s.upcase,
19
+ url: response.env.url.to_s,
20
+ status: response.status,
21
+ status_text: response.reason_phrase,
22
+ body: response.body
23
+ )
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,34 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Azure
4
+ module TTS
5
+ class Speaker
6
+ def initialize(text:, voice:, format:)
7
+ @text = text
8
+ @voice = voice
9
+ @format = format
10
+ end
11
+
12
+ def speak
13
+ response = Azure::TTS.api.tts.post(nil, ssml, headers)
14
+ raise RequestError, response unless response.success?
15
+
16
+ response.body
17
+ end
18
+
19
+ def ssml
20
+ ssml = RubySpeech::SSML.draw
21
+ ssml.voice gender: @voice.gender, name: @voice.short_name, language: @voice.locale, content: @text
22
+ ssml.to_s
23
+ end
24
+
25
+ def headers
26
+ {
27
+ "Content-Type" => "application/ssml+xml",
28
+ "X-Microsoft-OutputFormat" => Azure::TTS::AUDIO_FORMATS[@format],
29
+ "User-Agent" => "Azure::TTS"
30
+ }
31
+ end
32
+ end
33
+ end
34
+ end
@@ -0,0 +1,27 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Azure
4
+ module TTS
5
+ class Token
6
+ attr_reader :token, :obtained_at
7
+
8
+ def refresh
9
+ return unless needs_refreshing?
10
+
11
+ response = Azure::TTS.api.tokens.post
12
+ raise RequestError, response unless response.success?
13
+
14
+ @token = response.body
15
+ @obtained_at = Time.now.to_i
16
+ end
17
+
18
+ def needs_refreshing?
19
+ (Time.now.to_i - obtained_at.to_i) > 600
20
+ end
21
+
22
+ def to_s
23
+ token
24
+ end
25
+ end
26
+ end
27
+ end
@@ -0,0 +1,7 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Azure
4
+ module TTS
5
+ VERSION = "1.0.0"
6
+ end
7
+ end
@@ -0,0 +1,43 @@
1
+ # frozen_string_literal: true
2
+
3
+ module Azure
4
+ module TTS
5
+ class Voices
6
+ attr_reader :all
7
+
8
+ def initialize
9
+ fetch
10
+ end
11
+
12
+ def fetch
13
+ response = Azure::TTS.api.voices.get
14
+ raise RequestError, response unless response.success?
15
+
16
+ @all = response.body.map { |data| Voice.new(data) }
17
+ end
18
+
19
+ def find(locale: nil, gender: nil, neural: nil)
20
+ voices = all
21
+ voices = voices.select { |voice| voice.locale == locale } if locale
22
+ voices = voices.select { |voice| voice.gender == gender } if gender
23
+ voices = voices.sort_by { |voice| voice.neural? ? 0 : 1 } if neural
24
+ voices.first
25
+ end
26
+ end
27
+
28
+ class Voice
29
+ attr_reader :name, :short_name, :gender, :locale
30
+
31
+ def initialize(data)
32
+ @name = data["Name"]
33
+ @short_name = data["ShortName"]
34
+ @gender = data["Gender"].downcase.to_sym
35
+ @locale = data["Locale"]
36
+ end
37
+
38
+ def neural?
39
+ name =~ /Neural/
40
+ end
41
+ end
42
+ end
43
+ end
metadata ADDED
@@ -0,0 +1,217 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: azure-tts
3
+ version: !ruby/object:Gem::Version
4
+ version: 1.0.0
5
+ platform: ruby
6
+ authors:
7
+ - Cristian Bica
8
+ autorequire:
9
+ bindir: exe
10
+ cert_chain: []
11
+ date: 2019-09-04 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: faraday
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - ">="
18
+ - !ruby/object:Gem::Version
19
+ version: '0'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - ">="
25
+ - !ruby/object:Gem::Version
26
+ version: '0'
27
+ - !ruby/object:Gem::Dependency
28
+ name: faraday_middleware
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: ruby_speech
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - ">="
46
+ - !ruby/object:Gem::Version
47
+ version: '0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - ">="
53
+ - !ruby/object:Gem::Version
54
+ version: '0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: bundler
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '1.17'
62
+ type: :development
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '1.17'
69
+ - !ruby/object:Gem::Dependency
70
+ name: minitest
71
+ requirement: !ruby/object:Gem::Requirement
72
+ requirements:
73
+ - - "~>"
74
+ - !ruby/object:Gem::Version
75
+ version: '5.0'
76
+ type: :development
77
+ prerelease: false
78
+ version_requirements: !ruby/object:Gem::Requirement
79
+ requirements:
80
+ - - "~>"
81
+ - !ruby/object:Gem::Version
82
+ version: '5.0'
83
+ - !ruby/object:Gem::Dependency
84
+ name: minitest-around
85
+ requirement: !ruby/object:Gem::Requirement
86
+ requirements:
87
+ - - ">="
88
+ - !ruby/object:Gem::Version
89
+ version: '0'
90
+ type: :development
91
+ prerelease: false
92
+ version_requirements: !ruby/object:Gem::Requirement
93
+ requirements:
94
+ - - ">="
95
+ - !ruby/object:Gem::Version
96
+ version: '0'
97
+ - !ruby/object:Gem::Dependency
98
+ name: pry
99
+ requirement: !ruby/object:Gem::Requirement
100
+ requirements:
101
+ - - ">="
102
+ - !ruby/object:Gem::Version
103
+ version: '0'
104
+ type: :development
105
+ prerelease: false
106
+ version_requirements: !ruby/object:Gem::Requirement
107
+ requirements:
108
+ - - ">="
109
+ - !ruby/object:Gem::Version
110
+ version: '0'
111
+ - !ruby/object:Gem::Dependency
112
+ name: rake
113
+ requirement: !ruby/object:Gem::Requirement
114
+ requirements:
115
+ - - "~>"
116
+ - !ruby/object:Gem::Version
117
+ version: '10.0'
118
+ type: :development
119
+ prerelease: false
120
+ version_requirements: !ruby/object:Gem::Requirement
121
+ requirements:
122
+ - - "~>"
123
+ - !ruby/object:Gem::Version
124
+ version: '10.0'
125
+ - !ruby/object:Gem::Dependency
126
+ name: vcr
127
+ requirement: !ruby/object:Gem::Requirement
128
+ requirements:
129
+ - - ">="
130
+ - !ruby/object:Gem::Version
131
+ version: '0'
132
+ type: :development
133
+ prerelease: false
134
+ version_requirements: !ruby/object:Gem::Requirement
135
+ requirements:
136
+ - - ">="
137
+ - !ruby/object:Gem::Version
138
+ version: '0'
139
+ - !ruby/object:Gem::Dependency
140
+ name: webmock
141
+ requirement: !ruby/object:Gem::Requirement
142
+ requirements:
143
+ - - ">="
144
+ - !ruby/object:Gem::Version
145
+ version: '0'
146
+ type: :development
147
+ prerelease: false
148
+ version_requirements: !ruby/object:Gem::Requirement
149
+ requirements:
150
+ - - ">="
151
+ - !ruby/object:Gem::Version
152
+ version: '0'
153
+ - !ruby/object:Gem::Dependency
154
+ name: multi_json
155
+ requirement: !ruby/object:Gem::Requirement
156
+ requirements:
157
+ - - ">="
158
+ - !ruby/object:Gem::Version
159
+ version: '0'
160
+ type: :development
161
+ prerelease: false
162
+ version_requirements: !ruby/object:Gem::Requirement
163
+ requirements:
164
+ - - ">="
165
+ - !ruby/object:Gem::Version
166
+ version: '0'
167
+ description: Text-to-speech gem based using Azure Cognitive Speech Services.
168
+ email:
169
+ - cristian.bica@gmail.com
170
+ executables: []
171
+ extensions: []
172
+ extra_rdoc_files: []
173
+ files:
174
+ - ".github/workflows/gem.yml"
175
+ - ".gitignore"
176
+ - ".rubocop.yml"
177
+ - Gemfile
178
+ - Gemfile.lock
179
+ - LICENSE.txt
180
+ - README.md
181
+ - Rakefile
182
+ - azure-tts.gemspec
183
+ - bin/console
184
+ - bin/setup
185
+ - lib/azure/tts.rb
186
+ - lib/azure/tts/api.rb
187
+ - lib/azure/tts/configuration.rb
188
+ - lib/azure/tts/constants.rb
189
+ - lib/azure/tts/errors.rb
190
+ - lib/azure/tts/speaker.rb
191
+ - lib/azure/tts/token.rb
192
+ - lib/azure/tts/version.rb
193
+ - lib/azure/tts/voices.rb
194
+ homepage: https://github.com/cristianbica/azure-tts
195
+ licenses:
196
+ - MIT
197
+ metadata: {}
198
+ post_install_message:
199
+ rdoc_options: []
200
+ require_paths:
201
+ - lib
202
+ required_ruby_version: !ruby/object:Gem::Requirement
203
+ requirements:
204
+ - - ">="
205
+ - !ruby/object:Gem::Version
206
+ version: '0'
207
+ required_rubygems_version: !ruby/object:Gem::Requirement
208
+ requirements:
209
+ - - ">="
210
+ - !ruby/object:Gem::Version
211
+ version: '0'
212
+ requirements: []
213
+ rubygems_version: 3.0.3
214
+ signing_key:
215
+ specification_version: 4
216
+ summary: Azure TTS
217
+ test_files: []