typecast-ruby 0.1.8 → 0.1.10
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/lib/typecast/client.rb +31 -6
- data/lib/typecast/models.rb +18 -3
- data/lib/typecast/version.rb +1 -1
- metadata +1 -1
checksums.yaml
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
---
|
|
2
2
|
SHA256:
|
|
3
|
-
metadata.gz:
|
|
4
|
-
data.tar.gz:
|
|
3
|
+
metadata.gz: 41b4085ac984161649beeb512ae32d72eefb823445e42fbedc8f36b234ba0291
|
|
4
|
+
data.tar.gz: d838ce170ebf9aa1011c8014e8851f7488192287bfacd217ce61d8003c2ff4a3
|
|
5
5
|
SHA512:
|
|
6
|
-
metadata.gz:
|
|
7
|
-
data.tar.gz:
|
|
6
|
+
metadata.gz: b66406928f01c849dbc897a9bf3b6360d0ae7fc9293170e2a3fd57b602a97e29ecbd34d7965081facb8710a9cdae7f2aed87fcfe8c7b9ca3d1644e07c73e80cb
|
|
7
|
+
data.tar.gz: 03ebe4faca1ded5e58377110feffbe0fd0beeb4ea687871eb980562e957662738f6179d98dcc2fc82c4cc8ad5d5fe47a9395181caad7452daa9fb6c247996af5
|
data/lib/typecast/client.rb
CHANGED
|
@@ -102,6 +102,15 @@ module Typecast
|
|
|
102
102
|
voices.first
|
|
103
103
|
end
|
|
104
104
|
|
|
105
|
+
def get_voices_v3(filter = nil)
|
|
106
|
+
query = filter.respond_to?(:to_h) ? filter.to_h : filter
|
|
107
|
+
JSON.parse(request_json(:get, "/v3/voices", nil, query).body).map { |item| Models::VoiceV3.from_h(item) }
|
|
108
|
+
end
|
|
109
|
+
|
|
110
|
+
def get_voice_v3(voice_id)
|
|
111
|
+
Models::VoiceV3.from_h(JSON.parse(request_json(:get, "/v3/voices/#{path_segment(voice_id)}").body))
|
|
112
|
+
end
|
|
113
|
+
|
|
105
114
|
# Recommends voices from a text description.
|
|
106
115
|
#
|
|
107
116
|
# Results only include voice_id, voice_name, and score. Use get_voice_v2 or
|
|
@@ -116,15 +125,31 @@ module Typecast
|
|
|
116
125
|
|
|
117
126
|
def clone_voice(audio:, filename:, name:, model:)
|
|
118
127
|
validate_clone_inputs(audio, name)
|
|
119
|
-
response = request_multipart("/v1/voices/clone", audio: audio, filename: filename, fields: { name: name, model: model })
|
|
128
|
+
response = request_multipart("/v1/custom-voices/instant-clone", audio: audio, filename: filename, fields: { name: name, model: model })
|
|
120
129
|
Models::CustomVoice.from_h(JSON.parse(response.body))
|
|
121
130
|
end
|
|
122
131
|
|
|
123
132
|
def delete_voice(voice_id)
|
|
124
|
-
request_raw(:delete, "/v1/voices/#{path_segment(voice_id)}")
|
|
133
|
+
request_raw(:delete, "/v1/custom-voices/#{path_segment(voice_id)}")
|
|
125
134
|
nil
|
|
126
135
|
end
|
|
127
136
|
|
|
137
|
+
# Starts an asynchronous professional custom-voice clone. Poll
|
|
138
|
+
# get_custom_voice until status is "completed" or "failed".
|
|
139
|
+
def create_professional_voice(audio:, filename:, name:, language:, model:)
|
|
140
|
+
validate_clone_inputs(audio, name)
|
|
141
|
+
response = request_multipart("/v1/custom-voices/professional-clone", audio: audio, filename: filename, fields: { name: name, language: language, model: model }, file_field: "files")
|
|
142
|
+
Models::CustomVoice.from_h(JSON.parse(response.body))
|
|
143
|
+
end
|
|
144
|
+
|
|
145
|
+
def get_custom_voices
|
|
146
|
+
JSON.parse(request_json(:get, "/v1/custom-voices").body).map { |item| Models::CustomVoice.from_h(item) }
|
|
147
|
+
end
|
|
148
|
+
|
|
149
|
+
def get_custom_voice(voice_id)
|
|
150
|
+
Models::CustomVoice.from_h(JSON.parse(request_json(:get, "/v1/custom-voices/#{path_segment(voice_id)}").body))
|
|
151
|
+
end
|
|
152
|
+
|
|
128
153
|
private
|
|
129
154
|
|
|
130
155
|
def inferred_output(path)
|
|
@@ -154,7 +179,7 @@ module Typecast
|
|
|
154
179
|
response
|
|
155
180
|
end
|
|
156
181
|
|
|
157
|
-
def request_multipart(path, audio:, filename:, fields:)
|
|
182
|
+
def request_multipart(path, audio:, filename:, fields:, file_field: "file")
|
|
158
183
|
boundary = "typecast-ruby-#{SecureRandom.hex(8)}"
|
|
159
184
|
body = +""
|
|
160
185
|
fields.each do |name, value|
|
|
@@ -166,7 +191,7 @@ module Typecast
|
|
|
166
191
|
end
|
|
167
192
|
safe_filename = disposition_value(filename)
|
|
168
193
|
body << "--#{boundary}\r\n"
|
|
169
|
-
body << "Content-Disposition: form-data; name=\"
|
|
194
|
+
body << "Content-Disposition: form-data; name=\"#{disposition_value(file_field)}\"; filename=\"#{safe_filename}\"\r\n"
|
|
170
195
|
body << "Content-Type: application/octet-stream\r\n\r\n"
|
|
171
196
|
body << audio
|
|
172
197
|
body << "\r\n--#{boundary}--\r\n"
|
|
@@ -196,8 +221,8 @@ module Typecast
|
|
|
196
221
|
|
|
197
222
|
def attribution_suffix(source, generated_by)
|
|
198
223
|
return "" if source.nil? && generated_by.nil?
|
|
199
|
-
unless %w[llms skill].include?(source) && generated_by&.match?(/\A[a-z0-9][a-z0-9._-]{0,31}\z/)
|
|
200
|
-
raise ArgumentError, "source (llms or
|
|
224
|
+
unless %w[llms skill api-page api-docs].include?(source) && generated_by&.match?(/\A[a-z0-9][a-z0-9._-]{0,31}\z/)
|
|
225
|
+
raise ArgumentError, "source (llms, skill, api-page, or api-docs) and generated_by must be valid and provided together"
|
|
201
226
|
end
|
|
202
227
|
|
|
203
228
|
" typecast-integration/1 (source=#{source}; generated_by=#{generated_by})"
|
data/lib/typecast/models.rb
CHANGED
|
@@ -179,6 +179,17 @@ module Typecast
|
|
|
179
179
|
end
|
|
180
180
|
end
|
|
181
181
|
|
|
182
|
+
class VoiceV3
|
|
183
|
+
attr_reader :voice_id, :voice_name, :models, :voice_type, :gender, :age, :use_cases, :preview_url
|
|
184
|
+
def self.from_h(hash)
|
|
185
|
+
new(voice_id: hash.fetch("voice_id", ""), voice_name: hash.fetch("voice_name", { "eng" => "", "kor" => "" }), models: hash.fetch("models", []), voice_type: hash.fetch("voice_type", ""), gender: hash["gender"], age: hash["age"], use_cases: hash.fetch("use_cases", []), preview_url: hash["preview_url"])
|
|
186
|
+
end
|
|
187
|
+
def initialize(voice_id:, voice_name:, models:, voice_type:, gender: nil, age: nil, use_cases: [], preview_url: nil)
|
|
188
|
+
@voice_id, @voice_name, @models, @voice_type = voice_id, voice_name, models, voice_type
|
|
189
|
+
@gender, @age, @use_cases, @preview_url = gender, age, use_cases, preview_url
|
|
190
|
+
end
|
|
191
|
+
end
|
|
192
|
+
|
|
182
193
|
class RecommendedVoice
|
|
183
194
|
attr_reader :voice_id, :voice_name, :score
|
|
184
195
|
|
|
@@ -216,16 +227,20 @@ module Typecast
|
|
|
216
227
|
end
|
|
217
228
|
|
|
218
229
|
class CustomVoice
|
|
219
|
-
attr_reader :voice_id, :name, :model
|
|
230
|
+
attr_reader :voice_id, :name, :model, :source, :status, :error, :created_at
|
|
220
231
|
|
|
221
232
|
def self.from_h(hash)
|
|
222
|
-
new(voice_id: hash.fetch("voice_id", ""), name: hash.fetch("name", ""), model: hash["model"])
|
|
233
|
+
new(voice_id: hash.fetch("voice_id", ""), name: hash.fetch("name", ""), model: hash["model"], source: hash["source"], status: hash["status"], error: hash["error"], created_at: hash["created_at"])
|
|
223
234
|
end
|
|
224
235
|
|
|
225
|
-
def initialize(voice_id:, name:, model: nil)
|
|
236
|
+
def initialize(voice_id:, name:, model: nil, source: nil, status: nil, error: nil, created_at: nil)
|
|
226
237
|
@voice_id = voice_id
|
|
227
238
|
@name = name
|
|
228
239
|
@model = model
|
|
240
|
+
@source = source
|
|
241
|
+
@status = status
|
|
242
|
+
@error = error
|
|
243
|
+
@created_at = created_at
|
|
229
244
|
end
|
|
230
245
|
end
|
|
231
246
|
|
data/lib/typecast/version.rb
CHANGED