Skip to main content

Python SDK for the Fennec ASR API

Project description

fennec-asr (Python SDK)

A small, friendly Python SDK for the Fennec ASR API. It supports:

  • Batch transcription (HTTP) – upload a file or provide a URL, then poll until complete.
  • Realtime transcription (WebSocket) – stream raw PCM audio bytes and receive partial/final results.
  • One-liner conveniencetranscribe("sample.mp3") using FENNEC_API_KEY from your environment.
  • CLIfennec-asr <file-or-url> prints the transcript.

API base: https://asr-api-hso0.onrender.com/api/v1 (configurable)


Install

pip install fennec-asr

Optional live-microphone helper (via sounddevice):

pip install sounddevice numpy

Quickstarts

1) One-liner (batch)

from fennec_asr import transcribe

# FENNEC_API_KEY must be set in your env
print(transcribe("sample.mp3"))

Environment:

export FENNEC_API_KEY="sk_***"
# optional:
# export FENNEC_BASE_URL="https://your-deployment/api/v1"

2) Batch with options

from fennec_asr import FennecASRClient

client = FennecASRClient(api_key="sk_***")

job_id = client.submit_url(
    "https://example.com/audio.mp3",
    context="Lightly punctuate. Keep acronyms uppercase.",
    apply_contextual_correction=False,
    formatting={"newline_pause_threshold": 0.65, "double_newline_pause_threshold": 0.7},
)

final = client.wait_for_completion(job_id, timeout_s=300)
if final["status"] == "completed":
    print(final["transcript"])
else:
    print("Failed:", final.get("transcript"))

3) Realtime (WebSocket)

import asyncio
from fennec_asr import Realtime

async def main():
    rt = Realtime("sk_***").on("final", print).on("error", lambda e: print("ERR:", e))
    async with rt:
        # Send 16kHz, mono, 16-bit PCM bytes (no helper; bring your own frames)
        await rt.send_bytes(b"...")
        await rt.send_eos()
        async for _ in rt.messages():  # drain until server closes
            pass

asyncio.run(main())

To receive only “complete thoughts”, construct with Realtime("sk_***", detect_thoughts=True) and subscribe to .on("thought", ...).

4) CLI

fennec-asr sample.mp3
# or:
fennec-asr "https://example.com/audio.mp3"
# with options:
fennec-asr sample.mp3 --context "meeting notes" --apply-correction --formatting '{"newline_pause_threshold":0.65}'

API

FennecASRClient(api_key: str, base_url: str = DEFAULT_BASE_URL, timeout: int = 60)

  • submit_file(path, context=None, apply_contextual_correction=False, formatting=None) -> job_id
  • submit_url(audio_url, context=None, apply_contextual_correction=False, formatting=None) -> job_id
  • get_status(job_id) -> dict
  • wait_for_completion(job_id, poll_interval_s=3.0, timeout_s=300.0) -> dict
  • transcribe_file(path, ...) -> str (submit + wait)

Realtime(api_key: str, *, ws_url=..., sample_rate=16000, channels=1, detect_thoughts=False, ...)

Event-driven WS client:

  • Register events with .on("partial"|"final"|"thought"|"open"|"close"|"error", callback)
  • await open() / close() (or use async with)
  • await send_bytes(chunk: bytes) – raw 16kHz mono 16-bit PCM
  • await send_eos()
  • async for msg in messages(): ... – raw JSON frames if you want lower-level access

Back-compat alias: StreamingSession = Realtime.

Convenience

  • transcribe(source, *, context=None, apply_contextual_correction=False, formatting=None, timeout_s=300.0) -> str
  • get_default_client() – reads FENNEC_API_KEY / FENNEC_BASE_URL from env.

Errors

Exceptions live in fennec_asr.exceptions:

  • AuthenticationError – 401/403
  • NotFoundError – 404
  • APIError – other non-2xx or SDK-level errors
  • FennecASRError – base class

The client surfaces server messages; future versions may include request_id and structured problem details if the server provides them.


Notes & Expectations

  • Audio format (WS): 16kHz, mono, 16-bit PCM (int16). Convert with ffmpeg:
    ffmpeg -y -i input.wav -ac 1 -ar 16000 -acodec pcm_s16le output.pcm
    
    Then read bytes from output.pcm.
  • Formatting options: pass a dict; the SDK will JSON-encode when required.
  • Idempotency & retries: basic happy-path covered; advanced policies can be added (see roadmap).

Development

# setup
python -m venv .venv && source .venv/bin/activate
pip install -U pip build twine pytest

# run tests
pytest -q

# build & upload (needs PyPI creds)
python -m build
twine upload dist/*

License

MIT © Fennec ASR

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

fennec_asr-0.1.0.tar.gz (15.6 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

fennec_asr-0.1.0-py3-none-any.whl (14.3 kB view details)

Uploaded Python 3

File details

Details for the file fennec_asr-0.1.0.tar.gz.

File metadata

  • Download URL: fennec_asr-0.1.0.tar.gz
  • Upload date:
  • Size: 15.6 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.1

File hashes

Hashes for fennec_asr-0.1.0.tar.gz
Algorithm Hash digest
SHA256 86e89f1760614682f406fa131074a06b4adf9b2437993a8aa962fae677e82aef
MD5 596d297617a37f7382f0d1b9d8deec33
BLAKE2b-256 e6c95003a8fe97c23e54b57009cde3b1e0651ff5a0f465d19bd9b99d1c569a85

See more details on using hashes here.

File details

Details for the file fennec_asr-0.1.0-py3-none-any.whl.

File metadata

  • Download URL: fennec_asr-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 14.3 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.1.0 CPython/3.13.1

File hashes

Hashes for fennec_asr-0.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 77e00da1922a80fade69fb46e6819ea3cdd3f09a1fa8f112059df6867abfd161
MD5 26eba3e932d55f0259ae0f0875e827d3
BLAKE2b-256 1fbf98e88af1b0b98d6ad74937e2239ff66e1dd310eec291c504a1cf32c5744d

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page