elevenlabs_client 0.3.0 → 0.4.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.
- checksums.yaml +4 -4
- data/CHANGELOG.md +20 -1
- data/lib/elevenlabs_client/client.rb +14 -0
- data/lib/elevenlabs_client/endpoints/dubs.rb +156 -0
- data/lib/elevenlabs_client/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: 2b65be08b17b9ae232158f2c004511a7840688e76853c014f9be37984a9639d1
|
4
|
+
data.tar.gz: 2de88d74e59af044cfe943e32f0d2f2d8b45f71200469a69b3f95fc7605436d2
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: f919ebdf7090d2f4cdd812589eccd1425e8be5e86615c04f3bf2882c7e8e8e07058db4f37cdf420e6b1948c668c3acbb177fe796b48c7f23563fa41a7204f4ce
|
7
|
+
data.tar.gz: 23b7dc77bb3ca90e2019d4098887b8555d103d66c1fdf259f883f7952b4c26f57671f9bd2e250e27491acc42c2518e85b37bcb48cdb678fd163f9b3be9b1d7e4
|
data/CHANGELOG.md
CHANGED
@@ -5,6 +5,25 @@ All notable changes to this project will be documented in this file.
|
|
5
5
|
The format is based on [Keep a Changelog](https://keepachangelog.com/en/1.0.0/),
|
6
6
|
and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0.html).
|
7
7
|
|
8
|
+
## [0.4.0] - 2025-09-12
|
9
|
+
|
10
|
+
### Added
|
11
|
+
|
12
|
+
- **🎵 Dubbing Generation API**
|
13
|
+
- `delete(dubbing_id)` - Delete dubbing projects
|
14
|
+
- `get_resource(dubbing_id)` - Get detailed resource information
|
15
|
+
- `create_segment(options)` - Create new segments
|
16
|
+
- `delete_segment(options)` - Delete segments
|
17
|
+
- `update_segment(options)` - Update segment text/timing
|
18
|
+
- `transcribe_segment(options)` - Regenerate transcriptions
|
19
|
+
- `translate_segment(options)` - Regenerate translations
|
20
|
+
- `dub_segment(options)` - Regenerate dubs
|
21
|
+
- `render_project(options)` - Render output media
|
22
|
+
- `update_speaker(options)` - Update speaker voices
|
23
|
+
- `get_similar_voices(options)` - Get voice recommendations
|
24
|
+
- **🔧 HTTP Client Improvements** - Added HTTP method
|
25
|
+
- Added `patch` method for PATCH requests
|
26
|
+
|
8
27
|
## [0.3.0] - 2025-09-12
|
9
28
|
|
10
29
|
### Added
|
@@ -252,4 +271,4 @@ client.dubs.create(file_io: file, filename: "video.mp4", target_languages: ["es"
|
|
252
271
|
- **File Support**: Multiple video and audio formats (MP4, MOV, MP3, WAV, etc.)
|
253
272
|
- **Language Support**: Multiple target languages for dubbing
|
254
273
|
- **Configuration**: Flexible API key and endpoint configuration
|
255
|
-
- **Testing**: Comprehensive test suite with integration tests
|
274
|
+
- **Testing**: Comprehensive test suite with integration tests
|
@@ -61,6 +61,20 @@ module ElevenlabsClient
|
|
61
61
|
handle_response(response)
|
62
62
|
end
|
63
63
|
|
64
|
+
# Makes an authenticated PATCH request
|
65
|
+
# @param path [String] API endpoint path
|
66
|
+
# @param body [Hash, nil] Request body
|
67
|
+
# @return [Hash] Response body
|
68
|
+
def patch(path, body = nil)
|
69
|
+
response = @conn.patch(path) do |req|
|
70
|
+
req.headers["xi-api-key"] = api_key
|
71
|
+
req.headers["Content-Type"] = "application/json"
|
72
|
+
req.body = body.to_json if body
|
73
|
+
end
|
74
|
+
|
75
|
+
handle_response(response)
|
76
|
+
end
|
77
|
+
|
64
78
|
# Makes an authenticated multipart POST request
|
65
79
|
# @param path [String] API endpoint path
|
66
80
|
# @param payload [Hash] Multipart payload
|
@@ -53,6 +53,162 @@ module ElevenlabsClient
|
|
53
53
|
@client.get("/v1/dubbing/#{dubbing_id}/resources")
|
54
54
|
end
|
55
55
|
|
56
|
+
# DELETE /v1/dubbing/{id}
|
57
|
+
# Deletes a dubbing project
|
58
|
+
#
|
59
|
+
# @param dubbing_id [String] The dubbing job ID
|
60
|
+
# @return [Hash] Response with status
|
61
|
+
def delete(dubbing_id)
|
62
|
+
@client.delete("/v1/dubbing/#{dubbing_id}")
|
63
|
+
end
|
64
|
+
|
65
|
+
# GET /v1/dubbing/resource/{dubbing_id}
|
66
|
+
# Gets dubbing resource with detailed information including segments, speakers, etc.
|
67
|
+
#
|
68
|
+
# @param dubbing_id [String] The dubbing job ID
|
69
|
+
# @return [Hash] Detailed dubbing resource information
|
70
|
+
def get_resource(dubbing_id)
|
71
|
+
@client.get("/v1/dubbing/resource/#{dubbing_id}")
|
72
|
+
end
|
73
|
+
|
74
|
+
# POST /v1/dubbing/resource/{dubbing_id}/speaker/{speaker_id}/segment
|
75
|
+
# Creates a new segment in dubbing resource
|
76
|
+
#
|
77
|
+
# @param dubbing_id [String] The dubbing job ID
|
78
|
+
# @param speaker_id [String] The speaker ID
|
79
|
+
# @param start_time [Float] Start time of the segment
|
80
|
+
# @param end_time [Float] End time of the segment
|
81
|
+
# @param text [String, nil] Optional text for the segment
|
82
|
+
# @param translations [Hash, nil] Optional translations map
|
83
|
+
# @return [Hash] Response with version and new segment ID
|
84
|
+
def create_segment(dubbing_id:, speaker_id:, start_time:, end_time:, text: nil, translations: nil)
|
85
|
+
payload = {
|
86
|
+
start_time: start_time,
|
87
|
+
end_time: end_time,
|
88
|
+
text: text,
|
89
|
+
translations: translations
|
90
|
+
}.compact
|
91
|
+
|
92
|
+
@client.post("/v1/dubbing/resource/#{dubbing_id}/speaker/#{speaker_id}/segment", payload)
|
93
|
+
end
|
94
|
+
|
95
|
+
# DELETE /v1/dubbing/resource/{dubbing_id}/segment/{segment_id}
|
96
|
+
# Deletes a single segment from the dubbing
|
97
|
+
#
|
98
|
+
# @param dubbing_id [String] The dubbing job ID
|
99
|
+
# @param segment_id [String] The segment ID
|
100
|
+
# @return [Hash] Response with version
|
101
|
+
def delete_segment(dubbing_id, segment_id)
|
102
|
+
@client.delete("/v1/dubbing/resource/#{dubbing_id}/segment/#{segment_id}")
|
103
|
+
end
|
104
|
+
|
105
|
+
# PATCH /v1/dubbing/resource/{dubbing_id}/segment/{segment_id}/{language}
|
106
|
+
# Updates a single segment with new text and/or start/end times
|
107
|
+
#
|
108
|
+
# @param dubbing_id [String] The dubbing job ID
|
109
|
+
# @param segment_id [String] The segment ID
|
110
|
+
# @param language [String] The language ID
|
111
|
+
# @param start_time [Float, nil] Optional new start time
|
112
|
+
# @param end_time [Float, nil] Optional new end time
|
113
|
+
# @param text [String, nil] Optional new text
|
114
|
+
# @return [Hash] Response with version
|
115
|
+
def update_segment(dubbing_id:, segment_id:, language:, start_time: nil, end_time: nil, text: nil)
|
116
|
+
payload = {
|
117
|
+
start_time: start_time,
|
118
|
+
end_time: end_time,
|
119
|
+
text: text
|
120
|
+
}.compact
|
121
|
+
|
122
|
+
@client.patch("/v1/dubbing/resource/#{dubbing_id}/segment/#{segment_id}/#{language}", payload)
|
123
|
+
end
|
124
|
+
|
125
|
+
# POST /v1/dubbing/resource/{dubbing_id}/transcribe
|
126
|
+
# Regenerates transcriptions for specified segments
|
127
|
+
#
|
128
|
+
# @param dubbing_id [String] The dubbing job ID
|
129
|
+
# @param segments [Array<String>] List of segment IDs to transcribe
|
130
|
+
# @return [Hash] Response with version
|
131
|
+
def transcribe_segment(dubbing_id, segments)
|
132
|
+
payload = { segments: segments }
|
133
|
+
@client.post("/v1/dubbing/resource/#{dubbing_id}/transcribe", payload)
|
134
|
+
end
|
135
|
+
|
136
|
+
# POST /v1/dubbing/resource/{dubbing_id}/translate
|
137
|
+
# Regenerates translations for specified segments/languages
|
138
|
+
#
|
139
|
+
# @param dubbing_id [String] The dubbing job ID
|
140
|
+
# @param segments [Array<String>] List of segment IDs to translate
|
141
|
+
# @param languages [Array<String>, nil] Optional list of languages to translate
|
142
|
+
# @return [Hash] Response with version
|
143
|
+
def translate_segment(dubbing_id, segments, languages = nil)
|
144
|
+
payload = {
|
145
|
+
segments: segments,
|
146
|
+
languages: languages
|
147
|
+
}.compact
|
148
|
+
|
149
|
+
@client.post("/v1/dubbing/resource/#{dubbing_id}/translate", payload)
|
150
|
+
end
|
151
|
+
|
152
|
+
# POST /v1/dubbing/resource/{dubbing_id}/dub
|
153
|
+
# Regenerates dubs for specified segments/languages
|
154
|
+
#
|
155
|
+
# @param dubbing_id [String] The dubbing job ID
|
156
|
+
# @param segments [Array<String>] List of segment IDs to dub
|
157
|
+
# @param languages [Array<String>, nil] Optional list of languages to dub
|
158
|
+
# @return [Hash] Response with version
|
159
|
+
def dub_segment(dubbing_id, segments, languages = nil)
|
160
|
+
payload = {
|
161
|
+
segments: segments,
|
162
|
+
languages: languages
|
163
|
+
}.compact
|
164
|
+
|
165
|
+
@client.post("/v1/dubbing/resource/#{dubbing_id}/dub", payload)
|
166
|
+
end
|
167
|
+
|
168
|
+
# POST /v1/dubbing/resource/{dubbing_id}/render/{language}
|
169
|
+
# Renders the output media for a language
|
170
|
+
#
|
171
|
+
# @param dubbing_id [String] The dubbing job ID
|
172
|
+
# @param language [String] The language to render
|
173
|
+
# @param render_type [String] The type of render (mp4, aac, mp3, wav, aaf, tracks_zip, clips_zip)
|
174
|
+
# @param normalize_volume [Boolean, nil] Whether to normalize volume (defaults to false)
|
175
|
+
# @return [Hash] Response with version and render_id
|
176
|
+
def render_project(dubbing_id:, language:, render_type:, normalize_volume: nil)
|
177
|
+
payload = {
|
178
|
+
render_type: render_type,
|
179
|
+
normalize_volume: normalize_volume
|
180
|
+
}.compact
|
181
|
+
|
182
|
+
@client.post("/v1/dubbing/resource/#{dubbing_id}/render/#{language}", payload)
|
183
|
+
end
|
184
|
+
|
185
|
+
# PATCH /v1/dubbing/resource/{dubbing_id}/speaker/{speaker_id}
|
186
|
+
# Updates speaker metadata such as voice
|
187
|
+
#
|
188
|
+
# @param dubbing_id [String] The dubbing job ID
|
189
|
+
# @param speaker_id [String] The speaker ID
|
190
|
+
# @param voice_id [String, nil] Voice ID from library or 'track-clone'/'clip-clone'
|
191
|
+
# @param languages [Array<String>, nil] Languages to apply changes to
|
192
|
+
# @return [Hash] Response with version
|
193
|
+
def update_speaker(dubbing_id:, speaker_id:, voice_id: nil, languages: nil)
|
194
|
+
payload = {
|
195
|
+
voice_id: voice_id,
|
196
|
+
languages: languages
|
197
|
+
}.compact
|
198
|
+
|
199
|
+
@client.patch("/v1/dubbing/resource/#{dubbing_id}/speaker/#{speaker_id}", payload)
|
200
|
+
end
|
201
|
+
|
202
|
+
# GET /v1/dubbing/resource/{dubbing_id}/speaker/{speaker_id}/similar-voices
|
203
|
+
# Gets similar voices for a speaker
|
204
|
+
#
|
205
|
+
# @param dubbing_id [String] The dubbing job ID
|
206
|
+
# @param speaker_id [String] The speaker ID
|
207
|
+
# @return [Hash] Response with list of similar voices
|
208
|
+
def get_similar_voices(dubbing_id, speaker_id)
|
209
|
+
@client.get("/v1/dubbing/resource/#{dubbing_id}/speaker/#{speaker_id}/similar-voices")
|
210
|
+
end
|
211
|
+
|
56
212
|
private
|
57
213
|
|
58
214
|
attr_reader :client
|