npm package discovery and stats viewer.

Discover Tips

  • General search

    [free text search, go nuts!]

  • Package details

    pkg:[package-name]

  • User packages

    @[username]

Sponsor

Optimize Toolset

I’ve always been into building performant and accessible sites, but lately I’ve been taking it extremely seriously. So much so that I’ve been building a tool to help me optimize and monitor the sites that I build to make sure that I’m making an attempt to offer the best experience to those who visit them. If you’re into performant, accessible and SEO friendly sites, you might like it too! You can check it out at Optimize Toolset.

About

Hi, 👋, I’m Ryan Hefner  and I built this site for me, and you! The goal of this site was to provide an easy way for me to check the stats on my npm packages, both for prioritizing issues and updates, and to give me a little kick in the pants to keep up on stuff.

As I was building it, I realized that I was actually using the tool to build the tool, and figured I might as well put this out there and hopefully others will find it to be a fast and useful way to search and browse npm packages as I have.

If you’re interested in other things I’m working on, follow me on Twitter or check out the open source projects I’ve been publishing on GitHub.

I am also working on a Twitter bot for this site to tweet the most popular, newest, random packages from npm. Please follow that account now and it will start sending out packages soon–ish.

Open Software & Tools

This site wouldn’t be possible without the immense generosity and tireless efforts from the people who make contributions to the world and share their work via open source initiatives. Thank you 🙏

© 2026 – Pkg Stats / Ryan Hefner

whisperai-sdk

v2.0.0

Published

TypeScript SDK for WhisperAI: methods and interfaces for interacting with the service without external runtime dependencies.

Downloads

115

Readme

whisperai-sdk

Unofficial TypeScript SDK for WhisperAI. Version 2 uses WhisperAI's signed Google Cloud Storage resumable-upload flow and requires Node.js 22 or newer.

This project is not affiliated with WhisperAI.

Installation

npm install whisperai-sdk

Transcribe a file

transcribe() performs the complete operation: authentication, upload, retries, finalization, status polling, and fetching the completed transcription.

import { readFile } from "node:fs/promises"
import { WhisperClient } from "whisperai-sdk"

const client = new WhisperClient({
  login: {
    email: process.env.WHISPER_EMAIL!,
    password: process.env.WHISPER_PASSWORD!
  }
})

const audio = new Uint8Array(await readFile("./interview.m4a"))
const recording = await client.transcribe(audio, {
  filename: "interview.m4a",
  mimeType: "audio/x-m4a",
  durationSeconds: 120
})

console.log(recording.transcription.content)

The default processing timeout is 30 minutes and the default polling interval is 2 seconds.

const controller = new AbortController()

const recording = await client.transcribe(audio, metadata, {
  timeoutMs: 45 * 60 * 1000,
  pollIntervalMs: 3000,
  signal: controller.signal,
  onProgress: percentage => console.log(`Upload: ${percentage}%`)
})

Streams

For streaming uploads, provide totalSize so the SDK can upload without buffering the entire file. If it is omitted, the stream is buffered first to determine its size.

const recording = await client.transcribe(stream, {
  filename: "meeting.webm",
  mimeType: "audio/webm",
  durationSeconds: 900,
  totalSize: contentLength
})

Start without waiting

Queue workers can upload and return immediately, then check the recording later.

const started = await client.startTranscription(audio, metadata)
console.log(started.id, started.status) // processing

const statuses = await client.recordingStatus([started.id])
const completed = await client.waitForTranscription(started.id)

requestTranscription(recordingId) is available for explicitly restarting or recovering an existing recording. A normal signed upload starts processing when the upload is completed, so it does not need this extra call.

Upload metadata

The SDK accepts the current WhisperAI transcription settings:

await client.transcribe(audio, {
  filename: "interview.m4a",
  durationSeconds: 120,
  language: "multi-auto",
  enableSpeakerDetection: true,
  speakerCount: "auto",
  transcriptionStyle: "clean_readable",
  importantTerms: "WhisperAI, Codex",
  customPrompt: "Technical product interview",
  speakerIdentificationEnabled: true,
  speakerIdentificationMode: "role",
  speakerIdentificationValues: ["Interviewer", "Guest"]
})

Other methods

await client.user()
await client.usage()
await client.subscriptionDetails()
await client.recording(recordingId)
await client.recordings({ limit: 20, sort: "newest" })
await client.summary()
await client.translate(recordingId, "es")

Errors

import {
  WhisperApiError,
  WhisperAuthError,
  WhisperNetworkError,
  WhisperTimeoutError,
  WhisperTranscriptionError,
  WhisperUploadError
} from "whisperai-sdk"

Upload diagnostics are enabled by default and sent best-effort to WhisperAI. Disable them globally with diagnostics: false in ClientOptions, or per operation with { diagnostics: false }.

Live smoke test

WHISPER_EMAIL=... \
WHISPER_PASSWORD=... \
WHISPER_AUDIO_PATH=./sample.m4a \
WHISPER_AUDIO_DURATION_SECONDS=10 \
bun test test/live.test.ts

License

MIT