API reference documentation is available here.
Java 8+
Add the dependency in your build.gradle
:
dependencies {
implementation 'com.assemblyai:assemblyai-java:x.x.x'
}
Add the dependency in your pom.xml
:
<dependency>
<groupId>com.assemblyai</groupId>
<artifactId>assemblyai-java</artifactId>
<version>x.x.x</version>
</dependency>
The SDK exports a vanilla HTTP client, AssemblyAI
. You can
use this to call into each of our API endpoints and get typed
responses back.
import com.assemblyai.api.AssemblyAI;
AssemblyAI aai = AssemblyAI.builder()
.apiKey("YOUR_API_KEY")
.build();
Transcript transcript = aai.transcripts().get("transcript-id");
System.out.printlin("Received response!" + transcript);
When the API returns a non-success status code (4xx or 5xx response), a subclass of ApiError will be thrown:
import com.assemblyai.api.core.ApiError;
try {
aai.transcript().get("transcript-id");
} catch (ApiError error) {
System.out.println(error.getBody());
System.out.println(error.getStatusCode());
}
When you create a transcript, you can either pass in a URL to an audio file or upload a file directly.
import com.assemblyai.api.resources.transcripts.types.Transcript;
// Transcribe file at remote URL
Transcript transcript = aai.transcripts().transcribe(
"https://assembly.ai/espn.m4a");
// Upload a file via local path and transcribe
transcript = aai.transcripts().transcribe(
new File("./news.mp4"));
transcribe
queues a transcription job and polls it until the status is completed or error.
If you don't want to wait until the transcript is ready, you can use submit:
import com.assemblyai.api.resources.transcripts.types.Transcript;
// Transcribe file at remote URL
Transcript transcript = aai.transcripts().submit(
"https://assembly.ai/espn.m4a");
// Upload a file via local path and transcribe
transcript = aai.transcripts().submit(
new File("./news.mp4"));
The Realtime Transcriber can be used to process any live audio streams and sends data over websockets. The Realtime Transcriber will take event handlers
import com.assemblyai.api.RealtimeTranscriber;
RealtimeTranscriber realtime = RealtimeTranscriber.builder()
.apiKey("YOUR_API_KEY")
.onPartialTranscript(partial -> System.out.println(partial))
.onFinalTranscript(finalTranscript -> System.out.println(finalTranscript))
.build();
realtime.sendAudio(new byte[]{...});
realtime.close();
The generated builders all follow the staged builder pattern. Read more here. Staged builders only allow you to construct the object once all required properties have been specified.
For example, in the snippet below, you will not be able to access the build
method on CreateTranscriptParameters
until you have specified the mandatory
audioUrl variable.
import com.assemblyai.api.resources.transcripts.requests.TranscriptParams;
TranscriptParams params = TranscriptParams.builder()
.audioUrl("https://...")
.build();
The SDK uses the default timeouts of OkHttpClient:
- 10 seconds for connection timeout
- 10 seconds for read timeout
- 10 seconds for write timeout
- No timeout for call timeout
However, there are no timeouts for any LeMUR HTTP request.
To specify your own timeout, you can pass RequestOptions
to each request method:
import com.assemblyai.api.core.RequestOptions;
// initialize client
client.transcripts()
.get(
"50c54d73-7a3f-44dc-af6b-f4579841b1ce",
RequestOptions.builder()
.timeout(30, TimeUnit.SECONDS)
.build()
);
For this operation, the call timeout will be 30 seconds, and the other timeouts will be turned off.
The default timeout should be sufficient for most use cases. However, depending on your network speed and distance, you may occasionally experience timeouts, in which case you can increase the timeout.
If you've enabled Code shrinking using minifyEnabled
, you need to add the following ProGuard configuration to keep R8 from incorrectly marking the SDK classes as unused.
-keep class com.assemblyai.api.** { *; }
While we value open-source contributions to this SDK, this library is generated programmatically. Additions made directly to this library would have to be moved over to our generation code, otherwise they would be overwritten upon the next generated release. Feel free to open a PR as a proof of concept, but know that we will not be able to merge it as-is. We suggest opening an issue first to discuss with us!
On the other hand, contributions to the README are always very welcome!