1 Commits
v33 ... v34

Author SHA1 Message Date
Andrew Stein
a8e43af913 Streamed response support 2023-03-10 17:48:52 -05:00
9 changed files with 64 additions and 27 deletions

View File

@@ -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>

View File

@@ -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) {

View File

@@ -5,12 +5,15 @@ import net.andrewcpu.elevenlabs.api.net.requests.voices.settings.GetDefaultVoice
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());
}

View File

@@ -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;

View File

@@ -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;
}

View File

@@ -5,6 +5,7 @@ import net.andrewcpu.elevenlabs.api.net.transformers.RequestInputStreamTransform
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;
@@ -19,10 +20,12 @@ public class GenerateTextToSpeechStreamRequest extends ElevenLabsPostRequest<Inp
object.put("voice_settings", settings.toJSON());
return object;
}
public GenerateTextToSpeechStreamRequest(Voice voice, VoiceSettings settings, String text, File outputFile){
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);
outputFilePath = (outputFile);
this.streamedResponseCallback = callback;
this.outputFilePath = outputFile;
if(outputFilePath.exists()) outputFilePath.delete();
}
@Override

View File

@@ -10,4 +10,9 @@ public class RequestInputStreamTransformer extends ResultTransformerAdapter<Inpu
public InputStream transform(ElevenLabsResponse<InputStream> response) {
return response.successStream;
}
@Override
public InputStream transform() {
return null;
}
}

View File

@@ -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);
}

View File

@@ -0,0 +1,7 @@
package net.andrewcpu.elevenlabs.util;
import java.io.InputStream;
public interface StreamedResponseCallback {
public void handleStreamedResponse(InputStream inputStream, InputStream errorStream);
}