BerandaBlog → Suara ke teks dengan Java: kode di atas HttpClient standar

Suara ke teks dengan Java: kode di atas HttpClient standar

Diterbitkan 2026-08-20 · 5 menit baca

Java punya klien HTTP bawaan sejak versi 11, dan itu sudah cukup — tidak perlu pustaka pihak ketiga untuk mengunggah audio. Satu-satunya kerepotan adalah menyusun badan multipart secara manual. Berikut kode yang bisa langsung disalin.

Menyusun permintaan multipart

import java.net.URI;
import java.net.http.*;
import java.nio.file.*;
import java.io.ByteArrayOutputStream;

String boundary = "----vs" + System.nanoTime();
Path audio = Path.of("call.ogg");

var body = new ByteArrayOutputStream();
body.write(("--" + boundary + "\r\n"
    + "Content-Disposition: form-data; name=\"model\"\r\n\r\nwhisper-1\r\n"
    + "--" + boundary + "\r\n"
    + "Content-Disposition: form-data; name=\"file\"; filename=\"" + audio.getFileName() + "\"\r\n"
    + "Content-Type: audio/ogg\r\n\r\n").getBytes());
body.write(Files.readAllBytes(audio));
body.write(("\r\n--" + boundary + "--\r\n").getBytes());

var request = HttpRequest.newBuilder(URI.create("https://voicesscribe.com/v1/audio/transcriptions"))
    .header("Authorization", "Bearer " + System.getenv("VS_KEY"))
    .header("Content-Type", "multipart/form-data; boundary=" + boundary)
    .timeout(java.time.Duration.ofMinutes(3))
    .POST(HttpRequest.BodyPublishers.ofByteArray(body.toByteArray()))
    .build();

var client = HttpClient.newHttpClient();
var response = client.send(request, HttpResponse.BodyHandlers.ofString());

if (response.statusCode() != 200) {
    throw new IllegalStateException("galat " + response.statusCode() + ": " + response.body());
}
System.out.println(response.body());

Pergantian baris pada pembatas harus berupa carriage return plus line feed: dengan satu baris baru saja server tidak bisa mengurai badannya.

Mengurai jawaban

Jawabannya JSON dengan bidang text. Pengurai apa pun yang Anda kenal bisa dipakai — Jackson, Gson, atau bawaan kerangka kerja Anda:

record Transcription(String text) {}

var mapper = new com.fasterxml.jackson.databind.ObjectMapper();
var result = mapper.readValue(response.body(), Transcription.class);
System.out.println(result.text());

Kalau yang diminta srt atau vtt, jawabannya bukan JSON melainkan berkas subtitle siap pakai — tidak ada yang perlu diurai.

Di bawah beban

Tiga hal yang sebaiknya dilakukan sejak awal:

  1. Pakai satu HttpClient per aplikasi — ia aman untuk banyak utas dan menggunakan ulang koneksi.
  2. Jangan membaca berkas besar seluruhnya ke memori: BodyPublishers.ofFile mengalirkannya.
  3. Batasi paralelisme dengan kolam utas berukuran tetap sesuai batas laju paket Anda.

Kegagalan umum

GejalaPenyebab
400 pada berkas yang benarbagian formulir tanpa filename atau pembatas rusak
401kunci tidak terbaca dari variabel lingkungan
413berkas di atas 25 MB — kompres atau potong
Terputus pada berkas panjangpermintaan tanpa batas waktu

Coba dengan rekaman Anda sendiri. Pendaftaran memakan waktu satu menit, dan menit gratisnya cukup untuk menilai kualitasnya.

Ambil kunci API gratis

Pertanyaan yang sering diajukan

Perlukah OkHttp atau Apache HttpClient?

Tidak harus: klien bawaan sudah cukup. Kelebihan OkHttp adalah ia menyusun badan multipart untuk Anda.

Apakah contoh ini jalan di Java 8?

Tidak, HttpClient bawaan baru ada sejak Java 11. Di versi 8 gunakan OkHttp atau Apache HttpClient.

Bagaimana menyebut bahasa audionya?

Tambahkan satu bagian formulir bernama language berisi kode bahasa, misalnya id.

Bisakah berkas dialirkan tanpa disangga?

Bisa, BodyPublishers.ofFile mengirimnya tanpa memuat ke memori, penting untuk berkas mendekati batas ukuran.

Bacaan terkait