mirror of
https://github.com/Andrewcpu/elevenlabs-api.git
synced 2026-05-06 03:00:23 -04:00
Compare commits
2 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
a8e43af913 | ||
|
|
b8d3ae7c90 |
2
pom.xml
2
pom.xml
@@ -34,7 +34,7 @@
|
||||
|
||||
<groupId>net.andrewcpu</groupId>
|
||||
<artifactId>elevenlabs-api</artifactId>
|
||||
<version>1.0-SNAPSHOT</version>
|
||||
<version>1.1-SNAPSHOT</version>
|
||||
|
||||
<properties>
|
||||
<maven.compiler.source>17</maven.compiler.source>
|
||||
|
||||
@@ -3,6 +3,7 @@ package net.andrewcpu.elevenlabs;
|
||||
import net.andrewcpu.elevenlabs.api.net.ElevenLabsRequest;
|
||||
import net.andrewcpu.elevenlabs.api.net.ElevenLabsResponse;
|
||||
import net.andrewcpu.elevenlabs.enums.ContentType;
|
||||
import net.andrewcpu.elevenlabs.enums.ResponseType;
|
||||
import net.andrewcpu.elevenlabs.exceptions.ElevenLabsAPINotInitiatedException;
|
||||
import net.andrewcpu.elevenlabs.exceptions.ElevenLabsException;
|
||||
import net.andrewcpu.elevenlabs.exceptions.ElevenLabsValidationException;
|
||||
@@ -95,6 +96,10 @@ public class ElevenLabsAPI {
|
||||
connection.getOutputStream().close();
|
||||
}
|
||||
|
||||
if(request.getResponseType() == ResponseType.FILE_STREAM) {
|
||||
request.getStreamedResponseCallback().handleStreamedResponse(connection.getInputStream(), connection.getErrorStream());
|
||||
}
|
||||
|
||||
responseCode = connection.getResponseCode();
|
||||
if (responseCode >= 200 && responseCode < 300) {
|
||||
successStream = connection.getInputStream();
|
||||
@@ -111,7 +116,6 @@ public class ElevenLabsAPI {
|
||||
private void setupConnection(ElevenLabsRequest<?> request, String boundary, HttpURLConnection connection) throws ProtocolException {
|
||||
connection.setConnectTimeout(60000);
|
||||
connection.setReadTimeout(60000);
|
||||
System.out.println(request.getMethod().name());
|
||||
connection.setRequestMethod(request.getMethod().name());
|
||||
String contType = request.getContentType().getType();
|
||||
if (request.getContentType() == ContentType.MULTIPART) {
|
||||
|
||||
@@ -1,16 +1,19 @@
|
||||
package net.andrewcpu.elevenlabs.api;
|
||||
|
||||
import net.andrewcpu.elevenlabs.ElevenLabsAPI;
|
||||
import net.andrewcpu.elevenlabs.api.net.requests.voices.*;
|
||||
import net.andrewcpu.elevenlabs.api.net.requests.voices.settings.GetDefaultVoiceSettingsRequest;
|
||||
import net.andrewcpu.elevenlabs.api.net.requests.voices.settings.GetVoiceSettingsRequest;
|
||||
import net.andrewcpu.elevenlabs.api.net.requests.voices.settings.UpdateVoiceSettingsRequest;
|
||||
import net.andrewcpu.elevenlabs.api.net.requests.voices.tts.GenerateTextToSpeechRequest;
|
||||
import net.andrewcpu.elevenlabs.api.net.requests.voices.tts.GenerateTextToSpeechStreamRequest;
|
||||
import net.andrewcpu.elevenlabs.elements.voice.Voice;
|
||||
import net.andrewcpu.elevenlabs.elements.voice.VoiceSettings;
|
||||
import net.andrewcpu.elevenlabs.exceptions.ElevenLabsException;
|
||||
import net.andrewcpu.elevenlabs.util.StreamedResponseCallback;
|
||||
import org.json.simple.JSONObject;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.InputStream;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
@@ -25,6 +28,10 @@ public class VoiceAPI {
|
||||
return getRequestResult(new GenerateTextToSpeechRequest(voice, settings, text, outputFile));
|
||||
}
|
||||
|
||||
public static InputStream getTextToSpeechStreamed(String text, Voice voice, VoiceSettings settings, StreamedResponseCallback callback, File file) throws ElevenLabsException{
|
||||
return getRequestResult(new GenerateTextToSpeechStreamRequest(voice, settings, text, callback, file));
|
||||
}
|
||||
|
||||
public static List<Voice> getVoices() throws ElevenLabsException {
|
||||
return getRequestResult(new GetVoicesRequest());
|
||||
}
|
||||
|
||||
@@ -5,6 +5,7 @@ import net.andrewcpu.elevenlabs.api.net.transformers.ResultTransformer;
|
||||
import net.andrewcpu.elevenlabs.enums.ContentType;
|
||||
import net.andrewcpu.elevenlabs.enums.HTTPMethod;
|
||||
import net.andrewcpu.elevenlabs.enums.ResponseType;
|
||||
import net.andrewcpu.elevenlabs.util.StreamedResponseCallback;
|
||||
import org.json.simple.JSONObject;
|
||||
|
||||
import java.io.File;
|
||||
@@ -19,6 +20,7 @@ public abstract class ElevenLabsRequest<T> {
|
||||
protected JSONObject body;
|
||||
protected File outputFilePath;
|
||||
protected MultipartForm multipartForm;
|
||||
protected StreamedResponseCallback streamedResponseCallback;
|
||||
|
||||
public ElevenLabsRequest(List<String> parameters, JSONObject body, HTTPMethod method, ResultTransformer<T> resultTransformer) {
|
||||
this.method = method;
|
||||
@@ -77,7 +79,9 @@ public abstract class ElevenLabsRequest<T> {
|
||||
return outputFilePath;
|
||||
}
|
||||
|
||||
|
||||
public StreamedResponseCallback getStreamedResponseCallback() {
|
||||
return streamedResponseCallback;
|
||||
}
|
||||
|
||||
public ResultTransformer<T> getResultTransformer() {
|
||||
return resultTransformer;
|
||||
|
||||
@@ -17,7 +17,7 @@ import java.nio.charset.StandardCharsets;
|
||||
public class ElevenLabsResponse<T> {
|
||||
private final InputStream errorStream;
|
||||
private JSONObject error;
|
||||
private final InputStream successStream;
|
||||
public final InputStream successStream;
|
||||
private JSONObject successful;
|
||||
private final ElevenLabsRequest<T> request;
|
||||
private final int responseCode;
|
||||
@@ -38,34 +38,33 @@ public class ElevenLabsResponse<T> {
|
||||
}
|
||||
|
||||
private void _buildObjects() throws IOException, ParseException {
|
||||
if(isSuccessful()){
|
||||
if(request.getResponseType() == ResponseType.JSON){
|
||||
if (isSuccessful()) {
|
||||
if (request.getResponseType() == ResponseType.JSON) {
|
||||
String responseBody = new String(successStream.readAllBytes(), StandardCharsets.UTF_8);
|
||||
DebugLogger.log(getClass(), responseBody);
|
||||
JSONObject object = ((JSONObject) new JSONParser().parse(responseBody));
|
||||
this.successful = object;
|
||||
resultingObject = request.getResultTransformer().transform(object);
|
||||
}
|
||||
else if(request.getResponseType() == ResponseType.FILE_STREAM){
|
||||
try (InputStream inputStream = successStream) {
|
||||
byte[] buffer = new byte[4096];
|
||||
int bytesRead;
|
||||
try (OutputStream outputStream = new FileOutputStream(request.getOutputFilePath())) {
|
||||
while ((bytesRead = inputStream.read(buffer)) != -1) {
|
||||
outputStream.write(buffer, 0, bytesRead);
|
||||
}
|
||||
}
|
||||
} else if (request.getResponseType() == ResponseType.FILE_STREAM) {
|
||||
InputStream inputStream = successStream;
|
||||
byte[] buffer = new byte[4096];
|
||||
int bytesRead;
|
||||
OutputStream outputStream = new FileOutputStream(request.getOutputFilePath());
|
||||
while ((bytesRead = inputStream.read(buffer)) != -1) {
|
||||
outputStream.write(buffer, 0, bytesRead);
|
||||
}
|
||||
resultingObject = request.getResultTransformer().transform();
|
||||
|
||||
}
|
||||
else if(request.getResponseType() == ResponseType.STRING){
|
||||
outputStream.close();
|
||||
try {
|
||||
resultingObject = request.getResultTransformer().transform();
|
||||
} catch (Exception e) {
|
||||
throw new RuntimeException(e);
|
||||
}
|
||||
} else if (request.getResponseType() == ResponseType.STRING) {
|
||||
String responseBody = new String(successStream.readAllBytes(), StandardCharsets.UTF_8);
|
||||
DebugLogger.log(getClass(), responseBody);
|
||||
resultingObject = request.getResultTransformer().transform(responseBody);
|
||||
}
|
||||
}
|
||||
else{
|
||||
} else {
|
||||
String responseBody = new String(errorStream.readAllBytes(), StandardCharsets.UTF_8);
|
||||
DebugLogger.log(getClass(), responseBody);
|
||||
this.error = ((JSONObject) new JSONParser().parse(responseBody));
|
||||
@@ -83,6 +82,7 @@ public class ElevenLabsResponse<T> {
|
||||
public JSONObject getResultJSON() {
|
||||
return successful;
|
||||
}
|
||||
|
||||
public boolean isSuccessful() {
|
||||
return responseCode >= 200 && responseCode < 300;
|
||||
}
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
package net.andrewcpu.elevenlabs.api.net.requests.voices;
|
||||
package net.andrewcpu.elevenlabs.api.net.requests.voices.tts;
|
||||
|
||||
import net.andrewcpu.elevenlabs.api.net.ElevenLabsRequest;
|
||||
import net.andrewcpu.elevenlabs.api.net.requests.ElevenLabsPostRequest;
|
||||
import net.andrewcpu.elevenlabs.api.net.transformers.FilePingPongTransformer;
|
||||
import net.andrewcpu.elevenlabs.elements.voice.Voice;
|
||||
import net.andrewcpu.elevenlabs.elements.voice.VoiceSettings;
|
||||
@@ -12,7 +13,7 @@ import java.io.File;
|
||||
import java.util.List;
|
||||
|
||||
@SuppressWarnings("unchecked")
|
||||
public class GenerateTextToSpeechRequest extends ElevenLabsRequest<File> {
|
||||
public class GenerateTextToSpeechRequest extends ElevenLabsPostRequest<File> {
|
||||
|
||||
private static JSONObject buildBody(VoiceSettings settings, String text){
|
||||
JSONObject object = new JSONObject();
|
||||
@@ -21,7 +22,7 @@ public class GenerateTextToSpeechRequest extends ElevenLabsRequest<File> {
|
||||
return object;
|
||||
}
|
||||
public GenerateTextToSpeechRequest(Voice voice, VoiceSettings settings, String text, File outputFile){
|
||||
super(List.of(voice.getVoiceId()), buildBody(settings, text), HTTPMethod.POST, new FilePingPongTransformer(outputFile));
|
||||
super(List.of(voice.getVoiceId()), buildBody(settings, text), new FilePingPongTransformer(outputFile));
|
||||
responseType = (ResponseType.FILE_STREAM);
|
||||
outputFilePath = (outputFile);
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
package net.andrewcpu.elevenlabs.api.net.requests.voices.tts;
|
||||
|
||||
import net.andrewcpu.elevenlabs.api.net.requests.ElevenLabsPostRequest;
|
||||
import net.andrewcpu.elevenlabs.api.net.transformers.RequestInputStreamTransformer;
|
||||
import net.andrewcpu.elevenlabs.elements.voice.Voice;
|
||||
import net.andrewcpu.elevenlabs.elements.voice.VoiceSettings;
|
||||
import net.andrewcpu.elevenlabs.enums.ResponseType;
|
||||
import net.andrewcpu.elevenlabs.util.StreamedResponseCallback;
|
||||
import org.json.simple.JSONObject;
|
||||
|
||||
import java.io.File;
|
||||
import java.io.InputStream;
|
||||
import java.util.List;
|
||||
|
||||
public class GenerateTextToSpeechStreamRequest extends ElevenLabsPostRequest<InputStream> {
|
||||
|
||||
private static JSONObject buildBody(VoiceSettings settings, String text){
|
||||
JSONObject object = new JSONObject();
|
||||
object.put("text", text);
|
||||
object.put("voice_settings", settings.toJSON());
|
||||
return object;
|
||||
}
|
||||
public GenerateTextToSpeechStreamRequest(Voice voice, VoiceSettings settings, String text, StreamedResponseCallback callback, File outputFile){
|
||||
super(List.of(voice.getVoiceId()), buildBody(settings, text), new RequestInputStreamTransformer());
|
||||
responseType = (ResponseType.FILE_STREAM);
|
||||
this.streamedResponseCallback = callback;
|
||||
this.outputFilePath = outputFile;
|
||||
if(outputFilePath.exists()) outputFilePath.delete();
|
||||
}
|
||||
|
||||
@Override
|
||||
public String getEndpoint() {
|
||||
return "text-to-speech/{voiceId}/stream";
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
package net.andrewcpu.elevenlabs.api.net.transformers;
|
||||
|
||||
import net.andrewcpu.elevenlabs.api.net.ElevenLabsResponse;
|
||||
|
||||
import java.io.InputStream;
|
||||
|
||||
public class RequestInputStreamTransformer extends ResultTransformerAdapter<InputStream> {
|
||||
|
||||
@Override
|
||||
public InputStream transform(ElevenLabsResponse<InputStream> response) {
|
||||
return response.successStream;
|
||||
}
|
||||
|
||||
@Override
|
||||
public InputStream transform() {
|
||||
return null;
|
||||
}
|
||||
}
|
||||
@@ -1,9 +1,11 @@
|
||||
package net.andrewcpu.elevenlabs.api.net.transformers;
|
||||
|
||||
import net.andrewcpu.elevenlabs.api.net.ElevenLabsResponse;
|
||||
import org.json.simple.JSONObject;
|
||||
|
||||
public abstract class ResultTransformer<T> {
|
||||
public abstract T transform(JSONObject object);
|
||||
public abstract T transform(String object);
|
||||
public abstract T transform();
|
||||
public abstract T transform(ElevenLabsResponse<T> response);
|
||||
}
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
package net.andrewcpu.elevenlabs.api.net.transformers;
|
||||
|
||||
import net.andrewcpu.elevenlabs.api.net.ElevenLabsResponse;
|
||||
import org.json.simple.JSONObject;
|
||||
|
||||
public class ResultTransformerAdapter<T> extends ResultTransformer<T> {
|
||||
@@ -18,4 +19,9 @@ public class ResultTransformerAdapter<T> extends ResultTransformer<T> {
|
||||
public T transform() {
|
||||
throw new UnsupportedOperationException("transform() is not defined.");
|
||||
}
|
||||
|
||||
@Override
|
||||
public T transform(ElevenLabsResponse<T> response) {
|
||||
throw new UnsupportedOperationException("transform(Response response) is not defined.");
|
||||
}
|
||||
}
|
||||
|
||||
@@ -5,14 +5,13 @@ import net.andrewcpu.elevenlabs.api.VoiceAPI;
|
||||
import net.andrewcpu.elevenlabs.elements.VoiceBuilder;
|
||||
import net.andrewcpu.elevenlabs.exceptions.ElevenLabsException;
|
||||
import net.andrewcpu.elevenlabs.exceptions.ElevenLabsValidationException;
|
||||
import net.andrewcpu.elevenlabs.util.StreamedResponseCallback;
|
||||
import org.json.simple.JSONArray;
|
||||
import org.json.simple.JSONObject;
|
||||
|
||||
import java.io.File;
|
||||
import java.util.ArrayList;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.io.InputStream;
|
||||
import java.util.*;
|
||||
|
||||
public class Voice {
|
||||
private final String voiceId;
|
||||
@@ -162,6 +161,14 @@ public class Voice {
|
||||
return generate(text, voiceSettings, output);
|
||||
}
|
||||
|
||||
public InputStream generateStream(String text, VoiceSettings voiceSettings, StreamedResponseCallback streamedResponseCallback, File file) throws ElevenLabsException {
|
||||
return VoiceAPI.getTextToSpeechStreamed(text, this, voiceSettings, streamedResponseCallback, file);
|
||||
}
|
||||
|
||||
public InputStream generateStream(String text, StreamedResponseCallback callback, File file) throws ElevenLabsException {
|
||||
return generateStream(text, voiceSettings, callback, file);
|
||||
}
|
||||
|
||||
public String getLabel(String label) {
|
||||
return labels.get(label);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
package net.andrewcpu.elevenlabs.util;
|
||||
|
||||
import java.io.InputStream;
|
||||
|
||||
public interface StreamedResponseCallback {
|
||||
public void handleStreamedResponse(InputStream inputStream, InputStream errorStream);
|
||||
}
|
||||
Reference in New Issue
Block a user