Beranda → Blog → Suara ke teks dengan Java: kode di atas HttpClient standar
Suara ke teks dengan Java: kode di atas HttpClient standar
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:
- Pakai satu HttpClient per aplikasi — ia aman untuk banyak utas dan menggunakan ulang koneksi.
- Jangan membaca berkas besar seluruhnya ke memori: BodyPublishers.ofFile mengalirkannya.
- Batasi paralelisme dengan kolam utas berukuran tetap sesuai batas laju paket Anda.
Kegagalan umum
| Gejala | Penyebab |
|---|---|
| 400 pada berkas yang benar | bagian formulir tanpa filename atau pembatas rusak |
| 401 | kunci tidak terbaca dari variabel lingkungan |
| 413 | berkas di atas 25 MB — kompres atau potong |
| Terputus pada berkas panjang | permintaan tanpa batas waktu |
Coba dengan rekaman Anda sendiri. Pendaftaran memakan waktu satu menit, dan menit gratisnya cukup untuk menilai kualitasnya.
Ambil kunci API gratisPertanyaan 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
- Suara ke teks dengan C#: menyambung dari .NET dalam lima menit — Mentranskrip audio dari C#: klien resmi dan versi HttpClient biasa, pemrosesan asinkron, batas waktu, dan penanganan galat di layanan .NET.
- Suara ke teks dengan Go: kode di atas pustaka standar — Mengirim audio untuk ditranskrip dari Go: permintaan multipart dengan pustaka standar, penguraian jawaban, batas waktu, coba ulang, dan kolam pekerja.
- Galat API transkripsi dan apa artinya sebenarnya — Penjelasan kode status API transkripsi: mengapa muncul 401, 400, 413, 429, dan 502, cara memperbaikinya, serta kegagalan mana yang layak diulang.