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.
- Speaker Diarization – identify different speakers in batch transcriptions.
- Realtime transcription (WebSocket) – stream raw PCM audio bytes and receive partial/final results.
- One-liner convenience –
transcribe("sample.mp3")usingFENNEC_API_KEYfrom your environment. - CLI –
fennec-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)
# The client performs a start/ready handshake automatically on enter.
# After you see the "open" event, you can send 16kHz, mono, 16-bit PCM:
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_idsubmit_url(audio_url, context=None, apply_contextual_correction=False, formatting=None) -> job_idget_status(job_id) -> dictwait_for_completion(job_id, poll_interval_s=3.0, timeout_s=300.0) -> dicttranscribe_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 useasync with)await send_bytes(chunk: bytes)– raw 16kHz mono 16-bit PCMawait 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) -> strget_default_client()– readsFENNEC_API_KEY/FENNEC_BASE_URLfrom env.
Errors
Exceptions live in fennec_asr.exceptions:
AuthenticationError– 401/403NotFoundError– 404APIError– other non-2xx or SDK-level errorsFennecASRError– 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 withffmpeg:ffmpeg -y -i input.wav -ac 1 -ar 16000 -acodec pcm_s16le output.pcm
Then read bytes fromoutput.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
Metadata
Release files for fennec-asr 1.1.9
For a detailed explanation of source distributions (sdists) and built distributions (wheels), please see the package formats documentation.
Source distribution (sdist)
| File | Size | Uploaded | |
|---|---|---|---|
| fennec_asr-1.1.9.tar.gz | 17.2 kB | Details |
Built distribution (wheel)
| File | Interpreter | ABI | Platform | Reset |
|---|---|---|---|---|
| fennec_asr-1.1.9-py3-none-any.whl | Python 3 | none | any | Details |
Total release size: 33.5 kB
Release files / fennec_asr-1.1.9.tar.gz
| Download URL | fennec_asr-1.1.9.tar.gz |
|---|---|
| Size | 17.2 kB |
| Tags | Source |
|
SHA-256 checksum How to use checksums |
fa6ba8c97701dfe1c4996f75f56b3f8ed1256ae7238465c1ace31478093d7b19
|
|
BLAKE2b-256 checksum How to use checksums |
2b7f01717352e3ea65ef43225d1a30c39331d6893e4536e0638397ecc275187a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.12.8
|
Release files / fennec_asr-1.1.9-py3-none-any.whl
| Download URL | fennec_asr-1.1.9-py3-none-any.whl |
|---|---|
| Size | 16.3 kB |
| Tags | Python 3 |
|
SHA-256 checksum How to use checksums |
826235c83ae9e9bc47242dbb20042dc92910756b2865600cd8b670c6fbc36096
|
|
BLAKE2b-256 checksum How to use checksums |
d9e85887d68dc172ad63d08109fbe144733a8eebef13907f51b2a612d102029a
|
| Upload date | |
|
Uploaded using Trusted Publishing? What is trusted publishing? |
No |
| Uploaded via |
twine/6.1.0 CPython/3.12.8
|