voicemaker 0.1.0

Sign up to get free protection for your applications and to get access to all the features.
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 84b3811f8d8ef6084933654f41b1764c2e1c3eb1d59ac8a6e599d1c18a38bd7a
4
+ data.tar.gz: 91491d408b0884424c20771d4a4b9d230a7cd29dc05eb7d4f55caeb2ca8e5440
5
+ SHA512:
6
+ metadata.gz: 98939ba36fb37cc71987060376422da98e064fab61074f08d8f853d5ce35a1f648db32d10ea7da5c25b9af67c908b4b901fff3b35244dfb96ee9b5d3b795e717
7
+ data.tar.gz: 1d4a1894a2f1eddbd30b93bb5c1226664079daaaba8c5f72510a6a5912efb65ad49e1b270a1ee628ce6b4e197285af59f5bcb65da3e70b7b2f2c3c0a4b7b5b84
data/README.md ADDED
@@ -0,0 +1,173 @@
1
+ # Voicemaker API Library and Command Line
2
+
3
+ [![Gem Version](https://badge.fury.io/rb/voicemaker.svg)](https://badge.fury.io/rb/voicemaker)
4
+ [![Build Status](https://github.com/DannyBen/voicemaker/workflows/Test/badge.svg)](https://github.com/DannyBen/voicemaker/actions?query=workflow%3ATest)
5
+
6
+ ---
7
+
8
+ This gem provides both a Ruby library and a command line interface for the
9
+ [Voicemaker][voicemaker] Text to Speech service.
10
+
11
+ This gem is not affiliated with Voicemaker.
12
+
13
+ ---
14
+
15
+
16
+ ## Install
17
+
18
+ ```
19
+ $ gem install voicemaker
20
+ ```
21
+
22
+ ## Features
23
+
24
+ - Use as a Ruby library or from the command line
25
+ - Show and search for available voices
26
+ - Convert text to MP3 or WAV from a simple configuration file
27
+ - Batch-convert multiple files
28
+
29
+
30
+ ## Usage
31
+
32
+ ### Initialization
33
+
34
+ First, require and initialize with your Voicemaker API key:
35
+
36
+ ```ruby
37
+ require 'voicemaker'
38
+ api_key = '...'
39
+ api = Voicemaker::API.new api_key
40
+ ```
41
+
42
+ ### Voices list
43
+
44
+ Get the full voices list:
45
+
46
+ ```ruby
47
+ result = api.voices
48
+ ```
49
+
50
+ Search the voices list for one or more strings (AND search):
51
+
52
+ ```ruby
53
+ result = api.voices ["en_US", "female"]
54
+ ```
55
+
56
+ ### Audio generation and download
57
+
58
+ Make an API call and get the URL to the audio file in return:
59
+
60
+ ```ruby
61
+ params = {
62
+ "Engine" => "neural",
63
+ "VoiceId" => "ai3-Jony",
64
+ "LanguageCode" => "en-US",
65
+ "OutputFormat" => "mp3",
66
+ "SampleRate" => "48000",
67
+ "Effect" => "default",
68
+ "MasterSpeed" => "0",
69
+ "MasterVolume" => "0",
70
+ "MasterPitch" => "0",
71
+ "Text" => "Hello world",
72
+ }
73
+
74
+ result = api.generate params
75
+ ```
76
+
77
+ For convenience, you can call `#download` instead, to mak ethe API call and
78
+ download the file:
79
+
80
+ ```ruby
81
+ result = api.download "out.mp3', params
82
+ ```
83
+
84
+ ## Command line interface
85
+
86
+ <!-- USAGE -->
87
+ ```
88
+ $ voicemaker --help
89
+
90
+ Voicemaker API
91
+
92
+ API Documentation:
93
+ https://developer.voicemaker.in/apidocs
94
+
95
+ Usage:
96
+ voicemaker voices [--save PATH] [SEARCH...]
97
+ voicemaker new CONFIG
98
+ voicemaker generate CONFIG [OUTPUT]
99
+ voicemaker batch INDIR OUTDIR
100
+ voicemaker (-h|--help|--version)
101
+
102
+ Commands:
103
+ voices
104
+ Get list of voices, optionally in a given language
105
+
106
+ new
107
+ Generate a sample config file
108
+
109
+ generate
110
+ Generate audio file. The output filename will be the same as the config
111
+ filename, with the proper mp3 or wav extension
112
+
113
+ batch
114
+ Generate multiple audio files from multiple config files
115
+
116
+ Options:
117
+ -l --language LANG
118
+ Limit results to a specific language
119
+
120
+ -s --save PATH
121
+ Save output to output YAML file
122
+
123
+ -h --help
124
+ Show this help
125
+
126
+ --version
127
+ Show version number
128
+
129
+ Parameters:
130
+ SEARCH
131
+ Provide one or more text strings to search for (case insensitive)
132
+
133
+ CONFIG
134
+ Path to config file
135
+
136
+ OUTPUT
137
+ Path to output mp3/wav file. If not provided, the filename will be the same
138
+ as the config file, with wav/mp3 extension
139
+
140
+ INDIR
141
+ Path to input directory, containing config YAML files
142
+
143
+ OURDIR
144
+ Path to output directory, where mp3/wav files will be saved
145
+
146
+ Environment Variables:
147
+ VOICEMAKER_API_KEY
148
+ Your Voicemaker API key [required]
149
+
150
+ VOICEMAKER_API_HOST
151
+ Override the API host URL
152
+
153
+ Examples:
154
+ voicemaker voices en-us
155
+ voicemaker voices --save out.yml en-us
156
+ voicemaker voices en-us female
157
+ voicemaker new test.yml
158
+ voicemaker generate test.yml out.mp3
159
+ voicemaker batch configs out
160
+
161
+ ```
162
+ <!-- USAGE -->
163
+
164
+
165
+ ## Contributing / Support
166
+
167
+ If you experience any issue, have a question or a suggestion, or if you wish
168
+ to contribute, feel free to [open an issue][issues].
169
+
170
+
171
+
172
+ [voicemaker]: https://voicemaker.in/
173
+ [issues]: https://github.com/DannyBen/voicemaker/issues
data/bin/voicemaker ADDED
@@ -0,0 +1,25 @@
1
+ #!/usr/bin/env ruby
2
+ require 'colsole'
3
+ require 'voicemaker'
4
+ require 'voicemaker/cli'
5
+ include Colsole
6
+
7
+ runner = Voicemaker::CLI.runner
8
+
9
+ begin
10
+ exit runner.run ARGV
11
+
12
+ rescue Interrupt
13
+ say "\nGoodbye"
14
+ exit 1
15
+
16
+ rescue => e
17
+ if ENV['DEBUG']
18
+ puts e.backtrace.reverse
19
+ say ""
20
+ end
21
+ say "!undred!ERROR: #{e.class}"
22
+ say e.message
23
+ exit 1
24
+
25
+ end
data/lib/sample.yml ADDED
@@ -0,0 +1,11 @@
1
+ Engine: neural
2
+ VoiceId: ai3-Jony
3
+ LanguageCode: en-US
4
+ OutputFormat: mp3
5
+ SampleRate: 48000
6
+ Effect: default
7
+ MasterSpeed: "0"
8
+ MasterVolume: "0"
9
+ MasterPitch: "0"
10
+ Text: |
11
+ Hello world
@@ -0,0 +1,66 @@
1
+ require 'http'
2
+ require 'down'
3
+
4
+ module Voicemaker
5
+ class API
6
+ attr_reader :api_key
7
+
8
+ class << self
9
+ attr_writer :base_uri
10
+
11
+ def base_uri
12
+ @base_uri ||= ENV['VOICEMAKER_API_HOST'] || 'https://developer.voicemaker.in/voice'
13
+ end
14
+ end
15
+
16
+ def initialize(api_key)
17
+ @api_key = api_key
18
+ end
19
+
20
+ # Returns a list of voices, with optional search criteria (array)
21
+ def voices(search = nil)
22
+ search = nil if search&.empty?
23
+ response = HTTP.auth(auth_header).get "#{base_uri}/list"
24
+ raise BadResponse, "#{response.status}\n#{response.body}" unless response.status.success?
25
+ voices = response.parse.dig 'data', 'voices_list'
26
+ raise BadResponse, "Unexpected response: #{response}" unless voices
27
+
28
+ if search
29
+ voices.select do |voice|
30
+ search_string = voice.values.join(' ').downcase
31
+ search.any? { |query| search_string.include? query.downcase }
32
+ end
33
+ else
34
+ voices
35
+ end
36
+ end
37
+
38
+ # Returns the URL for the generated file
39
+ def generate(params = {})
40
+ response = HTTP.auth(auth_header).post "#{base_uri}/api", json: params
41
+ if response.status.success?
42
+ response.parse['path']
43
+ else
44
+ raise BadResponse, "#{response.status}\n#{response.body}"
45
+ end
46
+ end
47
+
48
+ # Calls the API and saves the file
49
+ def download(outpath, params = {})
50
+ path = generate params
51
+ yield path if block_given?
52
+ Down.download path, destination: outpath
53
+ end
54
+
55
+ protected
56
+
57
+ def base_uri
58
+ self.class.base_uri
59
+ end
60
+
61
+ def auth_header
62
+ "Bearer #{api_key}"
63
+ end
64
+
65
+ end
66
+ end
@@ -0,0 +1,10 @@
1
+ require 'mister_bin'
2
+ require 'voicemaker/command'
3
+
4
+ module Voicemaker
5
+ class CLI
6
+ def self.runner
7
+ MisterBin::Runner.new handler: Command
8
+ end
9
+ end
10
+ end
@@ -0,0 +1,111 @@
1
+ require 'lp'
2
+ require 'mister_bin'
3
+
4
+ module Voicemaker
5
+ class Command < MisterBin::Command
6
+ help "Voicemaker API\n\n API Documentation:\n https://developer.voicemaker.in/apidocs"
7
+ version Voicemaker::VERSION
8
+
9
+ usage "voicemaker voices [--save PATH] [SEARCH...]"
10
+ usage "voicemaker new CONFIG"
11
+ usage "voicemaker generate CONFIG [OUTPUT]"
12
+ usage "voicemaker batch INDIR OUTDIR"
13
+ usage "voicemaker (-h|--help|--version)"
14
+
15
+ command "voices", "Get list of voices, optionally in a given language"
16
+ command "new", "Generate a sample config file"
17
+ command "generate", "Generate audio file. The output filename will be the same as the config filename, with the proper mp3 or wav extension"
18
+ command "batch", "Generate multiple audio files from multiple config files"
19
+
20
+ option "-l --language LANG", "Limit results to a specific language"
21
+ option "-s --save PATH", "Save output to output YAML file"
22
+
23
+ param "SEARCH", "Provide one or more text strings to search for (case insensitive)"
24
+ param "CONFIG", "Path to config file"
25
+ param "OUTPUT", "Path to output mp3/wav file. If not provided, the filename will be the same as the config file, with wav/mp3 extension"
26
+ param "INDIR", "Path to input directory, containing config YAML files"
27
+ param "OURDIR", "Path to output directory, where mp3/wav files will be saved"
28
+
29
+ environment "VOICEMAKER_API_KEY", "Your Voicemaker API key [required]"
30
+ environment "VOICEMAKER_API_HOST", "Override the API host URL"
31
+
32
+ example "voicemaker voices en-us"
33
+ example "voicemaker voices --save out.yml en-us"
34
+ example "voicemaker voices en-us female"
35
+ example "voicemaker new test.yml"
36
+ example "voicemaker generate test.yml out.mp3"
37
+ example "voicemaker batch configs out"
38
+
39
+ def voices_command
40
+ send_output api.voices(args['SEARCH'])
41
+ end
42
+
43
+ def new_command
44
+ template = File.expand_path "../sample.yml", __dir__
45
+ content = File.read template
46
+ File.write args['CONFIG'], content
47
+ say "Saved #{args['CONFIG']}"
48
+ end
49
+
50
+ def generate_command
51
+ config_path = args['CONFIG']
52
+ raise InputError, "Cannot find config file #{config_path}" unless File.exist? config_path
53
+ outpath = args['OUTPUT'] || outpath_from_config(config_path)
54
+ generate config_path, outpath
55
+ end
56
+
57
+ def batch_command
58
+ files = Dir["#{args['INDIR']}/*.yml"].sort
59
+ raise InputError, "No config files in #{args['INDIR']}" if files.empty?
60
+
61
+ files.each do |config_path|
62
+ extension = extension_from_config(config_path)
63
+ basename = File.basename config_path, '.yml'
64
+ outpath = "#{args['OUTDIR']}/#{basename}.#{extension}"
65
+ generate config_path, outpath
66
+ puts ""
67
+ end
68
+ end
69
+
70
+ private
71
+
72
+ def generate(config_path, outpath)
73
+ params = YAML.load_file config_path
74
+
75
+ say "Config : !txtgrn!#{config_path}"
76
+ api.download outpath, params do |url|
77
+ say "URL : !txtblu!#{url}"
78
+ end
79
+
80
+ say "Path : !txtblu!#{outpath}"
81
+ end
82
+
83
+ def send_output(data)
84
+ save = args['--save']
85
+ if save
86
+ say "Saved #{save}"
87
+ File.write save, data.to_yaml
88
+ else
89
+ lp data
90
+ end
91
+ end
92
+
93
+ def api
94
+ @api ||= Voicemaker::API.new(api_key)
95
+ end
96
+
97
+ def api_key
98
+ ENV['VOICEMAKER_API_KEY'] or raise MissingAuth, "Please set the 'VOICEMAKER_API_KEY' environment variable"
99
+ end
100
+
101
+ def outpath_from_config(config_path)
102
+ ext = extension_from_config config_path
103
+ config_path.gsub(/yml$/, ext)
104
+ end
105
+
106
+ def extension_from_config(config_path)
107
+ YAML.load_file(config_path)['OutputFormat']
108
+ end
109
+
110
+ end
111
+ end
@@ -0,0 +1,6 @@
1
+ module Voicemaker
2
+ class VoicemakerError < StandardError; end
3
+ class BadResponse < VoicemakerError; end
4
+ class MissingAuth < VoicemakerError; end
5
+ class InputError < VoicemakerError; end
6
+ end
@@ -0,0 +1,3 @@
1
+ module Voicemaker
2
+ VERSION = "0.1.0"
3
+ end
data/lib/voicemaker.rb ADDED
@@ -0,0 +1,5 @@
1
+ require 'voicemaker/version'
2
+ require 'voicemaker/exceptions'
3
+ require 'voicemaker/api'
4
+
5
+ require 'byebug' if ENV['BYEBUG']
metadata ADDED
@@ -0,0 +1,112 @@
1
+ --- !ruby/object:Gem::Specification
2
+ name: voicemaker
3
+ version: !ruby/object:Gem::Version
4
+ version: 0.1.0
5
+ platform: ruby
6
+ authors:
7
+ - Danny Ben Shitrit
8
+ autorequire:
9
+ bindir: bin
10
+ cert_chain: []
11
+ date: 2022-04-16 00:00:00.000000000 Z
12
+ dependencies:
13
+ - !ruby/object:Gem::Dependency
14
+ name: mister_bin
15
+ requirement: !ruby/object:Gem::Requirement
16
+ requirements:
17
+ - - "~>"
18
+ - !ruby/object:Gem::Version
19
+ version: '0.7'
20
+ type: :runtime
21
+ prerelease: false
22
+ version_requirements: !ruby/object:Gem::Requirement
23
+ requirements:
24
+ - - "~>"
25
+ - !ruby/object:Gem::Version
26
+ version: '0.7'
27
+ - !ruby/object:Gem::Dependency
28
+ name: lp
29
+ requirement: !ruby/object:Gem::Requirement
30
+ requirements:
31
+ - - "~>"
32
+ - !ruby/object:Gem::Version
33
+ version: '0.2'
34
+ type: :runtime
35
+ prerelease: false
36
+ version_requirements: !ruby/object:Gem::Requirement
37
+ requirements:
38
+ - - "~>"
39
+ - !ruby/object:Gem::Version
40
+ version: '0.2'
41
+ - !ruby/object:Gem::Dependency
42
+ name: http
43
+ requirement: !ruby/object:Gem::Requirement
44
+ requirements:
45
+ - - "~>"
46
+ - !ruby/object:Gem::Version
47
+ version: '5.0'
48
+ type: :runtime
49
+ prerelease: false
50
+ version_requirements: !ruby/object:Gem::Requirement
51
+ requirements:
52
+ - - "~>"
53
+ - !ruby/object:Gem::Version
54
+ version: '5.0'
55
+ - !ruby/object:Gem::Dependency
56
+ name: down
57
+ requirement: !ruby/object:Gem::Requirement
58
+ requirements:
59
+ - - "~>"
60
+ - !ruby/object:Gem::Version
61
+ version: '5.3'
62
+ type: :runtime
63
+ prerelease: false
64
+ version_requirements: !ruby/object:Gem::Requirement
65
+ requirements:
66
+ - - "~>"
67
+ - !ruby/object:Gem::Version
68
+ version: '5.3'
69
+ description: Easy to use API for Voicemaker.in TTS service, with a command line interface
70
+ email: db@dannyben.com
71
+ executables:
72
+ - voicemaker
73
+ extensions: []
74
+ extra_rdoc_files: []
75
+ files:
76
+ - README.md
77
+ - bin/voicemaker
78
+ - lib/sample.yml
79
+ - lib/voicemaker.rb
80
+ - lib/voicemaker/api.rb
81
+ - lib/voicemaker/cli.rb
82
+ - lib/voicemaker/command.rb
83
+ - lib/voicemaker/exceptions.rb
84
+ - lib/voicemaker/version.rb
85
+ homepage: https://github.com/DannyBen/voicemaker
86
+ licenses:
87
+ - MIT
88
+ metadata:
89
+ bug_tracker_uri: https://github.com/DannyBen/voicemaker/issues
90
+ changelog_uri: https://github.com/DannyBen/voicemaker/blob/master/CHANGELOG.md
91
+ homepage_uri: https://github.com/DannyBen/voicemaker
92
+ source_code_uri: https://github.com/DannyBen/voicemaker
93
+ post_install_message:
94
+ rdoc_options: []
95
+ require_paths:
96
+ - lib
97
+ required_ruby_version: !ruby/object:Gem::Requirement
98
+ requirements:
99
+ - - ">="
100
+ - !ruby/object:Gem::Version
101
+ version: 2.7.0
102
+ required_rubygems_version: !ruby/object:Gem::Requirement
103
+ requirements:
104
+ - - ">="
105
+ - !ruby/object:Gem::Version
106
+ version: '0'
107
+ requirements: []
108
+ rubygems_version: 3.3.3
109
+ signing_key:
110
+ specification_version: 4
111
+ summary: Voicemaker.in Text to Speech API Library and Command Line
112
+ test_files: []