Langsung ke konten utama

Pengembang

SDK dan CLI Hushscript

Pustaka resmi untuk TypeScript, Python, Go, dan PHP, serta alat baris perintah, yang mengubah file rekaman menjadi transkrip dengan satu panggilan.

SDK resmi membungkus REST API untuk kode server dan skrip. Satu panggilan mentranskripsikan sebuah file: rekaman diunggah, SDK menunggu pekerjaannya, lalu menyerahkan transkripnya. Di antaranya, SDK memeriksa file sebelum ada menit yang ditahan, mengulang permintaan yang aman diulang, menjaga unggahan panjang tetap hidup, dan menyertakan kunci idempotensi pada setiap unggahan dan pembelian, sehingga percobaan ulang tidak pernah menagih dua kali. CLI dibangun di atas SDK TypeScript dan melakukan hal yang sama dari terminal.

Paket

Bahasa Paket Registri Sumber
TypeScript @hushscript/sdk npm: www.npmjs.com/package/@hushscript/sdk github.com/Hushscript/hushscript-sdk-typescript
Python hushscript PyPI: pypi.org/project/hushscript github.com/Hushscript/hushscript-sdk-python
Go github.com/Hushscript/hushscript-sdk-go pkg.go.dev: pkg.go.dev/github.com/Hushscript/hushscript-sdk-go github.com/Hushscript/hushscript-sdk-go
PHP hushscript/sdk Packagist: packagist.org/packages/hushscript/sdk github.com/Hushscript/hushscript-sdk-php
CLI @hushscript/cli npm: www.npmjs.com/package/@hushscript/cli github.com/Hushscript/hushscript-cli

Versi runtime minimum:

SDK dibuat untuk server dan skrip. API tidak menerima origin browser, dan token di dalam bundle browser adalah token yang bocor, sehingga SDK TypeScript menolak berjalan di lingkungan yang memiliki window dan document.

Dapatkan token

Setiap SDK dan CLI mengautentikasi dengan token akses pribadi. Buat satu di bawah Create a new token pada halaman MCP di akun, pilih scope yang dibutuhkan kode Anda, dan tentukan apakah token boleh membeli menit. Token hanya ditampilkan sekali dan berbentuk hsr1:<region>:pat.<id>.<secret>. Scope dan cara kerja token ada di halaman API.

SDK membaca token dari HUSHSCRIPT_TOKEN bila Anda tidak mengirimkannya:

export HUSHSCRIPT_TOKEN=hsr1:...

Agen juga dapat membuka akunnya sendiri, membayarnya di halaman checkout yang dihosting, lalu mengklaim token pertamanya dari kode: Hushscript.agent.signup() dan Hushscript.agent.claim() di TypeScript, Hushscript.agent_signup() dan Hushscript.agent_claim() di Python, AgentSignup dan AgentClaim di Go, serta Client::agentSignup() dan Client::agentClaim() di PHP. Alur dan aturannya ada di Penggunaan otomatis.

TypeScript

npm install @hushscript/sdk
import { writeFile } from "node:fs/promises";
import { Hushscript } from "@hushscript/sdk";

const hs = new Hushscript(); // reads HUSHSCRIPT_TOKEN
const transcript = await hs.transcribe("meeting.mp3");
console.log(transcript.text);
await writeFile("meeting.srt", transcript.toSRT());

transcribe() menerima path, Blob, Uint8Array, atau ReadableStream<Uint8Array>. Stream memerlukan size dan durationSeconds yang tepat. hs.balance() mengembalikan menit yang dapat Anda pakai, hs.transcripts.list() menelusuri transkrip yang sudah selesai per halaman, dan hs.buy("300min", { acknowledgeNoRefund: true }) membeli sebuah paket. Setiap operasi /v1 juga tersedia sebagai hs.api, dengan percobaan ulang, batas waktu, dan penyamaran data yang sama.

Python

pip install hushscript
from pathlib import Path

from hushscript import Hushscript

with Hushscript() as hs:  # reads HUSHSCRIPT_TOKEN
    transcript = hs.transcribe("meeting.mp3")
    print(transcript.text)
    Path("meeting.srt").write_text(transcript.to_srt(), encoding="utf-8")

Setiap panggilan memiliki padanan asyncio pada AsyncHushscript dengan nama yang sama. transcribe() menerima path, bytes, atau objek file biner; objek file yang tidak dapat di-seek memerlukan size dan duration_seconds. hs.balance(), hs.transcripts.list(), dan hs.buy("300min", acknowledge_no_refund=True) mencakup saldo, daftar transkrip, dan pembelian.

Go

go get github.com/Hushscript/hushscript-sdk-go
package main

import (
	"context"
	"fmt"
	"log"
	"os"

	hushscript "github.com/Hushscript/hushscript-sdk-go"
)

func main() {
	client, err := hushscript.New() // reads HUSHSCRIPT_TOKEN
	if err != nil {
		log.Fatal(err)
	}
	transcript, err := client.Transcribe(context.Background(), "meeting.mp3", nil)
	if err != nil {
		log.Fatal(err)
	}
	fmt.Println(transcript.Text(nil))
	if err := os.WriteFile("meeting.srt", []byte(transcript.SRT(nil)), 0o600); err != nil {
		log.Fatal(err)
	}
}

Transcribe menerima path, TranscribeReader menerima io.ReaderAt beserta ukuran persisnya, dan TranscribeStream menerima pembaca satu arah beserta ukuran dan DurationSeconds-nya. client.Balance, client.Transcripts.List, dan client.Buy mencakup saldo, daftar transkrip, dan pembelian. Opsi yang bisa mati, hidup, atau tidak diatur bertipe *bool, dibuat dengan hushscript.Bool.

PHP

composer require hushscript/sdk
<?php

require __DIR__ . '/vendor/autoload.php';

use Hushscript\Client;

$hs = new Client(); // reads HUSHSCRIPT_TOKEN

$transcript = $hs->transcribe('meeting.mp3');
echo $transcript->text();
file_put_contents('meeting.srt', $transcript->toSrt());

transcribe() menerima path atau stream yang terbuka; stream yang tidak dapat di-seek memerlukan opsi size dan duration_seconds. Opsi memakai kunci array snake_case, sedangkan hasilnya memakai properti camelCase. $hs->balance(), $hs->transcripts()->list(), dan $hs->buy('300min', true) mencakup saldo, daftar transkrip, dan pembelian. Untuk Laravel, ikat satu Client di service provider dan jalankan transkripsi dalam job antrean dengan opsi idempotency_key yang stabil.

CLI

npm install --global @hushscript/cli
hushscript login
hushscript transcribe meeting.mp3 --format srt --out meeting.srt

CLI mengambil token dari --token, lalu HUSHSCRIPT_TOKEN, lalu token yang disimpan hushscript login. login meminta token tanpa menampilkannya dan menyimpannya di file yang hanya dapat dibaca pengguna Anda; hushscript logout menghapusnya. Di CI, pilih variabel lingkungan.

Perintah Fungsinya
login Meminta token lalu menyimpannya.
logout Menghapus token yang tersimpan.
balance Menampilkan menit yang dapat Anda pakai.
transcribe <file> Mengunggah rekaman, menunggu, dan mencetak transkrip. Flag: --language, --translate, --format srt|vtt|txt|json, --out, --key.
resume <token> <file> Menyelesaikan transkripsi yang ditinggalkan transcribe.
transcripts Mencantumkan transkrip yang sudah selesai, terbaru lebih dulu.
transcript <id> Mencetak satu transkrip.
jobs Mencantumkan pekerjaan; --active untuk yang belum selesai.
packs Mencantumkan paket menit yang dapat dibeli, beserta harganya.
buy <pack> Membeli paket dengan kartu default yang Anda simpan. Flag: --yes, --key.

--json mencetak satu dokumen JSON di stdout dan tidak ada yang lain, serta mengubah stderr menjadi JSON Lines. Kode keluarnya 0 jika berhasil, 1 jika API atau SDK melaporkan error, 2 untuk kesalahan penggunaan (tidak ada yang dikirim), dan 130 jika proses diinterupsi.

File yang didukung

MP3, M4A, MP4 dan MOV (trek audio video yang dipakai), WAV, FLAC, serta OGG dengan Vorbis atau Opus, dari 15 detik sampai 10 jam. SDK memeriksa format dari byte file dan memeriksa durasinya sebelum ada menit yang ditahan. SDK tidak mengonversi media, jadi konversikan dulu format lainnya:

ffmpeg -i input -vn -c:a libopus output.opus

Error

Setiap error yang dimunculkan SDK termasuk dalam satu keluarga, sehingga satu catch mencakup semuanya: HushscriptError di TypeScript dan Python, *hushscript.Error di Go, dan HushscriptException di PHP. Sebuah error membawa code berupa slug seperti insufficient_balance, kode numeriknya, status HTTP, pesan, hint yang menjelaskan langkah berikutnya, detail, dan retryAfter (di PHP slug-nya errorCode; di Python retryAfter ditulis retry_after).

import { HushscriptError, InsufficientBalanceError } from "@hushscript/sdk";

try {
  await hs.transcribe("meeting.mp3");
} catch (error) {
  if (error instanceof InsufficientBalanceError) console.log(error.hint);
  else if (error instanceof HushscriptError) console.log(error.code, error.hint ?? error.message);
  else throw error;
}

PreflightError berarti SDK menolak file sebelum ada kredit yang ditahan. Apakah saldo Anda cukup untuk sebuah file adalah keputusan server: 402 muncul saat unggahan dibuat, sebelum ada bagian yang dikirim.

Penagihan dan percobaan ulang

Setiap unggahan dan setiap pembelian membawa kunci idempotensi, dan percobaan ulang memakai kunci yang sama, sehingga panggilan yang diulang memutar ulang panggilan pertama dan tidak memulai yang kedua.

buy() menagih kartu default Anda yang tersimpan. Pembelian dari kode nonaktif sampai tiga sakelar mengizinkannya: token memiliki scope billing, token memiliki “Let this token buy minutes” yang diaktifkan, dan “Let connected apps buy minutes” aktif untuk akun. Jika salah satunya tidak ada, panggilan gagal dengan pat_scope_missing. Tampilkan pemberitahuan tanpa pengembalian dana kepada pembeli Anda sebelum memanggilnya.

Pembelian diulang paling banyak satu kali, saat terjadi error jaringan, 502, atau 503, dengan kunci yang sama. Beberapa jawaban membuktikan tidak ada yang ditagih: 400, 402, 404, atau 422, serta 403 dengan kode 4021 (pat_purchase_requires_app, kartu ditolak atau tidak dapat ditagih tanpa Anda) atau 4023 (pat_purchase_requires_authentication, bank ingin mengonfirmasi pembayaran). Setelah 4021 atau 4023, beli paket di aplikasi. Kegagalan lain setelah permintaan dikirim, termasuk 401 atau 429, berarti kartu mungkin sudah ditagih. Error itu membawa kunci idempotensi: ulangi dengan kunci yang sama, dan pembelian tidak pernah terjadi dua kali. Di Python:

from hushscript import HushscriptError

try:
    purchase = hs.buy("300min", acknowledge_no_refund=True)
except HushscriptError as error:
    refused = error.status in {400, 402, 404, 422} or (
        error.status == 403 and error.numeric_code in {4021, 4023}
    )
    if error.idempotency_key is None or refused:
        raise  # only these refusals charged nothing; any other failure keeps the key for a retry
    purchase = hs.buy("300min", acknowledge_no_refund=True, idempotency_key=error.idempotency_key)

Pembelian yang gagal sebelum permintaannya dikirim tidak membawa kunci: tidak ada yang ditagih. Kunci yang Anda berikan sendiri harus terdiri dari 1 sampai 128 karakter dari A-Za-z0-9_-; jangan memakainya ulang untuk paket yang berbeda. CLI mencetak kunci itu saat pembelian mungkin sudah terkirim:

hushscript buy 300min --yes --key <key>

Token lanjutan

Begitu sebuah pekerjaan ada, error membawa token lanjutan di samping kunci idempotensi. Penantian yang kehabisan waktu memunculkan WaitTimeoutError beserta tokennya, dan pekerjaan tetap berjalan. Berikan token itu kembali ke resume() untuk melanjutkan tanpa tagihan kedua: pekerjaan yang sudah lewat tahap unggah tidak memerlukan file, dan yang masih mengunggah dilanjutkan dengan file yang sama. Di PHP:

try {
    $hs->transcribe($path, ['wait_timeout' => 60]);
} catch (\Hushscript\Exception\WaitTimeoutError $timeout) {
    $transcript = $hs->resume($timeout->resumeToken, $path);
}

Di CLI, Ctrl-C saat transcribe mencetak token lanjutan pekerjaan itu beserta perintah untuk melanjutkannya:

hushscript resume <token> meeting.mp3 --format srt --out meeting.srt

Pencatatan log dan penyamaran data

SDK tidak mengirim telemetri; header User-Agent adalah satu-satunya identifikasi klien. Pencatatan log nonaktif secara default. HUSHSCRIPT_LOG=debug menulis satu baris per permintaan ke standard error dengan metode, path, status, dan waktunya, dan tidak pernah header, body, judul, atau teks transkrip.

Token disamarkan dari setiap error, baris log, dan bentuk cetak klien. Pada pesan error, hint, dan penyebab, URL tetap menampilkan host dan path-nya tetapi query string-nya menjadi ?[redacted], sehingga URL unggahan bertanda tangan tidak pernah tercetak. Hasil yang menyerahkan rahasia kepada Anda, seperti claim secret atau token baru, tetap dapat dibaca sebagai field tetapi menampilkan [redacted] saat dicetak; ekspor JSON adalah milik Anda sendiri dan memuat nilainya. CLI membersihkan setiap token yang dikenalnya dari stderr; hasilnya di stdout adalah keluaran Anda dan tidak dibersihkan.

Konfigurasi

Pengaturan Variabel lingkungan Default
Token HUSHSCRIPT_TOKEN tidak ada
Base URL HUSHSCRIPT_BASE_URL https://api.hushscript.com
Tingkat log HUSHSCRIPT_LOG off
Batas waktu permintaan tidak ada 60 detik
Percobaan ulang tidak ada 3

Opsi yang diberikan di kode mengalahkan variabel lingkungannya, dan nilai kosong dianggap tidak diatur. Menit berasal dari saldo yang sama dengan aplikasi; paket dan harga ada di halaman harga.

Mulai transkripsi dengan 30 menit gratis

Coba pratinjau hingga 5 menit sebelum Anda membuat akun, dan akun pribadi baru mendapat pratinjau gratis untuk unggahan pertamanya di aplikasi. Transkripsi lengkap memerlukan akun dan menit; akun pribadi yang memenuhi syarat mendapat 30 menit gratis satu kali, setelah verifikasi kartu atau dengan pembelian pertama. Tanpa langganan.

Dapatkan 30 menit gratis